From 498f19855ea0eb4e3aaa6b60e4d6cb40f58db9e3 Mon Sep 17 00:00:00 2001 From: SamuelGulinello Date: Sun, 31 Mar 2024 19:02:07 -0400 Subject: [PATCH 1/2] first commit --- app.js | 64 + detect.js | 22 + draw.js | 110 + favicon.ico | Bin 0 -> 4286 bytes images/example.jpeg | Bin 0 -> 29251 bytes images/street.jpg | Bin 0 -> 71403 bytes index.html | 33 + main.css | 16 + server-temp/main.py | 47 + server-temp/venv/bin/Activate.ps1 | 247 + server-temp/venv/bin/activate | 69 + server-temp/venv/bin/activate.csh | 26 + server-temp/venv/bin/activate.fish | 69 + server-temp/venv/bin/flask | 8 + server-temp/venv/bin/pip | 8 + server-temp/venv/bin/pip3 | 8 + server-temp/venv/bin/pip3.10 | 8 + server-temp/venv/bin/python | 1 + server-temp/venv/bin/python3 | 1 + server-temp/venv/bin/python3.10 | 1 + .../Jinja2-3.1.3.dist-info/INSTALLER | 1 + .../Jinja2-3.1.3.dist-info/LICENSE.rst | 28 + .../Jinja2-3.1.3.dist-info/METADATA | 105 + .../Jinja2-3.1.3.dist-info/RECORD | 58 + .../Jinja2-3.1.3.dist-info/WHEEL | 5 + .../Jinja2-3.1.3.dist-info/entry_points.txt | 2 + .../Jinja2-3.1.3.dist-info/top_level.txt | 1 + .../MarkupSafe-2.1.5.dist-info/INSTALLER | 1 + .../MarkupSafe-2.1.5.dist-info/LICENSE.rst | 28 + .../MarkupSafe-2.1.5.dist-info/METADATA | 93 + .../MarkupSafe-2.1.5.dist-info/RECORD | 14 + .../MarkupSafe-2.1.5.dist-info/WHEEL | 5 + .../MarkupSafe-2.1.5.dist-info/top_level.txt | 1 + .../site-packages/_distutils_hack/__init__.py | 222 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 7617 bytes .../__pycache__/override.cpython-310.pyc | Bin 0 -> 270 bytes .../site-packages/_distutils_hack/override.py | 1 + .../blinker-1.7.0.dist-info/INSTALLER | 1 + .../blinker-1.7.0.dist-info/LICENSE.rst | 20 + .../blinker-1.7.0.dist-info/METADATA | 62 + .../blinker-1.7.0.dist-info/RECORD | 14 + .../blinker-1.7.0.dist-info/WHEEL | 4 + .../site-packages/blinker/__init__.py | 19 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 534 bytes .../__pycache__/_saferef.cpython-310.pyc | Bin 0 -> 7221 bytes .../__pycache__/_utilities.cpython-310.pyc | Bin 0 -> 3560 bytes .../blinker/__pycache__/base.cpython-310.pyc | Bin 0 -> 17534 bytes .../site-packages/blinker/_saferef.py | 230 + .../site-packages/blinker/_utilities.py | 105 + .../python3.10/site-packages/blinker/base.py | 558 ++ .../python3.10/site-packages/blinker/py.typed | 0 .../click-8.1.7.dist-info/INSTALLER | 1 + .../click-8.1.7.dist-info/LICENSE.rst | 28 + .../click-8.1.7.dist-info/METADATA | 103 + .../click-8.1.7.dist-info/RECORD | 39 + .../site-packages/click-8.1.7.dist-info/WHEEL | 5 + .../click-8.1.7.dist-info/top_level.txt | 1 + .../site-packages/click/__init__.py | 73 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2653 bytes .../click/__pycache__/_compat.cpython-310.pyc | Bin 0 -> 15711 bytes .../__pycache__/_termui_impl.cpython-310.pyc | Bin 0 -> 16351 bytes .../__pycache__/_textwrap.cpython-310.pyc | Bin 0 -> 1587 bytes .../__pycache__/_winconsole.cpython-310.pyc | Bin 0 -> 7703 bytes .../click/__pycache__/core.cpython-310.pyc | Bin 0 -> 91181 bytes .../__pycache__/decorators.cpython-310.pyc | Bin 0 -> 17251 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 10295 bytes .../__pycache__/formatting.cpython-310.pyc | Bin 0 -> 9500 bytes .../click/__pycache__/globals.cpython-310.pyc | Bin 0 -> 2472 bytes .../click/__pycache__/parser.cpython-310.pyc | Bin 0 -> 13713 bytes .../shell_completion.cpython-310.pyc | Bin 0 -> 16888 bytes .../click/__pycache__/termui.cpython-310.pyc | Bin 0 -> 26173 bytes .../click/__pycache__/testing.cpython-310.pyc | Bin 0 -> 15246 bytes .../click/__pycache__/types.cpython-310.pyc | Bin 0 -> 33730 bytes .../click/__pycache__/utils.cpython-310.pyc | Bin 0 -> 18886 bytes .../python3.10/site-packages/click/_compat.py | 623 ++ .../site-packages/click/_termui_impl.py | 739 ++ .../site-packages/click/_textwrap.py | 49 + .../site-packages/click/_winconsole.py | 279 + .../python3.10/site-packages/click/core.py | 3042 ++++++ .../site-packages/click/decorators.py | 561 ++ .../site-packages/click/exceptions.py | 288 + .../site-packages/click/formatting.py | 301 + .../python3.10/site-packages/click/globals.py | 68 + .../python3.10/site-packages/click/parser.py | 529 + .../python3.10/site-packages/click/py.typed | 0 .../site-packages/click/shell_completion.py | 596 ++ .../python3.10/site-packages/click/termui.py | 784 ++ .../python3.10/site-packages/click/testing.py | 479 + .../python3.10/site-packages/click/types.py | 1089 +++ .../python3.10/site-packages/click/utils.py | 624 ++ .../site-packages/distutils-precedence.pth | 1 + .../flask-3.0.2.dist-info/INSTALLER | 1 + .../flask-3.0.2.dist-info/LICENSE.rst | 28 + .../flask-3.0.2.dist-info/METADATA | 116 + .../flask-3.0.2.dist-info/RECORD | 58 + .../flask-3.0.2.dist-info/REQUESTED | 0 .../site-packages/flask-3.0.2.dist-info/WHEEL | 4 + .../flask-3.0.2.dist-info/entry_points.txt | 3 + .../site-packages/flask/__init__.py | 60 + .../site-packages/flask/__main__.py | 3 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2324 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 249 bytes .../flask/__pycache__/app.cpython-310.pyc | Bin 0 -> 49919 bytes .../__pycache__/blueprints.cpython-310.pyc | Bin 0 -> 3460 bytes .../flask/__pycache__/cli.cpython-310.pyc | Bin 0 -> 29123 bytes .../flask/__pycache__/config.cpython-310.pyc | Bin 0 -> 13458 bytes .../flask/__pycache__/ctx.cpython-310.pyc | Bin 0 -> 14890 bytes .../__pycache__/debughelpers.cpython-310.pyc | Bin 0 -> 6628 bytes .../flask/__pycache__/globals.cpython-310.pyc | Bin 0 -> 1617 bytes .../flask/__pycache__/helpers.cpython-310.pyc | Bin 0 -> 21644 bytes .../flask/__pycache__/logging.cpython-310.pyc | Bin 0 -> 2584 bytes .../__pycache__/sessions.cpython-310.pyc | Bin 0 -> 13326 bytes .../flask/__pycache__/signals.cpython-310.pyc | Bin 0 -> 847 bytes .../__pycache__/templating.cpython-310.pyc | Bin 0 -> 7121 bytes .../flask/__pycache__/testing.cpython-310.pyc | Bin 0 -> 9884 bytes .../flask/__pycache__/typing.cpython-310.pyc | Bin 0 -> 1871 bytes .../flask/__pycache__/views.cpython-310.pyc | Bin 0 -> 5581 bytes .../__pycache__/wrappers.cpython-310.pyc | Bin 0 -> 5275 bytes .../lib/python3.10/site-packages/flask/app.py | 1488 +++ .../site-packages/flask/blueprints.py | 91 + .../lib/python3.10/site-packages/flask/cli.py | 1111 +++ .../python3.10/site-packages/flask/config.py | 372 + .../lib/python3.10/site-packages/flask/ctx.py | 449 + .../site-packages/flask/debughelpers.py | 178 + .../python3.10/site-packages/flask/globals.py | 51 + .../python3.10/site-packages/flask/helpers.py | 621 ++ .../site-packages/flask/json/__init__.py | 170 + .../json/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 6031 bytes .../json/__pycache__/provider.cpython-310.pyc | Bin 0 -> 7723 bytes .../json/__pycache__/tag.cpython-310.pyc | Bin 0 -> 11681 bytes .../site-packages/flask/json/provider.py | 215 + .../site-packages/flask/json/tag.py | 326 + .../python3.10/site-packages/flask/logging.py | 79 + .../python3.10/site-packages/flask/py.typed | 0 .../site-packages/flask/sansio/README.md | 6 + .../sansio/__pycache__/app.cpython-310.pyc | Bin 0 -> 28648 bytes .../__pycache__/blueprints.cpython-310.pyc | Bin 0 -> 22970 bytes .../__pycache__/scaffold.cpython-310.pyc | Bin 0 -> 24122 bytes .../site-packages/flask/sansio/app.py | 968 ++ .../site-packages/flask/sansio/blueprints.py | 632 ++ .../site-packages/flask/sansio/scaffold.py | 805 ++ .../site-packages/flask/sessions.py | 371 + .../python3.10/site-packages/flask/signals.py | 17 + .../site-packages/flask/templating.py | 219 + .../python3.10/site-packages/flask/testing.py | 298 + .../python3.10/site-packages/flask/typing.py | 90 + .../python3.10/site-packages/flask/views.py | 191 + .../site-packages/flask/wrappers.py | 174 + .../itsdangerous-2.1.2.dist-info/INSTALLER | 1 + .../itsdangerous-2.1.2.dist-info/LICENSE.rst | 28 + .../itsdangerous-2.1.2.dist-info/METADATA | 97 + .../itsdangerous-2.1.2.dist-info/RECORD | 23 + .../itsdangerous-2.1.2.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../site-packages/itsdangerous/__init__.py | 19 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 902 bytes .../__pycache__/_json.cpython-310.pyc | Bin 0 -> 957 bytes .../__pycache__/encoding.cpython-310.pyc | Bin 0 -> 1906 bytes .../__pycache__/exc.cpython-310.pyc | Bin 0 -> 3445 bytes .../__pycache__/serializer.cpython-310.pyc | Bin 0 -> 9729 bytes .../__pycache__/signer.cpython-310.pyc | Bin 0 -> 8497 bytes .../__pycache__/timed.cpython-310.pyc | Bin 0 -> 6511 bytes .../__pycache__/url_safe.cpython-310.pyc | Bin 0 -> 2730 bytes .../site-packages/itsdangerous/_json.py | 16 + .../site-packages/itsdangerous/encoding.py | 54 + .../site-packages/itsdangerous/exc.py | 107 + .../site-packages/itsdangerous/py.typed | 0 .../site-packages/itsdangerous/serializer.py | 295 + .../site-packages/itsdangerous/signer.py | 257 + .../site-packages/itsdangerous/timed.py | 234 + .../site-packages/itsdangerous/url_safe.py | 80 + .../site-packages/jinja2/__init__.py | 37 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1638 bytes .../__pycache__/_identifier.cpython-310.pyc | Bin 0 -> 2113 bytes .../__pycache__/async_utils.cpython-310.pyc | Bin 0 -> 2727 bytes .../__pycache__/bccache.cpython-310.pyc | Bin 0 -> 13984 bytes .../__pycache__/compiler.cpython-310.pyc | Bin 0 -> 54587 bytes .../__pycache__/constants.cpython-310.pyc | Bin 0 -> 1574 bytes .../jinja2/__pycache__/debug.cpython-310.pyc | Bin 0 -> 4030 bytes .../__pycache__/defaults.cpython-310.pyc | Bin 0 -> 1374 bytes .../__pycache__/environment.cpython-310.pyc | Bin 0 -> 53424 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 5573 bytes .../jinja2/__pycache__/ext.cpython-310.pyc | Bin 0 -> 25879 bytes .../__pycache__/filters.cpython-310.pyc | Bin 0 -> 51408 bytes .../__pycache__/idtracking.cpython-310.pyc | Bin 0 -> 11125 bytes .../jinja2/__pycache__/lexer.cpython-310.pyc | Bin 0 -> 20475 bytes .../__pycache__/loaders.cpython-310.pyc | Bin 0 -> 20531 bytes .../jinja2/__pycache__/meta.cpython-310.pyc | Bin 0 -> 3854 bytes .../__pycache__/nativetypes.cpython-310.pyc | Bin 0 -> 5049 bytes .../jinja2/__pycache__/nodes.cpython-310.pyc | Bin 0 -> 40340 bytes .../__pycache__/optimizer.cpython-310.pyc | Bin 0 -> 1994 bytes .../jinja2/__pycache__/parser.cpython-310.pyc | Bin 0 -> 27768 bytes .../__pycache__/runtime.cpython-310.pyc | Bin 0 -> 32183 bytes .../__pycache__/sandbox.cpython-310.pyc | Bin 0 -> 12006 bytes .../jinja2/__pycache__/tests.cpython-310.pyc | Bin 0 -> 6728 bytes .../jinja2/__pycache__/utils.cpython-310.pyc | Bin 0 -> 24547 bytes .../__pycache__/visitor.cpython-310.pyc | Bin 0 -> 4013 bytes .../site-packages/jinja2/_identifier.py | 6 + .../site-packages/jinja2/async_utils.py | 84 + .../site-packages/jinja2/bccache.py | 406 + .../site-packages/jinja2/compiler.py | 1956 ++++ .../site-packages/jinja2/constants.py | 20 + .../python3.10/site-packages/jinja2/debug.py | 191 + .../site-packages/jinja2/defaults.py | 48 + .../site-packages/jinja2/environment.py | 1667 ++++ .../site-packages/jinja2/exceptions.py | 166 + .../python3.10/site-packages/jinja2/ext.py | 869 ++ .../site-packages/jinja2/filters.py | 1854 ++++ .../site-packages/jinja2/idtracking.py | 318 + .../python3.10/site-packages/jinja2/lexer.py | 866 ++ .../site-packages/jinja2/loaders.py | 661 ++ .../python3.10/site-packages/jinja2/meta.py | 111 + .../site-packages/jinja2/nativetypes.py | 130 + .../python3.10/site-packages/jinja2/nodes.py | 1204 +++ .../site-packages/jinja2/optimizer.py | 47 + .../python3.10/site-packages/jinja2/parser.py | 1034 ++ .../python3.10/site-packages/jinja2/py.typed | 0 .../site-packages/jinja2/runtime.py | 1051 ++ .../site-packages/jinja2/sandbox.py | 428 + .../python3.10/site-packages/jinja2/tests.py | 255 + .../python3.10/site-packages/jinja2/utils.py | 755 ++ .../site-packages/jinja2/visitor.py | 92 + .../site-packages/markupsafe/__init__.py | 332 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 11383 bytes .../__pycache__/_native.cpython-310.pyc | Bin 0 -> 2038 bytes .../site-packages/markupsafe/_native.py | 63 + .../site-packages/markupsafe/_speedups.c | 320 + .../_speedups.cpython-310-darwin.so | Bin 0 -> 117484 bytes .../site-packages/markupsafe/_speedups.pyi | 9 + .../site-packages/markupsafe/py.typed | 0 .../pip-23.0.1.dist-info/INSTALLER | 1 + .../pip-23.0.1.dist-info/LICENSE.txt | 20 + .../pip-23.0.1.dist-info/METADATA | 88 + .../site-packages/pip-23.0.1.dist-info/RECORD | 1002 ++ .../pip-23.0.1.dist-info/REQUESTED | 0 .../site-packages/pip-23.0.1.dist-info/WHEEL | 5 + .../pip-23.0.1.dist-info/entry_points.txt | 4 + .../pip-23.0.1.dist-info/top_level.txt | 1 + .../python3.10/site-packages/pip/__init__.py | 13 + .../python3.10/site-packages/pip/__main__.py | 31 + .../site-packages/pip/__pip-runner__.py | 50 + .../pip/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 663 bytes .../pip/__pycache__/__main__.cpython-310.pyc | Bin 0 -> 625 bytes .../__pip-runner__.cpython-310.pyc | Bin 0 -> 1661 bytes .../site-packages/pip/_internal/__init__.py | 19 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 784 bytes .../__pycache__/build_env.cpython-310.pyc | Bin 0 -> 9742 bytes .../__pycache__/cache.cpython-310.pyc | Bin 0 -> 9296 bytes .../__pycache__/configuration.cpython-310.pyc | Bin 0 -> 11244 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 25969 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 649 bytes .../__pycache__/pyproject.cpython-310.pyc | Bin 0 -> 3651 bytes .../self_outdated_check.cpython-310.pyc | Bin 0 -> 6673 bytes .../__pycache__/wheel_builder.cpython-310.pyc | Bin 0 -> 9161 bytes .../site-packages/pip/_internal/build_env.py | 311 + .../site-packages/pip/_internal/cache.py | 293 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 304 bytes .../autocompletion.cpython-310.pyc | Bin 0 -> 5337 bytes .../__pycache__/base_command.cpython-310.pyc | Bin 0 -> 6162 bytes .../__pycache__/cmdoptions.cpython-310.pyc | Bin 0 -> 23063 bytes .../command_context.cpython-310.pyc | Bin 0 -> 1344 bytes .../cli/__pycache__/main.cpython-310.pyc | Bin 0 -> 1402 bytes .../__pycache__/main_parser.cpython-310.pyc | Bin 0 -> 3027 bytes .../cli/__pycache__/parser.cpython-310.pyc | Bin 0 -> 9986 bytes .../__pycache__/progress_bars.cpython-310.pyc | Bin 0 -> 1928 bytes .../__pycache__/req_command.cpython-310.pyc | Bin 0 -> 13123 bytes .../cli/__pycache__/spinners.cpython-310.pyc | Bin 0 -> 4994 bytes .../__pycache__/status_codes.cpython-310.pyc | Bin 0 -> 383 bytes .../pip/_internal/cli/autocompletion.py | 171 + .../pip/_internal/cli/base_command.py | 216 + .../pip/_internal/cli/cmdoptions.py | 1055 ++ .../pip/_internal/cli/command_context.py | 27 + .../site-packages/pip/_internal/cli/main.py | 70 + .../pip/_internal/cli/main_parser.py | 134 + .../site-packages/pip/_internal/cli/parser.py | 294 + .../pip/_internal/cli/progress_bars.py | 68 + .../pip/_internal/cli/req_command.py | 502 + .../pip/_internal/cli/spinners.py | 159 + .../pip/_internal/cli/status_codes.py | 6 + .../pip/_internal/commands/__init__.py | 132 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3283 bytes .../__pycache__/cache.cpython-310.pyc | Bin 0 -> 6266 bytes .../__pycache__/check.cpython-310.pyc | Bin 0 -> 1601 bytes .../__pycache__/completion.cpython-310.pyc | Bin 0 -> 4192 bytes .../__pycache__/configuration.cpython-310.pyc | Bin 0 -> 8970 bytes .../__pycache__/debug.cpython-310.pyc | Bin 0 -> 6711 bytes .../__pycache__/download.cpython-310.pyc | Bin 0 -> 4241 bytes .../__pycache__/freeze.cpython-310.pyc | Bin 0 -> 2666 bytes .../commands/__pycache__/hash.cpython-310.pyc | Bin 0 -> 2180 bytes .../commands/__pycache__/help.cpython-310.pyc | Bin 0 -> 1341 bytes .../__pycache__/index.cpython-310.pyc | Bin 0 -> 4618 bytes .../__pycache__/inspect.cpython-310.pyc | Bin 0 -> 3001 bytes .../__pycache__/install.cpython-310.pyc | Bin 0 -> 20246 bytes .../commands/__pycache__/list.cpython-310.pyc | Bin 0 -> 10328 bytes .../__pycache__/search.cpython-310.pyc | Bin 0 -> 5394 bytes .../commands/__pycache__/show.cpython-310.pyc | Bin 0 -> 6555 bytes .../__pycache__/uninstall.cpython-310.pyc | Bin 0 -> 3362 bytes .../__pycache__/wheel.cpython-310.pyc | Bin 0 -> 5437 bytes .../pip/_internal/commands/cache.py | 223 + .../pip/_internal/commands/check.py | 53 + .../pip/_internal/commands/completion.py | 126 + .../pip/_internal/commands/configuration.py | 282 + .../pip/_internal/commands/debug.py | 199 + .../pip/_internal/commands/download.py | 149 + .../pip/_internal/commands/freeze.py | 97 + .../pip/_internal/commands/hash.py | 59 + .../pip/_internal/commands/help.py | 41 + .../pip/_internal/commands/index.py | 139 + .../pip/_internal/commands/inspect.py | 92 + .../pip/_internal/commands/install.py | 873 ++ .../pip/_internal/commands/list.py | 365 + .../pip/_internal/commands/search.py | 174 + .../pip/_internal/commands/show.py | 189 + .../pip/_internal/commands/uninstall.py | 113 + .../pip/_internal/commands/wheel.py | 203 + .../pip/_internal/configuration.py | 374 + .../pip/_internal/distributions/__init__.py | 21 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 831 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 1919 bytes .../__pycache__/installed.cpython-310.pyc | Bin 0 -> 1296 bytes .../__pycache__/sdist.cpython-310.pyc | Bin 0 -> 5027 bytes .../__pycache__/wheel.cpython-310.pyc | Bin 0 -> 1663 bytes .../pip/_internal/distributions/base.py | 39 + .../pip/_internal/distributions/installed.py | 23 + .../pip/_internal/distributions/sdist.py | 150 + .../pip/_internal/distributions/wheel.py | 34 + .../site-packages/pip/_internal/exceptions.py | 747 ++ .../pip/_internal/index/__init__.py | 2 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 258 bytes .../__pycache__/collector.cpython-310.pyc | Bin 0 -> 15325 bytes .../package_finder.cpython-310.pyc | Bin 0 -> 29485 bytes .../index/__pycache__/sources.cpython-310.pyc | Bin 0 -> 7151 bytes .../pip/_internal/index/collector.py | 505 + .../pip/_internal/index/package_finder.py | 1029 ++ .../pip/_internal/index/sources.py | 224 + .../pip/_internal/locations/__init__.py | 467 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 11060 bytes .../__pycache__/_distutils.cpython-310.pyc | Bin 0 -> 4633 bytes .../__pycache__/_sysconfig.cpython-310.pyc | Bin 0 -> 6024 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 2428 bytes .../pip/_internal/locations/_distutils.py | 173 + .../pip/_internal/locations/_sysconfig.py | 213 + .../pip/_internal/locations/base.py | 81 + .../site-packages/pip/_internal/main.py | 12 + .../pip/_internal/metadata/__init__.py | 127 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 4762 bytes .../__pycache__/_json.cpython-310.pyc | Bin 0 -> 2218 bytes .../metadata/__pycache__/base.cpython-310.pyc | Bin 0 -> 26696 bytes .../__pycache__/pkg_resources.cpython-310.pyc | Bin 0 -> 10200 bytes .../pip/_internal/metadata/_json.py | 84 + .../pip/_internal/metadata/base.py | 688 ++ .../_internal/metadata/importlib/__init__.py | 4 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 349 bytes .../__pycache__/_compat.cpython-310.pyc | Bin 0 -> 2781 bytes .../__pycache__/_dists.cpython-310.pyc | Bin 0 -> 8939 bytes .../__pycache__/_envs.cpython-310.pyc | Bin 0 -> 7735 bytes .../_internal/metadata/importlib/_compat.py | 55 + .../_internal/metadata/importlib/_dists.py | 224 + .../pip/_internal/metadata/importlib/_envs.py | 188 + .../pip/_internal/metadata/pkg_resources.py | 270 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 292 bytes .../__pycache__/candidate.cpython-310.pyc | Bin 0 -> 1444 bytes .../__pycache__/direct_url.cpython-310.pyc | Bin 0 -> 7448 bytes .../format_control.cpython-310.pyc | Bin 0 -> 2769 bytes .../models/__pycache__/index.cpython-310.pyc | Bin 0 -> 1261 bytes .../installation_report.cpython-310.pyc | Bin 0 -> 1771 bytes .../models/__pycache__/link.cpython-310.pyc | Bin 0 -> 16889 bytes .../models/__pycache__/scheme.cpython-310.pyc | Bin 0 -> 1060 bytes .../__pycache__/search_scope.cpython-310.pyc | Bin 0 -> 3579 bytes .../selection_prefs.cpython-310.pyc | Bin 0 -> 1722 bytes .../__pycache__/target_python.cpython-310.pyc | Bin 0 -> 3473 bytes .../models/__pycache__/wheel.cpython-310.pyc | Bin 0 -> 4492 bytes .../pip/_internal/models/candidate.py | 34 + .../pip/_internal/models/direct_url.py | 228 + .../pip/_internal/models/format_control.py | 80 + .../pip/_internal/models/index.py | 28 + .../_internal/models/installation_report.py | 53 + .../pip/_internal/models/link.py | 524 + .../pip/_internal/models/scheme.py | 31 + .../pip/_internal/models/search_scope.py | 133 + .../pip/_internal/models/selection_prefs.py | 51 + .../pip/_internal/models/target_python.py | 110 + .../pip/_internal/models/wheel.py | 92 + .../pip/_internal/network/__init__.py | 2 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 280 bytes .../network/__pycache__/auth.cpython-310.pyc | Bin 0 -> 12016 bytes .../network/__pycache__/cache.cpython-310.pyc | Bin 0 -> 2967 bytes .../__pycache__/download.cpython-310.pyc | Bin 0 -> 5562 bytes .../__pycache__/lazy_wheel.cpython-310.pyc | Bin 0 -> 8448 bytes .../__pycache__/session.cpython-310.pyc | Bin 0 -> 12450 bytes .../network/__pycache__/utils.cpython-310.pyc | Bin 0 -> 1483 bytes .../__pycache__/xmlrpc.cpython-310.pyc | Bin 0 -> 2093 bytes .../pip/_internal/network/auth.py | 446 + .../pip/_internal/network/cache.py | 69 + .../pip/_internal/network/download.py | 186 + .../pip/_internal/network/lazy_wheel.py | 210 + .../pip/_internal/network/session.py | 518 + .../pip/_internal/network/utils.py | 96 + .../pip/_internal/network/xmlrpc.py | 60 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 228 bytes .../__pycache__/check.cpython-310.pyc | Bin 0 -> 4056 bytes .../__pycache__/freeze.cpython-310.pyc | Bin 0 -> 6233 bytes .../__pycache__/prepare.cpython-310.pyc | Bin 0 -> 15086 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 234 bytes .../__pycache__/build_tracker.cpython-310.pyc | Bin 0 -> 4315 bytes .../__pycache__/metadata.cpython-310.pyc | Bin 0 -> 1467 bytes .../metadata_editable.cpython-310.pyc | Bin 0 -> 1501 bytes .../metadata_legacy.cpython-310.pyc | Bin 0 -> 2406 bytes .../build/__pycache__/wheel.cpython-310.pyc | Bin 0 -> 1257 bytes .../wheel_editable.cpython-310.pyc | Bin 0 -> 1481 bytes .../__pycache__/wheel_legacy.cpython-310.pyc | Bin 0 -> 2791 bytes .../operations/build/build_tracker.py | 124 + .../_internal/operations/build/metadata.py | 39 + .../operations/build/metadata_editable.py | 41 + .../operations/build/metadata_legacy.py | 74 + .../pip/_internal/operations/build/wheel.py | 37 + .../operations/build/wheel_editable.py | 46 + .../operations/build/wheel_legacy.py | 102 + .../pip/_internal/operations/check.py | 149 + .../pip/_internal/operations/freeze.py | 254 + .../_internal/operations/install/__init__.py | 2 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 292 bytes .../editable_legacy.cpython-310.pyc | Bin 0 -> 1579 bytes .../__pycache__/legacy.cpython-310.pyc | Bin 0 -> 3377 bytes .../install/__pycache__/wheel.cpython-310.pyc | Bin 0 -> 21178 bytes .../operations/install/editable_legacy.py | 47 + .../_internal/operations/install/legacy.py | 120 + .../pip/_internal/operations/install/wheel.py | 738 ++ .../pip/_internal/operations/prepare.py | 667 ++ .../site-packages/pip/_internal/pyproject.py | 174 + .../pip/_internal/req/__init__.py | 94 + .../req/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2635 bytes .../__pycache__/constructors.cpython-310.pyc | Bin 0 -> 12405 bytes .../req/__pycache__/req_file.cpython-310.pyc | Bin 0 -> 13665 bytes .../__pycache__/req_install.cpython-310.pyc | Bin 0 -> 24422 bytes .../req/__pycache__/req_set.cpython-310.pyc | Bin 0 -> 3943 bytes .../__pycache__/req_uninstall.cpython-310.pyc | Bin 0 -> 19090 bytes .../pip/_internal/req/constructors.py | 501 + .../pip/_internal/req/req_file.py | 544 ++ .../pip/_internal/req/req_install.py | 946 ++ .../pip/_internal/req/req_set.py | 82 + .../pip/_internal/req/req_uninstall.py | 640 ++ .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 228 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 1080 bytes .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 235 bytes .../__pycache__/resolver.cpython-310.pyc | Bin 0 -> 14981 bytes .../_internal/resolution/legacy/resolver.py | 600 ++ .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 239 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 6482 bytes .../__pycache__/candidates.cpython-310.pyc | Bin 0 -> 18623 bytes .../__pycache__/factory.cpython-310.pyc | Bin 0 -> 19103 bytes .../found_candidates.cpython-310.pyc | Bin 0 -> 4899 bytes .../__pycache__/provider.cpython-310.pyc | Bin 0 -> 7740 bytes .../__pycache__/reporter.cpython-310.pyc | Bin 0 -> 3208 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 0 -> 7497 bytes .../__pycache__/resolver.cpython-310.pyc | Bin 0 -> 8212 bytes .../_internal/resolution/resolvelib/base.py | 141 + .../resolution/resolvelib/candidates.py | 556 ++ .../resolution/resolvelib/factory.py | 731 ++ .../resolution/resolvelib/found_candidates.py | 155 + .../resolution/resolvelib/provider.py | 248 + .../resolution/resolvelib/reporter.py | 68 + .../resolution/resolvelib/requirements.py | 166 + .../resolution/resolvelib/resolver.py | 296 + .../pip/_internal/self_outdated_check.py | 242 + .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 223 bytes .../utils/__pycache__/_log.cpython-310.pyc | Bin 0 -> 1551 bytes .../utils/__pycache__/appdirs.cpython-310.pyc | Bin 0 -> 1649 bytes .../utils/__pycache__/compat.cpython-310.pyc | Bin 0 -> 1539 bytes .../compatibility_tags.cpython-310.pyc | Bin 0 -> 4108 bytes .../__pycache__/datetime.cpython-310.pyc | Bin 0 -> 546 bytes .../__pycache__/deprecation.cpython-310.pyc | Bin 0 -> 5131 bytes .../direct_url_helpers.cpython-310.pyc | Bin 0 -> 2114 bytes .../distutils_args.cpython-310.pyc | Bin 0 -> 1088 bytes .../__pycache__/egg_link.cpython-310.pyc | Bin 0 -> 2194 bytes .../__pycache__/encoding.cpython-310.pyc | Bin 0 -> 1336 bytes .../__pycache__/entrypoints.cpython-310.pyc | Bin 0 -> 2729 bytes .../__pycache__/filesystem.cpython-310.pyc | Bin 0 -> 4512 bytes .../__pycache__/filetypes.cpython-310.pyc | Bin 0 -> 973 bytes .../utils/__pycache__/glibc.cpython-310.pyc | Bin 0 -> 1702 bytes .../utils/__pycache__/hashes.cpython-310.pyc | Bin 0 -> 5253 bytes .../inject_securetransport.cpython-310.pyc | Bin 0 -> 1018 bytes .../utils/__pycache__/logging.cpython-310.pyc | Bin 0 -> 9748 bytes .../utils/__pycache__/misc.cpython-310.pyc | Bin 0 -> 22285 bytes .../utils/__pycache__/models.cpython-310.pyc | Bin 0 -> 2019 bytes .../__pycache__/packaging.cpython-310.pyc | Bin 0 -> 2111 bytes .../setuptools_build.cpython-310.pyc | Bin 0 -> 4630 bytes .../__pycache__/subprocess.cpython-310.pyc | Bin 0 -> 5802 bytes .../__pycache__/temp_dir.cpython-310.pyc | Bin 0 -> 7346 bytes .../__pycache__/unpacking.cpython-310.pyc | Bin 0 -> 6683 bytes .../utils/__pycache__/urls.cpython-310.pyc | Bin 0 -> 1616 bytes .../__pycache__/virtualenv.cpython-310.pyc | Bin 0 -> 3319 bytes .../utils/__pycache__/wheel.cpython-310.pyc | Bin 0 -> 4444 bytes .../site-packages/pip/_internal/utils/_log.py | 38 + .../pip/_internal/utils/appdirs.py | 52 + .../pip/_internal/utils/compat.py | 63 + .../pip/_internal/utils/compatibility_tags.py | 165 + .../pip/_internal/utils/datetime.py | 11 + .../pip/_internal/utils/deprecation.py | 188 + .../pip/_internal/utils/direct_url_helpers.py | 87 + .../pip/_internal/utils/distutils_args.py | 43 + .../pip/_internal/utils/egg_link.py | 72 + .../pip/_internal/utils/encoding.py | 36 + .../pip/_internal/utils/entrypoints.py | 84 + .../pip/_internal/utils/filesystem.py | 153 + .../pip/_internal/utils/filetypes.py | 27 + .../pip/_internal/utils/glibc.py | 88 + .../pip/_internal/utils/hashes.py | 144 + .../_internal/utils/inject_securetransport.py | 35 + .../pip/_internal/utils/logging.py | 348 + .../site-packages/pip/_internal/utils/misc.py | 739 ++ .../pip/_internal/utils/models.py | 39 + .../pip/_internal/utils/packaging.py | 57 + .../pip/_internal/utils/setuptools_build.py | 195 + .../pip/_internal/utils/subprocess.py | 260 + .../pip/_internal/utils/temp_dir.py | 246 + .../pip/_internal/utils/unpacking.py | 257 + .../site-packages/pip/_internal/utils/urls.py | 62 + .../pip/_internal/utils/virtualenv.py | 104 + .../pip/_internal/utils/wheel.py | 136 + .../pip/_internal/vcs/__init__.py | 15 + .../vcs/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 546 bytes .../vcs/__pycache__/bazaar.cpython-310.pyc | Bin 0 -> 3512 bytes .../vcs/__pycache__/git.cpython-310.pyc | Bin 0 -> 12576 bytes .../vcs/__pycache__/mercurial.cpython-310.pyc | Bin 0 -> 5092 bytes .../__pycache__/subversion.cpython-310.pyc | Bin 0 -> 8484 bytes .../versioncontrol.cpython-310.pyc | Bin 0 -> 21175 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 112 + .../site-packages/pip/_internal/vcs/git.py | 526 + .../pip/_internal/vcs/mercurial.py | 163 + .../pip/_internal/vcs/subversion.py | 324 + .../pip/_internal/vcs/versioncontrol.py | 705 ++ .../pip/_internal/wheel_builder.py | 382 + .../site-packages/pip/_vendor/__init__.py | 120 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3159 bytes .../_vendor/__pycache__/six.cpython-310.pyc | Bin 0 -> 27613 bytes .../typing_extensions.cpython-310.pyc | Bin 0 -> 65067 bytes .../pip/_vendor/cachecontrol/__init__.py | 18 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 674 bytes .../__pycache__/_cmd.cpython-310.pyc | Bin 0 -> 1612 bytes .../__pycache__/adapter.cpython-310.pyc | Bin 0 -> 3188 bytes .../__pycache__/cache.cpython-310.pyc | Bin 0 -> 2722 bytes .../__pycache__/compat.cpython-310.pyc | Bin 0 -> 788 bytes .../__pycache__/controller.cpython-310.pyc | Bin 0 -> 8622 bytes .../__pycache__/filewrapper.cpython-310.pyc | Bin 0 -> 2824 bytes .../__pycache__/heuristics.cpython-310.pyc | Bin 0 -> 4748 bytes .../__pycache__/serialize.cpython-310.pyc | Bin 0 -> 4363 bytes .../__pycache__/wrapper.cpython-310.pyc | Bin 0 -> 719 bytes .../pip/_vendor/cachecontrol/_cmd.py | 61 + .../pip/_vendor/cachecontrol/adapter.py | 137 + .../pip/_vendor/cachecontrol/cache.py | 65 + .../_vendor/cachecontrol/caches/__init__.py | 9 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 393 bytes .../__pycache__/file_cache.cpython-310.pyc | Bin 0 -> 4993 bytes .../__pycache__/redis_cache.cpython-310.pyc | Bin 0 -> 1651 bytes .../_vendor/cachecontrol/caches/file_cache.py | 188 + .../cachecontrol/caches/redis_cache.py | 39 + .../pip/_vendor/cachecontrol/compat.py | 32 + .../pip/_vendor/cachecontrol/controller.py | 439 + .../pip/_vendor/cachecontrol/filewrapper.py | 111 + .../pip/_vendor/cachecontrol/heuristics.py | 139 + .../pip/_vendor/cachecontrol/serialize.py | 190 + .../pip/_vendor/cachecontrol/wrapper.py | 33 + .../pip/_vendor/certifi/__init__.py | 4 + .../pip/_vendor/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 336 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 486 bytes .../certifi/__pycache__/core.cpython-310.pyc | Bin 0 -> 1956 bytes .../pip/_vendor/certifi/cacert.pem | 4527 +++++++++ .../site-packages/pip/_vendor/certifi/core.py | 108 + .../pip/_vendor/chardet/__init__.py | 115 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3204 bytes .../__pycache__/big5freq.cpython-310.pyc | Bin 0 -> 27210 bytes .../__pycache__/big5prober.cpython-310.pyc | Bin 0 -> 1188 bytes .../chardistribution.cpython-310.pyc | Bin 0 -> 6605 bytes .../charsetgroupprober.cpython-310.pyc | Bin 0 -> 2455 bytes .../__pycache__/charsetprober.cpython-310.pyc | Bin 0 -> 3861 bytes .../codingstatemachine.cpython-310.pyc | Bin 0 -> 3098 bytes .../codingstatemachinedict.cpython-310.pyc | Bin 0 -> 727 bytes .../__pycache__/cp949prober.cpython-310.pyc | Bin 0 -> 1195 bytes .../chardet/__pycache__/enums.cpython-310.pyc | Bin 0 -> 2688 bytes .../__pycache__/escprober.cpython-310.pyc | Bin 0 -> 2846 bytes .../chardet/__pycache__/escsm.cpython-310.pyc | Bin 0 -> 8549 bytes .../__pycache__/eucjpprober.cpython-310.pyc | Bin 0 -> 2632 bytes .../__pycache__/euckrfreq.cpython-310.pyc | Bin 0 -> 12094 bytes .../__pycache__/euckrprober.cpython-310.pyc | Bin 0 -> 1196 bytes .../__pycache__/euctwfreq.cpython-310.pyc | Bin 0 -> 27214 bytes .../__pycache__/euctwprober.cpython-310.pyc | Bin 0 -> 1196 bytes .../__pycache__/gb2312freq.cpython-310.pyc | Bin 0 -> 19138 bytes .../__pycache__/gb2312prober.cpython-310.pyc | Bin 0 -> 1204 bytes .../__pycache__/hebrewprober.cpython-310.pyc | Bin 0 -> 3445 bytes .../__pycache__/jisfreq.cpython-310.pyc | Bin 0 -> 22166 bytes .../__pycache__/johabfreq.cpython-310.pyc | Bin 0 -> 138790 bytes .../__pycache__/johabprober.cpython-310.pyc | Bin 0 -> 1195 bytes .../__pycache__/jpcntx.cpython-310.pyc | Bin 0 -> 38016 bytes .../langbulgarianmodel.cpython-310.pyc | Bin 0 -> 47958 bytes .../langgreekmodel.cpython-310.pyc | Bin 0 -> 46148 bytes .../langhebrewmodel.cpython-310.pyc | Bin 0 -> 44595 bytes .../langhungarianmodel.cpython-310.pyc | Bin 0 -> 47918 bytes .../langrussianmodel.cpython-310.pyc | Bin 0 -> 61059 bytes .../__pycache__/langthaimodel.cpython-310.pyc | Bin 0 -> 44771 bytes .../langturkishmodel.cpython-310.pyc | Bin 0 -> 44612 bytes .../__pycache__/latin1prober.cpython-310.pyc | Bin 0 -> 4594 bytes .../macromanprober.cpython-310.pyc | Bin 0 -> 4735 bytes .../mbcharsetprober.cpython-310.pyc | Bin 0 -> 2344 bytes .../mbcsgroupprober.cpython-310.pyc | Bin 0 -> 1292 bytes .../__pycache__/mbcssm.cpython-310.pyc | Bin 0 -> 20967 bytes .../__pycache__/resultdict.cpython-310.pyc | Bin 0 -> 607 bytes .../sbcharsetprober.cpython-310.pyc | Bin 0 -> 3713 bytes .../sbcsgroupprober.cpython-310.pyc | Bin 0 -> 1771 bytes .../__pycache__/sjisprober.cpython-310.pyc | Bin 0 -> 2670 bytes .../universaldetector.cpython-310.pyc | Bin 0 -> 7158 bytes .../__pycache__/utf1632prober.cpython-310.pyc | Bin 0 -> 6130 bytes .../__pycache__/utf8prober.cpython-310.pyc | Bin 0 -> 2140 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 472 bytes .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 261 + .../pip/_vendor/chardet/charsetgroupprober.py | 106 + .../pip/_vendor/chardet/charsetprober.py | 147 + .../pip/_vendor/chardet/cli/__init__.py | 0 .../cli/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 227 bytes .../__pycache__/chardetect.cpython-310.pyc | Bin 0 -> 3069 bytes .../pip/_vendor/chardet/cli/chardetect.py | 112 + .../pip/_vendor/chardet/codingstatemachine.py | 90 + .../_vendor/chardet/codingstatemachinedict.py | 19 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 85 + .../pip/_vendor/chardet/escprober.py | 102 + .../pip/_vendor/chardet/escsm.py | 261 + .../pip/_vendor/chardet/eucjpprober.py | 102 + .../pip/_vendor/chardet/euckrfreq.py | 196 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 388 + .../pip/_vendor/chardet/euctwprober.py | 47 + .../pip/_vendor/chardet/gb2312freq.py | 284 + .../pip/_vendor/chardet/gb2312prober.py | 47 + .../pip/_vendor/chardet/hebrewprober.py | 316 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/johabfreq.py | 2382 +++++ .../pip/_vendor/chardet/johabprober.py | 47 + .../pip/_vendor/chardet/jpcntx.py | 238 + .../pip/_vendor/chardet/langbulgarianmodel.py | 4649 +++++++++ .../pip/_vendor/chardet/langgreekmodel.py | 4397 +++++++++ .../pip/_vendor/chardet/langhebrewmodel.py | 4380 +++++++++ .../pip/_vendor/chardet/langhungarianmodel.py | 4649 +++++++++ .../pip/_vendor/chardet/langrussianmodel.py | 5725 +++++++++++ .../pip/_vendor/chardet/langthaimodel.py | 4380 +++++++++ .../pip/_vendor/chardet/langturkishmodel.py | 4380 +++++++++ .../pip/_vendor/chardet/latin1prober.py | 147 + .../pip/_vendor/chardet/macromanprober.py | 162 + .../pip/_vendor/chardet/mbcharsetprober.py | 95 + .../pip/_vendor/chardet/mbcsgroupprober.py | 57 + .../pip/_vendor/chardet/mbcssm.py | 661 ++ .../pip/_vendor/chardet/metadata/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 232 bytes .../__pycache__/languages.cpython-310.pyc | Bin 0 -> 8215 bytes .../pip/_vendor/chardet/metadata/languages.py | 352 + .../pip/_vendor/chardet/resultdict.py | 16 + .../pip/_vendor/chardet/sbcharsetprober.py | 162 + .../pip/_vendor/chardet/sbcsgroupprober.py | 88 + .../pip/_vendor/chardet/sjisprober.py | 105 + .../pip/_vendor/chardet/universaldetector.py | 362 + .../pip/_vendor/chardet/utf1632prober.py | 225 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 7 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 510 bytes .../colorama/__pycache__/ansi.cpython-310.pyc | Bin 0 -> 3036 bytes .../__pycache__/ansitowin32.cpython-310.pyc | Bin 0 -> 8548 bytes .../__pycache__/initialise.cpython-310.pyc | Bin 0 -> 2293 bytes .../__pycache__/win32.cpython-310.pyc | Bin 0 -> 4503 bytes .../__pycache__/winterm.cpython-310.pyc | Bin 0 -> 5199 bytes .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 277 + .../pip/_vendor/colorama/initialise.py | 121 + .../pip/_vendor/colorama/tests/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 230 bytes .../__pycache__/ansi_test.cpython-310.pyc | Bin 0 -> 2322 bytes .../ansitowin32_test.cpython-310.pyc | Bin 0 -> 11633 bytes .../initialise_test.cpython-310.pyc | Bin 0 -> 6930 bytes .../__pycache__/isatty_test.cpython-310.pyc | Bin 0 -> 2721 bytes .../tests/__pycache__/utils.cpython-310.pyc | Bin 0 -> 1630 bytes .../__pycache__/winterm_test.cpython-310.pyc | Bin 0 -> 3223 bytes .../pip/_vendor/colorama/tests/ansi_test.py | 76 + .../colorama/tests/ansitowin32_test.py | 294 + .../_vendor/colorama/tests/initialise_test.py | 189 + .../pip/_vendor/colorama/tests/isatty_test.py | 57 + .../pip/_vendor/colorama/tests/utils.py | 49 + .../_vendor/colorama/tests/winterm_test.py | 131 + .../pip/_vendor/colorama/win32.py | 180 + .../pip/_vendor/colorama/winterm.py | 195 + .../pip/_vendor/distlib/__init__.py | 23 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1094 bytes .../__pycache__/compat.cpython-310.pyc | Bin 0 -> 31440 bytes .../__pycache__/database.cpython-310.pyc | Bin 0 -> 43180 bytes .../distlib/__pycache__/index.cpython-310.pyc | Bin 0 -> 17345 bytes .../__pycache__/locators.cpython-310.pyc | Bin 0 -> 38402 bytes .../__pycache__/manifest.cpython-310.pyc | Bin 0 -> 10262 bytes .../__pycache__/markers.cpython-310.pyc | Bin 0 -> 5066 bytes .../__pycache__/metadata.cpython-310.pyc | Bin 0 -> 26819 bytes .../__pycache__/resources.cpython-310.pyc | Bin 0 -> 11068 bytes .../__pycache__/scripts.cpython-310.pyc | Bin 0 -> 11532 bytes .../distlib/__pycache__/util.cpython-310.pyc | Bin 0 -> 51727 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 20181 bytes .../distlib/__pycache__/wheel.cpython-310.pyc | Bin 0 -> 28163 bytes .../pip/_vendor/distlib/compat.py | 1116 +++ .../pip/_vendor/distlib/database.py | 1350 +++ .../pip/_vendor/distlib/index.py | 508 + .../pip/_vendor/distlib/locators.py | 1300 +++ .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/markers.py | 152 + .../pip/_vendor/distlib/metadata.py | 1076 +++ .../pip/_vendor/distlib/resources.py | 358 + .../pip/_vendor/distlib/scripts.py | 437 + .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 97792 bytes .../pip/_vendor/distlib/t64-arm.exe | Bin 0 -> 182784 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 108032 bytes .../site-packages/pip/_vendor/distlib/util.py | 1932 ++++ .../pip/_vendor/distlib/version.py | 739 ++ .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 91648 bytes .../pip/_vendor/distlib/w64-arm.exe | Bin 0 -> 168448 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 101888 bytes .../pip/_vendor/distlib/wheel.py | 1082 +++ .../pip/_vendor/distro/__init__.py | 54 + .../pip/_vendor/distro/__main__.py | 4 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 947 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 301 bytes .../distro/__pycache__/distro.cpython-310.pyc | Bin 0 -> 42095 bytes .../pip/_vendor/distro/distro.py | 1399 +++ .../pip/_vendor/idna/__init__.py | 44 + .../idna/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 879 bytes .../idna/__pycache__/codec.cpython-310.pyc | Bin 0 -> 2850 bytes .../idna/__pycache__/compat.cpython-310.pyc | Bin 0 -> 779 bytes .../idna/__pycache__/core.cpython-310.pyc | Bin 0 -> 9708 bytes .../idna/__pycache__/idnadata.cpython-310.pyc | Bin 0 -> 38415 bytes .../__pycache__/intranges.cpython-310.pyc | Bin 0 -> 2016 bytes .../__pycache__/package_data.cpython-310.pyc | Bin 0 -> 243 bytes .../__pycache__/uts46data.cpython-310.pyc | Bin 0 -> 152430 bytes .../site-packages/pip/_vendor/idna/codec.py | 112 + .../site-packages/pip/_vendor/idna/compat.py | 13 + .../site-packages/pip/_vendor/idna/core.py | 400 + .../pip/_vendor/idna/idnadata.py | 2151 +++++ .../pip/_vendor/idna/intranges.py | 54 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8600 +++++++++++++++++ .../pip/_vendor/msgpack/__init__.py | 57 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1477 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 1840 bytes .../msgpack/__pycache__/ext.cpython-310.pyc | Bin 0 -> 6348 bytes .../__pycache__/fallback.cpython-310.pyc | Bin 0 -> 25515 bytes .../pip/_vendor/msgpack/exceptions.py | 48 + .../site-packages/pip/_vendor/msgpack/ext.py | 193 + .../pip/_vendor/msgpack/fallback.py | 1010 ++ .../pip/_vendor/packaging/__about__.py | 26 + .../pip/_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-310.pyc | Bin 0 -> 622 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 478 bytes .../__pycache__/_manylinux.cpython-310.pyc | Bin 0 -> 7332 bytes .../__pycache__/_musllinux.cpython-310.pyc | Bin 0 -> 4644 bytes .../__pycache__/_structures.cpython-310.pyc | Bin 0 -> 2737 bytes .../__pycache__/markers.cpython-310.pyc | Bin 0 -> 9319 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 0 -> 4007 bytes .../__pycache__/specifiers.cpython-310.pyc | Bin 0 -> 21559 bytes .../__pycache__/tags.cpython-310.pyc | Bin 0 -> 12222 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 3607 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 12957 bytes .../pip/_vendor/packaging/_manylinux.py | 301 + .../pip/_vendor/packaging/_musllinux.py | 136 + .../pip/_vendor/packaging/_structures.py | 61 + .../pip/_vendor/packaging/markers.py | 304 + .../pip/_vendor/packaging/requirements.py | 146 + .../pip/_vendor/packaging/specifiers.py | 802 ++ .../pip/_vendor/packaging/tags.py | 487 + .../pip/_vendor/packaging/utils.py | 136 + .../pip/_vendor/packaging/version.py | 504 + .../pip/_vendor/pkg_resources/__init__.py | 3296 +++++++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 99908 bytes .../__pycache__/py31compat.cpython-310.pyc | Bin 0 -> 692 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 + .../pip/_vendor/platformdirs/__init__.py | 342 + .../pip/_vendor/platformdirs/__main__.py | 46 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 10617 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 1268 bytes .../__pycache__/android.cpython-310.pyc | Bin 0 -> 4358 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 5234 bytes .../__pycache__/macos.cpython-310.pyc | Bin 0 -> 3222 bytes .../__pycache__/unix.cpython-310.pyc | Bin 0 -> 6924 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 322 bytes .../__pycache__/windows.cpython-310.pyc | Bin 0 -> 6542 bytes .../pip/_vendor/platformdirs/android.py | 120 + .../pip/_vendor/platformdirs/api.py | 156 + .../pip/_vendor/platformdirs/macos.py | 64 + .../pip/_vendor/platformdirs/unix.py | 181 + .../pip/_vendor/platformdirs/version.py | 4 + .../pip/_vendor/platformdirs/windows.py | 184 + .../pip/_vendor/pygments/__init__.py | 82 + .../pip/_vendor/pygments/__main__.py | 17 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2980 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 620 bytes .../__pycache__/cmdline.cpython-310.pyc | Bin 0 -> 15635 bytes .../__pycache__/console.cpython-310.pyc | Bin 0 -> 1915 bytes .../__pycache__/filter.cpython-310.pyc | Bin 0 -> 2686 bytes .../__pycache__/formatter.cpython-310.pyc | Bin 0 -> 3042 bytes .../__pycache__/lexer.cpython-310.pyc | Bin 0 -> 24403 bytes .../__pycache__/modeline.cpython-310.pyc | Bin 0 -> 1224 bytes .../__pycache__/plugin.cpython-310.pyc | Bin 0 -> 2552 bytes .../__pycache__/regexopt.cpython-310.pyc | Bin 0 -> 2988 bytes .../__pycache__/scanner.cpython-310.pyc | Bin 0 -> 3590 bytes .../__pycache__/sphinxext.cpython-310.pyc | Bin 0 -> 4574 bytes .../__pycache__/style.cpython-310.pyc | Bin 0 -> 4611 bytes .../__pycache__/token.cpython-310.pyc | Bin 0 -> 4703 bytes .../__pycache__/unistring.cpython-310.pyc | Bin 0 -> 31237 bytes .../pygments/__pycache__/util.cpython-310.pyc | Bin 0 -> 9179 bytes .../pip/_vendor/pygments/cmdline.py | 668 ++ .../pip/_vendor/pygments/console.py | 70 + .../pip/_vendor/pygments/filter.py | 71 + .../pip/_vendor/pygments/filters/__init__.py | 940 ++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 29640 bytes .../pip/_vendor/pygments/formatter.py | 94 + .../_vendor/pygments/formatters/__init__.py | 143 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 4402 bytes .../__pycache__/_mapping.cpython-310.pyc | Bin 0 -> 3962 bytes .../__pycache__/bbcode.cpython-310.pyc | Bin 0 -> 3117 bytes .../__pycache__/groff.cpython-310.pyc | Bin 0 -> 4430 bytes .../__pycache__/html.cpython-310.pyc | Bin 0 -> 29162 bytes .../__pycache__/img.cpython-310.pyc | Bin 0 -> 17594 bytes .../__pycache__/irc.cpython-310.pyc | Bin 0 -> 4620 bytes .../__pycache__/latex.cpython-310.pyc | Bin 0 -> 13830 bytes .../__pycache__/other.cpython-310.pyc | Bin 0 -> 4836 bytes .../__pycache__/pangomarkup.cpython-310.pyc | Bin 0 -> 2136 bytes .../__pycache__/rtf.cpython-310.pyc | Bin 0 -> 4166 bytes .../__pycache__/svg.cpython-310.pyc | Bin 0 -> 6364 bytes .../__pycache__/terminal.cpython-310.pyc | Bin 0 -> 4031 bytes .../__pycache__/terminal256.cpython-310.pyc | Bin 0 -> 9281 bytes .../_vendor/pygments/formatters/_mapping.py | 23 + .../pip/_vendor/pygments/formatters/bbcode.py | 108 + .../pip/_vendor/pygments/formatters/groff.py | 170 + .../pip/_vendor/pygments/formatters/html.py | 989 ++ .../pip/_vendor/pygments/formatters/img.py | 645 ++ .../pip/_vendor/pygments/formatters/irc.py | 179 + .../pip/_vendor/pygments/formatters/latex.py | 521 + .../pip/_vendor/pygments/formatters/other.py | 161 + .../pygments/formatters/pangomarkup.py | 83 + .../pip/_vendor/pygments/formatters/rtf.py | 146 + .../pip/_vendor/pygments/formatters/svg.py | 188 + .../_vendor/pygments/formatters/terminal.py | 127 + .../pygments/formatters/terminal256.py | 338 + .../pip/_vendor/pygments/lexer.py | 882 ++ .../pip/_vendor/pygments/lexers/__init__.py | 335 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 9088 bytes .../__pycache__/_mapping.cpython-310.pyc | Bin 0 -> 58915 bytes .../lexers/__pycache__/python.cpython-310.pyc | Bin 0 -> 29874 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 541 ++ .../pip/_vendor/pygments/lexers/python.py | 1204 +++ .../pip/_vendor/pygments/modeline.py | 43 + .../pip/_vendor/pygments/plugin.py | 88 + .../pip/_vendor/pygments/regexopt.py | 91 + .../pip/_vendor/pygments/scanner.py | 104 + .../pip/_vendor/pygments/sphinxext.py | 155 + .../pip/_vendor/pygments/style.py | 197 + .../pip/_vendor/pygments/styles/__init__.py | 97 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3403 bytes .../pip/_vendor/pygments/token.py | 213 + .../pip/_vendor/pygments/unistring.py | 153 + .../pip/_vendor/pygments/util.py | 308 + .../pip/_vendor/pyparsing/__init__.py | 331 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 7161 bytes .../__pycache__/actions.cpython-310.pyc | Bin 0 -> 7211 bytes .../__pycache__/common.cpython-310.pyc | Bin 0 -> 10137 bytes .../__pycache__/core.cpython-310.pyc | Bin 0 -> 176488 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 9095 bytes .../__pycache__/helpers.cpython-310.pyc | Bin 0 -> 35372 bytes .../__pycache__/results.cpython-310.pyc | Bin 0 -> 24813 bytes .../__pycache__/testing.cpython-310.pyc | Bin 0 -> 12129 bytes .../__pycache__/unicode.cpython-310.pyc | Bin 0 -> 10090 bytes .../__pycache__/util.cpython-310.pyc | Bin 0 -> 8637 bytes .../pip/_vendor/pyparsing/actions.py | 207 + .../pip/_vendor/pyparsing/common.py | 424 + .../pip/_vendor/pyparsing/core.py | 5814 +++++++++++ .../pip/_vendor/pyparsing/diagram/__init__.py | 642 ++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 16613 bytes .../pip/_vendor/pyparsing/exceptions.py | 267 + .../pip/_vendor/pyparsing/helpers.py | 1088 +++ .../pip/_vendor/pyparsing/results.py | 760 ++ .../pip/_vendor/pyparsing/testing.py | 331 + .../pip/_vendor/pyparsing/unicode.py | 352 + .../pip/_vendor/pyparsing/util.py | 235 + .../pip/_vendor/pyproject_hooks/__init__.py | 23 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 618 bytes .../__pycache__/_compat.cpython-310.pyc | Bin 0 -> 369 bytes .../__pycache__/_impl.cpython-310.pyc | Bin 0 -> 11421 bytes .../pip/_vendor/pyproject_hooks/_compat.py | 8 + .../pip/_vendor/pyproject_hooks/_impl.py | 330 + .../pyproject_hooks/_in_process/__init__.py | 18 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 856 bytes .../__pycache__/_in_process.cpython-310.pyc | Bin 0 -> 9738 bytes .../_in_process/_in_process.py | 353 + .../pip/_vendor/requests/__init__.py | 182 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 4048 bytes .../__pycache__/__version__.cpython-310.pyc | Bin 0 -> 582 bytes .../_internal_utils.cpython-310.pyc | Bin 0 -> 1597 bytes .../__pycache__/adapters.cpython-310.pyc | Bin 0 -> 16931 bytes .../requests/__pycache__/api.cpython-310.pyc | Bin 0 -> 6686 bytes .../requests/__pycache__/auth.cpython-310.pyc | Bin 0 -> 8154 bytes .../__pycache__/certs.cpython-310.pyc | Bin 0 -> 841 bytes .../__pycache__/compat.cpython-310.pyc | Bin 0 -> 1403 bytes .../__pycache__/cookies.cpython-310.pyc | Bin 0 -> 18723 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 5773 bytes .../requests/__pycache__/help.cpython-310.pyc | Bin 0 -> 2899 bytes .../__pycache__/hooks.cpython-310.pyc | Bin 0 -> 1026 bytes .../__pycache__/models.cpython-310.pyc | Bin 0 -> 24298 bytes .../__pycache__/packages.cpython-310.pyc | Bin 0 -> 540 bytes .../__pycache__/sessions.cpython-310.pyc | Bin 0 -> 19606 bytes .../__pycache__/status_codes.cpython-310.pyc | Bin 0 -> 4705 bytes .../__pycache__/structures.cpython-310.pyc | Bin 0 -> 4470 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 24368 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 48 + .../pip/_vendor/requests/adapters.py | 584 ++ .../site-packages/pip/_vendor/requests/api.py | 157 + .../pip/_vendor/requests/auth.py | 315 + .../pip/_vendor/requests/certs.py | 24 + .../pip/_vendor/requests/compat.py | 67 + .../pip/_vendor/requests/cookies.py | 561 ++ .../pip/_vendor/requests/exceptions.py | 141 + .../pip/_vendor/requests/help.py | 131 + .../pip/_vendor/requests/hooks.py | 33 + .../pip/_vendor/requests/models.py | 1034 ++ .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 831 ++ .../pip/_vendor/requests/status_codes.py | 128 + .../pip/_vendor/requests/structures.py | 99 + .../pip/_vendor/requests/utils.py | 1086 +++ .../pip/_vendor/resolvelib/__init__.py | 26 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 638 bytes .../__pycache__/providers.cpython-310.pyc | Bin 0 -> 6689 bytes .../__pycache__/reporters.cpython-310.pyc | Bin 0 -> 2609 bytes .../__pycache__/resolvers.cpython-310.pyc | Bin 0 -> 15162 bytes .../__pycache__/structs.cpython-310.pyc | Bin 0 -> 7195 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 233 bytes .../collections_abc.cpython-310.pyc | Bin 0 -> 409 bytes .../resolvelib/compat/collections_abc.py | 6 + .../pip/_vendor/resolvelib/providers.py | 133 + .../pip/_vendor/resolvelib/reporters.py | 43 + .../pip/_vendor/resolvelib/resolvers.py | 482 + .../pip/_vendor/resolvelib/structs.py | 165 + .../pip/_vendor/rich/__init__.py | 177 + .../pip/_vendor/rich/__main__.py | 274 + .../rich/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 6145 bytes .../rich/__pycache__/__main__.cpython-310.pyc | Bin 0 -> 7215 bytes .../__pycache__/_cell_widths.cpython-310.pyc | Bin 0 -> 7846 bytes .../__pycache__/_emoji_codes.cpython-310.pyc | Bin 0 -> 360086 bytes .../_emoji_replace.cpython-310.pyc | Bin 0 -> 1226 bytes .../_export_format.cpython-310.pyc | Bin 0 -> 2343 bytes .../__pycache__/_extension.cpython-310.pyc | Bin 0 -> 527 bytes .../rich/__pycache__/_inspect.cpython-310.pyc | Bin 0 -> 8704 bytes .../__pycache__/_log_render.cpython-310.pyc | Bin 0 -> 2672 bytes .../rich/__pycache__/_loop.cpython-310.pyc | Bin 0 -> 1324 bytes .../__pycache__/_null_file.cpython-310.pyc | Bin 0 -> 3635 bytes .../__pycache__/_palettes.cpython-310.pyc | Bin 0 -> 5129 bytes .../rich/__pycache__/_pick.cpython-310.pyc | Bin 0 -> 672 bytes .../rich/__pycache__/_ratio.cpython-310.pyc | Bin 0 -> 5189 bytes .../__pycache__/_spinners.cpython-310.pyc | Bin 0 -> 12303 bytes .../rich/__pycache__/_stack.cpython-310.pyc | Bin 0 -> 870 bytes .../rich/__pycache__/_timer.cpython-310.pyc | Bin 0 -> 719 bytes .../_win32_console.cpython-310.pyc | Bin 0 -> 19039 bytes .../rich/__pycache__/_windows.cpython-310.pyc | Bin 0 -> 1821 bytes .../_windows_renderer.cpython-310.pyc | Bin 0 -> 2075 bytes .../rich/__pycache__/_wrap.cpython-310.pyc | Bin 0 -> 1583 bytes .../rich/__pycache__/abc.cpython-310.pyc | Bin 0 -> 1346 bytes .../rich/__pycache__/align.cpython-310.pyc | Bin 0 -> 7981 bytes .../rich/__pycache__/ansi.cpython-310.pyc | Bin 0 -> 5985 bytes .../rich/__pycache__/bar.cpython-310.pyc | Bin 0 -> 3015 bytes .../rich/__pycache__/box.cpython-310.pyc | Bin 0 -> 8435 bytes .../rich/__pycache__/cells.cpython-310.pyc | Bin 0 -> 4005 bytes .../rich/__pycache__/color.cpython-310.pyc | Bin 0 -> 17626 bytes .../__pycache__/color_triplet.cpython-310.pyc | Bin 0 -> 1469 bytes .../rich/__pycache__/columns.cpython-310.pyc | Bin 0 -> 6229 bytes .../rich/__pycache__/console.cpython-310.pyc | Bin 0 -> 82603 bytes .../__pycache__/constrain.cpython-310.pyc | Bin 0 -> 1786 bytes .../__pycache__/containers.cpython-310.pyc | Bin 0 -> 6518 bytes .../rich/__pycache__/control.cpython-310.pyc | Bin 0 -> 8191 bytes .../default_styles.cpython-310.pyc | Bin 0 -> 6230 bytes .../rich/__pycache__/diagnose.cpython-310.pyc | Bin 0 -> 1253 bytes .../rich/__pycache__/emoji.cpython-310.pyc | Bin 0 -> 3299 bytes .../rich/__pycache__/errors.cpython-310.pyc | Bin 0 -> 1559 bytes .../__pycache__/file_proxy.cpython-310.pyc | Bin 0 -> 2292 bytes .../rich/__pycache__/filesize.cpython-310.pyc | Bin 0 -> 2649 bytes .../__pycache__/highlighter.cpython-310.pyc | Bin 0 -> 8092 bytes .../rich/__pycache__/json.cpython-310.pyc | Bin 0 -> 4779 bytes .../rich/__pycache__/jupyter.cpython-310.pyc | Bin 0 -> 4031 bytes .../rich/__pycache__/layout.cpython-310.pyc | Bin 0 -> 14679 bytes .../rich/__pycache__/live.cpython-310.pyc | Bin 0 -> 11656 bytes .../__pycache__/live_render.cpython-310.pyc | Bin 0 -> 3434 bytes .../rich/__pycache__/logging.cpython-310.pyc | Bin 0 -> 9940 bytes .../rich/__pycache__/markup.cpython-310.pyc | Bin 0 -> 5973 bytes .../rich/__pycache__/measure.cpython-310.pyc | Bin 0 -> 5108 bytes .../rich/__pycache__/padding.cpython-310.pyc | Bin 0 -> 4514 bytes .../rich/__pycache__/pager.cpython-310.pyc | Bin 0 -> 1508 bytes .../rich/__pycache__/palette.cpython-310.pyc | Bin 0 -> 3740 bytes .../rich/__pycache__/panel.cpython-310.pyc | Bin 0 -> 7460 bytes .../rich/__pycache__/pretty.cpython-310.pyc | Bin 0 -> 27952 bytes .../rich/__pycache__/progress.cpython-310.pyc | Bin 0 -> 54060 bytes .../__pycache__/progress_bar.cpython-310.pyc | Bin 0 -> 6943 bytes .../rich/__pycache__/prompt.cpython-310.pyc | Bin 0 -> 11331 bytes .../rich/__pycache__/protocol.cpython-310.pyc | Bin 0 -> 1384 bytes .../rich/__pycache__/region.cpython-310.pyc | Bin 0 -> 559 bytes .../rich/__pycache__/repr.cpython-310.pyc | Bin 0 -> 4132 bytes .../rich/__pycache__/rule.cpython-310.pyc | Bin 0 -> 4341 bytes .../rich/__pycache__/scope.cpython-310.pyc | Bin 0 -> 3021 bytes .../rich/__pycache__/screen.cpython-310.pyc | Bin 0 -> 1911 bytes .../rich/__pycache__/segment.cpython-310.pyc | Bin 0 -> 20789 bytes .../rich/__pycache__/spinner.cpython-310.pyc | Bin 0 -> 4449 bytes .../rich/__pycache__/status.cpython-310.pyc | Bin 0 -> 4625 bytes .../rich/__pycache__/style.cpython-310.pyc | Bin 0 -> 20874 bytes .../rich/__pycache__/styled.cpython-310.pyc | Bin 0 -> 1795 bytes .../rich/__pycache__/syntax.cpython-310.pyc | Bin 0 -> 25709 bytes .../rich/__pycache__/table.cpython-310.pyc | Bin 0 -> 29974 bytes .../terminal_theme.cpython-310.pyc | Bin 0 -> 3048 bytes .../rich/__pycache__/text.cpython-310.pyc | Bin 0 -> 40223 bytes .../rich/__pycache__/theme.cpython-310.pyc | Bin 0 -> 4732 bytes .../rich/__pycache__/themes.cpython-310.pyc | Bin 0 -> 325 bytes .../__pycache__/traceback.cpython-310.pyc | Bin 0 -> 19657 bytes .../rich/__pycache__/tree.cpython-310.pyc | Bin 0 -> 7366 bytes .../pip/_vendor/rich/_cell_widths.py | 451 + .../pip/_vendor/rich/_emoji_codes.py | 3610 +++++++ .../pip/_vendor/rich/_emoji_replace.py | 32 + .../pip/_vendor/rich/_export_format.py | 78 + .../pip/_vendor/rich/_extension.py | 10 + .../pip/_vendor/rich/_inspect.py | 270 + .../pip/_vendor/rich/_log_render.py | 94 + .../site-packages/pip/_vendor/rich/_loop.py | 43 + .../pip/_vendor/rich/_null_file.py | 83 + .../pip/_vendor/rich/_palettes.py | 309 + .../site-packages/pip/_vendor/rich/_pick.py | 17 + .../site-packages/pip/_vendor/rich/_ratio.py | 160 + .../pip/_vendor/rich/_spinners.py | 482 + .../site-packages/pip/_vendor/rich/_stack.py | 16 + .../site-packages/pip/_vendor/rich/_timer.py | 19 + .../pip/_vendor/rich/_win32_console.py | 662 ++ .../pip/_vendor/rich/_windows.py | 72 + .../pip/_vendor/rich/_windows_renderer.py | 56 + .../site-packages/pip/_vendor/rich/_wrap.py | 56 + .../site-packages/pip/_vendor/rich/abc.py | 33 + .../site-packages/pip/_vendor/rich/align.py | 311 + .../site-packages/pip/_vendor/rich/ansi.py | 237 + .../site-packages/pip/_vendor/rich/bar.py | 94 + .../site-packages/pip/_vendor/rich/box.py | 517 + .../site-packages/pip/_vendor/rich/cells.py | 154 + .../site-packages/pip/_vendor/rich/color.py | 618 ++ .../pip/_vendor/rich/color_triplet.py | 38 + .../site-packages/pip/_vendor/rich/columns.py | 187 + .../site-packages/pip/_vendor/rich/console.py | 2612 +++++ .../pip/_vendor/rich/constrain.py | 37 + .../pip/_vendor/rich/containers.py | 167 + .../site-packages/pip/_vendor/rich/control.py | 225 + .../pip/_vendor/rich/default_styles.py | 188 + .../pip/_vendor/rich/diagnose.py | 37 + .../site-packages/pip/_vendor/rich/emoji.py | 96 + .../site-packages/pip/_vendor/rich/errors.py | 34 + .../pip/_vendor/rich/file_proxy.py | 54 + .../pip/_vendor/rich/filesize.py | 89 + .../pip/_vendor/rich/highlighter.py | 232 + .../site-packages/pip/_vendor/rich/json.py | 140 + .../site-packages/pip/_vendor/rich/jupyter.py | 101 + .../site-packages/pip/_vendor/rich/layout.py | 443 + .../site-packages/pip/_vendor/rich/live.py | 373 + .../pip/_vendor/rich/live_render.py | 113 + .../site-packages/pip/_vendor/rich/logging.py | 289 + .../site-packages/pip/_vendor/rich/markup.py | 246 + .../site-packages/pip/_vendor/rich/measure.py | 151 + .../site-packages/pip/_vendor/rich/padding.py | 141 + .../site-packages/pip/_vendor/rich/pager.py | 34 + .../site-packages/pip/_vendor/rich/palette.py | 100 + .../site-packages/pip/_vendor/rich/panel.py | 308 + .../site-packages/pip/_vendor/rich/pretty.py | 1029 ++ .../pip/_vendor/rich/progress.py | 1707 ++++ .../pip/_vendor/rich/progress_bar.py | 224 + .../site-packages/pip/_vendor/rich/prompt.py | 376 + .../pip/_vendor/rich/protocol.py | 42 + .../site-packages/pip/_vendor/rich/region.py | 10 + .../site-packages/pip/_vendor/rich/repr.py | 149 + .../site-packages/pip/_vendor/rich/rule.py | 134 + .../site-packages/pip/_vendor/rich/scope.py | 86 + .../site-packages/pip/_vendor/rich/screen.py | 54 + .../site-packages/pip/_vendor/rich/segment.py | 739 ++ .../site-packages/pip/_vendor/rich/spinner.py | 136 + .../site-packages/pip/_vendor/rich/status.py | 132 + .../site-packages/pip/_vendor/rich/style.py | 773 ++ .../site-packages/pip/_vendor/rich/styled.py | 42 + .../site-packages/pip/_vendor/rich/syntax.py | 945 ++ .../site-packages/pip/_vendor/rich/table.py | 1002 ++ .../pip/_vendor/rich/terminal_theme.py | 153 + .../site-packages/pip/_vendor/rich/text.py | 1311 +++ .../site-packages/pip/_vendor/rich/theme.py | 112 + .../site-packages/pip/_vendor/rich/themes.py | 5 + .../pip/_vendor/rich/traceback.py | 677 ++ .../site-packages/pip/_vendor/rich/tree.py | 251 + .../site-packages/pip/_vendor/six.py | 998 ++ .../pip/_vendor/tenacity/__init__.py | 519 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 16504 bytes .../__pycache__/_asyncio.cpython-310.pyc | Bin 0 -> 2646 bytes .../__pycache__/_utils.cpython-310.pyc | Bin 0 -> 1259 bytes .../__pycache__/after.cpython-310.pyc | Bin 0 -> 1263 bytes .../__pycache__/before.cpython-310.pyc | Bin 0 -> 1141 bytes .../__pycache__/before_sleep.cpython-310.pyc | Bin 0 -> 1443 bytes .../tenacity/__pycache__/nap.cpython-310.pyc | Bin 0 -> 1231 bytes .../__pycache__/retry.cpython-310.pyc | Bin 0 -> 9393 bytes .../tenacity/__pycache__/stop.cpython-310.pyc | Bin 0 -> 4049 bytes .../__pycache__/tornadoweb.cpython-310.pyc | Bin 0 -> 1796 bytes .../tenacity/__pycache__/wait.cpython-310.pyc | Bin 0 -> 9392 bytes .../pip/_vendor/tenacity/_asyncio.py | 92 + .../pip/_vendor/tenacity/_utils.py | 68 + .../pip/_vendor/tenacity/after.py | 46 + .../pip/_vendor/tenacity/before.py | 41 + .../pip/_vendor/tenacity/before_sleep.py | 58 + .../site-packages/pip/_vendor/tenacity/nap.py | 43 + .../pip/_vendor/tenacity/retry.py | 240 + .../pip/_vendor/tenacity/stop.py | 96 + .../pip/_vendor/tenacity/tornadoweb.py | 59 + .../pip/_vendor/tenacity/wait.py | 232 + .../pip/_vendor/tomli/__init__.py | 11 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 387 bytes .../tomli/__pycache__/_parser.cpython-310.pyc | Bin 0 -> 17101 bytes .../tomli/__pycache__/_re.cpython-310.pyc | Bin 0 -> 2933 bytes .../tomli/__pycache__/_types.cpython-310.pyc | Bin 0 -> 357 bytes .../pip/_vendor/tomli/_parser.py | 691 ++ .../site-packages/pip/_vendor/tomli/_re.py | 107 + .../site-packages/pip/_vendor/tomli/_types.py | 10 + .../pip/_vendor/typing_extensions.py | 2209 +++++ .../pip/_vendor/urllib3/__init__.py | 102 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2541 bytes .../__pycache__/_collections.cpython-310.pyc | Bin 0 -> 10895 bytes .../__pycache__/_version.cpython-310.pyc | Bin 0 -> 246 bytes .../__pycache__/connection.cpython-310.pyc | Bin 0 -> 13667 bytes .../connectionpool.cpython-310.pyc | Bin 0 -> 25426 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 11026 bytes .../__pycache__/fields.cpython-310.pyc | Bin 0 -> 8215 bytes .../__pycache__/filepost.cpython-310.pyc | Bin 0 -> 2782 bytes .../__pycache__/poolmanager.cpython-310.pyc | Bin 0 -> 15251 bytes .../__pycache__/request.cpython-310.pyc | Bin 0 -> 5658 bytes .../__pycache__/response.cpython-310.pyc | Bin 0 -> 22532 bytes .../pip/_vendor/urllib3/_collections.py | 337 + .../pip/_vendor/urllib3/_version.py | 2 + .../pip/_vendor/urllib3/connection.py | 567 ++ .../pip/_vendor/urllib3/connectionpool.py | 1110 +++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 231 bytes .../_appengine_environ.cpython-310.pyc | Bin 0 -> 1411 bytes .../__pycache__/appengine.cpython-310.pyc | Bin 0 -> 8228 bytes .../__pycache__/ntlmpool.cpython-310.pyc | Bin 0 -> 3655 bytes .../__pycache__/pyopenssl.cpython-310.pyc | Bin 0 -> 15841 bytes .../securetransport.cpython-310.pyc | Bin 0 -> 21973 bytes .../contrib/__pycache__/socks.cpython-310.pyc | Bin 0 -> 5633 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 248 bytes .../__pycache__/bindings.cpython-310.pyc | Bin 0 -> 10744 bytes .../__pycache__/low_level.cpython-310.pyc | Bin 0 -> 9131 bytes .../contrib/_securetransport/bindings.py | 519 + .../contrib/_securetransport/low_level.py | 397 + .../pip/_vendor/urllib3/contrib/appengine.py | 314 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 130 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 518 + .../urllib3/contrib/securetransport.py | 921 ++ .../pip/_vendor/urllib3/contrib/socks.py | 216 + .../pip/_vendor/urllib3/exceptions.py | 323 + .../pip/_vendor/urllib3/fields.py | 274 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 232 bytes .../packages/__pycache__/six.cpython-310.pyc | Bin 0 -> 27686 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 242 bytes .../__pycache__/makefile.cpython-310.pyc | Bin 0 -> 1342 bytes .../urllib3/packages/backports/makefile.py | 51 + .../pip/_vendor/urllib3/packages/six.py | 1076 +++ .../pip/_vendor/urllib3/poolmanager.py | 537 + .../pip/_vendor/urllib3/request.py | 170 + .../pip/_vendor/urllib3/response.py | 879 ++ .../pip/_vendor/urllib3/util/__init__.py | 49 + .../util/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1141 bytes .../__pycache__/connection.cpython-310.pyc | Bin 0 -> 3469 bytes .../util/__pycache__/proxy.cpython-310.pyc | Bin 0 -> 1374 bytes .../util/__pycache__/queue.cpython-310.pyc | Bin 0 -> 1096 bytes .../util/__pycache__/request.cpython-310.pyc | Bin 0 -> 3403 bytes .../util/__pycache__/response.cpython-310.pyc | Bin 0 -> 2389 bytes .../util/__pycache__/retry.cpython-310.pyc | Bin 0 -> 16179 bytes .../util/__pycache__/ssl_.cpython-310.pyc | Bin 0 -> 11341 bytes .../ssl_match_hostname.cpython-310.pyc | Bin 0 -> 3293 bytes .../__pycache__/ssltransport.cpython-310.pyc | Bin 0 -> 7431 bytes .../util/__pycache__/timeout.cpython-310.pyc | Bin 0 -> 8965 bytes .../util/__pycache__/url.cpython-310.pyc | Bin 0 -> 10734 bytes .../util/__pycache__/wait.cpython-310.pyc | Bin 0 -> 3125 bytes .../pip/_vendor/urllib3/util/connection.py | 149 + .../pip/_vendor/urllib3/util/proxy.py | 57 + .../pip/_vendor/urllib3/util/queue.py | 22 + .../pip/_vendor/urllib3/util/request.py | 137 + .../pip/_vendor/urllib3/util/response.py | 107 + .../pip/_vendor/urllib3/util/retry.py | 620 ++ .../pip/_vendor/urllib3/util/ssl_.py | 495 + .../urllib3/util/ssl_match_hostname.py | 159 + .../pip/_vendor/urllib3/util/ssltransport.py | 221 + .../pip/_vendor/urllib3/util/timeout.py | 268 + .../pip/_vendor/urllib3/util/url.py | 435 + .../pip/_vendor/urllib3/util/wait.py | 152 + .../site-packages/pip/_vendor/vendor.txt | 23 + .../pip/_vendor/webencodings/__init__.py | 342 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 9778 bytes .../__pycache__/labels.cpython-310.pyc | Bin 0 -> 5268 bytes .../__pycache__/mklabels.cpython-310.pyc | Bin 0 -> 1973 bytes .../__pycache__/tests.cpython-310.pyc | Bin 0 -> 5075 bytes .../x_user_defined.cpython-310.pyc | Bin 0 -> 2624 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 + .../lib/python3.10/site-packages/pip/py.typed | 4 + .../site-packages/pkg_resources/__init__.py | 3296 +++++++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 100593 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 225 bytes .../__pycache__/appdirs.cpython-310.pyc | Bin 0 -> 20286 bytes .../_vendor/__pycache__/zipp.cpython-310.pyc | Bin 0 -> 10268 bytes .../pkg_resources/_vendor/appdirs.py | 608 ++ .../_vendor/importlib_resources/__init__.py | 36 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 680 bytes .../__pycache__/_adapters.cpython-310.pyc | Bin 0 -> 7388 bytes .../__pycache__/_common.cpython-310.pyc | Bin 0 -> 2678 bytes .../__pycache__/_compat.cpython-310.pyc | Bin 0 -> 3538 bytes .../__pycache__/_itertools.cpython-310.pyc | Bin 0 -> 925 bytes .../__pycache__/_legacy.cpython-310.pyc | Bin 0 -> 4261 bytes .../__pycache__/abc.cpython-310.pyc | Bin 0 -> 5414 bytes .../__pycache__/readers.cpython-310.pyc | Bin 0 -> 5498 bytes .../__pycache__/simple.cpython-310.pyc | Bin 0 -> 4762 bytes .../_vendor/importlib_resources/_adapters.py | 170 + .../_vendor/importlib_resources/_common.py | 104 + .../_vendor/importlib_resources/_compat.py | 98 + .../_vendor/importlib_resources/_itertools.py | 35 + .../_vendor/importlib_resources/_legacy.py | 121 + .../_vendor/importlib_resources/abc.py | 137 + .../_vendor/importlib_resources/readers.py | 122 + .../_vendor/importlib_resources/simple.py | 116 + .../pkg_resources/_vendor/jaraco/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 232 bytes .../__pycache__/context.cpython-310.pyc | Bin 0 -> 6364 bytes .../__pycache__/functools.cpython-310.pyc | Bin 0 -> 15656 bytes .../pkg_resources/_vendor/jaraco/context.py | 213 + .../pkg_resources/_vendor/jaraco/functools.py | 525 + .../_vendor/jaraco/text/__init__.py | 599 ++ .../text/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 19701 bytes .../_vendor/more_itertools/__init__.py | 4 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 307 bytes .../__pycache__/more.cpython-310.pyc | Bin 0 -> 123080 bytes .../__pycache__/recipes.cpython-310.pyc | Bin 0 -> 20368 bytes .../_vendor/more_itertools/more.py | 4316 +++++++++ .../_vendor/more_itertools/recipes.py | 698 ++ .../_vendor/packaging/__about__.py | 26 + .../_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-310.pyc | Bin 0 -> 632 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 488 bytes .../__pycache__/_manylinux.cpython-310.pyc | Bin 0 -> 7342 bytes .../__pycache__/_musllinux.cpython-310.pyc | Bin 0 -> 4654 bytes .../__pycache__/_structures.cpython-310.pyc | Bin 0 -> 2747 bytes .../__pycache__/markers.cpython-310.pyc | Bin 0 -> 9338 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 0 -> 4026 bytes .../__pycache__/specifiers.cpython-310.pyc | Bin 0 -> 21569 bytes .../__pycache__/tags.cpython-310.pyc | Bin 0 -> 12232 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 3617 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 12967 bytes .../_vendor/packaging/_manylinux.py | 301 + .../_vendor/packaging/_musllinux.py | 136 + .../_vendor/packaging/_structures.py | 61 + .../_vendor/packaging/markers.py | 304 + .../_vendor/packaging/requirements.py | 146 + .../_vendor/packaging/specifiers.py | 802 ++ .../pkg_resources/_vendor/packaging/tags.py | 487 + .../pkg_resources/_vendor/packaging/utils.py | 136 + .../_vendor/packaging/version.py | 504 + .../_vendor/pyparsing/__init__.py | 331 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 7159 bytes .../__pycache__/actions.cpython-310.pyc | Bin 0 -> 7221 bytes .../__pycache__/common.cpython-310.pyc | Bin 0 -> 10147 bytes .../__pycache__/core.cpython-310.pyc | Bin 0 -> 176464 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 9105 bytes .../__pycache__/helpers.cpython-310.pyc | Bin 0 -> 35382 bytes .../__pycache__/results.cpython-310.pyc | Bin 0 -> 24823 bytes .../__pycache__/testing.cpython-310.pyc | Bin 0 -> 12139 bytes .../__pycache__/unicode.cpython-310.pyc | Bin 0 -> 10100 bytes .../__pycache__/util.cpython-310.pyc | Bin 0 -> 8647 bytes .../_vendor/pyparsing/actions.py | 207 + .../pkg_resources/_vendor/pyparsing/common.py | 424 + .../pkg_resources/_vendor/pyparsing/core.py | 5814 +++++++++++ .../_vendor/pyparsing/diagram/__init__.py | 642 ++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 16599 bytes .../_vendor/pyparsing/exceptions.py | 267 + .../_vendor/pyparsing/helpers.py | 1088 +++ .../_vendor/pyparsing/results.py | 760 ++ .../_vendor/pyparsing/testing.py | 331 + .../_vendor/pyparsing/unicode.py | 352 + .../pkg_resources/_vendor/pyparsing/util.py | 235 + .../pkg_resources/_vendor/zipp.py | 329 + .../pkg_resources/extern/__init__.py | 76 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2978 bytes .../setuptools-65.5.0.dist-info/INSTALLER | 1 + .../setuptools-65.5.0.dist-info/LICENSE | 19 + .../setuptools-65.5.0.dist-info/METADATA | 144 + .../setuptools-65.5.0.dist-info/RECORD | 466 + .../setuptools-65.5.0.dist-info/REQUESTED | 0 .../setuptools-65.5.0.dist-info/WHEEL | 5 + .../entry_points.txt | 57 + .../setuptools-65.5.0.dist-info/top_level.txt | 3 + .../site-packages/setuptools/__init__.py | 247 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 9536 bytes .../_deprecation_warning.cpython-310.pyc | Bin 0 -> 586 bytes .../__pycache__/_entry_points.cpython-310.pyc | Bin 0 -> 3049 bytes .../__pycache__/_imp.cpython-310.pyc | Bin 0 -> 2112 bytes .../__pycache__/_importlib.cpython-310.pyc | Bin 0 -> 1382 bytes .../__pycache__/_itertools.cpython-310.pyc | Bin 0 -> 950 bytes .../__pycache__/_path.cpython-310.pyc | Bin 0 -> 1125 bytes .../__pycache__/_reqs.cpython-310.pyc | Bin 0 -> 865 bytes .../__pycache__/archive_util.cpython-310.pyc | Bin 0 -> 6216 bytes .../__pycache__/build_meta.cpython-310.pyc | Bin 0 -> 18124 bytes .../__pycache__/dep_util.cpython-310.pyc | Bin 0 -> 893 bytes .../__pycache__/depends.cpython-310.pyc | Bin 0 -> 5332 bytes .../__pycache__/discovery.cpython-310.pyc | Bin 0 -> 20623 bytes .../__pycache__/dist.cpython-310.pyc | Bin 0 -> 38412 bytes .../__pycache__/errors.cpython-310.pyc | Bin 0 -> 2520 bytes .../__pycache__/extension.cpython-310.pyc | Bin 0 -> 5933 bytes .../__pycache__/glob.cpython-310.pyc | Bin 0 -> 3771 bytes .../__pycache__/installer.cpython-310.pyc | Bin 0 -> 3017 bytes .../__pycache__/launch.cpython-310.pyc | Bin 0 -> 943 bytes .../__pycache__/logging.cpython-310.pyc | Bin 0 -> 1280 bytes .../__pycache__/monkey.cpython-310.pyc | Bin 0 -> 4476 bytes .../__pycache__/msvc.cpython-310.pyc | Bin 0 -> 40659 bytes .../__pycache__/namespaces.cpython-310.pyc | Bin 0 -> 3654 bytes .../__pycache__/package_index.cpython-310.pyc | Bin 0 -> 32721 bytes .../__pycache__/py34compat.cpython-310.pyc | Bin 0 -> 518 bytes .../__pycache__/sandbox.cpython-310.pyc | Bin 0 -> 15794 bytes .../__pycache__/unicode_utils.cpython-310.pyc | Bin 0 -> 1148 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 360 bytes .../__pycache__/wheel.cpython-310.pyc | Bin 0 -> 7628 bytes .../windows_support.cpython-310.pyc | Bin 0 -> 1066 bytes .../setuptools/_deprecation_warning.py | 7 + .../setuptools/_distutils/__init__.py | 24 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 594 bytes .../__pycache__/_collections.cpython-310.pyc | Bin 0 -> 2095 bytes .../__pycache__/_functools.cpython-310.pyc | Bin 0 -> 725 bytes .../__pycache__/_macos_compat.cpython-310.pyc | Bin 0 -> 489 bytes .../__pycache__/_msvccompiler.cpython-310.pyc | Bin 0 -> 13689 bytes .../__pycache__/archive_util.cpython-310.pyc | Bin 0 -> 6593 bytes .../__pycache__/bcppcompiler.cpython-310.pyc | Bin 0 -> 6849 bytes .../__pycache__/ccompiler.cpython-310.pyc | Bin 0 -> 34215 bytes .../__pycache__/cmd.cpython-310.pyc | Bin 0 -> 14024 bytes .../__pycache__/config.cpython-310.pyc | Bin 0 -> 3614 bytes .../__pycache__/core.cpython-310.pyc | Bin 0 -> 7243 bytes .../cygwinccompiler.cpython-310.pyc | Bin 0 -> 8416 bytes .../__pycache__/debug.cpython-310.pyc | Bin 0 -> 288 bytes .../__pycache__/dep_util.cpython-310.pyc | Bin 0 -> 2805 bytes .../__pycache__/dir_util.cpython-310.pyc | Bin 0 -> 6147 bytes .../__pycache__/dist.cpython-310.pyc | Bin 0 -> 34613 bytes .../__pycache__/errors.cpython-310.pyc | Bin 0 -> 5030 bytes .../__pycache__/extension.cpython-310.pyc | Bin 0 -> 7058 bytes .../__pycache__/fancy_getopt.cpython-310.pyc | Bin 0 -> 10727 bytes .../__pycache__/file_util.cpython-310.pyc | Bin 0 -> 6021 bytes .../__pycache__/filelist.cpython-310.pyc | Bin 0 -> 10849 bytes .../__pycache__/log.cpython-310.pyc | Bin 0 -> 2345 bytes .../__pycache__/msvc9compiler.cpython-310.pyc | Bin 0 -> 17819 bytes .../__pycache__/msvccompiler.cpython-310.pyc | Bin 0 -> 15051 bytes .../__pycache__/py38compat.cpython-310.pyc | Bin 0 -> 469 bytes .../__pycache__/py39compat.cpython-310.pyc | Bin 0 -> 770 bytes .../__pycache__/spawn.cpython-310.pyc | Bin 0 -> 2910 bytes .../__pycache__/sysconfig.cpython-310.pyc | Bin 0 -> 13204 bytes .../__pycache__/text_file.cpython-310.pyc | Bin 0 -> 8267 bytes .../__pycache__/unixccompiler.cpython-310.pyc | Bin 0 -> 10989 bytes .../__pycache__/util.cpython-310.pyc | Bin 0 -> 13539 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 7871 bytes .../versionpredicate.cpython-310.pyc | Bin 0 -> 5363 bytes .../setuptools/_distutils/_collections.py | 56 + .../setuptools/_distutils/_functools.py | 20 + .../setuptools/_distutils/_macos_compat.py | 12 + .../setuptools/_distutils/_msvccompiler.py | 572 ++ .../setuptools/_distutils/archive_util.py | 280 + .../setuptools/_distutils/bcppcompiler.py | 408 + .../setuptools/_distutils/ccompiler.py | 1220 +++ .../setuptools/_distutils/cmd.py | 436 + .../setuptools/_distutils/command/__init__.py | 25 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 552 bytes .../_framework_compat.cpython-310.pyc | Bin 0 -> 1959 bytes .../command/__pycache__/bdist.cpython-310.pyc | Bin 0 -> 4017 bytes .../__pycache__/bdist_dumb.cpython-310.pyc | Bin 0 -> 3689 bytes .../__pycache__/bdist_rpm.cpython-310.pyc | Bin 0 -> 12379 bytes .../command/__pycache__/build.cpython-310.pyc | Bin 0 -> 3943 bytes .../__pycache__/build_clib.cpython-310.pyc | Bin 0 -> 4909 bytes .../__pycache__/build_ext.cpython-310.pyc | Bin 0 -> 16347 bytes .../__pycache__/build_py.cpython-310.pyc | Bin 0 -> 9845 bytes .../__pycache__/build_scripts.cpython-310.pyc | Bin 0 -> 4636 bytes .../command/__pycache__/check.cpython-310.pyc | Bin 0 -> 4696 bytes .../command/__pycache__/clean.cpython-310.pyc | Bin 0 -> 2168 bytes .../__pycache__/config.cpython-310.pyc | Bin 0 -> 10400 bytes .../__pycache__/install.cpython-310.pyc | Bin 0 -> 17244 bytes .../__pycache__/install_data.cpython-310.pyc | Bin 0 -> 2389 bytes .../install_egg_info.cpython-310.pyc | Bin 0 -> 3354 bytes .../install_headers.cpython-310.pyc | Bin 0 -> 1804 bytes .../__pycache__/install_lib.cpython-310.pyc | Bin 0 -> 5232 bytes .../install_scripts.cpython-310.pyc | Bin 0 -> 2237 bytes .../__pycache__/py37compat.cpython-310.pyc | Bin 0 -> 1076 bytes .../__pycache__/register.cpython-310.pyc | Bin 0 -> 8591 bytes .../command/__pycache__/sdist.cpython-310.pyc | Bin 0 -> 14546 bytes .../__pycache__/upload.cpython-310.pyc | Bin 0 -> 5399 bytes .../_distutils/command/_framework_compat.py | 55 + .../setuptools/_distutils/command/bdist.py | 157 + .../_distutils/command/bdist_dumb.py | 144 + .../_distutils/command/bdist_rpm.py | 615 ++ .../setuptools/_distutils/command/build.py | 153 + .../_distutils/command/build_clib.py | 208 + .../_distutils/command/build_ext.py | 787 ++ .../setuptools/_distutils/command/build_py.py | 407 + .../_distutils/command/build_scripts.py | 173 + .../setuptools/_distutils/command/check.py | 151 + .../setuptools/_distutils/command/clean.py | 76 + .../setuptools/_distutils/command/config.py | 377 + .../setuptools/_distutils/command/install.py | 814 ++ .../_distutils/command/install_data.py | 84 + .../_distutils/command/install_egg_info.py | 91 + .../_distutils/command/install_headers.py | 45 + .../_distutils/command/install_lib.py | 238 + .../_distutils/command/install_scripts.py | 61 + .../_distutils/command/py37compat.py | 31 + .../setuptools/_distutils/command/register.py | 319 + .../setuptools/_distutils/command/sdist.py | 531 + .../setuptools/_distutils/command/upload.py | 205 + .../setuptools/_distutils/config.py | 139 + .../setuptools/_distutils/core.py | 291 + .../setuptools/_distutils/cygwinccompiler.py | 364 + .../setuptools/_distutils/debug.py | 5 + .../setuptools/_distutils/dep_util.py | 96 + .../setuptools/_distutils/dir_util.py | 243 + .../setuptools/_distutils/dist.py | 1286 +++ .../setuptools/_distutils/errors.py | 127 + .../setuptools/_distutils/extension.py | 248 + .../setuptools/_distutils/fancy_getopt.py | 470 + .../setuptools/_distutils/file_util.py | 249 + .../setuptools/_distutils/filelist.py | 371 + .../setuptools/_distutils/log.py | 80 + .../setuptools/_distutils/msvc9compiler.py | 832 ++ .../setuptools/_distutils/msvccompiler.py | 695 ++ .../setuptools/_distutils/py38compat.py | 8 + .../setuptools/_distutils/py39compat.py | 22 + .../setuptools/_distutils/spawn.py | 109 + .../setuptools/_distutils/sysconfig.py | 558 ++ .../setuptools/_distutils/text_file.py | 287 + .../setuptools/_distutils/unixccompiler.py | 401 + .../setuptools/_distutils/util.py | 513 + .../setuptools/_distutils/version.py | 358 + .../setuptools/_distutils/versionpredicate.py | 175 + .../site-packages/setuptools/_entry_points.py | 86 + .../site-packages/setuptools/_imp.py | 82 + .../site-packages/setuptools/_importlib.py | 47 + .../site-packages/setuptools/_itertools.py | 23 + .../site-packages/setuptools/_path.py | 29 + .../site-packages/setuptools/_reqs.py | 19 + .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 222 bytes .../__pycache__/ordered_set.cpython-310.pyc | Bin 0 -> 16358 bytes .../typing_extensions.cpython-310.pyc | Bin 0 -> 66616 bytes .../_vendor/__pycache__/zipp.cpython-310.pyc | Bin 0 -> 10265 bytes .../_vendor/importlib_metadata/__init__.py | 1047 ++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 37455 bytes .../__pycache__/_adapters.cpython-310.pyc | Bin 0 -> 2442 bytes .../__pycache__/_collections.cpython-310.pyc | Bin 0 -> 1617 bytes .../__pycache__/_compat.cpython-310.pyc | Bin 0 -> 2106 bytes .../__pycache__/_functools.cpython-310.pyc | Bin 0 -> 3207 bytes .../__pycache__/_itertools.cpython-310.pyc | Bin 0 -> 2088 bytes .../__pycache__/_meta.cpython-310.pyc | Bin 0 -> 2396 bytes .../__pycache__/_text.cpython-310.pyc | Bin 0 -> 3140 bytes .../_vendor/importlib_metadata/_adapters.py | 68 + .../importlib_metadata/_collections.py | 30 + .../_vendor/importlib_metadata/_compat.py | 71 + .../_vendor/importlib_metadata/_functools.py | 104 + .../_vendor/importlib_metadata/_itertools.py | 73 + .../_vendor/importlib_metadata/_meta.py | 48 + .../_vendor/importlib_metadata/_text.py | 99 + .../_vendor/importlib_resources/__init__.py | 36 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 677 bytes .../__pycache__/_adapters.cpython-310.pyc | Bin 0 -> 7385 bytes .../__pycache__/_common.cpython-310.pyc | Bin 0 -> 2675 bytes .../__pycache__/_compat.cpython-310.pyc | Bin 0 -> 3535 bytes .../__pycache__/_itertools.cpython-310.pyc | Bin 0 -> 922 bytes .../__pycache__/_legacy.cpython-310.pyc | Bin 0 -> 4258 bytes .../__pycache__/abc.cpython-310.pyc | Bin 0 -> 5411 bytes .../__pycache__/readers.cpython-310.pyc | Bin 0 -> 5495 bytes .../__pycache__/simple.cpython-310.pyc | Bin 0 -> 4759 bytes .../_vendor/importlib_resources/_adapters.py | 170 + .../_vendor/importlib_resources/_common.py | 104 + .../_vendor/importlib_resources/_compat.py | 98 + .../_vendor/importlib_resources/_itertools.py | 35 + .../_vendor/importlib_resources/_legacy.py | 121 + .../_vendor/importlib_resources/abc.py | 137 + .../_vendor/importlib_resources/readers.py | 122 + .../_vendor/importlib_resources/simple.py | 116 + .../setuptools/_vendor/jaraco/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 229 bytes .../__pycache__/context.cpython-310.pyc | Bin 0 -> 6361 bytes .../__pycache__/functools.cpython-310.pyc | Bin 0 -> 15647 bytes .../setuptools/_vendor/jaraco/context.py | 213 + .../setuptools/_vendor/jaraco/functools.py | 525 + .../_vendor/jaraco/text/__init__.py | 599 ++ .../text/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 19689 bytes .../_vendor/more_itertools/__init__.py | 4 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 303 bytes .../__pycache__/more.cpython-310.pyc | Bin 0 -> 110024 bytes .../__pycache__/recipes.cpython-310.pyc | Bin 0 -> 18003 bytes .../setuptools/_vendor/more_itertools/more.py | 3824 ++++++++ .../_vendor/more_itertools/recipes.py | 620 ++ .../setuptools/_vendor/ordered_set.py | 488 + .../setuptools/_vendor/packaging/__about__.py | 26 + .../setuptools/_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-310.pyc | Bin 0 -> 629 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 485 bytes .../__pycache__/_manylinux.cpython-310.pyc | Bin 0 -> 7339 bytes .../__pycache__/_musllinux.cpython-310.pyc | Bin 0 -> 4651 bytes .../__pycache__/_structures.cpython-310.pyc | Bin 0 -> 2744 bytes .../__pycache__/markers.cpython-310.pyc | Bin 0 -> 9332 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 0 -> 4020 bytes .../__pycache__/specifiers.cpython-310.pyc | Bin 0 -> 21566 bytes .../__pycache__/tags.cpython-310.pyc | Bin 0 -> 12229 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 3614 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 12964 bytes .../_vendor/packaging/_manylinux.py | 301 + .../_vendor/packaging/_musllinux.py | 136 + .../_vendor/packaging/_structures.py | 61 + .../setuptools/_vendor/packaging/markers.py | 304 + .../_vendor/packaging/requirements.py | 146 + .../_vendor/packaging/specifiers.py | 802 ++ .../setuptools/_vendor/packaging/tags.py | 487 + .../setuptools/_vendor/packaging/utils.py | 136 + .../setuptools/_vendor/packaging/version.py | 504 + .../setuptools/_vendor/pyparsing/__init__.py | 331 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 7156 bytes .../__pycache__/actions.cpython-310.pyc | Bin 0 -> 7218 bytes .../__pycache__/common.cpython-310.pyc | Bin 0 -> 10144 bytes .../__pycache__/core.cpython-310.pyc | Bin 0 -> 176461 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 9102 bytes .../__pycache__/helpers.cpython-310.pyc | Bin 0 -> 35379 bytes .../__pycache__/results.cpython-310.pyc | Bin 0 -> 24820 bytes .../__pycache__/testing.cpython-310.pyc | Bin 0 -> 12136 bytes .../__pycache__/unicode.cpython-310.pyc | Bin 0 -> 10097 bytes .../__pycache__/util.cpython-310.pyc | Bin 0 -> 8644 bytes .../setuptools/_vendor/pyparsing/actions.py | 207 + .../setuptools/_vendor/pyparsing/common.py | 424 + .../setuptools/_vendor/pyparsing/core.py | 5814 +++++++++++ .../_vendor/pyparsing/diagram/__init__.py | 642 ++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 16596 bytes .../_vendor/pyparsing/exceptions.py | 267 + .../setuptools/_vendor/pyparsing/helpers.py | 1088 +++ .../setuptools/_vendor/pyparsing/results.py | 760 ++ .../setuptools/_vendor/pyparsing/testing.py | 331 + .../setuptools/_vendor/pyparsing/unicode.py | 352 + .../setuptools/_vendor/pyparsing/util.py | 235 + .../setuptools/_vendor/tomli/__init__.py | 11 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 394 bytes .../tomli/__pycache__/_parser.cpython-310.pyc | Bin 0 -> 17108 bytes .../tomli/__pycache__/_re.cpython-310.pyc | Bin 0 -> 2940 bytes .../tomli/__pycache__/_types.cpython-310.pyc | Bin 0 -> 364 bytes .../setuptools/_vendor/tomli/_parser.py | 691 ++ .../setuptools/_vendor/tomli/_re.py | 107 + .../setuptools/_vendor/tomli/_types.py | 10 + .../setuptools/_vendor/typing_extensions.py | 2296 +++++ .../site-packages/setuptools/_vendor/zipp.py | 329 + .../site-packages/setuptools/archive_util.py | 213 + .../site-packages/setuptools/build_meta.py | 511 + .../site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes .../site-packages/setuptools/cli-arm64.exe | Bin 0 -> 137216 bytes .../site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 12 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 480 bytes .../command/__pycache__/alias.cpython-310.pyc | Bin 0 -> 2413 bytes .../__pycache__/bdist_egg.cpython-310.pyc | Bin 0 -> 13163 bytes .../__pycache__/bdist_rpm.cpython-310.pyc | Bin 0 -> 1626 bytes .../command/__pycache__/build.cpython-310.pyc | Bin 0 -> 6123 bytes .../__pycache__/build_clib.cpython-310.pyc | Bin 0 -> 2500 bytes .../__pycache__/build_ext.cpython-310.pyc | Bin 0 -> 12110 bytes .../__pycache__/build_py.cpython-310.pyc | Bin 0 -> 13980 bytes .../__pycache__/develop.cpython-310.pyc | Bin 0 -> 6189 bytes .../__pycache__/dist_info.cpython-310.pyc | Bin 0 -> 4775 bytes .../__pycache__/easy_install.cpython-310.pyc | Bin 0 -> 64458 bytes .../editable_wheel.cpython-310.pyc | Bin 0 -> 31953 bytes .../__pycache__/egg_info.cpython-310.pyc | Bin 0 -> 23320 bytes .../__pycache__/install.cpython-310.pyc | Bin 0 -> 4322 bytes .../install_egg_info.cpython-310.pyc | Bin 0 -> 2496 bytes .../__pycache__/install_lib.cpython-310.pyc | Bin 0 -> 4208 bytes .../install_scripts.cpython-310.pyc | Bin 0 -> 2490 bytes .../__pycache__/py36compat.cpython-310.pyc | Bin 0 -> 4573 bytes .../__pycache__/register.cpython-310.pyc | Bin 0 -> 877 bytes .../__pycache__/rotate.cpython-310.pyc | Bin 0 -> 2544 bytes .../__pycache__/saveopts.cpython-310.pyc | Bin 0 -> 963 bytes .../command/__pycache__/sdist.cpython-310.pyc | Bin 0 -> 7889 bytes .../__pycache__/setopt.cpython-310.pyc | Bin 0 -> 4725 bytes .../command/__pycache__/test.cpython-310.pyc | Bin 0 -> 8226 bytes .../__pycache__/upload.cpython-310.pyc | Bin 0 -> 850 bytes .../__pycache__/upload_docs.cpython-310.pyc | Bin 0 -> 6437 bytes .../site-packages/setuptools/command/alias.py | 78 + .../setuptools/command/bdist_egg.py | 457 + .../setuptools/command/bdist_rpm.py | 40 + .../site-packages/setuptools/command/build.py | 146 + .../setuptools/command/build_clib.py | 101 + .../setuptools/command/build_ext.py | 383 + .../setuptools/command/build_py.py | 368 + .../setuptools/command/develop.py | 193 + .../setuptools/command/dist_info.py | 142 + .../setuptools/command/easy_install.py | 2312 +++++ .../setuptools/command/editable_wheel.py | 844 ++ .../setuptools/command/egg_info.py | 763 ++ .../setuptools/command/install.py | 139 + .../setuptools/command/install_egg_info.py | 63 + .../setuptools/command/install_lib.py | 122 + .../setuptools/command/install_scripts.py | 70 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 134 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 64 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 210 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 251 + .../setuptools/command/upload.py | 17 + .../setuptools/command/upload_docs.py | 213 + .../setuptools/config/__init__.py | 35 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1479 bytes .../_apply_pyprojecttoml.cpython-310.pyc | Bin 0 -> 13562 bytes .../config/__pycache__/expand.cpython-310.pyc | Bin 0 -> 17621 bytes .../__pycache__/pyprojecttoml.cpython-310.pyc | Bin 0 -> 16359 bytes .../__pycache__/setupcfg.cpython-310.pyc | Bin 0 -> 22091 bytes .../setuptools/config/_apply_pyprojecttoml.py | 377 + .../config/_validate_pyproject/__init__.py | 34 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1554 bytes .../error_reporting.cpython-310.pyc | Bin 0 -> 11609 bytes .../extra_validations.cpython-310.pyc | Bin 0 -> 1449 bytes .../fastjsonschema_exceptions.cpython-310.pyc | Bin 0 -> 2486 bytes ...fastjsonschema_validations.cpython-310.pyc | Bin 0 -> 68753 bytes .../__pycache__/formats.cpython-310.pyc | Bin 0 -> 8620 bytes .../_validate_pyproject/error_reporting.py | 318 + .../_validate_pyproject/extra_validations.py | 36 + .../fastjsonschema_exceptions.py | 51 + .../fastjsonschema_validations.py | 1035 ++ .../config/_validate_pyproject/formats.py | 259 + .../site-packages/setuptools/config/expand.py | 462 + .../setuptools/config/pyprojecttoml.py | 493 + .../setuptools/config/setupcfg.py | 762 ++ .../site-packages/setuptools/dep_util.py | 25 + .../site-packages/setuptools/depends.py | 176 + .../site-packages/setuptools/discovery.py | 600 ++ .../site-packages/setuptools/dist.py | 1222 +++ .../site-packages/setuptools/errors.py | 58 + .../site-packages/setuptools/extension.py | 148 + .../setuptools/extern/__init__.py | 76 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3053 bytes .../site-packages/setuptools/glob.py | 167 + .../site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../site-packages/setuptools/gui-arm64.exe | Bin 0 -> 137728 bytes .../site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/installer.py | 104 + .../site-packages/setuptools/launch.py | 36 + .../site-packages/setuptools/logging.py | 36 + .../site-packages/setuptools/monkey.py | 165 + .../site-packages/setuptools/msvc.py | 1703 ++++ .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1126 +++ .../site-packages/setuptools/py34compat.py | 13 + .../site-packages/setuptools/sandbox.py | 530 + .../setuptools/script (dev).tmpl | 6 + .../site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/unicode_utils.py | 42 + .../site-packages/setuptools/version.py | 6 + .../site-packages/setuptools/wheel.py | 222 + .../setuptools/windows_support.py | 29 + .../werkzeug-3.0.1.dist-info/INSTALLER | 1 + .../werkzeug-3.0.1.dist-info/LICENSE.rst | 28 + .../werkzeug-3.0.1.dist-info/METADATA | 118 + .../werkzeug-3.0.1.dist-info/RECORD | 125 + .../werkzeug-3.0.1.dist-info/WHEEL | 4 + .../site-packages/werkzeug/__init__.py | 25 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 970 bytes .../__pycache__/_internal.cpython-310.pyc | Bin 0 -> 7092 bytes .../__pycache__/_reloader.cpython-310.pyc | Bin 0 -> 12662 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 27362 bytes .../__pycache__/formparser.cpython-310.pyc | Bin 0 -> 12684 bytes .../werkzeug/__pycache__/http.cpython-310.pyc | Bin 0 -> 38927 bytes .../__pycache__/local.cpython-310.pyc | Bin 0 -> 20958 bytes .../__pycache__/security.cpython-310.pyc | Bin 0 -> 5389 bytes .../__pycache__/serving.cpython-310.pyc | Bin 0 -> 30485 bytes .../werkzeug/__pycache__/test.cpython-310.pyc | Bin 0 -> 42927 bytes .../__pycache__/testapp.cpython-310.pyc | Bin 0 -> 6431 bytes .../werkzeug/__pycache__/urls.cpython-310.pyc | Bin 0 -> 6483 bytes .../__pycache__/user_agent.cpython-310.pyc | Bin 0 -> 1898 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 22316 bytes .../werkzeug/__pycache__/wsgi.cpython-310.pyc | Bin 0 -> 19990 bytes .../site-packages/werkzeug/_internal.py | 214 + .../site-packages/werkzeug/_reloader.py | 458 + .../werkzeug/datastructures/__init__.py | 34 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1592 bytes .../__pycache__/accept.cpython-310.pyc | Bin 0 -> 10684 bytes .../__pycache__/auth.cpython-310.pyc | Bin 0 -> 10507 bytes .../__pycache__/cache_control.cpython-310.pyc | Bin 0 -> 6651 bytes .../__pycache__/csp.cpython-310.pyc | Bin 0 -> 4187 bytes .../__pycache__/etag.cpython-310.pyc | Bin 0 -> 3951 bytes .../__pycache__/file_storage.cpython-310.pyc | Bin 0 -> 6100 bytes .../__pycache__/headers.cpython-310.pyc | Bin 0 -> 17782 bytes .../__pycache__/mixins.cpython-310.pyc | Bin 0 -> 9087 bytes .../__pycache__/range.cpython-310.pyc | Bin 0 -> 6054 bytes .../__pycache__/structures.cpython-310.pyc | Bin 0 -> 35971 bytes .../werkzeug/datastructures/accept.py | 326 + .../werkzeug/datastructures/accept.pyi | 54 + .../werkzeug/datastructures/auth.py | 318 + .../werkzeug/datastructures/cache_control.py | 175 + .../werkzeug/datastructures/cache_control.pyi | 109 + .../werkzeug/datastructures/csp.py | 94 + .../werkzeug/datastructures/csp.pyi | 169 + .../werkzeug/datastructures/etag.py | 95 + .../werkzeug/datastructures/etag.pyi | 30 + .../werkzeug/datastructures/file_storage.py | 196 + .../werkzeug/datastructures/file_storage.pyi | 47 + .../werkzeug/datastructures/headers.py | 515 + .../werkzeug/datastructures/headers.pyi | 109 + .../werkzeug/datastructures/mixins.py | 242 + .../werkzeug/datastructures/mixins.pyi | 97 + .../werkzeug/datastructures/range.py | 180 + .../werkzeug/datastructures/range.pyi | 57 + .../werkzeug/datastructures/structures.py | 1006 ++ .../werkzeug/datastructures/structures.pyi | 208 + .../site-packages/werkzeug/debug/__init__.py | 534 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 14402 bytes .../debug/__pycache__/console.cpython-310.pyc | Bin 0 -> 8356 bytes .../debug/__pycache__/repr.cpython-310.pyc | Bin 0 -> 9107 bytes .../debug/__pycache__/tbtools.cpython-310.pyc | Bin 0 -> 11838 bytes .../site-packages/werkzeug/debug/console.py | 219 + .../site-packages/werkzeug/debug/repr.py | 283 + .../werkzeug/debug/shared/ICON_LICENSE.md | 6 + .../werkzeug/debug/shared/console.png | Bin 0 -> 507 bytes .../werkzeug/debug/shared/debugger.js | 360 + .../werkzeug/debug/shared/less.png | Bin 0 -> 191 bytes .../werkzeug/debug/shared/more.png | Bin 0 -> 200 bytes .../werkzeug/debug/shared/style.css | 150 + .../site-packages/werkzeug/debug/tbtools.py | 437 + .../site-packages/werkzeug/exceptions.py | 879 ++ .../site-packages/werkzeug/formparser.py | 421 + .../python3.10/site-packages/werkzeug/http.py | 1372 +++ .../site-packages/werkzeug/local.py | 643 ++ .../werkzeug/middleware/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 223 bytes .../__pycache__/dispatcher.cpython-310.pyc | Bin 0 -> 2872 bytes .../__pycache__/http_proxy.cpython-310.pyc | Bin 0 -> 6965 bytes .../__pycache__/lint.cpython-310.pyc | Bin 0 -> 13026 bytes .../__pycache__/profiler.cpython-310.pyc | Bin 0 -> 5664 bytes .../__pycache__/proxy_fix.cpython-310.pyc | Bin 0 -> 6065 bytes .../__pycache__/shared_data.cpython-310.pyc | Bin 0 -> 9317 bytes .../werkzeug/middleware/dispatcher.py | 80 + .../werkzeug/middleware/http_proxy.py | 235 + .../site-packages/werkzeug/middleware/lint.py | 420 + .../werkzeug/middleware/profiler.py | 154 + .../werkzeug/middleware/proxy_fix.py | 182 + .../werkzeug/middleware/shared_data.py | 282 + .../site-packages/werkzeug/py.typed | 0 .../werkzeug/routing/__init__.py | 133 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 4661 bytes .../__pycache__/converters.cpython-310.pyc | Bin 0 -> 9188 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 5673 bytes .../routing/__pycache__/map.cpython-310.pyc | Bin 0 -> 30963 bytes .../__pycache__/matcher.cpython-310.pyc | Bin 0 -> 5166 bytes .../routing/__pycache__/rules.cpython-310.pyc | Bin 0 -> 27696 bytes .../werkzeug/routing/converters.py | 261 + .../werkzeug/routing/exceptions.py | 148 + .../site-packages/werkzeug/routing/map.py | 946 ++ .../site-packages/werkzeug/routing/matcher.py | 202 + .../site-packages/werkzeug/routing/rules.py | 909 ++ .../site-packages/werkzeug/sansio/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 219 bytes .../sansio/__pycache__/http.cpython-310.pyc | Bin 0 -> 4169 bytes .../__pycache__/multipart.cpython-310.pyc | Bin 0 -> 7529 bytes .../__pycache__/request.cpython-310.pyc | Bin 0 -> 17334 bytes .../__pycache__/response.cpython-310.pyc | Bin 0 -> 24553 bytes .../sansio/__pycache__/utils.cpython-310.pyc | Bin 0 -> 4658 bytes .../site-packages/werkzeug/sansio/http.py | 171 + .../werkzeug/sansio/multipart.py | 321 + .../site-packages/werkzeug/sansio/request.py | 536 + .../site-packages/werkzeug/sansio/response.py | 751 ++ .../site-packages/werkzeug/sansio/utils.py | 159 + .../site-packages/werkzeug/security.py | 157 + .../site-packages/werkzeug/serving.py | 1109 +++ .../python3.10/site-packages/werkzeug/test.py | 1462 +++ .../site-packages/werkzeug/testapp.py | 181 + .../python3.10/site-packages/werkzeug/urls.py | 216 + .../site-packages/werkzeug/user_agent.py | 47 + .../site-packages/werkzeug/utils.py | 690 ++ .../werkzeug/wrappers/__init__.py | 3 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 338 bytes .../__pycache__/request.cpython-310.pyc | Bin 0 -> 21686 bytes .../__pycache__/response.cpython-310.pyc | Bin 0 -> 28456 bytes .../werkzeug/wrappers/request.py | 650 ++ .../werkzeug/wrappers/response.py | 835 ++ .../python3.10/site-packages/werkzeug/wsgi.py | 595 ++ server-temp/venv/pyvenv.cfg | 3 + 1816 files changed, 330903 insertions(+) create mode 100644 app.js create mode 100644 detect.js create mode 100644 draw.js create mode 100644 favicon.ico create mode 100644 images/example.jpeg create mode 100644 images/street.jpg create mode 100644 index.html create mode 100644 main.css create mode 100644 server-temp/main.py create mode 100644 server-temp/venv/bin/Activate.ps1 create mode 100644 server-temp/venv/bin/activate create mode 100644 server-temp/venv/bin/activate.csh create mode 100644 server-temp/venv/bin/activate.fish create mode 100755 server-temp/venv/bin/flask create mode 100755 server-temp/venv/bin/pip create mode 100755 server-temp/venv/bin/pip3 create mode 100755 server-temp/venv/bin/pip3.10 create mode 120000 server-temp/venv/bin/python create mode 120000 server-temp/venv/bin/python3 create mode 120000 server-temp/venv/bin/python3.10 create mode 100644 server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/INSTALLER create mode 100644 server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/LICENSE.rst create mode 100644 server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/METADATA create mode 100644 server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/RECORD create mode 100644 server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/WHEEL create mode 100644 server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/entry_points.txt create mode 100644 server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/top_level.txt create mode 100644 server-temp/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/INSTALLER create mode 100644 server-temp/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/LICENSE.rst create mode 100644 server-temp/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/METADATA create mode 100644 server-temp/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/RECORD create mode 100644 server-temp/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/WHEEL create mode 100644 server-temp/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/top_level.txt create mode 100644 server-temp/venv/lib/python3.10/site-packages/_distutils_hack/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/_distutils_hack/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/_distutils_hack/__pycache__/override.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/_distutils_hack/override.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/blinker-1.7.0.dist-info/INSTALLER create mode 100644 server-temp/venv/lib/python3.10/site-packages/blinker-1.7.0.dist-info/LICENSE.rst create mode 100644 server-temp/venv/lib/python3.10/site-packages/blinker-1.7.0.dist-info/METADATA create mode 100644 server-temp/venv/lib/python3.10/site-packages/blinker-1.7.0.dist-info/RECORD create mode 100644 server-temp/venv/lib/python3.10/site-packages/blinker-1.7.0.dist-info/WHEEL create mode 100644 server-temp/venv/lib/python3.10/site-packages/blinker/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/blinker/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/blinker/__pycache__/_saferef.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/blinker/__pycache__/_utilities.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/blinker/__pycache__/base.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/blinker/_saferef.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/blinker/_utilities.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/blinker/base.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/blinker/py.typed create mode 100644 server-temp/venv/lib/python3.10/site-packages/click-8.1.7.dist-info/INSTALLER create mode 100644 server-temp/venv/lib/python3.10/site-packages/click-8.1.7.dist-info/LICENSE.rst create mode 100644 server-temp/venv/lib/python3.10/site-packages/click-8.1.7.dist-info/METADATA create mode 100644 server-temp/venv/lib/python3.10/site-packages/click-8.1.7.dist-info/RECORD create mode 100644 server-temp/venv/lib/python3.10/site-packages/click-8.1.7.dist-info/WHEEL create mode 100644 server-temp/venv/lib/python3.10/site-packages/click-8.1.7.dist-info/top_level.txt create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/__pycache__/_compat.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/__pycache__/_termui_impl.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/__pycache__/_textwrap.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/__pycache__/_winconsole.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/__pycache__/core.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/__pycache__/decorators.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/__pycache__/exceptions.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/__pycache__/formatting.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/__pycache__/globals.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/__pycache__/parser.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/__pycache__/shell_completion.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/__pycache__/termui.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/__pycache__/testing.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/__pycache__/types.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/__pycache__/utils.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/_compat.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/_termui_impl.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/_textwrap.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/_winconsole.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/core.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/decorators.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/exceptions.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/formatting.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/globals.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/parser.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/py.typed create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/shell_completion.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/termui.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/testing.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/types.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/click/utils.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/distutils-precedence.pth create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/INSTALLER create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/LICENSE.rst create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/METADATA create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/RECORD create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/REQUESTED create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/WHEEL create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/entry_points.txt create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/__main__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/__main__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/app.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/blueprints.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/cli.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/config.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/ctx.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/debughelpers.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/globals.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/helpers.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/logging.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/sessions.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/signals.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/templating.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/testing.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/typing.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/views.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/wrappers.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/app.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/blueprints.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/cli.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/config.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/ctx.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/debughelpers.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/globals.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/helpers.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/json/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/json/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/json/__pycache__/provider.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/json/__pycache__/tag.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/json/provider.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/json/tag.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/logging.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/py.typed create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/sansio/README.md create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/sansio/__pycache__/app.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/sansio/__pycache__/blueprints.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/sansio/__pycache__/scaffold.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/sansio/app.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/sansio/blueprints.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/sansio/scaffold.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/sessions.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/signals.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/templating.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/testing.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/typing.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/views.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/flask/wrappers.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/itsdangerous-2.1.2.dist-info/INSTALLER create mode 100644 server-temp/venv/lib/python3.10/site-packages/itsdangerous-2.1.2.dist-info/LICENSE.rst create mode 100644 server-temp/venv/lib/python3.10/site-packages/itsdangerous-2.1.2.dist-info/METADATA create mode 100644 server-temp/venv/lib/python3.10/site-packages/itsdangerous-2.1.2.dist-info/RECORD create mode 100644 server-temp/venv/lib/python3.10/site-packages/itsdangerous-2.1.2.dist-info/WHEEL create mode 100644 server-temp/venv/lib/python3.10/site-packages/itsdangerous-2.1.2.dist-info/top_level.txt create mode 100644 server-temp/venv/lib/python3.10/site-packages/itsdangerous/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/itsdangerous/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/itsdangerous/__pycache__/_json.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/itsdangerous/__pycache__/encoding.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/itsdangerous/__pycache__/exc.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/itsdangerous/__pycache__/serializer.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/itsdangerous/__pycache__/signer.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/itsdangerous/__pycache__/timed.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/itsdangerous/__pycache__/url_safe.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/itsdangerous/_json.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/itsdangerous/encoding.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/itsdangerous/exc.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/itsdangerous/py.typed create mode 100644 server-temp/venv/lib/python3.10/site-packages/itsdangerous/serializer.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/itsdangerous/signer.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/itsdangerous/timed.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/itsdangerous/url_safe.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__pycache__/_identifier.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__pycache__/async_utils.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__pycache__/bccache.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__pycache__/compiler.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__pycache__/constants.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__pycache__/debug.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__pycache__/defaults.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__pycache__/environment.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__pycache__/exceptions.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__pycache__/ext.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__pycache__/filters.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__pycache__/idtracking.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__pycache__/lexer.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__pycache__/loaders.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__pycache__/meta.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__pycache__/nativetypes.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__pycache__/nodes.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__pycache__/optimizer.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__pycache__/parser.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__pycache__/runtime.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__pycache__/sandbox.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__pycache__/tests.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__pycache__/utils.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/__pycache__/visitor.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/_identifier.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/async_utils.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/bccache.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/compiler.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/constants.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/debug.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/defaults.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/environment.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/exceptions.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/ext.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/filters.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/idtracking.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/lexer.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/loaders.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/meta.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/nativetypes.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/nodes.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/optimizer.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/parser.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/py.typed create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/runtime.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/sandbox.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/tests.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/utils.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/jinja2/visitor.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/markupsafe/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/markupsafe/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/markupsafe/__pycache__/_native.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/markupsafe/_native.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/markupsafe/_speedups.c create mode 100755 server-temp/venv/lib/python3.10/site-packages/markupsafe/_speedups.cpython-310-darwin.so create mode 100644 server-temp/venv/lib/python3.10/site-packages/markupsafe/_speedups.pyi create mode 100644 server-temp/venv/lib/python3.10/site-packages/markupsafe/py.typed create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip-23.0.1.dist-info/INSTALLER create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip-23.0.1.dist-info/LICENSE.txt create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip-23.0.1.dist-info/METADATA create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip-23.0.1.dist-info/RECORD create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip-23.0.1.dist-info/REQUESTED create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip-23.0.1.dist-info/WHEEL create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip-23.0.1.dist-info/entry_points.txt create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip-23.0.1.dist-info/top_level.txt create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/__main__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/__pip-runner__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/__pycache__/__main__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/__pycache__/__pip-runner__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/__pycache__/build_env.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/__pycache__/cache.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/__pycache__/configuration.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/__pycache__/exceptions.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/__pycache__/main.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/__pycache__/pyproject.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/build_env.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/cache.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/cli/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/main.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/parser.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/cli/base_command.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/cli/command_context.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/cli/main.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/cli/main_parser.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/cli/parser.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/cli/req_command.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/cli/spinners.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/cli/status_codes.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/cache.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/check.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/completion.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/debug.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/download.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/hash.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/help.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/index.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/install.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/list.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/search.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/show.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/cache.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/check.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/completion.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/configuration.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/debug.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/download.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/freeze.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/hash.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/help.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/index.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/inspect.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/install.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/list.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/search.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/show.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/uninstall.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/wheel.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/configuration.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/distributions/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/distributions/__pycache__/base.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/distributions/base.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/distributions/installed.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/distributions/sdist.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/distributions/wheel.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/exceptions.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/index/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/index/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/index/__pycache__/collector.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/index/__pycache__/sources.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/index/collector.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/index/package_finder.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/index/sources.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/locations/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/locations/__pycache__/base.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/locations/_distutils.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/locations/_sysconfig.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/locations/base.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/main.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/metadata/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/metadata/__pycache__/base.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/metadata/_json.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/metadata/base.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/_compat.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/_dists.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/_envs.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/metadata/pkg_resources.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/models/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/candidate.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/format_control.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/index.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/link.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/scheme.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/target_python.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/wheel.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/models/candidate.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/models/direct_url.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/models/format_control.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/models/index.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/models/installation_report.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/models/link.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/models/scheme.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/models/search_scope.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/models/target_python.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/models/wheel.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/network/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/network/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/network/__pycache__/auth.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/network/__pycache__/cache.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/network/__pycache__/download.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/network/__pycache__/session.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/network/__pycache__/utils.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/network/auth.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/network/cache.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/network/download.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/network/lazy_wheel.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/network/session.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/network/utils.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/__pycache__/check.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/build/build_tracker.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/build/metadata_editable.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/build/wheel_editable.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/check.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/freeze.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/install/legacy.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/operations/prepare.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/pyproject.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/req/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/req/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/req/__pycache__/constructors.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/req/__pycache__/req_file.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/req/__pycache__/req_install.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/req/__pycache__/req_set.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/req/constructors.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/req/req_file.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/req/req_install.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/req/req_set.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/__pycache__/base.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/base.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/reporter.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/self_outdated_check.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/_log.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/compat.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/logging.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/misc.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/models.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/urls.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/_log.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/appdirs.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/compat.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/datetime.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/deprecation.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/distutils_args.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/egg_link.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/encoding.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/filesystem.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/filetypes.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/glibc.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/hashes.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/inject_securetransport.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/logging.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/misc.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/models.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/packaging.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/subprocess.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/unpacking.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/urls.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/utils/wheel.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/vcs/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/vcs/__pycache__/git.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/vcs/git.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/vcs/subversion.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_internal/wheel_builder.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/__pycache__/six.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/certifi/core.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/codingstatemachinedict.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/enums.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/johabfreq.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/johabprober.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/langrussianmodel.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/macromanprober.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/metadata/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/metadata/languages.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/resultdict.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/utf1632prober.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/chardet/version.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/tests/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/tests/ansi_test.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/tests/initialise_test.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/tests/isatty_test.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/tests/utils.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/tests/winterm_test.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/win32.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/compat.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/database.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/index.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/locators.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/markers.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/resources.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/t64-arm.exe create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/util.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/version.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/w64-arm.exe create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distro/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distro/__main__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/distro/distro.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/idna/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/idna/__pycache__/core.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/idna/codec.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/idna/compat.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/idna/core.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/idna/intranges.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/idna/package_data.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/packaging/_manylinux.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/packaging/_musllinux.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/packaging/markers.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/packaging/tags.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/packaging/utils.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/packaging/version.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pkg_resources/py31compat.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/__main__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/android.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/api.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/macos.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/unix.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/version.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/platformdirs/windows.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/__main__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/cmdline.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/console.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/filter.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/filters/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatter.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/_mapping.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/bbcode.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/groff.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/html.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/img.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/irc.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/latex.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/other.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/rtf.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/svg.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/terminal.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/terminal256.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/lexer.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/_mapping.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/python.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/modeline.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/plugin.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/regexopt.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/scanner.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/sphinxext.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/style.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/styles/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/token.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/unistring.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pygments/util.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/actions.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/common.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/core.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/diagram/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/exceptions.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/helpers.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/results.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/testing.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/unicode.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/util.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_compat.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_impl.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/api.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/help.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/models.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/__version__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/adapters.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/api.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/auth.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/certs.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/compat.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/cookies.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/help.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/hooks.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/models.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/packages.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/sessions.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/structures.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/requests/utils.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/compat/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__main__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/align.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/box.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/color.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/console.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/control.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/json.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/live.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/region.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/status.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/style.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/table.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/text.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/_cell_widths.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/_emoji_codes.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/_emoji_replace.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/_export_format.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/_extension.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/_inspect.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/_log_render.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/_loop.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/_null_file.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/_palettes.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/_pick.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/_ratio.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/_spinners.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/_stack.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/_timer.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/_win32_console.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/_windows.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/_windows_renderer.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/_wrap.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/abc.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/align.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/ansi.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/bar.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/box.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/cells.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/color.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/color_triplet.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/columns.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/console.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/constrain.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/containers.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/control.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/default_styles.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/diagnose.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/emoji.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/errors.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/file_proxy.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/filesize.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/highlighter.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/json.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/jupyter.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/layout.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/live.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/live_render.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/logging.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/markup.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/measure.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/padding.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/pager.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/palette.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/panel.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/pretty.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/progress.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/progress_bar.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/prompt.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/protocol.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/region.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/repr.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/rule.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/scope.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/screen.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/segment.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/spinner.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/status.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/style.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/styled.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/syntax.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/table.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/terminal_theme.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/text.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/theme.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/themes.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/traceback.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/rich/tree.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/six.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/_asyncio.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/_utils.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/after.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/before.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/before_sleep.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/nap.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/retry.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/stop.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/tornadoweb.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tenacity/wait.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tomli/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tomli/_parser.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tomli/_re.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/tomli/_types.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/typing_extensions.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/_version.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/request.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/response.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/proxy.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/ssltransport.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/vendor.txt create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pip/py.typed create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/__pycache__/zipp.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_adapters.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_common.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_compat.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_itertools.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_legacy.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/abc.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/readers.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/simple.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/_adapters.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/_common.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/_compat.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/_itertools.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/_legacy.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/abc.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/readers.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/importlib_resources/simple.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/jaraco/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/jaraco/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/jaraco/__pycache__/context.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/jaraco/__pycache__/functools.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/jaraco/context.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/jaraco/functools.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/jaraco/text/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/jaraco/text/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/more_itertools/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/more.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/recipes.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/more_itertools/more.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/more_itertools/recipes.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/_manylinux.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/_musllinux.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/tags.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/_manylinux.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/_musllinux.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/tags.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/actions.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/common.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/core.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/exceptions.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/helpers.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/results.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/testing.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/unicode.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/util.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/actions.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/common.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/core.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/diagram/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/exceptions.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/helpers.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/results.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/testing.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/unicode.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing/util.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/_vendor/zipp.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/extern/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools-65.5.0.dist-info/INSTALLER create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools-65.5.0.dist-info/LICENSE create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools-65.5.0.dist-info/METADATA create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools-65.5.0.dist-info/RECORD create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools-65.5.0.dist-info/REQUESTED create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools-65.5.0.dist-info/WHEEL create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools-65.5.0.dist-info/entry_points.txt create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools-65.5.0.dist-info/top_level.txt create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/_entry_points.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/_imp.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/_importlib.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/_itertools.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/_path.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/_reqs.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/archive_util.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/build_meta.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/dep_util.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/depends.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/discovery.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/dist.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/errors.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/extension.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/glob.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/installer.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/launch.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/logging.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/monkey.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/msvc.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/namespaces.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/package_index.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/py34compat.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/sandbox.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/unicode_utils.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/version.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/wheel.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/__pycache__/windows_support.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_deprecation_warning.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/_collections.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/_functools.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/_macos_compat.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/_msvccompiler.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/archive_util.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/bcppcompiler.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/ccompiler.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/cmd.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/config.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/core.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/cygwinccompiler.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/debug.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/dep_util.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/dir_util.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/dist.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/errors.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/extension.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/fancy_getopt.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/file_util.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/filelist.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/log.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/msvc9compiler.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/msvccompiler.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/py38compat.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/py39compat.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/spawn.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/sysconfig.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/text_file.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/unixccompiler.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/util.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/version.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/__pycache__/versionpredicate.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/_collections.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/_functools.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/_macos_compat.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/_msvccompiler.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/archive_util.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/bcppcompiler.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/ccompiler.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/cmd.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/_framework_compat.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/bdist.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/bdist_dumb.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/bdist_rpm.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/build.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/build_clib.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/build_ext.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/build_py.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/build_scripts.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/check.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/clean.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/config.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/install.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/install_data.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/install_egg_info.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/install_headers.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/install_lib.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/install_scripts.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/py37compat.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/register.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/sdist.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/__pycache__/upload.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/_framework_compat.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/bdist.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/bdist_dumb.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/bdist_rpm.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/build.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/build_clib.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/build_ext.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/build_py.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/build_scripts.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/check.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/clean.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/config.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/install.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/install_data.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/install_egg_info.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/install_headers.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/install_lib.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/install_scripts.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/py37compat.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/register.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/sdist.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/command/upload.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/config.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/core.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/cygwinccompiler.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/debug.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/dep_util.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/dir_util.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/dist.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/errors.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/extension.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/fancy_getopt.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/file_util.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/filelist.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/log.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/msvc9compiler.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/msvccompiler.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/py38compat.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/py39compat.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/spawn.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/sysconfig.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/text_file.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/unixccompiler.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/util.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/version.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_distutils/versionpredicate.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_entry_points.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_imp.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_importlib.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_itertools.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_path.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_reqs.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/__pycache__/typing_extensions.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/__pycache__/zipp.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_adapters.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_collections.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_compat.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_functools.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_itertools.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_meta.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_text.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/_adapters.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/_collections.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/_compat.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/_functools.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/_meta.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/_text.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_adapters.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_common.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_compat.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_itertools.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_legacy.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/__pycache__/abc.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/__pycache__/readers.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/__pycache__/simple.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/_adapters.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/_common.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/_compat.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/_itertools.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/_legacy.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/abc.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/readers.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/importlib_resources/simple.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/jaraco/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/jaraco/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/jaraco/__pycache__/context.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/jaraco/__pycache__/functools.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/jaraco/context.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/jaraco/functools.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/jaraco/text/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/jaraco/text/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/__pycache__/more.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/__pycache__/recipes.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/more.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/recipes.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/ordered_set.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/_manylinux.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/_musllinux.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/_manylinux.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/_musllinux.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/tags.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/__pycache__/actions.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/__pycache__/common.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/__pycache__/core.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/__pycache__/exceptions.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/__pycache__/helpers.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/__pycache__/results.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/__pycache__/testing.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/__pycache__/unicode.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/__pycache__/util.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/actions.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/common.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/core.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/diagram/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/exceptions.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/helpers.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/results.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/testing.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/unicode.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/util.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/tomli/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/tomli/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/tomli/__pycache__/_parser.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/tomli/__pycache__/_re.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/tomli/__pycache__/_types.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/tomli/_parser.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/tomli/_re.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/tomli/_types.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/typing_extensions.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/_vendor/zipp.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/archive_util.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/build_meta.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/cli-32.exe create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/cli-64.exe create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/cli-arm64.exe create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/cli.exe create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/alias.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/build.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/build_clib.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/build_ext.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/build_py.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/develop.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/dist_info.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/easy_install.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/editable_wheel.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/egg_info.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/install.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/install_lib.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/install_scripts.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/py36compat.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/register.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/rotate.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/saveopts.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/sdist.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/setopt.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/test.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/upload.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/__pycache__/upload_docs.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/alias.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/bdist_egg.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/bdist_rpm.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/build.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/build_clib.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/build_ext.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/build_py.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/develop.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/dist_info.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/easy_install.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/editable_wheel.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/egg_info.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/install.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/install_egg_info.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/install_lib.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/install_scripts.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/launcher manifest.xml create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/py36compat.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/register.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/rotate.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/saveopts.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/sdist.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/setopt.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/test.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/upload.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/command/upload_docs.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/config/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/config/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/config/__pycache__/_apply_pyprojecttoml.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/config/__pycache__/expand.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/config/__pycache__/pyprojecttoml.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/config/__pycache__/setupcfg.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/config/_apply_pyprojecttoml.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/config/_validate_pyproject/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/config/_validate_pyproject/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/config/_validate_pyproject/__pycache__/error_reporting.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/config/_validate_pyproject/__pycache__/extra_validations.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_exceptions.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_validations.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/config/_validate_pyproject/__pycache__/formats.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/config/_validate_pyproject/error_reporting.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/config/_validate_pyproject/extra_validations.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/config/_validate_pyproject/formats.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/config/expand.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/config/pyprojecttoml.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/config/setupcfg.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/dep_util.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/depends.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/discovery.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/dist.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/errors.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/extension.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/extern/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/extern/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/glob.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/gui-32.exe create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/gui-64.exe create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/gui-arm64.exe create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/gui.exe create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/installer.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/launch.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/logging.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/monkey.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/msvc.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/namespaces.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/package_index.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/py34compat.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/sandbox.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/script (dev).tmpl create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/script.tmpl create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/unicode_utils.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/version.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/wheel.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/setuptools/windows_support.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug-3.0.1.dist-info/INSTALLER create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug-3.0.1.dist-info/LICENSE.rst create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug-3.0.1.dist-info/METADATA create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug-3.0.1.dist-info/RECORD create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug-3.0.1.dist-info/WHEEL create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/__pycache__/_internal.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/__pycache__/_reloader.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/__pycache__/exceptions.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/__pycache__/formparser.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/__pycache__/http.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/__pycache__/local.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/__pycache__/security.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/__pycache__/serving.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/__pycache__/test.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/__pycache__/testapp.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/__pycache__/urls.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/__pycache__/user_agent.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/__pycache__/utils.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/__pycache__/wsgi.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/_internal.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/_reloader.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/__pycache__/accept.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/__pycache__/auth.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/__pycache__/cache_control.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/__pycache__/csp.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/__pycache__/etag.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/__pycache__/file_storage.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/__pycache__/headers.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/__pycache__/mixins.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/__pycache__/range.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/__pycache__/structures.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/accept.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/accept.pyi create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/auth.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/cache_control.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/cache_control.pyi create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/csp.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/csp.pyi create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/etag.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/etag.pyi create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/file_storage.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/file_storage.pyi create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/headers.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/headers.pyi create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/mixins.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/mixins.pyi create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/range.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/range.pyi create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/structures.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/datastructures/structures.pyi create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/debug/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/debug/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/debug/__pycache__/console.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/debug/__pycache__/repr.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/debug/__pycache__/tbtools.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/debug/console.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/debug/repr.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/debug/shared/ICON_LICENSE.md create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/debug/shared/console.png create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/debug/shared/debugger.js create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/debug/shared/less.png create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/debug/shared/more.png create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/debug/shared/style.css create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/debug/tbtools.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/exceptions.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/formparser.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/http.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/local.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/middleware/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/middleware/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/middleware/__pycache__/dispatcher.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/middleware/__pycache__/http_proxy.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/middleware/__pycache__/lint.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/middleware/__pycache__/profiler.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/middleware/__pycache__/proxy_fix.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/middleware/__pycache__/shared_data.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/middleware/dispatcher.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/middleware/http_proxy.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/middleware/lint.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/middleware/profiler.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/middleware/proxy_fix.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/middleware/shared_data.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/py.typed create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/routing/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/routing/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/routing/__pycache__/converters.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/routing/__pycache__/exceptions.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/routing/__pycache__/map.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/routing/__pycache__/matcher.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/routing/__pycache__/rules.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/routing/converters.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/routing/exceptions.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/routing/map.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/routing/matcher.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/routing/rules.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/sansio/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/sansio/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/sansio/__pycache__/http.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/sansio/__pycache__/multipart.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/sansio/__pycache__/request.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/sansio/__pycache__/response.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/sansio/__pycache__/utils.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/sansio/http.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/sansio/multipart.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/sansio/request.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/sansio/response.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/sansio/utils.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/security.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/serving.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/test.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/testapp.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/urls.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/user_agent.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/utils.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/wrappers/__init__.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/wrappers/__pycache__/request.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/wrappers/__pycache__/response.cpython-310.pyc create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/wrappers/request.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/wrappers/response.py create mode 100644 server-temp/venv/lib/python3.10/site-packages/werkzeug/wsgi.py create mode 100644 server-temp/venv/pyvenv.cfg diff --git a/app.js b/app.js new file mode 100644 index 00000000..e5299a85 --- /dev/null +++ b/app.js @@ -0,0 +1,64 @@ +function createTableFromData(data) { + let table = ''; + + // Table header row + table += ''; + for (let key in data) { + table += ''; + } + table += ''; + + // Table body + let maxRows = getMaxRows(data); + for (let i = 0; i < maxRows; i++) { + table += ''; + table += ''; + for (let key in data) { + let row = data[key][i] || []; + table += ''; + } + table += ''; + } + + table += '
' + key + '
' + i + '' + row.join(', ') + '
'; + return table; +} + +// Function to get the maximum number of rows in the data +function getMaxRows(data) { + let max = 0; + for (let key in data) { + let numRows = Object.keys(data[key]).length; + if (numRows > max) { + max = numRows; + } + } + return max; +} + + +function displayJSON(){ + $.getJSON("http://127.0.0.1:5000/getJSON", function (data) { + console.log(data); + // Create the table + let tableHtml = createTableFromData(data); + + // Display the table + document.getElementById('container').innerHTML = tableHtml; + }); +} + +// listen for mouse events +$("#canvas").mousedown(function (e) { + handleMouseDown(e); +}); +$("#canvas").mousemove(function (e) { + handleMouseMove(e); +}); +$("#canvas").mouseup(function (e) { + handleMouseUp(e); +}); + +$("#canvas").mouseout(function (e) { + handleMouseOut(e); +}); diff --git a/detect.js b/detect.js new file mode 100644 index 00000000..a13bfc00 --- /dev/null +++ b/detect.js @@ -0,0 +1,22 @@ + +function detect() { + + for(let i=0; i < items.length; i++){ + var bbox = items[i]["bbox"]; + + drawBox(bbox[0], bbox[1], bbox[2], bbox[3]); + } + +} + +const img = document.getElementById('img'); +var items; + +// Load the model. +cocoSsd.load().then(model => { + // detect objects in the image. + model.detect(img).then(predictions => { + items = predictions; + console.log('Predictions: ', predictions); + }); +}); \ No newline at end of file diff --git a/draw.js b/draw.js new file mode 100644 index 00000000..b2c6d47b --- /dev/null +++ b/draw.js @@ -0,0 +1,110 @@ +var canvas = document.getElementById("canvas"); +var overlay = document.getElementById("overlay"); +var ctx = canvas.getContext("2d"); +var ctxo = overlay.getContext("2d"); + +var $canvas = $("#canvas"); +var canvasOffset = $canvas.offset(); +var offsetX = canvasOffset.left; +var offsetY = canvasOffset.top; +var scrollX = $canvas.scrollLeft(); +var scrollY = $canvas.scrollTop(); + +var isDown = false; + +var startX; +var startY; + +var prevStartX = 0; +var prevStartY = 0; +var prevWidth = 0; +var prevHeight = 0; + +ctx.canvas.width = img.width; +ctxo.canvas.width= img.width; +ctx.canvas.height = img.height; +ctxo.canvas.height = img.height; + +ctxo.drawImage(img, 0, 0); + +// style the context +ctx.strokeStyle = "red"; +ctx.lineWidth = 3; +ctxo.strokeStyle = "red"; +ctxo.lineWidth = 3; + +// Draw a box from existing x:y coordinates +function drawBox(x, y, w, h) { + + + if(w / img.width < 0.2){ + ctxo.strokeRect(x, y, w, h); + } +} + + +function handleMouseDown(e) { + e.preventDefault(); + e.stopPropagation(); + + // save the starting x/y of the rectangle + startX = parseInt(e.clientX - offsetX); + startY = parseInt(e.clientY - offsetY); + + // set a flag indicating the drag has begun + isDown = true; +} + +function handleMouseUp(e) { + e.preventDefault(); + e.stopPropagation(); + + // the drag is over, clear the dragging flag + isDown = false; + ctxo.strokeRect(prevStartX, prevStartY, prevWidth, prevHeight); +} + +function handleMouseOut(e) { + e.preventDefault(); + e.stopPropagation(); + + // the drag is over, clear the dragging flag + isDown = false; +} + +function handleMouseMove(e) { + e.preventDefault(); + e.stopPropagation(); + + // if we're not dragging, just return + if (!isDown) { + return; + } + + // get the current mouse position + mouseX = parseInt(e.clientX - offsetX); + mouseY = parseInt(e.clientY - offsetY); + + var width = mouseX - startX; + var height = mouseY - startY; + + // clear the canvas + ctx.clearRect(0, 0, canvas.width, canvas.height); + + // draw a new rect from the start position + // to the current mouse position + ctx.strokeRect(startX, startY, width, height); + + prevStartX = startX; + prevStartY = startY; + + prevWidth = width; + prevHeight = height; +} + +// remove current boxes +function clearCanvas(){ + ctx.clearRect(0, 0, canvas.width, canvas.height); + ctxo.clearRect(0, 0, canvas.width, canvas.height); + ctxo.drawImage(img, 0, 0); +} \ No newline at end of file diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..039cfd876cb763bd81af6d385d4ba551f875a07e GIT binary patch literal 4286 zcmb_gU2Kz87(Q!Jmc{89iMJ5-!W+F-ZZr{Z3}gxyCfgW{T^JKcKqKJLFpV0B1HCYD zEI5cU#zYb@fH+`mu)nVRZMU{;EnC}d?Yi!#Kdk-wv+wbJzxLbO?pw2=?{fN`pZ7e^ zd*1WD=R4noD4@TcI|cuWKT3pnQ3&xW73vaiQ{jF^XzafV08v#{rN4gt`g1+qhSDB` zq4Y1RAEZ7W`@d!Hp1p!`4F<#We!qX$($doLSS;3*NF?qilgVx_T<1O>V;$DzIeYi) zd1`YiD=QV=M>gB`a5#LJI9g;`4iIi$VI9`xIX0S0%A%sYVpDcJeDF~Ga_N$OadGio z!n#iw@w}wkgK?hA7+0=b(YLp^Z^#CR!y$TldI}>;k>j+MS#9Wz_c8`!F(zZ@6T96m zdX2q>(P;E5nit(TOMXqliZG_pXe?w7E$Qs+6t$;5*F_@Ax+Ci%CYAyJ6Cfl3Ng0@5 z0_Lc2Klkw%*K>qzVC+*TPwF~4IBUcJLOW#Dw#&j69n4FQv(aM z=G!*%0olZUxHAd_(p$zl)1<2*%;9pmwo_aR<}NEMQ`SztsV4ROaXw1nXmqDgiBjQK zIoJkO`X+(#d9{`MjHkK8{{8!fZ^kEVR%_(ydgMiI;s4 zO9FD*2IikwmmkbEGCWc|=l3gX4+H|cXx|sJfzz!Z`ILQYnE}T9KtEw;iZ=xLVmIVQ z0}v%USrq<-R9)kjxdMxeyJ$$^r`$NMp_amHCT=&G#_Q~y0IWITN$Zwt|AySqwF=Qo zd*oc7pB2-bVvA0%i^thR4FysD;&!TC)&%)3`E4@)`c?k6wzi_Amj8Qb4O8p9ZfQ^Cqt_t6{2k<< zI#T?Nlmo9&`{S#SJI0BBow@1tv;SLLTZ@Xe7HY>I=euJrt*!B}`5-qLftgThkoWyE zwXKw=90!z_`Gn)|*)7lLNJmIo`N#Rg`^duQN^VJwq<+;gZgHNrjHTX1nL0UjHUFqv z&^zJHHRn$(f#plRkj@Q2sy9RW-n6E~&h{et^#jDt^&zV2oE?JnNju_~t&nXL!|Ius z!OvXG$=tKPSz#ZuYo5QdaS99N1MpN#!dvNHQ)bF1;QwF{i|@6=zt04Zs&l}NneuTg z)(j%qJh8?GioJVdqoc(>pHCb;azs4?*S>$~T#x^1!)&=&4*Qhx8p1DL#O^xynUYMU3p6TgQwkyL;sVbc-Y{Pt&Sy_L| z4z?wuR85nOk05>8j?fXZq0+fB?yZr<$Tx$StF(Z*XFhxk>AXqV z1KM{V-HUgVG2(P>?Fv6vh6abkh5GY4%7tU3r+xoQ&{<4(5P4_@%UzRLHcmsfQ;zak zoheH(EO$>K)?`JjVFdE%JSZ#p4tVUx3qR;gL#8Zlwc&QVh1Fs$lq9KcT^llaHdtpY z#vB`ZLi6Wg|(Jh5%tnq&F&i zWagAS@vFwvA`jw~rtr=PF4ekp7)hUfcK+S>hLL`KhswW=(%Eg&lFE5gtS}#_Xd8qf zCMlNb^d(cJ1G%LLd{WVD!k(pY0@lfS<4zaR>}zDfdf+ujQOI#tTV~F^_!5!_bVpS6 z*}vGNYUb?fc|LHDK(D*AQ*V8iZ+*skrJw6E##m&~*wm~jJR{ogeB1T;wqb0dD=_t& z?dD+oaIR}?=_pW2S9(G-)Pgs$O`<-?v|B2?yMli~d8^Pxqtdn|uWIZP)x;yyh8T&E z@Zf(!9=ph3sq!lPtj-e81&i!3cU@@JGkMPNV>)mtf`AV|-NI7*&|F}ce?8Uk{v5o$5e$%3H6e1r(Mulq%?V4+@_y=Qn05`a4^S$ z;%Uzs$A-pJd}(2Yg8H%q%y`zRMGp<@h@ryWZ+E|MVe z=?DkLBRWW!;oyCEp8_uVSOr?Pe z<)Q7NC3z)ILz(efvCwH9H-|WTmXR@kBUH7HHZ9(DFXZMiW7%H%JP+G3#YzIx&*QN; zT*5kw|H_uoTg9SmgGsKkMY)=Vq2TEn&)c__w# z--AU08m>|0gZVc-u}oYEk7$yhVa=?b*_lJmfH!zUHD3?Ez@PhWvk!SF7ov`uKUDP~Kbq(J890Eu$!NxdOda znsB~07)`*G#g;JBt1!qKQ z&j_$BF+SL;BRNJ4Ik>k3`D@$*DZH~fVhFSn!(yOC7W;z+_qe$QWfY0WipPdMux849 z9B+9=)gNwpS8P-VYyQ-G-Sd}V`N;E02p7*!b*zv*mb8v%AEcjnzQ+W>uFT~rgToS! zwB6+MzW~9VlVon9{Cn+Z<>iT44pVB{xS(=!i%GBQA-h@_Hn5!Drpn68+MGi;?afkl zyLE9=tqD>bdVAEUu;>0duLSX)Z7f5@MOk~QRsJu^pch5NuM=oiymNMLOy=qy-xhw~ zPC6bP_t+T^TkQ+0cCW{A?1xvjs}c|3`!-_gEcGg@YajXi@1MC7>my?ZnK^Bq8p8H* z=@>vBm#d@wkHhosTNVe;^LKl?P0qL4^xTzL%*#{7+)XdU9belE^9#HIPD6T&PHr-P zU9YE&5qh7oI9mE!5sWGhrL_??x$Bs;t<;H^b~%1|xJ(|lo5du{>Zk6|&Ra&da9i2D zEVt5L_S7jq#PC`6W|0-dC?2mBJVmokj<_%dk01=_3dt^wQS4wFBgMMrMpy zJMFVm-;Lcd>)IN=)s&2@QCPp%Fq#_Wf96zWx1{F>4WH%bV5d3U#fi^k-Oun`ye~o8 zU~v_#xX>2z%bfON$BSFrt_27kSQpEnWHMz4H%KuEuNSU)z@a!xqqdrIK_;N4GV)i% zn}3Ht9Ofx9POqh($@{*ad-v)h5uRSg{uyeE&0*2x1<9;b(}aMZpfA00d6vJ}U)pYk zAv0EIB!sZF43WvVGM*bNVAXb=mpJM-WaZh&F?Km`bJT4EOEnR$MOCiG3u*cBqZq=I zq!Dwe!xS49$!A#yS6s2!6km5K>$J&-hmvqrp5^%YT|w4gX;|Y4oJ?iFXI{NQhqdHs z4%SM<3`v&>chf|U=W3(gRLI1xUzSQaGIB%pQPT{(=NP*Pd6}dP>v0IoBl?co!JZnz^lU_fr zn?^}frdkcXNJ|TKv?efl>RnoA-C{XuC$<1{Ne4lB!d638?-xvQmzs2Sh*k@%v0gUP zAg<@f_3(-6 zzdFu{3;+cM{a4n(K|#R)VE@WF2q*vy90e7P1OgeIl$n@}h4qIpn+PNZ6S=6^zv>SC zujYe5fHuxB%h^oI=0*7lt}7bf_^h;oWHNS8$62|6ng1C^kl@wip6oTnRp>YaHYCje}Ml?7OcAf z;}eY4T92Lia$sn#vQ8^g7@MwERCkKuMoiFdpuM&HRNA^2ef#KEcRL{dp>fLi$JPV= z?B3-@adL4Yxk zYK(23^xK1tVy#7&-1Qt@8q+$Qwq_Fkjd8T)AGN#xKVzi&{DySbxP-Y=SpSf;>vSW? zv07X|F89*lTK6s;qVn8cQE{gyD6upd*uWC$6N=c9Wj^3d-m0l?MdV;SSZ;|Log$pc zHDUc>7fef@TeX>@Zf7{W0g;iZzDmS)Gzq_==UzX75Y^oogrWBe`*h7``HESMm+ofM0T_S zN9&Dw>W=2`R#2hs4{ECpwZy%b7WT)&;?{S|DDO*JQlI_DA^!-Xburz%a@#xfbQ7%p zu*YiB>QdOKzQ*f3y9n-lQky?EsfZnl%B{+U@*BB9>@B`3_$rymTdt|7w|wohf+wRk z9)=zfI;OeS^LVM)kMmdriER!-8~6*r&s+8w`}|_G`Ed`-nhjg%){SwlT>7ofd(ZWK zq3@x+kG2&%qDypOXiA%fHi2W~C06*+9U&T; z7NrGlgfDX|O}N$7!U0tKL-MrWmaLWYRj%&&P3J4yZ~3TR?U{D<17>dGbLDNU(bUT# z{%D`5DXnjOP|$(pvjNZT*vBsacWbH6%bQ)`WYfK>J$zSF*sH7$$6nYR6q5|iU=3P5 zVC-GF+=t%bd9r52$sQJDWicXGxY$}k|EZFCNBByI(T6pz>M!7?u04YjeG0b=?M0U6R}DKqy*cE=+N@!6xzqUy<^CdC zJRCaeG@r%=c<(7K_P)n;2+Mv0E)-g#GaMzniuisceC$!w2q1*^Adkn%2IM9 zU0p5wMl@NbiQmK%$f3T~QS7=79Twg)dAVtN&+O^^X`)=`s~dB$@##EVNf+^3c+M|d7!mv(uJ0s$kjTaRj1(K`8O-kW_)7lL{D21 zlCNJkI|T8&*{^sUf5$7D;6o;RYJB@~OPQTb-6Z62BF_ z-t)c|t*t$B+wtG{k|aEJ+*NTSPvE0fH4c)&>=u&-jX14iov)0o#=0V5Q{G543ORxS zhVDG~81(W9{GbqRLt;c+>*_2u&u~|c_M*EO?cI#qzgTj`1&F`oG6dQG{KT(f>x6@% zxf)fb<*l7&Nf}GYT{c}wE{}Bulh}V*?92|kba>buWqJX*;Sh4;&ZvV~Q|1z4=kZfs zY=Kf9IMp3o8upvKF^e>9axwSo$l@o7w+2IfWUgdK`lxE{MZd-y;zD|{APGOK{?u%^ z5tp>J2rk=CDcApOe^Z>Sz4+LBSx{D_*-X1vIFISH6TJrNr@mzTLP*0AzP5Uen?91r zGcUw3x;;v8AXL>554{p$M6IGW^*}R%<1e6o^5g6w?6fPek?W=3r|#)9fDy()N(|}XO^i5F7)F>wCHWWvpwj z{!~qaR7EdUP{==jG^Lf-WtdZoq;Xx4Zc zs{u?9>pIM%vW4_aKgS?UE5-g+ki2x5Yj|4oy4Bj(&}(chox}?k^l|#!JMd3W|I|E+ zmC0{rucf~LY}K6h`SV40x@5Dk=nQ@EYn6K$8jDEk^vRJj0<860gcMVy&~X+GnI?)x z%?LVuOnetKOLPKSYY$gu9SdwSp95oMR3cr}XzrqvOt$6E4 z)Crgs=xRGLCc|;GMqA7T^8NyVX)JE5u{Ms)9=)&8;K4ESsPR4X@ftOvP$9;_Q8^pRSvv_MFx+fgaNF!EPtF zNS)1fke3t^?ClpVtgNPMBqg1G99dae4|NX@L0DNW$qKMA3(?rRdW~^LYT^Gycgka@QJiu zys7t4Hk9``cBt{`q%~n-mR*?553BcptVC9W~K5);-kij4%BPm&xv(Q4r5zY8la}mA1$N7No}JXuW zup-e_T`!!TxUw|envYFlsi(d;+co``3_sFy;!_=_A5Sr7k}UYJW2faWvu`Ex=Z6_q z0ENxZpNY(+9ytZ;xv*0-J0cNT37`<6kEl?oJfziipjXfwsQWw<-?_p7va%8dLYz>^Mp_UipNz-MqS7nzCB~b&w1RiPEox-Rq=-0q0k-Ml z;*xToBbO7?`WHYn)Mn0u{7bY+FFS`s89JLOHRn>>v2bv$(3?s87g2=n{kyN1dO}JG z4x1U(A+NkV+v0TdF}H}1ri`iSwGN12YaE;K(h+5&d$`hTRFv_Ul+#%_9-%8uSV<_Z z&H8KER(2yn;ynjtBRB$r4!o=HN9<8-K><7a@h;E{iiZK5bF?L9*7;>m$9ifr2!Ey+ zQ|OVB-s#^u-^O7gTzTDW(GWw-6+S|mlEY>0RX^&u(R;5~EM%MeJpXMHm zlo&o9BoHGPFPrFYqwUxN&;K0?S2Fj($@%0SYsWA){YqCeabU9UEIu=?#V7ODOL5Pq zZW(FjolO~PI5&<1J+#7DCdqSJ4m~deWLw6=ZFdUc8g->dixbL~3*?t?TEXtvGM<6- zjsjk&S**Bc7z^_N2I7M7 z&3`9(yDzF8(90QB16}zNCCh#mf8m!=UlXqyWEDroVP|1-;6d1VXfM_)c5%1oYUHY- zv9IVlYsnPEHjiu0mV~Hy7U)% z-1X!gHXxfioltXnBs9D}kvrz(JX&jrqrE zGI>I07yF9*g(A9rZ<+%1&mnhC9y;DuW4dh(uCr_VK9P!)roGOlGvv0$CeIjarR~>V zs27_J73x-lvSwWN#I}bp3v%l5wcH8y+t!97TD0G)9P#{HL8M zQT}OX5U~F!=l^nW5Kt6UFl1(85+-4AG*V>|BjdpT(airix*!N`Z3ut5&XLc&fh{J` z;D@396UkFywM;kdWH;8Hfz5@k_j%1K*^khs^OU7_foRI&{WeI=@nvWW`V7`fBKw`Q z7twIw@TJe`0|w%=c^xVuTmp9k=TrD9|>b~AE*sc@<_@py58u; zx+u3vp~a!4nITF=z6ct3M@cn#x*I<_wqe!G;&zL^3BE`*UTYc^lay-;CfIi^cWYZk zHyKB#1^y(to|E?R$#{r&6_g=L4RIqKHdjlx%8I0}#~+$5R&GSp9+_IDWk*K)VmHAc z(iK6f^2WPYJM}cOWvNcYD?9ro3XHQ#m!7?&ss{;hvNIq^n{6djNPH!kM@%pb{RKdF zAs=~bPXEl9XGXg&`&K9Q`irk6B?8 z)kSsIOS)keM7uaGed%Ojp=+Fx$hzB^@;DYH;}fs)eYZ0){|k`)Z+ZYw|C$jX5dYhz z_?I3qWKZH~C^ZbqhYCv;DuZn^(bWDR>4{1L} z^s`qN`#}V|6VsN;E<9Syq9j$jv=hDVhfT4qfm<&*3aT>lvyuckYOAY zJhJw#&S9q^!ED7;iLLb^RDNq}k~YK=NqS6b6xG9c+ACRqv#oUq@6gly3jq5Uem-OX z2p9+iB-p?H)_>U2KeF_%w?y(U{>;LpEXu}CfoQ~uWK66gDh1#s&J6=XK}q}Q^K34S zgLnUnnIHv0!Bi{vKS@$>pC#k-FiCPGdW9gXAgL)CGU)@w8U4+Ln~N9FIRY+Px1{k^ zMdcxs`hkWOqQbG5SU1EOOPeiO{C%qP-}* zO3`mJoK$E1kogPf;oqV&llTAm(ntn9q~3hoNN$F^W5v{m*%%%kaW@Z7Z!2)V$WCJ_ zuPW^BF9Yp1^hvDzxcOb7=A!nZg+-+QBv&b=OY$qtKTb7s z4FV{5NST{g&Pwr@VL4CTmU>uT*H3*`_VwZz;R?n4$&p5^qyrnzPZgujpe~n4stz#n zcr^S_d8JV+3T=$(WiMn8IXHJ!<^n<7hoz=WT2Fovudn_KP*OOeyi(6O19^q#(<*Yk zm+0~=YI#>e-#>|i4iO>UGnOBoM7Eq5nogOl!H_A$*1)ogoT+#d>y9Do+z1QQf;CWM zR!-4g3_>Vz5w-O!OEEGFScmRH?*Qxn3xLBq3O>V<7~9;^;;k%?QnpNMlfvD_f~avw z5Yp|ROqaoyO!I9<_T41C*m53>B!@h~>-x2F3v_u5g|jaw#CiP zMp_;I7to{;(usjc{&lT^@6_}n*DR<+lgZ^}Zj!_nYH3;fRKVxp!H$nsq^9HGs661N zed;0u;dg`O_UKRv>J8H;CQ91*AdK4*WJS;aJqXy@1DL^uAi)nb9X2T!G=WYA8>cs37T z2NwQ>+8zVslB)qwoTfFyP%bdkV&6PKPHyWZye0o0cK9tLkI6ju7vb3G?$y&Xy^R!yz|^y;G3wz9Nb!j>hVqwriK zGRRa-Hj>IY5jp!6XjH0n4C&iZ&f(nASKI$7|44yEzs@}l+#JA}o`V0kk9SI2 z2LCR>{z%M8*2#8~KWoiej~N#yJacO=W3L5I$Oh6q=rd4-EQF4-symYqktB3$o>5Pm zFTKNPlY~%rIp-{iyu^i-83k-(T8&n;*XYr+LnNVzYRw00O$!d&PJL^Ih-d7es8dpe zXkAiVuSi7T+YL$rbI#Ys@_yh8qOPePc!XS1q~l5LyR!GAM$?WER@8_%5Lb(yDOOOR zw7YYnGk7XsVc?7KrJW0Hi4g}9Dv%{*%g-lkA{rRjkc%P@8`%VF+rVgZ0Fso=GjC7; zN0oXx;QKZXQ)QKZ0db>tF@tX;CYbh+fkIgp<#$)2^2o5iDk+`iJ-~OY$AXpU>eOBZ zEwKThg+pQFP+X!>u_)HSg1>;eH;G>L+nD-jdId|c^W26w-R zxA9+BE$)ov&e0BoW@+lRb;BRy9zLh>2&%E^(oe$d;2s2jOybQ1)FoGx+Qt zbP70F?YFf=PF7|ZW}D_|=B5&)-Bf>* zVntmDU^i1kE(t3V>95|p4mGpE|Fj#7lNo=eg_@4PDxC;vC3T%(y<7P`Gi@>w52u0IhGcGgsJ*1{Xrp|0 zy+&7mvp+APVhl&Ydv~y5yflrO2u>@R4%0|jb&v3;M$i>|1=Vg#u2iSb)lnnP4l5Hw z&!l{4qErSf!KLUL-C=jDzuDZx*7xIrdZF;VoA8N|!vmamx^4vWAxItSuD| zlXN9<*_TZM3vm)miVEK^aTxwtm+Q1L4EW288D5EuU6$h`AAfRH?O=Cs<84gGEMxQ= zty%v7^hB!k%pg`LCs2#eNeC#zypBVf^tyAs%SR~<6}qI)n*#$ZF1 zQjJ%DW?mwLYLg*&%kxPi11GHFR*|NuK%sfo-xQ=laE#R3kp|LBX_fvm2uNypdZr;e1Mg zwFOfui|u=qJDvt-l{xYQ{7S^W(HJ^Y9A<#Nq|9ccX&S{9Av9(ioCy=KF6drrT2@Dg z3$>CSs&L2g`p9-ug#Q>rU7sLLCWyCkpFi!f3nEdMtn>GfQ~N6|)S*RV2Kd1kf_dek z-S;Pzo<97QMwj1L^{j34tXI5!xyAg|5WccuinM}Oy)M~vJJ~1R4gE=-CeR{e4nC`T zizVZqE;?*>!x|v((cqLe$jpLZ=B9MY9kl6Eeon1 zEXZ>*B(slp+MnltlNF7rxurK(Q|w&V-W6x2C9SZ!Rqx{$*)~>hBCN6wh0Z}3*H=Yw ztSnk9cdsi~H}%83-S*w7jHii*jU%j5-8Q=wZx)y&Q7%xA{R_bOPO}N|uD%V2>~?fi z{~6}RXmUqu15gtua~iP+yO#*(^Zzop!uc&gKw{<3%>nr2C)@M~-&m#L3=b zG1yuSW!`(guCm@U@b6cT+AK@dLC!Qrsray(p}I8W$pYc_jrnwbj??uVt5dtlA)PT3 zF3keP*WVvHOVR3kN*OYkN7OQODbRTcrcL~!Wi}d~3|Td%+bRPm5yfwEL?EB`lZPy+OKKnb42H&#sKV${@pOpVc zzQDl$3%)=AC?w3n|3p1WC$w%Of#3gufAWLhj|1@2_Sa(8?q$5T<7?B zP8Pr#4h((EMb;*`QS zG)^xwLUCp55Nv{i;&1(?C+!p$mzU^1Fd{Wb8R||eN`67ZW}~7t?27)RPHK7Mjx%ki zz=WVGEvziS`03r*wnBz_hL?%0lJ?AcgFBW1>ek^!*zzEV`bZle_OCz6<957$pt4qm z#31On0)SBHm%lPiX=Wa(iAS-(!vJ^AHLas^TZ73URkIfU)`ZNVU%;mpR#VKAXE-h$ zMyjv^1()*$7ALQ)&RpOF_{t!Cu6u+?o2e>L9P;^mO>sF1qx8|PdP z&-O>dy3y?Vnl1l!Gt}Vx9B!s>qTT;9c>#B_i9*9>O##H!L}@8TV?I5A&`)Jig|4sw zx9*urae#d-0Xktv;+SbWXtWSW>abWKiuKo0rjW-lkkUDN@W@OO_r>_*TNF4j=7{A$ zeZJCEBrZ2T1VxO|v$bL}+*R;Ch8h^_y*p>y%nPBDOeaQ~F) zGWm`7-XTsPweOos-5u~{pdB0mK0iZBe#T>=OpmxQjD{hRc)4Ls?lT=sRakm3?zcER z{Jex~u{QhD^LiZV=V3Iakz8W_(%012Fc8gQ5Z&of;33Ur@fLj$#Sn!`U{0-j!5#OSpu{hOR8 zUJjl%L(hDeyo#Spgup=$E?EyqDaB~R&CDOB?P4}X^;^2@8+_6>6!tY+a_r|l|IpW$ ztVBVJetKk!CQ6SokT%#wt&1RFxT&F66^9qoGy#|6MmMNSv_cLVC4%EUJe(=mA>uV% zFDDBoaDl4nIqYiRx{E`jGAU6nZBjgIi0=ZC)USTC) zva`L^3XKUmiyn;vBaR;%ET=)*@8U^Vd{VYQ;)xvLeBYFCGN1_ig1*HD{ z2J{TW=QS(i4)2$=&XbXyE@i_3A(o?o>u)2`{qZR85s4w_3Osy)P*=(zZ%GUfv+==@+@ilrrLsxDDd* zr|9h0Cz0k(OLZ7IiLnhWXuzk;SF{sT{n*k(ZTL#}Lg&~7;|5XQQ7H3{Nxva@(Lxx3 z%H`bX2otKljaHbN`&U8ITgEPGRNSnJ308)qqQ6Yah=c?sH3LWi1AMitIB;Q+g2GU* zE5Ivm8Q3*MzdG14$Mkv9e2cGEMZSovDoM9L2uy~hxo_~tizeCyg3CnPi%@HHL`z4Y z3tL46?m$!FBinPEkL^TQK?w%GA}rE;lMQStO?5zGT)E}Zm0)1B8vM3?Y~^8uyZJLs z3i}q9Dn(>?`?mdr1*XRK2MwVzyOt}hzC{GJ+p~y&0Qmu}8qDz)9SV*wTV*@h1#m=` zb^^AaRblirNOGGeBFsi%kr9KUVG4Z;H%j^?}WT^h%aQjmPw$M&8f*UJv{Ek ze2euHSf>J%_+1WC+v%}b!il~8BDXp;N=6Z)hb9zHY zwK+Q=8Wv}>D7C!>e`2ifB%I^TO#?hxE&Tk(d_(5-Qu!-(Ir8zsx2e?A5)N~`xN7Hn z;G7T(4YJjl=zM!q);U+V$VUJ7x(%rRaM4a7RcN)s^7m5V+4SmS#Oc7d2cCsF6m{+? z+FfQ{@X%67<{8onkjArpTr$TD#!9zCoZRyuFR}qCPom#B2y^dY&vV(Ko0- zO*QvgnJp4aoUFH$J(5?M4N8-S_(-LKRvXmaXb04v9y?$dfzMyU{-Ik(Zhs0(`W4>=ZAj@y%iI8V_Ti|>j~@!b%&JiaH~HYeN)x2)Wb;Dj*^ z;^n}28nu2>Ub8{EXxL=5e=Z#z(z?=fp;>SK}e0! zH!cDZAuK@7nKKWtV~8>LJ0xqwE98F%a{ zLqw!KkbWM*)Om!X)}(3x70Lv2YleS6^WC)XPs$cLA?4|(ES$y{amzuPajq8Q3BQOr z4XmkD`XgUQ7`txm@N^gXKJ^2|@MUDWN>OFqf(kKN6i~(jUiUocLx65FI8~)q3m6xFy{QuK8T%8NDAYYDe1zB;yqH%9X4E~P6Z;aKM`5owv|m7(tpHGzwj0i zScw;e4cvK4N%RQQ(H;AN;lJ&fM-4HM8Le$XZ8vz>pwcGYq&aDbF*)oNH;4}gXN|Be z#4mU>CjJOQ2F!_7fk!tPJ=Pm7r`wBo(^%F&&ch^6*|_%rTaoM8XA^3}sb=jZNixv& z+R9&XYiF{f^OaSa%1mRpHtowBf(o-vD3Mnv zJi;hQGK4eN$aE(P3Uo*B5V`4%kfb@0sNk#7A;2Fq5)RFFC~QnyY+-&4|GYJ%ACS?Y&?FR|_yxN|ob zfL-{uaFeN9TIyG*h;M;yEpl@-3P1v_UfX28YCl5R_%VyAIG^g_=}U<*OJ!#NZN zPd&=Wz4>O(TyD37cxOoEzB^xGmL)&CGT#32oIPHF{2Z-{;j;)OWn9SvnsHNPzjG#r zK_#LkG;EpK1J6rFAx+D|bpoV3bRb%O#l&w>m`7gJ7fkrm9Aegv7?j>-LYd_SH6%71 zAB%rKU5Z(#yLI~YD8vQfG*V3nMg3XjM;h2I7^X(1F=Ar5E2#R`FfGz>cbJ`Fh`jC} zsSSE!2%dHf$WL~+Tc$FU?ZJyt2ap);<22qL)In375Vfe8?_8Ci2a>N3Nz$+LfdF+3 z%L~cZ$L~KLuR|~}OvVk*<&`cEX=n~4_>8Uu`&8~eO5@)$*M7_u-B6h2IXG~(Dqn0e zHA^?gR$WJWUQjY`B$HDeC{zSCU8@@wD4aDN(b)B{i%e<#I{9QJ3sMZvC+uG%SWUi4 zVlrTfh2~mUj4Bt#MI7XE*_|l@M$RJQ;X6ty3tI#EQ;`lZQ7p~D`bH!gZa|6w_`&s4 z`FjxU(d-ts!R7Ygl<_j^9Sz=jL`iEG?@by5CQGa1SeR!~8?erMe5)}ol`{ix`42s; zX_tFKHb=f`XeVsyn-z*Lj3&4Z`N?H2^-#T8uruL><=h#fTscjxEj|5kt)gF%q(vB; zb3@wnxKk(YS;6{1D~Jk#w`jqc znKEjhGTSx&%w5Oq9!qsb_L)V}`fUDJZNg2L5c|S%D8(a<%0@n(RS|bo2b$JJUCQYA zDA{HHUTMd6H%p)txJxe2)v3Mzq_S`XTfO%Y2bS~_cZ4<$jNL`qJYsTcZ?!_N=$!o4 zXAW~ZPQ;mSTXHsc_8tQmVyUsEd0TQs3V~GbB5a$^7Yg}PMgD8xbX*`-obi-9f(BLw z-94zq?jpq8@$!)OtW|gm90$%L%b8khcS-9=X{P^+&N8;Z+|~RtL7}RVc@qf$SAKvH zqu8euQD!kY!rSp&Gjn0B-HA%yAS=K~*5tT0cybSl^UP%wwnikcV^LnJFZh!6PqBp{ z=yj8@;YAKRD77bvFBGuY_ieipcd*QA_)>)+-FcJ9<*0L_56(=LegdAHjq&PJd~Kx4FOQ1`1I{Fgbco1)&3_)#4} z1o<7RhkEK=jzsbouB%r%>X!Hgof@5w>%kfsk|Xnkor6bEH0RUpjnNWGlx)KHxz0ucthfuDNGK+iMR0>nX!7zYHuOQID89y zp2|hMyb<-ig{pLDW>DJ70&EXR%L>8b8oy&VTlz49 z%>s$j!HRq38~+0MWE0tT3^P+q!iCu0q8|AkO0b>T3Oe6I6B;#%v?C$t`vtXlh^<)# za`&|#!}83+z_!#oL}J24@s)0Bdx3hGW(f0ij)(P~8%5up^_ADPw?@N zjJSPAXk<^(RGv@v_jR#>HiW(8! z*T7f7i4J7c+3*wb1WaKW*IP!}M20P8hssyK0?T*&kDp$hQn$O^t#aEL<|YKtG}Lb_ z^_pxW2Z+Tvn(NB-M|_hq5?zyyQyRy7@}Nb26uz>LfFJsOEHB2gozZ(fGkXanuqXNk ze?Tx&KJ#Qlhy#OR0v(_sS-d;5Q}@D)9wczHf&TjJD@39+D zY(wAbWNV`N(hf^MuqPYJ=1~IRqH{*o8hNar`YG-7LX&FCidc!unL?T(ghLgn^}nF+ zL|hH7bd&1+B%NOnyl@grOGvSsRHi|~uiVP7MXI1jgTDU^)7(am7)TkAK__V3s!eug zW;!22n)92waEb%LB|f&A-NQ{if7d0xWtO!Ufd+Kp{FFPvDx8@0OI+%+8YH@fS*nXv zH6kQYduz-h`hNj!F_O-%jLmrW5>cjzo~jUGE+%ab$}3>5@k-UOeG-FAv=^2QTi~Br z)<5HkUZCmG_LnYPY7nTEDCsh+Q>5)!sh36=D8D32)pN^A`I-1QebJ=5|+c_DnDyDO6t)_Ats(2e8)dL9%;q>F8ImoWFuHJ?NgX z?vHEKguhD>*+xq3%L+bXu5;;f&SH2{`g&a8^edxtyuD)7CITiV4FTd`T6BI-O8J`) zN3_SbV0%w=x2#Ulr&&qaE+NTDZj%tltz1KZb>jS78)N1r?etI%+bmJO(-;GhE+Xcf zLAAaRX!_C8hr$^5R&kH34?+i^?Gdbc9+wWNKA7fN)}byFCWvCWd4#_ZY72TMD}&Rd z!&H)5daiLqVo$8)ys@TG4xa3QOxR8$&w+N1le7|zZEmU zMSrBnp7R4BJ%NB+;(ui!SO@I0VJm3HKBOXLcExr-kWu7-Ml4KFh>v*)co>?M z5Wa(P%9B2VM5$?pp7Q!I%B#}iPqc6p`++0SJarJ!oX=VGk%|m;aoo7<>FKtm(+f-mysBI} zv_7)H9(Llx0x}FaN50tRID*BM=;ZWc7-&yTS8;@0h;%V>*BU zaSPL9+i6N?^I%+A_o1NKqS7f2hyWCG8Clo#>D+$X$VPJC23wu6=oM!`0z8a#0t7w; zVjy;xWKAc^3$7IoinsukP#%pW6R+UGd9OOt5{U3l*0BKNYT}MkRofZ;oaO}+ z2pBo~x+G#!hVa2oBsB!3ToMzIjA(~m9()O3uz=&6Q824P%pThs^mT2Gf#zwmbZO7b zv!V&~{(&f*sJC^$w9cZ}0Zd|FDBzn;OWg4~y?0Dq62=uMP7{sm$dR0Rc*UU@jCOAB zasDXR+D$ot%ExeoW{U!FED=?1leAM>V+^>}=E!T<;(h-B(h`k-CFp0oi94!mC)X|A zU5~V&)SN%52ruuw@uENf!~h==0RaI30|5a60RaI3000000RRyYAu&N9Q801Q|Jncu z0RsU6KM)BSr{TPk6gz{mbsxzR3E7vcEnO$_9exQQl&EXz8ByK&OeYxyj*f@89Gy!kva zW5!ttI=dTp-aDQQ95a#;?eL2xb$IT2Z&%AXM>|JH$*#_z*41@`qa^XYBfIV5ACP2|tcG4=X%}seh{$cHeL-Jx&kV+f?60#(zDT{3i!%*2tb#r4 zoosnMGIzXq-nhtn#hgCu8Ij_UV`0A_`i0Qg$rH1&u>|xGY%b3@9~Nn5NoA62I+Hz? zJ1u9UXDOD(!wnld1MKy2H=p^+gBc=ZZKccMm0LJChxo0j=+H)ypQ1v z&uUj7>N`|59ZSGj0jDeArOo8vW zLVwbSw2Qe;U@aTnlg_2QWI#l)mu%#2yiXfzDmP*MOP}L{_~*fThaN+F&fCFU;q8}5 z?mC`3w~fnfw~p7TyxKZh`P+HhVPVT`r&m+P+cM8P##?FrJI>o}ylKYUvi`@O`QP!| zc-|g%+j!nm?7#oS03i_p0RaF500RI60RaF20000101*%&F(5%vFkx|lk^kBN2mt~C z0Y4CC=-&J{CGOjJ-WKu8ES+g@QSG^DI+VEZaF2$=yghdt zdx?9_61(MPhFHGk?gvg z`^Rf~k1fXSb~=_f>N}Sq;o&3Q(qHESN9?x8w!_Q#mvHKQyWXqs01uYw z1NU|A+YUQ`g0TayWgfD$);R8DT2>Bv>a{ZohDmFls$R z0lSF3Yzgh+{@B%mf4UF#4ClIJ%pjU(S0;TSx~E(Ru2i?-vg~0j_hJE@F7nhSIvyh@ z@)N0VF4my+Nh~4$)JNuMc6Sz*dvD8lV)9+K+~MxlTh|$8P9&ItZ&@58vdH!PITCE} zCU;=XgkarS!fy=A8$KHSwtpLBY}6)l6Yw4yeqCB{_0D{cj#fCxa_*eS~h+LBSI^eL!UK&;_}#Xs0U5w&{O} z=6X?aRT`;uw;q!<{_Xz&)vw5VkT9Fj7ARLgtm-i07-jb!VQ2tu;zVLun*#6zC3qIt z9_$pyMW=Yr;&1W|%PX*{x0W?ew`j*DJD1jFLY1siCJnQmuq_lfL;!#p0|Jei^DG}q zjcsP}Z}}AU2dNC&dchUUgPVY0DTtQGA$Wp35NJ(5!qCyT+v(G%c$OlSe#}=Nxs|jC zcb+3zK4U^NTpkYU_2OUfH$NBvTs3bbHPehx+flO7h2PRRV%6~mP{?u7_9fmbHxpWN zgJ*k#1}xI(&U~<5zd6yiA&9c3+rN0o-so7zKfh2SlqoI_UOI7c3COj0D?aDUYHMy` z8K;hBAl%69!%bst@iuCy2M&wJtglqG_Vb9QO7)R@GqYR>L&$!A_TCMdZEZD-{{Y!m zX+l=V;8KJ^gmqlTXhN_#I5TifO-Vy%9Cb|S7TGGxA8pI4iXE!&+vS!B;^_vwD%UZY z0)25T&mEw36=)Y8vanfR8K~Ic>%X{NE`i!ys}*Iiy+*83*~Lu5R#a?-p6-$kU@l2& z85tp1Xj>JDEjPSGj>{NEEcSZuS?vHiY$qGHcZv>Sa}sy%DLCiqEq^4!2<@zp4K%Q5 zF0Lg(xWP^CU?QU^S>vR+wOH&8g>zxlwDp$*jpoetiuVI5&gCpCfHs^)izId_t##2j zR))|yO6*F6ZitR8w$$&5W4a?KG*S z;9e`ihLpSrdD>sZ%dD@z{g`wkFe$S9!KSu?=mXb3LI`+JTTfcQSVEl%czVT~?>Cdf zhT(V=BC&Lbylxd;4vZol3Y7s_hQVbu;jefIXl2lG3p1=(7Ns9NXsKSX%M#c$SsY28CfFn#5ydJLUzkJHxYg&$# z*XA1#nHo;g<-%NZVl-MDZC49Yz&s1>LdD2E4Yker_M9Cdp3vMQCI;Zw55N%2>a7lA zXOR2NY3(hllC+iR64H)|O0cj%9jUtSem6`^R4G*&xl14%2RYBYVv*7WQrWfM2vR~~ zU<$13tZh@R+sx2bh-$4&p*Rh;$|H39%Kcyh|fW&l&s{{W^AN-H}8_kcW* zP^=^GL$Jm)YYmJy&Jgs8E7L(7baw#s{0dRUd56_Z;fssO@3By#ViG5gQEzxdH*iHV z5JjR|cq|0et=B^Q*&IVRv}SD8FhBA%qxuPIn>~_%97~ie$4S(Tj}pl`q$(S~67hUw zg3b}ZUbyS+GJM7URCWg=6;)MUzsVd*a#w?_G(l+$5AHreF z6Y~0%5k=e4`dOm|Z<9WkK5_Uz_G5H>usv_$DJ6i#-6|cw372+{0SBVqNy*j|DKd*; zbOc%(AX*)?u8b?_#`?h}OgaOW3BoDC0h>l9BuM1Bu~&KP>n|in@R^PCWrKCM5m3h= z2JtS*I775bzMXkNtuVt%SwdVD;I<-;RgAY9%fcz7s*7<2p6~W~mb$X#{{RHDx)d3% zeegikf}mcX^_e%LyP$QWpe2C-<*8&;s&qpio0Mjv(8F2zeLzL(nd*;nQrkhXMID4+ zLh}u1YfTTNF>;&S41U}iHoQ(Ci;(3r#2yZoAEIiDN-7vAI`;^;*L)ZbB4h04~N>aV6@G9A*XHCKaQQC-D$E z3mProG2DBp4s~xe@d}6#dRQP3pz9@FoNT|`#{5DPnzClbH*UJ~?=IVzxD34bW*er+ z=sQ&#yAY!*a9upM%Y19`8Gp#w4s|L9P+mH{@7gruwy07c@d{#BVegdo2dqd;jwQlS zHQ?!bR6XETA%)Y``kF^Q8@>MkM8G-=Bb4=8=Mv^ig#v422p<7!*=(!{gq3x~!-t)~ zyQKM>Bme=5f*`1L6290BE8En*pe+|+;)DBRzf!9zPr(Ef@Y@u;jpZ0q%}WyYpubN8 zRr{C_M&}}5m&B`-rFsN63ib83$@BjJyYnL`=oe{&V-z%Qv40l~4QN(%a3-l*(Dj(U zAZX?S%Ne_a{fykODL*Fiq6W1S}0giMe&{^Bqcgb^P1Et*$9ked@xghIDNm! zsM-L1%RH4sPX#|w2SmE7nEme^k!(4Dra~7uCV$^)VQMn5QS2*gu90r`13vLkVF$Dz zmO*vZ;sncW&kx1jS(zeICW99voA=A&sKHf-A!h*=Z9Ux0@RY^Ncd z`)&YYhk@qv*o5ZP8cTKY8@AJG@rUcY0S2fam@Y&cYk~l*r$jsYU{x%ibdw0G^Jc3zo%o zGcTe>${UoV=%fQ>j6^$&k44HyM9OhUZt~qMD;(>8XY%69IDq!CFoIF3$_RlsGVWB3;=c?wG@}2`G43; zQP0{PunxKE52hvECJ!t18Q^iptq101Q`L9}+%x-xEAbo+knF+zz#9DbO4{|Po0sS5 zYwpxML;n<1Z zoYe2G{7VT->C>mN^DTfTPKM9H3QHl#cFXfoWG|0s-rcZ8?)Owvc9|ptoL5Mv!62)5ACTtKpa@WHc7!%Cp#HIzojZhT$xWjrwmc(rX2=Q0?in7YQ z4p`}j{%#>gRoWqQYmxu5|CfF8?^qlKVO@Z{c{mzu8+WqYW0_Z1h zW&Cmf0KeQcU8de9TumMyBmuzFUSeuAkg+Q%FcWn={DXLG3WjGvdH#>pL?dhiEA_-# zR3njh?G3Qr9BZ${Wf8kBYaDwJ-*PceY`-$elo@s9^87|-`|V0)ELU83oFHn4 z8@SJOU>aOqY{s`n-m>%&cVnt3{LFM#taL5{+Kmm{yM;=CuJ9&Cuooip-ev(AYnzq` z+G`$%=2}ikL&fpw7NHJpcb~N732y4>{{UfNa39O^KuIZbvW@whduE-MU)*)E`8GZC z2r^Q9Sfn=tVu$O*VK!jxWxn+(7%g<2gPg_-Pt{KAsDBoY^WPGbXdW^zCqv>2r3@%g zx6AC0drJE4)N)08>8~Kfn>m62bJj zgw5L}Y~WU>Xky9~r>W)!HGLYDC9WD`Kr2k;7^N5o+~cO0!k1(~?49Bwr&oH*?x(c6 zRjiNiSxBtAantwWAde{UJzkX+Fsmr`A~MRsaC${Rl#EUc;mfG?9J#jcVOMH4UI+~+ zOAVJTKnX#Gqn#YfR4Ab=>Zlx6EFVglipj=~U2_!xH#Bfz=NC6N7GS=tVt6PZ(pqCY z9cwZEaYb5{b!>U&`$By&hnfRgB0)39tcDRD4SbN$OvXdBA@0nzMJ_XlB}EH{lu(9E z-gOBeny(@cj8hAj0~;KJ@?u+*(@v_3V$#JlxZQhojvrEhc0ssJtTILJBD;0={{D;ARrtiW+vmrQaCFlva~JPw@+%~6?hH@ z?`Qx@Y$iMYu%T+#m!vfeQ_3`w-Pu}+=j4ptv@*@dVZfpi=zB zgru7(yIdEzA~xwSs?19-4G@Kr>!O$bo z31P9T@ex92nUaD8zAqot6q^%A?`R71@DgBv6}_MP0?T$i{{ZA{Dn|wG*H{Dq*)xrV zJVV2FX~UUrxV=IO%p~p$S6PW^a|{B~igfGpMrsNiH7+E(4@9k0a-p|Y7i40cNIAK+ zfOr1@JVMadO!aGW##t`FIroFo4rUvAgkuP$5Gt$V)quqqY-4RxzOi?2w=n~$ip*6) z0kbid=%8e~UOlBCww;wyk0DqWL!WrMZq_UvUuNapaMw4NY7m(s-=pVJqYjo?gE9A^ zuGA~_0`LN?TSYs|#me!oaaE)00-@bkk*is=9xiE+34+46cdbk?sf__#99-p4)mo!V z7{GVo2hz5_lE8!TA@4=6)HSjQpcaz<0Cg3RDskX=Z!};#eLUOSaz7 zD2hnf{{XGa8kv6}{IH?XYlk_qHBM@hkQU6kyP5?^vhkM8MF6ulIeJUka;6Tw6m;M8m>kYG zuDv@-LmB|W_Di`@Kyih<%4mszXxB3~0WRM1r%)R!<^eF^9M{nR)yj?a9-W}SvXJ3i zpOPZ@QCw}azS90ts)3q$#uC_~9kdl)q1C`I*R0yL;c1BZVMyRB`ih64FFyz>T2qmE z=aH7cZF#4k%%r{jt0RMARUJIX&=&Y0!sSW9z%|}xh*hH-xr;9duLt!A^=kK9*R4fi z$|)HN8#kcM%P_esD-~wv0#kFwGRyT-LX-jVE#VcHyr$h}Ok>(1hQ+srbUZdGti!0q zE!Xi2m=#r~T#z+VTV%jiy2n+u`5_f33mqgkOnTTPT~k_gxEJ?`hD9N;<`v0ovuiaQ zei%Q)Td<+t3pF*Ce{#kl22k6YJyd-N+p^RRt*4R_*rjC)#zw5RhHu;K>t#QP9N^qOR38%TBxt+O`w@O@UJ%jy)?HH7U$6NX zn^8|U{Y55s#<8}}(Tdl>RM-5ABM>WnBSKni?Klm=JD7;pW3jGp zF|{&nwNJ4EP%AAikIWFx1@#`+9JC>VuF~2~SF9<=fM8HAxZFVQK~~mL?eze+NiS(= zJ*|jX3u+Ytb_C^BtHyAA%N5cuZc`EUs+-M*bG||kXy`ZI{-u%;f{ATDESQYQN-(Q^ z7zDLzEtaj`h8+^pA=Ungg+c~AzY?=sg;Pflnc0NA{VrHRAZ@DV{vwwKC2K$A2Byn7 zQHt!qj{U4zFP(Xmf`3LtuVYTkGLtbTc0hpWdo`$-I}RY$5sop;LRE;VvMyNbtmaU* zLL&pF1J=Ic7|JLfpXyTA1UF2vfQS_DGRdif&_2*jVF2LIuZd;A*(pSSxropBbY~dp)7lWM9jN4iEWU^PDE8^}kM<@e(JXEq zg%)rgKX`!3rj9FknN+kyYZU%pcvPROnNvZ7na#u3`ZlI+_KQ2cJC-h z1A_Rv80PPo!3hgNjlqaFk`A{OgJtvDGFdvVnzHcJqTpX1@w#ony`5zx(X^$Zuild2 z9fFUjNrlWeg5QE0RT^Z*dqnj6MX0BKn3jU6a0(cNti<(3p-&oR<}AGf)&ey#zp5n#jkAZd-j!r!`rI zm})qgE<)UYveIT93NE_lR<;Xks}>LijUl{sx#r6FKih-D6N)LT_8^If5as4I0G)x* z*1NwGh|54(t;zPVZdtsPN zr+X@y_Kro|T_CMrpWc&U20kLFGTYa@TOAPRB31l0p%BThkPExKbKf>qy zOgkRVHELI5aT+3|c$GLXf_9Y<8x+$D*ad7W2g~sR)(I@7-MgZY4i9gku=Qw|ad)+z zV6qMB2zsUvU8@&cR^S7Y9=Dj9fD3K9+nhw9Vt^&yJxE`fWY(kKm?P5EDevhQJlI~a zXz0D*j!G>I13Xng40npra28;Fxa8?uwW0W^vP`ST{k9puMidLN5;Y#$`Rd z>Ia^^ATc9?p4VKN-9k^9g>srsFJ6(`C)TlpFoCthu&w~@ z4i`eT#)x5#x+deM(~G}|Ca>FL$F!(JZA6@LojUl8=H)9{VAcR^DyG-ShT7jtI(Cgp zm~2oCUTqdvq|Isq((vmBd&<-)!*o+Vn}Ai)6lDm%cEcPJI)v7g?u*B0`X<9H6LaTo9#(?_IyK*vh0^&U4JL;zd) z={2a$xK&g8)>g!bEZ4NfM)lp@Ur5m*MJeJHs+fB^dqV6{5p-K9dKjm2^+QpCZ%phh zW&>&_63cD5mZ()0{*_-u9E{;(SpJ~Q2?e*>Z=sIR31Kh6{?ww9J3i3GNLPNjR`5`z zy#D|-EFB)v=pIAq6uTaz<{Wk9+mDD(?yE*IJ!yX#UWkZVRh}15VArm;?=h z%f7v$Hd#TYu3^hScS!x>Q9>2(okP~p-nXKa+@&!@s3uWkQX_AvNRB|$lR=}tt`Y*8 zA0WLrX4Y3Kinuk3W_!Id1oq&}K_56OfM2sOT^%SDI~L>}u{Q}M2@5{euV{8=VHC(Fcw53NN%eX-;_Y1rtbtYkAq! z)M~A^>~y$;lI18b2v$3!!R?BS6!2$PHB@@h{lU~TmY0||-St1nSiD^m`i4lDtZ%3Rd3hZ zq*h;AjWcf-kC7TSiME7=KeC~Ic zaOCxI4d>!yv;v<24^u_yX9tn^nTBU+%L;Q!v?wjKIt)6XKFSDx&BZwF)F|6eQr$~@ z2Iem-J8THsS>CkKLw0Kc=2iq(5@670JK`M-MDqtap}})A@`AY$(~{Cq)%RhatVgr> zQl^3wu*mh)K$A9$`;;>+FBmt)2t#@j!>I#7GC-B&g!66}#p9jFbvZQae00?FBuPiBYrM*YqZh)v+Ky~S66^j$ zZnx@jFY-gXgYfKw?}e5s1m__ujyGl!VqL0=9K--S6=05OaqkGa;k(4bQIk` zqVog$PAhmybI)P}0PK>5qBf-P_l@zWgso!++m|(G3W}$DtiZt9ph3WB$B%hw3UU&y zv9P+}F&+A%TE{noR^sawHam$d;`h{?*0p|F4{}`hmXua2Ju{ZP z7$GP;>Mq#o+u|0CELVzzx~;Yv1A)V;x#;zT1BsD{D+2Qc)}aB)hL%G)B48wGz8Fp# z9svH~oW7`X0d_yA>kH_cNqdLkn-1tqd)&&&$!D}$3%m6s1Xa0%%~}Iixbvt;s=@M3 zN2FU7Pz5fFS<@eP=5Re#j3u5&;-Sv|Tv!U_7isaCfZ!_8(h4A%@(q*K>Off&7#S<( zq7DLKx*b!s)V?@6wc?{-0fj(AE=9hum|z8`UUPn6R7TFO@@&z(yjcu`ISQr_V%%`J zrh0@ON=)G73$gTjN6sK=VO?`7@^pd-urwiPTouz&>46wl0~D-ZtYaDrblz5}9`Rf?yiSh^y_dC_BF_5V{HCqN{Yh485?X%8i z3qmHi!NU4_k!>{F(MErI=@|4R4_ZGFx-DwK@WAHJ6+iFyh=HY==AT|AyMncuxMAXE zwnCO?2%3QD3pj_L;AQ+lD&{)Ta?buxw;|~T*xrPC_MBMD1serp}M(SD4lakX^Ptk;o&s|+t`0+=&zpdyK|#H#GelQE}!5JihxYXsB)0PI0v zCoz3xy8O$Js|s#^*J%9eWW{~sJcXO@+vX}N-%1~OoZCVxJz%?oU~F-?ip04r`&6Q# zy*Crhth6)Yn3WyGZ2U7$kM7$H{{T#Ja4A5GK@yWh1|v%~-ybsm!FIl48Godp&^dDR z%;2eLE6>UXh+tPCSdKJ(2-~G}xVPkbhqm*v?<}n=q&n}nxfla2F6Eej(Rn6uaM9;7 zut4(~s$U^3nVptX0YaT=_KmDC4e9d%(t0t{k9$v>G=j=C*@AYboW(FCp!A}@ftVgT zi}QtW{d#?pdWRbMSRNwS1bnxTX!Dn%#Qx?nA8>u*E*D+4dsL{hj$WS76Au!8NO9s7 z7BX&%0c!X-lmzNrw^jmQi1KE5PxdxNtEh0S51{xlGSncJSj+b%cnA#WRB%9%mfLNi zD+)1piRNvG)@WJ_t2K|gj)TNZEf1t!{DMa-L$YG>(m#DN%nf=UlmZrZKe!bV4TtSh zPsOwk$u9Y8BOA+fiYjL5_9KVBhKKaZmH2~fT`Whsl1FXc2vXJDv|`&Xv1S?AK+S~k zqa{vbhr)w;K9LAa zF@XO7vqTzz8MW#)1(ua9CQZ6fo~azZqz%5%u)n|gjjGk7gwmrbU#0KTUDM{3D|;Da`G;Gm zq5M>I@D+W_$y2I*L{NWF{Hg~QkSf|Ehe^aU+SX_?pOPUg7Zr;dlrGrpGnj#QW?{f0 z_XI%&qkOxHUA?Fuh-MZ40Al0QY0}@4a0i8yt=>|40NWa8z<(xSl)BOU5VCdZN{)K0 zOZ1il8tE^&xX!0#=e0zUp!In5-06*-kvFmkjSobRbt=mZBS|tmf2RL8!c6dA^6ARZaL8*hu5mUK9cT}kA7#20dglKNCt0(x?aQ+q)4!0$DvC6`&7 z&lmMe-+VHd3&{gjIZ^|8g$KL}7R6bSig7nmfk}`hU702_`LF3UetQ1^9hivVL^q*w zG-4M(>_Cx6nNoy#h{&Qjx(jzaHpA1Mn1c-M74~KY+;Rm!Ta^ z%m;vHpmzLjAqcv~UK);XT^X+YMi#vzF6gTEm+G)K4~UwzP`)Ru;C!Xi>lYMdYqjeM zxTD-0xVA#8Cqr`xD08*`qMfmKYzSB0r=+k|tAh^TX?Bw-))7_9O>3mI1%lsN$Go|; zD@3LgO~8wEZX&_O#)vG_(gv;QDk0S>)mG^nWz3ZO2vwl;f{MqiRNfp*2n$c6>L-5; zORhJi;$OAuL5PdP0abbnW3x=p7Am9NMwB+KpYvC`J|klyCQniW%q`t>JRZP?62#rv$t#X7?lg2$C4Ss zKgSthrenkx{6s%2^dL2dw&&&q?Jfuw=U@`ZVkm`}Vate}u*#wiU`z#KD{?(h_al%3 z9!dC$r(Y4P6bGM$z+qFNvM&!2bV{r$?%i+9B`{npV`o0rU-Bdkyj)SlDdiQr+be~@ z0B!)AA@qOQZcr8-B5tK1P_r<4r*nv1J>?@~QGDE>yUMqtwZy}=jz(TxmmDv#Dd4=2 zYPR)Z4+uuc0f|Pqe$@(vX|Y81yn3XZcFVUAiYRAmM zO}0h+7x))2EX1@!oPW86JVXnG8iNK1=VVpxzXinUcbV>Q%p*ox^XV!FEXr-i#2bRq zc#4{U#?=HX(5<~ChR4!Tc>(2xCHvJTu`WB!2n|zDk`~~V^*k7e&MRr|zez@^qr?IO zps?xlQ4bP;nrNv-3}DxBfk0*r5nKFD3yvArIFt;BQI{=wOD%yw(d`PhZ*s0|-r@}w z9phXCW7)v-j*$2p&*p6QozxO92$=Pq_0ZGJd7J?wpHb!;0g9SwgvLH;T^ zJz|_ai^AJ)h;%(8OR)vw3_;xWKZ#!+c0AYOZ$c0Et`to1H?iLt}nEB zI7|42DRws6{{Tq4On5;m#-=Vqk;|jTW!Fe6v{!zRYfX!If~-0(bNiMNUBs3u#*Dr$ zHro13@@061qN_6iTe79`L>rckgSQvg%&^_H(ms?6)3G{1M-68$_IZ{o+U{K4e9OSp jGCiBr!egUPs6(59Ul3G0hPy}k9KU=UCx_HMj}!mdHfE7; literal 0 HcmV?d00001 diff --git a/images/street.jpg b/images/street.jpg new file mode 100644 index 0000000000000000000000000000000000000000..45b53b35c13bc84256d669f4a302d208335b934f GIT binary patch literal 71403 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 00000000..59e8dc21 --- /dev/null +++ b/index.html @@ -0,0 +1,33 @@ + + + + + + + VSLAM App + + + + +
+ + + +
+
+ + +
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/main.css b/main.css new file mode 100644 index 00000000..858453e9 --- /dev/null +++ b/main.css @@ -0,0 +1,16 @@ +table, th, td { + border: 1px solid black; + border-style: dotted; + border-collapse: collapse; + padding: 10px; + } + +#canvasWrapper { + position: relative; + padding: 10px; + margin: 10px; +} + +canvas { + position: absolute; +} \ No newline at end of file diff --git a/server-temp/main.py b/server-temp/main.py new file mode 100644 index 00000000..045f0324 --- /dev/null +++ b/server-temp/main.py @@ -0,0 +1,47 @@ +from flask import Flask +import json + +app = Flask(__name__) + +@app.route("/") +def hello_world(): + return "

Hello, World!

" + +@app.route("/getJSON") +def getJSON(): + data = { + "A" : { + "0" : ["x", "y", "z"], + "1" : ["x", "y", "z"], + "2" : ["x", "y", "z"], + "3" : ["x", "y", "z"], + "4" : ["x", "y", "z"], + }, + "B" : { + "0" : ["x", "y", "z"], + "1" : ["x", "y", "z"], + "2" : ["x", "y", "z"], + "3" : ["x", "y", "z"], + "4" : ["x", "y", "z"], + "5" : ["x", "y", "z"], + }, + "C" : { + "0" : ["x", "y", "z"], + "1" : ["x", "y", "z"], + "2" : ["x", "y", "z"], + }, + "D" : { + "0" : ["x", "y", "z"], + "1" : ["x", "y", "z"], + "2" : ["x", "y", "z"], + "3" : ["x", "y", "z"], + "4" : ["x", "y", "z"], + "5" : ["x", "y", "z"], + "6" : ["x", "y", "z"] + } + } + + return json.dumps(data) + +if __name__ == "__main__": + app.run() \ No newline at end of file diff --git a/server-temp/venv/bin/Activate.ps1 b/server-temp/venv/bin/Activate.ps1 new file mode 100644 index 00000000..b49d77ba --- /dev/null +++ b/server-temp/venv/bin/Activate.ps1 @@ -0,0 +1,247 @@ +<# +.Synopsis +Activate a Python virtual environment for the current PowerShell session. + +.Description +Pushes the python executable for a virtual environment to the front of the +$Env:PATH environment variable and sets the prompt to signify that you are +in a Python virtual environment. Makes use of the command line switches as +well as the `pyvenv.cfg` file values present in the virtual environment. + +.Parameter VenvDir +Path to the directory that contains the virtual environment to activate. The +default value for this is the parent of the directory that the Activate.ps1 +script is located within. + +.Parameter Prompt +The prompt prefix to display when this virtual environment is activated. By +default, this prompt is the name of the virtual environment folder (VenvDir) +surrounded by parentheses and followed by a single space (ie. '(.venv) '). + +.Example +Activate.ps1 +Activates the Python virtual environment that contains the Activate.ps1 script. + +.Example +Activate.ps1 -Verbose +Activates the Python virtual environment that contains the Activate.ps1 script, +and shows extra information about the activation as it executes. + +.Example +Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv +Activates the Python virtual environment located in the specified location. + +.Example +Activate.ps1 -Prompt "MyPython" +Activates the Python virtual environment that contains the Activate.ps1 script, +and prefixes the current prompt with the specified string (surrounded in +parentheses) while the virtual environment is active. + +.Notes +On Windows, it may be required to enable this Activate.ps1 script by setting the +execution policy for the user. You can do this by issuing the following PowerShell +command: + +PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser + +For more information on Execution Policies: +https://go.microsoft.com/fwlink/?LinkID=135170 + +#> +Param( + [Parameter(Mandatory = $false)] + [String] + $VenvDir, + [Parameter(Mandatory = $false)] + [String] + $Prompt +) + +<# Function declarations --------------------------------------------------- #> + +<# +.Synopsis +Remove all shell session elements added by the Activate script, including the +addition of the virtual environment's Python executable from the beginning of +the PATH variable. + +.Parameter NonDestructive +If present, do not remove this function from the global namespace for the +session. + +#> +function global:deactivate ([switch]$NonDestructive) { + # Revert to original values + + # The prior prompt: + if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { + Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt + Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT + } + + # The prior PYTHONHOME: + if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { + Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME + Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME + } + + # The prior PATH: + if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { + Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH + Remove-Item -Path Env:_OLD_VIRTUAL_PATH + } + + # Just remove the VIRTUAL_ENV altogether: + if (Test-Path -Path Env:VIRTUAL_ENV) { + Remove-Item -Path env:VIRTUAL_ENV + } + + # Just remove VIRTUAL_ENV_PROMPT altogether. + if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) { + Remove-Item -Path env:VIRTUAL_ENV_PROMPT + } + + # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: + if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { + Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force + } + + # Leave deactivate function in the global namespace if requested: + if (-not $NonDestructive) { + Remove-Item -Path function:deactivate + } +} + +<# +.Description +Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the +given folder, and returns them in a map. + +For each line in the pyvenv.cfg file, if that line can be parsed into exactly +two strings separated by `=` (with any amount of whitespace surrounding the =) +then it is considered a `key = value` line. The left hand string is the key, +the right hand is the value. + +If the value starts with a `'` or a `"` then the first and last character is +stripped from the value before being captured. + +.Parameter ConfigDir +Path to the directory that contains the `pyvenv.cfg` file. +#> +function Get-PyVenvConfig( + [String] + $ConfigDir +) { + Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" + + # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). + $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue + + # An empty map will be returned if no config file is found. + $pyvenvConfig = @{ } + + if ($pyvenvConfigPath) { + + Write-Verbose "File exists, parse `key = value` lines" + $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath + + $pyvenvConfigContent | ForEach-Object { + $keyval = $PSItem -split "\s*=\s*", 2 + if ($keyval[0] -and $keyval[1]) { + $val = $keyval[1] + + # Remove extraneous quotations around a string value. + if ("'""".Contains($val.Substring(0, 1))) { + $val = $val.Substring(1, $val.Length - 2) + } + + $pyvenvConfig[$keyval[0]] = $val + Write-Verbose "Adding Key: '$($keyval[0])'='$val'" + } + } + } + return $pyvenvConfig +} + + +<# Begin Activate script --------------------------------------------------- #> + +# Determine the containing directory of this script +$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition +$VenvExecDir = Get-Item -Path $VenvExecPath + +Write-Verbose "Activation script is located in path: '$VenvExecPath'" +Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" +Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" + +# Set values required in priority: CmdLine, ConfigFile, Default +# First, get the location of the virtual environment, it might not be +# VenvExecDir if specified on the command line. +if ($VenvDir) { + Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" +} +else { + Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." + $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") + Write-Verbose "VenvDir=$VenvDir" +} + +# Next, read the `pyvenv.cfg` file to determine any required value such +# as `prompt`. +$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir + +# Next, set the prompt from the command line, or the config file, or +# just use the name of the virtual environment folder. +if ($Prompt) { + Write-Verbose "Prompt specified as argument, using '$Prompt'" +} +else { + Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" + if ($pyvenvCfg -and $pyvenvCfg['prompt']) { + Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" + $Prompt = $pyvenvCfg['prompt']; + } + else { + Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)" + Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" + $Prompt = Split-Path -Path $venvDir -Leaf + } +} + +Write-Verbose "Prompt = '$Prompt'" +Write-Verbose "VenvDir='$VenvDir'" + +# Deactivate any currently active virtual environment, but leave the +# deactivate function in place. +deactivate -nondestructive + +# Now set the environment variable VIRTUAL_ENV, used by many tools to determine +# that there is an activated venv. +$env:VIRTUAL_ENV = $VenvDir + +if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { + + Write-Verbose "Setting prompt to '$Prompt'" + + # Set the prompt to include the env name + # Make sure _OLD_VIRTUAL_PROMPT is global + function global:_OLD_VIRTUAL_PROMPT { "" } + Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT + New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt + + function global:prompt { + Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " + _OLD_VIRTUAL_PROMPT + } + $env:VIRTUAL_ENV_PROMPT = $Prompt +} + +# Clear PYTHONHOME +if (Test-Path -Path Env:PYTHONHOME) { + Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME + Remove-Item -Path Env:PYTHONHOME +} + +# Add the venv to the PATH +Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH +$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/server-temp/venv/bin/activate b/server-temp/venv/bin/activate new file mode 100644 index 00000000..4f1a81af --- /dev/null +++ b/server-temp/venv/bin/activate @@ -0,0 +1,69 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + +deactivate () { + # reset old environment variables + if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then + PATH="${_OLD_VIRTUAL_PATH:-}" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then + PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r 2> /dev/null + fi + + if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then + PS1="${_OLD_VIRTUAL_PS1:-}" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + unset VIRTUAL_ENV_PROMPT + if [ ! "${1:-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV="/Users/sam/Documents/Documents/BU/EC504/FinalProjFrontEnd/server/venv" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + PS1="(venv) ${PS1:-}" + export PS1 + VIRTUAL_ENV_PROMPT="(venv) " + export VIRTUAL_ENV_PROMPT +fi + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r 2> /dev/null +fi diff --git a/server-temp/venv/bin/activate.csh b/server-temp/venv/bin/activate.csh new file mode 100644 index 00000000..376b9366 --- /dev/null +++ b/server-temp/venv/bin/activate.csh @@ -0,0 +1,26 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . +# Ported to Python 3.3 venv by Andrew Svetlov + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/Users/sam/Documents/Documents/BU/EC504/FinalProjFrontEnd/server/venv" + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/bin:$PATH" + + +set _OLD_VIRTUAL_PROMPT="$prompt" + +if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then + set prompt = "(venv) $prompt" + setenv VIRTUAL_ENV_PROMPT "(venv) " +endif + +alias pydoc python -m pydoc + +rehash diff --git a/server-temp/venv/bin/activate.fish b/server-temp/venv/bin/activate.fish new file mode 100644 index 00000000..9875effc --- /dev/null +++ b/server-temp/venv/bin/activate.fish @@ -0,0 +1,69 @@ +# This file must be used with "source /bin/activate.fish" *from fish* +# (https://fishshell.com/); you cannot run it directly. + +function deactivate -d "Exit virtual environment and return to normal shell environment" + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + set -gx PATH $_OLD_VIRTUAL_PATH + set -e _OLD_VIRTUAL_PATH + end + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + set -e _OLD_FISH_PROMPT_OVERRIDE + # prevents error when using nested fish instances (Issue #93858) + if functions -q _old_fish_prompt + functions -e fish_prompt + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + end + end + + set -e VIRTUAL_ENV + set -e VIRTUAL_ENV_PROMPT + if test "$argv[1]" != "nondestructive" + # Self-destruct! + functions -e deactivate + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV "/Users/sam/Documents/Documents/BU/EC504/FinalProjFrontEnd/server/venv" + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/bin" $PATH + +# Unset PYTHONHOME if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # fish uses a function instead of an env var to generate the prompt. + + # Save the current fish_prompt function as the function _old_fish_prompt. + functions -c fish_prompt _old_fish_prompt + + # With the original prompt function renamed, we can override with our own. + function fish_prompt + # Save the return status of the last command. + set -l old_status $status + + # Output the venv prompt; color taken from the blue of the Python logo. + printf "%s%s%s" (set_color 4B8BBE) "(venv) " (set_color normal) + + # Restore the return status of the previous command. + echo "exit $old_status" | . + # Output the original/"old" prompt. + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" + set -gx VIRTUAL_ENV_PROMPT "(venv) " +end diff --git a/server-temp/venv/bin/flask b/server-temp/venv/bin/flask new file mode 100755 index 00000000..56d945a0 --- /dev/null +++ b/server-temp/venv/bin/flask @@ -0,0 +1,8 @@ +#!/Users/sam/Documents/Documents/BU/EC504/FinalProjFrontEnd/server/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/server-temp/venv/bin/pip b/server-temp/venv/bin/pip new file mode 100755 index 00000000..fc4ed3fe --- /dev/null +++ b/server-temp/venv/bin/pip @@ -0,0 +1,8 @@ +#!/Users/sam/Documents/Documents/BU/EC504/FinalProjFrontEnd/server/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/server-temp/venv/bin/pip3 b/server-temp/venv/bin/pip3 new file mode 100755 index 00000000..fc4ed3fe --- /dev/null +++ b/server-temp/venv/bin/pip3 @@ -0,0 +1,8 @@ +#!/Users/sam/Documents/Documents/BU/EC504/FinalProjFrontEnd/server/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/server-temp/venv/bin/pip3.10 b/server-temp/venv/bin/pip3.10 new file mode 100755 index 00000000..fc4ed3fe --- /dev/null +++ b/server-temp/venv/bin/pip3.10 @@ -0,0 +1,8 @@ +#!/Users/sam/Documents/Documents/BU/EC504/FinalProjFrontEnd/server/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/server-temp/venv/bin/python b/server-temp/venv/bin/python new file mode 120000 index 00000000..b8a0adbb --- /dev/null +++ b/server-temp/venv/bin/python @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/server-temp/venv/bin/python3 b/server-temp/venv/bin/python3 new file mode 120000 index 00000000..1ec499c5 --- /dev/null +++ b/server-temp/venv/bin/python3 @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.10/bin/python3 \ No newline at end of file diff --git a/server-temp/venv/bin/python3.10 b/server-temp/venv/bin/python3.10 new file mode 120000 index 00000000..b8a0adbb --- /dev/null +++ b/server-temp/venv/bin/python3.10 @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/INSTALLER b/server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/LICENSE.rst b/server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/LICENSE.rst new file mode 100644 index 00000000..c37cae49 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.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/server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/METADATA b/server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/METADATA new file mode 100644 index 00000000..56e94290 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/METADATA @@ -0,0 +1,105 @@ +Metadata-Version: 2.1 +Name: Jinja2 +Version: 3.1.3 +Summary: A very fast and expressive template engine. +Home-page: https://palletsprojects.com/p/jinja/ +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://jinja.palletsprojects.com/ +Project-URL: Changes, https://jinja.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/jinja/ +Project-URL: Issue Tracker, https://github.com/pallets/jinja/issues/ +Project-URL: Chat, https://discord.gg/pallets +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: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst +Requires-Dist: MarkupSafe >=2.0 +Provides-Extra: i18n +Requires-Dist: Babel >=2.7 ; extra == 'i18n' + +Jinja +===== + +Jinja is a fast, expressive, extensible templating engine. Special +placeholders in the template allow writing code similar to Python +syntax. Then the template is passed data to render the final document. + +It includes: + +- Template inheritance and inclusion. +- Define and import macros within templates. +- HTML templates can use autoescaping to prevent XSS from untrusted + user input. +- A sandboxed environment can safely render untrusted templates. +- AsyncIO support for generating templates and calling async + functions. +- I18N support with Babel. +- Templates are compiled to optimized Python code just-in-time and + cached, or can be compiled ahead-of-time. +- Exceptions point to the correct line in templates to make debugging + easier. +- Extensible filters, tests, functions, and even syntax. + +Jinja's philosophy is that while application logic belongs in Python if +possible, it shouldn't make the template designer's job difficult by +restricting functionality too much. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U Jinja2 + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +In A Nutshell +------------- + +.. code-block:: jinja + + {% extends "base.html" %} + {% block title %}Members{% endblock %} + {% block content %} + + {% endblock %} + + +Donate +------ + +The Pallets organization develops and supports Jinja and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://jinja.palletsprojects.com/ +- Changes: https://jinja.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/Jinja2/ +- Source Code: https://github.com/pallets/jinja/ +- Issue Tracker: https://github.com/pallets/jinja/issues/ +- Chat: https://discord.gg/pallets diff --git a/server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/RECORD b/server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/RECORD new file mode 100644 index 00000000..8a511ac0 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/RECORD @@ -0,0 +1,58 @@ +Jinja2-3.1.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Jinja2-3.1.3.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +Jinja2-3.1.3.dist-info/METADATA,sha256=0cLNbRCI91jytc7Bzv3XAQfZzFDF2gxkJuH46eF5vew,3301 +Jinja2-3.1.3.dist-info/RECORD,, +Jinja2-3.1.3.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 +Jinja2-3.1.3.dist-info/entry_points.txt,sha256=zRd62fbqIyfUpsRtU7EVIFyiu1tPwfgO7EvPErnxgTE,59 +Jinja2-3.1.3.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7 +jinja2/__init__.py,sha256=NTBwMwsECrdHmxeXF7seusHLzrh6Ldn1A9qhS5cDuf0,1927 +jinja2/__pycache__/__init__.cpython-310.pyc,, +jinja2/__pycache__/_identifier.cpython-310.pyc,, +jinja2/__pycache__/async_utils.cpython-310.pyc,, +jinja2/__pycache__/bccache.cpython-310.pyc,, +jinja2/__pycache__/compiler.cpython-310.pyc,, +jinja2/__pycache__/constants.cpython-310.pyc,, +jinja2/__pycache__/debug.cpython-310.pyc,, +jinja2/__pycache__/defaults.cpython-310.pyc,, +jinja2/__pycache__/environment.cpython-310.pyc,, +jinja2/__pycache__/exceptions.cpython-310.pyc,, +jinja2/__pycache__/ext.cpython-310.pyc,, +jinja2/__pycache__/filters.cpython-310.pyc,, +jinja2/__pycache__/idtracking.cpython-310.pyc,, +jinja2/__pycache__/lexer.cpython-310.pyc,, +jinja2/__pycache__/loaders.cpython-310.pyc,, +jinja2/__pycache__/meta.cpython-310.pyc,, +jinja2/__pycache__/nativetypes.cpython-310.pyc,, +jinja2/__pycache__/nodes.cpython-310.pyc,, +jinja2/__pycache__/optimizer.cpython-310.pyc,, +jinja2/__pycache__/parser.cpython-310.pyc,, +jinja2/__pycache__/runtime.cpython-310.pyc,, +jinja2/__pycache__/sandbox.cpython-310.pyc,, +jinja2/__pycache__/tests.cpython-310.pyc,, +jinja2/__pycache__/utils.cpython-310.pyc,, +jinja2/__pycache__/visitor.cpython-310.pyc,, +jinja2/_identifier.py,sha256=_zYctNKzRqlk_murTNlzrju1FFJL7Va_Ijqqd7ii2lU,1958 +jinja2/async_utils.py,sha256=dFcmh6lMNfbh7eLKrBio8JqAKLHdZbpCuurFN4OERtY,2447 +jinja2/bccache.py,sha256=mhz5xtLxCcHRAa56azOhphIAe19u1we0ojifNMClDio,14061 +jinja2/compiler.py,sha256=PJzYdRLStlEOqmnQs1YxlizPrJoj3jTZuUleREn6AIQ,72199 +jinja2/constants.py,sha256=GMoFydBF_kdpaRKPoM5cl5MviquVRLVyZtfp5-16jg0,1433 +jinja2/debug.py,sha256=iWJ432RadxJNnaMOPrjIDInz50UEgni3_HKuFXi2vuQ,6299 +jinja2/defaults.py,sha256=boBcSw78h-lp20YbaXSJsqkAI2uN_mD_TtCydpeq5wU,1267 +jinja2/environment.py,sha256=0qldX3VQKZcm6lgn7zHz94oRFow7YPYERiqkquomNjU,61253 +jinja2/exceptions.py,sha256=ioHeHrWwCWNaXX1inHmHVblvc4haO7AXsjCp3GfWvx0,5071 +jinja2/ext.py,sha256=5fnMpllaXkfm2P_93RIvi-OnK7Tk8mCW8Du-GcD12Hc,31844 +jinja2/filters.py,sha256=vYjKb2zaPShvYtn_LpSmqfS8SScbrA_KOanNibsMDIE,53862 +jinja2/idtracking.py,sha256=GfNmadir4oDALVxzn3DL9YInhJDr69ebXeA2ygfuCGA,10704 +jinja2/lexer.py,sha256=DW2nX9zk-6MWp65YR2bqqj0xqCvLtD-u9NWT8AnFRxQ,29726 +jinja2/loaders.py,sha256=ayAwxfrA1SAffQta0nwSDm3TDT4KYiIGN_D9Z45B310,23085 +jinja2/meta.py,sha256=GNPEvifmSaU3CMxlbheBOZjeZ277HThOPUTf1RkppKQ,4396 +jinja2/nativetypes.py,sha256=7GIGALVJgdyL80oZJdQUaUfwSt5q2lSSZbXt0dNf_M4,4210 +jinja2/nodes.py,sha256=i34GPRAZexXMT6bwuf5SEyvdmS-bRCy9KMjwN5O6pjk,34550 +jinja2/optimizer.py,sha256=tHkMwXxfZkbfA1KmLcqmBMSaz7RLIvvItrJcPoXTyD8,1650 +jinja2/parser.py,sha256=Y199wPL-G67gJoi5G_5sHuu9uEP1PJkjjLEW_xTH8-k,39736 +jinja2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +jinja2/runtime.py,sha256=_6LkKIWFJjQdqlrgA3K39zBFQ-7Orm3wGDm96RwxQoE,33406 +jinja2/sandbox.py,sha256=Y0xZeXQnH6EX5VjaV2YixESxoepnRbW_3UeQosaBU3M,14584 +jinja2/tests.py,sha256=Am5Z6Lmfr2XaH_npIfJJ8MdXtWsbLjMULZJulTAj30E,5905 +jinja2/utils.py,sha256=IMwRIcN1SsTw2-jdQtlH2KzNABsXZBW_-tnFXafQBvY,23933 +jinja2/visitor.py,sha256=MH14C6yq24G_KVtWzjwaI7Wg14PCJIYlWW1kpkxYak0,3568 diff --git a/server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/WHEEL b/server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/WHEEL new file mode 100644 index 00000000..98c0d20b --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.42.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/entry_points.txt b/server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/entry_points.txt new file mode 100644 index 00000000..7b9666c8 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[babel.extractors] +jinja2 = jinja2.ext:babel_extract[i18n] diff --git a/server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/top_level.txt b/server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/top_level.txt new file mode 100644 index 00000000..7f7afbf3 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/Jinja2-3.1.3.dist-info/top_level.txt @@ -0,0 +1 @@ +jinja2 diff --git a/server-temp/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/INSTALLER b/server-temp/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/server-temp/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/LICENSE.rst b/server-temp/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/LICENSE.rst new file mode 100644 index 00000000..9d227a0c --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2010 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/server-temp/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/METADATA b/server-temp/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/METADATA new file mode 100644 index 00000000..dfe37d52 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/METADATA @@ -0,0 +1,93 @@ +Metadata-Version: 2.1 +Name: MarkupSafe +Version: 2.1.5 +Summary: Safely add untrusted strings to HTML/XML markup. +Home-page: https://palletsprojects.com/p/markupsafe/ +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://markupsafe.palletsprojects.com/ +Project-URL: Changes, https://markupsafe.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/markupsafe/ +Project-URL: Issue Tracker, https://github.com/pallets/markupsafe/issues/ +Project-URL: Chat, https://discord.gg/pallets +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: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst + +MarkupSafe +========== + +MarkupSafe implements a text object that escapes characters so it is +safe to use in HTML and XML. Characters that have special meanings are +replaced so that they display as the actual characters. This mitigates +injection attacks, meaning untrusted user input can safely be displayed +on a page. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U MarkupSafe + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +Examples +-------- + +.. code-block:: pycon + + >>> from markupsafe import Markup, escape + + >>> # escape replaces special characters and wraps in Markup + >>> escape("") + Markup('<script>alert(document.cookie);</script>') + + >>> # wrap in Markup to mark text "safe" and prevent escaping + >>> Markup("Hello") + Markup('hello') + + >>> escape(Markup("Hello")) + Markup('hello') + + >>> # Markup is a str subclass + >>> # methods and operators escape their arguments + >>> template = Markup("Hello {name}") + >>> template.format(name='"World"') + Markup('Hello "World"') + + +Donate +------ + +The Pallets organization develops and supports MarkupSafe and other +popular packages. In order to grow the community of contributors and +users, and allow the maintainers to devote more time to the projects, +`please donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://markupsafe.palletsprojects.com/ +- Changes: https://markupsafe.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/MarkupSafe/ +- Source Code: https://github.com/pallets/markupsafe/ +- Issue Tracker: https://github.com/pallets/markupsafe/issues/ +- Chat: https://discord.gg/pallets diff --git a/server-temp/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/RECORD b/server-temp/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/RECORD new file mode 100644 index 00000000..3b339360 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/RECORD @@ -0,0 +1,14 @@ +MarkupSafe-2.1.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +MarkupSafe-2.1.5.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +MarkupSafe-2.1.5.dist-info/METADATA,sha256=2dRDPam6OZLfpX0wg1JN5P3u9arqACxVSfdGmsJU7o8,3003 +MarkupSafe-2.1.5.dist-info/RECORD,, +MarkupSafe-2.1.5.dist-info/WHEEL,sha256=quc6KPsQ_p8Uswd5yj8hDZg5y2ghFxeobjm5cM_ymZ0,115 +MarkupSafe-2.1.5.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 +markupsafe/__init__.py,sha256=r7VOTjUq7EMQ4v3p4R1LoVOGJg6ysfYRncLr34laRBs,10958 +markupsafe/__pycache__/__init__.cpython-310.pyc,, +markupsafe/__pycache__/_native.cpython-310.pyc,, +markupsafe/_native.py,sha256=GR86Qvo_GcgKmKreA1WmYN9ud17OFwkww8E-fiW-57s,1713 +markupsafe/_speedups.c,sha256=X2XvQVtIdcK4Usz70BvkzoOfjTCmQlDkkjYSn-swE0g,7083 +markupsafe/_speedups.cpython-310-darwin.so,sha256=kGew1_uJrdmzK1R0Cut4aicFEdO1w0R0W4cBCxi9G7A,117484 +markupsafe/_speedups.pyi,sha256=vfMCsOgbAXRNLUXkyuyonG8uEWKYU4PDqNuMaDELAYw,229 +markupsafe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/server-temp/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/WHEEL b/server-temp/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/WHEEL new file mode 100644 index 00000000..2c14d046 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.42.0) +Root-Is-Purelib: false +Tag: cp310-cp310-macosx_10_9_universal2 + diff --git a/server-temp/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/top_level.txt b/server-temp/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/top_level.txt new file mode 100644 index 00000000..75bf7292 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/top_level.txt @@ -0,0 +1 @@ +markupsafe diff --git a/server-temp/venv/lib/python3.10/site-packages/_distutils_hack/__init__.py b/server-temp/venv/lib/python3.10/site-packages/_distutils_hack/__init__.py new file mode 100644 index 00000000..f987a536 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/_distutils_hack/__init__.py @@ -0,0 +1,222 @@ +# don't import any costly modules +import sys +import os + + +is_pypy = '__pypy__' in sys.builtin_module_names + + +def warn_distutils_present(): + if 'distutils' not in sys.modules: + return + if is_pypy and sys.version_info < (3, 7): + # PyPy for 3.6 unconditionally imports distutils, so bypass the warning + # https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250 + return + import warnings + + warnings.warn( + "Distutils was imported before Setuptools, but importing Setuptools " + "also replaces the `distutils` module in `sys.modules`. This may lead " + "to undesirable behaviors or errors. To avoid these issues, avoid " + "using distutils directly, ensure that setuptools is installed in the " + "traditional way (e.g. not an editable install), and/or make sure " + "that setuptools is always imported before distutils." + ) + + +def clear_distutils(): + if 'distutils' not in sys.modules: + return + import warnings + + warnings.warn("Setuptools is replacing distutils.") + mods = [ + name + for name in sys.modules + if name == "distutils" or name.startswith("distutils.") + ] + for name in mods: + del sys.modules[name] + + +def enabled(): + """ + Allow selection of distutils by environment variable. + """ + which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'local') + return which == 'local' + + +def ensure_local_distutils(): + import importlib + + clear_distutils() + + # With the DistutilsMetaFinder in place, + # perform an import to cause distutils to be + # loaded from setuptools._distutils. Ref #2906. + with shim(): + importlib.import_module('distutils') + + # check that submodules load as expected + core = importlib.import_module('distutils.core') + assert '_distutils' in core.__file__, core.__file__ + assert 'setuptools._distutils.log' not in sys.modules + + +def do_override(): + """ + Ensure that the local copy of distutils is preferred over stdlib. + + See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401 + for more motivation. + """ + if enabled(): + warn_distutils_present() + ensure_local_distutils() + + +class _TrivialRe: + def __init__(self, *patterns): + self._patterns = patterns + + def match(self, string): + return all(pat in string for pat in self._patterns) + + +class DistutilsMetaFinder: + def find_spec(self, fullname, path, target=None): + # optimization: only consider top level modules and those + # found in the CPython test suite. + if path is not None and not fullname.startswith('test.'): + return + + method_name = 'spec_for_{fullname}'.format(**locals()) + method = getattr(self, method_name, lambda: None) + return method() + + def spec_for_distutils(self): + if self.is_cpython(): + return + + import importlib + import importlib.abc + import importlib.util + + try: + mod = importlib.import_module('setuptools._distutils') + except Exception: + # There are a couple of cases where setuptools._distutils + # may not be present: + # - An older Setuptools without a local distutils is + # taking precedence. Ref #2957. + # - Path manipulation during sitecustomize removes + # setuptools from the path but only after the hook + # has been loaded. Ref #2980. + # In either case, fall back to stdlib behavior. + return + + class DistutilsLoader(importlib.abc.Loader): + def create_module(self, spec): + mod.__name__ = 'distutils' + return mod + + def exec_module(self, module): + pass + + return importlib.util.spec_from_loader( + 'distutils', DistutilsLoader(), origin=mod.__file__ + ) + + @staticmethod + def is_cpython(): + """ + Suppress supplying distutils for CPython (build and tests). + Ref #2965 and #3007. + """ + return os.path.isfile('pybuilddir.txt') + + def spec_for_pip(self): + """ + Ensure stdlib distutils when running under pip. + See pypa/pip#8761 for rationale. + """ + if self.pip_imported_during_build(): + return + clear_distutils() + self.spec_for_distutils = lambda: None + + @classmethod + def pip_imported_during_build(cls): + """ + Detect if pip is being imported in a build script. Ref #2355. + """ + import traceback + + return any( + cls.frame_file_is_setup(frame) for frame, line in traceback.walk_stack(None) + ) + + @staticmethod + def frame_file_is_setup(frame): + """ + Return True if the indicated frame suggests a setup.py file. + """ + # some frames may not have __file__ (#2940) + return frame.f_globals.get('__file__', '').endswith('setup.py') + + def spec_for_sensitive_tests(self): + """ + Ensure stdlib distutils when running select tests under CPython. + + python/cpython#91169 + """ + clear_distutils() + self.spec_for_distutils = lambda: None + + sensitive_tests = ( + [ + 'test.test_distutils', + 'test.test_peg_generator', + 'test.test_importlib', + ] + if sys.version_info < (3, 10) + else [ + 'test.test_distutils', + ] + ) + + +for name in DistutilsMetaFinder.sensitive_tests: + setattr( + DistutilsMetaFinder, + f'spec_for_{name}', + DistutilsMetaFinder.spec_for_sensitive_tests, + ) + + +DISTUTILS_FINDER = DistutilsMetaFinder() + + +def add_shim(): + DISTUTILS_FINDER in sys.meta_path or insert_shim() + + +class shim: + def __enter__(self): + insert_shim() + + def __exit__(self, exc, value, tb): + remove_shim() + + +def insert_shim(): + sys.meta_path.insert(0, DISTUTILS_FINDER) + + +def remove_shim(): + try: + sys.meta_path.remove(DISTUTILS_FINDER) + except ValueError: + pass diff --git a/server-temp/venv/lib/python3.10/site-packages/_distutils_hack/__pycache__/__init__.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/_distutils_hack/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa36d5e3162e8625e36f6dfce84a108b5e39d300 GIT binary patch literal 7617 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 aYNhJ9+a|;RbdXxuf3QnV0TpzoV*L^21t)U= literal 0 HcmV?d00001 diff --git a/server-temp/venv/lib/python3.10/site-packages/_distutils_hack/__pycache__/override.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/_distutils_hack/__pycache__/override.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ae5cbf349c27f899fd426bb655daa0a2cebacdf2 GIT binary patch literal 270 zcmd1j<>g`kf<9TcG#w!Q7{oyaOhAqU5ElyoiByIZhGxbEj0+hU8B!R788n%q_~TPD zi%UvNGINUKGZK@t{WO_wamB}H<`(1^mBhzKai`?R=a;1x6=kNRu4E_z83!hQ)#-;8 zrxq3K7boWGyW}UA=BDPA6eF>mLiJspO$|)+-7@nMa{`L;v)qdE^GaOvQuKlPfF|mf zrRJ6C=VT`77gUyH +Maintainer-email: Pallets Ecosystem +Requires-Python: >=3.8 +Description-Content-Type: text/x-rst +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 +Classifier: Topic :: Software Development :: Libraries +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://blinker.readthedocs.io +Project-URL: Homepage, https://blinker.readthedocs.io +Project-URL: Issue Tracker, https://github.com/pallets-eco/blinker/issues/ +Project-URL: Source Code, https://github.com/pallets-eco/blinker/ + +Blinker +======= + +Blinker provides a fast dispatching system that allows any number of +interested parties to subscribe to events, or "signals". + +Signal receivers can subscribe to specific senders or receive signals +sent by any sender. + +.. code-block:: pycon + + >>> from blinker import signal + >>> started = signal('round-started') + >>> def each(round): + ... print(f"Round {round}") + ... + >>> started.connect(each) + + >>> def round_two(round): + ... print("This is round two.") + ... + >>> started.connect(round_two, sender=2) + + >>> for round in range(1, 4): + ... started.send(round) + ... + Round 1! + Round 2! + This is round two. + Round 3! + + +Links +----- + +- Documentation: https://blinker.readthedocs.io/ +- Changes: https://blinker.readthedocs.io/#changes +- PyPI Releases: https://pypi.org/project/blinker/ +- Source Code: https://github.com/pallets-eco/blinker/ +- Issue Tracker: https://github.com/pallets-eco/blinker/issues/ + diff --git a/server-temp/venv/lib/python3.10/site-packages/blinker-1.7.0.dist-info/RECORD b/server-temp/venv/lib/python3.10/site-packages/blinker-1.7.0.dist-info/RECORD new file mode 100644 index 00000000..51a7d03e --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/blinker-1.7.0.dist-info/RECORD @@ -0,0 +1,14 @@ +blinker-1.7.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +blinker-1.7.0.dist-info/LICENSE.rst,sha256=nrc6HzhZekqhcCXSrhvjg5Ykx5XphdTw6Xac4p-spGc,1054 +blinker-1.7.0.dist-info/METADATA,sha256=kDgzPgrw4he78pEX88bSAqwYMVWrfUMk8QmNjekjg_U,1918 +blinker-1.7.0.dist-info/RECORD,, +blinker-1.7.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +blinker/__init__.py,sha256=s75XaRDHwSDzZ21BZUOEkQDQIcQEyT8hT7vk3EhYFQU,408 +blinker/__pycache__/__init__.cpython-310.pyc,, +blinker/__pycache__/_saferef.cpython-310.pyc,, +blinker/__pycache__/_utilities.cpython-310.pyc,, +blinker/__pycache__/base.cpython-310.pyc,, +blinker/_saferef.py,sha256=kWOTIWnCY3kOb8lZP74Rbx7bR_BLVg4TjwzNCRLhKHs,9096 +blinker/_utilities.py,sha256=S2njKDmlBpK_yCK4RT8hq98hEj30I0TQCC5mNhtY22I,2856 +blinker/base.py,sha256=FqZmAI5YzuRrvRmye1Jb-utyVOjXtF5vUVP3-1u-HtU,20544 +blinker/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/server-temp/venv/lib/python3.10/site-packages/blinker-1.7.0.dist-info/WHEEL b/server-temp/venv/lib/python3.10/site-packages/blinker-1.7.0.dist-info/WHEEL new file mode 100644 index 00000000..3b5e64b5 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/blinker-1.7.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.9.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/server-temp/venv/lib/python3.10/site-packages/blinker/__init__.py b/server-temp/venv/lib/python3.10/site-packages/blinker/__init__.py new file mode 100644 index 00000000..d014caa0 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/blinker/__init__.py @@ -0,0 +1,19 @@ +from blinker.base import ANY +from blinker.base import NamedSignal +from blinker.base import Namespace +from blinker.base import receiver_connected +from blinker.base import Signal +from blinker.base import signal +from blinker.base import WeakNamespace + +__all__ = [ + "ANY", + "NamedSignal", + "Namespace", + "Signal", + "WeakNamespace", + "receiver_connected", + "signal", +] + +__version__ = "1.7.0" diff --git a/server-temp/venv/lib/python3.10/site-packages/blinker/__pycache__/__init__.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/blinker/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..639aaa9149e121c4f8e086c3762c211ef5d20db9 GIT binary patch literal 534 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 literal 0 HcmV?d00001 diff --git a/server-temp/venv/lib/python3.10/site-packages/blinker/__pycache__/_utilities.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/blinker/__pycache__/_utilities.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33105289d5a65459e662db9e7b2799fff5765af7 GIT binary patch literal 3560 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 n=00N65<6j^fYZAGJG9_T=W~C`U;8@ 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 +# 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. +# +"""Refactored 'safe reference from dispatcher.py""" +import operator +import sys +import traceback +import weakref + + +get_self = operator.attrgetter("__self__") +get_func = operator.attrgetter("__func__") + + +def safe_ref(target, on_delete=None): + """Return a *safe* weak reference to a callable target. + + - ``target``: The object to be weakly referenced, if it's a bound + method reference, will create a BoundMethodWeakref, otherwise + creates a simple weakref. + + - ``on_delete``: If provided, will have a hard reference stored to + the callable to be called after the safe reference goes out of + scope with the reference object, (either a weakref or a + BoundMethodWeakref) as argument. + """ + try: + im_self = get_self(target) + except AttributeError: + if callable(on_delete): + return weakref.ref(target, on_delete) + else: + return weakref.ref(target) + else: + if im_self is not None: + # Turn a bound method into a BoundMethodWeakref instance. + # Keep track of these instances for lookup by disconnect(). + assert hasattr(target, "im_func") or hasattr(target, "__func__"), ( + f"safe_ref target {target!r} has im_self, but no im_func, " + "don't know how to create reference" + ) + reference = BoundMethodWeakref(target=target, on_delete=on_delete) + return reference + + +class BoundMethodWeakref: + """'Safe' and reusable weak references to instance methods. + + BoundMethodWeakref objects provide a mechanism for referencing a + bound method without requiring that the method object itself + (which is normally a transient object) is kept alive. Instead, + the BoundMethodWeakref object keeps weak references to both the + object and the function which together define the instance method. + + Attributes: + + - ``key``: The identity key for the reference, calculated by the + class's calculate_key method applied to the target instance method. + + - ``deletion_methods``: Sequence of callable objects taking single + argument, a reference to this object which will be called when + *either* the target object or target function is garbage + collected (i.e. when this object becomes invalid). These are + specified as the on_delete parameters of safe_ref calls. + + - ``weak_self``: Weak reference to the target object. + + - ``weak_func``: Weak reference to the target function. + + Class Attributes: + + - ``_all_instances``: Class attribute pointing to all live + BoundMethodWeakref objects indexed by the class's + calculate_key(target) method applied to the target objects. + This weak value dictionary is used to short-circuit creation so + that multiple references to the same (object, function) pair + produce the same BoundMethodWeakref instance. + """ + + _all_instances = weakref.WeakValueDictionary() # type: ignore[var-annotated] + + def __new__(cls, target, on_delete=None, *arguments, **named): + """Create new instance or return current instance. + + Basically this method of construction allows us to + short-circuit creation of references to already-referenced + instance methods. The key corresponding to the target is + calculated, and if there is already an existing reference, + that is returned, with its deletion_methods attribute updated. + Otherwise the new instance is created and registered in the + table of already-referenced methods. + """ + key = cls.calculate_key(target) + current = cls._all_instances.get(key) + if current is not None: + current.deletion_methods.append(on_delete) + return current + else: + base = super().__new__(cls) + cls._all_instances[key] = base + base.__init__(target, on_delete, *arguments, **named) + return base + + def __init__(self, target, on_delete=None): + """Return a weak-reference-like instance for a bound method. + + - ``target``: The instance-method target for the weak reference, + must have im_self and im_func attributes and be + reconstructable via the following, which is true of built-in + instance methods:: + + target.im_func.__get__( target.im_self ) + + - ``on_delete``: Optional callback which will be called when + this weak reference ceases to be valid (i.e. either the + object or the function is garbage collected). Should take a + single argument, which will be passed a pointer to this + object. + """ + + def remove(weak, self=self): + """Set self.isDead to True when method or instance is destroyed.""" + methods = self.deletion_methods[:] + del self.deletion_methods[:] + try: + del self.__class__._all_instances[self.key] + except KeyError: + pass + for function in methods: + try: + if callable(function): + function(self) + except Exception: + try: + traceback.print_exc() + except AttributeError: + e = sys.exc_info()[1] + print( + f"Exception during saferef {self} " + f"cleanup function {function}: {e}" + ) + + self.deletion_methods = [on_delete] + self.key = self.calculate_key(target) + im_self = get_self(target) + im_func = get_func(target) + self.weak_self = weakref.ref(im_self, remove) + self.weak_func = weakref.ref(im_func, remove) + self.self_name = str(im_self) + self.func_name = str(im_func.__name__) + + @classmethod + def calculate_key(cls, target): + """Calculate the reference key for this reference. + + Currently this is a two-tuple of the id()'s of the target + object and the target function respectively. + """ + return (id(get_self(target)), id(get_func(target))) + + def __str__(self): + """Give a friendly representation of the object.""" + return "{}({}.{})".format( + self.__class__.__name__, + self.self_name, + self.func_name, + ) + + __repr__ = __str__ + + def __hash__(self): + return hash((self.self_name, self.key)) + + def __nonzero__(self): + """Whether we are still a valid reference.""" + return self() is not None + + def __eq__(self, other): + """Compare with another reference.""" + if not isinstance(other, self.__class__): + return operator.eq(self.__class__, type(other)) + return operator.eq(self.key, other.key) + + def __call__(self): + """Return a strong reference to the bound method. + + If the target cannot be retrieved, then will return None, + otherwise returns a bound instance method for our object and + function. + + Note: You may call this method any number of times, as it does + not invalidate the reference. + """ + target = self.weak_self() + if target is not None: + function = self.weak_func() + if function is not None: + return function.__get__(target) + return None diff --git a/server-temp/venv/lib/python3.10/site-packages/blinker/_utilities.py b/server-temp/venv/lib/python3.10/site-packages/blinker/_utilities.py new file mode 100644 index 00000000..4b711c67 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/blinker/_utilities.py @@ -0,0 +1,105 @@ +from __future__ import annotations + +import typing as t +from weakref import ref + +from blinker._saferef import BoundMethodWeakref + +IdentityType = t.Union[t.Tuple[int, int], str, int] + + +class _symbol: + def __init__(self, name): + """Construct a new named symbol.""" + self.__name__ = self.name = name + + def __reduce__(self): + return symbol, (self.name,) + + def __repr__(self): + return self.name + + +_symbol.__name__ = "symbol" + + +class symbol: + """A constant symbol. + + >>> symbol('foo') is symbol('foo') + True + >>> symbol('foo') + foo + + A slight refinement of the MAGICCOOKIE=object() pattern. The primary + advantage of symbol() is its repr(). They are also singletons. + + Repeated calls of symbol('name') will all return the same instance. + + """ + + symbols = {} # type: ignore[var-annotated] + + def __new__(cls, name): + try: + return cls.symbols[name] + except KeyError: + return cls.symbols.setdefault(name, _symbol(name)) + + +def hashable_identity(obj: object) -> IdentityType: + if hasattr(obj, "__func__"): + return (id(obj.__func__), id(obj.__self__)) # type: ignore[attr-defined] + elif hasattr(obj, "im_func"): + return (id(obj.im_func), id(obj.im_self)) # type: ignore[attr-defined] + elif isinstance(obj, (int, str)): + return obj + else: + return id(obj) + + +WeakTypes = (ref, BoundMethodWeakref) + + +class annotatable_weakref(ref): + """A weakref.ref that supports custom instance attributes.""" + + receiver_id: t.Optional[IdentityType] + sender_id: t.Optional[IdentityType] + + +def reference( # type: ignore[no-untyped-def] + object, callback=None, **annotations +) -> annotatable_weakref: + """Return an annotated weak ref.""" + if callable(object): + weak = callable_reference(object, callback) + else: + weak = annotatable_weakref(object, callback) + for key, value in annotations.items(): + setattr(weak, key, value) + return weak # type: ignore[no-any-return] + + +def callable_reference(object, callback=None): + """Return an annotated weak ref, supporting bound instance methods.""" + if hasattr(object, "im_self") and object.im_self is not None: + return BoundMethodWeakref(target=object, on_delete=callback) + elif hasattr(object, "__self__") and object.__self__ is not None: + return BoundMethodWeakref(target=object, on_delete=callback) + return annotatable_weakref(object, callback) + + +class lazy_property: + """A @property that is only evaluated once.""" + + def __init__(self, deferred): + self._deferred = deferred + self.__doc__ = deferred.__doc__ + + def __get__(self, obj, cls): + if obj is None: + return self + value = self._deferred(obj) + setattr(obj, self._deferred.__name__, value) + return value diff --git a/server-temp/venv/lib/python3.10/site-packages/blinker/base.py b/server-temp/venv/lib/python3.10/site-packages/blinker/base.py new file mode 100644 index 00000000..b9d70358 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/blinker/base.py @@ -0,0 +1,558 @@ +"""Signals and events. + +A small implementation of signals, inspired by a snippet of Django signal +API client code seen in a blog post. Signals are first-class objects and +each manages its own receivers and message emission. + +The :func:`signal` function provides singleton behavior for named signals. + +""" +from __future__ import annotations + +import typing as t +from collections import defaultdict +from contextlib import contextmanager +from inspect import iscoroutinefunction +from warnings import warn +from weakref import WeakValueDictionary + +from blinker._utilities import annotatable_weakref +from blinker._utilities import hashable_identity +from blinker._utilities import IdentityType +from blinker._utilities import lazy_property +from blinker._utilities import reference +from blinker._utilities import symbol +from blinker._utilities import WeakTypes + +if t.TYPE_CHECKING: + import typing_extensions as te + + T_callable = t.TypeVar("T_callable", bound=t.Callable[..., t.Any]) + + T = t.TypeVar("T") + P = te.ParamSpec("P") + + AsyncWrapperType = t.Callable[[t.Callable[P, t.Awaitable[T]]], t.Callable[P, T]] + SyncWrapperType = t.Callable[[t.Callable[P, T]], t.Callable[P, t.Awaitable[T]]] + +ANY = symbol("ANY") +ANY.__doc__ = 'Token for "any sender".' +ANY_ID = 0 + +# NOTE: We need a reference to cast for use in weakref callbacks otherwise +# t.cast may have already been set to None during finalization. +cast = t.cast + + +class Signal: + """A notification emitter.""" + + #: An :obj:`ANY` convenience synonym, allows ``Signal.ANY`` + #: without an additional import. + ANY = ANY + + set_class: type[set] = set + + @lazy_property + def receiver_connected(self) -> Signal: + """Emitted after each :meth:`connect`. + + The signal sender is the signal instance, and the :meth:`connect` + arguments are passed through: *receiver*, *sender*, and *weak*. + + .. versionadded:: 1.2 + + """ + return Signal(doc="Emitted after a receiver connects.") + + @lazy_property + def receiver_disconnected(self) -> Signal: + """Emitted after :meth:`disconnect`. + + The sender is the signal instance, and the :meth:`disconnect` arguments + are passed through: *receiver* and *sender*. + + Note, this signal is emitted **only** when :meth:`disconnect` is + called explicitly. + + The disconnect signal can not be emitted by an automatic disconnect + (due to a weakly referenced receiver or sender going out of scope), + as the receiver and/or sender instances are no longer available for + use at the time this signal would be emitted. + + An alternative approach is available by subscribing to + :attr:`receiver_connected` and setting up a custom weakref cleanup + callback on weak receivers and senders. + + .. versionadded:: 1.2 + + """ + return Signal(doc="Emitted after a receiver disconnects.") + + def __init__(self, doc: str | None = None) -> None: + """ + :param doc: optional. If provided, will be assigned to the signal's + __doc__ attribute. + + """ + if doc: + self.__doc__ = doc + #: A mapping of connected receivers. + #: + #: The values of this mapping are not meaningful outside of the + #: internal :class:`Signal` implementation, however the boolean value + #: of the mapping is useful as an extremely efficient check to see if + #: any receivers are connected to the signal. + self.receivers: dict[IdentityType, t.Callable | annotatable_weakref] = {} + self.is_muted = False + self._by_receiver: dict[IdentityType, set[IdentityType]] = defaultdict( + self.set_class + ) + self._by_sender: dict[IdentityType, set[IdentityType]] = defaultdict( + self.set_class + ) + self._weak_senders: dict[IdentityType, annotatable_weakref] = {} + + def connect( + self, receiver: T_callable, sender: t.Any = ANY, weak: bool = True + ) -> T_callable: + """Connect *receiver* to signal events sent by *sender*. + + :param receiver: A callable. Will be invoked by :meth:`send` with + `sender=` as a single positional argument and any ``kwargs`` that + were provided to a call to :meth:`send`. + + :param sender: Any object or :obj:`ANY`, defaults to ``ANY``. + Restricts notifications delivered to *receiver* to only those + :meth:`send` emissions sent by *sender*. If ``ANY``, the receiver + will always be notified. A *receiver* may be connected to + multiple *sender* values on the same Signal through multiple calls + to :meth:`connect`. + + :param weak: If true, the Signal will hold a weakref to *receiver* + and automatically disconnect when *receiver* goes out of scope or + is garbage collected. Defaults to True. + + """ + receiver_id = hashable_identity(receiver) + receiver_ref: T_callable | annotatable_weakref + + if weak: + receiver_ref = reference(receiver, self._cleanup_receiver) + receiver_ref.receiver_id = receiver_id + else: + receiver_ref = receiver + sender_id: IdentityType + if sender is ANY: + sender_id = ANY_ID + else: + sender_id = hashable_identity(sender) + + self.receivers.setdefault(receiver_id, receiver_ref) + self._by_sender[sender_id].add(receiver_id) + self._by_receiver[receiver_id].add(sender_id) + del receiver_ref + + if sender is not ANY and sender_id not in self._weak_senders: + # wire together a cleanup for weakref-able senders + try: + sender_ref = reference(sender, self._cleanup_sender) + sender_ref.sender_id = sender_id + except TypeError: + pass + else: + self._weak_senders.setdefault(sender_id, sender_ref) + del sender_ref + + # broadcast this connection. if receivers raise, disconnect. + if "receiver_connected" in self.__dict__ and self.receiver_connected.receivers: + try: + self.receiver_connected.send( + self, receiver=receiver, sender=sender, weak=weak + ) + except TypeError as e: + self.disconnect(receiver, sender) + raise e + if receiver_connected.receivers and self is not receiver_connected: + try: + receiver_connected.send( + self, receiver_arg=receiver, sender_arg=sender, weak_arg=weak + ) + except TypeError as e: + self.disconnect(receiver, sender) + raise e + return receiver + + def connect_via( + self, sender: t.Any, weak: bool = False + ) -> t.Callable[[T_callable], T_callable]: + """Connect the decorated function as a receiver for *sender*. + + :param sender: Any object or :obj:`ANY`. The decorated function + will only receive :meth:`send` emissions sent by *sender*. If + ``ANY``, the receiver will always be notified. A function may be + decorated multiple times with differing *sender* values. + + :param weak: If true, the Signal will hold a weakref to the + decorated function and automatically disconnect when *receiver* + goes out of scope or is garbage collected. Unlike + :meth:`connect`, this defaults to False. + + The decorated function will be invoked by :meth:`send` with + `sender=` as a single positional argument and any ``kwargs`` that + were provided to the call to :meth:`send`. + + + .. versionadded:: 1.1 + + """ + + def decorator(fn: T_callable) -> T_callable: + self.connect(fn, sender, weak) + return fn + + return decorator + + @contextmanager + def connected_to( + self, receiver: t.Callable, sender: t.Any = ANY + ) -> t.Generator[None, None, None]: + """Execute a block with the signal temporarily connected to *receiver*. + + :param receiver: a receiver callable + :param sender: optional, a sender to filter on + + This is a context manager for use in the ``with`` statement. It can + be useful in unit tests. *receiver* is connected to the signal for + the duration of the ``with`` block, and will be disconnected + automatically when exiting the block: + + .. code-block:: python + + with on_ready.connected_to(receiver): + # do stuff + on_ready.send(123) + + .. versionadded:: 1.1 + + """ + self.connect(receiver, sender=sender, weak=False) + try: + yield None + finally: + self.disconnect(receiver) + + @contextmanager + def muted(self) -> t.Generator[None, None, None]: + """Context manager for temporarily disabling signal. + Useful for test purposes. + """ + self.is_muted = True + try: + yield None + except Exception as e: + raise e + finally: + self.is_muted = False + + def temporarily_connected_to( + self, receiver: t.Callable, sender: t.Any = ANY + ) -> t.ContextManager[None]: + """An alias for :meth:`connected_to`. + + :param receiver: a receiver callable + :param sender: optional, a sender to filter on + + .. versionadded:: 0.9 + + .. versionchanged:: 1.1 + Renamed to :meth:`connected_to`. ``temporarily_connected_to`` was + deprecated in 1.2 and will be removed in a subsequent version. + + """ + warn( + "temporarily_connected_to is deprecated; use connected_to instead.", + DeprecationWarning, + ) + return self.connected_to(receiver, sender) + + def send( + self, + *sender: t.Any, + _async_wrapper: AsyncWrapperType | None = None, + **kwargs: t.Any, + ) -> list[tuple[t.Callable, t.Any]]: + """Emit this signal on behalf of *sender*, passing on ``kwargs``. + + Returns a list of 2-tuples, pairing receivers with their return + value. The ordering of receiver notification is undefined. + + :param sender: Any object or ``None``. If omitted, synonymous + with ``None``. Only accepts one positional argument. + :param _async_wrapper: A callable that should wrap a coroutine + receiver and run it when called synchronously. + + :param kwargs: Data to be sent to receivers. + """ + if self.is_muted: + return [] + + sender = self._extract_sender(sender) + results = [] + for receiver in self.receivers_for(sender): + if iscoroutinefunction(receiver): + if _async_wrapper is None: + raise RuntimeError("Cannot send to a coroutine function") + receiver = _async_wrapper(receiver) + result = receiver(sender, **kwargs) + results.append((receiver, result)) + return results + + async def send_async( + self, + *sender: t.Any, + _sync_wrapper: SyncWrapperType | None = None, + **kwargs: t.Any, + ) -> list[tuple[t.Callable, t.Any]]: + """Emit this signal on behalf of *sender*, passing on ``kwargs``. + + Returns a list of 2-tuples, pairing receivers with their return + value. The ordering of receiver notification is undefined. + + :param sender: Any object or ``None``. If omitted, synonymous + with ``None``. Only accepts one positional argument. + :param _sync_wrapper: A callable that should wrap a synchronous + receiver and run it when awaited. + + :param kwargs: Data to be sent to receivers. + """ + if self.is_muted: + return [] + + sender = self._extract_sender(sender) + results = [] + for receiver in self.receivers_for(sender): + if not iscoroutinefunction(receiver): + if _sync_wrapper is None: + raise RuntimeError("Cannot send to a non-coroutine function") + receiver = _sync_wrapper(receiver) + result = await receiver(sender, **kwargs) + results.append((receiver, result)) + return results + + def _extract_sender(self, sender: t.Any) -> t.Any: + if not self.receivers: + # Ensure correct signature even on no-op sends, disable with -O + # for lowest possible cost. + if __debug__ and sender and len(sender) > 1: + raise TypeError( + f"send() accepts only one positional argument, {len(sender)} given" + ) + return [] + + # Using '*sender' rather than 'sender=None' allows 'sender' to be + # used as a keyword argument- i.e. it's an invisible name in the + # function signature. + if len(sender) == 0: + sender = None + elif len(sender) > 1: + raise TypeError( + f"send() accepts only one positional argument, {len(sender)} given" + ) + else: + sender = sender[0] + return sender + + def has_receivers_for(self, sender: t.Any) -> bool: + """True if there is probably a receiver for *sender*. + + Performs an optimistic check only. Does not guarantee that all + weakly referenced receivers are still alive. See + :meth:`receivers_for` for a stronger search. + + """ + if not self.receivers: + return False + if self._by_sender[ANY_ID]: + return True + if sender is ANY: + return False + return hashable_identity(sender) in self._by_sender + + def receivers_for( + self, sender: t.Any + ) -> t.Generator[t.Callable[[t.Any], t.Any], None, None]: + """Iterate all live receivers listening for *sender*.""" + # TODO: test receivers_for(ANY) + if self.receivers: + sender_id = hashable_identity(sender) + if sender_id in self._by_sender: + ids = self._by_sender[ANY_ID] | self._by_sender[sender_id] + else: + ids = self._by_sender[ANY_ID].copy() + for receiver_id in ids: + receiver = self.receivers.get(receiver_id) + if receiver is None: + continue + if isinstance(receiver, WeakTypes): + strong = receiver() + if strong is None: + self._disconnect(receiver_id, ANY_ID) + continue + receiver = strong + yield receiver # type: ignore[misc] + + def disconnect(self, receiver: t.Callable, sender: t.Any = ANY) -> None: + """Disconnect *receiver* from this signal's events. + + :param receiver: a previously :meth:`connected` callable + + :param sender: a specific sender to disconnect from, or :obj:`ANY` + to disconnect from all senders. Defaults to ``ANY``. + + """ + sender_id: IdentityType + if sender is ANY: + sender_id = ANY_ID + else: + sender_id = hashable_identity(sender) + receiver_id = hashable_identity(receiver) + self._disconnect(receiver_id, sender_id) + + if ( + "receiver_disconnected" in self.__dict__ + and self.receiver_disconnected.receivers + ): + self.receiver_disconnected.send(self, receiver=receiver, sender=sender) + + def _disconnect(self, receiver_id: IdentityType, sender_id: IdentityType) -> None: + if sender_id == ANY_ID: + if self._by_receiver.pop(receiver_id, False): + for bucket in self._by_sender.values(): + bucket.discard(receiver_id) + self.receivers.pop(receiver_id, None) + else: + self._by_sender[sender_id].discard(receiver_id) + self._by_receiver[receiver_id].discard(sender_id) + + def _cleanup_receiver(self, receiver_ref: annotatable_weakref) -> None: + """Disconnect a receiver from all senders.""" + self._disconnect(cast(IdentityType, receiver_ref.receiver_id), ANY_ID) + + def _cleanup_sender(self, sender_ref: annotatable_weakref) -> None: + """Disconnect all receivers from a sender.""" + sender_id = cast(IdentityType, sender_ref.sender_id) + assert sender_id != ANY_ID + self._weak_senders.pop(sender_id, None) + for receiver_id in self._by_sender.pop(sender_id, ()): + self._by_receiver[receiver_id].discard(sender_id) + + def _cleanup_bookkeeping(self) -> None: + """Prune unused sender/receiver bookkeeping. Not threadsafe. + + Connecting & disconnecting leave behind a small amount of bookkeeping + for the receiver and sender values. Typical workloads using Blinker, + for example in most web apps, Flask, CLI scripts, etc., are not + adversely affected by this bookkeeping. + + With a long-running Python process performing dynamic signal routing + with high volume- e.g. connecting to function closures, "senders" are + all unique object instances, and doing all of this over and over- you + may see memory usage will grow due to extraneous bookkeeping. (An empty + set() for each stale sender/receiver pair.) + + This method will prune that bookkeeping away, with the caveat that such + pruning is not threadsafe. The risk is that cleanup of a fully + disconnected receiver/sender pair occurs while another thread is + connecting that same pair. If you are in the highly dynamic, unique + receiver/sender situation that has lead you to this method, that + failure mode is perhaps not a big deal for you. + """ + for mapping in (self._by_sender, self._by_receiver): + for _id, bucket in list(mapping.items()): + if not bucket: + mapping.pop(_id, None) + + def _clear_state(self) -> None: + """Throw away all signal state. Useful for unit tests.""" + self._weak_senders.clear() + self.receivers.clear() + self._by_sender.clear() + self._by_receiver.clear() + + +receiver_connected = Signal( + """\ +Sent by a :class:`Signal` after a receiver connects. + +:argument: the Signal that was connected to +:keyword receiver_arg: the connected receiver +:keyword sender_arg: the sender to connect to +:keyword weak_arg: true if the connection to receiver_arg is a weak reference + +.. deprecated:: 1.2 + +As of 1.2, individual signals have their own private +:attr:`~Signal.receiver_connected` and +:attr:`~Signal.receiver_disconnected` signals with a slightly simplified +call signature. This global signal is planned to be removed in 1.6. + +""" +) + + +class NamedSignal(Signal): + """A named generic notification emitter.""" + + def __init__(self, name: str, doc: str | None = None) -> None: + Signal.__init__(self, doc) + + #: The name of this signal. + self.name = name + + def __repr__(self) -> str: + base = Signal.__repr__(self) + return f"{base[:-1]}; {self.name!r}>" # noqa: E702 + + +class Namespace(dict): + """A mapping of signal names to signals.""" + + def signal(self, name: str, doc: str | None = None) -> NamedSignal: + """Return the :class:`NamedSignal` *name*, creating it if required. + + Repeated calls to this function will return the same signal object. + + """ + try: + return self[name] # type: ignore[no-any-return] + except KeyError: + result = self.setdefault(name, NamedSignal(name, doc)) + return result # type: ignore[no-any-return] + + +class WeakNamespace(WeakValueDictionary): + """A weak mapping of signal names to signals. + + Automatically cleans up unused Signals when the last reference goes out + of scope. This namespace implementation exists for a measure of legacy + compatibility with Blinker <= 1.2, and may be dropped in the future. + + .. versionadded:: 1.3 + + """ + + def signal(self, name: str, doc: str | None = None) -> NamedSignal: + """Return the :class:`NamedSignal` *name*, creating it if required. + + Repeated calls to this function will return the same signal object. + + """ + try: + return self[name] # type: ignore[no-any-return] + except KeyError: + result = self.setdefault(name, NamedSignal(name, doc)) + return result # type: ignore[no-any-return] + + +signal = Namespace().signal diff --git a/server-temp/venv/lib/python3.10/site-packages/blinker/py.typed b/server-temp/venv/lib/python3.10/site-packages/blinker/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/server-temp/venv/lib/python3.10/site-packages/click-8.1.7.dist-info/INSTALLER b/server-temp/venv/lib/python3.10/site-packages/click-8.1.7.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/click-8.1.7.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/server-temp/venv/lib/python3.10/site-packages/click-8.1.7.dist-info/LICENSE.rst b/server-temp/venv/lib/python3.10/site-packages/click-8.1.7.dist-info/LICENSE.rst new file mode 100644 index 00000000..d12a8491 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/click-8.1.7.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2014 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/server-temp/venv/lib/python3.10/site-packages/click-8.1.7.dist-info/METADATA b/server-temp/venv/lib/python3.10/site-packages/click-8.1.7.dist-info/METADATA new file mode 100644 index 00000000..7a6bbb24 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/click-8.1.7.dist-info/METADATA @@ -0,0 +1,103 @@ +Metadata-Version: 2.1 +Name: click +Version: 8.1.7 +Summary: Composable command line interface toolkit +Home-page: https://palletsprojects.com/p/click/ +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://click.palletsprojects.com/ +Project-URL: Changes, https://click.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/click/ +Project-URL: Issue Tracker, https://github.com/pallets/click/issues/ +Project-URL: Chat, https://discord.gg/pallets +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst +Requires-Dist: colorama ; platform_system == "Windows" +Requires-Dist: importlib-metadata ; python_version < "3.8" + +\$ click\_ +========== + +Click is a Python package for creating beautiful command line interfaces +in a composable way with as little code as necessary. It's the "Command +Line Interface Creation Kit". It's highly configurable but comes with +sensible defaults out of the box. + +It aims to make the process of writing command line tools quick and fun +while also preventing any frustration caused by the inability to +implement an intended CLI API. + +Click in three points: + +- Arbitrary nesting of commands +- Automatic help page generation +- Supports lazy loading of subcommands at runtime + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U click + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +A Simple Example +---------------- + +.. code-block:: python + + import click + + @click.command() + @click.option("--count", default=1, help="Number of greetings.") + @click.option("--name", prompt="Your name", help="The person to greet.") + def hello(count, name): + """Simple program that greets NAME for a total of COUNT times.""" + for _ in range(count): + click.echo(f"Hello, {name}!") + + if __name__ == '__main__': + hello() + +.. code-block:: text + + $ python hello.py --count=3 + Your name: Click + Hello, Click! + Hello, Click! + Hello, Click! + + +Donate +------ + +The Pallets organization develops and supports Click and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://click.palletsprojects.com/ +- Changes: https://click.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/click/ +- Source Code: https://github.com/pallets/click +- Issue Tracker: https://github.com/pallets/click/issues +- Chat: https://discord.gg/pallets diff --git a/server-temp/venv/lib/python3.10/site-packages/click-8.1.7.dist-info/RECORD b/server-temp/venv/lib/python3.10/site-packages/click-8.1.7.dist-info/RECORD new file mode 100644 index 00000000..3ff0797f --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/click-8.1.7.dist-info/RECORD @@ -0,0 +1,39 @@ +click-8.1.7.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +click-8.1.7.dist-info/LICENSE.rst,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475 +click-8.1.7.dist-info/METADATA,sha256=qIMevCxGA9yEmJOM_4WHuUJCwWpsIEVbCPOhs45YPN4,3014 +click-8.1.7.dist-info/RECORD,, +click-8.1.7.dist-info/WHEEL,sha256=5sUXSg9e4bi7lTLOHcm6QEYwO5TIF1TNbTSVFVjcJcc,92 +click-8.1.7.dist-info/top_level.txt,sha256=J1ZQogalYS4pphY_lPECoNMfw0HzTSrZglC4Yfwo4xA,6 +click/__init__.py,sha256=YDDbjm406dTOA0V8bTtdGnhN7zj5j-_dFRewZF_pLvw,3138 +click/__pycache__/__init__.cpython-310.pyc,, +click/__pycache__/_compat.cpython-310.pyc,, +click/__pycache__/_termui_impl.cpython-310.pyc,, +click/__pycache__/_textwrap.cpython-310.pyc,, +click/__pycache__/_winconsole.cpython-310.pyc,, +click/__pycache__/core.cpython-310.pyc,, +click/__pycache__/decorators.cpython-310.pyc,, +click/__pycache__/exceptions.cpython-310.pyc,, +click/__pycache__/formatting.cpython-310.pyc,, +click/__pycache__/globals.cpython-310.pyc,, +click/__pycache__/parser.cpython-310.pyc,, +click/__pycache__/shell_completion.cpython-310.pyc,, +click/__pycache__/termui.cpython-310.pyc,, +click/__pycache__/testing.cpython-310.pyc,, +click/__pycache__/types.cpython-310.pyc,, +click/__pycache__/utils.cpython-310.pyc,, +click/_compat.py,sha256=5318agQpbt4kroKsbqDOYpTSWzL_YCZVUQiTT04yXmc,18744 +click/_termui_impl.py,sha256=3dFYv4445Nw-rFvZOTBMBPYwB1bxnmNk9Du6Dm_oBSU,24069 +click/_textwrap.py,sha256=10fQ64OcBUMuK7mFvh8363_uoOxPlRItZBmKzRJDgoY,1353 +click/_winconsole.py,sha256=5ju3jQkcZD0W27WEMGqmEP4y_crUVzPCqsX_FYb7BO0,7860 +click/core.py,sha256=j6oEWtGgGna8JarD6WxhXmNnxLnfRjwXglbBc-8jr7U,114086 +click/decorators.py,sha256=-ZlbGYgV-oI8jr_oH4RpuL1PFS-5QmeuEAsLDAYgxtw,18719 +click/exceptions.py,sha256=fyROO-47HWFDjt2qupo7A3J32VlpM-ovJnfowu92K3s,9273 +click/formatting.py,sha256=Frf0-5W33-loyY_i9qrwXR8-STnW3m5gvyxLVUdyxyk,9706 +click/globals.py,sha256=TP-qM88STzc7f127h35TD_v920FgfOD2EwzqA0oE8XU,1961 +click/parser.py,sha256=LKyYQE9ZLj5KgIDXkrcTHQRXIggfoivX14_UVIn56YA,19067 +click/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +click/shell_completion.py,sha256=Ty3VM_ts0sQhj6u7eFTiLwHPoTgcXTGEAUg2OpLqYKw,18460 +click/termui.py,sha256=H7Q8FpmPelhJ2ovOhfCRhjMtCpNyjFXryAMLZODqsdc,28324 +click/testing.py,sha256=1Qd4kS5bucn1hsNIRryd0WtTMuCpkA93grkWxT8POsU,16084 +click/types.py,sha256=TZvz3hKvBztf-Hpa2enOmP4eznSPLzijjig5b_0XMxE,36391 +click/utils.py,sha256=1476UduUNY6UePGU4m18uzVHLt1sKM2PP3yWsQhbItM,20298 diff --git a/server-temp/venv/lib/python3.10/site-packages/click-8.1.7.dist-info/WHEEL b/server-temp/venv/lib/python3.10/site-packages/click-8.1.7.dist-info/WHEEL new file mode 100644 index 00000000..2c08da08 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/click-8.1.7.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.41.1) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/server-temp/venv/lib/python3.10/site-packages/click-8.1.7.dist-info/top_level.txt b/server-temp/venv/lib/python3.10/site-packages/click-8.1.7.dist-info/top_level.txt new file mode 100644 index 00000000..dca9a909 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/click-8.1.7.dist-info/top_level.txt @@ -0,0 +1 @@ +click diff --git a/server-temp/venv/lib/python3.10/site-packages/click/__init__.py b/server-temp/venv/lib/python3.10/site-packages/click/__init__.py new file mode 100644 index 00000000..9a1dab04 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/click/__init__.py @@ -0,0 +1,73 @@ +""" +Click is a simple Python module inspired by the stdlib optparse to make +writing command line scripts fun. Unlike other modules, it's based +around a simple API that does not come with too much magic and is +composable. +""" +from .core import Argument as Argument +from .core import BaseCommand as BaseCommand +from .core import Command as Command +from .core import CommandCollection as CommandCollection +from .core import Context as Context +from .core import Group as Group +from .core import MultiCommand as MultiCommand +from .core import Option as Option +from .core import Parameter as Parameter +from .decorators import argument as argument +from .decorators import command as command +from .decorators import confirmation_option as confirmation_option +from .decorators import group as group +from .decorators import help_option as help_option +from .decorators import make_pass_decorator as make_pass_decorator +from .decorators import option as option +from .decorators import pass_context as pass_context +from .decorators import pass_obj as pass_obj +from .decorators import password_option as password_option +from .decorators import version_option as version_option +from .exceptions import Abort as Abort +from .exceptions import BadArgumentUsage as BadArgumentUsage +from .exceptions import BadOptionUsage as BadOptionUsage +from .exceptions import BadParameter as BadParameter +from .exceptions import ClickException as ClickException +from .exceptions import FileError as FileError +from .exceptions import MissingParameter as MissingParameter +from .exceptions import NoSuchOption as NoSuchOption +from .exceptions import UsageError as UsageError +from .formatting import HelpFormatter as HelpFormatter +from .formatting import wrap_text as wrap_text +from .globals import get_current_context as get_current_context +from .parser import OptionParser as OptionParser +from .termui import clear as clear +from .termui import confirm as confirm +from .termui import echo_via_pager as echo_via_pager +from .termui import edit as edit +from .termui import getchar as getchar +from .termui import launch as launch +from .termui import pause as pause +from .termui import progressbar as progressbar +from .termui import prompt as prompt +from .termui import secho as secho +from .termui import style as style +from .termui import unstyle as unstyle +from .types import BOOL as BOOL +from .types import Choice as Choice +from .types import DateTime as DateTime +from .types import File as File +from .types import FLOAT as FLOAT +from .types import FloatRange as FloatRange +from .types import INT as INT +from .types import IntRange as IntRange +from .types import ParamType as ParamType +from .types import Path as Path +from .types import STRING as STRING +from .types import Tuple as Tuple +from .types import UNPROCESSED as UNPROCESSED +from .types import UUID as UUID +from .utils import echo as echo +from .utils import format_filename as format_filename +from .utils import get_app_dir as get_app_dir +from .utils import get_binary_stream as get_binary_stream +from .utils import get_text_stream as get_text_stream +from .utils import open_file as open_file + +__version__ = "8.1.7" diff --git a/server-temp/venv/lib/python3.10/site-packages/click/__pycache__/__init__.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/click/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4be4e6abb5337512b0e29e76cbdb969cc50d3d7d GIT binary patch literal 2653 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 KfZ&L&c>e%TgN{l7 literal 0 HcmV?d00001 diff --git a/server-temp/venv/lib/python3.10/site-packages/click/__pycache__/_winconsole.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/click/__pycache__/_winconsole.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e7da074a4ebf7af3dcf8e616487167da278610f GIT binary patch literal 7703 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 J=hr71{|Db3AWr}Q literal 0 HcmV?d00001 diff --git a/server-temp/venv/lib/python3.10/site-packages/click/__pycache__/decorators.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/click/__pycache__/decorators.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f9fdaccac3f03b3c2dffd2f5b6801bf04078b89 GIT binary patch literal 17251 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 b$=oqZuBwPt6?69Qu>RYVh4O!${^5TEje!&3 literal 0 HcmV?d00001 diff --git a/server-temp/venv/lib/python3.10/site-packages/click/__pycache__/exceptions.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/click/__pycache__/exceptions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..574cc1ff5926833a0f98cde65ff017a1a5f03e8d GIT binary patch literal 10295 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 literal 0 HcmV?d00001 diff --git a/server-temp/venv/lib/python3.10/site-packages/click/__pycache__/formatting.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/click/__pycache__/formatting.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..91893fe8840a522fa88a913bd3189d37dc5ce320 GIT binary patch literal 9500 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 literal 0 HcmV?d00001 diff --git a/server-temp/venv/lib/python3.10/site-packages/click/__pycache__/globals.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/click/__pycache__/globals.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eda5523c93ffc54f879bc57f3e8c9101e3a6ad0a GIT binary patch literal 2472 zcmZ`*TaOzx6dq3|*=+XG?zW}7y?~Lp1+_`JR7ep*z_JS~P^j9iP=iq7jGbh*p7F@` zB%9S1p|-F5hgLk5U%+pfSDyOJTZL54@g%TYEtbY(`XJZQgNtqh(m zc;25lIo@E+`y3wg2Xx%yM0ym)Br6*Bppz!YW+TPm^Q!0zM~ z6G@TS7i(5DzKg8TO#ZmTq!B;m6)kM06CJ=eA$~Y-IL2oSp1)Aay*u7B(tZY=F2h`7 zZe91nH18UrP1CTr`IQQ@7&bGtC!hB z*y6T38bj?!&{?3=rGd`EZBV*5iVO`|Li>VdMsUguWpu)()T$bV#==mTS8No?qN=|y zLQ4l)#grw}$w+81Hwji5jg=NOic?5^WD9E&(33D5jRkDrJZlZIBy9CkX3YE;dX$S$ zX=at4+e0NAsf0$x8A^2&Gabn(dOgS_9VkslLZ*NtYO-*Ify_*caHM*4GKyd|j)o%( z!8#)m;9Co0A?zrj;fN)}C>heo8qgTAaRfH|46_0opU7g7fkw@l*;6#l%;+?YYqS*$ zJ8Jc2wbU@7N=5H@#%D$v4GKUu5F+DT@K%f7Y}_d9w^F8AOp79H(P%)8u$aEyp3cA+ zdRCMn9W$9h$_?$cRRSW=P1O9jowInR#~Pl~m_?HHWpQ=_az9|1#3ap906MUlW|0w; zoo1vZ4&VfDXNiqsv8}bzy@u0swD9~Tw8J;|5FY3nIK<#A0Rbn$*sd?+#O6WBjLj=u z$3=PBSg7E9^$Tlt)X!{TKCkU2TpYNq^5x?j*L_DWIT5E-;{~j@b?E#v=gB$=NR8B9 z2BqpR{@-~ivxUnH}}}hi~5&u^NNt2qLReD#chpHDOKTQsHyEUUKd_ z-}6$c(qle3{zJmcmq0N0>qA&@ey#fYbrhCEC6zvrVRWqok8|%m7#x9H8PSy^AU_Ma z<)vTA1E4y$x_(6V;l6T?2Zz7!V)4RtFsph@HZZz#dXC_t8q~loy6x#evLSHF?qG)G ze+vfr2YJB0Yi7j+Gawx#1;MXT1=-LOECHt?mAa1#sY{guJEm)X)N_J$g7%)q>j9vN zH-dhn7~|{IQ@L{QWO^IWCzgXuG9)lHU5>j z!mE=82pobC$4<}&FHoWF?ymY;Ua`{@NKfNMl`qlMba063+WmfmHo8 kRy>p9Gps>_u&#Q`q~ccz_CaZt1i=+@DX4AK%5Rnb0dx9(>;M1& literal 0 HcmV?d00001 diff --git a/server-temp/venv/lib/python3.10/site-packages/click/__pycache__/parser.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/click/__pycache__/parser.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6c6ece43049ff434687ed49c343d629ce04f635 GIT binary patch literal 13713 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 literal 0 HcmV?d00001 diff --git a/server-temp/venv/lib/python3.10/site-packages/click/__pycache__/types.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/click/__pycache__/types.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6f9f9b28655d2d48a8c8e785267abc89316aa33 GIT binary patch literal 33730 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 D`gkde literal 0 HcmV?d00001 diff --git a/server-temp/venv/lib/python3.10/site-packages/click/__pycache__/utils.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/click/__pycache__/utils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e4225b69eb3dd1910f46a14c606f23f0aec0c30 GIT binary patch literal 18886 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 literal 0 HcmV?d00001 diff --git a/server-temp/venv/lib/python3.10/site-packages/click/_compat.py b/server-temp/venv/lib/python3.10/site-packages/click/_compat.py new file mode 100644 index 00000000..23f88665 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/click/_compat.py @@ -0,0 +1,623 @@ +import codecs +import io +import os +import re +import sys +import typing as t +from weakref import WeakKeyDictionary + +CYGWIN = sys.platform.startswith("cygwin") +WIN = sys.platform.startswith("win") +auto_wrap_for_ansi: t.Optional[t.Callable[[t.TextIO], t.TextIO]] = None +_ansi_re = re.compile(r"\033\[[;?0-9]*[a-zA-Z]") + + +def _make_text_stream( + stream: t.BinaryIO, + encoding: t.Optional[str], + errors: t.Optional[str], + force_readable: bool = False, + force_writable: bool = False, +) -> t.TextIO: + if encoding is None: + encoding = get_best_encoding(stream) + if errors is None: + errors = "replace" + return _NonClosingTextIOWrapper( + stream, + encoding, + errors, + line_buffering=True, + force_readable=force_readable, + force_writable=force_writable, + ) + + +def is_ascii_encoding(encoding: str) -> bool: + """Checks if a given encoding is ascii.""" + try: + return codecs.lookup(encoding).name == "ascii" + except LookupError: + return False + + +def get_best_encoding(stream: t.IO[t.Any]) -> str: + """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: t.BinaryIO, + encoding: t.Optional[str], + errors: t.Optional[str], + force_readable: bool = False, + force_writable: bool = False, + **extra: t.Any, + ) -> None: + self._stream = stream = t.cast( + t.BinaryIO, _FixupStream(stream, force_readable, force_writable) + ) + super().__init__(stream, encoding, errors, **extra) + + def __del__(self) -> None: + try: + self.detach() + except Exception: + pass + + def isatty(self) -> bool: + # https://bitbucket.org/pypy/pypy/issue/1803 + return self._stream.isatty() + + +class _FixupStream: + """The new io interface needs more from streams than streams + traditionally implement. As such, this fix-up code is necessary in + some circumstances. + + The forcing of readable and writable flags are there because some tools + put badly patched objects on sys (one such offender are certain version + of jupyter notebook). + """ + + def __init__( + self, + stream: t.BinaryIO, + force_readable: bool = False, + force_writable: bool = False, + ): + self._stream = stream + self._force_readable = force_readable + self._force_writable = force_writable + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._stream, name) + + def read1(self, size: int) -> bytes: + f = getattr(self._stream, "read1", None) + + if f is not None: + return t.cast(bytes, f(size)) + + return self._stream.read(size) + + def readable(self) -> bool: + if self._force_readable: + return True + x = getattr(self._stream, "readable", None) + if x is not None: + return t.cast(bool, x()) + try: + self._stream.read(0) + except Exception: + return False + return True + + def writable(self) -> bool: + if self._force_writable: + return True + x = getattr(self._stream, "writable", None) + if x is not None: + return t.cast(bool, x()) + try: + self._stream.write("") # type: ignore + except Exception: + try: + self._stream.write(b"") + except Exception: + return False + return True + + def seekable(self) -> bool: + x = getattr(self._stream, "seekable", None) + if x is not None: + return t.cast(bool, x()) + try: + self._stream.seek(self._stream.tell()) + except Exception: + return False + return True + + +def _is_binary_reader(stream: t.IO[t.Any], default: bool = False) -> bool: + 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: t.IO[t.Any], default: bool = False) -> bool: + try: + stream.write(b"") + except Exception: + try: + stream.write("") + return False + except Exception: + pass + return default + return True + + +def _find_binary_reader(stream: t.IO[t.Any]) -> t.Optional[t.BinaryIO]: + # 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 t.cast(t.BinaryIO, 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 t.cast(t.BinaryIO, buf) + + return None + + +def _find_binary_writer(stream: t.IO[t.Any]) -> t.Optional[t.BinaryIO]: + # 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_writer(stream, False): + return t.cast(t.BinaryIO, 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 t.cast(t.BinaryIO, buf) + + return None + + +def _stream_is_misconfigured(stream: t.TextIO) -> bool: + """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_compat_stream_attr(stream: t.TextIO, attr: str, value: t.Optional[str]) -> bool: + """A stream attribute is compatible if it is equal to the + desired value or the desired value is unset and the attribute + has a value. + """ + stream_value = getattr(stream, attr, None) + return stream_value == value or (value is None and stream_value is not None) + + +def _is_compatible_text_stream( + stream: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] +) -> bool: + """Check if a stream's encoding and errors attributes are + compatible with the desired values. + """ + return _is_compat_stream_attr( + stream, "encoding", encoding + ) and _is_compat_stream_attr(stream, "errors", errors) + + +def _force_correct_text_stream( + text_stream: t.IO[t.Any], + encoding: t.Optional[str], + errors: t.Optional[str], + is_binary: t.Callable[[t.IO[t.Any], bool], bool], + find_binary: t.Callable[[t.IO[t.Any]], t.Optional[t.BinaryIO]], + force_readable: bool = False, + force_writable: bool = False, +) -> t.TextIO: + if is_binary(text_stream, False): + binary_reader = t.cast(t.BinaryIO, text_stream) + else: + text_stream = t.cast(t.TextIO, text_stream) + # If the stream looks compatible, and won't default to a + # misconfigured ascii encoding, return it as-is. + if _is_compatible_text_stream(text_stream, encoding, errors) and not ( + encoding is None and _stream_is_misconfigured(text_stream) + ): + return text_stream + + # Otherwise, get the underlying binary reader. + possible_binary_reader = find_binary(text_stream) + + # If that's not possible, silently use the original reader + # and get mojibake instead of exceptions. + if possible_binary_reader is None: + return text_stream + + binary_reader = possible_binary_reader + + # Default errors to replace instead of strict in order to get + # something that works. + if errors is None: + errors = "replace" + + # Wrap the binary stream in a text stream with the correct + # encoding parameters. + return _make_text_stream( + binary_reader, + encoding, + errors, + force_readable=force_readable, + force_writable=force_writable, + ) + + +def _force_correct_text_reader( + text_reader: t.IO[t.Any], + encoding: t.Optional[str], + errors: t.Optional[str], + force_readable: bool = False, +) -> t.TextIO: + return _force_correct_text_stream( + text_reader, + encoding, + errors, + _is_binary_reader, + _find_binary_reader, + force_readable=force_readable, + ) + + +def _force_correct_text_writer( + text_writer: t.IO[t.Any], + encoding: t.Optional[str], + errors: t.Optional[str], + force_writable: bool = False, +) -> t.TextIO: + return _force_correct_text_stream( + text_writer, + encoding, + errors, + _is_binary_writer, + _find_binary_writer, + force_writable=force_writable, + ) + + +def get_binary_stdin() -> t.BinaryIO: + 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() -> t.BinaryIO: + 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() -> t.BinaryIO: + 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: t.Optional[str] = None, errors: t.Optional[str] = None +) -> t.TextIO: + rv = _get_windows_console_stream(sys.stdin, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_reader(sys.stdin, encoding, errors, force_readable=True) + + +def get_text_stdout( + encoding: t.Optional[str] = None, errors: t.Optional[str] = None +) -> t.TextIO: + rv = _get_windows_console_stream(sys.stdout, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer(sys.stdout, encoding, errors, force_writable=True) + + +def get_text_stderr( + encoding: t.Optional[str] = None, errors: t.Optional[str] = None +) -> t.TextIO: + rv = _get_windows_console_stream(sys.stderr, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer(sys.stderr, encoding, errors, force_writable=True) + + +def _wrap_io_open( + file: t.Union[str, "os.PathLike[str]", int], + mode: str, + encoding: t.Optional[str], + errors: t.Optional[str], +) -> t.IO[t.Any]: + """Handles not passing ``encoding`` and ``errors`` in binary mode.""" + if "b" in mode: + return open(file, mode) + + return open(file, mode, encoding=encoding, errors=errors) + + +def open_stream( + filename: "t.Union[str, os.PathLike[str]]", + mode: str = "r", + encoding: t.Optional[str] = None, + errors: t.Optional[str] = "strict", + atomic: bool = False, +) -> t.Tuple[t.IO[t.Any], bool]: + binary = "b" in mode + filename = os.fspath(filename) + + # Standard streams first. These are simple because they ignore the + # atomic flag. Use fsdecode to handle Path("-"). + if os.fsdecode(filename) == "-": + if any(m in mode for m in ["w", "a", "x"]): + if binary: + return get_binary_stdout(), False + return get_text_stdout(encoding=encoding, errors=errors), False + if binary: + 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: + return _wrap_io_open(filename, mode, encoding, 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 errno + import random + + try: + perm: t.Optional[int] = os.stat(filename).st_mode + except OSError: + perm = None + + flags = os.O_RDWR | os.O_CREAT | os.O_EXCL + + if binary: + flags |= getattr(os, "O_BINARY", 0) + + while True: + tmp_filename = os.path.join( + os.path.dirname(filename), + f".__atomic-write{random.randrange(1 << 32):08x}", + ) + try: + fd = os.open(tmp_filename, flags, 0o666 if perm is None else perm) + break + except OSError as e: + if e.errno == errno.EEXIST or ( + os.name == "nt" + and e.errno == errno.EACCES + and os.path.isdir(e.filename) + and os.access(e.filename, os.W_OK) + ): + continue + raise + + if perm is not None: + os.chmod(tmp_filename, perm) # in case perm includes bits in umask + + f = _wrap_io_open(fd, mode, encoding, errors) + af = _AtomicFile(f, tmp_filename, os.path.realpath(filename)) + return t.cast(t.IO[t.Any], af), True + + +class _AtomicFile: + def __init__(self, f: t.IO[t.Any], tmp_filename: str, real_filename: str) -> None: + self._f = f + self._tmp_filename = tmp_filename + self._real_filename = real_filename + self.closed = False + + @property + def name(self) -> str: + return self._real_filename + + def close(self, delete: bool = False) -> None: + if self.closed: + return + self._f.close() + os.replace(self._tmp_filename, self._real_filename) + self.closed = True + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._f, name) + + def __enter__(self) -> "_AtomicFile": + return self + + def __exit__(self, exc_type: t.Optional[t.Type[BaseException]], *_: t.Any) -> None: + self.close(delete=exc_type is not None) + + def __repr__(self) -> str: + return repr(self._f) + + +def strip_ansi(value: str) -> str: + return _ansi_re.sub("", value) + + +def _is_jupyter_kernel_output(stream: t.IO[t.Any]) -> bool: + while isinstance(stream, (_FixupStream, _NonClosingTextIOWrapper)): + stream = stream._stream + + return stream.__class__.__module__.startswith("ipykernel.") + + +def should_strip_ansi( + stream: t.Optional[t.IO[t.Any]] = None, color: t.Optional[bool] = None +) -> bool: + if color is None: + if stream is None: + stream = sys.stdin + return not isatty(stream) and not _is_jupyter_kernel_output(stream) + return not color + + +# On Windows, wrap the output streams with colorama to support ANSI +# color codes. +# NOTE: double check is needed so mypy does not analyze this on Linux +if sys.platform.startswith("win") and WIN: + from ._winconsole import _get_windows_console_stream + + def _get_argv_encoding() -> str: + import locale + + return locale.getpreferredencoding() + + _ansi_stream_wrappers: t.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() + + def auto_wrap_for_ansi( # noqa: F811 + stream: t.TextIO, color: t.Optional[bool] = None + ) -> t.TextIO: + """Support ANSI color and style codes on Windows by wrapping a + stream with colorama. + """ + try: + cached = _ansi_stream_wrappers.get(stream) + except Exception: + cached = None + + if cached is not None: + return cached + + import colorama + + strip = should_strip_ansi(stream, color) + ansi_wrapper = colorama.AnsiToWin32(stream, strip=strip) + rv = t.cast(t.TextIO, ansi_wrapper.stream) + _write = rv.write + + def _safe_write(s): + try: + return _write(s) + except BaseException: + ansi_wrapper.reset_all() + raise + + rv.write = _safe_write + + try: + _ansi_stream_wrappers[stream] = rv + except Exception: + pass + + return rv + +else: + + def _get_argv_encoding() -> str: + return getattr(sys.stdin, "encoding", None) or sys.getfilesystemencoding() + + def _get_windows_console_stream( + f: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] + ) -> t.Optional[t.TextIO]: + return None + + +def term_len(x: str) -> int: + return len(strip_ansi(x)) + + +def isatty(stream: t.IO[t.Any]) -> bool: + try: + return stream.isatty() + except Exception: + return False + + +def _make_cached_stream_func( + src_func: t.Callable[[], t.Optional[t.TextIO]], + wrapper_func: t.Callable[[], t.TextIO], +) -> t.Callable[[], t.Optional[t.TextIO]]: + cache: t.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() + + def func() -> t.Optional[t.TextIO]: + stream = src_func() + + if stream is None: + return None + + 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: t.Mapping[str, t.Callable[[], t.BinaryIO]] = { + "stdin": get_binary_stdin, + "stdout": get_binary_stdout, + "stderr": get_binary_stderr, +} + +text_streams: t.Mapping[ + str, t.Callable[[t.Optional[str], t.Optional[str]], t.TextIO] +] = { + "stdin": get_text_stdin, + "stdout": get_text_stdout, + "stderr": get_text_stderr, +} diff --git a/server-temp/venv/lib/python3.10/site-packages/click/_termui_impl.py b/server-temp/venv/lib/python3.10/site-packages/click/_termui_impl.py new file mode 100644 index 00000000..f7446577 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/click/_termui_impl.py @@ -0,0 +1,739 @@ +""" +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. +""" +import contextlib +import math +import os +import sys +import time +import typing as t +from gettext import gettext as _ +from io import StringIO +from types import TracebackType + +from ._compat import _default_text_stdout +from ._compat import CYGWIN +from ._compat import get_best_encoding +from ._compat import isatty +from ._compat import open_stream +from ._compat import strip_ansi +from ._compat import term_len +from ._compat import WIN +from .exceptions import ClickException +from .utils import echo + +V = t.TypeVar("V") + +if os.name == "nt": + BEFORE_BAR = "\r" + AFTER_BAR = "\n" +else: + BEFORE_BAR = "\r\033[?25l" + AFTER_BAR = "\033[?25h\n" + + +class ProgressBar(t.Generic[V]): + def __init__( + self, + iterable: t.Optional[t.Iterable[V]], + length: t.Optional[int] = None, + fill_char: str = "#", + empty_char: str = " ", + bar_template: str = "%(bar)s", + info_sep: str = " ", + show_eta: bool = True, + show_percent: t.Optional[bool] = None, + show_pos: bool = False, + item_show_func: t.Optional[t.Callable[[t.Optional[V]], t.Optional[str]]] = None, + label: t.Optional[str] = None, + file: t.Optional[t.TextIO] = None, + color: t.Optional[bool] = None, + update_min_steps: int = 1, + width: int = 30, + ) -> None: + 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: str = label or "" + + if file is None: + file = _default_text_stdout() + + # There are no standard streams attached to write to. For example, + # pythonw on Windows. + if file is None: + file = StringIO() + + self.file = file + self.color = color + self.update_min_steps = update_min_steps + self._completed_intervals = 0 + self.width: int = width + self.autowidth: bool = width == 0 + + if length is None: + from operator import length_hint + + length = length_hint(iterable, -1) + + if length == -1: + length = None + if iterable is None: + if length is None: + raise TypeError("iterable or length is required") + iterable = t.cast(t.Iterable[V], range(length)) + self.iter: t.Iterable[V] = iter(iterable) + self.length = length + self.pos = 0 + self.avg: t.List[float] = [] + self.last_eta: float + self.start: float + self.start = self.last_eta = time.time() + self.eta_known: bool = False + self.finished: bool = False + self.max_width: t.Optional[int] = None + self.entered: bool = False + self.current_item: t.Optional[V] = None + self.is_hidden: bool = not isatty(self.file) + self._last_line: t.Optional[str] = None + + def __enter__(self) -> "ProgressBar[V]": + self.entered = True + self.render_progress() + return self + + def __exit__( + self, + exc_type: t.Optional[t.Type[BaseException]], + exc_value: t.Optional[BaseException], + tb: t.Optional[TracebackType], + ) -> None: + self.render_finish() + + def __iter__(self) -> t.Iterator[V]: + if not self.entered: + raise RuntimeError("You need to use progress bars in a with block.") + self.render_progress() + return self.generator() + + def __next__(self) -> V: + # Iteration is defined in terms of a generator function, + # returned by iter(self); use that to define next(). This works + # because `self.iter` is an iterable consumed by that generator, + # so it is re-entry safe. Calling `next(self.generator())` + # twice works and does "what you want". + return next(iter(self)) + + def render_finish(self) -> None: + if self.is_hidden: + return + self.file.write(AFTER_BAR) + self.file.flush() + + @property + def pct(self) -> float: + if self.finished: + return 1.0 + return min(self.pos / (float(self.length or 1) or 1), 1.0) + + @property + def time_per_iteration(self) -> float: + if not self.avg: + return 0.0 + return sum(self.avg) / float(len(self.avg)) + + @property + def eta(self) -> float: + if self.length is not None and not self.finished: + return self.time_per_iteration * (self.length - self.pos) + return 0.0 + + def format_eta(self) -> str: + if self.eta_known: + t = int(self.eta) + seconds = t % 60 + t //= 60 + minutes = t % 60 + t //= 60 + hours = t % 24 + t //= 24 + if t > 0: + return f"{t}d {hours:02}:{minutes:02}:{seconds:02}" + else: + return f"{hours:02}:{minutes:02}:{seconds:02}" + return "" + + def format_pos(self) -> str: + pos = str(self.pos) + if self.length is not None: + pos += f"/{self.length}" + return pos + + def format_pct(self) -> str: + return f"{int(self.pct * 100): 4}%"[1:] + + def format_bar(self) -> str: + if self.length is not None: + bar_length = int(self.pct * self.width) + bar = self.fill_char * bar_length + bar += self.empty_char * (self.width - bar_length) + elif self.finished: + bar = self.fill_char * self.width + else: + chars = list(self.empty_char * (self.width or 1)) + if self.time_per_iteration != 0: + chars[ + int( + (math.cos(self.pos * self.time_per_iteration) / 2.0 + 0.5) + * self.width + ) + ] = self.fill_char + bar = "".join(chars) + return bar + + def format_progress_line(self) -> str: + show_percent = self.show_percent + + info_bits = [] + if self.length is not None and show_percent is None: + show_percent = not self.show_pos + + if self.show_pos: + info_bits.append(self.format_pos()) + if show_percent: + info_bits.append(self.format_pct()) + if self.show_eta and self.eta_known and not self.finished: + info_bits.append(self.format_eta()) + if self.item_show_func is not None: + item_info = self.item_show_func(self.current_item) + if item_info is not None: + info_bits.append(item_info) + + return ( + self.bar_template + % { + "label": self.label, + "bar": self.format_bar(), + "info": self.info_sep.join(info_bits), + } + ).rstrip() + + def render_progress(self) -> None: + import shutil + + if self.is_hidden: + # Only output the label as it changes if the output is not a + # TTY. Use file=stderr if you expect to be piping stdout. + if self._last_line != self.label: + self._last_line = self.label + echo(self.label, file=self.file, color=self.color) + + return + + buf = [] + # Update width in case the terminal has been resized + if self.autowidth: + old_width = self.width + self.width = 0 + clutter_length = term_len(self.format_progress_line()) + new_width = max(0, shutil.get_terminal_size().columns - clutter_length) + if new_width < old_width: + buf.append(BEFORE_BAR) + buf.append(" " * self.max_width) # type: ignore + 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=False) + self.file.flush() + + def make_step(self, n_steps: int) -> None: + self.pos += n_steps + if self.length is not None and self.pos >= self.length: + self.finished = True + + if (time.time() - self.last_eta) < 1.0: + return + + self.last_eta = time.time() + + # self.avg is a rolling list of length <= 7 of steps where steps are + # defined as time elapsed divided by the total progress through + # self.length. + if self.pos: + step = (time.time() - self.start) / self.pos + else: + step = time.time() - self.start + + self.avg = self.avg[-6:] + [step] + + self.eta_known = self.length is not None + + def update(self, n_steps: int, current_item: t.Optional[V] = None) -> None: + """Update the progress bar by advancing a specified number of + steps, and optionally set the ``current_item`` for this new + position. + + :param n_steps: Number of steps to advance. + :param current_item: Optional item to set as ``current_item`` + for the updated position. + + .. versionchanged:: 8.0 + Added the ``current_item`` optional parameter. + + .. versionchanged:: 8.0 + Only render when the number of steps meets the + ``update_min_steps`` threshold. + """ + if current_item is not None: + self.current_item = current_item + + self._completed_intervals += n_steps + + if self._completed_intervals >= self.update_min_steps: + self.make_step(self._completed_intervals) + self.render_progress() + self._completed_intervals = 0 + + def finish(self) -> None: + self.eta_known = False + self.current_item = None + self.finished = True + + def generator(self) -> t.Iterator[V]: + """Return a generator which yields the items added to the bar + during construction, and updates the progress bar *after* the + yielded block returns. + """ + # WARNING: the iterator interface for `ProgressBar` relies on + # this and only works because this is a simple generator which + # doesn't create or manage additional state. If this function + # changes, the impact should be evaluated both against + # `iter(bar)` and `next(bar)`. `next()` in particular may call + # `self.generator()` repeatedly, and this must remain safe in + # order for that interface to work. + if not self.entered: + raise RuntimeError("You need to use progress bars in a with block.") + + if self.is_hidden: + yield from self.iter + else: + for rv in self.iter: + self.current_item = rv + + # This allows show_item_func to be updated before the + # item is processed. Only trigger at the beginning of + # the update interval. + if self._completed_intervals == 0: + self.render_progress() + + yield rv + self.update(1) + + self.finish() + self.render_progress() + + +def pager(generator: t.Iterable[str], color: t.Optional[bool] = None) -> None: + """Decide what method to use for paging through text.""" + stdout = _default_text_stdout() + + # There are no standard streams attached to write to. For example, + # pythonw on Windows. + if stdout is None: + stdout = StringIO() + + if not isatty(sys.stdin) or not isatty(stdout): + return _nullpager(stdout, generator, color) + pager_cmd = (os.environ.get("PAGER", None) or "").strip() + if pager_cmd: + if WIN: + return _tempfilepager(generator, pager_cmd, color) + return _pipepager(generator, pager_cmd, color) + if os.environ.get("TERM") in ("dumb", "emacs"): + return _nullpager(stdout, generator, color) + if WIN or sys.platform.startswith("os2"): + return _tempfilepager(generator, "more <", color) + if hasattr(os, "system") and os.system("(less) 2>/dev/null") == 0: + return _pipepager(generator, "less", color) + + import tempfile + + fd, filename = tempfile.mkstemp() + os.close(fd) + try: + if hasattr(os, "system") and os.system(f'more "{filename}"') == 0: + return _pipepager(generator, "more", color) + return _nullpager(stdout, generator, color) + finally: + os.unlink(filename) + + +def _pipepager(generator: t.Iterable[str], cmd: str, color: t.Optional[bool]) -> None: + """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 = f"{os.environ.get('LESS', '')}{' '.join(cmd_detail[1:])}" + if not less_flags: + env["LESS"] = "-R" + color = True + elif "r" in less_flags or "R" in less_flags: + color = True + + c = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, env=env) + stdin = t.cast(t.BinaryIO, c.stdin) + encoding = get_best_encoding(stdin) + try: + for text in generator: + if not color: + text = strip_ansi(text) + + stdin.write(text.encode(encoding, "replace")) + except (OSError, KeyboardInterrupt): + pass + else: + stdin.close() + + # Less doesn't respect ^C, but catches it for its own UI purposes (aborting + # search or other commands inside less). + # + # That means when the user hits ^C, the parent process (click) terminates, + # but less is still alive, paging the output and messing up the terminal. + # + # If the user wants to make the pager exit on ^C, they should set + # `LESS='-K'`. It's not our decision to make. + while True: + try: + c.wait() + except KeyboardInterrupt: + pass + else: + break + + +def _tempfilepager( + generator: t.Iterable[str], cmd: str, color: t.Optional[bool] +) -> None: + """Page through text by invoking a program on a temporary file.""" + import tempfile + + fd, filename = tempfile.mkstemp() + # TODO: This never terminates if the passed generator never terminates. + text = "".join(generator) + if not color: + text = strip_ansi(text) + encoding = get_best_encoding(sys.stdout) + with open_stream(filename, "wb")[0] as f: + f.write(text.encode(encoding)) + try: + os.system(f'{cmd} "{filename}"') + finally: + os.close(fd) + os.unlink(filename) + + +def _nullpager( + stream: t.TextIO, generator: t.Iterable[str], color: t.Optional[bool] +) -> None: + """Simply print unformatted text. This is the ultimate fallback.""" + for text in generator: + if not color: + text = strip_ansi(text) + stream.write(text) + + +class Editor: + def __init__( + self, + editor: t.Optional[str] = None, + env: t.Optional[t.Mapping[str, str]] = None, + require_save: bool = True, + extension: str = ".txt", + ) -> None: + self.editor = editor + self.env = env + self.require_save = require_save + self.extension = extension + + def get_editor(self) -> str: + 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 "sensible-editor", "vim", "nano": + if os.system(f"which {editor} >/dev/null 2>&1") == 0: + return editor + return "vi" + + def edit_file(self, filename: str) -> None: + import subprocess + + editor = self.get_editor() + environ: t.Optional[t.Dict[str, str]] = None + + if self.env: + environ = os.environ.copy() + environ.update(self.env) + + try: + c = subprocess.Popen(f'{editor} "{filename}"', env=environ, shell=True) + exit_code = c.wait() + if exit_code != 0: + raise ClickException( + _("{editor}: Editing failed").format(editor=editor) + ) + except OSError as e: + raise ClickException( + _("{editor}: Editing failed: {e}").format(editor=editor, e=e) + ) from e + + def edit(self, text: t.Optional[t.AnyStr]) -> t.Optional[t.AnyStr]: + import tempfile + + if not text: + data = b"" + elif isinstance(text, (bytes, bytearray)): + data = text + else: + if text and not text.endswith("\n"): + text += "\n" + + if WIN: + data = text.replace("\n", "\r\n").encode("utf-8-sig") + else: + data = text.encode("utf-8") + + fd, name = tempfile.mkstemp(prefix="editor-", suffix=self.extension) + f: t.BinaryIO + + try: + with os.fdopen(fd, "wb") as f: + f.write(data) + + # If the filesystem resolution is 1 second, like Mac OS + # 10.12 Extended, or 2 seconds, like FAT32, and the editor + # closes very fast, require_save can fail. Set the modified + # time to be 2 seconds in the past to work around this. + os.utime(name, (os.path.getatime(name), os.path.getmtime(name) - 2)) + # Depending on the resolution, the exact value might not be + # recorded, so get the new recorded value. + timestamp = os.path.getmtime(name) + + self.edit_file(name) + + if self.require_save and os.path.getmtime(name) == timestamp: + return None + + with open(name, "rb") as f: + rv = f.read() + + if isinstance(text, (bytes, bytearray)): + return rv + + return rv.decode("utf-8-sig").replace("\r\n", "\n") # type: ignore + finally: + os.unlink(name) + + +def open_url(url: str, wait: bool = False, locate: bool = False) -> int: + import subprocess + + def _unquote_file(url: str) -> str: + from urllib.parse import unquote + + if url.startswith("file://"): + url = 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.replace('"', "")) + args = f'explorer /select,"{url}"' + else: + url = url.replace('"', "") + wait_str = "/WAIT" if wait else "" + args = f'start {wait_str} "" "{url}"' + return os.system(args) + elif CYGWIN: + if locate: + url = os.path.dirname(_unquote_file(url).replace('"', "")) + args = f'cygstart "{url}"' + else: + url = url.replace('"', "") + wait_str = "-w" if wait else "" + args = f'cygstart {wait_str} "{url}"' + 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: str) -> t.Optional[BaseException]: + if ch == "\x03": + raise KeyboardInterrupt() + + if ch == "\x04" and not WIN: # Unix-like, Ctrl+D + raise EOFError() + + if ch == "\x1a" and WIN: # Windows, Ctrl+Z + raise EOFError() + + return None + + +if WIN: + import msvcrt + + @contextlib.contextmanager + def raw_terminal() -> t.Iterator[int]: + yield -1 + + def getchar(echo: bool) -> str: + # The function `getch` will return a bytes object corresponding to + # the pressed character. Since Windows 10 build 1803, it will also + # return \x00 when called a second time after pressing a regular key. + # + # `getwch` does not share this probably-bugged behavior. Moreover, it + # returns a Unicode object by default, which is what we want. + # + # Either of these functions will return \x00 or \xe0 to indicate + # a special key, and you need to call the same function again to get + # the "rest" of the code. The fun part is that \u00e0 is + # "latin small letter a with grave", so if you type that on a French + # keyboard, you _also_ get a \xe0. + # E.g., consider the Up arrow. This returns \xe0 and then \x48. The + # resulting Unicode string reads as "a with grave" + "capital H". + # This is indistinguishable from when the user actually types + # "a with grave" and then "capital H". + # + # When \xe0 is returned, we assume it's part of a special-key sequence + # and call `getwch` again, but that means that when the user types + # the \u00e0 character, `getchar` doesn't return until a second + # character is typed. + # The alternative is returning immediately, but that would mess up + # cross-platform handling of arrow keys and others that start with + # \xe0. Another option is using `getch`, but then we can't reliably + # read non-ASCII characters, because return values of `getch` are + # limited to the current 8-bit codepage. + # + # Anyway, Click doesn't claim to do this Right(tm), and using `getwch` + # is doing the right thing in more situations than with `getch`. + func: t.Callable[[], str] + + if echo: + func = msvcrt.getwche # type: ignore + else: + func = msvcrt.getwch # type: ignore + + rv = func() + + if rv in ("\x00", "\xe0"): + # \x00 and \xe0 are control characters that indicate special key, + # see above. + rv += func() + + _translate_ch_to_exc(rv) + return rv + +else: + import tty + import termios + + @contextlib.contextmanager + def raw_terminal() -> t.Iterator[int]: + f: t.Optional[t.TextIO] + fd: int + + if not isatty(sys.stdin): + f = open("/dev/tty") + fd = f.fileno() + else: + fd = sys.stdin.fileno() + f = None + + try: + old_settings = termios.tcgetattr(fd) + + try: + tty.setraw(fd) + yield fd + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) + sys.stdout.flush() + + if f is not None: + f.close() + except termios.error: + pass + + def getchar(echo: bool) -> str: + with raw_terminal() as fd: + ch = os.read(fd, 32).decode(get_best_encoding(sys.stdin), "replace") + + if echo and isatty(sys.stdout): + sys.stdout.write(ch) + + _translate_ch_to_exc(ch) + return ch diff --git a/server-temp/venv/lib/python3.10/site-packages/click/_textwrap.py b/server-temp/venv/lib/python3.10/site-packages/click/_textwrap.py new file mode 100644 index 00000000..b47dcbd4 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/click/_textwrap.py @@ -0,0 +1,49 @@ +import textwrap +import typing as t +from contextlib import contextmanager + + +class TextWrapper(textwrap.TextWrapper): + def _handle_long_word( + self, + reversed_chunks: t.List[str], + cur_line: t.List[str], + cur_len: int, + width: int, + ) -> None: + 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: str) -> t.Iterator[None]: + 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: str) -> str: + rv = [] + + for idx, line in enumerate(text.splitlines()): + indent = self.initial_indent + + if idx > 0: + indent = self.subsequent_indent + + rv.append(f"{indent}{line}") + + return "\n".join(rv) diff --git a/server-temp/venv/lib/python3.10/site-packages/click/_winconsole.py b/server-temp/venv/lib/python3.10/site-packages/click/_winconsole.py new file mode 100644 index 00000000..6b20df31 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/click/_winconsole.py @@ -0,0 +1,279 @@ +# 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 prompt. +import io +import sys +import time +import typing as t +from ctypes import byref +from ctypes import c_char +from ctypes import c_char_p +from ctypes import c_int +from ctypes import c_ssize_t +from ctypes import c_ulong +from ctypes import c_void_p +from ctypes import POINTER +from ctypes import py_object +from ctypes import Structure +from ctypes.wintypes import DWORD +from ctypes.wintypes import HANDLE +from ctypes.wintypes import LPCWSTR +from ctypes.wintypes import LPWSTR + +from ._compat import _NonClosingTextIOWrapper + +assert sys.platform == "win32" +import msvcrt # noqa: E402 +from ctypes import windll # noqa: E402 +from ctypes import WINFUNCTYPE # noqa: E402 + +c_ssize_p = POINTER(c_ssize_t) + +kernel32 = windll.kernel32 +GetStdHandle = kernel32.GetStdHandle +ReadConsoleW = kernel32.ReadConsoleW +WriteConsoleW = kernel32.WriteConsoleW +GetConsoleMode = kernel32.GetConsoleMode +GetLastError = kernel32.GetLastError +GetCommandLineW = WINFUNCTYPE(LPWSTR)(("GetCommandLineW", windll.kernel32)) +CommandLineToArgvW = WINFUNCTYPE(POINTER(LPWSTR), LPCWSTR, POINTER(c_int))( + ("CommandLineToArgvW", windll.shell32) +) +LocalFree = WINFUNCTYPE(c_void_p, c_void_p)(("LocalFree", windll.kernel32)) + +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 + +try: + from ctypes import pythonapi +except ImportError: + # On PyPy we cannot get buffers so our ability to operate here is + # severely limited. + get_buffer = None +else: + + class Py_buffer(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), + ] + + PyObject_GetBuffer = pythonapi.PyObject_GetBuffer + PyBuffer_Release = pythonapi.PyBuffer_Release + + 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): + super().isatty() + 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( + HANDLE(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(f"Windows error: {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 f"Windows error {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( + HANDLE(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: + def __init__(self, text_stream: t.TextIO, byte_stream: t.BinaryIO) -> None: + self._text_stream = text_stream + self.buffer = byte_stream + + @property + def name(self) -> str: + return self.buffer.name + + def write(self, x: t.AnyStr) -> int: + if isinstance(x, str): + return self._text_stream.write(x) + try: + self.flush() + except Exception: + pass + return self.buffer.write(x) + + def writelines(self, lines: t.Iterable[t.AnyStr]) -> None: + for line in lines: + self.write(line) + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._text_stream, name) + + def isatty(self) -> bool: + return self.buffer.isatty() + + def __repr__(self): + return f"" + + +def _get_text_stdin(buffer_stream: t.BinaryIO) -> t.TextIO: + text_stream = _NonClosingTextIOWrapper( + io.BufferedReader(_WindowsConsoleReader(STDIN_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) + + +def _get_text_stdout(buffer_stream: t.BinaryIO) -> t.TextIO: + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDOUT_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) + + +def _get_text_stderr(buffer_stream: t.BinaryIO) -> t.TextIO: + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDERR_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) + + +_stream_factories: t.Mapping[int, t.Callable[[t.BinaryIO], t.TextIO]] = { + 0: _get_text_stdin, + 1: _get_text_stdout, + 2: _get_text_stderr, +} + + +def _is_console(f: t.TextIO) -> bool: + if not hasattr(f, "fileno"): + return False + + try: + fileno = f.fileno() + except (OSError, io.UnsupportedOperation): + return False + + handle = msvcrt.get_osfhandle(fileno) + return bool(GetConsoleMode(handle, byref(DWORD()))) + + +def _get_windows_console_stream( + f: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] +) -> t.Optional[t.TextIO]: + if ( + get_buffer is not None + and encoding in {"utf-16-le", None} + and errors in {"strict", None} + and _is_console(f) + ): + func = _stream_factories.get(f.fileno()) + if func is not None: + b = getattr(f, "buffer", None) + + if b is None: + return None + + return func(b) diff --git a/server-temp/venv/lib/python3.10/site-packages/click/core.py b/server-temp/venv/lib/python3.10/site-packages/click/core.py new file mode 100644 index 00000000..cc65e896 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/click/core.py @@ -0,0 +1,3042 @@ +import enum +import errno +import inspect +import os +import sys +import typing as t +from collections import abc +from contextlib import contextmanager +from contextlib import ExitStack +from functools import update_wrapper +from gettext import gettext as _ +from gettext import ngettext +from itertools import repeat +from types import TracebackType + +from . import types +from .exceptions import Abort +from .exceptions import BadParameter +from .exceptions import ClickException +from .exceptions import Exit +from .exceptions import MissingParameter +from .exceptions import UsageError +from .formatting import HelpFormatter +from .formatting import join_options +from .globals import pop_context +from .globals import push_context +from .parser import _flag_needs_value +from .parser import OptionParser +from .parser import split_opt +from .termui import confirm +from .termui import prompt +from .termui import style +from .utils import _detect_program_name +from .utils import _expand_args +from .utils import echo +from .utils import make_default_short_help +from .utils import make_str +from .utils import PacifyFlushWrapper + +if t.TYPE_CHECKING: + import typing_extensions as te + from .shell_completion import CompletionItem + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) +V = t.TypeVar("V") + + +def _complete_visible_commands( + ctx: "Context", incomplete: str +) -> t.Iterator[t.Tuple[str, "Command"]]: + """List all the subcommands of a group that start with the + incomplete value and aren't hidden. + + :param ctx: Invocation context for the group. + :param incomplete: Value being completed. May be empty. + """ + multi = t.cast(MultiCommand, ctx.command) + + for name in multi.list_commands(ctx): + if name.startswith(incomplete): + command = multi.get_command(ctx, name) + + if command is not None and not command.hidden: + yield name, command + + +def _check_multicommand( + base_command: "MultiCommand", cmd_name: str, cmd: "Command", register: bool = False +) -> None: + 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( + f"{hint}. Command {base_command.name!r} is set to chain and" + f" {cmd_name!r} was added as a subcommand but it in itself is a" + f" multi command. ({cmd_name!r} is a {type(cmd).__name__}" + f" within a chained {type(base_command).__name__} named" + f" {base_command.name!r})." + ) + + +def batch(iterable: t.Iterable[V], batch_size: int) -> t.List[t.Tuple[V, ...]]: + return list(zip(*repeat(iter(iterable), batch_size))) + + +@contextmanager +def augment_usage_errors( + ctx: "Context", param: t.Optional["Parameter"] = None +) -> t.Iterator[None]: + """Context manager that attaches extra information to exceptions.""" + 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: t.Sequence["Parameter"], + declaration_order: t.Sequence["Parameter"], +) -> t.List["Parameter"]: + """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: "Parameter") -> t.Tuple[bool, float]: + try: + idx: float = invocation_order.index(item) + except ValueError: + idx = float("inf") + + return not item.is_eager, idx + + return sorted(declaration_order, key=sort_key) + + +class ParameterSource(enum.Enum): + """This is an :class:`~enum.Enum` that indicates the source of a + parameter's value. + + Use :meth:`click.Context.get_parameter_source` to get the + source for a parameter by name. + + .. versionchanged:: 8.0 + Use :class:`~enum.Enum` and drop the ``validate`` method. + + .. versionchanged:: 8.0 + Added the ``PROMPT`` value. + """ + + COMMANDLINE = enum.auto() + """The value was provided by the command line args.""" + ENVIRONMENT = enum.auto() + """The value was provided with an environment variable.""" + DEFAULT = enum.auto() + """Used the default specified by the parameter.""" + DEFAULT_MAP = enum.auto() + """Used a default provided by :attr:`Context.default_map`.""" + PROMPT = enum.auto() + """Used a prompt to confirm a default or provide a value.""" + + +class Context: + """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. + + :param command: the command class for this context. + :param parent: the parent context. + :param info_name: the info name for this invocation. Generally this + is the most descriptive name for the script or + command. For the toplevel script it is usually + the name of the script, for commands below it it's + the name of the script. + :param obj: an arbitrary object of user data. + :param auto_envvar_prefix: the prefix to use for automatic environment + variables. If this is `None` then reading + from environment variables is disabled. This + does not affect manually set environment + variables which are always read. + :param default_map: a dictionary (like object) with default values + for parameters. + :param terminal_width: the width of the terminal. The default is + inherit from parent context. If no context + defines the terminal width then auto + detection will be applied. + :param max_content_width: the maximum width for content rendered by + Click (this currently only affects help + pages). This defaults to 80 characters if + not overridden. In other words: even if the + terminal is larger than that, Click will not + format things wider than 80 characters by + default. In addition to that, formatters might + add some safety mapping on the right. + :param resilient_parsing: if this flag is enabled then Click will + parse without any interactivity or callback + invocation. Default values will also be + ignored. This is useful for implementing + things such as completion support. + :param allow_extra_args: if this is set to `True` then extra arguments + at the end will not raise an error and will be + kept on the context. The default is to inherit + from the command. + :param allow_interspersed_args: if this is set to `False` then options + and arguments cannot be mixed. The + default is to inherit from the command. + :param ignore_unknown_options: instructs click to ignore options it does + not know and keeps them for later + processing. + :param help_option_names: optionally a list of strings that define how + the default help parameter is named. The + default is ``['--help']``. + :param token_normalize_func: an optional function that is used to + normalize tokens (options, choices, + etc.). This for instance can be used to + implement case insensitive behavior. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. This is only needed if ANSI + codes are used in texts that Click prints which is by + default not the case. This for instance would affect + help output. + :param show_default: Show the default value for commands. If this + value is not set, it defaults to the value from the parent + context. ``Command.show_default`` overrides this default for the + specific command. + + .. versionchanged:: 8.1 + The ``show_default`` parameter is overridden by + ``Command.show_default``, instead of the other way around. + + .. versionchanged:: 8.0 + The ``show_default`` parameter defaults to the value from the + parent context. + + .. versionchanged:: 7.1 + Added the ``show_default`` parameter. + + .. versionchanged:: 4.0 + Added the ``color``, ``ignore_unknown_options``, and + ``max_content_width`` parameters. + + .. versionchanged:: 3.0 + Added the ``allow_extra_args`` and ``allow_interspersed_args`` + parameters. + + .. versionchanged:: 2.0 + Added the ``resilient_parsing``, ``help_option_names``, and + ``token_normalize_func`` parameters. + """ + + #: The formatter class to create with :meth:`make_formatter`. + #: + #: .. versionadded:: 8.0 + formatter_class: t.Type["HelpFormatter"] = HelpFormatter + + def __init__( + self, + command: "Command", + parent: t.Optional["Context"] = None, + info_name: t.Optional[str] = None, + obj: t.Optional[t.Any] = None, + auto_envvar_prefix: t.Optional[str] = None, + default_map: t.Optional[t.MutableMapping[str, t.Any]] = None, + terminal_width: t.Optional[int] = None, + max_content_width: t.Optional[int] = None, + resilient_parsing: bool = False, + allow_extra_args: t.Optional[bool] = None, + allow_interspersed_args: t.Optional[bool] = None, + ignore_unknown_options: t.Optional[bool] = None, + help_option_names: t.Optional[t.List[str]] = None, + token_normalize_func: t.Optional[t.Callable[[str], str]] = None, + color: t.Optional[bool] = None, + show_default: t.Optional[bool] = None, + ) -> 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 + #: Map of parameter names to their parsed values. Parameters + #: with ``expose_value=False`` are not stored. + self.params: t.Dict[str, t.Any] = {} + #: the leftover arguments. + self.args: t.List[str] = [] + #: 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: t.List[str] = [] + #: the collected prefixes of the command's options. + self._opt_prefixes: t.Set[str] = set(parent._opt_prefixes) if parent else set() + + if obj is None and parent is not None: + obj = parent.obj + + #: the user object stored. + self.obj: t.Any = obj + self._meta: t.Dict[str, t.Any] = getattr(parent, "meta", {}) + + #: A dictionary (-like object) with defaults for parameters. + if ( + default_map is None + and info_name is not None + and parent is not None + and parent.default_map is not None + ): + default_map = parent.default_map.get(info_name) + + self.default_map: t.Optional[t.MutableMapping[str, t.Any]] = 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:`result_callback`. + self.invoked_subcommand: t.Optional[str] = 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: t.Optional[int] = 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: t.Optional[int] = 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: bool = 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: bool = 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: t.List[str] = 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: t.Optional[ + t.Callable[[str], str] + ] = token_normalize_func + + #: Indicates if resilient parsing is enabled. In that case Click + #: will do its best to not cause any failures and default values + #: will be ignored. Useful for completion. + self.resilient_parsing: bool = 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 = ( + f"{parent.auto_envvar_prefix}_{self.info_name.upper()}" + ) + else: + auto_envvar_prefix = auto_envvar_prefix.upper() + + if auto_envvar_prefix is not None: + auto_envvar_prefix = auto_envvar_prefix.replace("-", "_") + + self.auto_envvar_prefix: t.Optional[str] = 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: t.Optional[bool] = color + + if show_default is None and parent is not None: + show_default = parent.show_default + + #: Show option default values when formatting help text. + self.show_default: t.Optional[bool] = show_default + + self._close_callbacks: t.List[t.Callable[[], t.Any]] = [] + self._depth = 0 + self._parameter_source: t.Dict[str, ParameterSource] = {} + self._exit_stack = ExitStack() + + def to_info_dict(self) -> t.Dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. This traverses the entire CLI + structure. + + .. code-block:: python + + with Context(cli) as ctx: + info = ctx.to_info_dict() + + .. versionadded:: 8.0 + """ + return { + "command": self.command.to_info_dict(self), + "info_name": self.info_name, + "allow_extra_args": self.allow_extra_args, + "allow_interspersed_args": self.allow_interspersed_args, + "ignore_unknown_options": self.ignore_unknown_options, + "auto_envvar_prefix": self.auto_envvar_prefix, + } + + def __enter__(self) -> "Context": + self._depth += 1 + push_context(self) + return self + + def __exit__( + self, + exc_type: t.Optional[t.Type[BaseException]], + exc_value: t.Optional[BaseException], + tb: t.Optional[TracebackType], + ) -> None: + self._depth -= 1 + if self._depth == 0: + self.close() + pop_context() + + @contextmanager + def scope(self, cleanup: bool = True) -> t.Iterator["Context"]: + """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) -> t.Dict[str, t.Any]: + """This is a dictionary which is shared with all the contexts + that are nested. It exists so that click utilities can store some + state here if they need to. It is however the responsibility of + that code to manage this dictionary well. + + The keys are supposed to be unique dotted strings. For instance + module paths are a good choice for it. What is stored in there is + irrelevant for the operation of click. However what is important is + that code that places data here adheres to the general semantics of + the system. + + Example usage:: + + LANG_KEY = f'{__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) -> HelpFormatter: + """Creates the :class:`~click.HelpFormatter` for the help and + usage output. + + To quickly customize the formatter class used without overriding + this method, set the :attr:`formatter_class` attribute. + + .. versionchanged:: 8.0 + Added the :attr:`formatter_class` attribute. + """ + return self.formatter_class( + width=self.terminal_width, max_width=self.max_content_width + ) + + def with_resource(self, context_manager: t.ContextManager[V]) -> V: + """Register a resource as if it were used in a ``with`` + statement. The resource will be cleaned up when the context is + popped. + + Uses :meth:`contextlib.ExitStack.enter_context`. It calls the + resource's ``__enter__()`` method and returns the result. When + the context is popped, it closes the stack, which calls the + resource's ``__exit__()`` method. + + To register a cleanup function for something that isn't a + context manager, use :meth:`call_on_close`. Or use something + from :mod:`contextlib` to turn it into a context manager first. + + .. code-block:: python + + @click.group() + @click.option("--name") + @click.pass_context + def cli(ctx): + ctx.obj = ctx.with_resource(connect_db(name)) + + :param context_manager: The context manager to enter. + :return: Whatever ``context_manager.__enter__()`` returns. + + .. versionadded:: 8.0 + """ + return self._exit_stack.enter_context(context_manager) + + def call_on_close(self, f: t.Callable[..., t.Any]) -> t.Callable[..., t.Any]: + """Register a function to be called when the context tears down. + + This can be used to close resources opened during the script + execution. Resources that support Python's context manager + protocol which would be used in a ``with`` statement should be + registered with :meth:`with_resource` instead. + + :param f: The function to execute on teardown. + """ + return self._exit_stack.callback(f) + + def close(self) -> None: + """Invoke all close callbacks registered with + :meth:`call_on_close`, and exit all context managers entered + with :meth:`with_resource`. + """ + self._exit_stack.close() + # In case the context is reused, create a new exit stack. + self._exit_stack = ExitStack() + + @property + def command_path(self) -> str: + """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: + parent_command_path = [self.parent.command_path] + + if isinstance(self.parent.command, Command): + for param in self.parent.command.get_params(self): + parent_command_path.extend(param.get_usage_pieces(self)) + + rv = f"{' '.join(parent_command_path)} {rv}" + return rv.lstrip() + + def find_root(self) -> "Context": + """Finds the outermost context.""" + node = self + while node.parent is not None: + node = node.parent + return node + + def find_object(self, object_type: t.Type[V]) -> t.Optional[V]: + """Finds the closest object of a given type.""" + node: t.Optional["Context"] = self + + while node is not None: + if isinstance(node.obj, object_type): + return node.obj + + node = node.parent + + return None + + def ensure_object(self, object_type: t.Type[V]) -> V: + """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 + + @t.overload + def lookup_default( + self, name: str, call: "te.Literal[True]" = True + ) -> t.Optional[t.Any]: + ... + + @t.overload + def lookup_default( + self, name: str, call: "te.Literal[False]" = ... + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: + ... + + def lookup_default(self, name: str, call: bool = True) -> t.Optional[t.Any]: + """Get the default for a parameter from :attr:`default_map`. + + :param name: Name of the parameter. + :param call: If the default is a callable, call it. Disable to + return the callable instead. + + .. versionchanged:: 8.0 + Added the ``call`` parameter. + """ + if self.default_map is not None: + value = self.default_map.get(name) + + if call and callable(value): + return value() + + return value + + return None + + def fail(self, message: str) -> "te.NoReturn": + """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) -> "te.NoReturn": + """Aborts the script.""" + raise Abort() + + def exit(self, code: int = 0) -> "te.NoReturn": + """Exits the application with a given exit code.""" + raise Exit(code) + + def get_usage(self) -> str: + """Helper method to get formatted usage string for the current + context and command. + """ + return self.command.get_usage(self) + + def get_help(self) -> str: + """Helper method to get formatted help page for the current + context and command. + """ + return self.command.get_help(self) + + def _make_sub_context(self, command: "Command") -> "Context": + """Create a new context of the same type as this context, but + for a new command. + + :meta private: + """ + return type(self)(command, info_name=command.name, parent=self) + + @t.overload + def invoke( + __self, # noqa: B902 + __callback: "t.Callable[..., V]", + *args: t.Any, + **kwargs: t.Any, + ) -> V: + ... + + @t.overload + def invoke( + __self, # noqa: B902 + __callback: "Command", + *args: t.Any, + **kwargs: t.Any, + ) -> t.Any: + ... + + def invoke( + __self, # noqa: B902 + __callback: t.Union["Command", "t.Callable[..., V]"], + *args: t.Any, + **kwargs: t.Any, + ) -> t.Union[t.Any, V]: + """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`. + + .. versionchanged:: 8.0 + All ``kwargs`` are tracked in :attr:`params` so they will be + passed if :meth:`forward` is called at multiple levels. + """ + if isinstance(__callback, Command): + other_cmd = __callback + + if other_cmd.callback is None: + raise TypeError( + "The given command does not have a callback that can be invoked." + ) + else: + __callback = t.cast("t.Callable[..., V]", other_cmd.callback) + + ctx = __self._make_sub_context(other_cmd) + + for param in other_cmd.params: + if param.name not in kwargs and param.expose_value: + kwargs[param.name] = param.type_cast_value( # type: ignore + ctx, param.get_default(ctx) + ) + + # Track all kwargs as params, so that forward() will pass + # them on in subsequent calls. + ctx.params.update(kwargs) + else: + ctx = __self + + with augment_usage_errors(__self): + with ctx: + return __callback(*args, **kwargs) + + def forward( + __self, __cmd: "Command", *args: t.Any, **kwargs: t.Any # noqa: B902 + ) -> t.Any: + """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. + + .. versionchanged:: 8.0 + All ``kwargs`` are tracked in :attr:`params` so they will be + passed if ``forward`` is called at multiple levels. + """ + # Can only forward to other commands, not direct callbacks. + 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, *args, **kwargs) + + def set_parameter_source(self, name: str, source: ParameterSource) -> None: + """Set the source of a parameter. This indicates the location + from which the value of the parameter was obtained. + + :param name: The name of the parameter. + :param source: A member of :class:`~click.core.ParameterSource`. + """ + self._parameter_source[name] = source + + def get_parameter_source(self, name: str) -> t.Optional[ParameterSource]: + """Get the source of a parameter. This indicates the location + from which the value of the parameter was obtained. + + This can be useful for determining when a user specified a value + on the command line that is the same as the default value. It + will be :attr:`~click.core.ParameterSource.DEFAULT` only if the + value was actually taken from the default. + + :param name: The name of the parameter. + :rtype: ParameterSource + + .. versionchanged:: 8.0 + Returns ``None`` if the parameter was not provided from any + source. + """ + return self._parameter_source.get(name) + + +class BaseCommand: + """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 context class to create with :meth:`make_context`. + #: + #: .. versionadded:: 8.0 + context_class: t.Type[Context] = Context + #: 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: t.Optional[str], + context_settings: t.Optional[t.MutableMapping[str, t.Any]] = None, + ) -> 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: t.MutableMapping[str, t.Any] = context_settings + + def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. This traverses the entire structure + below this command. + + Use :meth:`click.Context.to_info_dict` to traverse the entire + CLI structure. + + :param ctx: A :class:`Context` representing this command. + + .. versionadded:: 8.0 + """ + return {"name": self.name} + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} {self.name}>" + + def get_usage(self, ctx: Context) -> str: + raise NotImplementedError("Base commands cannot get usage") + + def get_help(self, ctx: Context) -> str: + raise NotImplementedError("Base commands cannot get help") + + def make_context( + self, + info_name: t.Optional[str], + args: t.List[str], + parent: t.Optional[Context] = None, + **extra: t.Any, + ) -> Context: + """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. + + To quickly customize the context class used without overriding + this method, set the :attr:`context_class` attribute. + + :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's usually + the name of the script, for commands below it's + the name of the command. + :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. + + .. versionchanged:: 8.0 + Added the :attr:`context_class` attribute. + """ + for key, value in self.context_settings.items(): + if key not in extra: + extra[key] = value + + ctx = self.context_class( + self, info_name=info_name, parent=parent, **extra # type: ignore + ) + + with ctx.scope(cleanup=False): + self.parse_args(ctx, args) + return ctx + + def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: + """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: Context) -> t.Any: + """Given a context, this invokes the command. The default + implementation is raising a not implemented error. + """ + raise NotImplementedError("Base commands are not invocable by default") + + def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: + """Return a list of completions for the incomplete value. Looks + at the names of chained multi-commands. + + Any command could be part of a chained multi-command, so sibling + commands are valid at any point during command completion. Other + command classes will return more completions. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + results: t.List["CompletionItem"] = [] + + while ctx.parent is not None: + ctx = ctx.parent + + if isinstance(ctx.command, MultiCommand) and ctx.command.chain: + results.extend( + CompletionItem(name, help=command.get_short_help_str()) + for name, command in _complete_visible_commands(ctx, incomplete) + if name not in ctx.protected_args + ) + + return results + + @t.overload + def main( + self, + args: t.Optional[t.Sequence[str]] = None, + prog_name: t.Optional[str] = None, + complete_var: t.Optional[str] = None, + standalone_mode: "te.Literal[True]" = True, + **extra: t.Any, + ) -> "te.NoReturn": + ... + + @t.overload + def main( + self, + args: t.Optional[t.Sequence[str]] = None, + prog_name: t.Optional[str] = None, + complete_var: t.Optional[str] = None, + standalone_mode: bool = ..., + **extra: t.Any, + ) -> t.Any: + ... + + def main( + self, + args: t.Optional[t.Sequence[str]] = None, + prog_name: t.Optional[str] = None, + complete_var: t.Optional[str] = None, + standalone_mode: bool = True, + windows_expand_args: bool = True, + **extra: t.Any, + ) -> t.Any: + """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`. + + :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 windows_expand_args: Expand glob patterns, user dir, and + env vars in command line args on Windows. + :param extra: extra keyword arguments are forwarded to the context + constructor. See :class:`Context` for more information. + + .. versionchanged:: 8.0.1 + Added the ``windows_expand_args`` parameter to allow + disabling command line arg expansion on Windows. + + .. versionchanged:: 8.0 + When taking arguments from ``sys.argv`` on Windows, glob + patterns, user dir, and env vars are expanded. + + .. versionchanged:: 3.0 + Added the ``standalone_mode`` parameter. + """ + if args is None: + args = sys.argv[1:] + + if os.name == "nt" and windows_expand_args: + args = _expand_args(args) + else: + args = list(args) + + if prog_name is None: + prog_name = _detect_program_name() + + # Process shell completion requests and exit early. + self._main_shell_completion(extra, prog_name, complete_var) + + try: + try: + with self.make_context(prog_name, args, **extra) as ctx: + rv = self.invoke(ctx) + if not standalone_mode: + return rv + # it's not safe to `ctx.exit(rv)` here! + # note that `rv` may actually contain data like "1" which + # has obvious effects + # more subtle case: `rv=[None, None]` can come out of + # chained commands which all returned `None` -- so it's not + # even always obvious that `rv` indicates success/failure + # by its truthiness/falsiness + ctx.exit() + except (EOFError, KeyboardInterrupt) as e: + echo(file=sys.stderr) + raise Abort() from e + except ClickException as e: + if not standalone_mode: + raise + e.show() + sys.exit(e.exit_code) + except OSError as e: + if e.errno == errno.EPIPE: + sys.stdout = t.cast(t.TextIO, PacifyFlushWrapper(sys.stdout)) + sys.stderr = t.cast(t.TextIO, PacifyFlushWrapper(sys.stderr)) + sys.exit(1) + else: + raise + except Exit as e: + if standalone_mode: + sys.exit(e.exit_code) + else: + # in non-standalone mode, return the exit code + # note that this is only reached if `self.invoke` above raises + # an Exit explicitly -- thus bypassing the check there which + # would return its result + # the results of non-standalone execution may therefore be + # somewhat ambiguous: if there are codepaths which lead to + # `ctx.exit(1)` and to `return 1`, the caller won't be able to + # tell the difference between the two + return e.exit_code + except Abort: + if not standalone_mode: + raise + echo(_("Aborted!"), file=sys.stderr) + sys.exit(1) + + def _main_shell_completion( + self, + ctx_args: t.MutableMapping[str, t.Any], + prog_name: str, + complete_var: t.Optional[str] = None, + ) -> None: + """Check if the shell is asking for tab completion, process + that, then exit early. Called from :meth:`main` before the + program is invoked. + + :param prog_name: Name of the executable in the shell. + :param complete_var: Name of the environment variable that holds + the completion instruction. Defaults to + ``_{PROG_NAME}_COMPLETE``. + + .. versionchanged:: 8.2.0 + Dots (``.``) in ``prog_name`` are replaced with underscores (``_``). + """ + if complete_var is None: + complete_name = prog_name.replace("-", "_").replace(".", "_") + complete_var = f"_{complete_name}_COMPLETE".upper() + + instruction = os.environ.get(complete_var) + + if not instruction: + return + + from .shell_completion import shell_complete + + rv = shell_complete(self, ctx_args, prog_name, complete_var, instruction) + sys.exit(rv) + + def __call__(self, *args: t.Any, **kwargs: t.Any) -> t.Any: + """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. + + :param name: the name of the command to use unless a group overrides it. + :param context_settings: an optional dictionary with defaults that are + passed to the context object. + :param callback: the callback to invoke. This is optional. + :param params: the parameters to register with this command. This can + be either :class:`Option` or :class:`Argument` objects. + :param help: the help string to use for this command. + :param epilog: like the help string but it's printed at the end of the + help page after everything else. + :param short_help: the short help to use for this command. This is + shown on the command listing of the parent command. + :param add_help_option: by default each command registers a ``--help`` + option. This can be disabled by this parameter. + :param no_args_is_help: this controls what happens if no arguments are + provided. This option is disabled by default. + If enabled this will add ``--help`` as argument + if no arguments are passed + :param hidden: hide this command from help outputs. + + :param deprecated: issues a message indicating that + the command is deprecated. + + .. versionchanged:: 8.1 + ``help``, ``epilog``, and ``short_help`` are stored unprocessed, + all formatting is done when outputting help text, not at init, + and is done even if not using the ``@command`` decorator. + + .. versionchanged:: 8.0 + Added a ``repr`` showing the command name. + + .. versionchanged:: 7.1 + Added the ``no_args_is_help`` parameter. + + .. versionchanged:: 2.0 + Added the ``context_settings`` parameter. + """ + + def __init__( + self, + name: t.Optional[str], + context_settings: t.Optional[t.MutableMapping[str, t.Any]] = None, + callback: t.Optional[t.Callable[..., t.Any]] = None, + params: t.Optional[t.List["Parameter"]] = None, + help: t.Optional[str] = None, + epilog: t.Optional[str] = None, + short_help: t.Optional[str] = None, + options_metavar: t.Optional[str] = "[OPTIONS]", + add_help_option: bool = True, + no_args_is_help: bool = False, + hidden: bool = False, + deprecated: bool = False, + ) -> None: + super().__init__(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: t.List["Parameter"] = params or [] + self.help = help + self.epilog = epilog + self.options_metavar = options_metavar + self.short_help = short_help + self.add_help_option = add_help_option + self.no_args_is_help = no_args_is_help + self.hidden = hidden + self.deprecated = deprecated + + def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict(ctx) + info_dict.update( + params=[param.to_info_dict() for param in self.get_params(ctx)], + help=self.help, + epilog=self.epilog, + short_help=self.short_help, + hidden=self.hidden, + deprecated=self.deprecated, + ) + return info_dict + + def get_usage(self, ctx: Context) -> str: + """Formats the usage line into a string and returns it. + + Calls :meth:`format_usage` internally. + """ + formatter = ctx.make_formatter() + self.format_usage(ctx, formatter) + return formatter.getvalue().rstrip("\n") + + def get_params(self, ctx: Context) -> t.List["Parameter"]: + 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: Context, formatter: HelpFormatter) -> None: + """Writes the usage line into the formatter. + + This is a low-level method called by :meth:`get_usage`. + """ + pieces = self.collect_usage_pieces(ctx) + formatter.write_usage(ctx.command_path, " ".join(pieces)) + + def collect_usage_pieces(self, ctx: Context) -> t.List[str]: + """Returns all the pieces that go into the usage line and returns + it as a list of strings. + """ + rv = [self.options_metavar] if self.options_metavar else [] + + for param in self.get_params(ctx): + rv.extend(param.get_usage_pieces(ctx)) + + return rv + + def get_help_option_names(self, ctx: Context) -> t.List[str]: + """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 list(all_names) + + def get_help_option(self, ctx: Context) -> t.Optional["Option"]: + """Returns the help option object.""" + help_options = self.get_help_option_names(ctx) + + if not help_options or not self.add_help_option: + return None + + def show_help(ctx: Context, param: "Parameter", value: str) -> None: + 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: Context) -> OptionParser: + """Creates the underlying option parser for this command.""" + parser = OptionParser(ctx) + for param in self.get_params(ctx): + param.add_to_parser(parser, ctx) + return parser + + def get_help(self, ctx: Context) -> str: + """Formats the help into a string and returns it. + + Calls :meth:`format_help` internally. + """ + formatter = ctx.make_formatter() + self.format_help(ctx, formatter) + return formatter.getvalue().rstrip("\n") + + def get_short_help_str(self, limit: int = 45) -> str: + """Gets short help for the command or makes it by shortening the + long help string. + """ + if self.short_help: + text = inspect.cleandoc(self.short_help) + elif self.help: + text = make_default_short_help(self.help, limit) + else: + text = "" + + if self.deprecated: + text = _("(Deprecated) {text}").format(text=text) + + return text.strip() + + def format_help(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the help into the formatter if it exists. + + This is a low-level method called by :meth:`get_help`. + + This calls 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: Context, formatter: HelpFormatter) -> None: + """Writes the help text to the formatter if it exists.""" + if self.help is not None: + # truncate the help text to the first form feed + text = inspect.cleandoc(self.help).partition("\f")[0] + else: + text = "" + + if self.deprecated: + text = _("(Deprecated) {text}").format(text=text) + + if text: + formatter.write_paragraph() + + with formatter.indentation(): + formatter.write_text(text) + + def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: + """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: Context, formatter: HelpFormatter) -> None: + """Writes the epilog into the formatter if it exists.""" + if self.epilog: + epilog = inspect.cleandoc(self.epilog) + formatter.write_paragraph() + + with formatter.indentation(): + formatter.write_text(epilog) + + def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: + if not args and self.no_args_is_help and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + 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( + ngettext( + "Got unexpected extra argument ({args})", + "Got unexpected extra arguments ({args})", + len(args), + ).format(args=" ".join(map(str, args))) + ) + + ctx.args = args + ctx._opt_prefixes.update(parser._opt_prefixes) + return args + + def invoke(self, ctx: Context) -> t.Any: + """Given a context, this invokes the attached callback (if it exists) + in the right way. + """ + if self.deprecated: + message = _( + "DeprecationWarning: The command {name!r} is deprecated." + ).format(name=self.name) + echo(style(message, fg="red"), err=True) + + if self.callback is not None: + return ctx.invoke(self.callback, **ctx.params) + + def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: + """Return a list of completions for the incomplete value. Looks + at the names of options and chained multi-commands. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + results: t.List["CompletionItem"] = [] + + if incomplete and not incomplete[0].isalnum(): + for param in self.get_params(ctx): + if ( + not isinstance(param, Option) + or param.hidden + or ( + not param.multiple + and ctx.get_parameter_source(param.name) # type: ignore + is ParameterSource.COMMANDLINE + ) + ): + continue + + results.extend( + CompletionItem(name, help=param.help) + for name in [*param.opts, *param.secondary_opts] + if name.startswith(incomplete) + ) + + results.extend(super().shell_complete(ctx, incomplete)) + return results + + +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. This can be set or changed later with the + :meth:`result_callback` decorator. + :param attrs: Other command arguments described in :class:`Command`. + """ + + allow_extra_args = True + allow_interspersed_args = False + + def __init__( + self, + name: t.Optional[str] = None, + invoke_without_command: bool = False, + no_args_is_help: t.Optional[bool] = None, + subcommand_metavar: t.Optional[str] = None, + chain: bool = False, + result_callback: t.Optional[t.Callable[..., t.Any]] = None, + **attrs: t.Any, + ) -> None: + super().__init__(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 = "COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]..." + else: + subcommand_metavar = "COMMAND [ARGS]..." + + self.subcommand_metavar = subcommand_metavar + self.chain = chain + # The result callback that is stored. This can be set or + # overridden with the :func:`result_callback` 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 to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict(ctx) + commands = {} + + for name in self.list_commands(ctx): + command = self.get_command(ctx, name) + + if command is None: + continue + + sub_ctx = ctx._make_sub_context(command) + + with sub_ctx.scope(cleanup=False): + commands[name] = command.to_info_dict(sub_ctx) + + info_dict.update(commands=commands, chain=self.chain) + return info_dict + + def collect_usage_pieces(self, ctx: Context) -> t.List[str]: + rv = super().collect_usage_pieces(ctx) + rv.append(self.subcommand_metavar) + return rv + + def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: + super().format_options(ctx, formatter) + self.format_commands(ctx, formatter) + + def result_callback(self, replace: bool = False) -> t.Callable[[F], F]: + """Adds a result callback to the 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.result_callback() + def process_result(result, input): + return result + input + + :param replace: if set to `True` an already existing result + callback will be removed. + + .. versionchanged:: 8.0 + Renamed from ``resultcallback``. + + .. versionadded:: 3.0 + """ + + def decorator(f: F) -> F: + old_callback = self._result_callback + + if old_callback is None or replace: + self._result_callback = f + return f + + def function(__value, *args, **kwargs): # type: ignore + inner = old_callback(__value, *args, **kwargs) + return f(inner, *args, **kwargs) + + self._result_callback = rv = update_wrapper(t.cast(F, function), f) + return rv + + return decorator + + def format_commands(self, ctx: Context, formatter: HelpFormatter) -> None: + """Extra format methods for multi methods that adds all the commands + after the options. + """ + commands = [] + for subcommand in self.list_commands(ctx): + cmd = self.get_command(ctx, subcommand) + # What is this, the tool lied about a command. Ignore it + if cmd is None: + continue + if cmd.hidden: + continue + + commands.append((subcommand, cmd)) + + # allow for 3 times the default spacing + if len(commands): + limit = formatter.width - 6 - max(len(cmd[0]) for cmd in commands) + + rows = [] + for subcommand, cmd in commands: + help = cmd.get_short_help_str(limit) + rows.append((subcommand, help)) + + if rows: + with formatter.section(_("Commands")): + formatter.write_dl(rows) + + def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: + if not args and self.no_args_is_help and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + rest = super().parse_args(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: Context) -> t.Any: + def _process_result(value: t.Any) -> t.Any: + if self._result_callback is not None: + value = ctx.invoke(self._result_callback, value, **ctx.params) + return value + + if not ctx.protected_args: + if self.invoke_without_command: + # No subcommand was invoked, so the result callback is + # invoked with the group return value for regular + # groups, or an empty list for chained groups. + with ctx: + rv = super().invoke(ctx) + return _process_result([] if self.chain else rv) + 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) + assert cmd is not None + ctx.invoked_subcommand = cmd_name + super().invoke(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 = "*" if args else None + super().invoke(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) + assert cmd is not None + 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: Context, args: t.List[str] + ) -> t.Tuple[t.Optional[str], t.Optional[Command], t.List[str]]: + cmd_name = make_str(args[0]) + original_cmd_name = cmd_name + + # Get the command + cmd = self.get_command(ctx, cmd_name) + + # If we can't find the command but there is a normalization + # function available, we try with that one. + if cmd is None and ctx.token_normalize_func is not None: + cmd_name = ctx.token_normalize_func(cmd_name) + cmd = self.get_command(ctx, cmd_name) + + # If we don't find the command we want to show an error message + # to the user that it was not provided. However, there is + # something else we should do: if the first argument looks like + # an option we want to kick off parsing again for arguments to + # resolve things like --help which now should go to the main + # place. + if cmd is None and not ctx.resilient_parsing: + if split_opt(cmd_name)[0]: + self.parse_args(ctx, ctx.args) + ctx.fail(_("No such command {name!r}.").format(name=original_cmd_name)) + return cmd_name if cmd else None, cmd, args[1:] + + def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: + """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: Context) -> t.List[str]: + """Returns a list of subcommand names in the order they should + appear. + """ + return [] + + def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: + """Return a list of completions for the incomplete value. Looks + at the names of options, subcommands, and chained + multi-commands. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + results = [ + CompletionItem(name, help=command.get_short_help_str()) + for name, command in _complete_visible_commands(ctx, incomplete) + ] + results.extend(super().shell_complete(ctx, incomplete)) + return results + + +class Group(MultiCommand): + """A group allows a command to have subcommands attached. This is + the most common way to implement nesting in Click. + + :param name: The name of the group command. + :param commands: A dict mapping names to :class:`Command` objects. + Can also be a list of :class:`Command`, which will use + :attr:`Command.name` to create the dict. + :param attrs: Other command arguments described in + :class:`MultiCommand`, :class:`Command`, and + :class:`BaseCommand`. + + .. versionchanged:: 8.0 + The ``commands`` argument can be a list of command objects. + """ + + #: If set, this is used by the group's :meth:`command` decorator + #: as the default :class:`Command` class. This is useful to make all + #: subcommands use a custom command class. + #: + #: .. versionadded:: 8.0 + command_class: t.Optional[t.Type[Command]] = None + + #: If set, this is used by the group's :meth:`group` decorator + #: as the default :class:`Group` class. This is useful to make all + #: subgroups use a custom group class. + #: + #: If set to the special value :class:`type` (literally + #: ``group_class = type``), this group's class will be used as the + #: default class. This makes a custom group class continue to make + #: custom groups. + #: + #: .. versionadded:: 8.0 + group_class: t.Optional[t.Union[t.Type["Group"], t.Type[type]]] = None + # Literal[type] isn't valid, so use Type[type] + + def __init__( + self, + name: t.Optional[str] = None, + commands: t.Optional[ + t.Union[t.MutableMapping[str, Command], t.Sequence[Command]] + ] = None, + **attrs: t.Any, + ) -> None: + super().__init__(name, **attrs) + + if commands is None: + commands = {} + elif isinstance(commands, abc.Sequence): + commands = {c.name: c for c in commands if c.name is not None} + + #: The registered subcommands by their exported names. + self.commands: t.MutableMapping[str, Command] = commands + + def add_command(self, cmd: Command, name: t.Optional[str] = None) -> 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 + + @t.overload + def command(self, __func: t.Callable[..., t.Any]) -> Command: + ... + + @t.overload + def command( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], Command]: + ... + + def command( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Union[t.Callable[[t.Callable[..., t.Any]], Command], Command]: + """A shortcut decorator for declaring and attaching a command to + the group. This takes the same arguments as :func:`command` and + immediately registers the created command with this group by + calling :meth:`add_command`. + + To customize the command class used, set the + :attr:`command_class` attribute. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + + .. versionchanged:: 8.0 + Added the :attr:`command_class` attribute. + """ + from .decorators import command + + func: t.Optional[t.Callable[..., t.Any]] = None + + if args and callable(args[0]): + assert ( + len(args) == 1 and not kwargs + ), "Use 'command(**kwargs)(callable)' to provide arguments." + (func,) = args + args = () + + if self.command_class and kwargs.get("cls") is None: + kwargs["cls"] = self.command_class + + def decorator(f: t.Callable[..., t.Any]) -> Command: + cmd: Command = command(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + + if func is not None: + return decorator(func) + + return decorator + + @t.overload + def group(self, __func: t.Callable[..., t.Any]) -> "Group": + ... + + @t.overload + def group( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], "Group"]: + ... + + def group( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Union[t.Callable[[t.Callable[..., t.Any]], "Group"], "Group"]: + """A shortcut decorator for declaring and attaching a group to + the group. This takes the same arguments as :func:`group` and + immediately registers the created group with this group by + calling :meth:`add_command`. + + To customize the group class used, set the :attr:`group_class` + attribute. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + + .. versionchanged:: 8.0 + Added the :attr:`group_class` attribute. + """ + from .decorators import group + + func: t.Optional[t.Callable[..., t.Any]] = None + + if args and callable(args[0]): + assert ( + len(args) == 1 and not kwargs + ), "Use 'group(**kwargs)(callable)' to provide arguments." + (func,) = args + args = () + + if self.group_class is not None and kwargs.get("cls") is None: + if self.group_class is type: + kwargs["cls"] = type(self) + else: + kwargs["cls"] = self.group_class + + def decorator(f: t.Callable[..., t.Any]) -> "Group": + cmd: Group = group(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + + if func is not None: + return decorator(func) + + return decorator + + def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: + return self.commands.get(cmd_name) + + def list_commands(self, ctx: Context) -> t.List[str]: + 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. + + See :class:`MultiCommand` and :class:`Command` for the description of + ``name`` and ``attrs``. + """ + + def __init__( + self, + name: t.Optional[str] = None, + sources: t.Optional[t.List[MultiCommand]] = None, + **attrs: t.Any, + ) -> None: + super().__init__(name, **attrs) + #: The list of registered multi commands. + self.sources: t.List[MultiCommand] = sources or [] + + def add_source(self, multi_cmd: MultiCommand) -> None: + """Adds a new multi command to the chain dispatcher.""" + self.sources.append(multi_cmd) + + def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: + 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 + + return None + + def list_commands(self, ctx: Context) -> t.List[str]: + rv: t.Set[str] = set() + + for source in self.sources: + rv.update(source.list_commands(ctx)) + + return sorted(rv) + + +def _check_iter(value: t.Any) -> t.Iterator[t.Any]: + """Check if the value is iterable but not a string. Raises a type + error, or return an iterator over the value. + """ + if isinstance(value, str): + raise TypeError + + return iter(value) + + +class Parameter: + r"""A parameter to a command comes in two versions: they are either + :class:`Option`\s or :class:`Argument`\s. Other subclasses are currently + not supported by design as some of the internals for parsing are + intentionally not finalized. + + Some settings are supported by both options and arguments. + + :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 latter 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 function to further process or validate the value + after type conversion. It is called as ``f(ctx, param, value)`` + and must return the value. It is called for all sources, + including prompts. + :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). If ``nargs=-1``, all remaining + parameters are collected. + :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 shell_complete: A function that returns custom shell + completions. Used instead of the param's type completion if + given. Takes ``ctx, param, incomplete`` and must return a list + of :class:`~click.shell_completion.CompletionItem` or a list of + strings. + + .. versionchanged:: 8.0 + ``process_value`` validates required parameters and bounded + ``nargs``, and invokes the parameter callback before returning + the value. This allows the callback to validate prompts. + ``full_process_value`` is removed. + + .. versionchanged:: 8.0 + ``autocompletion`` is renamed to ``shell_complete`` and has new + semantics described above. The old name is deprecated and will + be removed in 8.1, until then it will be wrapped to match the + new requirements. + + .. versionchanged:: 8.0 + For ``multiple=True, nargs>1``, the default must be a list of + tuples. + + .. versionchanged:: 8.0 + Setting a default is no longer required for ``nargs>1``, it will + default to ``None``. ``multiple=True`` or ``nargs=-1`` will + default to ``()``. + + .. versionchanged:: 7.1 + Empty environment variables are ignored rather than taking the + empty string value. This makes it possible for scripts to clear + variables if they can't unset them. + + .. versionchanged:: 2.0 + Changed signature for parameter callback to also be passed the + parameter. The old callback format will still work, but it will + raise a warning to give you a chance to migrate the code easier. + """ + + param_type_name = "parameter" + + def __init__( + self, + param_decls: t.Optional[t.Sequence[str]] = None, + type: t.Optional[t.Union[types.ParamType, t.Any]] = None, + required: bool = False, + default: t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]] = None, + callback: t.Optional[t.Callable[[Context, "Parameter", t.Any], t.Any]] = None, + nargs: t.Optional[int] = None, + multiple: bool = False, + metavar: t.Optional[str] = None, + expose_value: bool = True, + is_eager: bool = False, + envvar: t.Optional[t.Union[str, t.Sequence[str]]] = None, + shell_complete: t.Optional[ + t.Callable[ + [Context, "Parameter", str], + t.Union[t.List["CompletionItem"], t.List[str]], + ] + ] = None, + ) -> None: + self.name: t.Optional[str] + self.opts: t.List[str] + self.secondary_opts: t.List[str] + self.name, self.opts, self.secondary_opts = self._parse_decls( + param_decls or (), expose_value + ) + self.type: types.ParamType = types.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 = multiple + self.expose_value = expose_value + self.default = default + self.is_eager = is_eager + self.metavar = metavar + self.envvar = envvar + self._custom_shell_complete = shell_complete + + if __debug__: + if self.type.is_composite and nargs != self.type.arity: + raise ValueError( + f"'nargs' must be {self.type.arity} (or None) for" + f" type {self.type!r}, but it was {nargs}." + ) + + # Skip no default or callable default. + check_default = default if not callable(default) else None + + if check_default is not None: + if multiple: + try: + # Only check the first value against nargs. + check_default = next(_check_iter(check_default), None) + except TypeError: + raise ValueError( + "'default' must be a list when 'multiple' is true." + ) from None + + # Can be None for multiple with empty default. + if nargs != 1 and check_default is not None: + try: + _check_iter(check_default) + except TypeError: + if multiple: + message = ( + "'default' must be a list of lists when 'multiple' is" + " true and 'nargs' != 1." + ) + else: + message = "'default' must be a list when 'nargs' != 1." + + raise ValueError(message) from None + + if nargs > 1 and len(check_default) != nargs: + subject = "item length" if multiple else "length" + raise ValueError( + f"'default' {subject} must match nargs={nargs}." + ) + + def to_info_dict(self) -> t.Dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. + + Use :meth:`click.Context.to_info_dict` to traverse the entire + CLI structure. + + .. versionadded:: 8.0 + """ + return { + "name": self.name, + "param_type_name": self.param_type_name, + "opts": self.opts, + "secondary_opts": self.secondary_opts, + "type": self.type.to_info_dict(), + "required": self.required, + "nargs": self.nargs, + "multiple": self.multiple, + "default": self.default, + "envvar": self.envvar, + } + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} {self.name}>" + + def _parse_decls( + self, decls: t.Sequence[str], expose_value: bool + ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: + raise NotImplementedError() + + @property + def human_readable_name(self) -> str: + """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 # type: ignore + + def make_metavar(self) -> str: + 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 + + @t.overload + def get_default( + self, ctx: Context, call: "te.Literal[True]" = True + ) -> t.Optional[t.Any]: + ... + + @t.overload + def get_default( + self, ctx: Context, call: bool = ... + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: + ... + + def get_default( + self, ctx: Context, call: bool = True + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: + """Get the default for the parameter. Tries + :meth:`Context.lookup_default` first, then the local default. + + :param ctx: Current context. + :param call: If the default is a callable, call it. Disable to + return the callable instead. + + .. versionchanged:: 8.0.2 + Type casting is no longer performed when getting a default. + + .. versionchanged:: 8.0.1 + Type casting can fail in resilient parsing mode. Invalid + defaults will not prevent showing help text. + + .. versionchanged:: 8.0 + Looks at ``ctx.default_map`` first. + + .. versionchanged:: 8.0 + Added the ``call`` parameter. + """ + value = ctx.lookup_default(self.name, call=False) # type: ignore + + if value is None: + value = self.default + + if call and callable(value): + value = value() + + return value + + def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: + raise NotImplementedError() + + def consume_value( + self, ctx: Context, opts: t.Mapping[str, t.Any] + ) -> t.Tuple[t.Any, ParameterSource]: + value = opts.get(self.name) # type: ignore + source = ParameterSource.COMMANDLINE + + if value is None: + value = self.value_from_envvar(ctx) + source = ParameterSource.ENVIRONMENT + + if value is None: + value = ctx.lookup_default(self.name) # type: ignore + source = ParameterSource.DEFAULT_MAP + + if value is None: + value = self.get_default(ctx) + source = ParameterSource.DEFAULT + + return value, source + + def type_cast_value(self, ctx: Context, value: t.Any) -> t.Any: + """Convert and validate a value against the option's + :attr:`type`, :attr:`multiple`, and :attr:`nargs`. + """ + if value is None: + return () if self.multiple or self.nargs == -1 else None + + def check_iter(value: t.Any) -> t.Iterator[t.Any]: + try: + return _check_iter(value) + except TypeError: + # This should only happen when passing in args manually, + # the parser should construct an iterable when parsing + # the command line. + raise BadParameter( + _("Value must be an iterable."), ctx=ctx, param=self + ) from None + + if self.nargs == 1 or self.type.is_composite: + + def convert(value: t.Any) -> t.Any: + return self.type(value, param=self, ctx=ctx) + + elif self.nargs == -1: + + def convert(value: t.Any) -> t.Any: # t.Tuple[t.Any, ...] + return tuple(self.type(x, self, ctx) for x in check_iter(value)) + + else: # nargs > 1 + + def convert(value: t.Any) -> t.Any: # t.Tuple[t.Any, ...] + value = tuple(check_iter(value)) + + if len(value) != self.nargs: + raise BadParameter( + ngettext( + "Takes {nargs} values but 1 was given.", + "Takes {nargs} values but {len} were given.", + len(value), + ).format(nargs=self.nargs, len=len(value)), + ctx=ctx, + param=self, + ) + + return tuple(self.type(x, self, ctx) for x in value) + + if self.multiple: + return tuple(convert(x) for x in check_iter(value)) + + return convert(value) + + def value_is_missing(self, value: t.Any) -> bool: + if value is None: + return True + + if (self.nargs != 1 or self.multiple) and value == (): + return True + + return False + + def process_value(self, ctx: Context, value: t.Any) -> t.Any: + value = self.type_cast_value(ctx, value) + + if self.required and self.value_is_missing(value): + raise MissingParameter(ctx=ctx, param=self) + + if self.callback is not None: + value = self.callback(ctx, self, value) + + return value + + def resolve_envvar_value(self, ctx: Context) -> t.Optional[str]: + if self.envvar is None: + return None + + if isinstance(self.envvar, str): + rv = os.environ.get(self.envvar) + + if rv: + return rv + else: + for envvar in self.envvar: + rv = os.environ.get(envvar) + + if rv: + return rv + + return None + + def value_from_envvar(self, ctx: Context) -> t.Optional[t.Any]: + rv: t.Optional[t.Any] = 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: Context, opts: t.Mapping[str, t.Any], args: t.List[str] + ) -> t.Tuple[t.Any, t.List[str]]: + with augment_usage_errors(ctx, param=self): + value, source = self.consume_value(ctx, opts) + ctx.set_parameter_source(self.name, source) # type: ignore + + try: + value = self.process_value(ctx, value) + except Exception: + if not ctx.resilient_parsing: + raise + + value = None + + if self.expose_value: + ctx.params[self.name] = value # type: ignore + + return value, args + + def get_help_record(self, ctx: Context) -> t.Optional[t.Tuple[str, str]]: + pass + + def get_usage_pieces(self, ctx: Context) -> t.List[str]: + return [] + + def get_error_hint(self, ctx: Context) -> str: + """Get a stringified version of the param for use in error messages to + indicate which param caused the error. + """ + hint_list = self.opts or [self.human_readable_name] + return " / ".join(f"'{x}'" for x in hint_list) + + def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: + """Return a list of completions for the incomplete value. If a + ``shell_complete`` function was given during init, it is used. + Otherwise, the :attr:`type` + :meth:`~click.types.ParamType.shell_complete` function is used. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + if self._custom_shell_complete is not None: + results = self._custom_shell_complete(ctx, self, incomplete) + + if results and isinstance(results[0], str): + from click.shell_completion import CompletionItem + + results = [CompletionItem(c) for c in results] + + return t.cast(t.List["CompletionItem"], results) + + return self.type.shell_complete(ctx, self, incomplete) + + +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: Show the default value for this option in its + help text. Values are not shown by default, unless + :attr:`Context.show_default` is ``True``. If this value is a + string, it shows that string in parentheses instead of the + actual value. This is particularly useful for dynamic options. + For single option boolean flags, the default remains hidden if + its value is ``False``. + :param show_envvar: Controls if an environment variable should be + shown on the help page. Normally, environment variables are not + shown. + :param prompt: If set to ``True`` or a non empty string then the + user will be prompted for input. If set to ``True`` the prompt + will be the option name capitalized. + :param confirmation_prompt: Prompt a second time to confirm the + value if it was prompted for. Can be set to a string instead of + ``True`` to customize the message. + :param prompt_required: If set to ``False``, the user will be + prompted for input only when the option was specified as a flag + without a value. + :param hide_input: If this is ``True`` then the input on the prompt + will be hidden from the user. This is useful for password input. + :param is_flag: forces this option to act as a flag. The default is + auto detection. + :param flag_value: which value should be used for this flag if it's + enabled. This is set to a boolean automatically if + the option string contains a slash to mark two options. + :param multiple: if this is set to `True` then the argument is accepted + multiple times and recorded. This is similar to ``nargs`` + in how it works but supports arbitrary number of + arguments. + :param count: this flag makes an option increment an integer. + :param allow_from_autoenv: if this is enabled then the value of this + parameter will be pulled from an environment + variable in case a prefix is defined on the + context. + :param help: the help string. + :param hidden: hide this option from help outputs. + :param attrs: Other command arguments described in :class:`Parameter`. + + .. versionchanged:: 8.1.0 + Help text indentation is cleaned here instead of only in the + ``@option`` decorator. + + .. versionchanged:: 8.1.0 + The ``show_default`` parameter overrides + ``Context.show_default``. + + .. versionchanged:: 8.1.0 + The default of a single option boolean flag is not shown if the + default value is ``False``. + + .. versionchanged:: 8.0.1 + ``type`` is detected from ``flag_value`` if given. + """ + + param_type_name = "option" + + def __init__( + self, + param_decls: t.Optional[t.Sequence[str]] = None, + show_default: t.Union[bool, str, None] = None, + prompt: t.Union[bool, str] = False, + confirmation_prompt: t.Union[bool, str] = False, + prompt_required: bool = True, + hide_input: bool = False, + is_flag: t.Optional[bool] = None, + flag_value: t.Optional[t.Any] = None, + multiple: bool = False, + count: bool = False, + allow_from_autoenv: bool = True, + type: t.Optional[t.Union[types.ParamType, t.Any]] = None, + help: t.Optional[str] = None, + hidden: bool = False, + show_choices: bool = True, + show_envvar: bool = False, + **attrs: t.Any, + ) -> None: + if help: + help = inspect.cleandoc(help) + + default_is_missing = "default" not in attrs + super().__init__(param_decls, type=type, multiple=multiple, **attrs) + + if prompt is True: + if self.name is None: + raise TypeError("'name' is required with 'prompt=True'.") + + prompt_text: t.Optional[str] = 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.prompt_required = prompt_required + self.hide_input = hide_input + self.hidden = hidden + + # If prompt is enabled but not required, then the option can be + # used as a flag to indicate using prompt or flag_value. + self._flag_needs_value = self.prompt is not None and not self.prompt_required + + if is_flag is None: + if flag_value is not None: + # Implicitly a flag because flag_value was set. + is_flag = True + elif self._flag_needs_value: + # Not a flag, but when used as a flag it shows a prompt. + is_flag = False + else: + # Implicitly a flag because flag options were given. + is_flag = bool(self.secondary_opts) + elif is_flag is False and not self._flag_needs_value: + # Not a flag, and prompt is not enabled, can be used as a + # flag if flag_value is set. + self._flag_needs_value = flag_value is not None + + self.default: t.Union[t.Any, t.Callable[[], t.Any]] + + if is_flag and default_is_missing and not self.required: + if multiple: + self.default = () + else: + self.default = False + + if flag_value is None: + flag_value = not self.default + + self.type: types.ParamType + if is_flag and type is None: + # Re-guess the type from the flag value instead of the + # default. + self.type = types.convert_type(None, flag_value) + + self.is_flag: bool = is_flag + self.is_bool_flag: bool = is_flag and isinstance(self.type, types.BoolParamType) + self.flag_value: t.Any = flag_value + + # Counting + self.count = count + if count: + if type is None: + self.type = types.IntRange(min=0) + if default_is_missing: + self.default = 0 + + self.allow_from_autoenv = allow_from_autoenv + self.help = help + self.show_default = show_default + self.show_choices = show_choices + self.show_envvar = show_envvar + + if __debug__: + if self.nargs == -1: + raise TypeError("nargs=-1 is not supported for options.") + + if self.prompt and self.is_flag and not self.is_bool_flag: + raise TypeError("'prompt' is not valid for non-boolean flag.") + + if not self.is_bool_flag and self.secondary_opts: + raise TypeError("Secondary flag is not valid for non-boolean flag.") + + if self.is_bool_flag and self.hide_input and self.prompt is not None: + raise TypeError( + "'prompt' with 'hide_input' is not valid for boolean flag." + ) + + if self.count: + if self.multiple: + raise TypeError("'count' is not valid with 'multiple'.") + + if self.is_flag: + raise TypeError("'count' is not valid with 'is_flag'.") + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update( + help=self.help, + prompt=self.prompt, + is_flag=self.is_flag, + flag_value=self.flag_value, + count=self.count, + hidden=self.hidden, + ) + return info_dict + + def _parse_decls( + self, decls: t.Sequence[str], expose_value: bool + ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: + opts = [] + secondary_opts = [] + name = None + possible_names = [] + + for decl in decls: + if decl.isidentifier(): + if name is not None: + raise TypeError(f"Name '{name}' defined twice") + name = decl + else: + split_char = ";" if decl[:1] == "/" else "/" + 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()) + if first == second: + raise ValueError( + f"Boolean option {decl!r} cannot use the" + " same flag for true/false." + ) + else: + possible_names.append(split_opt(decl)) + opts.append(decl) + + if name is None and possible_names: + possible_names.sort(key=lambda x: -len(x[0])) # group long options first + name = possible_names[0][1].replace("-", "_").lower() + if not name.isidentifier(): + 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( + f"No options defined but a name was passed ({name})." + " Did you mean to declare an argument instead? Did" + f" you mean to pass '--{name}'?" + ) + + return name, opts, secondary_opts + + def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: + if self.multiple: + action = "append" + elif self.count: + action = "count" + else: + action = "store" + + if self.is_flag: + action = f"{action}_const" + + if self.is_bool_flag and self.secondary_opts: + parser.add_option( + obj=self, opts=self.opts, dest=self.name, action=action, const=True + ) + parser.add_option( + obj=self, + opts=self.secondary_opts, + dest=self.name, + action=action, + const=False, + ) + else: + parser.add_option( + obj=self, + opts=self.opts, + dest=self.name, + action=action, + const=self.flag_value, + ) + else: + parser.add_option( + obj=self, + opts=self.opts, + dest=self.name, + action=action, + nargs=self.nargs, + ) + + def get_help_record(self, ctx: Context) -> t.Optional[t.Tuple[str, str]]: + if self.hidden: + return None + + any_prefix_is_slash = False + + def _write_opts(opts: t.Sequence[str]) -> str: + nonlocal any_prefix_is_slash + + rv, any_slashes = join_options(opts) + + if any_slashes: + any_prefix_is_slash = True + + if not self.is_flag and not self.count: + rv += f" {self.make_metavar()}" + + return rv + + rv = [_write_opts(self.opts)] + + if self.secondary_opts: + rv.append(_write_opts(self.secondary_opts)) + + help = self.help or "" + extra = [] + + if self.show_envvar: + envvar = self.envvar + + if envvar is None: + if ( + self.allow_from_autoenv + and ctx.auto_envvar_prefix is not None + and self.name is not None + ): + envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" + + if envvar is not None: + var_str = ( + envvar + if isinstance(envvar, str) + else ", ".join(str(d) for d in envvar) + ) + extra.append(_("env var: {var}").format(var=var_str)) + + # Temporarily enable resilient parsing to avoid type casting + # failing for the default. Might be possible to extend this to + # help formatting in general. + resilient = ctx.resilient_parsing + ctx.resilient_parsing = True + + try: + default_value = self.get_default(ctx, call=False) + finally: + ctx.resilient_parsing = resilient + + show_default = False + show_default_is_str = False + + if self.show_default is not None: + if isinstance(self.show_default, str): + show_default_is_str = show_default = True + else: + show_default = self.show_default + elif ctx.show_default is not None: + show_default = ctx.show_default + + if show_default_is_str or (show_default and (default_value is not None)): + if show_default_is_str: + default_string = f"({self.show_default})" + elif isinstance(default_value, (list, tuple)): + default_string = ", ".join(str(d) for d in default_value) + elif inspect.isfunction(default_value): + default_string = _("(dynamic)") + elif self.is_bool_flag and self.secondary_opts: + # For boolean flags that have distinct True/False opts, + # use the opt without prefix instead of the value. + default_string = split_opt( + (self.opts if self.default else self.secondary_opts)[0] + )[1] + elif self.is_bool_flag and not self.secondary_opts and not default_value: + default_string = "" + else: + default_string = str(default_value) + + if default_string: + extra.append(_("default: {default}").format(default=default_string)) + + if ( + isinstance(self.type, types._NumberRangeBase) + # skip count with default range type + and not (self.count and self.type.min == 0 and self.type.max is None) + ): + range_str = self.type._describe_range() + + if range_str: + extra.append(range_str) + + if self.required: + extra.append(_("required")) + + if extra: + extra_str = "; ".join(extra) + help = f"{help} [{extra_str}]" if help else f"[{extra_str}]" + + return ("; " if any_prefix_is_slash else " / ").join(rv), help + + @t.overload + def get_default( + self, ctx: Context, call: "te.Literal[True]" = True + ) -> t.Optional[t.Any]: + ... + + @t.overload + def get_default( + self, ctx: Context, call: bool = ... + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: + ... + + def get_default( + self, ctx: Context, call: bool = True + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: + # If we're a non boolean flag our default is more complex because + # we need to look at all flags in the same group to figure out + # if we're 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 t.cast(Option, param).flag_value + + return None + + return super().get_default(ctx, call=call) + + def prompt_for_value(self, ctx: Context) -> t.Any: + """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. + """ + assert self.prompt is not None + + # Calculate the default before prompting anything to be stable. + default = self.get_default(ctx) + + # If this is a prompt for a flag we need to handle this + # differently. + if self.is_bool_flag: + return confirm(self.prompt, default) + + return prompt( + self.prompt, + default=default, + type=self.type, + hide_input=self.hide_input, + show_choices=self.show_choices, + confirmation_prompt=self.confirmation_prompt, + value_proc=lambda x: self.process_value(ctx, x), + ) + + def resolve_envvar_value(self, ctx: Context) -> t.Optional[str]: + rv = super().resolve_envvar_value(ctx) + + if rv is not None: + return rv + + if ( + self.allow_from_autoenv + and ctx.auto_envvar_prefix is not None + and self.name is not None + ): + envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" + rv = os.environ.get(envvar) + + if rv: + return rv + + return None + + def value_from_envvar(self, ctx: Context) -> t.Optional[t.Any]: + rv: t.Optional[t.Any] = self.resolve_envvar_value(ctx) + + if rv is None: + return None + + value_depth = (self.nargs != 1) + bool(self.multiple) + + if value_depth > 0: + rv = self.type.split_envvar_value(rv) + + if self.multiple and self.nargs != 1: + rv = batch(rv, self.nargs) + + return rv + + def consume_value( + self, ctx: Context, opts: t.Mapping[str, "Parameter"] + ) -> t.Tuple[t.Any, ParameterSource]: + value, source = super().consume_value(ctx, opts) + + # The parser will emit a sentinel value if the option can be + # given as a flag without a value. This is different from None + # to distinguish from the flag not being given at all. + if value is _flag_needs_value: + if self.prompt is not None and not ctx.resilient_parsing: + value = self.prompt_for_value(ctx) + source = ParameterSource.PROMPT + else: + value = self.flag_value + source = ParameterSource.COMMANDLINE + + elif ( + self.multiple + and value is not None + and any(v is _flag_needs_value for v in value) + ): + value = [self.flag_value if v is _flag_needs_value else v for v in value] + source = ParameterSource.COMMANDLINE + + # The value wasn't set, or used the param's default, prompt if + # prompting is enabled. + elif ( + source in {None, ParameterSource.DEFAULT} + and self.prompt is not None + and (self.required or self.prompt_required) + and not ctx.resilient_parsing + ): + value = self.prompt_for_value(ctx) + source = ParameterSource.PROMPT + + return value, source + + +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 constructor of :class:`Parameter`. + """ + + param_type_name = "argument" + + def __init__( + self, + param_decls: t.Sequence[str], + required: t.Optional[bool] = None, + **attrs: t.Any, + ) -> None: + if required is None: + if attrs.get("default") is not None: + required = False + else: + required = attrs.get("nargs", 1) > 0 + + if "multiple" in attrs: + raise TypeError("__init__() got an unexpected keyword argument 'multiple'.") + + super().__init__(param_decls, required=required, **attrs) + + if __debug__: + if self.default is not None and self.nargs == -1: + raise TypeError("'default' is not supported for nargs=-1.") + + @property + def human_readable_name(self) -> str: + if self.metavar is not None: + return self.metavar + return self.name.upper() # type: ignore + + def make_metavar(self) -> str: + if self.metavar is not None: + return self.metavar + var = self.type.get_metavar(self) + if not var: + var = self.name.upper() # type: ignore + if not self.required: + var = f"[{var}]" + if self.nargs != 1: + var += "..." + return var + + def _parse_decls( + self, decls: t.Sequence[str], expose_value: bool + ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: + if not decls: + if not expose_value: + return None, [], [] + raise TypeError("Could not determine name for argument") + if len(decls) == 1: + name = arg = decls[0] + name = name.replace("-", "_").lower() + else: + raise TypeError( + "Arguments take exactly one parameter declaration, got" + f" {len(decls)}." + ) + return name, [arg], [] + + def get_usage_pieces(self, ctx: Context) -> t.List[str]: + return [self.make_metavar()] + + def get_error_hint(self, ctx: Context) -> str: + return f"'{self.make_metavar()}'" + + def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: + parser.add_argument(dest=self.name, nargs=self.nargs, obj=self) diff --git a/server-temp/venv/lib/python3.10/site-packages/click/decorators.py b/server-temp/venv/lib/python3.10/site-packages/click/decorators.py new file mode 100644 index 00000000..d9bba950 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/click/decorators.py @@ -0,0 +1,561 @@ +import inspect +import types +import typing as t +from functools import update_wrapper +from gettext import gettext as _ + +from .core import Argument +from .core import Command +from .core import Context +from .core import Group +from .core import Option +from .core import Parameter +from .globals import get_current_context +from .utils import echo + +if t.TYPE_CHECKING: + import typing_extensions as te + + P = te.ParamSpec("P") + +R = t.TypeVar("R") +T = t.TypeVar("T") +_AnyCallable = t.Callable[..., t.Any] +FC = t.TypeVar("FC", bound=t.Union[_AnyCallable, Command]) + + +def pass_context(f: "t.Callable[te.Concatenate[Context, P], R]") -> "t.Callable[P, R]": + """Marks a callback as wanting to receive the current context + object as first argument. + """ + + def new_func(*args: "P.args", **kwargs: "P.kwargs") -> "R": + return f(get_current_context(), *args, **kwargs) + + return update_wrapper(new_func, f) + + +def pass_obj(f: "t.Callable[te.Concatenate[t.Any, P], R]") -> "t.Callable[P, R]": + """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: "P.args", **kwargs: "P.kwargs") -> "R": + return f(get_current_context().obj, *args, **kwargs) + + return update_wrapper(new_func, f) + + +def make_pass_decorator( + object_type: t.Type[T], ensure: bool = False +) -> t.Callable[["t.Callable[te.Concatenate[T, P], R]"], "t.Callable[P, R]"]: + """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: "t.Callable[te.Concatenate[T, P], R]") -> "t.Callable[P, R]": + def new_func(*args: "P.args", **kwargs: "P.kwargs") -> "R": + ctx = get_current_context() + + obj: t.Optional[T] + 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" + f" object of type {object_type.__name__!r}" + " existing." + ) + + return ctx.invoke(f, obj, *args, **kwargs) + + return update_wrapper(new_func, f) + + return decorator # type: ignore[return-value] + + +def pass_meta_key( + key: str, *, doc_description: t.Optional[str] = None +) -> "t.Callable[[t.Callable[te.Concatenate[t.Any, P], R]], t.Callable[P, R]]": + """Create a decorator that passes a key from + :attr:`click.Context.meta` as the first argument to the decorated + function. + + :param key: Key in ``Context.meta`` to pass. + :param doc_description: Description of the object being passed, + inserted into the decorator's docstring. Defaults to "the 'key' + key from Context.meta". + + .. versionadded:: 8.0 + """ + + def decorator(f: "t.Callable[te.Concatenate[t.Any, P], R]") -> "t.Callable[P, R]": + def new_func(*args: "P.args", **kwargs: "P.kwargs") -> R: + ctx = get_current_context() + obj = ctx.meta[key] + return ctx.invoke(f, obj, *args, **kwargs) + + return update_wrapper(new_func, f) + + if doc_description is None: + doc_description = f"the {key!r} key from :attr:`click.Context.meta`" + + decorator.__doc__ = ( + f"Decorator that passes {doc_description} as the first argument" + " to the decorated function." + ) + return decorator # type: ignore[return-value] + + +CmdType = t.TypeVar("CmdType", bound=Command) + + +# variant: no call, directly as decorator for a function. +@t.overload +def command(name: _AnyCallable) -> Command: + ... + + +# variant: with positional name and with positional or keyword cls argument: +# @command(namearg, CommandCls, ...) or @command(namearg, cls=CommandCls, ...) +@t.overload +def command( + name: t.Optional[str], + cls: t.Type[CmdType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], CmdType]: + ... + + +# variant: name omitted, cls _must_ be a keyword argument, @command(cls=CommandCls, ...) +@t.overload +def command( + name: None = None, + *, + cls: t.Type[CmdType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], CmdType]: + ... + + +# variant: with optional string name, no cls argument provided. +@t.overload +def command( + name: t.Optional[str] = ..., cls: None = None, **attrs: t.Any +) -> t.Callable[[_AnyCallable], Command]: + ... + + +def command( + name: t.Union[t.Optional[str], _AnyCallable] = None, + cls: t.Optional[t.Type[CmdType]] = None, + **attrs: t.Any, +) -> t.Union[Command, t.Callable[[_AnyCallable], t.Union[Command, CmdType]]]: + r"""Creates a new :class:`Command` and uses the decorated function as + callback. This will also automatically attach all decorated + :func:`option`\s and :func:`argument`\s as parameters to the command. + + The name of the command defaults to the name of the function with + underscores replaced by dashes. 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. + For the ``params`` argument, any decorated params are appended to + the end of the list. + + Once decorated the function turns into a :class:`Command` instance + that can be invoked as a command line utility or be attached to a + command :class:`Group`. + + :param name: the name of the command. This defaults to the function + name with underscores replaced by dashes. + :param cls: the command class to instantiate. This defaults to + :class:`Command`. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + + .. versionchanged:: 8.1 + The ``params`` argument can be used. Decorated params are + appended to the end of the list. + """ + + func: t.Optional[t.Callable[[_AnyCallable], t.Any]] = None + + if callable(name): + func = name + name = None + assert cls is None, "Use 'command(cls=cls)(callable)' to specify a class." + assert not attrs, "Use 'command(**kwargs)(callable)' to provide arguments." + + if cls is None: + cls = t.cast(t.Type[CmdType], Command) + + def decorator(f: _AnyCallable) -> CmdType: + if isinstance(f, Command): + raise TypeError("Attempted to convert a callback into a command twice.") + + attr_params = attrs.pop("params", None) + params = attr_params if attr_params is not None else [] + + try: + decorator_params = f.__click_params__ # type: ignore + except AttributeError: + pass + else: + del f.__click_params__ # type: ignore + params.extend(reversed(decorator_params)) + + if attrs.get("help") is None: + attrs["help"] = f.__doc__ + + if t.TYPE_CHECKING: + assert cls is not None + assert not callable(name) + + cmd = cls( + name=name or f.__name__.lower().replace("_", "-"), + callback=f, + params=params, + **attrs, + ) + cmd.__doc__ = f.__doc__ + return cmd + + if func is not None: + return decorator(func) + + return decorator + + +GrpType = t.TypeVar("GrpType", bound=Group) + + +# variant: no call, directly as decorator for a function. +@t.overload +def group(name: _AnyCallable) -> Group: + ... + + +# variant: with positional name and with positional or keyword cls argument: +# @group(namearg, GroupCls, ...) or @group(namearg, cls=GroupCls, ...) +@t.overload +def group( + name: t.Optional[str], + cls: t.Type[GrpType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], GrpType]: + ... + + +# variant: name omitted, cls _must_ be a keyword argument, @group(cmd=GroupCls, ...) +@t.overload +def group( + name: None = None, + *, + cls: t.Type[GrpType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], GrpType]: + ... + + +# variant: with optional string name, no cls argument provided. +@t.overload +def group( + name: t.Optional[str] = ..., cls: None = None, **attrs: t.Any +) -> t.Callable[[_AnyCallable], Group]: + ... + + +def group( + name: t.Union[str, _AnyCallable, None] = None, + cls: t.Optional[t.Type[GrpType]] = None, + **attrs: t.Any, +) -> t.Union[Group, t.Callable[[_AnyCallable], t.Union[Group, GrpType]]]: + """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`. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + """ + if cls is None: + cls = t.cast(t.Type[GrpType], Group) + + if callable(name): + return command(cls=cls, **attrs)(name) + + return command(name, cls, **attrs) + + +def _param_memo(f: t.Callable[..., t.Any], param: Parameter) -> None: + if isinstance(f, Command): + f.params.append(param) + else: + if not hasattr(f, "__click_params__"): + f.__click_params__ = [] # type: ignore + + f.__click_params__.append(param) # type: ignore + + +def argument( + *param_decls: str, cls: t.Optional[t.Type[Argument]] = None, **attrs: t.Any +) -> t.Callable[[FC], FC]: + """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. + + For the default argument class, refer to :class:`Argument` and + :class:`Parameter` for descriptions of parameters. + + :param cls: the argument class to instantiate. This defaults to + :class:`Argument`. + :param param_decls: Passed as positional arguments to the constructor of + ``cls``. + :param attrs: Passed as keyword arguments to the constructor of ``cls``. + """ + if cls is None: + cls = Argument + + def decorator(f: FC) -> FC: + _param_memo(f, cls(param_decls, **attrs)) + return f + + return decorator + + +def option( + *param_decls: str, cls: t.Optional[t.Type[Option]] = None, **attrs: t.Any +) -> t.Callable[[FC], FC]: + """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. + + For the default option class, refer to :class:`Option` and + :class:`Parameter` for descriptions of parameters. + + :param cls: the option class to instantiate. This defaults to + :class:`Option`. + :param param_decls: Passed as positional arguments to the constructor of + ``cls``. + :param attrs: Passed as keyword arguments to the constructor of ``cls``. + """ + if cls is None: + cls = Option + + def decorator(f: FC) -> FC: + _param_memo(f, cls(param_decls, **attrs)) + return f + + return decorator + + +def confirmation_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: + """Add a ``--yes`` option which shows a prompt before continuing if + not passed. If the prompt is declined, the program will exit. + + :param param_decls: One or more option names. Defaults to the single + value ``"--yes"``. + :param kwargs: Extra arguments are passed to :func:`option`. + """ + + def callback(ctx: Context, param: Parameter, value: bool) -> None: + if not value: + ctx.abort() + + if not param_decls: + param_decls = ("--yes",) + + kwargs.setdefault("is_flag", True) + kwargs.setdefault("callback", callback) + kwargs.setdefault("expose_value", False) + kwargs.setdefault("prompt", "Do you want to continue?") + kwargs.setdefault("help", "Confirm the action without prompting.") + return option(*param_decls, **kwargs) + + +def password_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: + """Add a ``--password`` option which prompts for a password, hiding + input and asking to enter the value again for confirmation. + + :param param_decls: One or more option names. Defaults to the single + value ``"--password"``. + :param kwargs: Extra arguments are passed to :func:`option`. + """ + if not param_decls: + param_decls = ("--password",) + + kwargs.setdefault("prompt", True) + kwargs.setdefault("confirmation_prompt", True) + kwargs.setdefault("hide_input", True) + return option(*param_decls, **kwargs) + + +def version_option( + version: t.Optional[str] = None, + *param_decls: str, + package_name: t.Optional[str] = None, + prog_name: t.Optional[str] = None, + message: t.Optional[str] = None, + **kwargs: t.Any, +) -> t.Callable[[FC], FC]: + """Add a ``--version`` option which immediately prints the version + number and exits the program. + + If ``version`` is not provided, Click will try to detect it using + :func:`importlib.metadata.version` to get the version for the + ``package_name``. On Python < 3.8, the ``importlib_metadata`` + backport must be installed. + + If ``package_name`` is not provided, Click will try to detect it by + inspecting the stack frames. This will be used to detect the + version, so it must match the name of the installed package. + + :param version: The version number to show. If not provided, Click + will try to detect it. + :param param_decls: One or more option names. Defaults to the single + value ``"--version"``. + :param package_name: The package name to detect the version from. If + not provided, Click will try to detect it. + :param prog_name: The name of the CLI to show in the message. If not + provided, it will be detected from the command. + :param message: The message to show. The values ``%(prog)s``, + ``%(package)s``, and ``%(version)s`` are available. Defaults to + ``"%(prog)s, version %(version)s"``. + :param kwargs: Extra arguments are passed to :func:`option`. + :raise RuntimeError: ``version`` could not be detected. + + .. versionchanged:: 8.0 + Add the ``package_name`` parameter, and the ``%(package)s`` + value for messages. + + .. versionchanged:: 8.0 + Use :mod:`importlib.metadata` instead of ``pkg_resources``. The + version is detected based on the package name, not the entry + point name. The Python package name must match the installed + package name, or be passed with ``package_name=``. + """ + if message is None: + message = _("%(prog)s, version %(version)s") + + if version is None and package_name is None: + frame = inspect.currentframe() + f_back = frame.f_back if frame is not None else None + f_globals = f_back.f_globals if f_back is not None else None + # break reference cycle + # https://docs.python.org/3/library/inspect.html#the-interpreter-stack + del frame + + if f_globals is not None: + package_name = f_globals.get("__name__") + + if package_name == "__main__": + package_name = f_globals.get("__package__") + + if package_name: + package_name = package_name.partition(".")[0] + + def callback(ctx: Context, param: Parameter, value: bool) -> None: + if not value or ctx.resilient_parsing: + return + + nonlocal prog_name + nonlocal version + + if prog_name is None: + prog_name = ctx.find_root().info_name + + if version is None and package_name is not None: + metadata: t.Optional[types.ModuleType] + + try: + from importlib import metadata # type: ignore + except ImportError: + # Python < 3.8 + import importlib_metadata as metadata # type: ignore + + try: + version = metadata.version(package_name) # type: ignore + except metadata.PackageNotFoundError: # type: ignore + raise RuntimeError( + f"{package_name!r} is not installed. Try passing" + " 'package_name' instead." + ) from None + + if version is None: + raise RuntimeError( + f"Could not determine the version for {package_name!r} automatically." + ) + + echo( + message % {"prog": prog_name, "package": package_name, "version": version}, + color=ctx.color, + ) + ctx.exit() + + if not param_decls: + param_decls = ("--version",) + + kwargs.setdefault("is_flag", True) + kwargs.setdefault("expose_value", False) + kwargs.setdefault("is_eager", True) + kwargs.setdefault("help", _("Show the version and exit.")) + kwargs["callback"] = callback + return option(*param_decls, **kwargs) + + +def help_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: + """Add a ``--help`` option which immediately prints the help page + and exits the program. + + This is usually unnecessary, as the ``--help`` option is added to + each command automatically unless ``add_help_option=False`` is + passed. + + :param param_decls: One or more option names. Defaults to the single + value ``"--help"``. + :param kwargs: Extra arguments are passed to :func:`option`. + """ + + def callback(ctx: Context, param: Parameter, value: bool) -> None: + if not value or ctx.resilient_parsing: + return + + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + if not param_decls: + param_decls = ("--help",) + + kwargs.setdefault("is_flag", True) + kwargs.setdefault("expose_value", False) + kwargs.setdefault("is_eager", True) + kwargs.setdefault("help", _("Show this message and exit.")) + kwargs["callback"] = callback + return option(*param_decls, **kwargs) diff --git a/server-temp/venv/lib/python3.10/site-packages/click/exceptions.py b/server-temp/venv/lib/python3.10/site-packages/click/exceptions.py new file mode 100644 index 00000000..fe68a361 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/click/exceptions.py @@ -0,0 +1,288 @@ +import typing as t +from gettext import gettext as _ +from gettext import ngettext + +from ._compat import get_text_stderr +from .utils import echo +from .utils import format_filename + +if t.TYPE_CHECKING: + from .core import Command + from .core import Context + from .core import Parameter + + +def _join_param_hints( + param_hint: t.Optional[t.Union[t.Sequence[str], str]] +) -> t.Optional[str]: + if param_hint is not None and not isinstance(param_hint, str): + return " / ".join(repr(x) for x in param_hint) + + return param_hint + + +class ClickException(Exception): + """An exception that Click can handle and show to the user.""" + + #: The exit code for this exception. + exit_code = 1 + + def __init__(self, message: str) -> None: + super().__init__(message) + self.message = message + + def format_message(self) -> str: + return self.message + + def __str__(self) -> str: + return self.message + + def show(self, file: t.Optional[t.IO[t.Any]] = None) -> None: + if file is None: + file = get_text_stderr() + + echo(_("Error: {message}").format(message=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: str, ctx: t.Optional["Context"] = None) -> None: + super().__init__(message) + self.ctx = ctx + self.cmd: t.Optional["Command"] = self.ctx.command if self.ctx else None + + def show(self, file: t.Optional[t.IO[t.Any]] = None) -> None: + if file is None: + file = get_text_stderr() + color = None + hint = "" + if ( + self.ctx is not None + and self.ctx.command.get_help_option(self.ctx) is not None + ): + hint = _("Try '{command} {option}' for help.").format( + command=self.ctx.command_path, option=self.ctx.help_option_names[0] + ) + hint = f"{hint}\n" + if self.ctx is not None: + color = self.ctx.color + echo(f"{self.ctx.get_usage()}\n{hint}", file=file, color=color) + echo( + _("Error: {message}").format(message=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: str, + ctx: t.Optional["Context"] = None, + param: t.Optional["Parameter"] = None, + param_hint: t.Optional[str] = None, + ) -> None: + super().__init__(message, ctx) + self.param = param + self.param_hint = param_hint + + def format_message(self) -> str: + if self.param_hint is not None: + param_hint = self.param_hint + elif self.param is not None: + param_hint = self.param.get_error_hint(self.ctx) # type: ignore + else: + return _("Invalid value: {message}").format(message=self.message) + + return _("Invalid value for {param_hint}: {message}").format( + param_hint=_join_param_hints(param_hint), message=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: t.Optional[str] = None, + ctx: t.Optional["Context"] = None, + param: t.Optional["Parameter"] = None, + param_hint: t.Optional[str] = None, + param_type: t.Optional[str] = None, + ) -> None: + super().__init__(message or "", ctx, param, param_hint) + self.param_type = param_type + + def format_message(self) -> str: + if self.param_hint is not None: + param_hint: t.Optional[str] = self.param_hint + elif self.param is not None: + param_hint = self.param.get_error_hint(self.ctx) # type: ignore + else: + param_hint = None + + param_hint = _join_param_hints(param_hint) + param_hint = f" {param_hint}" if param_hint else "" + + 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 += f". {msg_extra}" + else: + msg = msg_extra + + msg = f" {msg}" if msg else "" + + # Translate param_type for known types. + if param_type == "argument": + missing = _("Missing argument") + elif param_type == "option": + missing = _("Missing option") + elif param_type == "parameter": + missing = _("Missing parameter") + else: + missing = _("Missing {param_type}").format(param_type=param_type) + + return f"{missing}{param_hint}.{msg}" + + def __str__(self) -> str: + if not self.message: + param_name = self.param.name if self.param else None + return _("Missing parameter: {param_name}").format(param_name=param_name) + else: + return self.message + + +class NoSuchOption(UsageError): + """Raised if click attempted to handle an option that does not + exist. + + .. versionadded:: 4.0 + """ + + def __init__( + self, + option_name: str, + message: t.Optional[str] = None, + possibilities: t.Optional[t.Sequence[str]] = None, + ctx: t.Optional["Context"] = None, + ) -> None: + if message is None: + message = _("No such option: {name}").format(name=option_name) + + super().__init__(message, ctx) + self.option_name = option_name + self.possibilities = possibilities + + def format_message(self) -> str: + if not self.possibilities: + return self.message + + possibility_str = ", ".join(sorted(self.possibilities)) + suggest = ngettext( + "Did you mean {possibility}?", + "(Possible options: {possibilities})", + len(self.possibilities), + ).format(possibility=possibility_str, possibilities=possibility_str) + return f"{self.message} {suggest}" + + +class BadOptionUsage(UsageError): + """Raised if an option is generally supplied but the use of the option + was incorrect. This is for instance raised if the number of arguments + for an option is not correct. + + .. versionadded:: 4.0 + + :param option_name: the name of the option being used incorrectly. + """ + + def __init__( + self, option_name: str, message: str, ctx: t.Optional["Context"] = None + ) -> None: + super().__init__(message, ctx) + self.option_name = option_name + + +class BadArgumentUsage(UsageError): + """Raised if an argument is generally supplied but the use of the argument + was incorrect. This is for instance raised if the number of values + for an argument is not correct. + + .. versionadded:: 6.0 + """ + + +class FileError(ClickException): + """Raised if a file cannot be opened.""" + + def __init__(self, filename: str, hint: t.Optional[str] = None) -> None: + if hint is None: + hint = _("unknown error") + + super().__init__(hint) + self.ui_filename: str = format_filename(filename) + self.filename = filename + + def format_message(self) -> str: + return _("Could not open file {filename!r}: {message}").format( + filename=self.ui_filename, message=self.message + ) + + +class Abort(RuntimeError): + """An internal signalling exception that signals Click to abort.""" + + +class Exit(RuntimeError): + """An exception that indicates that the application should exit with some + status code. + + :param code: the status code to exit with. + """ + + __slots__ = ("exit_code",) + + def __init__(self, code: int = 0) -> None: + self.exit_code: int = code diff --git a/server-temp/venv/lib/python3.10/site-packages/click/formatting.py b/server-temp/venv/lib/python3.10/site-packages/click/formatting.py new file mode 100644 index 00000000..ddd2a2f8 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/click/formatting.py @@ -0,0 +1,301 @@ +import typing as t +from contextlib import contextmanager +from gettext import gettext as _ + +from ._compat import term_len +from .parser import split_opt + +# Can force a width. This is used by the test system +FORCED_WIDTH: t.Optional[int] = None + + +def measure_table(rows: t.Iterable[t.Tuple[str, str]]) -> t.Tuple[int, ...]: + widths: t.Dict[int, int] = {} + + 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: t.Iterable[t.Tuple[str, str]], col_count: int +) -> t.Iterator[t.Tuple[str, ...]]: + for row in rows: + yield row + ("",) * (col_count - len(row)) + + +def wrap_text( + text: str, + width: int = 78, + initial_indent: str = "", + subsequent_indent: str = "", + preserve_paragraphs: bool = False, +) -> str: + """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: t.List[t.Tuple[int, bool, str]] = [] + buf: t.List[str] = [] + indent = None + + def _flush_par() -> None: + 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: + """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: int = 2, + width: t.Optional[int] = None, + max_width: t.Optional[int] = None, + ) -> None: + import shutil + + 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(shutil.get_terminal_size().columns, max_width) - 2, 50) + self.width = width + self.current_indent = 0 + self.buffer: t.List[str] = [] + + def write(self, string: str) -> None: + """Writes a unicode string into the internal buffer.""" + self.buffer.append(string) + + def indent(self) -> None: + """Increases the indentation.""" + self.current_indent += self.indent_increment + + def dedent(self) -> None: + """Decreases the indentation.""" + self.current_indent -= self.indent_increment + + def write_usage( + self, prog: str, args: str = "", prefix: t.Optional[str] = None + ) -> None: + """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. Defaults to + ``"Usage: "``. + """ + if prefix is None: + prefix = f"{_('Usage:')} " + + usage_prefix = f"{prefix:>{self.current_indent}}{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: str) -> None: + """Writes a heading into the buffer.""" + self.write(f"{'':>{self.current_indent}}{heading}:\n") + + def write_paragraph(self) -> None: + """Writes a paragraph into the buffer.""" + if self.buffer: + self.write("\n") + + def write_text(self, text: str) -> None: + """Writes re-indented text into the buffer. This rewraps and + preserves paragraphs. + """ + indent = " " * self.current_indent + self.write( + wrap_text( + text, + self.width, + initial_indent=indent, + subsequent_indent=indent, + preserve_paragraphs=True, + ) + ) + self.write("\n") + + def write_dl( + self, + rows: t.Sequence[t.Tuple[str, str]], + col_max: int = 30, + col_spacing: int = 2, + ) -> None: + """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(f"{'':>{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) + wrapped_text = wrap_text(second, text_width, preserve_paragraphs=True) + lines = wrapped_text.splitlines() + + if lines: + self.write(f"{lines[0]}\n") + + for line in lines[1:]: + self.write(f"{'':>{first_col + self.current_indent}}{line}\n") + else: + self.write("\n") + + @contextmanager + def section(self, name: str) -> t.Iterator[None]: + """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) -> t.Iterator[None]: + """A context manager that increases the indentation.""" + self.indent() + try: + yield + finally: + self.dedent() + + def getvalue(self) -> str: + """Returns the buffer contents.""" + return "".join(self.buffer) + + +def join_options(options: t.Sequence[str]) -> t.Tuple[str, bool]: + """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]) + return ", ".join(x[1] for x in rv), any_prefix_is_slash diff --git a/server-temp/venv/lib/python3.10/site-packages/click/globals.py b/server-temp/venv/lib/python3.10/site-packages/click/globals.py new file mode 100644 index 00000000..480058f1 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/click/globals.py @@ -0,0 +1,68 @@ +import typing as t +from threading import local + +if t.TYPE_CHECKING: + import typing_extensions as te + from .core import Context + +_local = local() + + +@t.overload +def get_current_context(silent: "te.Literal[False]" = False) -> "Context": + ... + + +@t.overload +def get_current_context(silent: bool = ...) -> t.Optional["Context"]: + ... + + +def get_current_context(silent: bool = False) -> t.Optional["Context"]: + """Returns the current click context. This can be used as a way to + access the current context object from anywhere. This is a more implicit + alternative to the :func:`pass_context` decorator. This function is + primarily useful for helpers such as :func:`echo` which might be + interested in changing its behavior based on the current context. + + To push the current context, :meth:`Context.scope` can be used. + + .. versionadded:: 5.0 + + :param silent: if set to `True` the return value is `None` if no context + is available. The default behavior is to raise a + :exc:`RuntimeError`. + """ + try: + return t.cast("Context", _local.stack[-1]) + except (AttributeError, IndexError) as e: + if not silent: + raise RuntimeError("There is no active click context.") from e + + return None + + +def push_context(ctx: "Context") -> None: + """Pushes a new context to the current stack.""" + _local.__dict__.setdefault("stack", []).append(ctx) + + +def pop_context() -> None: + """Removes the top level from the stack.""" + _local.stack.pop() + + +def resolve_color_default(color: t.Optional[bool] = None) -> t.Optional[bool]: + """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 + + return None diff --git a/server-temp/venv/lib/python3.10/site-packages/click/parser.py b/server-temp/venv/lib/python3.10/site-packages/click/parser.py new file mode 100644 index 00000000..5fa7adfa --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/click/parser.py @@ -0,0 +1,529 @@ +""" +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. + +Click uses parts of optparse written by Gregory P. Ward and maintained +by the Python Software Foundation. This is limited to code in parser.py. + +Copyright 2001-2006 Gregory P. Ward. All rights reserved. +Copyright 2002-2006 Python Software Foundation. All rights reserved. +""" +# This code uses parts of optparse written by Gregory P. Ward and +# maintained by the Python Software Foundation. +# Copyright 2001-2006 Gregory P. Ward +# Copyright 2002-2006 Python Software Foundation +import typing as t +from collections import deque +from gettext import gettext as _ +from gettext import ngettext + +from .exceptions import BadArgumentUsage +from .exceptions import BadOptionUsage +from .exceptions import NoSuchOption +from .exceptions import UsageError + +if t.TYPE_CHECKING: + import typing_extensions as te + from .core import Argument as CoreArgument + from .core import Context + from .core import Option as CoreOption + from .core import Parameter as CoreParameter + +V = t.TypeVar("V") + +# Sentinel value that indicates an option was passed as a flag without a +# value but is not a flag option. Option.consume_value uses this to +# prompt or use the flag_value. +_flag_needs_value = object() + + +def _unpack_args( + args: t.Sequence[str], nargs_spec: t.Sequence[int] +) -> t.Tuple[t.Sequence[t.Union[str, t.Sequence[t.Optional[str]], None]], t.List[str]]: + """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: t.List[t.Union[str, t.Tuple[t.Optional[str], ...], None]] = [] + spos: t.Optional[int] = None + + def _fetch(c: "te.Deque[V]") -> t.Optional[V]: + 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 is None: + continue + + 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 split_opt(opt: str) -> t.Tuple[str, str]: + 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: str, ctx: t.Optional["Context"]) -> str: + if ctx is None or ctx.token_normalize_func is None: + return opt + prefix, opt = split_opt(opt) + return f"{prefix}{ctx.token_normalize_func(opt)}" + + +def split_arg_string(string: str) -> t.List[str]: + """Split an argument string as with :func:`shlex.split`, but don't + fail if the string is incomplete. Ignores a missing closing quote or + incomplete escape sequence and uses the partial token as-is. + + .. code-block:: python + + split_arg_string("example 'my file") + ["example", "my file"] + + split_arg_string("example my\\") + ["example", "my"] + + :param string: String to split. + """ + import shlex + + lex = shlex.shlex(string, posix=True) + lex.whitespace_split = True + lex.commenters = "" + out = [] + + try: + for token in lex: + out.append(token) + except ValueError: + # Raised when end-of-string is reached in an invalid state. Use + # the partial token as-is. The quote or escape character is in + # lex.state, not lex.token. + out.append(lex.token) + + return out + + +class Option: + def __init__( + self, + obj: "CoreOption", + opts: t.Sequence[str], + dest: t.Optional[str], + action: t.Optional[str] = None, + nargs: int = 1, + const: t.Optional[t.Any] = None, + ): + self._short_opts = [] + self._long_opts = [] + self.prefixes: t.Set[str] = set() + + for opt in opts: + prefix, value = split_opt(opt) + if not prefix: + raise ValueError(f"Invalid start character for option ({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) -> bool: + return self.action in ("store", "append") + + def process(self, value: t.Any, state: "ParsingState") -> None: + if self.action == "store": + state.opts[self.dest] = value # type: ignore + elif self.action == "store_const": + state.opts[self.dest] = self.const # type: ignore + elif self.action == "append": + state.opts.setdefault(self.dest, []).append(value) # type: ignore + elif self.action == "append_const": + state.opts.setdefault(self.dest, []).append(self.const) # type: ignore + elif self.action == "count": + state.opts[self.dest] = state.opts.get(self.dest, 0) + 1 # type: ignore + else: + raise ValueError(f"unknown action '{self.action}'") + state.order.append(self.obj) + + +class Argument: + def __init__(self, obj: "CoreArgument", dest: t.Optional[str], nargs: int = 1): + self.dest = dest + self.nargs = nargs + self.obj = obj + + def process( + self, + value: t.Union[t.Optional[str], t.Sequence[t.Optional[str]]], + state: "ParsingState", + ) -> None: + if self.nargs > 1: + assert value is not None + holes = sum(1 for x in value if x is None) + if holes == len(value): + value = None + elif holes != 0: + raise BadArgumentUsage( + _("Argument {name!r} takes {nargs} values.").format( + name=self.dest, nargs=self.nargs + ) + ) + + if self.nargs == -1 and self.obj.envvar is not None and value == (): + # Replace empty tuple with None so that a value from the + # environment may be tried. + value = None + + state.opts[self.dest] = value # type: ignore + state.order.append(self.obj) + + +class ParsingState: + def __init__(self, rargs: t.List[str]) -> None: + self.opts: t.Dict[str, t.Any] = {} + self.largs: t.List[str] = [] + self.rargs = rargs + self.order: t.List["CoreParameter"] = [] + + +class OptionParser: + """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: t.Optional["Context"] = None) -> 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: bool = 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: bool = 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: t.Dict[str, Option] = {} + self._long_opt: t.Dict[str, Option] = {} + self._opt_prefixes = {"-", "--"} + self._args: t.List[Argument] = [] + + def add_option( + self, + obj: "CoreOption", + opts: t.Sequence[str], + dest: t.Optional[str], + action: t.Optional[str] = None, + nargs: int = 1, + const: t.Optional[t.Any] = None, + ) -> 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``, ``append_const`` or ``count``. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + opts = [normalize_opt(opt, self.ctx) for opt in opts] + option = Option(obj, opts, dest, action=action, nargs=nargs, const=const) + 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, obj: "CoreArgument", dest: t.Optional[str], nargs: int = 1 + ) -> 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. + """ + self._args.append(Argument(obj, dest=dest, nargs=nargs)) + + def parse_args( + self, args: t.List[str] + ) -> t.Tuple[t.Dict[str, t.Any], t.List[str], t.List["CoreParameter"]]: + """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: ParsingState) -> None: + 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: ParsingState) -> None: + 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: str, explicit_value: t.Optional[str], state: ParsingState + ) -> None: + if opt not in self._long_opt: + from difflib import get_close_matches + + possibilities = get_close_matches(opt, self._long_opt) + raise NoSuchOption(opt, possibilities=possibilities, ctx=self.ctx) + + option = self._long_opt[opt] + if option.takes_value: + # At this point it's safe to modify rargs by injecting the + # explicit value, because no exception is raised in this + # branch. This means that the inserted value will be fully + # consumed. + if explicit_value is not None: + state.rargs.insert(0, explicit_value) + + value = self._get_value_from_state(opt, option, state) + + elif explicit_value is not None: + raise BadOptionUsage( + opt, _("Option {name!r} does not take a value.").format(name=opt) + ) + + else: + value = None + + option.process(value, state) + + def _match_short_opt(self, arg: str, state: ParsingState) -> None: + stop = False + i = 1 + prefix = arg[0] + unknown_options = [] + + for ch in arg[1:]: + opt = normalize_opt(f"{prefix}{ch}", self.ctx) + option = self._short_opt.get(opt) + i += 1 + + if not option: + if self.ignore_unknown_options: + unknown_options.append(ch) + continue + raise NoSuchOption(opt, ctx=self.ctx) + if option.takes_value: + # Any characters left in arg? Pretend they're the + # next arg, and stop consuming characters of arg. + if i < len(arg): + state.rargs.insert(0, arg[i:]) + stop = True + + value = self._get_value_from_state(opt, option, state) + + else: + value = None + + option.process(value, state) + + if stop: + break + + # If we got any unknown options we recombine 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(f"{prefix}{''.join(unknown_options)}") + + def _get_value_from_state( + self, option_name: str, option: Option, state: ParsingState + ) -> t.Any: + nargs = option.nargs + + if len(state.rargs) < nargs: + if option.obj._flag_needs_value: + # Option allows omitting the value. + value = _flag_needs_value + else: + raise BadOptionUsage( + option_name, + ngettext( + "Option {name!r} requires an argument.", + "Option {name!r} requires {nargs} arguments.", + nargs, + ).format(name=option_name, nargs=nargs), + ) + elif nargs == 1: + next_rarg = state.rargs[0] + + if ( + option.obj._flag_needs_value + and isinstance(next_rarg, str) + and next_rarg[:1] in self._opt_prefixes + and len(next_rarg) > 1 + ): + # The next arg looks like the start of an option, don't + # use it as the value if omitting the value is allowed. + value = _flag_needs_value + else: + value = state.rargs.pop(0) + else: + value = tuple(state.rargs[:nargs]) + del state.rargs[:nargs] + + return value + + def _process_opts(self, arg: str, state: ParsingState) -> None: + 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: + self._match_short_opt(arg, state) + return + + if not self.ignore_unknown_options: + raise + + state.largs.append(arg) diff --git a/server-temp/venv/lib/python3.10/site-packages/click/py.typed b/server-temp/venv/lib/python3.10/site-packages/click/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/server-temp/venv/lib/python3.10/site-packages/click/shell_completion.py b/server-temp/venv/lib/python3.10/site-packages/click/shell_completion.py new file mode 100644 index 00000000..dc9e00b9 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/click/shell_completion.py @@ -0,0 +1,596 @@ +import os +import re +import typing as t +from gettext import gettext as _ + +from .core import Argument +from .core import BaseCommand +from .core import Context +from .core import MultiCommand +from .core import Option +from .core import Parameter +from .core import ParameterSource +from .parser import split_arg_string +from .utils import echo + + +def shell_complete( + cli: BaseCommand, + ctx_args: t.MutableMapping[str, t.Any], + prog_name: str, + complete_var: str, + instruction: str, +) -> int: + """Perform shell completion for the given CLI program. + + :param cli: Command being called. + :param ctx_args: Extra arguments to pass to + ``cli.make_context``. + :param prog_name: Name of the executable in the shell. + :param complete_var: Name of the environment variable that holds + the completion instruction. + :param instruction: Value of ``complete_var`` with the completion + instruction and shell, in the form ``instruction_shell``. + :return: Status code to exit with. + """ + shell, _, instruction = instruction.partition("_") + comp_cls = get_completion_class(shell) + + if comp_cls is None: + return 1 + + comp = comp_cls(cli, ctx_args, prog_name, complete_var) + + if instruction == "source": + echo(comp.source()) + return 0 + + if instruction == "complete": + echo(comp.complete()) + return 0 + + return 1 + + +class CompletionItem: + """Represents a completion value and metadata about the value. The + default metadata is ``type`` to indicate special shell handling, + and ``help`` if a shell supports showing a help string next to the + value. + + Arbitrary parameters can be passed when creating the object, and + accessed using ``item.attr``. If an attribute wasn't passed, + accessing it returns ``None``. + + :param value: The completion suggestion. + :param type: Tells the shell script to provide special completion + support for the type. Click uses ``"dir"`` and ``"file"``. + :param help: String shown next to the value if supported. + :param kwargs: Arbitrary metadata. The built-in implementations + don't use this, but custom type completions paired with custom + shell support could use it. + """ + + __slots__ = ("value", "type", "help", "_info") + + def __init__( + self, + value: t.Any, + type: str = "plain", + help: t.Optional[str] = None, + **kwargs: t.Any, + ) -> None: + self.value: t.Any = value + self.type: str = type + self.help: t.Optional[str] = help + self._info = kwargs + + def __getattr__(self, name: str) -> t.Any: + return self._info.get(name) + + +# Only Bash >= 4.4 has the nosort option. +_SOURCE_BASH = """\ +%(complete_func)s() { + local IFS=$'\\n' + local response + + response=$(env COMP_WORDS="${COMP_WORDS[*]}" COMP_CWORD=$COMP_CWORD \ +%(complete_var)s=bash_complete $1) + + for completion in $response; do + IFS=',' read type value <<< "$completion" + + if [[ $type == 'dir' ]]; then + COMPREPLY=() + compopt -o dirnames + elif [[ $type == 'file' ]]; then + COMPREPLY=() + compopt -o default + elif [[ $type == 'plain' ]]; then + COMPREPLY+=($value) + fi + done + + return 0 +} + +%(complete_func)s_setup() { + complete -o nosort -F %(complete_func)s %(prog_name)s +} + +%(complete_func)s_setup; +""" + +_SOURCE_ZSH = """\ +#compdef %(prog_name)s + +%(complete_func)s() { + local -a completions + local -a completions_with_descriptions + local -a response + (( ! $+commands[%(prog_name)s] )) && return 1 + + response=("${(@f)$(env COMP_WORDS="${words[*]}" COMP_CWORD=$((CURRENT-1)) \ +%(complete_var)s=zsh_complete %(prog_name)s)}") + + for type key descr in ${response}; do + if [[ "$type" == "plain" ]]; then + if [[ "$descr" == "_" ]]; then + completions+=("$key") + else + completions_with_descriptions+=("$key":"$descr") + fi + elif [[ "$type" == "dir" ]]; then + _path_files -/ + elif [[ "$type" == "file" ]]; then + _path_files -f + fi + done + + if [ -n "$completions_with_descriptions" ]; then + _describe -V unsorted completions_with_descriptions -U + fi + + if [ -n "$completions" ]; then + compadd -U -V unsorted -a completions + fi +} + +if [[ $zsh_eval_context[-1] == loadautofunc ]]; then + # autoload from fpath, call function directly + %(complete_func)s "$@" +else + # eval/source/. command, register function for later + compdef %(complete_func)s %(prog_name)s +fi +""" + +_SOURCE_FISH = """\ +function %(complete_func)s; + set -l response (env %(complete_var)s=fish_complete COMP_WORDS=(commandline -cp) \ +COMP_CWORD=(commandline -t) %(prog_name)s); + + for completion in $response; + set -l metadata (string split "," $completion); + + if test $metadata[1] = "dir"; + __fish_complete_directories $metadata[2]; + else if test $metadata[1] = "file"; + __fish_complete_path $metadata[2]; + else if test $metadata[1] = "plain"; + echo $metadata[2]; + end; + end; +end; + +complete --no-files --command %(prog_name)s --arguments \ +"(%(complete_func)s)"; +""" + + +class ShellComplete: + """Base class for providing shell completion support. A subclass for + a given shell will override attributes and methods to implement the + completion instructions (``source`` and ``complete``). + + :param cli: Command being called. + :param prog_name: Name of the executable in the shell. + :param complete_var: Name of the environment variable that holds + the completion instruction. + + .. versionadded:: 8.0 + """ + + name: t.ClassVar[str] + """Name to register the shell as with :func:`add_completion_class`. + This is used in completion instructions (``{name}_source`` and + ``{name}_complete``). + """ + + source_template: t.ClassVar[str] + """Completion script template formatted by :meth:`source`. This must + be provided by subclasses. + """ + + def __init__( + self, + cli: BaseCommand, + ctx_args: t.MutableMapping[str, t.Any], + prog_name: str, + complete_var: str, + ) -> None: + self.cli = cli + self.ctx_args = ctx_args + self.prog_name = prog_name + self.complete_var = complete_var + + @property + def func_name(self) -> str: + """The name of the shell function defined by the completion + script. + """ + safe_name = re.sub(r"\W*", "", self.prog_name.replace("-", "_"), flags=re.ASCII) + return f"_{safe_name}_completion" + + def source_vars(self) -> t.Dict[str, t.Any]: + """Vars for formatting :attr:`source_template`. + + By default this provides ``complete_func``, ``complete_var``, + and ``prog_name``. + """ + return { + "complete_func": self.func_name, + "complete_var": self.complete_var, + "prog_name": self.prog_name, + } + + def source(self) -> str: + """Produce the shell script that defines the completion + function. By default this ``%``-style formats + :attr:`source_template` with the dict returned by + :meth:`source_vars`. + """ + return self.source_template % self.source_vars() + + def get_completion_args(self) -> t.Tuple[t.List[str], str]: + """Use the env vars defined by the shell script to return a + tuple of ``args, incomplete``. This must be implemented by + subclasses. + """ + raise NotImplementedError + + def get_completions( + self, args: t.List[str], incomplete: str + ) -> t.List[CompletionItem]: + """Determine the context and last complete command or parameter + from the complete args. Call that object's ``shell_complete`` + method to get the completions for the incomplete value. + + :param args: List of complete args before the incomplete value. + :param incomplete: Value being completed. May be empty. + """ + ctx = _resolve_context(self.cli, self.ctx_args, self.prog_name, args) + obj, incomplete = _resolve_incomplete(ctx, args, incomplete) + return obj.shell_complete(ctx, incomplete) + + def format_completion(self, item: CompletionItem) -> str: + """Format a completion item into the form recognized by the + shell script. This must be implemented by subclasses. + + :param item: Completion item to format. + """ + raise NotImplementedError + + def complete(self) -> str: + """Produce the completion data to send back to the shell. + + By default this calls :meth:`get_completion_args`, gets the + completions, then calls :meth:`format_completion` for each + completion. + """ + args, incomplete = self.get_completion_args() + completions = self.get_completions(args, incomplete) + out = [self.format_completion(item) for item in completions] + return "\n".join(out) + + +class BashComplete(ShellComplete): + """Shell completion for Bash.""" + + name = "bash" + source_template = _SOURCE_BASH + + @staticmethod + def _check_version() -> None: + import subprocess + + output = subprocess.run( + ["bash", "-c", 'echo "${BASH_VERSION}"'], stdout=subprocess.PIPE + ) + match = re.search(r"^(\d+)\.(\d+)\.\d+", output.stdout.decode()) + + if match is not None: + major, minor = match.groups() + + if major < "4" or major == "4" and minor < "4": + echo( + _( + "Shell completion is not supported for Bash" + " versions older than 4.4." + ), + err=True, + ) + else: + echo( + _("Couldn't detect Bash version, shell completion is not supported."), + err=True, + ) + + def source(self) -> str: + self._check_version() + return super().source() + + def get_completion_args(self) -> t.Tuple[t.List[str], str]: + 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 = "" + + return args, incomplete + + def format_completion(self, item: CompletionItem) -> str: + return f"{item.type},{item.value}" + + +class ZshComplete(ShellComplete): + """Shell completion for Zsh.""" + + name = "zsh" + source_template = _SOURCE_ZSH + + def get_completion_args(self) -> t.Tuple[t.List[str], str]: + 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 = "" + + return args, incomplete + + def format_completion(self, item: CompletionItem) -> str: + return f"{item.type}\n{item.value}\n{item.help if item.help else '_'}" + + +class FishComplete(ShellComplete): + """Shell completion for Fish.""" + + name = "fish" + source_template = _SOURCE_FISH + + def get_completion_args(self) -> t.Tuple[t.List[str], str]: + cwords = split_arg_string(os.environ["COMP_WORDS"]) + incomplete = os.environ["COMP_CWORD"] + args = cwords[1:] + + # Fish stores the partial word in both COMP_WORDS and + # COMP_CWORD, remove it from complete args. + if incomplete and args and args[-1] == incomplete: + args.pop() + + return args, incomplete + + def format_completion(self, item: CompletionItem) -> str: + if item.help: + return f"{item.type},{item.value}\t{item.help}" + + return f"{item.type},{item.value}" + + +ShellCompleteType = t.TypeVar("ShellCompleteType", bound=t.Type[ShellComplete]) + + +_available_shells: t.Dict[str, t.Type[ShellComplete]] = { + "bash": BashComplete, + "fish": FishComplete, + "zsh": ZshComplete, +} + + +def add_completion_class( + cls: ShellCompleteType, name: t.Optional[str] = None +) -> ShellCompleteType: + """Register a :class:`ShellComplete` subclass under the given name. + The name will be provided by the completion instruction environment + variable during completion. + + :param cls: The completion class that will handle completion for the + shell. + :param name: Name to register the class under. Defaults to the + class's ``name`` attribute. + """ + if name is None: + name = cls.name + + _available_shells[name] = cls + + return cls + + +def get_completion_class(shell: str) -> t.Optional[t.Type[ShellComplete]]: + """Look up a registered :class:`ShellComplete` subclass by the name + provided by the completion instruction environment variable. If the + name isn't registered, returns ``None``. + + :param shell: Name the class is registered under. + """ + return _available_shells.get(shell) + + +def _is_incomplete_argument(ctx: Context, param: Parameter) -> bool: + """Determine if the given parameter is an argument that can still + accept values. + + :param ctx: Invocation context for the command represented by the + parsed complete args. + :param param: Argument object being checked. + """ + if not isinstance(param, Argument): + return False + + assert param.name is not None + # Will be None if expose_value is False. + value = ctx.params.get(param.name) + return ( + param.nargs == -1 + or ctx.get_parameter_source(param.name) is not ParameterSource.COMMANDLINE + or ( + param.nargs > 1 + and isinstance(value, (tuple, list)) + and len(value) < param.nargs + ) + ) + + +def _start_of_option(ctx: Context, value: str) -> bool: + """Check if the value looks like the start of an option.""" + if not value: + return False + + c = value[0] + return c in ctx._opt_prefixes + + +def _is_incomplete_option(ctx: Context, args: t.List[str], param: Parameter) -> bool: + """Determine if the given parameter is an option that needs a value. + + :param args: List of complete args before the incomplete value. + :param param: Option object being checked. + """ + if not isinstance(param, Option): + return False + + if param.is_flag or param.count: + return False + + last_option = None + + for index, arg in enumerate(reversed(args)): + if index + 1 > param.nargs: + break + + if _start_of_option(ctx, arg): + last_option = arg + + return last_option is not None and last_option in param.opts + + +def _resolve_context( + cli: BaseCommand, + ctx_args: t.MutableMapping[str, t.Any], + prog_name: str, + args: t.List[str], +) -> Context: + """Produce the context hierarchy starting with the command and + traversing the complete arguments. This only follows the commands, + it doesn't trigger input prompts or callbacks. + + :param cli: Command being called. + :param prog_name: Name of the executable in the shell. + :param args: List of complete args before the incomplete value. + """ + ctx_args["resilient_parsing"] = True + ctx = cli.make_context(prog_name, args.copy(), **ctx_args) + args = ctx.protected_args + ctx.args + + while args: + command = ctx.command + + if isinstance(command, MultiCommand): + if not command.chain: + name, cmd, args = command.resolve_command(ctx, args) + + if cmd is None: + return ctx + + ctx = cmd.make_context(name, args, parent=ctx, resilient_parsing=True) + args = ctx.protected_args + ctx.args + else: + sub_ctx = ctx + + while args: + name, cmd, args = command.resolve_command(ctx, args) + + if cmd is None: + return ctx + + sub_ctx = cmd.make_context( + name, + args, + parent=ctx, + allow_extra_args=True, + allow_interspersed_args=False, + resilient_parsing=True, + ) + args = sub_ctx.args + + ctx = sub_ctx + args = [*sub_ctx.protected_args, *sub_ctx.args] + else: + break + + return ctx + + +def _resolve_incomplete( + ctx: Context, args: t.List[str], incomplete: str +) -> t.Tuple[t.Union[BaseCommand, Parameter], str]: + """Find the Click object that will handle the completion of the + incomplete value. Return the object and the incomplete value. + + :param ctx: Invocation context for the command represented by + the parsed complete args. + :param args: List of complete args before the incomplete value. + :param incomplete: Value being completed. May be empty. + """ + # Different shells treat an "=" between a long option name and + # value differently. Might keep the value joined, return the "=" + # as a separate item, or return the split name and value. Always + # split and discard the "=" to make completion easier. + if incomplete == "=": + incomplete = "" + elif "=" in incomplete and _start_of_option(ctx, incomplete): + name, _, incomplete = incomplete.partition("=") + args.append(name) + + # The "--" marker tells Click to stop treating values as options + # even if they start with the option character. If it hasn't been + # given and the incomplete arg looks like an option, the current + # command will provide option name completions. + if "--" not in args and _start_of_option(ctx, incomplete): + return ctx.command, incomplete + + params = ctx.command.get_params(ctx) + + # If the last complete arg is an option name with an incomplete + # value, the option will provide value completions. + for param in params: + if _is_incomplete_option(ctx, args, param): + return param, incomplete + + # It's not an option name or value. The first argument without a + # parsed value will provide value completions. + for param in params: + if _is_incomplete_argument(ctx, param): + return param, incomplete + + # There were no unparsed arguments, the command may be a group that + # will provide command name completions. + return ctx.command, incomplete diff --git a/server-temp/venv/lib/python3.10/site-packages/click/termui.py b/server-temp/venv/lib/python3.10/site-packages/click/termui.py new file mode 100644 index 00000000..db7a4b28 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/click/termui.py @@ -0,0 +1,784 @@ +import inspect +import io +import itertools +import sys +import typing as t +from gettext import gettext as _ + +from ._compat import isatty +from ._compat import strip_ansi +from .exceptions import Abort +from .exceptions import UsageError +from .globals import resolve_color_default +from .types import Choice +from .types import convert_type +from .types import ParamType +from .utils import echo +from .utils import LazyFile + +if t.TYPE_CHECKING: + from ._termui_impl import ProgressBar + +V = t.TypeVar("V") + +# The prompt functions to use. The doc tools currently override these +# functions to customize how they work. +visible_prompt_func: t.Callable[[str], str] = input + +_ansi_colors = { + "black": 30, + "red": 31, + "green": 32, + "yellow": 33, + "blue": 34, + "magenta": 35, + "cyan": 36, + "white": 37, + "reset": 39, + "bright_black": 90, + "bright_red": 91, + "bright_green": 92, + "bright_yellow": 93, + "bright_blue": 94, + "bright_magenta": 95, + "bright_cyan": 96, + "bright_white": 97, +} +_ansi_reset_all = "\033[0m" + + +def hidden_prompt_func(prompt: str) -> str: + import getpass + + return getpass.getpass(prompt) + + +def _build_prompt( + text: str, + suffix: str, + show_default: bool = False, + default: t.Optional[t.Any] = None, + show_choices: bool = True, + type: t.Optional[ParamType] = None, +) -> str: + prompt = text + if type is not None and show_choices and isinstance(type, Choice): + prompt += f" ({', '.join(map(str, type.choices))})" + if default is not None and show_default: + prompt = f"{prompt} [{_format_default(default)}]" + return f"{prompt}{suffix}" + + +def _format_default(default: t.Any) -> t.Any: + if isinstance(default, (io.IOBase, LazyFile)) and hasattr(default, "name"): + return default.name + + return default + + +def prompt( + text: str, + default: t.Optional[t.Any] = None, + hide_input: bool = False, + confirmation_prompt: t.Union[bool, str] = False, + type: t.Optional[t.Union[ParamType, t.Any]] = None, + value_proc: t.Optional[t.Callable[[str], t.Any]] = None, + prompt_suffix: str = ": ", + show_default: bool = True, + err: bool = False, + show_choices: bool = True, +) -> t.Any: + """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 an interrupt signal, this + function will catch it and raise a :exc:`Abort` exception. + + :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: Prompt a second time to confirm the + value. Can be set to a string instead of ``True`` to customize + the message. + :param type: the type to use to check the value against. + :param value_proc: if this parameter is provided it's a function that + is invoked instead of the type conversion to + convert a value. + :param prompt_suffix: a suffix that should be added to the prompt. + :param show_default: shows or hides the default value in the prompt. + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``, the same as with echo. + :param show_choices: Show or hide choices if the passed type is a Choice. + For example if type is a Choice of either day or week, + show_choices is true and text is "Group by" then the + prompt will be "Group by (day, week): ". + + .. versionadded:: 8.0 + ``confirmation_prompt`` can be a custom string. + + .. versionadded:: 7.0 + Added the ``show_choices`` parameter. + + .. versionadded:: 6.0 + Added unicode support for cmd.exe on Windows. + + .. versionadded:: 4.0 + Added the `err` parameter. + + """ + + def prompt_func(text: str) -> str: + f = hidden_prompt_func if hide_input else visible_prompt_func + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(text.rstrip(" "), nl=False, err=err) + # Echo a space to stdout to work around an issue where + # readline causes backspace to clear the whole line. + 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() from None + + if value_proc is None: + value_proc = convert_type(type, default) + + prompt = _build_prompt( + text, prompt_suffix, show_default, default, show_choices, type + ) + + if confirmation_prompt: + if confirmation_prompt is True: + confirmation_prompt = _("Repeat for confirmation") + + confirmation_prompt = _build_prompt(confirmation_prompt, prompt_suffix) + + while True: + while True: + value = prompt_func(prompt) + if value: + break + elif default is not None: + value = default + break + try: + result = value_proc(value) + except UsageError as e: + if hide_input: + echo(_("Error: The value you entered was invalid."), err=err) + else: + echo(_("Error: {e.message}").format(e=e), err=err) # noqa: B306 + continue + if not confirmation_prompt: + return result + while True: + value2 = prompt_func(confirmation_prompt) + is_empty = not value and not value2 + if value2 or is_empty: + break + if value == value2: + return result + echo(_("Error: The two entered values do not match."), err=err) + + +def confirm( + text: str, + default: t.Optional[bool] = False, + abort: bool = False, + prompt_suffix: str = ": ", + show_default: bool = True, + err: bool = False, +) -> bool: + """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. + + :param text: the question to ask. + :param default: The default value to use when no input is given. If + ``None``, repeat until input is given. + :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. + + .. versionchanged:: 8.0 + Repeat until input is given if ``default`` is ``None``. + + .. versionadded:: 4.0 + Added the ``err`` parameter. + """ + prompt = _build_prompt( + text, + prompt_suffix, + show_default, + "y/n" if default is None else ("Y/n" if default else "y/N"), + ) + + while True: + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(prompt.rstrip(" "), nl=False, err=err) + # Echo a space to stdout to work around an issue where + # readline causes backspace to clear the whole line. + value = visible_prompt_func(" ").lower().strip() + except (KeyboardInterrupt, EOFError): + raise Abort() from None + if value in ("y", "yes"): + rv = True + elif value in ("n", "no"): + rv = False + elif default is not None and value == "": + rv = default + else: + echo(_("Error: invalid input"), err=err) + continue + break + if abort and not rv: + raise Abort() + return rv + + +def echo_via_pager( + text_or_generator: t.Union[t.Iterable[str], t.Callable[[], t.Iterable[str]], str], + color: t.Optional[bool] = None, +) -> None: + """This function takes a text and shows it via an environment specific + pager on stdout. + + .. versionchanged:: 3.0 + Added the `color` flag. + + :param text_or_generator: the text to page, or alternatively, a + generator emitting the text to page. + :param color: controls if the pager supports ANSI colors or not. The + default is autodetection. + """ + color = resolve_color_default(color) + + if inspect.isgeneratorfunction(text_or_generator): + i = t.cast(t.Callable[[], t.Iterable[str]], text_or_generator)() + elif isinstance(text_or_generator, str): + i = [text_or_generator] + else: + i = iter(t.cast(t.Iterable[str], text_or_generator)) + + # convert every element of i to a text type if necessary + text_generator = (el if isinstance(el, str) else str(el) for el in i) + + from ._termui_impl import pager + + return pager(itertools.chain(text_generator, "\n"), color) + + +def progressbar( + iterable: t.Optional[t.Iterable[V]] = None, + length: t.Optional[int] = None, + label: t.Optional[str] = None, + show_eta: bool = True, + show_percent: t.Optional[bool] = None, + show_pos: bool = False, + item_show_func: t.Optional[t.Callable[[t.Optional[V]], t.Optional[str]]] = None, + fill_char: str = "#", + empty_char: str = "-", + bar_template: str = "%(label)s [%(bar)s] %(info)s", + info_sep: str = " ", + width: int = 36, + file: t.Optional[t.TextIO] = None, + color: t.Optional[bool] = None, + update_min_steps: int = 1, +) -> "ProgressBar[V]": + """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 created. 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. + + Note: The progress bar is currently designed for use cases where the + total progress can be expected to take at least several seconds. + Because of this, the ProgressBar class object won't display + progress that is considered too fast, and progress where the time + between steps is less than a second. + + 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) + + The ``update()`` method also takes an optional value specifying the + ``current_item`` at the new position. This is useful when used + together with ``item_show_func`` to customize the output for each + manual step:: + + with click.progressbar( + length=total_size, + label='Unzipping archive', + item_show_func=lambda a: a.filename + ) as bar: + for archive in zip_file: + archive.extract() + bar.update(archive.size, archive) + + :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 next to the progress bar. If the + function returns ``None`` nothing is shown. The current item can + be ``None``, such as when entering and exiting the bar. + :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. + :param update_min_steps: Render only when this many updates have + completed. This allows tuning for very fast iterators. + + .. versionchanged:: 8.0 + Output is shown even if execution time is less than 0.5 seconds. + + .. versionchanged:: 8.0 + ``item_show_func`` shows the current item, not the previous one. + + .. versionchanged:: 8.0 + Labels are echoed if the output is not a TTY. Reverts a change + in 7.0 that removed all output. + + .. versionadded:: 8.0 + Added the ``update_min_steps`` parameter. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. Added the ``update`` method to + the object. + + .. versionadded:: 2.0 + """ + 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, + update_min_steps=update_min_steps, + ) + + +def clear() -> None: + """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 + + # ANSI escape \033[2J clears the screen, \033[1;1H moves the cursor + echo("\033[2J\033[1;1H", nl=False) + + +def _interpret_color( + color: t.Union[int, t.Tuple[int, int, int], str], offset: int = 0 +) -> str: + if isinstance(color, int): + return f"{38 + offset};5;{color:d}" + + if isinstance(color, (tuple, list)): + r, g, b = color + return f"{38 + offset};2;{r:d};{g:d};{b:d}" + + return str(_ansi_colors[color] + offset) + + +def style( + text: t.Any, + fg: t.Optional[t.Union[int, t.Tuple[int, int, int], str]] = None, + bg: t.Optional[t.Union[int, t.Tuple[int, int, int], str]] = None, + bold: t.Optional[bool] = None, + dim: t.Optional[bool] = None, + underline: t.Optional[bool] = None, + overline: t.Optional[bool] = None, + italic: t.Optional[bool] = None, + blink: t.Optional[bool] = None, + reverse: t.Optional[bool] = None, + strikethrough: t.Optional[bool] = None, + reset: bool = True, +) -> str: + """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')) + click.echo(click.style('More colors', fg=(255, 12, 128), bg=117)) + + Supported color names: + + * ``black`` (might be a gray) + * ``red`` + * ``green`` + * ``yellow`` (might be an orange) + * ``blue`` + * ``magenta`` + * ``cyan`` + * ``white`` (might be light gray) + * ``bright_black`` + * ``bright_red`` + * ``bright_green`` + * ``bright_yellow`` + * ``bright_blue`` + * ``bright_magenta`` + * ``bright_cyan`` + * ``bright_white`` + * ``reset`` (reset the color code only) + + If the terminal supports it, color may also be specified as: + + - An integer in the interval [0, 255]. The terminal must support + 8-bit/256-color mode. + - An RGB tuple of three integers in [0, 255]. The terminal must + support 24-bit/true-color mode. + + See https://en.wikipedia.org/wiki/ANSI_color and + https://gist.github.com/XVilka/8346728 for more information. + + :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 overline: if provided this will enable or disable overline. + :param italic: if provided this will enable or disable italic. + :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 strikethrough: if provided this will enable or disable + striking through text. + :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. + + .. versionchanged:: 8.0 + A non-string ``message`` is converted to a string. + + .. versionchanged:: 8.0 + Added support for 256 and RGB color codes. + + .. versionchanged:: 8.0 + Added the ``strikethrough``, ``italic``, and ``overline`` + parameters. + + .. versionchanged:: 7.0 + Added support for bright colors. + + .. versionadded:: 2.0 + """ + if not isinstance(text, str): + text = str(text) + + bits = [] + + if fg: + try: + bits.append(f"\033[{_interpret_color(fg)}m") + except KeyError: + raise TypeError(f"Unknown color {fg!r}") from None + + if bg: + try: + bits.append(f"\033[{_interpret_color(bg, 10)}m") + except KeyError: + raise TypeError(f"Unknown color {bg!r}") from None + + if bold is not None: + bits.append(f"\033[{1 if bold else 22}m") + if dim is not None: + bits.append(f"\033[{2 if dim else 22}m") + if underline is not None: + bits.append(f"\033[{4 if underline else 24}m") + if overline is not None: + bits.append(f"\033[{53 if overline else 55}m") + if italic is not None: + bits.append(f"\033[{3 if italic else 23}m") + if blink is not None: + bits.append(f"\033[{5 if blink else 25}m") + if reverse is not None: + bits.append(f"\033[{7 if reverse else 27}m") + if strikethrough is not None: + bits.append(f"\033[{9 if strikethrough else 29}m") + bits.append(text) + if reset: + bits.append(_ansi_reset_all) + return "".join(bits) + + +def unstyle(text: str) -> str: + """Removes ANSI styling information from a string. Usually it's not + necessary to use this function as Click's echo function will + automatically remove styling if necessary. + + .. versionadded:: 2.0 + + :param text: the text to remove style information from. + """ + return strip_ansi(text) + + +def secho( + message: t.Optional[t.Any] = None, + file: t.Optional[t.IO[t.AnyStr]] = None, + nl: bool = True, + err: bool = False, + color: t.Optional[bool] = None, + **styles: t.Any, +) -> None: + """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. + + Non-string types will be converted to :class:`str`. However, + :class:`bytes` are passed directly to :meth:`echo` without applying + style. If you want to style bytes that represent text, call + :meth:`bytes.decode` first. + + .. versionchanged:: 8.0 + A non-string ``message`` is converted to a string. Bytes are + passed through without style applied. + + .. versionadded:: 2.0 + """ + if message is not None and not isinstance(message, (bytes, bytearray)): + message = style(message, **styles) + + return echo(message, file=file, nl=nl, err=err, color=color) + + +def edit( + text: t.Optional[t.AnyStr] = None, + editor: t.Optional[str] = None, + env: t.Optional[t.Mapping[str, str]] = None, + require_save: bool = True, + extension: str = ".txt", + filename: t.Optional[str] = None, +) -> t.Optional[t.AnyStr]: + 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 + + ed = Editor(editor=editor, env=env, require_save=require_save, extension=extension) + + if filename is None: + return ed.edit(text) + + ed.edit_file(filename) + return None + + +def launch(url: str, wait: bool = False, locate: bool = False) -> int: + """This function launches the given URL (or filename) in the default + viewer application for this file type. If this is an executable, it + might launch the executable in a new session. The return value is + the exit code of the launched application. Usually, ``0`` indicates + success. + + Examples:: + + click.launch('https://click.palletsprojects.com/') + click.launch('/my/downloaded/file', locate=True) + + .. versionadded:: 2.0 + + :param url: URL or filename of the thing to launch. + :param wait: Wait for the program to exit before returning. This + only works if the launched program blocks. In particular, + ``xdg-open`` on Linux does not block. + :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: t.Optional[t.Callable[[bool], str]] = None + + +def getchar(echo: bool = False) -> str: + """Fetches a single character from the terminal and returns it. This + will always return a unicode character and under certain rare + circumstances this might return more than one character. The + situations which more than one character is returned is when for + whatever reason multiple characters end up in the terminal buffer or + standard input was not actually a terminal. + + Note that this will always read from the terminal, even if something + is piped into the standard input. + + Note for Windows: in rare cases when typing non-ASCII characters, this + function might wait for a second character and then return both at once. + This is because certain Unicode characters look like special-key markers. + + .. versionadded:: 2.0 + + :param echo: if set to `True`, the character read will also show up on + the terminal. The default is to not show it. + """ + global _getchar + + if _getchar is None: + from ._termui_impl import getchar as f + + _getchar = f + + return _getchar(echo) + + +def raw_terminal() -> t.ContextManager[int]: + from ._termui_impl import raw_terminal as f + + return f() + + +def pause(info: t.Optional[str] = None, err: bool = False) -> None: + """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 message to print before pausing. Defaults to + ``"Press any key to continue..."``. + :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 + + if info is None: + info = _("Press any key to continue...") + + try: + if info: + echo(info, nl=False, err=err) + try: + getchar() + except (KeyboardInterrupt, EOFError): + pass + finally: + if info: + echo(err=err) diff --git a/server-temp/venv/lib/python3.10/site-packages/click/testing.py b/server-temp/venv/lib/python3.10/site-packages/click/testing.py new file mode 100644 index 00000000..e0df0d2a --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/click/testing.py @@ -0,0 +1,479 @@ +import contextlib +import io +import os +import shlex +import shutil +import sys +import tempfile +import typing as t +from types import TracebackType + +from . import formatting +from . import termui +from . import utils +from ._compat import _find_binary_reader + +if t.TYPE_CHECKING: + from .core import BaseCommand + + +class EchoingStdin: + def __init__(self, input: t.BinaryIO, output: t.BinaryIO) -> None: + self._input = input + self._output = output + self._paused = False + + def __getattr__(self, x: str) -> t.Any: + return getattr(self._input, x) + + def _echo(self, rv: bytes) -> bytes: + if not self._paused: + self._output.write(rv) + + return rv + + def read(self, n: int = -1) -> bytes: + return self._echo(self._input.read(n)) + + def read1(self, n: int = -1) -> bytes: + return self._echo(self._input.read1(n)) # type: ignore + + def readline(self, n: int = -1) -> bytes: + return self._echo(self._input.readline(n)) + + def readlines(self) -> t.List[bytes]: + return [self._echo(x) for x in self._input.readlines()] + + def __iter__(self) -> t.Iterator[bytes]: + return iter(self._echo(x) for x in self._input) + + def __repr__(self) -> str: + return repr(self._input) + + +@contextlib.contextmanager +def _pause_echo(stream: t.Optional[EchoingStdin]) -> t.Iterator[None]: + if stream is None: + yield + else: + stream._paused = True + yield + stream._paused = False + + +class _NamedTextIOWrapper(io.TextIOWrapper): + def __init__( + self, buffer: t.BinaryIO, name: str, mode: str, **kwargs: t.Any + ) -> None: + super().__init__(buffer, **kwargs) + self._name = name + self._mode = mode + + @property + def name(self) -> str: + return self._name + + @property + def mode(self) -> str: + return self._mode + + +def make_input_stream( + input: t.Optional[t.Union[str, bytes, t.IO[t.Any]]], charset: str +) -> t.BinaryIO: + # Is already an input stream. + if hasattr(input, "read"): + rv = _find_binary_reader(t.cast(t.IO[t.Any], 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 isinstance(input, str): + input = input.encode(charset) + + return io.BytesIO(input) + + +class Result: + """Holds the captured result of an invoked CLI script.""" + + def __init__( + self, + runner: "CliRunner", + stdout_bytes: bytes, + stderr_bytes: t.Optional[bytes], + return_value: t.Any, + exit_code: int, + exception: t.Optional[BaseException], + exc_info: t.Optional[ + t.Tuple[t.Type[BaseException], BaseException, TracebackType] + ] = None, + ): + #: The runner that created the result + self.runner = runner + #: The standard output as bytes. + self.stdout_bytes = stdout_bytes + #: The standard error as bytes, or None if not available + self.stderr_bytes = stderr_bytes + #: The value returned from the invoked command. + #: + #: .. versionadded:: 8.0 + self.return_value = return_value + #: The exit code as integer. + self.exit_code = exit_code + #: The exception that happened if one did. + self.exception = exception + #: The traceback + self.exc_info = exc_info + + @property + def output(self) -> str: + """The (standard) output as unicode string.""" + return self.stdout + + @property + def stdout(self) -> str: + """The standard output as unicode string.""" + return self.stdout_bytes.decode(self.runner.charset, "replace").replace( + "\r\n", "\n" + ) + + @property + def stderr(self) -> str: + """The standard error as unicode string.""" + if self.stderr_bytes is None: + raise ValueError("stderr not separately captured") + return self.stderr_bytes.decode(self.runner.charset, "replace").replace( + "\r\n", "\n" + ) + + def __repr__(self) -> str: + exc_str = repr(self.exception) if self.exception else "okay" + return f"<{type(self).__name__} {exc_str}>" + + +class CliRunner: + """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. + :param env: a dictionary with environment variables for overriding. + :param echo_stdin: if this is set to `True`, then reading from stdin writes + to stdout. This is useful for showing examples in + some circumstances. Note that regular prompts + will automatically echo the input. + :param mix_stderr: if this is set to `False`, then stdout and stderr are + preserved as independent streams. This is useful for + Unix-philosophy apps that have predictable stdout and + noisy stderr, such that each may be measured + independently + """ + + def __init__( + self, + charset: str = "utf-8", + env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, + echo_stdin: bool = False, + mix_stderr: bool = True, + ) -> None: + self.charset = charset + self.env: t.Mapping[str, t.Optional[str]] = env or {} + self.echo_stdin = echo_stdin + self.mix_stderr = mix_stderr + + def get_default_prog_name(self, cli: "BaseCommand") -> str: + """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: t.Optional[t.Mapping[str, t.Optional[str]]] = None + ) -> t.Mapping[str, t.Optional[str]]: + """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: t.Optional[t.Union[str, bytes, t.IO[t.Any]]] = None, + env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, + color: bool = False, + ) -> t.Iterator[t.Tuple[io.BytesIO, t.Optional[io.BytesIO]]]: + """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. + + :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. + + .. versionchanged:: 8.0 + ``stderr`` is opened with ``errors="backslashreplace"`` + instead of the default ``"strict"``. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. + """ + bytes_input = make_input_stream(input, self.charset) + echo_input = None + + old_stdin = sys.stdin + old_stdout = sys.stdout + old_stderr = sys.stderr + old_forced_width = formatting.FORCED_WIDTH + formatting.FORCED_WIDTH = 80 + + env = self.make_env(env) + + bytes_output = io.BytesIO() + + if self.echo_stdin: + bytes_input = echo_input = t.cast( + t.BinaryIO, EchoingStdin(bytes_input, bytes_output) + ) + + sys.stdin = text_input = _NamedTextIOWrapper( + bytes_input, encoding=self.charset, name="", mode="r" + ) + + if self.echo_stdin: + # Force unbuffered reads, otherwise TextIOWrapper reads a + # large chunk which is echoed early. + text_input._CHUNK_SIZE = 1 # type: ignore + + sys.stdout = _NamedTextIOWrapper( + bytes_output, encoding=self.charset, name="", mode="w" + ) + + bytes_error = None + if self.mix_stderr: + sys.stderr = sys.stdout + else: + bytes_error = io.BytesIO() + sys.stderr = _NamedTextIOWrapper( + bytes_error, + encoding=self.charset, + name="", + mode="w", + errors="backslashreplace", + ) + + @_pause_echo(echo_input) # type: ignore + def visible_input(prompt: t.Optional[str] = None) -> str: + sys.stdout.write(prompt or "") + val = text_input.readline().rstrip("\r\n") + sys.stdout.write(f"{val}\n") + sys.stdout.flush() + return val + + @_pause_echo(echo_input) # type: ignore + def hidden_input(prompt: t.Optional[str] = None) -> str: + sys.stdout.write(f"{prompt or ''}\n") + sys.stdout.flush() + return text_input.readline().rstrip("\r\n") + + @_pause_echo(echo_input) # type: ignore + def _getchar(echo: bool) -> str: + char = sys.stdin.read(1) + + if echo: + sys.stdout.write(char) + + sys.stdout.flush() + return char + + default_color = color + + def should_strip_ansi( + stream: t.Optional[t.IO[t.Any]] = None, color: t.Optional[bool] = None + ) -> bool: + if color is None: + return not default_color + return not color + + old_visible_prompt_func = termui.visible_prompt_func + old_hidden_prompt_func = termui.hidden_prompt_func + old__getchar_func = termui._getchar + old_should_strip_ansi = utils.should_strip_ansi # type: ignore + termui.visible_prompt_func = visible_input + termui.hidden_prompt_func = hidden_input + termui._getchar = _getchar + utils.should_strip_ansi = should_strip_ansi # type: ignore + + old_env = {} + try: + for key, value in env.items(): + 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, bytes_error) + finally: + for key, value in old_env.items(): + 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 + termui.visible_prompt_func = old_visible_prompt_func + termui.hidden_prompt_func = old_hidden_prompt_func + termui._getchar = old__getchar_func + utils.should_strip_ansi = old_should_strip_ansi # type: ignore + formatting.FORCED_WIDTH = old_forced_width + + def invoke( + self, + cli: "BaseCommand", + args: t.Optional[t.Union[str, t.Sequence[str]]] = None, + input: t.Optional[t.Union[str, bytes, t.IO[t.Any]]] = None, + env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, + catch_exceptions: bool = True, + color: bool = False, + **extra: t.Any, + ) -> Result: + """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. + + :param cli: the command to invoke + :param args: the arguments to invoke. It may be given as an iterable + or a string. When given as string it will be interpreted + as a Unix shell command. More details at + :func:`shlex.split`. + :param input: the input data for `sys.stdin`. + :param env: the environment overrides. + :param catch_exceptions: Whether to catch any other exceptions than + ``SystemExit``. + :param extra: the keyword arguments to pass to :meth:`main`. + :param color: whether the output should contain color codes. The + application can still override this explicitly. + + .. versionchanged:: 8.0 + The result object has the ``return_value`` attribute with + the value returned from the invoked command. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. + + .. versionchanged:: 3.0 + Added the ``catch_exceptions`` parameter. + + .. versionchanged:: 3.0 + The result object has the ``exc_info`` attribute with the + traceback if available. + """ + exc_info = None + with self.isolation(input=input, env=env, color=color) as outstreams: + return_value = None + exception: t.Optional[BaseException] = None + exit_code = 0 + + if isinstance(args, str): + args = shlex.split(args) + + try: + prog_name = extra.pop("prog_name") + except KeyError: + prog_name = self.get_default_prog_name(cli) + + try: + return_value = cli.main(args=args or (), prog_name=prog_name, **extra) + except SystemExit as e: + exc_info = sys.exc_info() + e_code = t.cast(t.Optional[t.Union[int, t.Any]], e.code) + + if e_code is None: + e_code = 0 + + if e_code != 0: + exception = e + + if not isinstance(e_code, int): + sys.stdout.write(str(e_code)) + sys.stdout.write("\n") + e_code = 1 + + exit_code = e_code + + except Exception as e: + if not catch_exceptions: + raise + exception = e + exit_code = 1 + exc_info = sys.exc_info() + finally: + sys.stdout.flush() + stdout = outstreams[0].getvalue() + if self.mix_stderr: + stderr = None + else: + stderr = outstreams[1].getvalue() # type: ignore + + return Result( + runner=self, + stdout_bytes=stdout, + stderr_bytes=stderr, + return_value=return_value, + exit_code=exit_code, + exception=exception, + exc_info=exc_info, # type: ignore + ) + + @contextlib.contextmanager + def isolated_filesystem( + self, temp_dir: t.Optional[t.Union[str, "os.PathLike[str]"]] = None + ) -> t.Iterator[str]: + """A context manager that creates a temporary directory and + changes the current working directory to it. This isolates tests + that affect the contents of the CWD to prevent them from + interfering with each other. + + :param temp_dir: Create the temporary directory under this + directory. If given, the created directory is not removed + when exiting. + + .. versionchanged:: 8.0 + Added the ``temp_dir`` parameter. + """ + cwd = os.getcwd() + dt = tempfile.mkdtemp(dir=temp_dir) + os.chdir(dt) + + try: + yield dt + finally: + os.chdir(cwd) + + if temp_dir is None: + try: + shutil.rmtree(dt) + except OSError: # noqa: B014 + pass diff --git a/server-temp/venv/lib/python3.10/site-packages/click/types.py b/server-temp/venv/lib/python3.10/site-packages/click/types.py new file mode 100644 index 00000000..2b1d1797 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/click/types.py @@ -0,0 +1,1089 @@ +import os +import stat +import sys +import typing as t +from datetime import datetime +from gettext import gettext as _ +from gettext import ngettext + +from ._compat import _get_argv_encoding +from ._compat import open_stream +from .exceptions import BadParameter +from .utils import format_filename +from .utils import LazyFile +from .utils import safecall + +if t.TYPE_CHECKING: + import typing_extensions as te + from .core import Context + from .core import Parameter + from .shell_completion import CompletionItem + + +class ParamType: + """Represents the type of a parameter. Validates and converts values + from the command line or Python into the correct type. + + To implement a custom type, subclass and implement at least the + following: + + - The :attr:`name` class attribute must be set. + - Calling an instance of the type with ``None`` must return + ``None``. This is already implemented by default. + - :meth:`convert` must convert string values to the correct type. + - :meth:`convert` must accept values that are already the correct + type. + - It must be able to convert a value if the ``ctx`` and ``param`` + arguments are ``None``. This can occur when converting prompt + input. + """ + + is_composite: t.ClassVar[bool] = False + arity: t.ClassVar[int] = 1 + + #: the descriptive name of this type + name: str + + #: 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: t.ClassVar[t.Optional[str]] = None + + def to_info_dict(self) -> t.Dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. + + Use :meth:`click.Context.to_info_dict` to traverse the entire + CLI structure. + + .. versionadded:: 8.0 + """ + # The class name without the "ParamType" suffix. + param_type = type(self).__name__.partition("ParamType")[0] + param_type = param_type.partition("ParameterType")[0] + + # Custom subclasses might not remember to set a name. + if hasattr(self, "name"): + name = self.name + else: + name = param_type + + return {"param_type": param_type, "name": name} + + def __call__( + self, + value: t.Any, + param: t.Optional["Parameter"] = None, + ctx: t.Optional["Context"] = None, + ) -> t.Any: + if value is not None: + return self.convert(value, param, ctx) + + def get_metavar(self, param: "Parameter") -> t.Optional[str]: + """Returns the metavar default for this param if it provides one.""" + + def get_missing_message(self, param: "Parameter") -> t.Optional[str]: + """Optionally might return extra information about a missing + parameter. + + .. versionadded:: 2.0 + """ + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + """Convert the value to the correct type. This is not called if + the value is ``None`` (the missing value). + + This must accept string values from the command line, as well as + values that are already the correct type. It may also convert + other compatible types. + + The ``param`` and ``ctx`` arguments may be ``None`` in certain + situations, such as when converting prompt input. + + If the value cannot be converted, call :meth:`fail` with a + descriptive message. + + :param value: The value to convert. + :param param: The parameter that is using this type to convert + its value. May be ``None``. + :param ctx: The current context that arrived at this value. May + be ``None``. + """ + return value + + def split_envvar_value(self, rv: str) -> t.Sequence[str]: + """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: str, + param: t.Optional["Parameter"] = None, + ctx: t.Optional["Context"] = None, + ) -> "t.NoReturn": + """Helper method to fail with an invalid value message.""" + raise BadParameter(message, ctx=ctx, param=param) + + def shell_complete( + self, ctx: "Context", param: "Parameter", incomplete: str + ) -> t.List["CompletionItem"]: + """Return a list of + :class:`~click.shell_completion.CompletionItem` objects for the + incomplete value. Most types do not provide completions, but + some do, and this allows custom types to provide custom + completions as well. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + return [] + + +class CompositeParamType(ParamType): + is_composite = True + + @property + def arity(self) -> int: # type: ignore + raise NotImplementedError() + + +class FuncParamType(ParamType): + def __init__(self, func: t.Callable[[t.Any], t.Any]) -> None: + self.name: str = func.__name__ + self.func = func + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["func"] = self.func + return info_dict + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + try: + return self.func(value) + except ValueError: + try: + value = str(value) + except UnicodeError: + value = value.decode("utf-8", "replace") + + self.fail(value, param, ctx) + + +class UnprocessedParamType(ParamType): + name = "text" + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + return value + + def __repr__(self) -> str: + return "UNPROCESSED" + + +class StringParamType(ParamType): + name = "text" + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + if isinstance(value, bytes): + enc = _get_argv_encoding() + try: + value = value.decode(enc) + except UnicodeError: + fs_enc = sys.getfilesystemencoding() + if fs_enc != enc: + try: + value = value.decode(fs_enc) + except UnicodeError: + value = value.decode("utf-8", "replace") + else: + value = value.decode("utf-8", "replace") + return value + return str(value) + + def __repr__(self) -> str: + return "STRING" + + +class Choice(ParamType): + """The choice type allows a value to be checked against a fixed set + of supported values. All of these values have to be strings. + + You should only pass a list or tuple of choices. Other iterables + (like generators) may lead to surprising results. + + The resulting value will always be one of the originally passed choices + regardless of ``case_sensitive`` or any ``ctx.token_normalize_func`` + being specified. + + See :ref:`choice-opts` for an example. + + :param case_sensitive: Set to false to make choices case + insensitive. Defaults to true. + """ + + name = "choice" + + def __init__(self, choices: t.Sequence[str], case_sensitive: bool = True) -> None: + self.choices = choices + self.case_sensitive = case_sensitive + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["choices"] = self.choices + info_dict["case_sensitive"] = self.case_sensitive + return info_dict + + def get_metavar(self, param: "Parameter") -> str: + choices_str = "|".join(self.choices) + + # Use curly braces to indicate a required argument. + if param.required and param.param_type_name == "argument": + return f"{{{choices_str}}}" + + # Use square braces to indicate an option or optional argument. + return f"[{choices_str}]" + + def get_missing_message(self, param: "Parameter") -> str: + return _("Choose from:\n\t{choices}").format(choices=",\n\t".join(self.choices)) + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + # Match through normalization and case sensitivity + # first do token_normalize_func, then lowercase + # preserve original `value` to produce an accurate message in + # `self.fail` + normed_value = value + normed_choices = {choice: choice for choice in self.choices} + + if ctx is not None and ctx.token_normalize_func is not None: + normed_value = ctx.token_normalize_func(value) + normed_choices = { + ctx.token_normalize_func(normed_choice): original + for normed_choice, original in normed_choices.items() + } + + if not self.case_sensitive: + normed_value = normed_value.casefold() + normed_choices = { + normed_choice.casefold(): original + for normed_choice, original in normed_choices.items() + } + + if normed_value in normed_choices: + return normed_choices[normed_value] + + choices_str = ", ".join(map(repr, self.choices)) + self.fail( + ngettext( + "{value!r} is not {choice}.", + "{value!r} is not one of {choices}.", + len(self.choices), + ).format(value=value, choice=choices_str, choices=choices_str), + param, + ctx, + ) + + def __repr__(self) -> str: + return f"Choice({list(self.choices)})" + + def shell_complete( + self, ctx: "Context", param: "Parameter", incomplete: str + ) -> t.List["CompletionItem"]: + """Complete choices that start with the incomplete value. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + str_choices = map(str, self.choices) + + if self.case_sensitive: + matched = (c for c in str_choices if c.startswith(incomplete)) + else: + incomplete = incomplete.lower() + matched = (c for c in str_choices if c.lower().startswith(incomplete)) + + return [CompletionItem(c) for c in matched] + + +class DateTime(ParamType): + """The DateTime type converts date strings into `datetime` objects. + + The format strings which are checked are configurable, but default to some + common (non-timezone aware) ISO 8601 formats. + + When specifying *DateTime* formats, you should only pass a list or a tuple. + Other iterables, like generators, may lead to surprising results. + + The format strings are processed using ``datetime.strptime``, and this + consequently defines the format strings which are allowed. + + Parsing is tried using each format, in order, and the first format which + parses successfully is used. + + :param formats: A list or tuple of date format strings, in the order in + which they should be tried. Defaults to + ``'%Y-%m-%d'``, ``'%Y-%m-%dT%H:%M:%S'``, + ``'%Y-%m-%d %H:%M:%S'``. + """ + + name = "datetime" + + def __init__(self, formats: t.Optional[t.Sequence[str]] = None): + self.formats: t.Sequence[str] = formats or [ + "%Y-%m-%d", + "%Y-%m-%dT%H:%M:%S", + "%Y-%m-%d %H:%M:%S", + ] + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["formats"] = self.formats + return info_dict + + def get_metavar(self, param: "Parameter") -> str: + return f"[{'|'.join(self.formats)}]" + + def _try_to_convert_date(self, value: t.Any, format: str) -> t.Optional[datetime]: + try: + return datetime.strptime(value, format) + except ValueError: + return None + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + if isinstance(value, datetime): + return value + + for format in self.formats: + converted = self._try_to_convert_date(value, format) + + if converted is not None: + return converted + + formats_str = ", ".join(map(repr, self.formats)) + self.fail( + ngettext( + "{value!r} does not match the format {format}.", + "{value!r} does not match the formats {formats}.", + len(self.formats), + ).format(value=value, format=formats_str, formats=formats_str), + param, + ctx, + ) + + def __repr__(self) -> str: + return "DateTime" + + +class _NumberParamTypeBase(ParamType): + _number_class: t.ClassVar[t.Type[t.Any]] + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + try: + return self._number_class(value) + except ValueError: + self.fail( + _("{value!r} is not a valid {number_type}.").format( + value=value, number_type=self.name + ), + param, + ctx, + ) + + +class _NumberRangeBase(_NumberParamTypeBase): + def __init__( + self, + min: t.Optional[float] = None, + max: t.Optional[float] = None, + min_open: bool = False, + max_open: bool = False, + clamp: bool = False, + ) -> None: + self.min = min + self.max = max + self.min_open = min_open + self.max_open = max_open + self.clamp = clamp + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update( + min=self.min, + max=self.max, + min_open=self.min_open, + max_open=self.max_open, + clamp=self.clamp, + ) + return info_dict + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + import operator + + rv = super().convert(value, param, ctx) + lt_min: bool = self.min is not None and ( + operator.le if self.min_open else operator.lt + )(rv, self.min) + gt_max: bool = self.max is not None and ( + operator.ge if self.max_open else operator.gt + )(rv, self.max) + + if self.clamp: + if lt_min: + return self._clamp(self.min, 1, self.min_open) # type: ignore + + if gt_max: + return self._clamp(self.max, -1, self.max_open) # type: ignore + + if lt_min or gt_max: + self.fail( + _("{value} is not in the range {range}.").format( + value=rv, range=self._describe_range() + ), + param, + ctx, + ) + + return rv + + def _clamp(self, bound: float, dir: "te.Literal[1, -1]", open: bool) -> float: + """Find the valid value to clamp to bound in the given + direction. + + :param bound: The boundary value. + :param dir: 1 or -1 indicating the direction to move. + :param open: If true, the range does not include the bound. + """ + raise NotImplementedError + + def _describe_range(self) -> str: + """Describe the range for use in help text.""" + if self.min is None: + op = "<" if self.max_open else "<=" + return f"x{op}{self.max}" + + if self.max is None: + op = ">" if self.min_open else ">=" + return f"x{op}{self.min}" + + lop = "<" if self.min_open else "<=" + rop = "<" if self.max_open else "<=" + return f"{self.min}{lop}x{rop}{self.max}" + + def __repr__(self) -> str: + clamp = " clamped" if self.clamp else "" + return f"<{type(self).__name__} {self._describe_range()}{clamp}>" + + +class IntParamType(_NumberParamTypeBase): + name = "integer" + _number_class = int + + def __repr__(self) -> str: + return "INT" + + +class IntRange(_NumberRangeBase, IntParamType): + """Restrict an :data:`click.INT` value to a range of accepted + values. See :ref:`ranges`. + + If ``min`` or ``max`` are not passed, any value is accepted in that + direction. If ``min_open`` or ``max_open`` are enabled, the + corresponding boundary is not included in the range. + + If ``clamp`` is enabled, a value outside the range is clamped to the + boundary instead of failing. + + .. versionchanged:: 8.0 + Added the ``min_open`` and ``max_open`` parameters. + """ + + name = "integer range" + + def _clamp( # type: ignore + self, bound: int, dir: "te.Literal[1, -1]", open: bool + ) -> int: + if not open: + return bound + + return bound + dir + + +class FloatParamType(_NumberParamTypeBase): + name = "float" + _number_class = float + + def __repr__(self) -> str: + return "FLOAT" + + +class FloatRange(_NumberRangeBase, FloatParamType): + """Restrict a :data:`click.FLOAT` value to a range of accepted + values. See :ref:`ranges`. + + If ``min`` or ``max`` are not passed, any value is accepted in that + direction. If ``min_open`` or ``max_open`` are enabled, the + corresponding boundary is not included in the range. + + If ``clamp`` is enabled, a value outside the range is clamped to the + boundary instead of failing. This is not supported if either + boundary is marked ``open``. + + .. versionchanged:: 8.0 + Added the ``min_open`` and ``max_open`` parameters. + """ + + name = "float range" + + def __init__( + self, + min: t.Optional[float] = None, + max: t.Optional[float] = None, + min_open: bool = False, + max_open: bool = False, + clamp: bool = False, + ) -> None: + super().__init__( + min=min, max=max, min_open=min_open, max_open=max_open, clamp=clamp + ) + + if (min_open or max_open) and clamp: + raise TypeError("Clamping is not supported for open bounds.") + + def _clamp(self, bound: float, dir: "te.Literal[1, -1]", open: bool) -> float: + if not open: + return bound + + # Could use Python 3.9's math.nextafter here, but clamping an + # open float range doesn't seem to be particularly useful. It's + # left up to the user to write a callback to do it if needed. + raise RuntimeError("Clamping is not supported for open bounds.") + + +class BoolParamType(ParamType): + name = "boolean" + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + if value in {False, True}: + return bool(value) + + norm = value.strip().lower() + + if norm in {"1", "true", "t", "yes", "y", "on"}: + return True + + if norm in {"0", "false", "f", "no", "n", "off"}: + return False + + self.fail( + _("{value!r} is not a valid boolean.").format(value=value), param, ctx + ) + + def __repr__(self) -> str: + return "BOOL" + + +class UUIDParameterType(ParamType): + name = "uuid" + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + import uuid + + if isinstance(value, uuid.UUID): + return value + + value = value.strip() + + try: + return uuid.UUID(value) + except ValueError: + self.fail( + _("{value!r} is not a valid UUID.").format(value=value), param, ctx + ) + + def __repr__(self) -> str: + return "UUID" + + +class File(ParamType): + """Declares a parameter to be a file for reading or writing. The file + is automatically closed once the context tears down (after the command + finished working). + + Files can be opened for reading or writing. The special value ``-`` + indicates stdin or stdout depending on the mode. + + By default, the file is opened for reading text data, but it can also be + opened in binary mode or for writing. The encoding parameter can be used + to force a specific encoding. + + The `lazy` flag controls if the file should be opened immediately or upon + first IO. The default is to be non-lazy for standard input and output + streams as well as files opened for reading, `lazy` otherwise. When opening a + file lazily for reading, it is still opened temporarily for validation, but + will not be held open until first IO. lazy is mainly useful when opening + for writing to avoid creating the file until it is needed. + + Starting with Click 2.0, files can also be opened atomically in which + case all writes go into a separate file in the same folder and upon + completion the file will be moved over to the original location. This + is useful if a file regularly read by other users is modified. + + See :ref:`file-args` for more information. + """ + + name = "filename" + envvar_list_splitter: t.ClassVar[str] = os.path.pathsep + + def __init__( + self, + mode: str = "r", + encoding: t.Optional[str] = None, + errors: t.Optional[str] = "strict", + lazy: t.Optional[bool] = None, + atomic: bool = False, + ) -> None: + self.mode = mode + self.encoding = encoding + self.errors = errors + self.lazy = lazy + self.atomic = atomic + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update(mode=self.mode, encoding=self.encoding) + return info_dict + + def resolve_lazy_flag(self, value: "t.Union[str, os.PathLike[str]]") -> bool: + if self.lazy is not None: + return self.lazy + if os.fspath(value) == "-": + return False + elif "w" in self.mode: + return True + return False + + def convert( + self, + value: t.Union[str, "os.PathLike[str]", t.IO[t.Any]], + param: t.Optional["Parameter"], + ctx: t.Optional["Context"], + ) -> t.IO[t.Any]: + if _is_file_like(value): + return value + + value = t.cast("t.Union[str, os.PathLike[str]]", value) + + try: + lazy = self.resolve_lazy_flag(value) + + if lazy: + lf = LazyFile( + value, self.mode, self.encoding, self.errors, atomic=self.atomic + ) + + if ctx is not None: + ctx.call_on_close(lf.close_intelligently) + + return t.cast(t.IO[t.Any], lf) + + 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 OSError as e: # noqa: B014 + self.fail(f"'{format_filename(value)}': {e.strerror}", param, ctx) + + def shell_complete( + self, ctx: "Context", param: "Parameter", incomplete: str + ) -> t.List["CompletionItem"]: + """Return a special completion marker that tells the completion + system to use the shell to provide file path completions. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + return [CompletionItem(incomplete, type="file")] + + +def _is_file_like(value: t.Any) -> "te.TypeGuard[t.IO[t.Any]]": + return hasattr(value, "read") or hasattr(value, "write") + + +class Path(ParamType): + """The ``Path`` type is similar to the :class:`File` type, but + returns the filename instead of an open file. Various checks can be + enabled to validate the type of file and permissions. + + :param exists: The file or directory needs to exist for the value to + be valid. If this is not set to ``True``, and the file does not + exist, then all further checks are silently skipped. + :param file_okay: Allow a file as a value. + :param dir_okay: Allow a directory as a value. + :param readable: if true, a readable check is performed. + :param writable: if true, a writable check is performed. + :param executable: if true, an executable check is performed. + :param resolve_path: Make the value absolute and resolve any + symlinks. A ``~`` is not expanded, as this is supposed to be + done by the shell only. + :param allow_dash: Allow a single dash as a value, which indicates + a standard stream (but does not open it). Use + :func:`~click.open_file` to handle opening this value. + :param path_type: Convert the incoming path value to this type. If + ``None``, keep Python's default, which is ``str``. Useful to + convert to :class:`pathlib.Path`. + + .. versionchanged:: 8.1 + Added the ``executable`` parameter. + + .. versionchanged:: 8.0 + Allow passing ``path_type=pathlib.Path``. + + .. versionchanged:: 6.0 + Added the ``allow_dash`` parameter. + """ + + envvar_list_splitter: t.ClassVar[str] = os.path.pathsep + + def __init__( + self, + exists: bool = False, + file_okay: bool = True, + dir_okay: bool = True, + writable: bool = False, + readable: bool = True, + resolve_path: bool = False, + allow_dash: bool = False, + path_type: t.Optional[t.Type[t.Any]] = None, + executable: bool = False, + ): + self.exists = exists + self.file_okay = file_okay + self.dir_okay = dir_okay + self.readable = readable + self.writable = writable + self.executable = executable + 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: str = _("file") + elif self.dir_okay and not self.file_okay: + self.name = _("directory") + else: + self.name = _("path") + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update( + exists=self.exists, + file_okay=self.file_okay, + dir_okay=self.dir_okay, + writable=self.writable, + readable=self.readable, + allow_dash=self.allow_dash, + ) + return info_dict + + def coerce_path_result( + self, value: "t.Union[str, os.PathLike[str]]" + ) -> "t.Union[str, bytes, os.PathLike[str]]": + if self.type is not None and not isinstance(value, self.type): + if self.type is str: + return os.fsdecode(value) + elif self.type is bytes: + return os.fsencode(value) + else: + return t.cast("os.PathLike[str]", self.type(value)) + + return value + + def convert( + self, + value: "t.Union[str, os.PathLike[str]]", + param: t.Optional["Parameter"], + ctx: t.Optional["Context"], + ) -> "t.Union[str, bytes, os.PathLike[str]]": + rv = value + + is_dash = self.file_okay and self.allow_dash and rv in (b"-", "-") + + if not is_dash: + if self.resolve_path: + # os.path.realpath doesn't resolve symlinks on Windows + # until Python 3.8. Use pathlib for now. + import pathlib + + rv = os.fsdecode(pathlib.Path(rv).resolve()) + + try: + st = os.stat(rv) + except OSError: + if not self.exists: + return self.coerce_path_result(rv) + self.fail( + _("{name} {filename!r} does not exist.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if not self.file_okay and stat.S_ISREG(st.st_mode): + self.fail( + _("{name} {filename!r} is a file.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + if not self.dir_okay and stat.S_ISDIR(st.st_mode): + self.fail( + _("{name} '{filename}' is a directory.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if self.readable and not os.access(rv, os.R_OK): + self.fail( + _("{name} {filename!r} is not readable.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if self.writable and not os.access(rv, os.W_OK): + self.fail( + _("{name} {filename!r} is not writable.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if self.executable and not os.access(value, os.X_OK): + self.fail( + _("{name} {filename!r} is not executable.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + return self.coerce_path_result(rv) + + def shell_complete( + self, ctx: "Context", param: "Parameter", incomplete: str + ) -> t.List["CompletionItem"]: + """Return a special completion marker that tells the completion + system to use the shell to provide path completions for only + directories or any paths. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + type = "dir" if self.dir_okay and not self.file_okay else "file" + return [CompletionItem(incomplete, type=type)] + + +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: t.Sequence[t.Union[t.Type[t.Any], ParamType]]) -> None: + self.types: t.Sequence[ParamType] = [convert_type(ty) for ty in types] + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["types"] = [t.to_info_dict() for t in self.types] + return info_dict + + @property + def name(self) -> str: # type: ignore + return f"<{' '.join(ty.name for ty in self.types)}>" + + @property + def arity(self) -> int: # type: ignore + return len(self.types) + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + len_type = len(self.types) + len_value = len(value) + + if len_value != len_type: + self.fail( + ngettext( + "{len_type} values are required, but {len_value} was given.", + "{len_type} values are required, but {len_value} were given.", + len_value, + ).format(len_type=len_type, len_value=len_value), + param=param, + ctx=ctx, + ) + + return tuple(ty(x, param, ctx) for ty, x in zip(self.types, value)) + + +def convert_type(ty: t.Optional[t.Any], default: t.Optional[t.Any] = None) -> ParamType: + """Find the most appropriate :class:`ParamType` for the given Python + type. If the type isn't provided, it can be inferred from a default + value. + """ + guessed_type = False + + if ty is None and default is not None: + if isinstance(default, (tuple, list)): + # If the default is empty, ty will remain None and will + # return STRING. + if default: + item = default[0] + + # A tuple of tuples needs to detect the inner types. + # Can't call convert recursively because that would + # incorrectly unwind the tuple to a single type. + if isinstance(item, (tuple, list)): + ty = tuple(map(type, item)) + else: + ty = type(item) + else: + ty = type(default) + + guessed_type = True + + if isinstance(ty, tuple): + return Tuple(ty) + + if isinstance(ty, ParamType): + return ty + + if ty is str or ty is None: + return STRING + + if ty is int: + return INT + + if ty is float: + return FLOAT + + if ty is bool: + return BOOL + + if guessed_type: + return STRING + + if __debug__: + try: + if issubclass(ty, ParamType): + raise AssertionError( + f"Attempted to use an uninstantiated parameter type ({ty})." + ) + except TypeError: + # ty is an instance (correct), so issubclass fails. + 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 if the input was bytes. +#: 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/server-temp/venv/lib/python3.10/site-packages/click/utils.py b/server-temp/venv/lib/python3.10/site-packages/click/utils.py new file mode 100644 index 00000000..d536434f --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/click/utils.py @@ -0,0 +1,624 @@ +import os +import re +import sys +import typing as t +from functools import update_wrapper +from types import ModuleType +from types import TracebackType + +from ._compat import _default_text_stderr +from ._compat import _default_text_stdout +from ._compat import _find_binary_writer +from ._compat import auto_wrap_for_ansi +from ._compat import binary_streams +from ._compat import open_stream +from ._compat import should_strip_ansi +from ._compat import strip_ansi +from ._compat import text_streams +from ._compat import WIN +from .globals import resolve_color_default + +if t.TYPE_CHECKING: + import typing_extensions as te + + P = te.ParamSpec("P") + +R = t.TypeVar("R") + + +def _posixify(name: str) -> str: + return "-".join(name.split()).lower() + + +def safecall(func: "t.Callable[P, R]") -> "t.Callable[P, t.Optional[R]]": + """Wraps a function so that it swallows exceptions.""" + + def wrapper(*args: "P.args", **kwargs: "P.kwargs") -> t.Optional[R]: + try: + return func(*args, **kwargs) + except Exception: + pass + return None + + return update_wrapper(wrapper, func) + + +def make_str(value: t.Any) -> str: + """Converts a value into a valid string.""" + if isinstance(value, bytes): + try: + return value.decode(sys.getfilesystemencoding()) + except UnicodeError: + return value.decode("utf-8", "replace") + return str(value) + + +def make_default_short_help(help: str, max_length: int = 45) -> str: + """Returns a condensed version of help string.""" + # Consider only the first paragraph. + paragraph_end = help.find("\n\n") + + if paragraph_end != -1: + help = help[:paragraph_end] + + # Collapse newlines, tabs, and spaces. + words = help.split() + + if not words: + return "" + + # The first paragraph started with a "no rewrap" marker, ignore it. + if words[0] == "\b": + words = words[1:] + + total_length = 0 + last_index = len(words) - 1 + + for i, word in enumerate(words): + total_length += len(word) + (i > 0) + + if total_length > max_length: # too long, truncate + break + + if word[-1] == ".": # sentence end, truncate without "..." + return " ".join(words[: i + 1]) + + if total_length == max_length and i != last_index: + break # not at sentence end, truncate with "..." + else: + return " ".join(words) # no truncation needed + + # Account for the length of the suffix. + total_length += len("...") + + # remove words until the length is short enough + while i > 0: + total_length -= len(words[i]) + (i > 0) + + if total_length <= max_length: + break + + i -= 1 + + return " ".join(words[:i]) + "..." + + +class LazyFile: + """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: t.Union[str, "os.PathLike[str]"], + mode: str = "r", + encoding: t.Optional[str] = None, + errors: t.Optional[str] = "strict", + atomic: bool = False, + ): + self.name: str = os.fspath(filename) + self.mode = mode + self.encoding = encoding + self.errors = errors + self.atomic = atomic + self._f: t.Optional[t.IO[t.Any]] + self.should_close: bool + + if self.name == "-": + 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: str) -> t.Any: + return getattr(self.open(), name) + + def __repr__(self) -> str: + if self._f is not None: + return repr(self._f) + return f"" + + def open(self) -> t.IO[t.Any]: + """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 OSError as e: # noqa: E402 + from .exceptions import FileError + + raise FileError(self.name, hint=e.strerror) from e + self._f = rv + return rv + + def close(self) -> None: + """Closes the underlying file, no matter what.""" + if self._f is not None: + self._f.close() + + def close_intelligently(self) -> None: + """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) -> "LazyFile": + return self + + def __exit__( + self, + exc_type: t.Optional[t.Type[BaseException]], + exc_value: t.Optional[BaseException], + tb: t.Optional[TracebackType], + ) -> None: + self.close_intelligently() + + def __iter__(self) -> t.Iterator[t.AnyStr]: + self.open() + return iter(self._f) # type: ignore + + +class KeepOpenFile: + def __init__(self, file: t.IO[t.Any]) -> None: + self._file: t.IO[t.Any] = file + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._file, name) + + def __enter__(self) -> "KeepOpenFile": + return self + + def __exit__( + self, + exc_type: t.Optional[t.Type[BaseException]], + exc_value: t.Optional[BaseException], + tb: t.Optional[TracebackType], + ) -> None: + pass + + def __repr__(self) -> str: + return repr(self._file) + + def __iter__(self) -> t.Iterator[t.AnyStr]: + return iter(self._file) + + +def echo( + message: t.Optional[t.Any] = None, + file: t.Optional[t.IO[t.Any]] = None, + nl: bool = True, + err: bool = False, + color: t.Optional[bool] = None, +) -> None: + """Print a message and newline to stdout or a file. This should be + used instead of :func:`print` because it provides better support + for different data, files, and environments. + + Compared to :func:`print`, this does the following: + + - Ensures that the output encoding is not misconfigured on Linux. + - Supports Unicode in the Windows console. + - Supports writing to binary outputs, and supports writing bytes + to text outputs. + - Supports colors and styles on Windows. + - Removes ANSI color and style codes if the output does not look + like an interactive terminal. + - Always flushes the output. + + :param message: The string or bytes to output. Other objects are + converted to strings. + :param file: The file to write to. Defaults to ``stdout``. + :param err: Write to ``stderr`` instead of ``stdout``. + :param nl: Print a newline after the message. Enabled by default. + :param color: Force showing or hiding colors and other styles. By + default Click will remove color if the output does not look like + an interactive terminal. + + .. versionchanged:: 6.0 + Support Unicode output on the Windows console. Click does not + modify ``sys.stdout``, so ``sys.stdout.write()`` and ``print()`` + will still not support Unicode. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. + + .. versionadded:: 3.0 + Added the ``err`` parameter. + + .. versionchanged:: 2.0 + Support colors on Windows if colorama is installed. + """ + if file is None: + if err: + file = _default_text_stderr() + else: + file = _default_text_stdout() + + # There are no standard streams attached to write to. For example, + # pythonw on Windows. + if file is None: + return + + # Convert non bytes/text into the native string type. + if message is not None and not isinstance(message, (str, bytes, bytearray)): + out: t.Optional[t.Union[str, bytes]] = str(message) + else: + out = message + + if nl: + out = out or "" + if isinstance(out, str): + out += "\n" + else: + out += b"\n" + + if not out: + file.flush() + return + + # If there is a message 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 isinstance(out, (bytes, bytearray)): + binary_file = _find_binary_writer(file) + + if binary_file is not None: + file.flush() + binary_file.write(out) + binary_file.flush() + return + + # ANSI style code support. For no message or bytes, nothing happens. + # When outputting to a file instead of a terminal, strip codes. + else: + color = resolve_color_default(color) + + if should_strip_ansi(file, color): + out = strip_ansi(out) + elif WIN: + if auto_wrap_for_ansi is not None: + file = auto_wrap_for_ansi(file) # type: ignore + elif not color: + out = strip_ansi(out) + + file.write(out) # type: ignore + file.flush() + + +def get_binary_stream(name: "te.Literal['stdin', 'stdout', 'stderr']") -> t.BinaryIO: + """Returns a system stream for byte processing. + + :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(f"Unknown standard stream '{name}'") + return opener() + + +def get_text_stream( + name: "te.Literal['stdin', 'stdout', 'stderr']", + encoding: t.Optional[str] = None, + errors: t.Optional[str] = "strict", +) -> t.TextIO: + """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 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(f"Unknown standard stream '{name}'") + return opener(encoding, errors) + + +def open_file( + filename: str, + mode: str = "r", + encoding: t.Optional[str] = None, + errors: t.Optional[str] = "strict", + lazy: bool = False, + atomic: bool = False, +) -> t.IO[t.Any]: + """Open a file, with extra behavior to handle ``'-'`` to indicate + a standard stream, lazy open on write, and atomic write. Similar to + the behavior of the :class:`~click.File` param type. + + If ``'-'`` is given to open ``stdout`` or ``stdin``, the stream is + wrapped so that using it in a context manager will not close it. + This makes it possible to use the function without accidentally + closing a standard stream: + + .. code-block:: python + + with open_file(filename) as f: + ... + + :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 decode or encode a file opened in + text mode. + :param errors: The error handling mode. + :param lazy: Wait to open the file until it is accessed. For read + mode, the file is temporarily opened to raise access errors + early, then closed until it is read again. + :param atomic: Write to a temporary file and replace the given file + on close. + + .. versionadded:: 3.0 + """ + if lazy: + return t.cast( + t.IO[t.Any], LazyFile(filename, mode, encoding, errors, atomic=atomic) + ) + + f, should_close = open_stream(filename, mode, encoding, errors, atomic=atomic) + + if not should_close: + f = t.cast(t.IO[t.Any], KeepOpenFile(f)) + + return f + + +def format_filename( + filename: "t.Union[str, bytes, os.PathLike[str], os.PathLike[bytes]]", + shorten: bool = False, +) -> str: + """Format a filename as a string for display. Ensures the filename can be + displayed by replacing any invalid bytes or surrogate escapes in the name + with the replacement character ``�``. + + Invalid bytes or surrogate escapes will raise an error when written to a + stream with ``errors="strict". This will typically happen with ``stdout`` + when the locale is something like ``en_GB.UTF-8``. + + Many scenarios *are* safe to write surrogates though, due to PEP 538 and + PEP 540, including: + + - Writing to ``stderr``, which uses ``errors="backslashreplace"``. + - The system has ``LANG=C.UTF-8``, ``C``, or ``POSIX``. Python opens + stdout and stderr with ``errors="surrogateescape"``. + - None of ``LANG/LC_*`` are set. Python assumes ``LANG=C.UTF-8``. + - Python is started in UTF-8 mode with ``PYTHONUTF8=1`` or ``-X utf8``. + Python opens stdout and stderr with ``errors="surrogateescape"``. + + :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) + else: + filename = os.fspath(filename) + + if isinstance(filename, bytes): + filename = filename.decode(sys.getfilesystemencoding(), "replace") + else: + filename = filename.encode("utf-8", "surrogateescape").decode( + "utf-8", "replace" + ) + + return filename + + +def get_app_dir(app_name: str, roaming: bool = True, force_posix: bool = False) -> str: + 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`` + Windows (roaming): + ``C:\Users\\AppData\Roaming\Foo Bar`` + Windows (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 effect 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 = "APPDATA" if roaming else "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(f"~/.{_posixify(app_name)}")) + if sys.platform == "darwin": + return os.path.join( + os.path.expanduser("~/Library/Application Support"), app_name + ) + return os.path.join( + os.environ.get("XDG_CONFIG_HOME", os.path.expanduser("~/.config")), + _posixify(app_name), + ) + + +class PacifyFlushWrapper: + """This wrapper is used to catch and suppress BrokenPipeErrors resulting + from ``.flush()`` being called on broken pipe during the shutdown/final-GC + of the Python interpreter. Notably ``.flush()`` is always called on + ``sys.stdout`` and ``sys.stderr``. So as to have minimal impact on any + other cleanup code, and the case where the underlying file is not a broken + pipe, all calls and attributes are proxied. + """ + + def __init__(self, wrapped: t.IO[t.Any]) -> None: + self.wrapped = wrapped + + def flush(self) -> None: + try: + self.wrapped.flush() + except OSError as e: + import errno + + if e.errno != errno.EPIPE: + raise + + def __getattr__(self, attr: str) -> t.Any: + return getattr(self.wrapped, attr) + + +def _detect_program_name( + path: t.Optional[str] = None, _main: t.Optional[ModuleType] = None +) -> str: + """Determine the command used to run the program, for use in help + text. If a file or entry point was executed, the file name is + returned. If ``python -m`` was used to execute a module or package, + ``python -m name`` is returned. + + This doesn't try to be too precise, the goal is to give a concise + name for help text. Files are only shown as their name without the + path. ``python`` is only shown for modules, and the full path to + ``sys.executable`` is not shown. + + :param path: The Python file being executed. Python puts this in + ``sys.argv[0]``, which is used by default. + :param _main: The ``__main__`` module. This should only be passed + during internal testing. + + .. versionadded:: 8.0 + Based on command args detection in the Werkzeug reloader. + + :meta private: + """ + if _main is None: + _main = sys.modules["__main__"] + + if not path: + path = sys.argv[0] + + # The value of __package__ indicates how Python was called. It may + # not exist if a setuptools script is installed as an egg. It may be + # set incorrectly for entry points created with pip on Windows. + # It is set to "" inside a Shiv or PEX zipapp. + if getattr(_main, "__package__", None) in {None, ""} or ( + os.name == "nt" + and _main.__package__ == "" + and not os.path.exists(path) + and os.path.exists(f"{path}.exe") + ): + # Executed a file, like "python app.py". + return os.path.basename(path) + + # Executed a module, like "python -m example". + # Rewritten by Python from "-m script" to "/path/to/script.py". + # Need to look at main module to determine how it was executed. + py_module = t.cast(str, _main.__package__) + name = os.path.splitext(os.path.basename(path))[0] + + # A submodule like "example.cli". + if name != "__main__": + py_module = f"{py_module}.{name}" + + return f"python -m {py_module.lstrip('.')}" + + +def _expand_args( + args: t.Iterable[str], + *, + user: bool = True, + env: bool = True, + glob_recursive: bool = True, +) -> t.List[str]: + """Simulate Unix shell expansion with Python functions. + + See :func:`glob.glob`, :func:`os.path.expanduser`, and + :func:`os.path.expandvars`. + + This is intended for use on Windows, where the shell does not do any + expansion. It may not exactly match what a Unix shell would do. + + :param args: List of command line arguments to expand. + :param user: Expand user home directory. + :param env: Expand environment variables. + :param glob_recursive: ``**`` matches directories recursively. + + .. versionchanged:: 8.1 + Invalid glob patterns are treated as empty expansions rather + than raising an error. + + .. versionadded:: 8.0 + + :meta private: + """ + from glob import glob + + out = [] + + for arg in args: + if user: + arg = os.path.expanduser(arg) + + if env: + arg = os.path.expandvars(arg) + + try: + matches = glob(arg, recursive=glob_recursive) + except re.error: + matches = [] + + if not matches: + out.append(arg) + else: + out.extend(matches) + + return out diff --git a/server-temp/venv/lib/python3.10/site-packages/distutils-precedence.pth b/server-temp/venv/lib/python3.10/site-packages/distutils-precedence.pth new file mode 100644 index 00000000..7f009fe9 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/distutils-precedence.pth @@ -0,0 +1 @@ +import os; var = 'SETUPTOOLS_USE_DISTUTILS'; enabled = os.environ.get(var, 'local') == 'local'; enabled and __import__('_distutils_hack').add_shim(); diff --git a/server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/INSTALLER b/server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/LICENSE.rst b/server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/LICENSE.rst new file mode 100644 index 00000000..9d227a0c --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2010 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/server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/METADATA b/server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/METADATA new file mode 100644 index 00000000..71551b9b --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/METADATA @@ -0,0 +1,116 @@ +Metadata-Version: 2.1 +Name: Flask +Version: 3.0.2 +Summary: A simple framework for building complex web applications. +Maintainer-email: Pallets +Requires-Python: >=3.8 +Description-Content-Type: text/x-rst +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: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Requires-Dist: Werkzeug>=3.0.0 +Requires-Dist: Jinja2>=3.1.2 +Requires-Dist: itsdangerous>=2.1.2 +Requires-Dist: click>=8.1.3 +Requires-Dist: blinker>=1.6.2 +Requires-Dist: importlib-metadata>=3.6.0; python_version < '3.10' +Requires-Dist: asgiref>=3.2 ; extra == "async" +Requires-Dist: python-dotenv ; extra == "dotenv" +Project-URL: Changes, https://flask.palletsprojects.com/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://flask.palletsprojects.com/ +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Issue Tracker, https://github.com/pallets/flask/issues/ +Project-URL: Source Code, https://github.com/pallets/flask/ +Provides-Extra: async +Provides-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. + +.. _WSGI: https://wsgi.readthedocs.io/ +.. _Werkzeug: https://werkzeug.palletsprojects.com/ +.. _Jinja: https://jinja.palletsprojects.com/ + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U Flask + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +A Simple Example +---------------- + +.. code-block:: python + + # save this as app.py + from flask import Flask + + app = Flask(__name__) + + @app.route("/") + def hello(): + return "Hello, World!" + +.. code-block:: text + + $ flask run + * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) + + +Contributing +------------ + +For guidance on setting up a development environment and how to make a +contribution to Flask, see the `contributing guidelines`_. + +.. _contributing guidelines: https://github.com/pallets/flask/blob/main/CONTRIBUTING.rst + + +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://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://flask.palletsprojects.com/ +- Changes: https://flask.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/Flask/ +- Source Code: https://github.com/pallets/flask/ +- Issue Tracker: https://github.com/pallets/flask/issues/ +- Chat: https://discord.gg/pallets + diff --git a/server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/RECORD b/server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/RECORD new file mode 100644 index 00000000..3b6f1b5d --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/RECORD @@ -0,0 +1,58 @@ +../../../bin/flask,sha256=x8O76Fx42i74wQ91IaMyh_9varHBp1Vq6YBgAwlJVnc,273 +flask-3.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +flask-3.0.2.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +flask-3.0.2.dist-info/METADATA,sha256=5SsBudAoun3E_3ZSRXJLB2V3NAdALovsQMKUvzqcJfM,3588 +flask-3.0.2.dist-info/RECORD,, +flask-3.0.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +flask-3.0.2.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +flask-3.0.2.dist-info/entry_points.txt,sha256=bBP7hTOS5fz9zLtC7sPofBZAlMkEvBxu7KqS6l5lvc4,40 +flask/__init__.py,sha256=6xMqdVA0FIQ2U1KVaGX3lzNCdXPzoHPaa0hvQCNcfSk,2625 +flask/__main__.py,sha256=bYt9eEaoRQWdejEHFD8REx9jxVEdZptECFsV7F49Ink,30 +flask/__pycache__/__init__.cpython-310.pyc,, +flask/__pycache__/__main__.cpython-310.pyc,, +flask/__pycache__/app.cpython-310.pyc,, +flask/__pycache__/blueprints.cpython-310.pyc,, +flask/__pycache__/cli.cpython-310.pyc,, +flask/__pycache__/config.cpython-310.pyc,, +flask/__pycache__/ctx.cpython-310.pyc,, +flask/__pycache__/debughelpers.cpython-310.pyc,, +flask/__pycache__/globals.cpython-310.pyc,, +flask/__pycache__/helpers.cpython-310.pyc,, +flask/__pycache__/logging.cpython-310.pyc,, +flask/__pycache__/sessions.cpython-310.pyc,, +flask/__pycache__/signals.cpython-310.pyc,, +flask/__pycache__/templating.cpython-310.pyc,, +flask/__pycache__/testing.cpython-310.pyc,, +flask/__pycache__/typing.cpython-310.pyc,, +flask/__pycache__/views.cpython-310.pyc,, +flask/__pycache__/wrappers.cpython-310.pyc,, +flask/app.py,sha256=TQfhvSlv1QpaPHeeRz_Ke7JmiSFMMHT-rJR4tqsEHdc,59706 +flask/blueprints.py,sha256=H7u4HzNn--riGMTt5GkxUHpYRzCav-WDGSKNnBSEMcU,3160 +flask/cli.py,sha256=eegT_64cSOqaKOwI_Am3XwaCSJPZ9UEJ6EmSL0qg8xg,35833 +flask/config.py,sha256=QiL9KkQT8RWc0HU2AE26Yw5mdOkNsKv8TEFEbXkqhJk,13328 +flask/ctx.py,sha256=4atDhJJ_cpV1VMq4qsfU4E_61M1oN93jlS2H9gjrl58,15120 +flask/debughelpers.py,sha256=PGIDhStW_efRjpaa3zHIpo-htStJOR41Ip3OJWPYBwo,6080 +flask/globals.py,sha256=XdQZmStBmPIs8t93tjx6pO7Bm3gobAaONWkFcUHaGas,1713 +flask/helpers.py,sha256=tYrcQ_73GuSZVEgwFr-eMmV69UriFQDBmt8wZJIAqvg,23084 +flask/json/__init__.py,sha256=hLNR898paqoefdeAhraa5wyJy-bmRB2k2dV4EgVy2Z8,5602 +flask/json/__pycache__/__init__.cpython-310.pyc,, +flask/json/__pycache__/provider.cpython-310.pyc,, +flask/json/__pycache__/tag.cpython-310.pyc,, +flask/json/provider.py,sha256=q6iB83lSiopy80DZPrU-9mGcWwrD0mvLjiv9fHrRZgc,7646 +flask/json/tag.py,sha256=aXslvQyO4QpxviWJqxhyOj0CCQKlYXq1r0H9DKqiEY8,9280 +flask/logging.py,sha256=8sM3WMTubi1cBb2c_lPkWpN0J8dMAqrgKRYLLi1dCVI,2377 +flask/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +flask/sansio/README.md,sha256=-0X1tECnilmz1cogx-YhNw5d7guK7GKrq_DEV2OzlU0,228 +flask/sansio/__pycache__/app.cpython-310.pyc,, +flask/sansio/__pycache__/blueprints.cpython-310.pyc,, +flask/sansio/__pycache__/scaffold.cpython-310.pyc,, +flask/sansio/app.py,sha256=ZF0Yy610NKSpdJ1d6qtG4L2RkCmzngu0G9FFXZf4O_M,38209 +flask/sansio/blueprints.py,sha256=Tqe-7EkZ-tbWchm8iDoCfD848f0_3nLv6NNjeIPvHwM,24637 +flask/sansio/scaffold.py,sha256=9SSSC6A_zzXhcEVYf9wkrKx2r4uDqfIWsnRNYSvDclU,30879 +flask/sessions.py,sha256=bIpZRwiTfnYJn3ikVnCPcF2kNtyRz0dfpsuMADIpSJc,14518 +flask/signals.py,sha256=V7lMUww7CqgJ2ThUBn1PiatZtQanOyt7OZpu2GZI-34,750 +flask/templating.py,sha256=2TcXLT85Asflm2W9WOSFxKCmYn5e49w_Jkg9-NaaJWo,7537 +flask/testing.py,sha256=3BFXb3bP7R5r-XLBuobhczbxDu8-1LWRzYuhbr-lwaE,10163 +flask/typing.py,sha256=ZavK-wV28Yv8CQB7u73qZp_jLalpbWdrXS37QR1ftN0,3190 +flask/views.py,sha256=B66bTvYBBcHMYk4dA1ScZD0oTRTBl0I5smp1lRm9riI,6939 +flask/wrappers.py,sha256=m1j5tIJxIu8_sPPgTAB_G4TTh52Q-HoDuw_qHV5J59g,5831 diff --git a/server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/REQUESTED b/server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/REQUESTED new file mode 100644 index 00000000..e69de29b diff --git a/server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/WHEEL b/server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/WHEEL new file mode 100644 index 00000000..3b5e64b5 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.9.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/entry_points.txt b/server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/entry_points.txt new file mode 100644 index 00000000..eec6733e --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/flask-3.0.2.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +flask=flask.cli:main + diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/__init__.py b/server-temp/venv/lib/python3.10/site-packages/flask/__init__.py new file mode 100644 index 00000000..e86eb43e --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/flask/__init__.py @@ -0,0 +1,60 @@ +from __future__ import annotations + +import typing as t + +from . import json as json +from .app import Flask as Flask +from .blueprints import Blueprint as Blueprint +from .config import Config as Config +from .ctx import after_this_request as after_this_request +from .ctx import copy_current_request_context as copy_current_request_context +from .ctx import has_app_context as has_app_context +from .ctx import has_request_context as has_request_context +from .globals import current_app as current_app +from .globals import g as g +from .globals import request as request +from .globals import session as session +from .helpers import abort as abort +from .helpers import flash as flash +from .helpers import get_flashed_messages as get_flashed_messages +from .helpers import get_template_attribute as get_template_attribute +from .helpers import make_response as make_response +from .helpers import redirect as redirect +from .helpers import send_file as send_file +from .helpers import send_from_directory as send_from_directory +from .helpers import stream_with_context as stream_with_context +from .helpers import url_for as url_for +from .json import jsonify as jsonify +from .signals import appcontext_popped as appcontext_popped +from .signals import appcontext_pushed as appcontext_pushed +from .signals import appcontext_tearing_down as appcontext_tearing_down +from .signals import before_render_template as before_render_template +from .signals import got_request_exception as got_request_exception +from .signals import message_flashed as message_flashed +from .signals import request_finished as request_finished +from .signals import request_started as request_started +from .signals import request_tearing_down as request_tearing_down +from .signals import template_rendered as template_rendered +from .templating import render_template as render_template +from .templating import render_template_string as render_template_string +from .templating import stream_template as stream_template +from .templating import stream_template_string as stream_template_string +from .wrappers import Request as Request +from .wrappers import Response as Response + + +def __getattr__(name: str) -> t.Any: + if name == "__version__": + import importlib.metadata + import warnings + + warnings.warn( + "The '__version__' attribute is deprecated and will be removed in" + " Flask 3.1. Use feature detection or" + " 'importlib.metadata.version(\"flask\")' instead.", + DeprecationWarning, + stacklevel=2, + ) + return importlib.metadata.version("flask") + + raise AttributeError(name) diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/__main__.py b/server-temp/venv/lib/python3.10/site-packages/flask/__main__.py new file mode 100644 index 00000000..4e28416e --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/flask/__main__.py @@ -0,0 +1,3 @@ +from .cli import main + +main() diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/__init__.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dbc998cf8a4c6b8cb993cc7a55c7c00874dcc4ab GIT binary patch literal 2324 zcmb`INpssa7=}q|p}flb?wDR>If-b;Ne^wN)2zo#C(CpO7Y;2#7Hx1T0NHWJxwO6Z z)IZQpPyI{0_LM)+Lwf1^AyT4oucgK>AG`pueE0xo6BDBroHltOBnTRYWy$nQOQzYRL#2G3<)bWQ>g&u8Hwv zf=w760Z+0?!=vCjs~a8zPq8V(<6=6QVKas&z_V=D@FaMS%^9wP=h?jBDY1|&vPHww z;3c+Xcm}-8mJQE>SJ;Z-Iq)i5H9QYqV{3*N!0T+?@FMsYyJdI@yumgMFM~bi8D0^U zWRq)lWVVV)0Jvt;#q7_!F( zouD;7v}sKD^FXfRN@3z~E8$5dsq;z)Q|6i=g|6AP-C{aBD$5`1is$tz=P$-^YLjCFTt z6>d+8pp!|oa4E2HhZ;{~P5qbzd6wrqx@q=Q*O-e#Ej16Z3#UPpUDC1_PB=QINv9EQ zM1NVRnLo`w$DY4!^PILA74?2B2C;!PHHdsCPUHTd^?|2!D7Bf#+`zgqiRrjO(H|Pk~!VT+lWB28!Osl=@Z&p!G!-N+ld{k5=*FBkjsOZ+C z^r}rMJ$UHmtKjbm-F^=N*SP)89k~)YktM8mwt3s{oNMRIiAoyxU{v{~WLwwvS^2k0 zRQ=t4W$Eg*^^^Uh-E?0RV?l7iCFNicNE+#fUtf2**BG)J-lrV%V&z3RM!b#Gi@Y$6 zyvtY!?}U4jC)owOIQ7h#^Nw3bE$@xuUWbQR4#$TYnTV0ROnQwt$&v3OK4~Rfhf%1* zR(~S(=#cN?ko z`Q04Lq~q?JQ20TByw*X`%CBh0Z~@Skpp0p#IY`Z>U)gbNr{vhxf5zRKBPli z3Z=GwD{CM*LPGz$MY2t@17V~6V~XXk literal 0 HcmV?d00001 diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/__main__.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/__main__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95ee5a602e771d2ea5e98a4bec42770b147b909b GIT binary patch literal 249 zcmYjLyJ`YK6uq-b5Q(i_(r=+xN$f;I5-mjtHa5$+Gse+*EOW;N>wHS8{L;2o`Gr)O zvGTw@4=x9e>-D-2@%?bOdyINX;TBm8FY%}!Nq}G)4BIdUl6?UKk$phk`epH%v!-ph zvdcVcTBTM#Re!*@qg?4P;F_c-ByRBCl_w)@pd0tP#`)W1^o$E-xn6m9Sa@f{+zO1n zT6(Odtx>BjR_CyH_GvgCA*mn-6)%tcQxfhpry~|cT2d6l>fCgu#)*@bvow;@ntSMG E|GU3GX#fBK literal 0 HcmV?d00001 diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/app.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/app.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a1b46abfc74579649274a32e06a9702e7a10f37 GIT binary patch literal 49919 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 literal 0 HcmV?d00001 diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/blueprints.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/blueprints.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a10a9384a591e0b7621a044e52924fd465b40d04 GIT binary patch literal 3460 zcmcInTW=f372aK5w4x|ma%`nZn`R)OwFx*&#fcwE6hUQKa*d|4VcA8>AXpA}hT_V5 z^USPd2}&L+zxF2-u+gXfrG4#F{(@iH?<~nB<+^Xl+8&;{oilUJcfK=DS65pWzJGqw z9DUQatbbEy@vEcr2g|bc4-kYU?8u7kzHO82L{8r+e{20Zerr)9ZuXm)tBXdo6uW)5 zl$+6V-0HVVc_~_n+x^v2b|GKsU$HG&Kf0>!V%KuC7O(f$ZR>$0T4LpuC069>MXlc! z&Vkiw|41k6*u@G@lGJb$ritE1f7yhw6f!dWM|-*=$d!_b@p+bE!3SC?^Rb#X&n6>F~={f1b_MK;tDwiNCtjAX)N`L?BvV&`l>O=QtjFt3ugEgWk) z7B~xbYmn*R4n<`Pg0YTlVSi+O@0>fr$t|@)-ZJQ!+J&PwO#R$>-FRbN*ay}*`LV_m zD14@+V8c_^8|6vR8%#We0}Yr-nUF@RI7}onW61`Cn7{P-p&SfYz=N@DvFUfr;XyV^ z731tMJeCQgJF$$LF$+g5H0*@y@P!KW~5IZ$H@e@9*wyKl}RWfKePPJ#@YxO-A8iu1Z9(bTrfP!zkkVxwn9Y zfybVbv8ic2SCitFr(+rZawhUD3Ijlq6w+Na@WNtg z#;IUoQV#9WEvuUZ=;;N8p2v=*(l~A~=EXLVyi9^i%0&~^X zKEK1pX|CRHhYL|!+46o@S?PcDe*?PTX{rWrTr?+fELx!^Q#=Wzs?kIZsZgvMq1e8eo}4IwOXxp*Qwhrr)}4rvrj9w@!q?usDTpHGPeCs@{_N2X32kU z9a(zGfB-J+zuD*3YvCAyV741pH~wcv*e2qm;j z)7-GjI&&5I#2f>nj>}V1bFfk=($XxT{AWy?Ih^m#>Feyy%}buR$>LlaHbjC-Gxy_c z4e+2nRFkDCC^~L`eay8#n=idtw4dY&QO2%PsZtw=vudI#Y*W+&4nTZ}UVrt{rcO;= zqlJ_Q>KD{d4osRGkczbuk+VHG2$ic6kj=Jhx9X0)W;g$H_VFB$?`|j@H7r~uH8MVs zMLkZ1e0#-s4v$qO@k5UL1V zvNKK8c{IFgda9W4(qm;_h4bd@UZ<VS7e|=&HOs0L~K<)jMpG&7maJR?A9;WCeP*0HPSrF@i>NN z1){LjZ_pG?bDAOH)yLFv@p_cRp_7-x(qWVid88)~jHR)RGQ12*R_(8Ap5R&J&5L+x zy?^zf9IxD`=qSbN)4x96^>_ZbyYr`q`w#l=i9$+}E^^cRu2Q(apSa;G`ag*#Hg8+5 RK?Z1)x%;^9C literal 0 HcmV?d00001 diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/cli.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/cli.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e838d109d513a9d586f00cebc34a884df4df7439 GIT binary patch literal 29123 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ⅅ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 L)#`uI{@Z^6AYy0X=`lLibRd=_6ps_t|D1v zcNcxCniOfunM4NSU@_SQNPq=)7Lc<0WxnNi>`$n#3oI}|J}!0_Oc3q!yyu+iYLb>c zNPvVAo7HuB&+WZD@8wi<^5kRzKmYB;%IaLRQ23wxlK&aQm-h+BC%8&hb{YyA{%}@M+f5pFw>#t8N_}l)D|8xICe4Fv_`XBpCxMy~vIB^ZXXYj8G zio5=v|Aqe_a8J$u%5VD~?s>!C_dC9iqc?*|^d$I|h{1%KL4YWGjEfst@2x4A8(HSTe^ph5-;OltqiaBg`lDoVT2XTyE z;qX)shu&JyTJ3uAdf=xO6(j@IPs=M&)a`I2_J@s@@OzcK=;9zLY&Z{!zVpzzS4c|x zg=l)e@Sywjx`?HMbY}fg7(!gRbwc1a8pxR=R=j zu13nmT`u}Q=Z1Yh>|jQ4$1cxKy7*}X{q1c}HQI|GUB2~U>)OJV+wZsW{C23Keh=ez zaWy2hy1NWYez58dx``XcZo9qcb>pDjt_!8+i5!Vb98+5CN2zl@9b4snwXw7q#p$@A zotD;uL_Nvd#=6mtEKq6N>;9&op2x|9_}uL{Q1Q9g>z%t6bq4H9oIAR5``p6SpPYZ^ z++x`Gx;Ip`v4|cg3w{3_p4$%8xoxy`t{bkL+uBXmqyF3Vx6Yr7!z7sB@;aMXo%kG= zXY<^8&;@_Q^{w4>8hvWXjB@GLUO-3UGCrotXB_n-94x2fW(GQ3Ir~$@!FR2qv+u-{ z`-NMDedj?*))B{8#WcT)T%-Z|?XG*V>xZ#kzHa3CVSg=~bU#WkCU-UL1~C>>UBGgVZ-$J?G>3;Kcbl1R1ie|6CBP*)sW zOzPJYeg2E2e!0JUD^YjceK)CJ^}1co_ZRhgeGcD`-gf8U%yFkjSb%K8&VUV^_%j^r zRg%KD5ZS*dd|K!~T`nZfE>t%E`6vF|S#|s|zw*u0JtrydJGie{DSQsb*eUo^e_p`V zsy~6N#r@*_!o3m{LFqn>(|!r8bJF{dXzZreP;LiIAKXne*Fe!>HJ}>$vOLPDHcD%p zc#5(g=}THh^l~k)<2wHPQ6EeIl@YA2hMh3zcXqMfUJUK%dN3AP{+_oPxMAXg0b{ot zZU$Ybk_h^u6AjQ0CA`xMdXd`2J>F*Q?u5y@yW;t{aYuy-7})*v*8A7pUg-PXV8=rr z>#kNU(M~@Op~ujbgzOfs3c1~A;NmvO2l+fs(4`&*Vh0yv&A`0bs=FPr5U$thu#-kf zyDR9RX7#X-G4{lQU|74*ohmR~FEe3T#$AV6f+8V7mrBBAPd0;KOBys2kFJrj%v(3= zuLY{n&>}?jx~ig{D{96Kdt0zRrvEKYOUsa$vz?rCtuY!>cn`X}jwX^|cIKQO{7g;e zh4i6}vKfKV(w1zt*2r$)P4DT)M%o;?fmF==1&1Fdf!#2GU77hH=yoG_X5`V~Wi!!r zPp!pY%=EEFGk3n@)|r<^i5R6~2R}RPOHEJ2Rl^Nf&ys*-^*V1CyDlbuBGcM!T!^`_#a~Wh z!HW1-epD$}O2x{QGg-u$Urs)nbc&CPzkK70uSErmQXSz6DE*?x*E6-P*vLkooI!O3%gvm-c`97KK4IJzjVxWo#&Okv#oe=viLN{;JJN>nO=xIjG)DU`xe|iY@N;Y z!a>E-wUVH>)rE&QJ0myO*OOj%W)9FKdiR|RMvZ@N`rMCpxRx;)WSzh&>)8)%SYr+M zUBQGy?D2!TG6XQh50-iAh6BHt`E33M+>g#WP)|H_2W`yI9ns$f3wGc~AB!O@EsYyS z@f;E17I>3z5uCT{!ncHPtk$%1nJuT8RKadu#`+mAWxPeCeAmO2gRcNe(bqhu2=MjX zch0}#22_bcr~^MeKfkuS-#?8Iy4EU@re4+B94VVMUB-YSj7kY7c08~nI9s?Z698}= zm<-6bL;ed4zZxM!>N<bfup<20K14BN3HlvdUJQgO+Gn`T zlvCT!?0#wAkfASS>CmcLDh*n#H+;Eg)|3K*;KC-{vCHp*{QVMwdaq$B5lQ%=WQUca+W%+cc9 zMm`Q=!~lCiI?;mZ7H&wZP?1{^EKOPhKvF*ese?%z8FZ(9A1BmL`SAz5bb^sOb1kii z@rpBlzl=LzTnpp){gAeqp&*nnffFTM=|UsHUF%%)L>JxD3~}zR2caXgUyiVE1K8ZZM%Bt?Dp-YOvGl>Tm^;j_h?P4lG2j|FFC%UElMU*dEme1xVaHnCT`)q)#io+$bO#9g zpoNTv={7NvAN9PjUq=KIQbOoSf8;Rd&uLQ7aT$rMRlrE#Cq}JD2CD_D;r@caRE#5G z99fz}wNY>AZ3W06=2SDM8c_XlrTBBZzX>GOM_6cAt60r3j7Y>Tgpw!&SQWM=)5M6n z0t99h+U-B`-d%aU^RCZGx||-W)eiLgnmF4R>KC#{7_lTX9wWgN23*zVjnlM+XjSA! zz&nbuwfrQn1mKe}Qjcl%Jc8!7*=0;iyKPh}1VH3F03WzJ7^?&Y9!p6F3ovJfP$o%S zWf0bkpC=3{4`8)^2hw(CFzh;}4iUx{b=b-v?D{Q%VW1DqC?_;7i}hlvcc8=J#EGpM zH;NDbSSH~WvpO65TDj^EZ{7t<=E z4^-1>nW!)=L8cC#OW=EcaRmtOrU~XTM$Pa;I+Z`$DS?jt;W0hct29L}4w8bJ(B^0# z4&twnKcllq!{ir##Sn7IyMmO(RROIqMm8NbL^RrsGs_8e*gz`HYqY=C#v#XdZHX9c zd!dBT1tf_EqAbB}6W%fQ#yqSsk8QGT^xd2WusfkVr**V-JR5{?jW&2;b1xXI)dxw~ zjq4c&(@Ueo?W}5hqpitsfJro>0|br>Kf~pnAX}4c zEvff-CA;;o^zf1Yh2NOis{GV6!X-lH;33A zT>oHs`No3%+Rj)=V1zJ0j=}x~Vnq-)lq&|Qhj4Pk zWpwP#jj+GrW!bi`UNb{RfTJ7DvbCD~+C824`syp~wcNY+67B;o*R%85J^i>1teL!{ zxC}Dh+(3^HvPolz05QL9N7~93adsv*PDJx&^ z2wT=3$J!9+%OeYT?dAL)C-t)Dt2UPy;fKQIdjKiROgNe+zX4&8htG z(+VnD0JLFQu7g$8&-pP5w$iit2Zr;7nyNxfWum~g@;8Z;U6GL59hx45cXmpsVd*Oh};e9a*&)K+o-_dFKvtyV*z26 zk&PkBDtrGK{h(f6r?(EIBUM3Gr!lPnWFnqBB>;gO1%Bpbg$z35>&7D@>OvV&MnKpK z7ZJgik|Xi&@fZq65dW0~DZcRrAPO}nQ_pX9HKob~cZfAH=!%nR+5r-mj>gsk3^nM` zA30xtTj&DMx9z;Tr@j{dY03wS?{=3 zYEHMjc(>oN#d2zi@&@!&SgKXkG{3M!C#`7jR?F_`7J0_{0vd0qQ@pJlV|tq>f_^+u zL5qZuKFdg^<9fB@W(njDOZAvse3L>O(*Dp)+_jDYTq#3+m;hoQz39PsuNTQ$>m!Np4&( z#BWLg5VXm)0@L36w7%os|A8X9fsh)w0Z7k?g%x}Rvsq7aSn{<2kl1!lukGSM;U-qD zkP?ioJVL#0BZWpkWWjN9+B6|yt?U8IonXH!Ss=yTAiCo{_OgVR_4A083kjwGCCl7C zv_|6jF!_j1wA;26jns@O6A>04P!j_9mW2|l#PD-ACP-`#G-mCh&)E*u=0R>!UnWZTgb_AAd)-IjIN@?FjjEMgkw8^SN&E>-!BSdPNUD3b8 zgJLlvq*o_wGA8pGYLms1><(4~FeB+m{t|;Q-O~#OdpR7E;QNiQ57FGbbdpCuK|P6?@*~DkPUMIf9Yl32f=x%kste5o zOX`oITu0n^y7WYHs2p|TDIB2A!FdjKL)$ENDK1HVN$dbBOq|u&HQzVKI<>WTYqT1tH=s_Jnq64Sl&&xrbnaUwE$Y*TpZzdD2-g z;?!C(E!NMc&fUZIZSo@L01#yBQfxbQrm%;CtE2cU-zobLLXsyzUoG>4mN_kLMO$f^ zRMU!<8n}|b;ANQ&xly3=7d$8Pa^|?!K4y1Vnp^pC)j8`_U~kXjcN)K{gVP63pnhBo zC#z&H_jiw0MA03UgjfRys9VQ!J;VgTPEOI+gTcO1V}zeMEB zO6gj838>w>+d`FgbNcqJh1O@STMJ9q7O#J_03^ZMvF0?OZR>7}NCSfo)LT3`*-{bm z7u9+GL451Gd2 zT1bvSQh{;M4NY6eBzEjvP9sst>SQ9AvQzn|az%w`EuCT?r9c@SI+%^(`VE};2#JA_ z>SVwXfRv0Yj$`GrW2&6WOekqiV4rB?NJKZ1Kuk4Q_bUk76r)95& ztpc|&%VNN-XHQM#N!>cN6cI$Hi@IebdPFZRTn#m_yae{rA8;X}8;SBT zNklF>OPgUj_NFd@FUc1j>66ef*)xyGyzc@qu54D$xUo9QGk*xuRt-cegYvOZe!^vZAH zgory=C7DOlh7OmPx7Xc~N@$I<5!PpC7=hNKQYhWrlE@sI{%oF7!%nevt=2JiWUJW4b8Q^P7o23cFcIOBAj74HH>m|@@xc{Ove&Zfz)kc0i z%IL0)L!%KsK04P}T+U)%NgOY7b@yWw^kki&4=l69r(G#Q0oq1uaS*T~Q1=;*Clbx# z;9xD8ZPWd*p%bI^^-O$x{o@6fMt~2?Dll?k=S4~-kSNc3V1;s+olA59sE_Pz2P=>a z{YvR1EyzgoBc=w$0cIx|oA=xm1s{iTE7`Mw9S(XMTC^%<1G+$y(-}+2Xr{1+`6m;$ z;tJUsCo}93o2JKZlTi|-G)=P_1l$P;(GDkC00(F-E{p>A*ko;6f7_Hc*4>-7dWUW26tD20jsRuaVq^_y z!yE2ZuiF{0#uLrE3(MYG77ydfS<%akglQz}PR{PtK?}OgY@+aNnF5xS^O*V0TsgBE zBbY(222at>2#j!9{(US<4kKug_80-Uz7GciT9ox1zXN+_{;Kwsq0NQQ;JUQiTZ0wUSy88E8ayKe zfg0Y}kLIOKJdL?E)iilN;#DxhV?53a^{fa3EsqEVr~-m^J(P9JV3AnMFrffavUPh{ zRG9gdGX1za4(Jc(vUbVk=Gb?G8-q!*jZiB59};u z@Murr>9=?#9_gifU01+^TXYhO4FV}s=0}B$THn-&@gk7(59Ea#BPwLXGHGSpM<@nW z7^2>@S+kh#Yk<0Cz|rfUFtKiUTj^Z4Np(wY)B>xQ!Df&)v%!xe5i?HPBRUNAi@mL6 zS2XF7&JWYBLpJ^x`3(&ourIEQTFt)R)6J=|K#0&0>n2OL14CoMkjX8w7u0W3!>)G< z%xAm5EZ~1!Am^?6TiK*&+@^&EF(uh22TVgn1K)LB7 zn+C=uaCs%{hFDE`J_mBYr#~5$+sljde;~YI`h+#o+w#yUSb&CFMF{S~g}2{oOMlJi zfo~rdb$jbV*1)ns5hSnqL)1M$h&M=3FPNYLmIdH&vyhcRqXOq?G%^y}&C^zh&cu${ zhC$<(5pe}+QI}A@Evz0|Ghsh%Q>820q4faxRp9FultQjJ@;mhN4;}b-JkB}LmW6|5 zu^;RNhs$oD1B8bhN;Z0p{GhoX+i)&G**>g}jp`(n%BY$`FL5mD$A(<2_jsILIA8y1 zMoH#<4Rx6sA{|-)84rh-S9t(|-mr*CXHemX8vmRo87Z(qAHITlodG4&fO^eGxN zly!r)1Ov?3c)Q65&`DSVtfRO&>9O`>SfjhP?;iRwt=vW-jd(tQI8*eenkA(;)mh~BSK3$@>)r& zwje4UlhV9&f_6dBhXlKZ@iin9rG@V&ekg3JcF^EA45~5uHW^7prKAIOb)|g&zm-RF zUpkRFdIx87n%n057yv61Zy(9?Wd;2%TG8Pt=JZ#K3{m;`)HP!!C{^rt^nwkp z{*I^t5H+pjNMHion-d1=>v>83prlW~uR^OruFHE;5GY%~Up|NQ7mIVwUE}~7WZX+H z54X-hDp4?P0)dneUBfcEAKb+8^&*V~NMo;FrTwgOLS$N;pAmg~@JWDx)rJ(r^PROXtFl z5ao~%>B2@QJq;4^iS5h|EAylcn6NsdJ*^Gw`yl!j5;`j_U|D=Fm^>~{7KJnJf}jrg zHXcxZ7!6`r6NyMczZyc~%DY$=d1(Q_QO?L^3~2O%2^g*NT_pf5Fw3$VN!%Z9N)bVY zO1X+T^!tJr0wJ)48W3oknm$OY`|LyRu?aleRHbX{jm(>6|PHp1@o9#tkkEjCC+(;zdMpxIgSFGXejA1FBk-SaI__GiuHN z8~gFj6BJWnYy6M*oek`!l5;4vdN9s{s|Qt{eTekZt-{`PGO;oF;DkJH3p3`DsXue@ z=9QD>LUJ;hS}pE2%-dI-d!^3{{qhc!`Ns4;6mCf&$6_+};M7ATpZKm7zl3)Gc)#=j zJFC&Ba{qkAgMu3!a6F7 zJ|&2onRP_qP!Loe&t%E)E|dnv4+N;|8EMwopR%coF>J1ufqf%XP-Z?-ZSpQ9Ys!cK z5wcg|HWY`pI!h=t(y6glDm8vqhW0Kjq0-H22}zvT5eUFz<2E+L7!%3?-M#-|oI>Vt z)}e5i!Y~kz_nX@~Ficvb<2Li+m33^u)_QKJdUdu!s~?R4b9ou8fh8R#P-xhk4YDyt zOywoR#saXm2DXCPAW>z*0ri6bMYMWaQ7KD1f(%SHqLd|DxL zzzYs4faaYYUwuv5ldYB!)0RT&wxHg?2VU&3&x<8=4b@zrs=np-D%Xx3IHU*ClSKO* zy5wHxsS)1615=YfDxP(UC2ZJ44z&E}3BJhTQKeKJ!v@YG&Xy**nR85oxXPpQqcfB0 zFWCXSPYuDFINS^H{sj#EU_vUj0Nw74s1hdTnROOb!mjTZ)}TauRBNIt>onfERY-8G z->AlH^L?lcWSLprUs_6?y56H&N-KzjKntc%w@^bFCar82p^PY{E>MDbX5!MtU{&Cb4r zBi#EkPrQp>W z3A+AQd}=s9f6cS=l+V=xw0Y2KDKHlHQD>qr8==&FJ|?$V#dox_nm#E0bn4OMvy;zEoh`nCqc@7DhQ4UgnfiZ| NUr)YS{n-=F{|9WZ5gh;k literal 0 HcmV?d00001 diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/logging.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/logging.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35a2a004ae480ebb4d862c4ce36ffd10850fe9c9 GIT binary patch literal 2584 zcmZuzTW=dh6y8~{ueEdQg>oqj5+$`1)S9$H3^OSTN{1Ttz^Us{loUo7PMdO%s7R18QBFvWf z!ZA6D>C1-6I#zxG2HKKkZ4C)0uUq#mZ4V2uzs-Ju z=$m28sU8SAN|dH-JeJ8=hD-}8q)a4LS_(Fz0SwU!45H9Cxw>>Kpp533)hJw{qRiLf zo>-w#(x*D1p0}_1p=)9(&s(7hM3MWU5_AGT&r?(7D$T*b^W2(=0%51gg!)Mwg#C#W zIFmHlk7?VFm{M&Ig7?F?@7_1b-C;40goNPeHeyq{&teU`n`pR=9zbTZ60(X+_Gr&w zgNcG@GzcR>p-vw9`eb)gDuo?PFrUTCnueosB4GoJ%0nr99Zj>%;XMEn2mmXgA>gTu zo9DqHwOg$K(%*Gw*&{OD44H106heSF9-KRcTGNq86g$)$QN@n z-)%EbonDeeKJt8aA$1-26_CE0FgUc1tYhmZcz#O`iF{X+AFKe#%9BNutv^^4f(Dp@LBr;yA>yFB1nyWE00J{q6ka zROJYOVb4nA3n2MbTc%NfeLlK z-l*GkQn72$2NJs$Vw5pP1;SDHPc0rD3tN6ZoA+2@0!36#_h;CP+#7gWl ziT|I{lAewMsg&r>+`f>z2V&BP&lE_2L>WrU{V3^y9%LV)#?IIGHoEI~Hr7Aix_i4* zQ!G|t;?5e&$bE)J!`PxMX)|`LlivI%LBi*9_ literal 0 HcmV?d00001 diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/sessions.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/sessions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..55dcb9c0c9b79e410ba2e79a89d6b7865b08e3b3 GIT binary patch literal 13326 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 Ya(GK|9rhW124v8RqokG4!*@jg1ASl;5C8xG literal 0 HcmV?d00001 diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/templating.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/templating.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f17041e5a0fe36c5a63902460e72d84c633287ec GIT binary patch literal 7121 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 literal 0 HcmV?d00001 diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/testing.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/testing.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5028141d08003ffea315c6ecce183df45a4bed78 GIT binary patch literal 9884 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 literal 0 HcmV?d00001 diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/views.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/flask/__pycache__/views.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f01569c950a03005d2121e4ae37afaed88cfd5ac GIT binary patch literal 5581 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 literal 0 HcmV?d00001 diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/app.py b/server-temp/venv/lib/python3.10/site-packages/flask/app.py new file mode 100644 index 00000000..12ac50d4 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/flask/app.py @@ -0,0 +1,1488 @@ +from __future__ import annotations + +import collections.abc as cabc +import os +import sys +import typing as t +import weakref +from datetime import timedelta +from inspect import iscoroutinefunction +from itertools import chain +from types import TracebackType +from urllib.parse import quote as _url_quote + +import click +from werkzeug.datastructures import Headers +from werkzeug.datastructures import ImmutableDict +from werkzeug.exceptions import BadRequestKeyError +from werkzeug.exceptions import HTTPException +from werkzeug.exceptions import InternalServerError +from werkzeug.routing import BuildError +from werkzeug.routing import MapAdapter +from werkzeug.routing import RequestRedirect +from werkzeug.routing import RoutingException +from werkzeug.routing import Rule +from werkzeug.serving import is_running_from_reloader +from werkzeug.wrappers import Response as BaseResponse + +from . import cli +from . import typing as ft +from .ctx import AppContext +from .ctx import RequestContext +from .globals import _cv_app +from .globals import _cv_request +from .globals import current_app +from .globals import g +from .globals import request +from .globals import request_ctx +from .globals import session +from .helpers import get_debug_flag +from .helpers import get_flashed_messages +from .helpers import get_load_dotenv +from .helpers import send_from_directory +from .sansio.app import App +from .sansio.scaffold import _sentinel +from .sessions import SecureCookieSessionInterface +from .sessions import SessionInterface +from .signals import appcontext_tearing_down +from .signals import got_request_exception +from .signals import request_finished +from .signals import request_started +from .signals import request_tearing_down +from .templating import Environment +from .wrappers import Request +from .wrappers import Response + +if t.TYPE_CHECKING: # pragma: no cover + from _typeshed.wsgi import StartResponse + from _typeshed.wsgi import WSGIEnvironment + + from .testing import FlaskClient + from .testing import FlaskCliRunner + +T_shell_context_processor = t.TypeVar( + "T_shell_context_processor", bound=ft.ShellContextProcessorCallable +) +T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) +T_template_filter = t.TypeVar("T_template_filter", bound=ft.TemplateFilterCallable) +T_template_global = t.TypeVar("T_template_global", bound=ft.TemplateGlobalCallable) +T_template_test = t.TypeVar("T_template_test", bound=ft.TemplateTestCallable) + + +def _make_timedelta(value: timedelta | int | None) -> timedelta | None: + if value is None or isinstance(value, timedelta): + return value + + return timedelta(seconds=value) + + +class Flask(App): + """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 is served at + ``static_url_path``. Relative to the application ``root_path`` + or an absolute path. Defaults to ``'static'``. + :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: The path to the root of the application files. + This should only be set manually when it can't be detected + automatically, such as for namespace packages. + """ + + default_config = ImmutableDict( + { + "DEBUG": None, + "TESTING": False, + "PROPAGATE_EXCEPTIONS": 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": None, + "TRAP_BAD_REQUEST_ERRORS": None, + "TRAP_HTTP_EXCEPTIONS": False, + "EXPLAIN_TEMPLATE_LOADING": False, + "PREFERRED_URL_SCHEME": "http", + "TEMPLATES_AUTO_RELOAD": None, + "MAX_COOKIE_SIZE": 4093, + } + ) + + #: The class that is used for request objects. See :class:`~flask.Request` + #: for more information. + request_class: type[Request] = Request + + #: The class that is used for response objects. See + #: :class:`~flask.Response` for more information. + response_class: type[Response] = Response + + #: the session interface to use. By default an instance of + #: :class:`~flask.sessions.SecureCookieSessionInterface` is used here. + #: + #: .. versionadded:: 0.8 + session_interface: SessionInterface = SecureCookieSessionInterface() + + def __init__( + self, + import_name: str, + static_url_path: str | None = None, + static_folder: str | os.PathLike[str] | None = "static", + static_host: str | None = None, + host_matching: bool = False, + subdomain_matching: bool = False, + template_folder: str | os.PathLike[str] | None = "templates", + instance_path: str | None = None, + instance_relative_config: bool = False, + root_path: str | None = None, + ): + super().__init__( + import_name=import_name, + static_url_path=static_url_path, + static_folder=static_folder, + static_host=static_host, + host_matching=host_matching, + subdomain_matching=subdomain_matching, + template_folder=template_folder, + instance_path=instance_path, + instance_relative_config=instance_relative_config, + root_path=root_path, + ) + + # 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" + # Use a weakref to avoid creating a reference cycle between the app + # and the view function (see #3761). + self_ref = weakref.ref(self) + self.add_url_rule( + f"{self.static_url_path}/", + endpoint="static", + host=static_host, + view_func=lambda **kw: self_ref().send_static_file(**kw), # type: ignore # noqa: B950 + ) + + def get_send_file_max_age(self, filename: str | None) -> int | None: + """Used by :func:`send_file` to determine the ``max_age`` cache + value for a given file path if it wasn't passed. + + By default, this returns :data:`SEND_FILE_MAX_AGE_DEFAULT` from + the configuration of :data:`~flask.current_app`. This defaults + to ``None``, which tells the browser to use conditional requests + instead of a timed cache, which is usually preferable. + + Note this is a duplicate of the same method in the Flask + class. + + .. versionchanged:: 2.0 + The default configuration is ``None`` instead of 12 hours. + + .. versionadded:: 0.9 + """ + value = current_app.config["SEND_FILE_MAX_AGE_DEFAULT"] + + if value is None: + return None + + if isinstance(value, timedelta): + return int(value.total_seconds()) + + return value # type: ignore[no-any-return] + + def send_static_file(self, filename: str) -> Response: + """The view function used to serve files from + :attr:`static_folder`. A route is automatically registered for + this view at :attr:`static_url_path` if :attr:`static_folder` is + set. + + Note this is a duplicate of the same method in the Flask + class. + + .. versionadded:: 0.5 + + """ + if not self.has_static_folder: + raise RuntimeError("'static_folder' must be set to serve static_files.") + + # send_file only knows to call get_send_file_max_age on the app, + # call it here so it works for blueprints too. + max_age = self.get_send_file_max_age(filename) + return send_from_directory( + t.cast(str, self.static_folder), filename, max_age=max_age + ) + + def open_resource(self, resource: str, mode: str = "rb") -> t.IO[t.AnyStr]: + """Open a resource file relative to :attr:`root_path` for + reading. + + For example, if the file ``schema.sql`` is next to the file + ``app.py`` where the ``Flask`` app is defined, it can be opened + with: + + .. code-block:: python + + with app.open_resource("schema.sql") as f: + conn.executescript(f.read()) + + :param resource: Path to the resource relative to + :attr:`root_path`. + :param mode: Open the file in this mode. Only reading is + supported, valid values are "r" (or "rt") and "rb". + + Note this is a duplicate of the same method in the Flask + class. + + """ + if mode not in {"r", "rt", "rb"}: + raise ValueError("Resources can only be opened for reading.") + + return open(os.path.join(self.root_path, resource), mode) + + def open_instance_resource(self, resource: str, mode: str = "rb") -> t.IO[t.AnyStr]: + """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 create_jinja_environment(self) -> Environment: + """Create the Jinja environment based on :attr:`jinja_options` + and the various Jinja-related methods of the app. Changing + :attr:`jinja_options` after this will have no effect. Also adds + Flask-related globals and filters to the environment. + + .. versionchanged:: 0.11 + ``Environment.auto_reload`` set in accordance with + ``TEMPLATES_AUTO_RELOAD`` configuration option. + + .. versionadded:: 0.5 + """ + options = dict(self.jinja_options) + + if "autoescape" not in options: + options["autoescape"] = self.select_jinja_autoescape + + if "auto_reload" not in options: + auto_reload = self.config["TEMPLATES_AUTO_RELOAD"] + + if auto_reload is None: + auto_reload = self.debug + + options["auto_reload"] = auto_reload + + rv = self.jinja_environment(self, **options) + rv.globals.update( + url_for=self.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.policies["json.dumps_function"] = self.json.dumps + return rv + + def create_url_adapter(self, request: Request | None) -> MapAdapter | None: + """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. + if not self.subdomain_matching: + subdomain = self.url_map.default_subdomain or None + else: + subdomain = 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"], + ) + + return None + + def raise_routing_exception(self, request: Request) -> t.NoReturn: + """Intercept routing exceptions and possibly do something else. + + In debug mode, intercept a routing redirect and replace it with + an error if the body will be discarded. + + With modern Werkzeug this shouldn't occur, since it now uses a + 308 status which tells the browser to resend the method and + body. + + .. versionchanged:: 2.1 + Don't intercept 307 and 308 redirects. + + :meta private: + :internal: + """ + if ( + not self.debug + or not isinstance(request.routing_exception, RequestRedirect) + or request.routing_exception.code in {307, 308} + or request.method in {"GET", "HEAD", "OPTIONS"} + ): + raise request.routing_exception # type: ignore[misc] + + from .debughelpers import FormDataRoutingRedirect + + raise FormDataRoutingRedirect(request) + + def update_template_context(self, context: dict[str, t.Any]) -> None: + """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. + """ + names: t.Iterable[str | None] = (None,) + + # A template may be rendered outside a request context. + if request: + names = chain(names, reversed(request.blueprints)) + + # The values passed to render_template take precedence. Keep a + # copy to re-apply after all context functions. + orig_ctx = context.copy() + + for name in names: + if name in self.template_context_processors: + for func in self.template_context_processors[name]: + context.update(self.ensure_sync(func)()) + + context.update(orig_ctx) + + def make_shell_context(self) -> dict[str, t.Any]: + """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 + + def run( + self, + host: str | None = None, + port: int | None = None, + debug: bool | None = None, + load_dotenv: bool = True, + **options: t.Any, + ) -> None: + """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 :doc:`/deploying/index` 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. + + The :envvar:`FLASK_DEBUG` environment variable will override :attr:`debug`. + + Threaded mode is enabled by default. + + .. versionchanged:: 0.10 + The default port is now picked from the ``SERVER_NAME`` + variable. + """ + # Ignore this call so that it doesn't start another server if + # the 'flask run' command is used. + if os.environ.get("FLASK_RUN_FROM_CLI") == "true": + if not is_running_from_reloader(): + click.secho( + " * Ignoring a call to 'app.run()' that would block" + " the current 'flask' CLI command.\n" + " Only call 'app.run()' in an 'if __name__ ==" + ' "__main__"\' guard.', + fg="red", + ) + + return + + if get_load_dotenv(load_dotenv): + cli.load_dotenv() + + # if set, env var overrides existing value + if "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) + + server_name = self.config.get("SERVER_NAME") + sn_host = sn_port = None + + if server_name: + sn_host, _, sn_port = server_name.partition(":") + + if not host: + if sn_host: + host = sn_host + else: + host = "127.0.0.1" + + if port or port == 0: + port = int(port) + elif sn_port: + port = int(sn_port) + else: + port = 5000 + + options.setdefault("use_reloader", self.debug) + options.setdefault("use_debugger", self.debug) + options.setdefault("threaded", True) + + cli.show_server_banner(self.debug, self.name) + + from werkzeug.serving import run_simple + + try: + run_simple(t.cast(str, 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: bool = True, **kwargs: t.Any) -> FlaskClient: + """Creates a test client for this application. For information + about unit testing head over to :doc:`/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 .testing import FlaskClient as cls + return cls( # type: ignore + self, self.response_class, use_cookies=use_cookies, **kwargs + ) + + def test_cli_runner(self, **kwargs: t.Any) -> FlaskCliRunner: + """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 .testing import FlaskCliRunner as cls + + return cls(self, **kwargs) # type: ignore + + def handle_http_exception( + self, e: HTTPException + ) -> HTTPException | ft.ResponseReturnValue: + """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 + ``HTTPException`` 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, request.blueprints) + if handler is None: + return e + return self.ensure_sync(handler)(e) # type: ignore[no-any-return] + + def handle_user_exception( + self, e: Exception + ) -> HTTPException | ft.ResponseReturnValue: + """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 + """ + if isinstance(e, BadRequestKeyError) and ( + self.debug or self.config["TRAP_BAD_REQUEST_ERRORS"] + ): + e.show_exception = True + + if isinstance(e, HTTPException) and not self.trap_http_exception(e): + return self.handle_http_exception(e) + + handler = self._find_error_handler(e, request.blueprints) + + if handler is None: + raise + + return self.ensure_sync(handler)(e) # type: ignore[no-any-return] + + def handle_exception(self, e: Exception) -> Response: + """Handle an exception that did not have an error handler + associated with it, or that was raised from an error handler. + This always causes a 500 ``InternalServerError``. + + Always sends the :data:`got_request_exception` signal. + + If :data:`PROPAGATE_EXCEPTIONS` is ``True``, such as in debug + mode, the error will be re-raised so that the debugger can + display it. Otherwise, the original exception is logged, and + an :exc:`~werkzeug.exceptions.InternalServerError` is returned. + + If an error handler is registered for ``InternalServerError`` or + ``500``, it will be used. For consistency, the handler will + always receive the ``InternalServerError``. The original + unhandled exception is available as ``e.original_exception``. + + .. versionchanged:: 1.1.0 + Always passes the ``InternalServerError`` instance to the + handler, setting ``original_exception`` to the unhandled + error. + + .. versionchanged:: 1.1.0 + ``after_request`` functions and other finalization is done + even for the default 500 response when there is no handler. + + .. versionadded:: 0.3 + """ + exc_info = sys.exc_info() + got_request_exception.send(self, _async_wrapper=self.ensure_sync, exception=e) + propagate = self.config["PROPAGATE_EXCEPTIONS"] + + if propagate is None: + propagate = self.testing or self.debug + + if propagate: + # Re-raise if called with an active exception, otherwise + # raise the passed in exception. + if exc_info[1] is e: + raise + + raise e + + self.log_exception(exc_info) + server_error: InternalServerError | ft.ResponseReturnValue + server_error = InternalServerError(original_exception=e) + handler = self._find_error_handler(server_error, request.blueprints) + + if handler is not None: + server_error = self.ensure_sync(handler)(server_error) + + return self.finalize_request(server_error, from_error_handler=True) + + def log_exception( + self, + exc_info: (tuple[type, BaseException, TracebackType] | tuple[None, None, None]), + ) -> None: + """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( + f"Exception on {request.path} [{request.method}]", exc_info=exc_info + ) + + def dispatch_request(self) -> ft.ResponseReturnValue: + """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.request + if req.routing_exception is not None: + self.raise_routing_exception(req) + rule: Rule = req.url_rule # type: ignore[assignment] + # 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 + view_args: dict[str, t.Any] = req.view_args # type: ignore[assignment] + return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] + + def full_dispatch_request(self) -> Response: + """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._got_first_request = True + + try: + request_started.send(self, _async_wrapper=self.ensure_sync) + 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: ft.ResponseReturnValue | HTTPException, + from_error_handler: bool = False, + ) -> Response: + """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, _async_wrapper=self.ensure_sync, 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 make_default_options_response(self) -> Response: + """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.url_adapter + methods = adapter.allowed_methods() # type: ignore[union-attr] + rv = self.response_class() + rv.allow.update(methods) + return rv + + def ensure_sync(self, func: t.Callable[..., t.Any]) -> t.Callable[..., t.Any]: + """Ensure that the function is synchronous for WSGI workers. + Plain ``def`` functions are returned as-is. ``async def`` + functions are wrapped to run and wait for the response. + + Override this method to change how the app runs async views. + + .. versionadded:: 2.0 + """ + if iscoroutinefunction(func): + return self.async_to_sync(func) + + return func + + def async_to_sync( + self, func: t.Callable[..., t.Coroutine[t.Any, t.Any, t.Any]] + ) -> t.Callable[..., t.Any]: + """Return a sync function that will run the coroutine function. + + .. code-block:: python + + result = app.async_to_sync(func)(*args, **kwargs) + + Override this method to change how the app converts async code + to be synchronously callable. + + .. versionadded:: 2.0 + """ + try: + from asgiref.sync import async_to_sync as asgiref_async_to_sync + except ImportError: + raise RuntimeError( + "Install Flask with the 'async' extra in order to use async views." + ) from None + + return asgiref_async_to_sync(func) + + def url_for( + self, + /, + endpoint: str, + *, + _anchor: str | None = None, + _method: str | None = None, + _scheme: str | None = None, + _external: bool | None = None, + **values: t.Any, + ) -> str: + """Generate a URL to the given endpoint with the given values. + + This is called by :func:`flask.url_for`, and can be called + directly as well. + + An *endpoint* is the name of a URL rule, usually added with + :meth:`@app.route() `, and usually the same name as the + view function. A route defined in a :class:`~flask.Blueprint` + will prepend the blueprint's name separated by a ``.`` to the + endpoint. + + In some cases, such as email messages, you want URLs to include + the scheme and domain, like ``https://example.com/hello``. When + not in an active request, URLs will be external by default, but + this requires setting :data:`SERVER_NAME` so Flask knows what + domain to use. :data:`APPLICATION_ROOT` and + :data:`PREFERRED_URL_SCHEME` should also be configured as + needed. This config is only used when not in an active request. + + Functions can be decorated with :meth:`url_defaults` to modify + keyword arguments before the URL is built. + + If building fails for some reason, such as an unknown endpoint + or incorrect values, the app's :meth:`handle_url_build_error` + method is called. If that returns a string, that is returned, + otherwise a :exc:`~werkzeug.routing.BuildError` is raised. + + :param endpoint: The endpoint name associated with the URL to + generate. If this starts with a ``.``, the current blueprint + name (if any) will be used. + :param _anchor: If given, append this as ``#anchor`` to the URL. + :param _method: If given, generate the URL associated with this + method for the endpoint. + :param _scheme: If given, the URL will have this scheme if it + is external. + :param _external: If given, prefer the URL to be internal + (False) or require it to be external (True). External URLs + include the scheme and domain. When not in an active + request, URLs are external by default. + :param values: Values to use for the variable parts of the URL + rule. Unknown keys are appended as query string arguments, + like ``?a=b&c=d``. + + .. versionadded:: 2.2 + Moved from ``flask.url_for``, which calls this method. + """ + req_ctx = _cv_request.get(None) + + if req_ctx is not None: + url_adapter = req_ctx.url_adapter + blueprint_name = req_ctx.request.blueprint + + # If the endpoint starts with "." and the request matches a + # blueprint, the endpoint is relative to the blueprint. + if endpoint[:1] == ".": + if blueprint_name is not None: + endpoint = f"{blueprint_name}{endpoint}" + else: + endpoint = endpoint[1:] + + # When in a request, generate a URL without scheme and + # domain by default, unless a scheme is given. + if _external is None: + _external = _scheme is not None + else: + app_ctx = _cv_app.get(None) + + # If called by helpers.url_for, an app context is active, + # use its url_adapter. Otherwise, app.url_for was called + # directly, build an adapter. + if app_ctx is not None: + url_adapter = app_ctx.url_adapter + else: + url_adapter = self.create_url_adapter(None) + + if url_adapter is None: + raise RuntimeError( + "Unable to build URLs outside an active request" + " without 'SERVER_NAME' configured. Also configure" + " 'APPLICATION_ROOT' and 'PREFERRED_URL_SCHEME' as" + " needed." + ) + + # When outside a request, generate a URL with scheme and + # domain by default. + if _external is None: + _external = True + + # It is an error to set _scheme when _external=False, in order + # to avoid accidental insecure URLs. + if _scheme is not None and not _external: + raise ValueError("When specifying '_scheme', '_external' must be True.") + + self.inject_url_defaults(endpoint, values) + + try: + rv = url_adapter.build( # type: ignore[union-attr] + endpoint, + values, + method=_method, + url_scheme=_scheme, + force_external=_external, + ) + except BuildError as error: + values.update( + _anchor=_anchor, _method=_method, _scheme=_scheme, _external=_external + ) + return self.handle_url_build_error(error, endpoint, values) + + if _anchor is not None: + _anchor = _url_quote(_anchor, safe="%!#$&'()*+,/:;=?@") + rv = f"{rv}#{_anchor}" + + return rv + + def make_response(self, rv: ft.ResponseReturnValue) -> Response: + """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`` + A response object is created with the string encoded to UTF-8 + as the body. + + ``bytes`` + A response object is created with the bytes as the body. + + ``dict`` + A dictionary that will be jsonify'd before being returned. + + ``list`` + A list that will be jsonify'd before being returned. + + ``generator`` or ``iterator`` + A generator that returns ``str`` or ``bytes`` to be + streamed as the response. + + ``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:: 2.2 + A generator will be converted to a streaming response. + A list will be converted to a JSON response. + + .. versionchanged:: 1.1 + A dict will be converted to a JSON response. + + .. 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 # type: ignore[misc] + # 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 # type: ignore[assignment,misc] + # 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( + f"The view function for {request.endpoint!r} 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, (str, bytes, bytearray)) or isinstance(rv, cabc.Iterator): + # 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, # type: ignore[arg-type] + ) + status = headers = None + elif isinstance(rv, (dict, list)): + rv = self.json.response(rv) + elif isinstance(rv, BaseResponse) or callable(rv): + # evaluate a WSGI callable, or coerce a different response + # class to the correct type + try: + rv = self.response_class.force_type( + rv, # type: ignore[arg-type] + request.environ, + ) + except TypeError as e: + raise TypeError( + f"{e}\nThe view function did not return a valid" + " response. The return type must be a string," + " dict, list, tuple with headers or status," + " Response instance, or WSGI callable, but it" + f" was a {type(rv).__name__}." + ).with_traceback(sys.exc_info()[2]) from None + else: + raise TypeError( + "The view function did not return a valid" + " response. The return type must be a string," + " dict, list, tuple with headers or status," + " Response instance, or WSGI callable, but it was a" + f" {type(rv).__name__}." + ) + + rv = t.cast(Response, rv) + # prefer the status if it was provided + if status is not None: + if isinstance(status, (str, bytes, bytearray)): + rv.status = status + else: + rv.status_code = status + + # extend existing headers with provided headers + if headers: + rv.headers.update(headers) # type: ignore[arg-type] + + return rv + + def preprocess_request(self) -> ft.ResponseReturnValue | None: + """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. + """ + names = (None, *reversed(request.blueprints)) + + for name in names: + if name in self.url_value_preprocessors: + for url_func in self.url_value_preprocessors[name]: + url_func(request.endpoint, request.view_args) + + for name in names: + if name in self.before_request_funcs: + for before_func in self.before_request_funcs[name]: + rv = self.ensure_sync(before_func)() + + if rv is not None: + return rv # type: ignore[no-any-return] + + return None + + def process_response(self, response: Response) -> 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._get_current_object() # type: ignore[attr-defined] + + for func in ctx._after_request_functions: + response = self.ensure_sync(func)(response) + + for name in chain(request.blueprints, (None,)): + if name in self.after_request_funcs: + for func in reversed(self.after_request_funcs[name]): + response = self.ensure_sync(func)(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: BaseException | None = _sentinel, # type: ignore[assignment] + ) -> None: + """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] + + for name in chain(request.blueprints, (None,)): + if name in self.teardown_request_funcs: + for func in reversed(self.teardown_request_funcs[name]): + self.ensure_sync(func)(exc) + + request_tearing_down.send(self, _async_wrapper=self.ensure_sync, exc=exc) + + def do_teardown_appcontext( + self, + exc: BaseException | None = _sentinel, # type: ignore[assignment] + ) -> None: + """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): + self.ensure_sync(func)(exc) + + appcontext_tearing_down.send(self, _async_wrapper=self.ensure_sync, exc=exc) + + def app_context(self) -> AppContext: + """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: WSGIEnvironment) -> RequestContext: + """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: t.Any, **kwargs: t.Any) -> RequestContext: + """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 app.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 .testing import EnvironBuilder + + builder = EnvironBuilder(self, *args, **kwargs) + + try: + return self.request_context(builder.get_environ()) + finally: + builder.close() + + def wsgi_app( + self, environ: WSGIEnvironment, start_response: StartResponse + ) -> cabc.Iterable[bytes]: + """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: BaseException | None = None + try: + try: + ctx.push() + response = self.full_dispatch_request() + except Exception as e: + error = e + response = self.handle_exception(e) + except: # noqa: B001 + error = sys.exc_info()[1] + raise + return response(environ, start_response) + finally: + if "werkzeug.debug.preserve_context" in environ: + environ["werkzeug.debug.preserve_context"](_cv_app.get()) + environ["werkzeug.debug.preserve_context"](_cv_request.get()) + + if error is not None and self.should_ignore_error(error): + error = None + + ctx.pop(error) + + def __call__( + self, environ: WSGIEnvironment, start_response: StartResponse + ) -> cabc.Iterable[bytes]: + """The WSGI server calls the Flask application object as the + WSGI application. This calls :meth:`wsgi_app`, which can be + wrapped to apply middleware. + """ + return self.wsgi_app(environ, start_response) diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/blueprints.py b/server-temp/venv/lib/python3.10/site-packages/flask/blueprints.py new file mode 100644 index 00000000..52859b85 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/flask/blueprints.py @@ -0,0 +1,91 @@ +from __future__ import annotations + +import os +import typing as t +from datetime import timedelta + +from .globals import current_app +from .helpers import send_from_directory +from .sansio.blueprints import Blueprint as SansioBlueprint +from .sansio.blueprints import BlueprintSetupState as BlueprintSetupState # noqa + +if t.TYPE_CHECKING: # pragma: no cover + from .wrappers import Response + + +class Blueprint(SansioBlueprint): + def get_send_file_max_age(self, filename: str | None) -> int | None: + """Used by :func:`send_file` to determine the ``max_age`` cache + value for a given file path if it wasn't passed. + + By default, this returns :data:`SEND_FILE_MAX_AGE_DEFAULT` from + the configuration of :data:`~flask.current_app`. This defaults + to ``None``, which tells the browser to use conditional requests + instead of a timed cache, which is usually preferable. + + Note this is a duplicate of the same method in the Flask + class. + + .. versionchanged:: 2.0 + The default configuration is ``None`` instead of 12 hours. + + .. versionadded:: 0.9 + """ + value = current_app.config["SEND_FILE_MAX_AGE_DEFAULT"] + + if value is None: + return None + + if isinstance(value, timedelta): + return int(value.total_seconds()) + + return value # type: ignore[no-any-return] + + def send_static_file(self, filename: str) -> Response: + """The view function used to serve files from + :attr:`static_folder`. A route is automatically registered for + this view at :attr:`static_url_path` if :attr:`static_folder` is + set. + + Note this is a duplicate of the same method in the Flask + class. + + .. versionadded:: 0.5 + + """ + if not self.has_static_folder: + raise RuntimeError("'static_folder' must be set to serve static_files.") + + # send_file only knows to call get_send_file_max_age on the app, + # call it here so it works for blueprints too. + max_age = self.get_send_file_max_age(filename) + return send_from_directory( + t.cast(str, self.static_folder), filename, max_age=max_age + ) + + def open_resource(self, resource: str, mode: str = "rb") -> t.IO[t.AnyStr]: + """Open a resource file relative to :attr:`root_path` for + reading. + + For example, if the file ``schema.sql`` is next to the file + ``app.py`` where the ``Flask`` app is defined, it can be opened + with: + + .. code-block:: python + + with app.open_resource("schema.sql") as f: + conn.executescript(f.read()) + + :param resource: Path to the resource relative to + :attr:`root_path`. + :param mode: Open the file in this mode. Only reading is + supported, valid values are "r" (or "rt") and "rb". + + Note this is a duplicate of the same method in the Flask + class. + + """ + if mode not in {"r", "rt", "rb"}: + raise ValueError("Resources can only be opened for reading.") + + return open(os.path.join(self.root_path, resource), mode) diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/cli.py b/server-temp/venv/lib/python3.10/site-packages/flask/cli.py new file mode 100644 index 00000000..d4df2802 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/flask/cli.py @@ -0,0 +1,1111 @@ +from __future__ import annotations + +import ast +import collections.abc as cabc +import importlib.metadata +import inspect +import os +import platform +import re +import sys +import traceback +import typing as t +from functools import update_wrapper +from operator import itemgetter +from types import ModuleType + +import click +from click.core import ParameterSource +from werkzeug import run_simple +from werkzeug.serving import is_running_from_reloader +from werkzeug.utils import import_string + +from .globals import current_app +from .helpers import get_debug_flag +from .helpers import get_load_dotenv + +if t.TYPE_CHECKING: + import ssl + + from _typeshed.wsgi import StartResponse + from _typeshed.wsgi import WSGIApplication + from _typeshed.wsgi import WSGIEnvironment + + from .app import Flask + + +class NoAppException(click.UsageError): + """Raised if an application cannot be found or loaded.""" + + +def find_best_app(module: ModuleType) -> Flask: + """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 v in module.__dict__.values() if isinstance(v, Flask)] + + if len(matches) == 1: + return matches[0] + elif len(matches) > 1: + raise NoAppException( + "Detected multiple Flask applications in module" + f" '{module.__name__}'. Use '{module.__name__}:name'" + " to specify the correct one." + ) + + # 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 = app_factory() + + if isinstance(app, Flask): + return app + except TypeError as e: + if not _called_with_wrong_args(app_factory): + raise + + raise NoAppException( + f"Detected factory '{attr_name}' in module '{module.__name__}'," + " but could not call it without arguments. Use" + f" '{module.__name__}:{attr_name}(args)'" + " to specify arguments." + ) from e + + raise NoAppException( + "Failed to find Flask application or factory in module" + f" '{module.__name__}'. Use '{module.__name__}:name'" + " to specify one." + ) + + +def _called_with_wrong_args(f: t.Callable[..., Flask]) -> bool: + """Check whether calling a function raised a ``TypeError`` because + the call failed or because something in the factory raised the + error. + + :param f: The 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 f.__code__: + # In the function, it was called successfully. + return False + + tb = tb.tb_next + + # Didn't reach the function. + return True + finally: + # Delete tb to break a circular reference. + # https://docs.python.org/2/library/sys.html#sys.exc_info + del tb + + +def find_app_by_string(module: ModuleType, app_name: str) -> Flask: + """Check if the given string is a variable name or a function. Call + a function to get the app instance, or return the variable directly. + """ + from . import Flask + + # Parse app_name as a single expression to determine if it's a valid + # attribute name or function call. + try: + expr = ast.parse(app_name.strip(), mode="eval").body + except SyntaxError: + raise NoAppException( + f"Failed to parse {app_name!r} as an attribute name or function call." + ) from None + + if isinstance(expr, ast.Name): + name = expr.id + args = [] + kwargs = {} + elif isinstance(expr, ast.Call): + # Ensure the function name is an attribute name only. + if not isinstance(expr.func, ast.Name): + raise NoAppException( + f"Function reference must be a simple name: {app_name!r}." + ) + + name = expr.func.id + + # Parse the positional and keyword arguments as literals. + try: + args = [ast.literal_eval(arg) for arg in expr.args] + kwargs = { + kw.arg: ast.literal_eval(kw.value) + for kw in expr.keywords + if kw.arg is not None + } + except ValueError: + # literal_eval gives cryptic error messages, show a generic + # message with the full expression instead. + raise NoAppException( + f"Failed to parse arguments as literal values: {app_name!r}." + ) from None + else: + raise NoAppException( + f"Failed to parse {app_name!r} as an attribute name or function call." + ) + + try: + attr = getattr(module, name) + except AttributeError as e: + raise NoAppException( + f"Failed to find attribute {name!r} in {module.__name__!r}." + ) from e + + # If the attribute is a function, call it with any args and kwargs + # to get the real application. + if inspect.isfunction(attr): + try: + app = attr(*args, **kwargs) + except TypeError as e: + if not _called_with_wrong_args(attr): + raise + + raise NoAppException( + f"The factory {app_name!r} in module" + f" {module.__name__!r} could not be called with the" + " specified arguments." + ) from e + else: + app = attr + + if isinstance(app, Flask): + return app + + raise NoAppException( + "A valid Flask application was not obtained from" + f" '{module.__name__}:{app_name}'." + ) + + +def prepare_import(path: str) -> str: + """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) + + fname, ext = os.path.splitext(path) + if ext == ".py": + path = fname + + 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]) + + +@t.overload +def locate_app( + module_name: str, app_name: str | None, raise_if_not_found: t.Literal[True] = True +) -> Flask: + ... + + +@t.overload +def locate_app( + module_name: str, app_name: str | None, raise_if_not_found: t.Literal[False] = ... +) -> Flask | None: + ... + + +def locate_app( + module_name: str, app_name: str | None, raise_if_not_found: bool = True +) -> Flask | None: + 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()[2].tb_next: # type: ignore[union-attr] + raise NoAppException( + f"While importing {module_name!r}, an ImportError was" + f" raised:\n\n{traceback.format_exc()}" + ) from None + elif raise_if_not_found: + raise NoAppException(f"Could not import {module_name!r}.") from None + else: + return None + + module = sys.modules[module_name] + + if app_name is None: + return find_best_app(module) + else: + return find_app_by_string(module, app_name) + + +def get_version(ctx: click.Context, param: click.Parameter, value: t.Any) -> None: + if not value or ctx.resilient_parsing: + return + + flask_version = importlib.metadata.version("flask") + werkzeug_version = importlib.metadata.version("werkzeug") + + click.echo( + f"Python {platform.python_version()}\n" + f"Flask {flask_version}\n" + f"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 ScriptInfo: + """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: str | None = None, + create_app: t.Callable[..., Flask] | None = None, + set_debug_flag: bool = True, + ) -> None: + #: Optionally the import path for the Flask application. + self.app_import_path = app_import_path + #: 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: dict[t.Any, t.Any] = {} + self.set_debug_flag = set_debug_flag + self._loaded_app: Flask | None = None + + def load_app(self) -> Flask: + """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. + """ + if self._loaded_app is not None: + return self._loaded_app + + if self.create_app is not None: + app: Flask | None = self.create_app() + else: + if self.app_import_path: + path, name = ( + re.split(r":(?![\\/])", self.app_import_path, maxsplit=1) + [None] + )[:2] + import_name = prepare_import(path) + app = locate_app(import_name, name) + else: + for path in ("wsgi.py", "app.py"): + import_name = prepare_import(path) + app = locate_app(import_name, None, raise_if_not_found=False) + + if app is not None: + break + + if app is None: + raise NoAppException( + "Could not locate a Flask application. Use the" + " 'flask --app' option, 'FLASK_APP' environment" + " variable, or a 'wsgi.py' or 'app.py' file 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) + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) + + +def with_appcontext(f: F) -> F: + """Wraps a callback so that it's guaranteed to be executed with the + script's application context. + + Custom commands (and their options) registered under ``app.cli`` or + ``blueprint.cli`` will always have an app context available, this + decorator is not required in that case. + + .. versionchanged:: 2.2 + The app context is active for subcommands as well as the + decorated callback. The app context is always available to + ``app.cli`` command and parameter callbacks. + """ + + @click.pass_context + def decorator(ctx: click.Context, /, *args: t.Any, **kwargs: t.Any) -> t.Any: + if not current_app: + app = ctx.ensure_object(ScriptInfo).load_app() + ctx.with_resource(app.app_context()) + + return ctx.invoke(f, *args, **kwargs) + + return update_wrapper(decorator, f) # type: ignore[return-value] + + +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( # type: ignore[override] + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], click.Command]: + """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: t.Callable[..., t.Any]) -> click.Command: + if wrap_for_ctx: + f = with_appcontext(f) + return super(AppGroup, self).command(*args, **kwargs)(f) # type: ignore[no-any-return] + + return decorator + + def group( # type: ignore[override] + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], click.Group]: + """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 super().group(*args, **kwargs) # type: ignore[no-any-return] + + +def _set_app(ctx: click.Context, param: click.Option, value: str | None) -> str | None: + if value is None: + return None + + info = ctx.ensure_object(ScriptInfo) + info.app_import_path = value + return value + + +# This option is eager so the app will be available if --help is given. +# --help is also eager, so --app must be before it in the param list. +# no_args_is_help bypasses eager processing, so this option must be +# processed manually in that case to ensure FLASK_APP gets picked up. +_app_option = click.Option( + ["-A", "--app"], + metavar="IMPORT", + help=( + "The Flask application or factory function to load, in the form 'module:name'." + " Module can be a dotted import or file path. Name is not required if it is" + " 'app', 'application', 'create_app', or 'make_app', and can be 'name(args)' to" + " pass arguments." + ), + is_eager=True, + expose_value=False, + callback=_set_app, +) + + +def _set_debug(ctx: click.Context, param: click.Option, value: bool) -> bool | None: + # If the flag isn't provided, it will default to False. Don't use + # that, let debug be set by env in that case. + source = ctx.get_parameter_source(param.name) # type: ignore[arg-type] + + if source is not None and source in ( + ParameterSource.DEFAULT, + ParameterSource.DEFAULT_MAP, + ): + return None + + # Set with env var instead of ScriptInfo.load so that it can be + # accessed early during a factory function. + os.environ["FLASK_DEBUG"] = "1" if value else "0" + return value + + +_debug_option = click.Option( + ["--debug/--no-debug"], + help="Set debug mode.", + expose_value=False, + callback=_set_debug, +) + + +def _env_file_callback( + ctx: click.Context, param: click.Option, value: str | None +) -> str | None: + if value is None: + return None + + import importlib + + try: + importlib.import_module("dotenv") + except ImportError: + raise click.BadParameter( + "python-dotenv must be installed to load an env file.", + ctx=ctx, + param=param, + ) from None + + # Don't check FLASK_SKIP_DOTENV, that only disables automatically + # loading .env and .flaskenv files. + load_dotenv(value) + return value + + +# This option is eager so env vars are loaded as early as possible to be +# used by other options. +_env_file_option = click.Option( + ["-e", "--env-file"], + type=click.Path(exists=True, dir_okay=False), + help="Load environment variables from this file. python-dotenv must be installed.", + is_eager=True, + expose_value=False, + callback=_env_file_callback, +) + + +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. see :ref:`custom-scripts`. + + :param add_default_commands: if this is True then the default run and + shell commands will 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. + + .. versionchanged:: 2.2 + Added the ``-A/--app``, ``--debug/--no-debug``, ``-e/--env-file`` options. + + .. versionchanged:: 2.2 + An app context is pushed when running ``app.cli`` commands, so + ``@with_appcontext`` is no longer required for those commands. + + .. 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: bool = True, + create_app: t.Callable[..., Flask] | None = None, + add_version_option: bool = True, + load_dotenv: bool = True, + set_debug_flag: bool = True, + **extra: t.Any, + ) -> None: + params = list(extra.pop("params", None) or ()) + # Processing is done with option callbacks instead of a group + # callback. This allows users to make a custom group callback + # without losing the behavior. --env-file must come first so + # that it is eagerly evaluated before --app. + params.extend((_env_file_option, _app_option, _debug_option)) + + if add_version_option: + params.append(version_option) + + if "context_settings" not in extra: + extra["context_settings"] = {} + + extra["context_settings"].setdefault("auto_envvar_prefix", "FLASK") + + super().__init__(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) -> None: + if self._loaded_plugin_commands: + return + + if sys.version_info >= (3, 10): + from importlib import metadata + else: + # Use a backport on Python < 3.10. We technically have + # importlib.metadata on 3.8+, but the API changed in 3.10, + # so use the backport for consistency. + import importlib_metadata as metadata + + for ep in metadata.entry_points(group="flask.commands"): + self.add_command(ep.load(), ep.name) + + self._loaded_plugin_commands = True + + def get_command(self, ctx: click.Context, name: str) -> click.Command | None: + self._load_plugin_commands() + # Look up built-in and plugin commands, which should be + # available even if the app fails to load. + rv = super().get_command(ctx, name) + + if rv is not None: + return rv + + info = ctx.ensure_object(ScriptInfo) + + # Look up commands provided by the app, showing an error and + # continuing if the app couldn't be loaded. + try: + app = info.load_app() + except NoAppException as e: + click.secho(f"Error: {e.format_message()}\n", err=True, fg="red") + return None + + # Push an app context for the loaded app unless it is already + # active somehow. This makes the context available to parameter + # and command callbacks without needing @with_appcontext. + if not current_app or current_app._get_current_object() is not app: # type: ignore[attr-defined] + ctx.with_resource(app.app_context()) + + return app.cli.get_command(ctx, name) + + def list_commands(self, ctx: click.Context) -> list[str]: + self._load_plugin_commands() + # Start with the built-in and plugin commands. + rv = set(super().list_commands(ctx)) + info = ctx.ensure_object(ScriptInfo) + + # Add commands provided by the app, showing an error and + # continuing if the app couldn't be loaded. + try: + rv.update(info.load_app().cli.list_commands(ctx)) + except NoAppException as e: + # When an app couldn't be loaded, show the error message + # without the traceback. + click.secho(f"Error: {e.format_message()}\n", err=True, fg="red") + except Exception: + # When any other errors occurred during loading, show the + # full traceback. + click.secho(f"{traceback.format_exc()}\n", err=True, fg="red") + + return sorted(rv) + + def make_context( + self, + info_name: str | None, + args: list[str], + parent: click.Context | None = None, + **extra: t.Any, + ) -> click.Context: + # Set a flag to tell app.run to become a no-op. If app.run was + # not in a __name__ == __main__ guard, it would start the server + # when importing, blocking whatever command is being called. + os.environ["FLASK_RUN_FROM_CLI"] = "true" + + # Attempt to load .env and .flask env files. The --env-file + # option can cause another file to be loaded. + if get_load_dotenv(self.load_dotenv): + load_dotenv() + + if "obj" not in extra and "obj" not in self.context_settings: + extra["obj"] = ScriptInfo( + create_app=self.create_app, set_debug_flag=self.set_debug_flag + ) + + return super().make_context(info_name, args, parent=parent, **extra) + + def parse_args(self, ctx: click.Context, args: list[str]) -> list[str]: + if not args and self.no_args_is_help: + # Attempt to load --env-file and --app early in case they + # were given as env vars. Otherwise no_args_is_help will not + # see commands from app.cli. + _env_file_option.handle_parse_result(ctx, {}, []) + _app_option.handle_parse_result(ctx, {}, []) + + return super().parse_args(ctx, args) + + +def _path_is_ancestor(path: str, other: str) -> bool: + """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: str | os.PathLike[str] | None = None) -> bool: + """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. + + 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. + + .. versionchanged:: 2.0 + The current directory is not changed to the location of the + loaded file. + + .. versionchanged:: 2.0 + When loading the env files, set the default encoding to UTF-8. + + .. versionchanged:: 1.1.0 + Returns ``False`` when python-dotenv is not installed, or when + the given path isn't a file. + + .. versionadded:: 1.0 + """ + try: + import dotenv + except ImportError: + if path or os.path.isfile(".env") or os.path.isfile(".flaskenv"): + click.secho( + " * Tip: There are .env or .flaskenv files present." + ' Do "pip install python-dotenv" to use them.', + fg="yellow", + err=True, + ) + + return False + + # Always return after attempting to load a given path, don't load + # the default files. + if path is not None: + if os.path.isfile(path): + return dotenv.load_dotenv(path, encoding="utf-8") + + return False + + loaded = False + + for name in (".env", ".flaskenv"): + path = dotenv.find_dotenv(name, usecwd=True) + + if not path: + continue + + dotenv.load_dotenv(path, encoding="utf-8") + loaded = True + + return loaded # True if at least one file was located and loaded. + + +def show_server_banner(debug: bool, app_import_path: str | None) -> None: + """Show extra startup messages the first time the server is run, + ignoring the reloader. + """ + if is_running_from_reloader(): + return + + if app_import_path is not None: + click.echo(f" * Serving Flask app '{app_import_path}'") + + if debug is not None: + click.echo(f" * Debug mode: {'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) -> None: + self.path_type = click.Path(exists=True, dir_okay=False, resolve_path=True) + + def convert( + self, value: t.Any, param: click.Parameter | None, ctx: click.Context | None + ) -> t.Any: + try: + import ssl + except ImportError: + raise click.BadParameter( + 'Using "--cert" requires Python to be compiled with SSL support.', + ctx, + param, + ) from None + + try: + return self.path_type(value, param, ctx) + except click.BadParameter: + value = click.STRING(value, param, ctx).lower() + + if value == "adhoc": + try: + import cryptography # noqa: F401 + except ImportError: + raise click.BadParameter( + "Using ad-hoc certificates requires the cryptography library.", + ctx, + param, + ) from None + + return value + + obj = import_string(value, silent=True) + + if isinstance(obj, ssl.SSLContext): + return obj + + raise + + +def _validate_key(ctx: click.Context, param: click.Parameter, value: t.Any) -> t.Any: + """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" + + try: + import ssl + except ImportError: + is_context = False + 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 + + +class SeparatedPathType(click.Path): + """Click option type that accepts a list of values separated by the + OS's path separator (``:``, ``;`` on Windows). Each value is + validated as a :class:`click.Path` type. + """ + + def convert( + self, value: t.Any, param: click.Parameter | None, ctx: click.Context | None + ) -> t.Any: + items = self.split_envvar_value(value) + # can't call no-arg super() inside list comprehension until Python 3.12 + super_convert = super().convert + return [super_convert(item, param, ctx) for item in items] + + +@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.", + is_eager=True, +) +@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( + "--with-threads/--without-threads", + default=True, + help="Enable or disable multithreading.", +) +@click.option( + "--extra-files", + default=None, + type=SeparatedPathType(), + help=( + "Extra files that trigger a reload on change. Multiple paths" + f" are separated by {os.path.pathsep!r}." + ), +) +@click.option( + "--exclude-patterns", + default=None, + type=SeparatedPathType(), + help=( + "Files matching these fnmatch patterns will not trigger a reload" + " on change. Multiple patterns are separated by" + f" {os.path.pathsep!r}." + ), +) +@pass_script_info +def run_command( + info: ScriptInfo, + host: str, + port: int, + reload: bool, + debugger: bool, + with_threads: bool, + cert: ssl.SSLContext | tuple[str, str | None] | t.Literal["adhoc"] | None, + extra_files: list[str] | None, + exclude_patterns: list[str] | None, +) -> None: + """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 with the '--debug' + option. + """ + try: + app: WSGIApplication = info.load_app() + except Exception as e: + if is_running_from_reloader(): + # When reloading, print out the error immediately, but raise + # it later so the debugger or server can handle it. + traceback.print_exc() + err = e + + def app( + environ: WSGIEnvironment, start_response: StartResponse + ) -> cabc.Iterable[bytes]: + raise err from None + + else: + # When not reloading, raise the error immediately so the + # command fails. + raise e from None + + debug = get_debug_flag() + + if reload is None: + reload = debug + + if debugger is None: + debugger = debug + + show_server_banner(debug, info.app_import_path) + + run_simple( + host, + port, + app, + use_reloader=reload, + use_debugger=debugger, + threaded=with_threads, + ssl_context=cert, + extra_files=extra_files, + exclude_patterns=exclude_patterns, + ) + + +run_command.params.insert(0, _debug_option) + + +@click.command("shell", short_help="Run a shell in the app context.") +@with_appcontext +def shell_command() -> None: + """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 its configuration. + + This is useful for executing small snippets of management code + without having to manually configure the application. + """ + import code + + banner = ( + f"Python {sys.version} on {sys.platform}\n" + f"App: {current_app.import_name}\n" + f"Instance: {current_app.instance_path}" + ) + ctx: dict[str, t.Any] = {} + + # 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) as f: + eval(compile(f.read(), startup, "exec"), ctx) + + ctx.update(current_app.make_shell_context()) + + # Site, customize, or startup script can set a hook to call when + # entering interactive mode. The default one sets up readline with + # tab and history completion. + interactive_hook = getattr(sys, "__interactivehook__", None) + + if interactive_hook is not None: + try: + import readline + from rlcompleter import Completer + except ImportError: + pass + else: + # rlcompleter uses __main__.__dict__ by default, which is + # flask.__main__. Use the shell context instead. + readline.set_completer(Completer(ctx).complete) + + interactive_hook() + + 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", "domain", "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: str, all_methods: bool) -> None: + """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"} + host_matching = current_app.url_map.host_matching + has_domain = any(rule.host if host_matching else rule.subdomain for rule in rules) + rows = [] + + for rule in rules: + row = [ + rule.endpoint, + ", ".join(sorted((rule.methods or set()) - ignored_methods)), + ] + + if has_domain: + row.append((rule.host if host_matching else rule.subdomain) or "") + + row.append(rule.rule) + rows.append(row) + + headers = ["Endpoint", "Methods"] + sorts = ["endpoint", "methods"] + + if has_domain: + headers.append("Host" if host_matching else "Subdomain") + sorts.append("domain") + + headers.append("Rule") + sorts.append("rule") + + try: + rows.sort(key=itemgetter(sorts.index(sort))) + except ValueError: + pass + + rows.insert(0, headers) + widths = [max(len(row[i]) for row in rows) for i in range(len(headers))] + rows.insert(1, ["-" * w for w in widths]) + template = " ".join(f"{{{i}:<{w}}}" for i, w in enumerate(widths)) + + for row in rows: + click.echo(template.format(*row)) + + +cli = FlaskGroup( + name="flask", + help="""\ +A general utility script for Flask applications. + +An application to load must be given with the '--app' option, +'FLASK_APP' environment variable, or with a 'wsgi.py' or 'app.py' file +in the current directory. +""", +) + + +def main() -> None: + cli.main() + + +if __name__ == "__main__": + main() diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/config.py b/server-temp/venv/lib/python3.10/site-packages/flask/config.py new file mode 100644 index 00000000..f2f41478 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/flask/config.py @@ -0,0 +1,372 @@ +from __future__ import annotations + +import errno +import json +import os +import types +import typing as t + +from werkzeug.utils import import_string + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .sansio.app import App + + +T = t.TypeVar("T") + + +class ConfigAttribute(t.Generic[T]): + """Makes an attribute forward to the config""" + + def __init__( + self, name: str, get_converter: t.Callable[[t.Any], T] | None = None + ) -> None: + self.__name__ = name + self.get_converter = get_converter + + @t.overload + def __get__(self, obj: None, owner: None) -> te.Self: + ... + + @t.overload + def __get__(self, obj: App, owner: type[App]) -> T: + ... + + def __get__(self, obj: App | None, owner: type[App] | None = None) -> T | te.Self: + 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 # type: ignore[no-any-return] + + def __set__(self, obj: App, value: t.Any) -> None: + obj.config[self.__name__] = value + + +class Config(dict): # type: ignore[type-arg] + """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: str | os.PathLike[str], + defaults: dict[str, t.Any] | None = None, + ) -> None: + super().__init__(defaults or {}) + self.root_path = root_path + + def from_envvar(self, variable_name: str, silent: bool = False) -> bool: + """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: ``True`` if the file was loaded successfully. + """ + rv = os.environ.get(variable_name) + if not rv: + if silent: + return False + raise RuntimeError( + f"The environment variable {variable_name!r} is not set" + " and as such configuration could not be loaded. Set" + " this variable and make it point to a configuration" + " file" + ) + return self.from_pyfile(rv, silent=silent) + + def from_prefixed_env( + self, prefix: str = "FLASK", *, loads: t.Callable[[str], t.Any] = json.loads + ) -> bool: + """Load any environment variables that start with ``FLASK_``, + dropping the prefix from the env key for the config key. Values + are passed through a loading function to attempt to convert them + to more specific types than strings. + + Keys are loaded in :func:`sorted` order. + + The default loading function attempts to parse values as any + valid JSON type, including dicts and lists. + + Specific items in nested dicts can be set by separating the + keys with double underscores (``__``). If an intermediate key + doesn't exist, it will be initialized to an empty dict. + + :param prefix: Load env vars that start with this prefix, + separated with an underscore (``_``). + :param loads: Pass each string value to this function and use + the returned value as the config value. If any error is + raised it is ignored and the value remains a string. The + default is :func:`json.loads`. + + .. versionadded:: 2.1 + """ + prefix = f"{prefix}_" + len_prefix = len(prefix) + + for key in sorted(os.environ): + if not key.startswith(prefix): + continue + + value = os.environ[key] + + try: + value = loads(value) + except Exception: + # Keep the value as a string if loading failed. + pass + + # Change to key.removeprefix(prefix) on Python >= 3.9. + key = key[len_prefix:] + + if "__" not in key: + # A non-nested key, set directly. + self[key] = value + continue + + # Traverse nested dictionaries with keys separated by "__". + current = self + *parts, tail = key.split("__") + + for part in parts: + # If an intermediate dict does not exist, create it. + if part not in current: + current[part] = {} + + current = current[part] + + current[tail] = value + + return True + + def from_pyfile( + self, filename: str | os.PathLike[str], silent: bool = False + ) -> bool: + """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. + :return: ``True`` if the file was loaded successfully. + + .. 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 OSError as e: + if silent and e.errno in (errno.ENOENT, errno.EISDIR, errno.ENOTDIR): + return False + e.strerror = f"Unable to load configuration file ({e.strerror})" + raise + self.from_object(d) + return True + + def from_object(self, obj: object | str) -> None: + """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, str): + obj = import_string(obj) + for key in dir(obj): + if key.isupper(): + self[key] = getattr(obj, key) + + def from_file( + self, + filename: str | os.PathLike[str], + load: t.Callable[[t.IO[t.Any]], t.Mapping[str, t.Any]], + silent: bool = False, + text: bool = True, + ) -> bool: + """Update the values in the config from a file that is loaded + using the ``load`` parameter. The loaded data is passed to the + :meth:`from_mapping` method. + + .. code-block:: python + + import json + app.config.from_file("config.json", load=json.load) + + import tomllib + app.config.from_file("config.toml", load=tomllib.load, text=False) + + :param filename: The path to the data file. This can be an + absolute path or relative to the config root path. + :param load: A callable that takes a file handle and returns a + mapping of loaded data from the file. + :type load: ``Callable[[Reader], Mapping]`` where ``Reader`` + implements a ``read`` method. + :param silent: Ignore the file if it doesn't exist. + :param text: Open the file in text or binary mode. + :return: ``True`` if the file was loaded successfully. + + .. versionchanged:: 2.3 + The ``text`` parameter was added. + + .. versionadded:: 2.0 + """ + filename = os.path.join(self.root_path, filename) + + try: + with open(filename, "r" if text else "rb") as f: + obj = load(f) + except OSError as e: + if silent and e.errno in (errno.ENOENT, errno.EISDIR): + return False + + e.strerror = f"Unable to load configuration file ({e.strerror})" + raise + + return self.from_mapping(obj) + + def from_mapping( + self, mapping: t.Mapping[str, t.Any] | None = None, **kwargs: t.Any + ) -> bool: + """Updates the config like :meth:`update` ignoring items with + non-upper keys. + + :return: Always returns ``True``. + + .. versionadded:: 0.11 + """ + mappings: dict[str, t.Any] = {} + if mapping is not None: + mappings.update(mapping) + mappings.update(kwargs) + for key, value in mappings.items(): + if key.isupper(): + self[key] = value + return True + + def get_namespace( + self, namespace: str, lowercase: bool = True, trim_namespace: bool = True + ) -> dict[str, t.Any]: + """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 self.items(): + 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) -> str: + return f"<{type(self).__name__} {dict.__repr__(self)}>" diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/ctx.py b/server-temp/venv/lib/python3.10/site-packages/flask/ctx.py new file mode 100644 index 00000000..9b164d39 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/flask/ctx.py @@ -0,0 +1,449 @@ +from __future__ import annotations + +import contextvars +import sys +import typing as t +from functools import update_wrapper +from types import TracebackType + +from werkzeug.exceptions import HTTPException + +from . import typing as ft +from .globals import _cv_app +from .globals import _cv_request +from .signals import appcontext_popped +from .signals import appcontext_pushed + +if t.TYPE_CHECKING: # pragma: no cover + from _typeshed.wsgi import WSGIEnvironment + + from .app import Flask + from .sessions import SessionMixin + from .wrappers import Request + + +# a singleton sentinel value for parameter defaults +_sentinel = object() + + +class _AppCtxGlobals: + """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 + """ + + # Define attr methods to let mypy know this is a namespace object + # that has arbitrary attributes. + + def __getattr__(self, name: str) -> t.Any: + try: + return self.__dict__[name] + except KeyError: + raise AttributeError(name) from None + + def __setattr__(self, name: str, value: t.Any) -> None: + self.__dict__[name] = value + + def __delattr__(self, name: str) -> None: + try: + del self.__dict__[name] + except KeyError: + raise AttributeError(name) from None + + def get(self, name: str, default: t.Any | None = None) -> t.Any: + """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: str, default: t.Any = _sentinel) -> t.Any: + """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 raising 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: str, default: t.Any = None) -> t.Any: + """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: str) -> bool: + return item in self.__dict__ + + def __iter__(self) -> t.Iterator[str]: + return iter(self.__dict__) + + def __repr__(self) -> str: + ctx = _cv_app.get(None) + if ctx is not None: + return f"" + return object.__repr__(self) + + +def after_this_request( + f: ft.AfterRequestCallable[t.Any], +) -> ft.AfterRequestCallable[t.Any]: + """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 + """ + ctx = _cv_request.get(None) + + if ctx is None: + raise RuntimeError( + "'after_this_request' can only be used when a request" + " context is active, such as in a view function." + ) + + ctx._after_request_functions.append(f) + return f + + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) + + +def copy_current_request_context(f: F) -> 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. The current session is also + included in the copied request context. + + 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 or + # flask.session like you would otherwise in the view function. + ... + gevent.spawn(do_some_work) + return 'Regular response' + + .. versionadded:: 0.10 + """ + ctx = _cv_request.get(None) + + if ctx is None: + raise RuntimeError( + "'copy_current_request_context' can only be used when a" + " request context is active, such as in a view function." + ) + + ctx = ctx.copy() + + def wrapper(*args: t.Any, **kwargs: t.Any) -> t.Any: + with ctx: # type: ignore[union-attr] + return ctx.app.ensure_sync(f)(*args, **kwargs) # type: ignore[union-attr] + + return update_wrapper(wrapper, f) # type: ignore[return-value] + + +def has_request_context() -> bool: + """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 _cv_request.get(None) is not None + + +def has_app_context() -> bool: + """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 _cv_app.get(None) is not None + + +class AppContext: + """The app context contains application-specific information. An app + context is created and pushed at the beginning of each request if + one is not already active. An app context is also pushed when + running CLI commands. + """ + + def __init__(self, app: Flask) -> None: + self.app = app + self.url_adapter = app.create_url_adapter(None) + self.g: _AppCtxGlobals = app.app_ctx_globals_class() + self._cv_tokens: list[contextvars.Token[AppContext]] = [] + + def push(self) -> None: + """Binds the app context to the current context.""" + self._cv_tokens.append(_cv_app.set(self)) + appcontext_pushed.send(self.app, _async_wrapper=self.app.ensure_sync) + + def pop(self, exc: BaseException | None = _sentinel) -> None: # type: ignore + """Pops the app context.""" + try: + if len(self._cv_tokens) == 1: + if exc is _sentinel: + exc = sys.exc_info()[1] + self.app.do_teardown_appcontext(exc) + finally: + ctx = _cv_app.get() + _cv_app.reset(self._cv_tokens.pop()) + + if ctx is not self: + raise AssertionError( + f"Popped wrong app context. ({ctx!r} instead of {self!r})" + ) + + appcontext_popped.send(self.app, _async_wrapper=self.app.ensure_sync) + + def __enter__(self) -> AppContext: + self.push() + return self + + def __exit__( + self, + exc_type: type | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.pop(exc_value) + + +class RequestContext: + """The request context contains per-request information. The Flask + app creates and pushes it at the beginning of the request, then pops + it at the end of the request. 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. When using the interactive debugger, the context will be + restored so ``request`` is still accessible. Similarly, the test + client can preserve the context after the request ends. However, + teardown functions may already have closed some resources such as + database connections. + """ + + def __init__( + self, + app: Flask, + environ: WSGIEnvironment, + request: Request | None = None, + session: SessionMixin | None = None, + ) -> None: + self.app = app + if request is None: + request = app.request_class(environ) + request.json_module = app.json + self.request: Request = request + self.url_adapter = None + try: + self.url_adapter = app.create_url_adapter(self.request) + except HTTPException as e: + self.request.routing_exception = e + self.flashes: list[tuple[str, str]] | None = None + self.session: SessionMixin | None = session + # 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: list[ft.AfterRequestCallable[t.Any]] = [] + + self._cv_tokens: list[ + tuple[contextvars.Token[RequestContext], AppContext | None] + ] = [] + + def copy(self) -> RequestContext: + """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 + + .. versionchanged:: 1.1 + The current session object is used instead of reloading the original + data. This prevents `flask.session` pointing to an out-of-date object. + """ + return self.__class__( + self.app, + environ=self.request.environ, + request=self.request, + session=self.session, + ) + + def match_request(self) -> None: + """Can be overridden by a subclass to hook into the matching + of the request. + """ + try: + result = self.url_adapter.match(return_rule=True) # type: ignore + self.request.url_rule, self.request.view_args = result # type: ignore + except HTTPException as e: + self.request.routing_exception = e + + def push(self) -> None: + # Before we push the request context we have to ensure that there + # is an application context. + app_ctx = _cv_app.get(None) + + if app_ctx is None or app_ctx.app is not self.app: + app_ctx = self.app.app_context() + app_ctx.push() + else: + app_ctx = None + + self._cv_tokens.append((_cv_request.set(self), app_ctx)) + + # 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) + + # Match the request URL after loading the session, so that the + # session is available in custom URL converters. + if self.url_adapter is not None: + self.match_request() + + def pop(self, exc: BaseException | None = _sentinel) -> None: # type: ignore + """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. + """ + clear_request = len(self._cv_tokens) == 1 + + try: + if clear_request: + if exc is _sentinel: + exc = sys.exc_info()[1] + self.app.do_teardown_request(exc) + + request_close = getattr(self.request, "close", None) + if request_close is not None: + request_close() + finally: + ctx = _cv_request.get() + token, app_ctx = self._cv_tokens.pop() + _cv_request.reset(token) + + # 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: + ctx.request.environ["werkzeug.request"] = None + + if app_ctx is not None: + app_ctx.pop(exc) + + if ctx is not self: + raise AssertionError( + f"Popped wrong request context. ({ctx!r} instead of {self!r})" + ) + + def __enter__(self) -> RequestContext: + self.push() + return self + + def __exit__( + self, + exc_type: type | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.pop(exc_value) + + def __repr__(self) -> str: + return ( + f"<{type(self).__name__} {self.request.url!r}" + f" [{self.request.method}] of {self.app.name}>" + ) diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/debughelpers.py b/server-temp/venv/lib/python3.10/site-packages/flask/debughelpers.py new file mode 100644 index 00000000..2c8c4c48 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/flask/debughelpers.py @@ -0,0 +1,178 @@ +from __future__ import annotations + +import typing as t + +from jinja2.loaders import BaseLoader +from werkzeug.routing import RequestRedirect + +from .blueprints import Blueprint +from .globals import request_ctx +from .sansio.app import App + +if t.TYPE_CHECKING: + from .sansio.scaffold import Scaffold + from .wrappers import Request + + +class UnexpectedUnicodeError(AssertionError, UnicodeError): + """Raised in places where we want some better error reporting for + unexpected unicode or binary data. + """ + + +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: Request, key: str) -> None: + form_matches = request.form.getlist(key) + buf = [ + f"You tried to access the file {key!r} in the request.files" + " dictionary but it does not exist. The mimetype for the" + f" request is {request.mimetype!r} 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.' + ] + if form_matches: + names = ", ".join(repr(x) for x in form_matches) + buf.append( + "\n\nThe browser instead transmitted some file names. " + f"This was submitted: {names}" + ) + self.msg = "".join(buf) + + def __str__(self) -> str: + return self.msg + + +class FormDataRoutingRedirect(AssertionError): + """This exception is raised in debug mode if a routing redirect + would cause the browser to drop the method or body. This happens + when method is not GET, HEAD or OPTIONS and the status code is not + 307 or 308. + """ + + def __init__(self, request: Request) -> None: + exc = request.routing_exception + assert isinstance(exc, RequestRedirect) + buf = [ + f"A request was sent to '{request.url}', but routing issued" + f" a redirect to the canonical URL '{exc.new_url}'." + ] + + if f"{request.base_url}/" == exc.new_url.partition("?")[0]: + buf.append( + " The URL was defined with a trailing slash. Flask" + " will redirect to the URL with a trailing slash if it" + " was accessed without one." + ) + + buf.append( + " Send requests to the canonical URL, or use 307 or 308 for" + " routing redirects. Otherwise, browsers will drop form" + " data.\n\n" + "This exception is only raised in debug mode." + ) + super().__init__("".join(buf)) + + +def attach_enctype_error_multidict(request: Request) -> None: + """Patch ``request.files.__getitem__`` to raise a descriptive error + about ``enctype=multipart/form-data``. + + :param request: The request to patch. + :meta private: + """ + oldcls = request.files.__class__ + + class newcls(oldcls): # type: ignore[valid-type, misc] + def __getitem__(self, key: str) -> t.Any: + try: + return super().__getitem__(key) + except KeyError as e: + if key not in request.form: + raise + + raise DebugFilesKeyError(request, key).with_traceback( + e.__traceback__ + ) from None + + newcls.__name__ = oldcls.__name__ + newcls.__module__ = oldcls.__module__ + request.files.__class__ = newcls + + +def _dump_loader_info(loader: BaseLoader) -> t.Iterator[str]: + yield f"class: {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) for x in value): + continue + yield f"{key}:" + for item in value: + yield f" - {item}" + continue + elif not isinstance(value, (str, int, float, bool)): + continue + yield f"{key}: {value!r}" + + +def explain_template_loading_attempts( + app: App, + template: str, + attempts: list[ + tuple[ + BaseLoader, + Scaffold, + tuple[str, str | None, t.Callable[[], bool] | None] | None, + ] + ], +) -> None: + """This should help developers understand what failed""" + info = [f"Locating template {template!r}:"] + total_found = 0 + blueprint = None + if request_ctx and request_ctx.request.blueprint is not None: + blueprint = request_ctx.request.blueprint + + for idx, (loader, srcobj, triple) in enumerate(attempts): + if isinstance(srcobj, App): + src_info = f"application {srcobj.import_name!r}" + elif isinstance(srcobj, Blueprint): + src_info = f"blueprint {srcobj.name!r} ({srcobj.import_name})" + else: + src_info = repr(srcobj) + + info.append(f"{idx + 1:5}: trying loader of {src_info}") + + for line in _dump_loader_info(loader): + info.append(f" {line}") + + if triple is None: + detail = "no match" + else: + detail = f"found ({triple[1] or ''!r})" + total_found += 1 + info.append(f" -> {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" + f" to the blueprint {blueprint!r}." + ) + info.append(" Maybe you did not place a template in the right folder?") + info.append(" See https://flask.palletsprojects.com/blueprints/#templates") + + app.logger.info("\n".join(info)) diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/globals.py b/server-temp/venv/lib/python3.10/site-packages/flask/globals.py new file mode 100644 index 00000000..e2c410cc --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/flask/globals.py @@ -0,0 +1,51 @@ +from __future__ import annotations + +import typing as t +from contextvars import ContextVar + +from werkzeug.local import LocalProxy + +if t.TYPE_CHECKING: # pragma: no cover + from .app import Flask + from .ctx import _AppCtxGlobals + from .ctx import AppContext + from .ctx import RequestContext + from .sessions import SessionMixin + from .wrappers import Request + + +_no_app_msg = """\ +Working outside of application context. + +This typically means that you attempted to use functionality that needed +the current application. To solve this, set up an application context +with app.app_context(). See the documentation for more information.\ +""" +_cv_app: ContextVar[AppContext] = ContextVar("flask.app_ctx") +app_ctx: AppContext = LocalProxy( # type: ignore[assignment] + _cv_app, unbound_message=_no_app_msg +) +current_app: Flask = LocalProxy( # type: ignore[assignment] + _cv_app, "app", unbound_message=_no_app_msg +) +g: _AppCtxGlobals = LocalProxy( # type: ignore[assignment] + _cv_app, "g", unbound_message=_no_app_msg +) + +_no_req_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.\ +""" +_cv_request: ContextVar[RequestContext] = ContextVar("flask.request_ctx") +request_ctx: RequestContext = LocalProxy( # type: ignore[assignment] + _cv_request, unbound_message=_no_req_msg +) +request: Request = LocalProxy( # type: ignore[assignment] + _cv_request, "request", unbound_message=_no_req_msg +) +session: SessionMixin = LocalProxy( # type: ignore[assignment] + _cv_request, "session", unbound_message=_no_req_msg +) diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/helpers.py b/server-temp/venv/lib/python3.10/site-packages/flask/helpers.py new file mode 100644 index 00000000..359a842a --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/flask/helpers.py @@ -0,0 +1,621 @@ +from __future__ import annotations + +import importlib.util +import os +import sys +import typing as t +from datetime import datetime +from functools import lru_cache +from functools import update_wrapper + +import werkzeug.utils +from werkzeug.exceptions import abort as _wz_abort +from werkzeug.utils import redirect as _wz_redirect +from werkzeug.wrappers import Response as BaseResponse + +from .globals import _cv_request +from .globals import current_app +from .globals import request +from .globals import request_ctx +from .globals import session +from .signals import message_flashed + +if t.TYPE_CHECKING: # pragma: no cover + from .wrappers import Response + + +def get_debug_flag() -> bool: + """Get whether debug mode should be enabled for the app, indicated by the + :envvar:`FLASK_DEBUG` environment variable. The default is ``False``. + """ + val = os.environ.get("FLASK_DEBUG") + return bool(val and val.lower() not in {"0", "false", "no"}) + + +def get_load_dotenv(default: bool = True) -> bool: + """Get whether the user has disabled loading default 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 stream_with_context( + generator_or_function: t.Iterator[t.AnyStr] | t.Callable[..., t.Iterator[t.AnyStr]], +) -> t.Iterator[t.AnyStr]: + """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) # type: ignore[arg-type] + except TypeError: + + def decorator(*args: t.Any, **kwargs: t.Any) -> t.Any: + gen = generator_or_function(*args, **kwargs) # type: ignore[operator] + return stream_with_context(gen) + + return update_wrapper(decorator, generator_or_function) # type: ignore[arg-type] + + def generator() -> t.Iterator[t.AnyStr | None]: + ctx = _cv_request.get(None) + if ctx is None: + raise RuntimeError( + "'stream_with_context' can only be used when a request" + " context is active, such as in a view function." + ) + 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: + yield from gen + 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 # type: ignore[return-value] + + +def make_response(*args: t.Any) -> Response: + """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: str, + *, + _anchor: str | None = None, + _method: str | None = None, + _scheme: str | None = None, + _external: bool | None = None, + **values: t.Any, +) -> str: + """Generate a URL to the given endpoint with the given values. + + This requires an active request or application context, and calls + :meth:`current_app.url_for() `. See that method + for full documentation. + + :param endpoint: The endpoint name associated with the URL to + generate. If this starts with a ``.``, the current blueprint + name (if any) will be used. + :param _anchor: If given, append this as ``#anchor`` to the URL. + :param _method: If given, generate the URL associated with this + method for the endpoint. + :param _scheme: If given, the URL will have this scheme if it is + external. + :param _external: If given, prefer the URL to be internal (False) or + require it to be external (True). External URLs include the + scheme and domain. When not in an active request, URLs are + external by default. + :param values: Values to use for the variable parts of the URL rule. + Unknown keys are appended as query string arguments, like + ``?a=b&c=d``. + + .. versionchanged:: 2.2 + Calls ``current_app.url_for``, allowing an app to override the + behavior. + + .. versionchanged:: 0.10 + The ``_scheme`` parameter was added. + + .. versionchanged:: 0.9 + The ``_anchor`` and ``_method`` parameters were added. + + .. versionchanged:: 0.9 + Calls ``app.handle_url_build_error`` on build errors. + """ + return current_app.url_for( + endpoint, + _anchor=_anchor, + _method=_method, + _scheme=_scheme, + _external=_external, + **values, + ) + + +def redirect( + location: str, code: int = 302, Response: type[BaseResponse] | None = None +) -> BaseResponse: + """Create a redirect response object. + + If :data:`~flask.current_app` is available, it will use its + :meth:`~flask.Flask.redirect` method, otherwise it will use + :func:`werkzeug.utils.redirect`. + + :param location: The URL to redirect to. + :param code: The status code for the redirect. + :param Response: The response class to use. Not used when + ``current_app`` is active, which uses ``app.response_class``. + + .. versionadded:: 2.2 + Calls ``current_app.redirect`` if available instead of always + using Werkzeug's default ``redirect``. + """ + if current_app: + return current_app.redirect(location, code=code) + + return _wz_redirect(location, code=code, Response=Response) + + +def abort(code: int | BaseResponse, *args: t.Any, **kwargs: t.Any) -> t.NoReturn: + """Raise an :exc:`~werkzeug.exceptions.HTTPException` for the given + status code. + + If :data:`~flask.current_app` is available, it will call its + :attr:`~flask.Flask.aborter` object, otherwise it will use + :func:`werkzeug.exceptions.abort`. + + :param code: The status code for the exception, which must be + registered in ``app.aborter``. + :param args: Passed to the exception. + :param kwargs: Passed to the exception. + + .. versionadded:: 2.2 + Calls ``current_app.aborter`` if available instead of always + using Werkzeug's default ``abort``. + """ + if current_app: + current_app.aborter(code, *args, **kwargs) + + _wz_abort(code, *args, **kwargs) + + +def get_template_attribute(template_name: str, attribute: str) -> t.Any: + """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: str, category: str = "message") -> None: + """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 + app = current_app._get_current_object() # type: ignore + message_flashed.send( + app, + _async_wrapper=app.ensure_sync, + message=message, + category=category, + ) + + +def get_flashed_messages( + with_categories: bool = False, category_filter: t.Iterable[str] = () +) -> list[str] | list[tuple[str, str]]: + """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 :doc:`/patterns/flashing` 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: filter of categories to limit return values. Only + categories in the list will be returned. + """ + flashes = request_ctx.flashes + if flashes is None: + flashes = session.pop("_flashes") if "_flashes" in session else [] + request_ctx.flashes = flashes + 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 _prepare_send_file_kwargs(**kwargs: t.Any) -> dict[str, t.Any]: + if kwargs.get("max_age") is None: + kwargs["max_age"] = current_app.get_send_file_max_age + + kwargs.update( + environ=request.environ, + use_x_sendfile=current_app.config["USE_X_SENDFILE"], + response_class=current_app.response_class, + _root_path=current_app.root_path, # type: ignore + ) + return kwargs + + +def send_file( + path_or_file: os.PathLike[t.AnyStr] | str | t.BinaryIO, + mimetype: str | None = None, + as_attachment: bool = False, + download_name: str | None = None, + conditional: bool = True, + etag: bool | str = True, + last_modified: datetime | int | float | None = None, + max_age: None | (int | t.Callable[[str | None], int | None]) = None, +) -> Response: + """Send the contents of a file to the client. + + The first argument can be a file path or a file-like object. Paths + are preferred in most cases because Werkzeug can manage the file and + get extra information from the path. Passing a file-like object + requires that the file is opened in binary mode, and is mostly + useful when building a file in memory with :class:`io.BytesIO`. + + Never pass file paths provided by a user. The path is assumed to be + trusted, so a user could craft a path to access a file you didn't + intend. Use :func:`send_from_directory` to safely serve + user-requested paths from within a directory. + + If the WSGI server sets a ``file_wrapper`` in ``environ``, it is + used, otherwise Werkzeug's built-in wrapper is used. Alternatively, + if the HTTP server supports ``X-Sendfile``, configuring Flask with + ``USE_X_SENDFILE = True`` will tell the server to send the given + path, which is much more efficient than reading it in Python. + + :param path_or_file: The path to the file to send, relative to the + current working directory if a relative path is given. + Alternatively, a file-like object opened in binary mode. Make + sure the file pointer is seeked to the start of the data. + :param mimetype: The MIME type to send for the file. If not + provided, it will try to detect it from the file name. + :param as_attachment: Indicate to a browser that it should offer to + save the file instead of displaying it. + :param download_name: The default name browsers will use when saving + the file. Defaults to the passed file name. + :param conditional: Enable conditional and range responses based on + request headers. Requires passing a file path and ``environ``. + :param etag: Calculate an ETag for the file, which requires passing + a file path. Can also be a string to use instead. + :param last_modified: The last modified time to send for the file, + in seconds. If not provided, it will try to detect it from the + file path. + :param max_age: How long the client should cache the file, in + seconds. If set, ``Cache-Control`` will be ``public``, otherwise + it will be ``no-cache`` to prefer conditional caching. + + .. versionchanged:: 2.0 + ``download_name`` replaces the ``attachment_filename`` + parameter. If ``as_attachment=False``, it is passed with + ``Content-Disposition: inline`` instead. + + .. versionchanged:: 2.0 + ``max_age`` replaces the ``cache_timeout`` parameter. + ``conditional`` is enabled and ``max_age`` is not set by + default. + + .. versionchanged:: 2.0 + ``etag`` replaces the ``add_etags`` parameter. It can be a + string to use instead of generating one. + + .. versionchanged:: 2.0 + Passing a file-like object that inherits from + :class:`~io.TextIOBase` will raise a :exc:`ValueError` rather + than sending an empty file. + + .. versionadded:: 2.0 + Moved the implementation to Werkzeug. This is now a wrapper to + pass some Flask-specific arguments. + + .. versionchanged:: 1.1 + ``filename`` may be a :class:`~os.PathLike` object. + + .. versionchanged:: 1.1 + Passing a :class:`~io.BytesIO` object supports range requests. + + .. versionchanged:: 1.0.3 + Filenames are encoded with ASCII instead of Latin-1 for broader + compatibility with WSGI servers. + + .. versionchanged:: 1.0 + UTF-8 filenames as specified in :rfc:`2231` are supported. + + .. versionchanged:: 0.12 + The filename is no longer automatically inferred from file + objects. If you want to use automatic MIME and etag support, + pass a filename via ``filename_or_fp`` or + ``attachment_filename``. + + .. versionchanged:: 0.12 + ``attachment_filename`` is preferred over ``filename`` for MIME + detection. + + .. versionchanged:: 0.9 + ``cache_timeout`` defaults to + :meth:`Flask.get_send_file_max_age`. + + .. versionchanged:: 0.7 + MIME guessing and etag support for file-like objects was + removed because it was unreliable. Pass a filename if you are + able to, otherwise attach an etag yourself. + + .. versionchanged:: 0.5 + The ``add_etags``, ``cache_timeout`` and ``conditional`` + parameters were added. The default behavior is to add etags. + + .. versionadded:: 0.2 + """ + return werkzeug.utils.send_file( # type: ignore[return-value] + **_prepare_send_file_kwargs( + path_or_file=path_or_file, + environ=request.environ, + mimetype=mimetype, + as_attachment=as_attachment, + download_name=download_name, + conditional=conditional, + etag=etag, + last_modified=last_modified, + max_age=max_age, + ) + ) + + +def send_from_directory( + directory: os.PathLike[str] | str, + path: os.PathLike[str] | str, + **kwargs: t.Any, +) -> Response: + """Send a file from within a directory using :func:`send_file`. + + .. code-block:: python + + @app.route("/uploads/") + def download_file(name): + return send_from_directory( + app.config['UPLOAD_FOLDER'], name, as_attachment=True + ) + + This is a secure way to serve files from a folder, such as static + files or uploads. Uses :func:`~werkzeug.security.safe_join` to + ensure the path coming from the client is not maliciously crafted to + point outside the specified directory. + + If the final path does not point to an existing regular file, + raises a 404 :exc:`~werkzeug.exceptions.NotFound` error. + + :param directory: The directory that ``path`` must be located under, + relative to the current application's root path. + :param path: The path to the file to send, relative to + ``directory``. + :param kwargs: Arguments to pass to :func:`send_file`. + + .. versionchanged:: 2.0 + ``path`` replaces the ``filename`` parameter. + + .. versionadded:: 2.0 + Moved the implementation to Werkzeug. This is now a wrapper to + pass some Flask-specific arguments. + + .. versionadded:: 0.5 + """ + return werkzeug.utils.send_from_directory( # type: ignore[return-value] + directory, path, **_prepare_send_file_kwargs(**kwargs) + ) + + +def get_root_path(import_name: str) -> str: + """Find the root path of a package, or the path that contains a + module. If it cannot be found, returns the current working + directory. + + Not to be confused with the value returned by :func:`find_package`. + + :meta private: + """ + # 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__") and mod.__file__ is not None: + return os.path.dirname(os.path.abspath(mod.__file__)) + + # Next attempt: check the loader. + try: + spec = importlib.util.find_spec(import_name) + + if spec is None: + raise ValueError + except (ImportError, ValueError): + loader = None + else: + loader = spec.loader + + # 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: + return os.getcwd() + + 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 file path it might be because it is a + # namespace package. In this case pick the root path from the + # first module that is contained in the package. + if filepath is None: + raise RuntimeError( + "No root path can be found for the provided module" + f" {import_name!r}. 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." + ) + + # filepath is import_name.py for a module, or __init__.py for a package. + return os.path.dirname(os.path.abspath(filepath)) # type: ignore[no-any-return] + + +@lru_cache(maxsize=None) +def _split_blueprint_path(name: str) -> list[str]: + out: list[str] = [name] + + if "." in name: + out.extend(_split_blueprint_path(name.rpartition(".")[0])) + + return out diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/json/__init__.py b/server-temp/venv/lib/python3.10/site-packages/flask/json/__init__.py new file mode 100644 index 00000000..c0941d04 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/flask/json/__init__.py @@ -0,0 +1,170 @@ +from __future__ import annotations + +import json as _json +import typing as t + +from ..globals import current_app +from .provider import _default + +if t.TYPE_CHECKING: # pragma: no cover + from ..wrappers import Response + + +def dumps(obj: t.Any, **kwargs: t.Any) -> str: + """Serialize data as JSON. + + If :data:`~flask.current_app` is available, it will use its + :meth:`app.json.dumps() ` + method, otherwise it will use :func:`json.dumps`. + + :param obj: The data to serialize. + :param kwargs: Arguments passed to the ``dumps`` implementation. + + .. versionchanged:: 2.3 + The ``app`` parameter was removed. + + .. versionchanged:: 2.2 + Calls ``current_app.json.dumps``, allowing an app to override + the behavior. + + .. versionchanged:: 2.0.2 + :class:`decimal.Decimal` is supported by converting to a string. + + .. versionchanged:: 2.0 + ``encoding`` will be removed in Flask 2.1. + + .. versionchanged:: 1.0.3 + ``app`` can be passed directly, rather than requiring an app + context for configuration. + """ + if current_app: + return current_app.json.dumps(obj, **kwargs) + + kwargs.setdefault("default", _default) + return _json.dumps(obj, **kwargs) + + +def dump(obj: t.Any, fp: t.IO[str], **kwargs: t.Any) -> None: + """Serialize data as JSON and write to a file. + + If :data:`~flask.current_app` is available, it will use its + :meth:`app.json.dump() ` + method, otherwise it will use :func:`json.dump`. + + :param obj: The data to serialize. + :param fp: A file opened for writing text. Should use the UTF-8 + encoding to be valid JSON. + :param kwargs: Arguments passed to the ``dump`` implementation. + + .. versionchanged:: 2.3 + The ``app`` parameter was removed. + + .. versionchanged:: 2.2 + Calls ``current_app.json.dump``, allowing an app to override + the behavior. + + .. versionchanged:: 2.0 + Writing to a binary file, and the ``encoding`` argument, will be + removed in Flask 2.1. + """ + if current_app: + current_app.json.dump(obj, fp, **kwargs) + else: + kwargs.setdefault("default", _default) + _json.dump(obj, fp, **kwargs) + + +def loads(s: str | bytes, **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON. + + If :data:`~flask.current_app` is available, it will use its + :meth:`app.json.loads() ` + method, otherwise it will use :func:`json.loads`. + + :param s: Text or UTF-8 bytes. + :param kwargs: Arguments passed to the ``loads`` implementation. + + .. versionchanged:: 2.3 + The ``app`` parameter was removed. + + .. versionchanged:: 2.2 + Calls ``current_app.json.loads``, allowing an app to override + the behavior. + + .. versionchanged:: 2.0 + ``encoding`` will be removed in Flask 2.1. The data must be a + string or UTF-8 bytes. + + .. versionchanged:: 1.0.3 + ``app`` can be passed directly, rather than requiring an app + context for configuration. + """ + if current_app: + return current_app.json.loads(s, **kwargs) + + return _json.loads(s, **kwargs) + + +def load(fp: t.IO[t.AnyStr], **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON read from a file. + + If :data:`~flask.current_app` is available, it will use its + :meth:`app.json.load() ` + method, otherwise it will use :func:`json.load`. + + :param fp: A file opened for reading text or UTF-8 bytes. + :param kwargs: Arguments passed to the ``load`` implementation. + + .. versionchanged:: 2.3 + The ``app`` parameter was removed. + + .. versionchanged:: 2.2 + Calls ``current_app.json.load``, allowing an app to override + the behavior. + + .. versionchanged:: 2.2 + The ``app`` parameter will be removed in Flask 2.3. + + .. versionchanged:: 2.0 + ``encoding`` will be removed in Flask 2.1. The file must be text + mode, or binary mode with UTF-8 bytes. + """ + if current_app: + return current_app.json.load(fp, **kwargs) + + return _json.load(fp, **kwargs) + + +def jsonify(*args: t.Any, **kwargs: t.Any) -> Response: + """Serialize the given arguments as JSON, and return a + :class:`~flask.Response` object with the ``application/json`` + mimetype. A dict or list returned from a view will be converted to a + JSON response automatically without needing to call this. + + This requires an active request or application context, and calls + :meth:`app.json.response() `. + + In debug mode, the output is formatted with indentation to make it + easier to read. This may also be controlled by the provider. + + Either positional or keyword arguments can be given, not both. + If no arguments are given, ``None`` is serialized. + + :param args: A single value to serialize, or multiple values to + treat as a list to serialize. + :param kwargs: Treat as a dict to serialize. + + .. versionchanged:: 2.2 + Calls ``current_app.json.response``, allowing an app to override + the behavior. + + .. versionchanged:: 2.0.2 + :class:`decimal.Decimal` is supported by converting to a string. + + .. versionchanged:: 0.11 + Added support for serializing top-level arrays. This was a + security risk in ancient browsers. See :ref:`security-json`. + + .. versionadded:: 0.2 + """ + return current_app.json.response(*args, **kwargs) # type: ignore[return-value] diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/json/__pycache__/__init__.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/flask/json/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..649fb9c68299438e77ee5080566b3d469c2854cc GIT binary patch literal 6031 zcmd5=&2t+`71v0ztSGj#>kXTaCD~?|1EQRfod89two+sh2f`N47Iuol6s2jYTlU!V zMfXTTl#3H54*U&JaN%E?Bb;*P<`ciyJu_Bp+2y3XTTzvyp6Tw_@4bHS_dep~EmKXO)Vhk1!Aw;RKb?*>xNmSA*(q&HUGQ7er0egGRWxyNJ03 z(FmI1wcTq@MJ^n))aRI846cVuyGxk;R4j{?ztne^1rw{{BaBwW_r%BI7DhM3XX1{y zi_r(-b8%1H$LK>*-LAC1|C;z}JK1#}MRCegKaTX)>uUaTFj7iJX^$t#YsbE8_Jkbr zQIKL&^Vd=**dVi7+&?&8NZlvVG;17AxZ2ZML&g)IpdoB za{J|$+iEd6|0i!~Of`%+DOL;vKg?r;qV`51E={w9Yb^!C4xGz8&#>e{ z>@W!=Eiu=fALhDjES1Ln5B7PqCq=i*9=ear38YD4z#~O~fH_d6Qn3lttz;OFrMQsJ z!;;QZ9t0YcW-ekzwVt=eupplJ(H`Rw!+FF%=qm*smsCigzTD?yKUNnWyzZVH-5tOL zbk`Gd;Dk2nVLb0}kg528{8==aj5@o{R>uzy@f_7*t;t zI%0mro|7FywHp`E+i=%sR9~ol0EK{7eyze+a*zhoHKsV!p>WBVSMm=dpSaDnSF#0} zQu)V}4P!;}4gI|l_Tjp%5oL>oTQ?N>W>zPA%odEzWGyYzd|owZcA-bp?W$_xNfFxp zyP{U{cRcO9f_>_a=3(bqJg}xXGy3vXXY=Wg*MHP`?ngX;yBs`MU~MxJ9qfbJJ7XD* zJAvQtBvZIe^vK;GgYGSJX$xUae zy6Tv>S#_8kUrXH=FMo%-{C!s6iX%B794bBp$t5Ozi3ecPjRKR7oM9EHR3%gb)B-q< zs;80Z?3#9sJLlpPu1Bzmf>_qXhJGM(gZL&e>(Y?*PKfnxfHh12R*VE^aUvtQ9@!@8 z#5f*|)n(iJ@hA`mlF8*??L2?*)6%31KO+soFUE)hA_sp$tQD#tK3q~w&6NO#VW6b*H}DLB-FWm`fovtAJPMpbIJyT#KDpJlxT03@kktuR)CU+E zI8h&B)UH`Dxk+ycQ4F5gpO5JA7JfSTTKB$n7w&!AF>fB)D)r#JY~z1F z#QyWLjkI>7{3AZ!+xTahyJD|BsR?%Gmo-!e&QIGP zU68gvbk|EqeoHtoX;1+Nl&F`4!dRd<1u*B)nVu1S)BUqZ{f2ASNppo~o*Pu}!LI^* zt!Lggo=NYrI@R!M5yJt#<)^6KUsCN(34f6zpH%H|(+sKfc2T98EMm_`TF;8~0d==6 z(`}kz8wEKE7FAkauoo=`kLq9)JXUm@n4mfg{DG-rOf}%;<+hK4dzwfW>80?o1b(_ zH<29-^MXu5Vu(LTp$79xf*r6mBLOi$7jIQUwC1-U3VtpHLB-<71*E))n2`O^9zspC*iC$SPUc9Pe;#(dToT2!o$E{aV|P$)%6 zTg!e2SCZumJ&!6p0yTZoE-6|Rd0{{XP8Em-ilPQV`7koYSefh@uM5%Y^3gA`^BN+T zo|!`Slq{KB^MW?Yy>nBios$j5F5lc>=+2Ar4`+H9=eAFZo4)#5VdnJ0H?O{fvhHqd zl!|>K1neen$(X9J(5ne}aq=LLV;SJ;6`$(d`luB(lSfH3nEZ6gl#gx;+AcgA_^@Wy zSMdbYuxndN)>U%Y^>n`Y0ksqgPdT{>PVAr^R`ilksZguHWHJOuUi+e%b2MX9OQnT=S+csL> z`R&)6y{Es}eEQXkt)K5UCkgjt`?*AWI!_;d4 literal 0 HcmV?d00001 diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/json/__pycache__/provider.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/flask/json/__pycache__/provider.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5171e61655c2abf7b6cc075ca9d069b91ef00918 GIT binary patch literal 7723 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 to an instance of the class. + + :param app: An application instance. This will be stored as a + :class:`weakref.proxy` on the :attr:`_app` attribute. + + .. versionadded:: 2.2 + """ + + def __init__(self, app: App) -> None: + self._app: App = weakref.proxy(app) + + def dumps(self, obj: t.Any, **kwargs: t.Any) -> str: + """Serialize data as JSON. + + :param obj: The data to serialize. + :param kwargs: May be passed to the underlying JSON library. + """ + raise NotImplementedError + + def dump(self, obj: t.Any, fp: t.IO[str], **kwargs: t.Any) -> None: + """Serialize data as JSON and write to a file. + + :param obj: The data to serialize. + :param fp: A file opened for writing text. Should use the UTF-8 + encoding to be valid JSON. + :param kwargs: May be passed to the underlying JSON library. + """ + fp.write(self.dumps(obj, **kwargs)) + + def loads(self, s: str | bytes, **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON. + + :param s: Text or UTF-8 bytes. + :param kwargs: May be passed to the underlying JSON library. + """ + raise NotImplementedError + + def load(self, fp: t.IO[t.AnyStr], **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON read from a file. + + :param fp: A file opened for reading text or UTF-8 bytes. + :param kwargs: May be passed to the underlying JSON library. + """ + return self.loads(fp.read(), **kwargs) + + def _prepare_response_obj( + self, args: tuple[t.Any, ...], kwargs: dict[str, t.Any] + ) -> t.Any: + if args and kwargs: + raise TypeError("app.json.response() takes either args or kwargs, not both") + + if not args and not kwargs: + return None + + if len(args) == 1: + return args[0] + + return args or kwargs + + def response(self, *args: t.Any, **kwargs: t.Any) -> Response: + """Serialize the given arguments as JSON, and return a + :class:`~flask.Response` object with the ``application/json`` + mimetype. + + The :func:`~flask.json.jsonify` function calls this method for + the current application. + + Either positional or keyword arguments can be given, not both. + If no arguments are given, ``None`` is serialized. + + :param args: A single value to serialize, or multiple values to + treat as a list to serialize. + :param kwargs: Treat as a dict to serialize. + """ + obj = self._prepare_response_obj(args, kwargs) + return self._app.response_class(self.dumps(obj), mimetype="application/json") + + +def _default(o: t.Any) -> t.Any: + if isinstance(o, date): + return http_date(o) + + if isinstance(o, (decimal.Decimal, uuid.UUID)): + return str(o) + + if dataclasses and dataclasses.is_dataclass(o): + return dataclasses.asdict(o) + + if hasattr(o, "__html__"): + return str(o.__html__()) + + raise TypeError(f"Object of type {type(o).__name__} is not JSON serializable") + + +class DefaultJSONProvider(JSONProvider): + """Provide JSON operations using Python's built-in :mod:`json` + library. Serializes the following additional data types: + + - :class:`datetime.datetime` and :class:`datetime.date` are + serialized to :rfc:`822` strings. This is the same as the HTTP + date format. + - :class:`uuid.UUID` is serialized to a string. + - :class:`dataclasses.dataclass` is passed to + :func:`dataclasses.asdict`. + - :class:`~markupsafe.Markup` (or any object with a ``__html__`` + method) will call the ``__html__`` method to get a string. + """ + + default: t.Callable[[t.Any], t.Any] = staticmethod(_default) # type: ignore[assignment] + """Apply this function to any object that :meth:`json.dumps` does + not know how to serialize. It should return a valid JSON type or + raise a ``TypeError``. + """ + + ensure_ascii = True + """Replace non-ASCII characters with escape sequences. This may be + more compatible with some clients, but can be disabled for better + performance and size. + """ + + sort_keys = True + """Sort the keys in any serialized dicts. This may be useful for + some caching situations, but can be disabled for better performance. + When enabled, keys must all be strings, they are not converted + before sorting. + """ + + compact: bool | None = None + """If ``True``, or ``None`` out of debug mode, the :meth:`response` + output will not add indentation, newlines, or spaces. If ``False``, + or ``None`` in debug mode, it will use a non-compact representation. + """ + + mimetype = "application/json" + """The mimetype set in :meth:`response`.""" + + def dumps(self, obj: t.Any, **kwargs: t.Any) -> str: + """Serialize data as JSON to a string. + + Keyword arguments are passed to :func:`json.dumps`. Sets some + parameter defaults from the :attr:`default`, + :attr:`ensure_ascii`, and :attr:`sort_keys` attributes. + + :param obj: The data to serialize. + :param kwargs: Passed to :func:`json.dumps`. + """ + kwargs.setdefault("default", self.default) + kwargs.setdefault("ensure_ascii", self.ensure_ascii) + kwargs.setdefault("sort_keys", self.sort_keys) + return json.dumps(obj, **kwargs) + + def loads(self, s: str | bytes, **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON from a string or bytes. + + :param s: Text or UTF-8 bytes. + :param kwargs: Passed to :func:`json.loads`. + """ + return json.loads(s, **kwargs) + + def response(self, *args: t.Any, **kwargs: t.Any) -> Response: + """Serialize the given arguments as JSON, and return a + :class:`~flask.Response` object with it. The response mimetype + will be "application/json" and can be changed with + :attr:`mimetype`. + + If :attr:`compact` is ``False`` or debug mode is enabled, the + output will be formatted to be easier to read. + + Either positional or keyword arguments can be given, not both. + If no arguments are given, ``None`` is serialized. + + :param args: A single value to serialize, or multiple values to + treat as a list to serialize. + :param kwargs: Treat as a dict to serialize. + """ + obj = self._prepare_response_obj(args, kwargs) + dump_args: dict[str, t.Any] = {} + + if (self.compact is None and self._app.debug) or self.compact is False: + dump_args.setdefault("indent", 2) + else: + dump_args.setdefault("separators", (",", ":")) + + return self._app.response_class( + f"{self.dumps(obj, **dump_args)}\n", mimetype=self.mimetype + ) diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/json/tag.py b/server-temp/venv/lib/python3.10/site-packages/flask/json/tag.py new file mode 100644 index 00000000..2bb986bc --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/flask/json/tag.py @@ -0,0 +1,326 @@ +""" +Tagged JSON +~~~~~~~~~~~ + +A compact representation for lossless serialization of non-standard JSON +types. :class:`~flask.sessions.SecureCookieSessionInterface` uses this +to serialize the session data, but it may be useful in other places. It +can be extended to support other types. + +.. autoclass:: TaggedJSONSerializer + :members: + +.. autoclass:: JSONTag + :members: + +Let's see an example that adds support for +:class:`~collections.OrderedDict`. Dicts don't have an order in JSON, so +to handle this we will dump the items as a list of ``[key, value]`` +pairs. Subclass :class:`JSONTag` and give it the new key ``' od'`` to +identify the type. The session serializer processes dicts first, so +insert the new tag at the front of the order since ``OrderedDict`` must +be processed before ``dict``. + +.. code-block:: python + + from flask.json.tag import JSONTag + + class TagOrderedDict(JSONTag): + __slots__ = ('serializer',) + key = ' od' + + def check(self, value): + return isinstance(value, OrderedDict) + + def to_json(self, value): + return [[k, self.serializer.tag(v)] for k, v in iteritems(value)] + + def to_python(self, value): + return OrderedDict(value) + + app.session_interface.serializer.register(TagOrderedDict, index=0) +""" +from __future__ import annotations + +import typing as t +from base64 import b64decode +from base64 import b64encode +from datetime import datetime +from uuid import UUID + +from markupsafe import Markup +from werkzeug.http import http_date +from werkzeug.http import parse_date + +from ..json import dumps +from ..json import loads + + +class JSONTag: + """Base class for defining type tags for :class:`TaggedJSONSerializer`.""" + + __slots__ = ("serializer",) + + #: The tag to mark the serialized object with. If empty, this tag is + #: only used as an intermediate step during tagging. + key: str = "" + + def __init__(self, serializer: TaggedJSONSerializer) -> None: + """Create a tagger for the given serializer.""" + self.serializer = serializer + + def check(self, value: t.Any) -> bool: + """Check if the given value should be tagged by this tag.""" + raise NotImplementedError + + def to_json(self, value: t.Any) -> t.Any: + """Convert the Python object to an object that is a valid JSON type. + The tag will be added later.""" + raise NotImplementedError + + def to_python(self, value: t.Any) -> t.Any: + """Convert the JSON representation back to the correct type. The tag + will already be removed.""" + raise NotImplementedError + + def tag(self, value: t.Any) -> dict[str, t.Any]: + """Convert the value to a valid JSON type and add the tag structure + around it.""" + return {self.key: self.to_json(value)} + + +class TagDict(JSONTag): + """Tag for 1-item dicts whose only key matches a registered tag. + + Internally, the dict key is suffixed with `__`, and the suffix is removed + when deserializing. + """ + + __slots__ = () + key = " di" + + def check(self, value: t.Any) -> bool: + return ( + isinstance(value, dict) + and len(value) == 1 + and next(iter(value)) in self.serializer.tags + ) + + def to_json(self, value: t.Any) -> t.Any: + key = next(iter(value)) + return {f"{key}__": self.serializer.tag(value[key])} + + def to_python(self, value: t.Any) -> t.Any: + key = next(iter(value)) + return {key[:-2]: value[key]} + + +class PassDict(JSONTag): + __slots__ = () + + def check(self, value: t.Any) -> bool: + return isinstance(value, dict) + + def to_json(self, value: t.Any) -> t.Any: + # JSON objects may only have string keys, so don't bother tagging the + # key here. + return {k: self.serializer.tag(v) for k, v in value.items()} + + tag = to_json + + +class TagTuple(JSONTag): + __slots__ = () + key = " t" + + def check(self, value: t.Any) -> bool: + return isinstance(value, tuple) + + def to_json(self, value: t.Any) -> t.Any: + return [self.serializer.tag(item) for item in value] + + def to_python(self, value: t.Any) -> t.Any: + return tuple(value) + + +class PassList(JSONTag): + __slots__ = () + + def check(self, value: t.Any) -> bool: + return isinstance(value, list) + + def to_json(self, value: t.Any) -> t.Any: + return [self.serializer.tag(item) for item in value] + + tag = to_json + + +class TagBytes(JSONTag): + __slots__ = () + key = " b" + + def check(self, value: t.Any) -> bool: + return isinstance(value, bytes) + + def to_json(self, value: t.Any) -> t.Any: + return b64encode(value).decode("ascii") + + def to_python(self, value: t.Any) -> t.Any: + return b64decode(value) + + +class TagMarkup(JSONTag): + """Serialize anything matching the :class:`~markupsafe.Markup` API by + having a ``__html__`` method to the result of that method. Always + deserializes to an instance of :class:`~markupsafe.Markup`.""" + + __slots__ = () + key = " m" + + def check(self, value: t.Any) -> bool: + return callable(getattr(value, "__html__", None)) + + def to_json(self, value: t.Any) -> t.Any: + return str(value.__html__()) + + def to_python(self, value: t.Any) -> t.Any: + return Markup(value) + + +class TagUUID(JSONTag): + __slots__ = () + key = " u" + + def check(self, value: t.Any) -> bool: + return isinstance(value, UUID) + + def to_json(self, value: t.Any) -> t.Any: + return value.hex + + def to_python(self, value: t.Any) -> t.Any: + return UUID(value) + + +class TagDateTime(JSONTag): + __slots__ = () + key = " d" + + def check(self, value: t.Any) -> bool: + return isinstance(value, datetime) + + def to_json(self, value: t.Any) -> t.Any: + return http_date(value) + + def to_python(self, value: t.Any) -> t.Any: + return parse_date(value) + + +class TaggedJSONSerializer: + """Serializer that uses a tag system to compactly represent objects that + are not JSON types. Passed as the intermediate serializer to + :class:`itsdangerous.Serializer`. + + The following extra types are supported: + + * :class:`dict` + * :class:`tuple` + * :class:`bytes` + * :class:`~markupsafe.Markup` + * :class:`~uuid.UUID` + * :class:`~datetime.datetime` + """ + + __slots__ = ("tags", "order") + + #: Tag classes to bind when creating the serializer. Other tags can be + #: added later using :meth:`~register`. + default_tags = [ + TagDict, + PassDict, + TagTuple, + PassList, + TagBytes, + TagMarkup, + TagUUID, + TagDateTime, + ] + + def __init__(self) -> None: + self.tags: dict[str, JSONTag] = {} + self.order: list[JSONTag] = [] + + for cls in self.default_tags: + self.register(cls) + + def register( + self, + tag_class: type[JSONTag], + force: bool = False, + index: int | None = None, + ) -> None: + """Register a new tag with this serializer. + + :param tag_class: tag class to register. Will be instantiated with this + serializer instance. + :param force: overwrite an existing tag. If false (default), a + :exc:`KeyError` is raised. + :param index: index to insert the new tag in the tag order. Useful when + the new tag is a special case of an existing tag. If ``None`` + (default), the tag is appended to the end of the order. + + :raise KeyError: if the tag key is already registered and ``force`` is + not true. + """ + tag = tag_class(self) + key = tag.key + + if key: + if not force and key in self.tags: + raise KeyError(f"Tag '{key}' is already registered.") + + self.tags[key] = tag + + if index is None: + self.order.append(tag) + else: + self.order.insert(index, tag) + + def tag(self, value: t.Any) -> t.Any: + """Convert a value to a tagged representation if necessary.""" + for tag in self.order: + if tag.check(value): + return tag.tag(value) + + return value + + def untag(self, value: dict[str, t.Any]) -> t.Any: + """Convert a tagged representation back to the original type.""" + if len(value) != 1: + return value + + key = next(iter(value)) + + if key not in self.tags: + return value + + return self.tags[key].to_python(value[key]) + + def _untag_scan(self, value: t.Any) -> t.Any: + if isinstance(value, dict): + # untag each item recursively + value = {k: self._untag_scan(v) for k, v in value.items()} + # untag the dict itself + value = self.untag(value) + elif isinstance(value, list): + # untag each item recursively + value = [self._untag_scan(item) for item in value] + + return value + + def dumps(self, value: t.Any) -> str: + """Tag the value and dump it to a compact JSON string.""" + return dumps(self.tag(value), separators=(",", ":")) + + def loads(self, value: str) -> t.Any: + """Load data from a JSON string and deserialized any tagged objects.""" + return self._untag_scan(loads(value)) diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/logging.py b/server-temp/venv/lib/python3.10/site-packages/flask/logging.py new file mode 100644 index 00000000..0cb8f437 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/flask/logging.py @@ -0,0 +1,79 @@ +from __future__ import annotations + +import logging +import sys +import typing as t + +from werkzeug.local import LocalProxy + +from .globals import request + +if t.TYPE_CHECKING: # pragma: no cover + from .sansio.app import App + + +@LocalProxy +def wsgi_errors_stream() -> t.TextIO: + """Find the most appropriate error stream for the application. If a request + is active, log to ``wsgi.errors``, otherwise use ``sys.stderr``. + + If you configure your own :class:`logging.StreamHandler`, you may want to + use this for the stream. If you are using file or dict configuration and + can't import this directly, you can refer to it as + ``ext://flask.logging.wsgi_errors_stream``. + """ + if request: + return request.environ["wsgi.errors"] # type: ignore[no-any-return] + + return sys.stderr + + +def has_level_handler(logger: logging.Logger) -> bool: + """Check if there is a handler in the logging chain that will handle the + given logger's :meth:`effective level <~logging.Logger.getEffectiveLevel>`. + """ + level = logger.getEffectiveLevel() + current = logger + + while current: + if any(handler.level <= level for handler in current.handlers): + return True + + if not current.propagate: + break + + current = current.parent # type: ignore + + return False + + +#: Log messages to :func:`~flask.logging.wsgi_errors_stream` with the format +#: ``[%(asctime)s] %(levelname)s in %(module)s: %(message)s``. +default_handler = logging.StreamHandler(wsgi_errors_stream) # type: ignore +default_handler.setFormatter( + logging.Formatter("[%(asctime)s] %(levelname)s in %(module)s: %(message)s") +) + + +def create_logger(app: App) -> logging.Logger: + """Get the Flask app's logger and configure it if needed. + + The logger name will be the same as + :attr:`app.import_name `. + + When :attr:`~flask.Flask.debug` is enabled, set the logger level to + :data:`logging.DEBUG` if it is not set. + + If there is no handler for the logger's effective level, add a + :class:`~logging.StreamHandler` for + :func:`~flask.logging.wsgi_errors_stream` with a basic format. + """ + logger = logging.getLogger(app.name) + + if app.debug and not logger.level: + logger.setLevel(logging.DEBUG) + + if not has_level_handler(logger): + logger.addHandler(default_handler) + + return logger diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/py.typed b/server-temp/venv/lib/python3.10/site-packages/flask/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/sansio/README.md b/server-temp/venv/lib/python3.10/site-packages/flask/sansio/README.md new file mode 100644 index 00000000..623ac198 --- /dev/null +++ b/server-temp/venv/lib/python3.10/site-packages/flask/sansio/README.md @@ -0,0 +1,6 @@ +# Sansio + +This folder contains code that can be used by alternative Flask +implementations, for example Quart. The code therefore cannot do any +IO, nor be part of a likely IO path. Finally this code cannot use the +Flask globals. diff --git a/server-temp/venv/lib/python3.10/site-packages/flask/sansio/__pycache__/app.cpython-310.pyc b/server-temp/venv/lib/python3.10/site-packages/flask/sansio/__pycache__/app.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..48fed79c9fa25dab3fd061c37d5aab21c7692c59 GIT binary patch literal 28648 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