From c533667018c64167d494216d6d75cdaebbacaa9e Mon Sep 17 00:00:00 2001 From: root Date: Sun, 13 Apr 2025 17:40:56 +0200 Subject: [PATCH] Remove __pycache__ and venv from tracking --- venv/bin/Activate.ps1 | 247 - venv/bin/activate | 69 - venv/bin/activate.csh | 26 - venv/bin/activate.fish | 69 - venv/bin/fastapi | 8 - venv/bin/pip | 8 - venv/bin/pip3 | 8 - venv/bin/pip3.11 | 8 - venv/bin/python | 1 - venv/bin/python3 | 1 - venv/bin/python3.11 | 1 - venv/bin/uvicorn | 8 - .../MarkupSafe-3.0.2.dist-info/INSTALLER | 1 - .../MarkupSafe-3.0.2.dist-info/LICENSE.txt | 28 - .../MarkupSafe-3.0.2.dist-info/METADATA | 92 - .../MarkupSafe-3.0.2.dist-info/RECORD | 14 - .../MarkupSafe-3.0.2.dist-info/WHEEL | 6 - .../MarkupSafe-3.0.2.dist-info/top_level.txt | 1 - .../typing_extensions.cpython-311.pyc | Bin 188995 -> 0 bytes .../site-packages/_distutils_hack/__init__.py | 222 - .../__pycache__/__init__.cpython-311.pyc | Bin 11152 -> 0 bytes .../__pycache__/override.cpython-311.pyc | Bin 309 -> 0 bytes .../site-packages/_distutils_hack/override.py | 1 - .../annotated_types-0.7.0.dist-info/INSTALLER | 1 - .../annotated_types-0.7.0.dist-info/METADATA | 295 - .../annotated_types-0.7.0.dist-info/RECORD | 10 - .../annotated_types-0.7.0.dist-info/WHEEL | 4 - .../licenses/LICENSE | 21 - .../site-packages/annotated_types/__init__.py | 432 - .../__pycache__/__init__.cpython-311.pyc | Bin 20554 -> 0 bytes .../__pycache__/test_cases.cpython-311.pyc | Bin 15445 -> 0 bytes .../site-packages/annotated_types/py.typed | 0 .../annotated_types/test_cases.py | 151 - .../anyio-4.9.0.dist-info/INSTALLER | 1 - .../anyio-4.9.0.dist-info/LICENSE | 20 - .../anyio-4.9.0.dist-info/METADATA | 105 - .../anyio-4.9.0.dist-info/RECORD | 88 - .../site-packages/anyio-4.9.0.dist-info/WHEEL | 5 - .../anyio-4.9.0.dist-info/entry_points.txt | 2 - .../anyio-4.9.0.dist-info/top_level.txt | 1 - .../site-packages/anyio/__init__.py | 85 - .../__pycache__/__init__.cpython-311.pyc | Bin 4741 -> 0 bytes .../__pycache__/from_thread.cpython-311.pyc | Bin 26159 -> 0 bytes .../__pycache__/lowlevel.cpython-311.pyc | Bin 7638 -> 0 bytes .../__pycache__/pytest_plugin.cpython-311.pyc | Bin 15170 -> 0 bytes .../to_interpreter.cpython-311.pyc | Bin 10009 -> 0 bytes .../__pycache__/to_process.cpython-311.pyc | Bin 13657 -> 0 bytes .../__pycache__/to_thread.cpython-311.pyc | Bin 3180 -> 0 bytes .../site-packages/anyio/_backends/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 187 -> 0 bytes .../__pycache__/_asyncio.cpython-311.pyc | Bin 146186 -> 0 bytes .../__pycache__/_trio.cpython-311.pyc | Bin 77877 -> 0 bytes .../site-packages/anyio/_backends/_asyncio.py | 2816 ------ .../site-packages/anyio/_backends/_trio.py | 1334 --- .../site-packages/anyio/_core/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 183 -> 0 bytes .../_asyncio_selector_thread.cpython-311.pyc | Bin 9081 -> 0 bytes .../__pycache__/_eventloop.cpython-311.pyc | Bin 6918 -> 0 bytes .../__pycache__/_exceptions.cpython-311.pyc | Bin 7188 -> 0 bytes .../_core/__pycache__/_fileio.cpython-311.pyc | Bin 42153 -> 0 bytes .../__pycache__/_resources.cpython-311.pyc | Bin 1107 -> 0 bytes .../__pycache__/_signals.cpython-311.pyc | Bin 1352 -> 0 bytes .../__pycache__/_sockets.cpython-311.pyc | Bin 32699 -> 0 bytes .../__pycache__/_streams.cpython-311.pyc | Bin 2648 -> 0 bytes .../__pycache__/_subprocesses.cpython-311.pyc | Bin 9814 -> 0 bytes .../_synchronization.cpython-311.pyc | Bin 35706 -> 0 bytes .../_core/__pycache__/_tasks.cpython-311.pyc | Bin 7693 -> 0 bytes .../__pycache__/_tempfile.cpython-311.pyc | Bin 28588 -> 0 bytes .../__pycache__/_testing.cpython-311.pyc | Bin 3863 -> 0 bytes .../__pycache__/_typedattr.cpython-311.pyc | Bin 4405 -> 0 bytes .../anyio/_core/_asyncio_selector_thread.py | 167 - .../site-packages/anyio/_core/_eventloop.py | 166 - .../site-packages/anyio/_core/_exceptions.py | 126 - .../site-packages/anyio/_core/_fileio.py | 742 -- .../site-packages/anyio/_core/_resources.py | 18 - .../site-packages/anyio/_core/_signals.py | 27 - .../site-packages/anyio/_core/_sockets.py | 792 -- .../site-packages/anyio/_core/_streams.py | 52 - .../anyio/_core/_subprocesses.py | 202 - .../anyio/_core/_synchronization.py | 732 -- .../site-packages/anyio/_core/_tasks.py | 158 - .../site-packages/anyio/_core/_tempfile.py | 616 -- .../site-packages/anyio/_core/_testing.py | 78 - .../site-packages/anyio/_core/_typedattr.py | 81 - .../site-packages/anyio/abc/__init__.py | 55 - .../abc/__pycache__/__init__.cpython-311.pyc | Bin 2884 -> 0 bytes .../__pycache__/_eventloop.cpython-311.pyc | Bin 16438 -> 0 bytes .../__pycache__/_resources.cpython-311.pyc | Bin 1815 -> 0 bytes .../abc/__pycache__/_sockets.cpython-311.pyc | Bin 11206 -> 0 bytes .../abc/__pycache__/_streams.cpython-311.pyc | Bin 9602 -> 0 bytes .../__pycache__/_subprocesses.cpython-311.pyc | Bin 3662 -> 0 bytes .../abc/__pycache__/_tasks.cpython-311.pyc | Bin 4986 -> 0 bytes .../abc/__pycache__/_testing.cpython-311.pyc | Bin 3023 -> 0 bytes .../site-packages/anyio/abc/_eventloop.py | 376 - .../site-packages/anyio/abc/_resources.py | 33 - .../site-packages/anyio/abc/_sockets.py | 194 - .../site-packages/anyio/abc/_streams.py | 203 - .../site-packages/anyio/abc/_subprocesses.py | 79 - .../site-packages/anyio/abc/_tasks.py | 101 - .../site-packages/anyio/abc/_testing.py | 65 - .../site-packages/anyio/from_thread.py | 527 - .../site-packages/anyio/lowlevel.py | 161 - .../python3.11/site-packages/anyio/py.typed | 0 .../site-packages/anyio/pytest_plugin.py | 272 - .../site-packages/anyio/streams/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 185 -> 0 bytes .../__pycache__/buffered.cpython-311.pyc | Bin 6485 -> 0 bytes .../streams/__pycache__/file.cpython-311.pyc | Bin 8126 -> 0 bytes .../__pycache__/memory.cpython-311.pyc | Bin 15963 -> 0 bytes .../__pycache__/stapled.cpython-311.pyc | Bin 8252 -> 0 bytes .../streams/__pycache__/text.cpython-311.pyc | Bin 9007 -> 0 bytes .../streams/__pycache__/tls.cpython-311.pyc | Bin 18407 -> 0 bytes .../site-packages/anyio/streams/buffered.py | 119 - .../site-packages/anyio/streams/file.py | 148 - .../site-packages/anyio/streams/memory.py | 317 - .../site-packages/anyio/streams/stapled.py | 141 - .../site-packages/anyio/streams/text.py | 147 - .../site-packages/anyio/streams/tls.py | 352 - .../site-packages/anyio/to_interpreter.py | 218 - .../site-packages/anyio/to_process.py | 258 - .../site-packages/anyio/to_thread.py | 69 - .../bcrypt-4.3.0.dist-info/INSTALLER | 1 - .../bcrypt-4.3.0.dist-info/LICENSE | 201 - .../bcrypt-4.3.0.dist-info/METADATA | 330 - .../bcrypt-4.3.0.dist-info/RECORD | 12 - .../bcrypt-4.3.0.dist-info/REQUESTED | 0 .../bcrypt-4.3.0.dist-info/WHEEL | 5 - .../bcrypt-4.3.0.dist-info/top_level.txt | 1 - .../site-packages/bcrypt/__init__.py | 43 - .../site-packages/bcrypt/__init__.pyi | 10 - .../__pycache__/__init__.cpython-311.pyc | Bin 711 -> 0 bytes .../site-packages/bcrypt/_bcrypt.abi3.so | Bin 644928 -> 0 bytes .../python3.11/site-packages/bcrypt/py.typed | 0 .../click-8.1.8.dist-info/INSTALLER | 1 - .../click-8.1.8.dist-info/LICENSE.txt | 28 - .../click-8.1.8.dist-info/METADATA | 74 - .../click-8.1.8.dist-info/RECORD | 38 - .../site-packages/click-8.1.8.dist-info/WHEEL | 4 - .../site-packages/click/__init__.py | 75 - .../__pycache__/__init__.cpython-311.pyc | Bin 3719 -> 0 bytes .../click/__pycache__/_compat.cpython-311.pyc | Bin 28661 -> 0 bytes .../__pycache__/_termui_impl.cpython-311.pyc | Bin 33262 -> 0 bytes .../__pycache__/_textwrap.cpython-311.pyc | Bin 2631 -> 0 bytes .../__pycache__/_winconsole.cpython-311.pyc | Bin 13321 -> 0 bytes .../click/__pycache__/core.cpython-311.pyc | Bin 142550 -> 0 bytes .../__pycache__/decorators.cpython-311.pyc | Bin 26323 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 16339 -> 0 bytes .../__pycache__/formatting.cpython-311.pyc | Bin 15676 -> 0 bytes .../click/__pycache__/globals.cpython-311.pyc | Bin 3341 -> 0 bytes .../click/__pycache__/parser.cpython-311.pyc | Bin 23120 -> 0 bytes .../shell_completion.cpython-311.pyc | Bin 24116 -> 0 bytes .../click/__pycache__/termui.cpython-311.pyc | Bin 34465 -> 0 bytes .../click/__pycache__/testing.cpython-311.pyc | Bin 25956 -> 0 bytes .../click/__pycache__/types.cpython-311.pyc | Bin 53699 -> 0 bytes .../click/__pycache__/utils.cpython-311.pyc | Bin 28027 -> 0 bytes .../python3.11/site-packages/click/_compat.py | 623 -- .../site-packages/click/_termui_impl.py | 788 -- .../site-packages/click/_textwrap.py | 49 - .../site-packages/click/_winconsole.py | 279 - .../python3.11/site-packages/click/core.py | 3047 ------ .../site-packages/click/decorators.py | 562 -- .../site-packages/click/exceptions.py | 296 - .../site-packages/click/formatting.py | 301 - .../python3.11/site-packages/click/globals.py | 67 - .../python3.11/site-packages/click/parser.py | 531 - .../python3.11/site-packages/click/py.typed | 0 .../site-packages/click/shell_completion.py | 603 -- .../python3.11/site-packages/click/termui.py | 784 -- .../python3.11/site-packages/click/testing.py | 483 - .../python3.11/site-packages/click/types.py | 1093 --- .../python3.11/site-packages/click/utils.py | 624 -- .../site-packages/distutils-precedence.pth | 1 - .../fastapi-0.115.12.dist-info/INSTALLER | 1 - .../fastapi-0.115.12.dist-info/METADATA | 565 -- .../fastapi-0.115.12.dist-info/RECORD | 97 - .../fastapi-0.115.12.dist-info/REQUESTED | 0 .../fastapi-0.115.12.dist-info/WHEEL | 4 - .../entry_points.txt | 5 - .../licenses/LICENSE | 21 - .../site-packages/fastapi/__init__.py | 25 - .../site-packages/fastapi/__main__.py | 3 - .../__pycache__/__init__.cpython-311.pyc | Bin 1394 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 262 -> 0 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 32746 -> 0 bytes .../__pycache__/applications.cpython-311.pyc | Bin 92506 -> 0 bytes .../__pycache__/background.cpython-311.pyc | Bin 2560 -> 0 bytes .../fastapi/__pycache__/cli.cpython-311.pyc | Bin 757 -> 0 bytes .../__pycache__/concurrency.cpython-311.pyc | Bin 1856 -> 0 bytes .../datastructures.cpython-311.pyc | Bin 9385 -> 0 bytes .../__pycache__/encoders.cpython-311.pyc | Bin 12443 -> 0 bytes .../exception_handlers.cpython-311.pyc | Bin 2336 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 8249 -> 0 bytes .../__pycache__/logger.cpython-311.pyc | Bin 277 -> 0 bytes .../param_functions.cpython-311.pyc | Bin 41426 -> 0 bytes .../__pycache__/params.cpython-311.pyc | Bin 29235 -> 0 bytes .../__pycache__/requests.cpython-311.pyc | Bin 296 -> 0 bytes .../__pycache__/responses.cpython-311.pyc | Bin 2748 -> 0 bytes .../__pycache__/routing.cpython-311.pyc | Bin 92501 -> 0 bytes .../__pycache__/staticfiles.cpython-311.pyc | Bin 253 -> 0 bytes .../__pycache__/templating.cpython-311.pyc | Bin 255 -> 0 bytes .../__pycache__/testclient.cpython-311.pyc | Bin 250 -> 0 bytes .../fastapi/__pycache__/types.cpython-311.pyc | Bin 910 -> 0 bytes .../fastapi/__pycache__/utils.cpython-311.pyc | Bin 9389 -> 0 bytes .../__pycache__/websockets.cpython-311.pyc | Bin 360 -> 0 bytes .../site-packages/fastapi/_compat.py | 659 -- .../site-packages/fastapi/applications.py | 4585 --------- .../site-packages/fastapi/background.py | 59 - .../python3.11/site-packages/fastapi/cli.py | 13 - .../site-packages/fastapi/concurrency.py | 39 - .../site-packages/fastapi/datastructures.py | 204 - .../fastapi/dependencies/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 192 -> 0 bytes .../__pycache__/models.cpython-311.pyc | Bin 3376 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 41932 -> 0 bytes .../fastapi/dependencies/models.py | 37 - .../fastapi/dependencies/utils.py | 980 -- .../site-packages/fastapi/encoders.py | 343 - .../fastapi/exception_handlers.py | 34 - .../site-packages/fastapi/exceptions.py | 176 - .../site-packages/fastapi/logger.py | 3 - .../fastapi/middleware/__init__.py | 1 - .../__pycache__/__init__.cpython-311.pyc | Bin 259 -> 0 bytes .../__pycache__/cors.cpython-311.pyc | Bin 264 -> 0 bytes .../__pycache__/gzip.cpython-311.pyc | Bin 264 -> 0 bytes .../__pycache__/httpsredirect.cpython-311.pyc | Bin 307 -> 0 bytes .../__pycache__/trustedhost.cpython-311.pyc | Bin 301 -> 0 bytes .../__pycache__/wsgi.cpython-311.pyc | Bin 264 -> 0 bytes .../site-packages/fastapi/middleware/cors.py | 1 - .../site-packages/fastapi/middleware/gzip.py | 1 - .../fastapi/middleware/httpsredirect.py | 3 - .../fastapi/middleware/trustedhost.py | 3 - .../site-packages/fastapi/middleware/wsgi.py | 1 - .../site-packages/fastapi/openapi/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 187 -> 0 bytes .../__pycache__/constants.cpython-311.pyc | Bin 357 -> 0 bytes .../openapi/__pycache__/docs.cpython-311.pyc | Bin 11435 -> 0 bytes .../__pycache__/models.cpython-311.pyc | Bin 28933 -> 0 bytes .../openapi/__pycache__/utils.cpython-311.pyc | Bin 23293 -> 0 bytes .../fastapi/openapi/constants.py | 3 - .../site-packages/fastapi/openapi/docs.py | 344 - .../site-packages/fastapi/openapi/models.py | 445 - .../site-packages/fastapi/openapi/utils.py | 569 -- .../site-packages/fastapi/param_functions.py | 2360 ----- .../site-packages/fastapi/params.py | 786 -- .../python3.11/site-packages/fastapi/py.typed | 0 .../site-packages/fastapi/requests.py | 2 - .../site-packages/fastapi/responses.py | 48 - .../site-packages/fastapi/routing.py | 4439 --------- .../fastapi/security/__init__.py | 15 - .../__pycache__/__init__.cpython-311.pyc | Bin 1065 -> 0 bytes .../__pycache__/api_key.cpython-311.pyc | Bin 10297 -> 0 bytes .../security/__pycache__/base.cpython-311.pyc | Bin 587 -> 0 bytes .../security/__pycache__/http.cpython-311.pyc | Bin 15001 -> 0 bytes .../__pycache__/oauth2.cpython-311.pyc | Bin 20297 -> 0 bytes .../open_id_connect_url.cpython-311.pyc | Bin 3538 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 667 -> 0 bytes .../site-packages/fastapi/security/api_key.py | 288 - .../site-packages/fastapi/security/base.py | 6 - .../site-packages/fastapi/security/http.py | 423 - .../site-packages/fastapi/security/oauth2.py | 638 -- .../fastapi/security/open_id_connect_url.py | 84 - .../site-packages/fastapi/security/utils.py | 10 - .../site-packages/fastapi/staticfiles.py | 1 - .../site-packages/fastapi/templating.py | 1 - .../site-packages/fastapi/testclient.py | 1 - .../python3.11/site-packages/fastapi/types.py | 10 - .../python3.11/site-packages/fastapi/utils.py | 220 - .../site-packages/fastapi/websockets.py | 3 - .../h11-0.14.0.dist-info/INSTALLER | 1 - .../h11-0.14.0.dist-info/LICENSE.txt | 22 - .../h11-0.14.0.dist-info/METADATA | 193 - .../site-packages/h11-0.14.0.dist-info/RECORD | 52 - .../site-packages/h11-0.14.0.dist-info/WHEEL | 5 - .../h11-0.14.0.dist-info/top_level.txt | 1 - .../python3.11/site-packages/h11/__init__.py | 62 - .../h11/__pycache__/__init__.cpython-311.pyc | Bin 1308 -> 0 bytes .../h11/__pycache__/_abnf.cpython-311.pyc | Bin 1813 -> 0 bytes .../__pycache__/_connection.cpython-311.pyc | Bin 24299 -> 0 bytes .../h11/__pycache__/_events.cpython-311.pyc | Bin 15187 -> 0 bytes .../h11/__pycache__/_headers.cpython-311.pyc | Bin 9104 -> 0 bytes .../h11/__pycache__/_readers.cpython-311.pyc | Bin 10781 -> 0 bytes .../_receivebuffer.cpython-311.pyc | Bin 5140 -> 0 bytes .../h11/__pycache__/_state.cpython-311.pyc | Bin 9776 -> 0 bytes .../h11/__pycache__/_util.cpython-311.pyc | Bin 5361 -> 0 bytes .../h11/__pycache__/_version.cpython-311.pyc | Bin 198 -> 0 bytes .../h11/__pycache__/_writers.cpython-311.pyc | Bin 7298 -> 0 bytes .../lib/python3.11/site-packages/h11/_abnf.py | 132 - .../site-packages/h11/_connection.py | 633 -- .../python3.11/site-packages/h11/_events.py | 369 - .../python3.11/site-packages/h11/_headers.py | 278 - .../python3.11/site-packages/h11/_readers.py | 247 - .../site-packages/h11/_receivebuffer.py | 153 - .../python3.11/site-packages/h11/_state.py | 367 - .../lib/python3.11/site-packages/h11/_util.py | 135 - .../python3.11/site-packages/h11/_version.py | 16 - .../python3.11/site-packages/h11/_writers.py | 145 - .../lib/python3.11/site-packages/h11/py.typed | 1 - .../site-packages/h11/tests/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 181 -> 0 bytes .../tests/__pycache__/helpers.cpython-311.pyc | Bin 5101 -> 0 bytes .../test_against_stdlib_http.cpython-311.pyc | Bin 8265 -> 0 bytes .../test_connection.cpython-311.pyc | Bin 68017 -> 0 bytes .../__pycache__/test_events.cpython-311.pyc | Bin 6817 -> 0 bytes .../__pycache__/test_headers.cpython-311.pyc | Bin 9594 -> 0 bytes .../__pycache__/test_helpers.cpython-311.pyc | Bin 1517 -> 0 bytes .../tests/__pycache__/test_io.cpython-311.pyc | Bin 25530 -> 0 bytes .../test_receivebuffer.cpython-311.pyc | Bin 4596 -> 0 bytes .../__pycache__/test_state.cpython-311.pyc | Bin 15198 -> 0 bytes .../__pycache__/test_util.cpython-311.pyc | Bin 7804 -> 0 bytes .../site-packages/h11/tests/data/test-file | 1 - .../site-packages/h11/tests/helpers.py | 101 - .../h11/tests/test_against_stdlib_http.py | 115 - .../h11/tests/test_connection.py | 1122 --- .../site-packages/h11/tests/test_events.py | 150 - .../site-packages/h11/tests/test_headers.py | 157 - .../site-packages/h11/tests/test_helpers.py | 32 - .../site-packages/h11/tests/test_io.py | 572 -- .../h11/tests/test_receivebuffer.py | 135 - .../site-packages/h11/tests/test_state.py | 271 - .../site-packages/h11/tests/test_util.py | 112 - .../idna-3.10.dist-info/INSTALLER | 1 - .../idna-3.10.dist-info/LICENSE.md | 31 - .../idna-3.10.dist-info/METADATA | 250 - .../site-packages/idna-3.10.dist-info/RECORD | 22 - .../site-packages/idna-3.10.dist-info/WHEEL | 4 - .../python3.11/site-packages/idna/__init__.py | 45 - .../idna/__pycache__/__init__.cpython-311.pyc | Bin 1083 -> 0 bytes .../idna/__pycache__/codec.cpython-311.pyc | Bin 5765 -> 0 bytes .../idna/__pycache__/compat.cpython-311.pyc | Bin 1005 -> 0 bytes .../idna/__pycache__/core.cpython-311.pyc | Bin 19252 -> 0 bytes .../idna/__pycache__/idnadata.cpython-311.pyc | Bin 101524 -> 0 bytes .../__pycache__/intranges.cpython-311.pyc | Bin 2963 -> 0 bytes .../__pycache__/package_data.cpython-311.pyc | Bin 199 -> 0 bytes .../__pycache__/uts46data.cpython-311.pyc | Bin 163154 -> 0 bytes .../python3.11/site-packages/idna/codec.py | 122 - .../python3.11/site-packages/idna/compat.py | 15 - .../lib/python3.11/site-packages/idna/core.py | 437 - .../python3.11/site-packages/idna/idnadata.py | 4243 -------- .../site-packages/idna/intranges.py | 57 - .../site-packages/idna/package_data.py | 1 - .../python3.11/site-packages/idna/py.typed | 0 .../site-packages/idna/uts46data.py | 8681 ----------------- .../jinja2-3.1.6.dist-info/INSTALLER | 1 - .../jinja2-3.1.6.dist-info/METADATA | 84 - .../jinja2-3.1.6.dist-info/RECORD | 58 - .../jinja2-3.1.6.dist-info/REQUESTED | 0 .../jinja2-3.1.6.dist-info/WHEEL | 4 - .../jinja2-3.1.6.dist-info/entry_points.txt | 3 - .../licenses/LICENSE.txt | 28 - .../site-packages/jinja2/__init__.py | 38 - .../__pycache__/__init__.cpython-311.pyc | Bin 2111 -> 0 bytes .../__pycache__/_identifier.cpython-311.pyc | Bin 2127 -> 0 bytes .../__pycache__/async_utils.cpython-311.pyc | Bin 5587 -> 0 bytes .../__pycache__/bccache.cpython-311.pyc | Bin 20909 -> 0 bytes .../__pycache__/compiler.cpython-311.pyc | Bin 112431 -> 0 bytes .../__pycache__/constants.cpython-311.pyc | Bin 1546 -> 0 bytes .../jinja2/__pycache__/debug.cpython-311.pyc | Bin 6706 -> 0 bytes .../__pycache__/defaults.cpython-311.pyc | Bin 1712 -> 0 bytes .../__pycache__/environment.cpython-311.pyc | Bin 80569 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 8597 -> 0 bytes .../jinja2/__pycache__/ext.cpython-311.pyc | Bin 43373 -> 0 bytes .../__pycache__/filters.cpython-311.pyc | Bin 77631 -> 0 bytes .../__pycache__/idtracking.cpython-311.pyc | Bin 19501 -> 0 bytes .../jinja2/__pycache__/lexer.cpython-311.pyc | Bin 35654 -> 0 bytes .../__pycache__/loaders.cpython-311.pyc | Bin 34387 -> 0 bytes .../jinja2/__pycache__/meta.cpython-311.pyc | Bin 5691 -> 0 bytes .../__pycache__/nativetypes.cpython-311.pyc | Bin 7953 -> 0 bytes .../jinja2/__pycache__/nodes.cpython-311.pyc | Bin 64472 -> 0 bytes .../__pycache__/optimizer.cpython-311.pyc | Bin 2842 -> 0 bytes .../jinja2/__pycache__/parser.cpython-311.pyc | Bin 60018 -> 0 bytes .../__pycache__/runtime.cpython-311.pyc | Bin 51105 -> 0 bytes .../__pycache__/sandbox.cpython-311.pyc | Bin 19213 -> 0 bytes .../jinja2/__pycache__/tests.cpython-311.pyc | Bin 9262 -> 0 bytes .../jinja2/__pycache__/utils.cpython-311.pyc | Bin 37549 -> 0 bytes .../__pycache__/visitor.cpython-311.pyc | Bin 5690 -> 0 bytes .../site-packages/jinja2/_identifier.py | 6 - .../site-packages/jinja2/async_utils.py | 99 - .../site-packages/jinja2/bccache.py | 408 - .../site-packages/jinja2/compiler.py | 1998 ---- .../site-packages/jinja2/constants.py | 20 - .../python3.11/site-packages/jinja2/debug.py | 191 - .../site-packages/jinja2/defaults.py | 48 - .../site-packages/jinja2/environment.py | 1672 ---- .../site-packages/jinja2/exceptions.py | 166 - .../python3.11/site-packages/jinja2/ext.py | 870 -- .../site-packages/jinja2/filters.py | 1873 ---- .../site-packages/jinja2/idtracking.py | 318 - .../python3.11/site-packages/jinja2/lexer.py | 868 -- .../site-packages/jinja2/loaders.py | 693 -- .../python3.11/site-packages/jinja2/meta.py | 112 - .../site-packages/jinja2/nativetypes.py | 130 - .../python3.11/site-packages/jinja2/nodes.py | 1206 --- .../site-packages/jinja2/optimizer.py | 48 - .../python3.11/site-packages/jinja2/parser.py | 1049 -- .../python3.11/site-packages/jinja2/py.typed | 0 .../site-packages/jinja2/runtime.py | 1062 -- .../site-packages/jinja2/sandbox.py | 436 - .../python3.11/site-packages/jinja2/tests.py | 256 - .../python3.11/site-packages/jinja2/utils.py | 766 -- .../site-packages/jinja2/visitor.py | 92 - .../site-packages/markupsafe/__init__.py | 395 - .../__pycache__/__init__.cpython-311.pyc | Bin 25728 -> 0 bytes .../__pycache__/_native.cpython-311.pyc | Bin 679 -> 0 bytes .../site-packages/markupsafe/_native.py | 8 - .../site-packages/markupsafe/_speedups.c | 204 - .../_speedups.cpython-311-x86_64-linux-gnu.so | Bin 43456 -> 0 bytes .../site-packages/markupsafe/_speedups.pyi | 1 - .../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 | 996 -- .../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.11/site-packages/pip/__init__.py | 13 - .../python3.11/site-packages/pip/__main__.py | 31 - .../site-packages/pip/__pip-runner__.py | 50 - .../pip/__pycache__/__init__.cpython-311.pyc | Bin 764 -> 0 bytes .../pip/__pycache__/__main__.cpython-311.pyc | Bin 1073 -> 0 bytes .../__pip-runner__.cpython-311.pyc | Bin 2501 -> 0 bytes .../site-packages/pip/_internal/__init__.py | 19 - .../__pycache__/__init__.cpython-311.pyc | Bin 947 -> 0 bytes .../__pycache__/build_env.cpython-311.pyc | Bin 16067 -> 0 bytes .../__pycache__/cache.cpython-311.pyc | Bin 14692 -> 0 bytes .../__pycache__/configuration.cpython-311.pyc | Bin 19223 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 38352 -> 0 bytes .../__pycache__/main.cpython-311.pyc | Bin 747 -> 0 bytes .../__pycache__/pyproject.cpython-311.pyc | Bin 5515 -> 0 bytes .../self_outdated_check.cpython-311.pyc | Bin 11317 -> 0 bytes .../__pycache__/wheel_builder.cpython-311.pyc | Bin 15987 -> 0 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-311.pyc | Bin 282 -> 0 bytes .../autocompletion.cpython-311.pyc | Bin 10072 -> 0 bytes .../__pycache__/base_command.cpython-311.pyc | Bin 11070 -> 0 bytes .../__pycache__/cmdoptions.cpython-311.pyc | Bin 32969 -> 0 bytes .../command_context.cpython-311.pyc | Bin 2104 -> 0 bytes .../cli/__pycache__/main.cpython-311.pyc | Bin 2359 -> 0 bytes .../__pycache__/main_parser.cpython-311.pyc | Bin 5518 -> 0 bytes .../cli/__pycache__/parser.cpython-311.pyc | Bin 17019 -> 0 bytes .../__pycache__/progress_bars.cpython-311.pyc | Bin 3166 -> 0 bytes .../__pycache__/req_command.cpython-311.pyc | Bin 20131 -> 0 bytes .../cli/__pycache__/spinners.cpython-311.pyc | Bin 8831 -> 0 bytes .../__pycache__/status_codes.cpython-311.pyc | Bin 370 -> 0 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-311.pyc | Bin 4450 -> 0 bytes .../__pycache__/cache.cpython-311.pyc | Bin 10549 -> 0 bytes .../__pycache__/check.cpython-311.pyc | Bin 2300 -> 0 bytes .../__pycache__/completion.cpython-311.pyc | Bin 5462 -> 0 bytes .../__pycache__/configuration.cpython-311.pyc | Bin 14891 -> 0 bytes .../__pycache__/debug.cpython-311.pyc | Bin 11999 -> 0 bytes .../__pycache__/download.cpython-311.pyc | Bin 7806 -> 0 bytes .../__pycache__/freeze.cpython-311.pyc | Bin 4151 -> 0 bytes .../commands/__pycache__/hash.cpython-311.pyc | Bin 3352 -> 0 bytes .../commands/__pycache__/help.cpython-311.pyc | Bin 1964 -> 0 bytes .../__pycache__/index.cpython-311.pyc | Bin 7787 -> 0 bytes .../__pycache__/inspect.cpython-311.pyc | Bin 4440 -> 0 bytes .../__pycache__/install.cpython-311.pyc | Bin 35369 -> 0 bytes .../commands/__pycache__/list.cpython-311.pyc | Bin 17501 -> 0 bytes .../__pycache__/search.cpython-311.pyc | Bin 8946 -> 0 bytes .../commands/__pycache__/show.cpython-311.pyc | Bin 11289 -> 0 bytes .../__pycache__/uninstall.cpython-311.pyc | Bin 5140 -> 0 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 9946 -> 0 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 | 367 - .../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-311.pyc | Bin 1032 -> 0 bytes .../__pycache__/base.cpython-311.pyc | Bin 2404 -> 0 bytes .../__pycache__/installed.cpython-311.pyc | Bin 1541 -> 0 bytes .../__pycache__/sdist.cpython-311.pyc | Bin 8943 -> 0 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 2135 -> 0 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-311.pyc | Bin 236 -> 0 bytes .../__pycache__/collector.cpython-311.pyc | Bin 24542 -> 0 bytes .../package_finder.cpython-311.pyc | Bin 44214 -> 0 bytes .../index/__pycache__/sources.cpython-311.pyc | Bin 11018 -> 0 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-311.pyc | Bin 18174 -> 0 bytes .../__pycache__/_distutils.cpython-311.pyc | Bin 7583 -> 0 bytes .../__pycache__/_sysconfig.cpython-311.pyc | Bin 8878 -> 0 bytes .../__pycache__/base.cpython-311.pyc | Bin 3999 -> 0 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-311.pyc | Bin 6407 -> 0 bytes .../__pycache__/_json.cpython-311.pyc | Bin 3561 -> 0 bytes .../metadata/__pycache__/base.cpython-311.pyc | Bin 38006 -> 0 bytes .../__pycache__/pkg_resources.cpython-311.pyc | Bin 16854 -> 0 bytes .../pip/_internal/metadata/_json.py | 84 - .../pip/_internal/metadata/base.py | 688 -- .../_internal/metadata/importlib/__init__.py | 4 - .../__pycache__/__init__.cpython-311.pyc | Bin 353 -> 0 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 3560 -> 0 bytes .../__pycache__/_dists.cpython-311.pyc | Bin 14576 -> 0 bytes .../__pycache__/_envs.cpython-311.pyc | Bin 12414 -> 0 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-311.pyc | Bin 270 -> 0 bytes .../__pycache__/candidate.cpython-311.pyc | Bin 2089 -> 0 bytes .../__pycache__/direct_url.cpython-311.pyc | Bin 12252 -> 0 bytes .../format_control.cpython-311.pyc | Bin 4653 -> 0 bytes .../models/__pycache__/index.cpython-311.pyc | Bin 1895 -> 0 bytes .../installation_report.cpython-311.pyc | Bin 2609 -> 0 bytes .../models/__pycache__/link.cpython-311.pyc | Bin 26441 -> 0 bytes .../models/__pycache__/scheme.cpython-311.pyc | Bin 1261 -> 0 bytes .../__pycache__/search_scope.cpython-311.pyc | Bin 5824 -> 0 bytes .../selection_prefs.cpython-311.pyc | Bin 1992 -> 0 bytes .../__pycache__/target_python.cpython-311.pyc | Bin 4754 -> 0 bytes .../models/__pycache__/wheel.cpython-311.pyc | Bin 6417 -> 0 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-311.pyc | Bin 258 -> 0 bytes .../network/__pycache__/auth.cpython-311.pyc | Bin 19062 -> 0 bytes .../network/__pycache__/cache.cpython-311.pyc | Bin 5181 -> 0 bytes .../__pycache__/download.cpython-311.pyc | Bin 9573 -> 0 bytes .../__pycache__/lazy_wheel.cpython-311.pyc | Bin 13019 -> 0 bytes .../__pycache__/session.cpython-311.pyc | Bin 21286 -> 0 bytes .../network/__pycache__/utils.cpython-311.pyc | Bin 2407 -> 0 bytes .../__pycache__/xmlrpc.cpython-311.pyc | Bin 3186 -> 0 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-311.pyc | Bin 196 -> 0 bytes .../__pycache__/check.cpython-311.pyc | Bin 6629 -> 0 bytes .../__pycache__/freeze.cpython-311.pyc | Bin 11592 -> 0 bytes .../__pycache__/prepare.cpython-311.pyc | Bin 26376 -> 0 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 202 -> 0 bytes .../__pycache__/build_tracker.cpython-311.pyc | Bin 8125 -> 0 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 2273 -> 0 bytes .../metadata_editable.cpython-311.pyc | Bin 2309 -> 0 bytes .../metadata_legacy.cpython-311.pyc | Bin 3709 -> 0 bytes .../build/__pycache__/wheel.cpython-311.pyc | Bin 1939 -> 0 bytes .../wheel_editable.cpython-311.pyc | Bin 2383 -> 0 bytes .../__pycache__/wheel_legacy.cpython-311.pyc | Bin 4490 -> 0 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-311.pyc | Bin 270 -> 0 bytes .../editable_legacy.cpython-311.pyc | Bin 2266 -> 0 bytes .../__pycache__/legacy.cpython-311.pyc | Bin 6106 -> 0 bytes .../install/__pycache__/wheel.cpython-311.pyc | Bin 39992 -> 0 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-311.pyc | Bin 4442 -> 0 bytes .../__pycache__/constructors.cpython-311.pyc | Bin 20701 -> 0 bytes .../req/__pycache__/req_file.cpython-311.pyc | Bin 22430 -> 0 bytes .../__pycache__/req_install.cpython-311.pyc | Bin 40342 -> 0 bytes .../req/__pycache__/req_set.cpython-311.pyc | Bin 5998 -> 0 bytes .../__pycache__/req_uninstall.cpython-311.pyc | Bin 36996 -> 0 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-311.pyc | Bin 196 -> 0 bytes .../__pycache__/base.cpython-311.pyc | Bin 1367 -> 0 bytes .../pip/_internal/resolution/base.py | 20 - .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 203 -> 0 bytes .../__pycache__/resolver.cpython-311.pyc | Bin 23789 -> 0 bytes .../_internal/resolution/legacy/resolver.py | 600 -- .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 207 -> 0 bytes .../__pycache__/base.cpython-311.pyc | Bin 9620 -> 0 bytes .../__pycache__/candidates.cpython-311.pyc | Bin 28830 -> 0 bytes .../__pycache__/factory.cpython-311.pyc | Bin 31974 -> 0 bytes .../found_candidates.cpython-311.pyc | Bin 6755 -> 0 bytes .../__pycache__/provider.cpython-311.pyc | Bin 11049 -> 0 bytes .../__pycache__/reporter.cpython-311.pyc | Bin 4652 -> 0 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 11117 -> 0 bytes .../__pycache__/resolver.cpython-311.pyc | Bin 12304 -> 0 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-311.pyc | Bin 191 -> 0 bytes .../utils/__pycache__/_log.cpython-311.pyc | Bin 2012 -> 0 bytes .../utils/__pycache__/appdirs.cpython-311.pyc | Bin 2550 -> 0 bytes .../utils/__pycache__/compat.cpython-311.pyc | Bin 2258 -> 0 bytes .../compatibility_tags.cpython-311.pyc | Bin 6750 -> 0 bytes .../__pycache__/datetime.cpython-311.pyc | Bin 708 -> 0 bytes .../__pycache__/deprecation.cpython-311.pyc | Bin 7081 -> 0 bytes .../direct_url_helpers.cpython-311.pyc | Bin 3714 -> 0 bytes .../distutils_args.cpython-311.pyc | Bin 1458 -> 0 bytes .../__pycache__/egg_link.cpython-311.pyc | Bin 3229 -> 0 bytes .../__pycache__/encoding.cpython-311.pyc | Bin 2314 -> 0 bytes .../__pycache__/entrypoints.cpython-311.pyc | Bin 4236 -> 0 bytes .../__pycache__/filesystem.cpython-311.pyc | Bin 8221 -> 0 bytes .../__pycache__/filetypes.cpython-311.pyc | Bin 1307 -> 0 bytes .../utils/__pycache__/glibc.cpython-311.pyc | Bin 2550 -> 0 bytes .../utils/__pycache__/hashes.cpython-311.pyc | Bin 8328 -> 0 bytes .../inject_securetransport.cpython-311.pyc | Bin 1325 -> 0 bytes .../utils/__pycache__/logging.cpython-311.pyc | Bin 15450 -> 0 bytes .../utils/__pycache__/misc.cpython-311.pyc | Bin 37692 -> 0 bytes .../utils/__pycache__/models.cpython-311.pyc | Bin 2931 -> 0 bytes .../__pycache__/packaging.cpython-311.pyc | Bin 2798 -> 0 bytes .../setuptools_build.cpython-311.pyc | Bin 6095 -> 0 bytes .../__pycache__/subprocess.cpython-311.pyc | Bin 9885 -> 0 bytes .../__pycache__/temp_dir.cpython-311.pyc | Bin 11412 -> 0 bytes .../__pycache__/unpacking.cpython-311.pyc | Bin 12887 -> 0 bytes .../utils/__pycache__/urls.cpython-311.pyc | Bin 2684 -> 0 bytes .../__pycache__/virtualenv.cpython-311.pyc | Bin 4931 -> 0 bytes .../utils/__pycache__/wheel.cpython-311.pyc | Bin 7101 -> 0 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 | 763 -- .../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-311.pyc | Bin 626 -> 0 bytes .../vcs/__pycache__/bazaar.cpython-311.pyc | Bin 5851 -> 0 bytes .../vcs/__pycache__/git.cpython-311.pyc | Bin 21515 -> 0 bytes .../vcs/__pycache__/mercurial.cpython-311.pyc | Bin 8697 -> 0 bytes .../__pycache__/subversion.cpython-311.pyc | Bin 14594 -> 0 bytes .../versioncontrol.cpython-311.pyc | Bin 31863 -> 0 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-311.pyc | Bin 5604 -> 0 bytes .../_vendor/__pycache__/six.cpython-311.pyc | Bin 46406 -> 0 bytes .../typing_extensions.cpython-311.pyc | Bin 97436 -> 0 bytes .../pip/_vendor/cachecontrol/__init__.py | 18 - .../__pycache__/__init__.cpython-311.pyc | Bin 833 -> 0 bytes .../__pycache__/_cmd.cpython-311.pyc | Bin 2688 -> 0 bytes .../__pycache__/adapter.cpython-311.pyc | Bin 5495 -> 0 bytes .../__pycache__/cache.cpython-311.pyc | Bin 3769 -> 0 bytes .../__pycache__/compat.cpython-311.pyc | Bin 1126 -> 0 bytes .../__pycache__/controller.cpython-311.pyc | Bin 16441 -> 0 bytes .../__pycache__/filewrapper.cpython-311.pyc | Bin 4228 -> 0 bytes .../__pycache__/heuristics.cpython-311.pyc | Bin 6673 -> 0 bytes .../__pycache__/serialize.cpython-311.pyc | Bin 8388 -> 0 bytes .../__pycache__/wrapper.cpython-311.pyc | Bin 954 -> 0 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-311.pyc | Bin 408 -> 0 bytes .../__pycache__/file_cache.cpython-311.pyc | Bin 8391 -> 0 bytes .../__pycache__/redis_cache.cpython-311.pyc | Bin 2488 -> 0 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-311.pyc | Bin 333 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 734 -> 0 bytes .../certifi/__pycache__/core.cpython-311.pyc | Bin 3976 -> 0 bytes .../pip/_vendor/certifi/cacert.pem | 4527 --------- .../site-packages/pip/_vendor/certifi/core.py | 119 - .../pip/_vendor/chardet/__init__.py | 115 - .../__pycache__/__init__.cpython-311.pyc | Bin 5065 -> 0 bytes .../__pycache__/big5freq.cpython-311.pyc | Bin 27195 -> 0 bytes .../__pycache__/big5prober.cpython-311.pyc | Bin 1670 -> 0 bytes .../chardistribution.cpython-311.pyc | Bin 11262 -> 0 bytes .../charsetgroupprober.cpython-311.pyc | Bin 4292 -> 0 bytes .../__pycache__/charsetprober.cpython-311.pyc | Bin 5538 -> 0 bytes .../codingstatemachine.cpython-311.pyc | Bin 3989 -> 0 bytes .../codingstatemachinedict.cpython-311.pyc | Bin 945 -> 0 bytes .../__pycache__/cp949prober.cpython-311.pyc | Bin 1679 -> 0 bytes .../chardet/__pycache__/enums.cpython-311.pyc | Bin 3380 -> 0 bytes .../__pycache__/escprober.cpython-311.pyc | Bin 4896 -> 0 bytes .../chardet/__pycache__/escsm.cpython-311.pyc | Bin 12635 -> 0 bytes .../__pycache__/eucjpprober.cpython-311.pyc | Bin 4722 -> 0 bytes .../__pycache__/euckrfreq.cpython-311.pyc | Bin 12078 -> 0 bytes .../__pycache__/euckrprober.cpython-311.pyc | Bin 1671 -> 0 bytes .../__pycache__/euctwfreq.cpython-311.pyc | Bin 27200 -> 0 bytes .../__pycache__/euctwprober.cpython-311.pyc | Bin 1671 -> 0 bytes .../__pycache__/gb2312freq.cpython-311.pyc | Bin 19122 -> 0 bytes .../__pycache__/gb2312prober.cpython-311.pyc | Bin 1686 -> 0 bytes .../__pycache__/hebrewprober.cpython-311.pyc | Bin 5675 -> 0 bytes .../__pycache__/jisfreq.cpython-311.pyc | Bin 22151 -> 0 bytes .../__pycache__/johabfreq.cpython-311.pyc | Bin 84655 -> 0 bytes .../__pycache__/johabprober.cpython-311.pyc | Bin 1677 -> 0 bytes .../__pycache__/jpcntx.cpython-311.pyc | Bin 40159 -> 0 bytes .../langbulgarianmodel.cpython-311.pyc | Bin 85829 -> 0 bytes .../langgreekmodel.cpython-311.pyc | Bin 79251 -> 0 bytes .../langhebrewmodel.cpython-311.pyc | Bin 80013 -> 0 bytes .../langhungarianmodel.cpython-311.pyc | Bin 85783 -> 0 bytes .../langrussianmodel.cpython-311.pyc | Bin 108730 -> 0 bytes .../__pycache__/langthaimodel.cpython-311.pyc | Bin 80191 -> 0 bytes .../langturkishmodel.cpython-311.pyc | Bin 80030 -> 0 bytes .../__pycache__/latin1prober.cpython-311.pyc | Bin 7326 -> 0 bytes .../macromanprober.cpython-311.pyc | Bin 7493 -> 0 bytes .../mbcharsetprober.cpython-311.pyc | Bin 4114 -> 0 bytes .../mbcsgroupprober.cpython-311.pyc | Bin 1984 -> 0 bytes .../__pycache__/mbcssm.cpython-311.pyc | Bin 31724 -> 0 bytes .../__pycache__/resultdict.cpython-311.pyc | Bin 763 -> 0 bytes .../sbcharsetprober.cpython-311.pyc | Bin 6389 -> 0 bytes .../sbcsgroupprober.cpython-311.pyc | Bin 2934 -> 0 bytes .../__pycache__/sjisprober.cpython-311.pyc | Bin 4827 -> 0 bytes .../universaldetector.cpython-311.pyc | Bin 12455 -> 0 bytes .../__pycache__/utf1632prober.cpython-311.pyc | Bin 10575 -> 0 bytes .../__pycache__/utf8prober.cpython-311.pyc | Bin 3462 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 498 -> 0 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-311.pyc | Bin 195 -> 0 bytes .../__pycache__/chardetect.cpython-311.pyc | Bin 4334 -> 0 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-311.pyc | Bin 200 -> 0 bytes .../__pycache__/languages.cpython-311.pyc | Bin 10800 -> 0 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-311.pyc | Bin 567 -> 0 bytes .../colorama/__pycache__/ansi.cpython-311.pyc | Bin 4565 -> 0 bytes .../__pycache__/ansitowin32.cpython-311.pyc | Bin 16211 -> 0 bytes .../__pycache__/initialise.cpython-311.pyc | Bin 3928 -> 0 bytes .../__pycache__/win32.cpython-311.pyc | Bin 7916 -> 0 bytes .../__pycache__/winterm.cpython-311.pyc | Bin 9142 -> 0 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-311.pyc | Bin 198 -> 0 bytes .../__pycache__/ansi_test.cpython-311.pyc | Bin 5843 -> 0 bytes .../ansitowin32_test.cpython-311.pyc | Bin 21510 -> 0 bytes .../initialise_test.cpython-311.pyc | Bin 14137 -> 0 bytes .../__pycache__/isatty_test.cpython-311.pyc | Bin 6702 -> 0 bytes .../tests/__pycache__/utils.cpython-311.pyc | Bin 2877 -> 0 bytes .../__pycache__/winterm_test.cpython-311.pyc | Bin 7230 -> 0 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-311.pyc | Bin 1436 -> 0 bytes .../__pycache__/compat.cpython-311.pyc | Bin 52302 -> 0 bytes .../__pycache__/database.cpython-311.pyc | Bin 72090 -> 0 bytes .../distlib/__pycache__/index.cpython-311.pyc | Bin 26679 -> 0 bytes .../__pycache__/locators.cpython-311.pyc | Bin 65855 -> 0 bytes .../__pycache__/manifest.cpython-311.pyc | Bin 17022 -> 0 bytes .../__pycache__/markers.cpython-311.pyc | Bin 8158 -> 0 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 47106 -> 0 bytes .../__pycache__/resources.cpython-311.pyc | Bin 18985 -> 0 bytes .../__pycache__/scripts.cpython-311.pyc | Bin 21261 -> 0 bytes .../distlib/__pycache__/util.cpython-311.pyc | Bin 97440 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 34567 -> 0 bytes .../distlib/__pycache__/wheel.cpython-311.pyc | Bin 60371 -> 0 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/util.py | 1932 ---- .../pip/_vendor/distlib/version.py | 739 -- .../pip/_vendor/distlib/wheel.py | 1082 -- .../pip/_vendor/distro/__init__.py | 54 - .../pip/_vendor/distro/__main__.py | 4 - .../__pycache__/__init__.cpython-311.pyc | Bin 1189 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 323 -> 0 bytes .../distro/__pycache__/distro.cpython-311.pyc | Bin 57722 -> 0 bytes .../pip/_vendor/distro/distro.py | 1399 --- .../pip/_vendor/idna/__init__.py | 44 - .../idna/__pycache__/__init__.cpython-311.pyc | Bin 1090 -> 0 bytes .../idna/__pycache__/codec.cpython-311.pyc | Bin 5381 -> 0 bytes .../idna/__pycache__/compat.cpython-311.pyc | Bin 1007 -> 0 bytes .../idna/__pycache__/core.cpython-311.pyc | Bin 19442 -> 0 bytes .../idna/__pycache__/idnadata.cpython-311.pyc | Bin 38966 -> 0 bytes .../__pycache__/intranges.cpython-311.pyc | Bin 2975 -> 0 bytes .../__pycache__/package_data.cpython-311.pyc | Bin 210 -> 0 bytes .../__pycache__/uts46data.cpython-311.pyc | Bin 163190 -> 0 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-311.pyc | Bin 2069 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 2370 -> 0 bytes .../msgpack/__pycache__/ext.cpython-311.pyc | Bin 9156 -> 0 bytes .../__pycache__/fallback.cpython-311.pyc | Bin 47183 -> 0 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-311.pyc | Bin 634 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 555 -> 0 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 13221 -> 0 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 7989 -> 0 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 3677 -> 0 bytes .../__pycache__/markers.cpython-311.pyc | Bin 16517 -> 0 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 7632 -> 0 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 34355 -> 0 bytes .../__pycache__/tags.cpython-311.pyc | Bin 21340 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 6675 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 21867 -> 0 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-311.pyc | Bin 158223 -> 0 bytes .../__pycache__/py31compat.cpython-311.pyc | Bin 976 -> 0 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 - .../pip/_vendor/platformdirs/__init__.py | 342 - .../pip/_vendor/platformdirs/__main__.py | 46 - .../__pycache__/__init__.cpython-311.pyc | Bin 12922 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 2119 -> 0 bytes .../__pycache__/android.cpython-311.pyc | Bin 6349 -> 0 bytes .../__pycache__/api.cpython-311.pyc | Bin 7176 -> 0 bytes .../__pycache__/macos.cpython-311.pyc | Bin 4586 -> 0 bytes .../__pycache__/unix.cpython-311.pyc | Bin 11018 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 305 -> 0 bytes .../__pycache__/windows.cpython-311.pyc | Bin 9954 -> 0 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-311.pyc | Bin 3837 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 773 -> 0 bytes .../__pycache__/cmdline.cpython-311.pyc | Bin 30284 -> 0 bytes .../__pycache__/console.cpython-311.pyc | Bin 3036 -> 0 bytes .../__pycache__/filter.cpython-311.pyc | Bin 3497 -> 0 bytes .../__pycache__/formatter.cpython-311.pyc | Bin 3863 -> 0 bytes .../__pycache__/lexer.cpython-311.pyc | Bin 40391 -> 0 bytes .../__pycache__/modeline.cpython-311.pyc | Bin 1716 -> 0 bytes .../__pycache__/plugin.cpython-311.pyc | Bin 3729 -> 0 bytes .../__pycache__/regexopt.cpython-311.pyc | Bin 5023 -> 0 bytes .../__pycache__/scanner.cpython-311.pyc | Bin 4878 -> 0 bytes .../__pycache__/sphinxext.cpython-311.pyc | Bin 8309 -> 0 bytes .../__pycache__/style.cpython-311.pyc | Bin 7417 -> 0 bytes .../__pycache__/token.cpython-311.pyc | Bin 7457 -> 0 bytes .../__pycache__/unistring.cpython-311.pyc | Bin 33791 -> 0 bytes .../pygments/__pycache__/util.cpython-311.pyc | Bin 14584 -> 0 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-311.pyc | Bin 40097 -> 0 bytes .../pip/_vendor/pygments/formatter.py | 94 - .../_vendor/pygments/formatters/__init__.py | 143 - .../__pycache__/__init__.cpython-311.pyc | Bin 6863 -> 0 bytes .../__pycache__/_mapping.cpython-311.pyc | Bin 4145 -> 0 bytes .../__pycache__/bbcode.cpython-311.pyc | Bin 4471 -> 0 bytes .../__pycache__/groff.cpython-311.pyc | Bin 7804 -> 0 bytes .../__pycache__/html.cpython-311.pyc | Bin 42589 -> 0 bytes .../__pycache__/img.cpython-311.pyc | Bin 28561 -> 0 bytes .../__pycache__/irc.cpython-311.pyc | Bin 7664 -> 0 bytes .../__pycache__/latex.cpython-311.pyc | Bin 21797 -> 0 bytes .../__pycache__/other.cpython-311.pyc | Bin 7625 -> 0 bytes .../__pycache__/pangomarkup.cpython-311.pyc | Bin 3169 -> 0 bytes .../__pycache__/rtf.cpython-311.pyc | Bin 6836 -> 0 bytes .../__pycache__/svg.cpython-311.pyc | Bin 9656 -> 0 bytes .../__pycache__/terminal.cpython-311.pyc | Bin 6035 -> 0 bytes .../__pycache__/terminal256.cpython-311.pyc | Bin 16401 -> 0 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-311.pyc | Bin 15140 -> 0 bytes .../__pycache__/_mapping.cpython-311.pyc | Bin 62771 -> 0 bytes .../lexers/__pycache__/python.cpython-311.pyc | Bin 43972 -> 0 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-311.pyc | Bin 4450 -> 0 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-311.pyc | Bin 8340 -> 0 bytes .../__pycache__/actions.cpython-311.pyc | Bin 8454 -> 0 bytes .../__pycache__/common.cpython-311.pyc | Bin 14776 -> 0 bytes .../__pycache__/core.cpython-311.pyc | Bin 277662 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 12918 -> 0 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 53619 -> 0 bytes .../__pycache__/results.cpython-311.pyc | Bin 36302 -> 0 bytes .../__pycache__/testing.cpython-311.pyc | Bin 19498 -> 0 bytes .../__pycache__/unicode.cpython-311.pyc | Bin 15356 -> 0 bytes .../__pycache__/util.cpython-311.pyc | Bin 14255 -> 0 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-311.pyc | Bin 28021 -> 0 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-311.pyc | Bin 698 -> 0 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 396 -> 0 bytes .../__pycache__/_impl.cpython-311.pyc | Bin 16662 -> 0 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-311.pyc | Bin 1158 -> 0 bytes .../__pycache__/_in_process.cpython-311.pyc | Bin 16480 -> 0 bytes .../_in_process/_in_process.py | 353 - .../pip/_vendor/requests/__init__.py | 182 - .../__pycache__/__init__.cpython-311.pyc | Bin 6442 -> 0 bytes .../__pycache__/__version__.cpython-311.pyc | Bin 579 -> 0 bytes .../_internal_utils.cpython-311.pyc | Bin 2076 -> 0 bytes .../__pycache__/adapters.cpython-311.pyc | Bin 24879 -> 0 bytes .../requests/__pycache__/api.cpython-311.pyc | Bin 7424 -> 0 bytes .../requests/__pycache__/auth.cpython-311.pyc | Bin 14623 -> 0 bytes .../__pycache__/certs.cpython-311.pyc | Bin 975 -> 0 bytes .../__pycache__/compat.cpython-311.pyc | Bin 1801 -> 0 bytes .../__pycache__/cookies.cpython-311.pyc | Bin 27103 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 8518 -> 0 bytes .../requests/__pycache__/help.cpython-311.pyc | Bin 4513 -> 0 bytes .../__pycache__/hooks.cpython-311.pyc | Bin 1243 -> 0 bytes .../__pycache__/models.cpython-311.pyc | Bin 38774 -> 0 bytes .../__pycache__/packages.cpython-311.pyc | Bin 823 -> 0 bytes .../__pycache__/sessions.cpython-311.pyc | Bin 29612 -> 0 bytes .../__pycache__/status_codes.cpython-311.pyc | Bin 6230 -> 0 bytes .../__pycache__/structures.cpython-311.pyc | Bin 6215 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 40129 -> 0 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-311.pyc | Bin 746 -> 0 bytes .../__pycache__/providers.cpython-311.pyc | Bin 7065 -> 0 bytes .../__pycache__/reporters.cpython-311.pyc | Bin 2795 -> 0 bytes .../__pycache__/resolvers.cpython-311.pyc | Bin 25241 -> 0 bytes .../__pycache__/structs.cpython-311.pyc | Bin 11323 -> 0 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 201 -> 0 bytes .../collections_abc.cpython-311.pyc | Bin 476 -> 0 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-311.pyc | Bin 7489 -> 0 bytes .../rich/__pycache__/__main__.cpython-311.pyc | Bin 11567 -> 0 bytes .../__pycache__/_cell_widths.cpython-311.pyc | Bin 7828 -> 0 bytes .../__pycache__/_emoji_codes.cpython-311.pyc | Bin 208515 -> 0 bytes .../_emoji_replace.cpython-311.pyc | Bin 1927 -> 0 bytes .../_export_format.cpython-311.pyc | Bin 2332 -> 0 bytes .../__pycache__/_extension.cpython-311.pyc | Bin 628 -> 0 bytes .../rich/__pycache__/_inspect.cpython-311.pyc | Bin 14180 -> 0 bytes .../__pycache__/_log_render.cpython-311.pyc | Bin 4762 -> 0 bytes .../rich/__pycache__/_loop.cpython-311.pyc | Bin 2108 -> 0 bytes .../__pycache__/_null_file.cpython-311.pyc | Bin 4673 -> 0 bytes .../__pycache__/_palettes.cpython-311.pyc | Bin 5244 -> 0 bytes .../rich/__pycache__/_pick.cpython-311.pyc | Bin 789 -> 0 bytes .../rich/__pycache__/_ratio.cpython-311.pyc | Bin 7927 -> 0 bytes .../__pycache__/_spinners.cpython-311.pyc | Bin 13677 -> 0 bytes .../rich/__pycache__/_stack.cpython-311.pyc | Bin 1123 -> 0 bytes .../rich/__pycache__/_timer.cpython-311.pyc | Bin 976 -> 0 bytes .../_win32_console.cpython-311.pyc | Bin 30164 -> 0 bytes .../rich/__pycache__/_windows.cpython-311.pyc | Bin 2823 -> 0 bytes .../_windows_renderer.cpython-311.pyc | Bin 4014 -> 0 bytes .../rich/__pycache__/_wrap.cpython-311.pyc | Bin 2779 -> 0 bytes .../rich/__pycache__/abc.cpython-311.pyc | Bin 1920 -> 0 bytes .../rich/__pycache__/align.cpython-311.pyc | Bin 13469 -> 0 bytes .../rich/__pycache__/ansi.cpython-311.pyc | Bin 10445 -> 0 bytes .../rich/__pycache__/bar.cpython-311.pyc | Bin 4542 -> 0 bytes .../rich/__pycache__/box.cpython-311.pyc | Bin 12984 -> 0 bytes .../rich/__pycache__/cells.cpython-311.pyc | Bin 6434 -> 0 bytes .../rich/__pycache__/color.cpython-311.pyc | Bin 27565 -> 0 bytes .../__pycache__/color_triplet.cpython-311.pyc | Bin 1868 -> 0 bytes .../rich/__pycache__/columns.cpython-311.pyc | Bin 10639 -> 0 bytes .../rich/__pycache__/console.cpython-311.pyc | Bin 123155 -> 0 bytes .../__pycache__/constrain.cpython-311.pyc | Bin 2460 -> 0 bytes .../__pycache__/containers.cpython-311.pyc | Bin 10801 -> 0 bytes .../rich/__pycache__/control.cpython-311.pyc | Bin 11892 -> 0 bytes .../default_styles.cpython-311.pyc | Bin 12492 -> 0 bytes .../rich/__pycache__/diagnose.cpython-311.pyc | Bin 1815 -> 0 bytes .../rich/__pycache__/emoji.cpython-311.pyc | Bin 4793 -> 0 bytes .../rich/__pycache__/errors.cpython-311.pyc | Bin 2324 -> 0 bytes .../__pycache__/file_proxy.cpython-311.pyc | Bin 3772 -> 0 bytes .../rich/__pycache__/filesize.cpython-311.pyc | Bin 3296 -> 0 bytes .../__pycache__/highlighter.cpython-311.pyc | Bin 10983 -> 0 bytes .../rich/__pycache__/json.cpython-311.pyc | Bin 6676 -> 0 bytes .../rich/__pycache__/jupyter.cpython-311.pyc | Bin 6399 -> 0 bytes .../rich/__pycache__/layout.cpython-311.pyc | Bin 23306 -> 0 bytes .../rich/__pycache__/live.cpython-311.pyc | Bin 21127 -> 0 bytes .../__pycache__/live_render.cpython-311.pyc | Bin 5140 -> 0 bytes .../rich/__pycache__/logging.cpython-311.pyc | Bin 14511 -> 0 bytes .../rich/__pycache__/markup.cpython-311.pyc | Bin 10433 -> 0 bytes .../rich/__pycache__/measure.cpython-311.pyc | Bin 7266 -> 0 bytes .../rich/__pycache__/padding.cpython-311.pyc | Bin 7482 -> 0 bytes .../rich/__pycache__/pager.cpython-311.pyc | Bin 2240 -> 0 bytes .../rich/__pycache__/palette.cpython-311.pyc | Bin 5973 -> 0 bytes .../rich/__pycache__/panel.cpython-311.pyc | Bin 12729 -> 0 bytes .../rich/__pycache__/pretty.cpython-311.pyc | Bin 44822 -> 0 bytes .../rich/__pycache__/progress.cpython-311.pyc | Bin 82701 -> 0 bytes .../__pycache__/progress_bar.cpython-311.pyc | Bin 11007 -> 0 bytes .../rich/__pycache__/prompt.cpython-311.pyc | Bin 16373 -> 0 bytes .../rich/__pycache__/protocol.cpython-311.pyc | Bin 2091 -> 0 bytes .../rich/__pycache__/region.cpython-311.pyc | Bin 654 -> 0 bytes .../rich/__pycache__/repr.cpython-311.pyc | Bin 7653 -> 0 bytes .../rich/__pycache__/rule.cpython-311.pyc | Bin 7692 -> 0 bytes .../rich/__pycache__/scope.cpython-311.pyc | Bin 4346 -> 0 bytes .../rich/__pycache__/screen.cpython-311.pyc | Bin 2769 -> 0 bytes .../rich/__pycache__/segment.cpython-311.pyc | Bin 31536 -> 0 bytes .../rich/__pycache__/spinner.cpython-311.pyc | Bin 6885 -> 0 bytes .../rich/__pycache__/status.cpython-311.pyc | Bin 6753 -> 0 bytes .../rich/__pycache__/style.cpython-311.pyc | Bin 34326 -> 0 bytes .../rich/__pycache__/styled.cpython-311.pyc | Bin 2434 -> 0 bytes .../rich/__pycache__/syntax.cpython-311.pyc | Bin 42528 -> 0 bytes .../rich/__pycache__/table.cpython-311.pyc | Bin 48795 -> 0 bytes .../terminal_theme.cpython-311.pyc | Bin 3700 -> 0 bytes .../rich/__pycache__/text.cpython-311.pyc | Bin 65211 -> 0 bytes .../rich/__pycache__/theme.cpython-311.pyc | Bin 7138 -> 0 bytes .../rich/__pycache__/themes.cpython-311.pyc | Bin 350 -> 0 bytes .../__pycache__/traceback.cpython-311.pyc | Bin 31664 -> 0 bytes .../rich/__pycache__/tree.cpython-311.pyc | Bin 12521 -> 0 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-311.pyc | Bin 27788 -> 0 bytes .../__pycache__/_asyncio.cpython-311.pyc | Bin 4795 -> 0 bytes .../__pycache__/_utils.cpython-311.pyc | Bin 2060 -> 0 bytes .../__pycache__/after.cpython-311.pyc | Bin 1687 -> 0 bytes .../__pycache__/before.cpython-311.pyc | Bin 1521 -> 0 bytes .../__pycache__/before_sleep.cpython-311.pyc | Bin 2098 -> 0 bytes .../tenacity/__pycache__/nap.cpython-311.pyc | Bin 1560 -> 0 bytes .../__pycache__/retry.cpython-311.pyc | Bin 15034 -> 0 bytes .../tenacity/__pycache__/stop.cpython-311.pyc | Bin 5888 -> 0 bytes .../__pycache__/tornadoweb.cpython-311.pyc | Bin 2906 -> 0 bytes .../tenacity/__pycache__/wait.cpython-311.pyc | Bin 13360 -> 0 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-311.pyc | Bin 405 -> 0 bytes .../tomli/__pycache__/_parser.cpython-311.pyc | Bin 30844 -> 0 bytes .../tomli/__pycache__/_re.cpython-311.pyc | Bin 4484 -> 0 bytes .../tomli/__pycache__/_types.cpython-311.pyc | Bin 397 -> 0 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-311.pyc | Bin 3703 -> 0 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 18291 -> 0 bytes .../__pycache__/_version.cpython-311.pyc | Bin 213 -> 0 bytes .../__pycache__/connection.cpython-311.pyc | Bin 21887 -> 0 bytes .../connectionpool.cpython-311.pyc | Bin 37630 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 16117 -> 0 bytes .../__pycache__/fields.cpython-311.pyc | Bin 11410 -> 0 bytes .../__pycache__/filepost.cpython-311.pyc | Bin 4491 -> 0 bytes .../__pycache__/poolmanager.cpython-311.pyc | Bin 21814 -> 0 bytes .../__pycache__/request.cpython-311.pyc | Bin 6654 -> 0 bytes .../__pycache__/response.cpython-311.pyc | Bin 36537 -> 0 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-311.pyc | Bin 199 -> 0 bytes .../_appengine_environ.cpython-311.pyc | Bin 1938 -> 0 bytes .../__pycache__/appengine.cpython-311.pyc | Bin 12145 -> 0 bytes .../__pycache__/ntlmpool.cpython-311.pyc | Bin 6222 -> 0 bytes .../__pycache__/pyopenssl.cpython-311.pyc | Bin 25731 -> 0 bytes .../securetransport.cpython-311.pyc | Bin 36838 -> 0 bytes .../contrib/__pycache__/socks.cpython-311.pyc | Bin 8083 -> 0 bytes .../urllib3/contrib/_appengine_environ.py | 36 - .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 216 -> 0 bytes .../__pycache__/bindings.cpython-311.pyc | Bin 16963 -> 0 bytes .../__pycache__/low_level.cpython-311.pyc | Bin 15600 -> 0 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-311.pyc | Bin 200 -> 0 bytes .../packages/__pycache__/six.cpython-311.pyc | Bin 46442 -> 0 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 210 -> 0 bytes .../__pycache__/makefile.cpython-311.pyc | Bin 1957 -> 0 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-311.pyc | Bin 1402 -> 0 bytes .../__pycache__/connection.cpython-311.pyc | Bin 5129 -> 0 bytes .../util/__pycache__/proxy.cpython-311.pyc | Bin 1711 -> 0 bytes .../util/__pycache__/queue.cpython-311.pyc | Bin 1494 -> 0 bytes .../util/__pycache__/request.cpython-311.pyc | Bin 4614 -> 0 bytes .../util/__pycache__/response.cpython-311.pyc | Bin 3483 -> 0 bytes .../util/__pycache__/retry.cpython-311.pyc | Bin 22751 -> 0 bytes .../util/__pycache__/ssl_.cpython-311.pyc | Bin 16814 -> 0 bytes .../ssl_match_hostname.cpython-311.pyc | Bin 5793 -> 0 bytes .../__pycache__/ssltransport.cpython-311.pyc | Bin 11622 -> 0 bytes .../util/__pycache__/timeout.cpython-311.pyc | Bin 11030 -> 0 bytes .../util/__pycache__/url.cpython-311.pyc | Bin 17554 -> 0 bytes .../util/__pycache__/wait.cpython-311.pyc | Bin 4996 -> 0 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-311.pyc | Bin 12876 -> 0 bytes .../__pycache__/labels.cpython-311.pyc | Bin 7276 -> 0 bytes .../__pycache__/mklabels.cpython-311.pyc | Bin 3204 -> 0 bytes .../__pycache__/tests.cpython-311.pyc | Bin 11182 -> 0 bytes .../x_user_defined.cpython-311.pyc | Bin 3556 -> 0 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.11/site-packages/pip/py.typed | 4 - .../site-packages/pkg_resources/__init__.py | 3282 ------- .../__pycache__/__init__.cpython-311.pyc | Bin 156107 -> 0 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 193 -> 0 bytes .../typing_extensions.cpython-311.pyc | Bin 97410 -> 0 bytes .../_vendor/__pycache__/zipp.cpython-311.pyc | Bin 15986 -> 0 bytes .../_vendor/importlib_resources/__init__.py | 36 - .../__pycache__/__init__.cpython-311.pyc | Bin 827 -> 0 bytes .../__pycache__/_adapters.cpython-311.pyc | Bin 10744 -> 0 bytes .../__pycache__/_common.cpython-311.pyc | Bin 4271 -> 0 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 5556 -> 0 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 1389 -> 0 bytes .../__pycache__/_legacy.cpython-311.pyc | Bin 6487 -> 0 bytes .../__pycache__/abc.cpython-311.pyc | Bin 7488 -> 0 bytes .../__pycache__/readers.cpython-311.pyc | Bin 8362 -> 0 bytes .../__pycache__/simple.cpython-311.pyc | Bin 6384 -> 0 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-311.pyc | Bin 200 -> 0 bytes .../__pycache__/context.cpython-311.pyc | Bin 10975 -> 0 bytes .../__pycache__/functools.cpython-311.pyc | Bin 20286 -> 0 bytes .../pkg_resources/_vendor/jaraco/context.py | 253 - .../pkg_resources/_vendor/jaraco/functools.py | 525 - .../_vendor/jaraco/text/__init__.py | 599 -- .../text/__pycache__/__init__.cpython-311.pyc | Bin 26603 -> 0 bytes .../_vendor/more_itertools/__init__.py | 6 - .../__pycache__/__init__.cpython-311.pyc | Bin 372 -> 0 bytes .../__pycache__/more.cpython-311.pyc | Bin 169494 -> 0 bytes .../__pycache__/recipes.cpython-311.pyc | Bin 33514 -> 0 bytes .../_vendor/more_itertools/more.py | 4346 --------- .../_vendor/more_itertools/recipes.py | 841 -- .../_vendor/packaging/__about__.py | 26 - .../_vendor/packaging/__init__.py | 25 - .../__pycache__/__about__.cpython-311.pyc | Bin 644 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 565 -> 0 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 13231 -> 0 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 7999 -> 0 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 3687 -> 0 bytes .../__pycache__/markers.cpython-311.pyc | Bin 16536 -> 0 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 7651 -> 0 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 34365 -> 0 bytes .../__pycache__/tags.cpython-311.pyc | Bin 21350 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 6685 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 21877 -> 0 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/platformdirs/__init__.py | 342 - .../_vendor/platformdirs/__main__.py | 46 - .../__pycache__/__init__.cpython-311.pyc | Bin 12825 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 2117 -> 0 bytes .../__pycache__/android.cpython-311.pyc | Bin 6359 -> 0 bytes .../__pycache__/api.cpython-311.pyc | Bin 7186 -> 0 bytes .../__pycache__/macos.cpython-311.pyc | Bin 4596 -> 0 bytes .../__pycache__/unix.cpython-311.pyc | Bin 11028 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 315 -> 0 bytes .../__pycache__/windows.cpython-311.pyc | Bin 9964 -> 0 bytes .../_vendor/platformdirs/android.py | 120 - .../pkg_resources/_vendor/platformdirs/api.py | 156 - .../_vendor/platformdirs/macos.py | 64 - .../_vendor/platformdirs/unix.py | 181 - .../_vendor/platformdirs/version.py | 4 - .../_vendor/platformdirs/windows.py | 184 - .../_vendor/pyparsing/__init__.py | 331 - .../__pycache__/__init__.cpython-311.pyc | Bin 8338 -> 0 bytes .../__pycache__/actions.cpython-311.pyc | Bin 8464 -> 0 bytes .../__pycache__/common.cpython-311.pyc | Bin 14786 -> 0 bytes .../__pycache__/core.cpython-311.pyc | Bin 277638 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 12928 -> 0 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 53629 -> 0 bytes .../__pycache__/results.cpython-311.pyc | Bin 36312 -> 0 bytes .../__pycache__/testing.cpython-311.pyc | Bin 19508 -> 0 bytes .../__pycache__/unicode.cpython-311.pyc | Bin 15366 -> 0 bytes .../__pycache__/util.cpython-311.pyc | Bin 14265 -> 0 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-311.pyc | Bin 28001 -> 0 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 - .../_vendor/typing_extensions.py | 2209 ----- .../pkg_resources/_vendor/zipp.py | 329 - .../pkg_resources/extern/__init__.py | 81 - .../__pycache__/__init__.cpython-311.pyc | Bin 4316 -> 0 bytes .../pydantic-2.11.1.dist-info/INSTALLER | 1 - .../pydantic-2.11.1.dist-info/METADATA | 679 -- .../pydantic-2.11.1.dist-info/RECORD | 215 - .../pydantic-2.11.1.dist-info/WHEEL | 4 - .../licenses/LICENSE | 21 - .../site-packages/pydantic/__init__.py | 445 - .../__pycache__/__init__.cpython-311.pyc | Bin 13386 -> 0 bytes .../__pycache__/_migration.cpython-311.pyc | Bin 11359 -> 0 bytes .../alias_generators.cpython-311.pyc | Bin 3516 -> 0 bytes .../__pycache__/aliases.cpython-311.pyc | Bin 7204 -> 0 bytes .../annotated_handlers.cpython-311.pyc | Bin 5840 -> 0 bytes .../class_validators.cpython-311.pyc | Bin 389 -> 0 bytes .../__pycache__/color.cpython-311.pyc | Bin 32477 -> 0 bytes .../__pycache__/config.cpython-311.pyc | Bin 7995 -> 0 bytes .../__pycache__/dataclasses.cpython-311.pyc | Bin 14995 -> 0 bytes .../datetime_parse.cpython-311.pyc | Bin 389 -> 0 bytes .../__pycache__/decorator.cpython-311.pyc | Bin 379 -> 0 bytes .../__pycache__/env_settings.cpython-311.pyc | Bin 385 -> 0 bytes .../error_wrappers.cpython-311.pyc | Bin 389 -> 0 bytes .../__pycache__/errors.cpython-311.pyc | Bin 8854 -> 0 bytes .../__pycache__/fields.cpython-311.pyc | Bin 64415 -> 0 bytes .../functional_serializers.cpython-311.pyc | Bin 18720 -> 0 bytes .../functional_validators.cpython-311.pyc | Bin 34316 -> 0 bytes .../__pycache__/generics.cpython-311.pyc | Bin 377 -> 0 bytes .../pydantic/__pycache__/json.cpython-311.pyc | Bin 369 -> 0 bytes .../__pycache__/json_schema.cpython-311.pyc | Bin 127684 -> 0 bytes .../pydantic/__pycache__/main.cpython-311.pyc | Bin 79118 -> 0 bytes .../pydantic/__pycache__/mypy.cpython-311.pyc | Bin 65904 -> 0 bytes .../__pycache__/networks.cpython-311.pyc | Bin 53623 -> 0 bytes .../__pycache__/parse.cpython-311.pyc | Bin 371 -> 0 bytes .../__pycache__/root_model.cpython-311.pyc | Bin 8587 -> 0 bytes .../__pycache__/schema.cpython-311.pyc | Bin 373 -> 0 bytes .../__pycache__/tools.cpython-311.pyc | Bin 371 -> 0 bytes .../__pycache__/type_adapter.cpython-311.pyc | Bin 32294 -> 0 bytes .../__pycache__/types.cpython-311.pyc | Bin 103758 -> 0 bytes .../__pycache__/typing.cpython-311.pyc | Bin 369 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 371 -> 0 bytes .../validate_call_decorator.cpython-311.pyc | Bin 6035 -> 0 bytes .../__pycache__/validators.cpython-311.pyc | Bin 381 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 4584 -> 0 bytes .../__pycache__/warnings.cpython-311.pyc | Bin 6664 -> 0 bytes .../pydantic/_internal/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 190 -> 0 bytes .../__pycache__/_config.cpython-311.pyc | Bin 17826 -> 0 bytes .../_core_metadata.cpython-311.pyc | Bin 5057 -> 0 bytes .../__pycache__/_core_utils.cpython-311.pyc | Bin 8965 -> 0 bytes .../__pycache__/_dataclasses.cpython-311.pyc | Bin 10375 -> 0 bytes .../__pycache__/_decorators.cpython-311.pyc | Bin 40332 -> 0 bytes .../_decorators_v1.cpython-311.pyc | Bin 9912 -> 0 bytes .../_discriminated_union.cpython-311.pyc | Bin 23289 -> 0 bytes .../_docs_extraction.cpython-311.pyc | Bin 5669 -> 0 bytes .../__pycache__/_fields.cpython-311.pyc | Bin 19820 -> 0 bytes .../__pycache__/_forward_ref.cpython-311.pyc | Bin 1464 -> 0 bytes .../_generate_schema.cpython-311.pyc | Bin 146121 -> 0 bytes .../__pycache__/_generics.cpython-311.pyc | Bin 27024 -> 0 bytes .../__pycache__/_git.cpython-311.pyc | Bin 1724 -> 0 bytes .../__pycache__/_import_utils.cpython-311.pyc | Bin 961 -> 0 bytes .../_internal_dataclass.cpython-311.pyc | Bin 337 -> 0 bytes .../_known_annotated_metadata.cpython-311.pyc | Bin 15781 -> 0 bytes .../__pycache__/_mock_val_ser.cpython-311.pyc | Bin 12337 -> 0 bytes .../_model_construction.cpython-311.pyc | Bin 38241 -> 0 bytes .../_namespace_utils.cpython-311.pyc | Bin 13467 -> 0 bytes .../__pycache__/_repr.cpython-311.pyc | Bin 8759 -> 0 bytes .../_schema_gather.cpython-311.pyc | Bin 9042 -> 0 bytes .../_schema_generation_shared.cpython-311.pyc | Bin 6765 -> 0 bytes .../__pycache__/_serializers.cpython-311.pyc | Bin 2101 -> 0 bytes .../__pycache__/_signature.cpython-311.pyc | Bin 7387 -> 0 bytes .../__pycache__/_typing_extra.cpython-311.pyc | Bin 28818 -> 0 bytes .../__pycache__/_utils.cpython-311.pyc | Bin 21995 -> 0 bytes .../_validate_call.cpython-311.pyc | Bin 7199 -> 0 bytes .../__pycache__/_validators.cpython-311.pyc | Bin 25746 -> 0 bytes .../pydantic/_internal/_config.py | 373 - .../pydantic/_internal/_core_metadata.py | 97 - .../pydantic/_internal/_core_utils.py | 182 - .../pydantic/_internal/_dataclasses.py | 235 - .../pydantic/_internal/_decorators.py | 838 -- .../pydantic/_internal/_decorators_v1.py | 174 - .../_internal/_discriminated_union.py | 479 - .../pydantic/_internal/_docs_extraction.py | 108 - .../pydantic/_internal/_fields.py | 459 - .../pydantic/_internal/_forward_ref.py | 23 - .../pydantic/_internal/_generate_schema.py | 2862 ------ .../pydantic/_internal/_generics.py | 547 -- .../site-packages/pydantic/_internal/_git.py | 27 - .../pydantic/_internal/_import_utils.py | 20 - .../pydantic/_internal/_internal_dataclass.py | 7 - .../_internal/_known_annotated_metadata.py | 397 - .../pydantic/_internal/_mock_val_ser.py | 228 - .../pydantic/_internal/_model_construction.py | 792 -- .../pydantic/_internal/_namespace_utils.py | 293 - .../site-packages/pydantic/_internal/_repr.py | 125 - .../pydantic/_internal/_schema_gather.py | 204 - .../_internal/_schema_generation_shared.py | 125 - .../pydantic/_internal/_serializers.py | 53 - .../pydantic/_internal/_signature.py | 188 - .../pydantic/_internal/_typing_extra.py | 714 -- .../pydantic/_internal/_utils.py | 429 - .../pydantic/_internal/_validate_call.py | 140 - .../pydantic/_internal/_validators.py | 532 - .../site-packages/pydantic/_migration.py | 308 - .../pydantic/alias_generators.py | 62 - .../site-packages/pydantic/aliases.py | 135 - .../pydantic/annotated_handlers.py | 122 - .../pydantic/class_validators.py | 5 - .../site-packages/pydantic/color.py | 604 -- .../site-packages/pydantic/config.py | 1213 --- .../site-packages/pydantic/dataclasses.py | 374 - .../site-packages/pydantic/datetime_parse.py | 5 - .../site-packages/pydantic/decorator.py | 5 - .../pydantic/deprecated/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 191 -> 0 bytes .../class_validators.cpython-311.pyc | Bin 12843 -> 0 bytes .../__pycache__/config.cpython-311.pyc | Bin 4857 -> 0 bytes .../copy_internals.cpython-311.pyc | Bin 9607 -> 0 bytes .../__pycache__/decorator.cpython-311.pyc | Bin 15625 -> 0 bytes .../__pycache__/json.cpython-311.pyc | Bin 6815 -> 0 bytes .../__pycache__/parse.cpython-311.pyc | Bin 3659 -> 0 bytes .../__pycache__/tools.cpython-311.pyc | Bin 3888 -> 0 bytes .../pydantic/deprecated/class_validators.py | 256 - .../pydantic/deprecated/config.py | 72 - .../pydantic/deprecated/copy_internals.py | 224 - .../pydantic/deprecated/decorator.py | 284 - .../site-packages/pydantic/deprecated/json.py | 141 - .../pydantic/deprecated/parse.py | 80 - .../pydantic/deprecated/tools.py | 103 - .../site-packages/pydantic/env_settings.py | 5 - .../site-packages/pydantic/error_wrappers.py | 5 - .../site-packages/pydantic/errors.py | 190 - .../pydantic/experimental/__init__.py | 10 - .../__pycache__/__init__.cpython-311.pyc | Bin 594 -> 0 bytes .../arguments_schema.cpython-311.pyc | Bin 2557 -> 0 bytes .../__pycache__/pipeline.cpython-311.pyc | Bin 38872 -> 0 bytes .../pydantic/experimental/arguments_schema.py | 44 - .../pydantic/experimental/pipeline.py | 667 -- .../site-packages/pydantic/fields.py | 1542 --- .../pydantic/functional_serializers.py | 450 - .../pydantic/functional_validators.py | 828 -- .../site-packages/pydantic/generics.py | 5 - .../python3.11/site-packages/pydantic/json.py | 5 - .../site-packages/pydantic/json_schema.py | 2695 ----- .../python3.11/site-packages/pydantic/main.py | 1772 ---- .../python3.11/site-packages/pydantic/mypy.py | 1373 --- .../site-packages/pydantic/networks.py | 1312 --- .../site-packages/pydantic/parse.py | 5 - .../site-packages/pydantic/plugin/__init__.py | 188 - .../__pycache__/__init__.cpython-311.pyc | Bin 9089 -> 0 bytes .../__pycache__/_loader.cpython-311.pyc | Bin 2541 -> 0 bytes .../_schema_validator.cpython-311.pyc | Bin 7646 -> 0 bytes .../site-packages/pydantic/plugin/_loader.py | 57 - .../pydantic/plugin/_schema_validator.py | 140 - .../site-packages/pydantic/py.typed | 0 .../site-packages/pydantic/root_model.py | 157 - .../site-packages/pydantic/schema.py | 5 - .../site-packages/pydantic/tools.py | 5 - .../site-packages/pydantic/type_adapter.py | 727 -- .../site-packages/pydantic/types.py | 3285 ------- .../site-packages/pydantic/typing.py | 5 - .../site-packages/pydantic/utils.py | 5 - .../site-packages/pydantic/v1/__init__.py | 131 - .../v1/__pycache__/__init__.cpython-311.pyc | Bin 2441 -> 0 bytes .../_hypothesis_plugin.cpython-311.pyc | Bin 20242 -> 0 bytes .../annotated_types.cpython-311.pyc | Bin 4688 -> 0 bytes .../class_validators.cpython-311.pyc | Bin 22801 -> 0 bytes .../v1/__pycache__/color.cpython-311.pyc | Bin 28220 -> 0 bytes .../v1/__pycache__/config.cpython-311.pyc | Bin 10048 -> 0 bytes .../__pycache__/dataclasses.cpython-311.pyc | Bin 25819 -> 0 bytes .../datetime_parse.cpython-311.pyc | Bin 11979 -> 0 bytes .../v1/__pycache__/decorator.cpython-311.pyc | Bin 15682 -> 0 bytes .../__pycache__/env_settings.cpython-311.pyc | Bin 20033 -> 0 bytes .../error_wrappers.cpython-311.pyc | Bin 10050 -> 0 bytes .../v1/__pycache__/errors.cpython-311.pyc | Bin 36542 -> 0 bytes .../v1/__pycache__/fields.cpython-311.pyc | Bin 62983 -> 0 bytes .../v1/__pycache__/generics.cpython-311.pyc | Bin 19721 -> 0 bytes .../v1/__pycache__/json.cpython-311.pyc | Bin 5690 -> 0 bytes .../v1/__pycache__/main.cpython-311.pyc | Bin 54952 -> 0 bytes .../v1/__pycache__/mypy.cpython-311.pyc | Bin 50498 -> 0 bytes .../v1/__pycache__/networks.cpython-311.pyc | Bin 34181 -> 0 bytes .../v1/__pycache__/parse.cpython-311.pyc | Bin 3038 -> 0 bytes .../v1/__pycache__/schema.cpython-311.pyc | Bin 54637 -> 0 bytes .../v1/__pycache__/tools.cpython-311.pyc | Bin 4465 -> 0 bytes .../v1/__pycache__/types.cpython-311.pyc | Bin 55097 -> 0 bytes .../v1/__pycache__/typing.cpython-311.pyc | Bin 25275 -> 0 bytes .../v1/__pycache__/utils.cpython-311.pyc | Bin 40734 -> 0 bytes .../v1/__pycache__/validators.cpython-311.pyc | Bin 34976 -> 0 bytes .../v1/__pycache__/version.cpython-311.pyc | Bin 2200 -> 0 bytes .../pydantic/v1/_hypothesis_plugin.py | 391 - .../pydantic/v1/annotated_types.py | 72 - .../pydantic/v1/class_validators.py | 361 - .../site-packages/pydantic/v1/color.py | 494 - .../site-packages/pydantic/v1/config.py | 191 - .../site-packages/pydantic/v1/dataclasses.py | 500 - .../pydantic/v1/datetime_parse.py | 248 - .../site-packages/pydantic/v1/decorator.py | 264 - .../site-packages/pydantic/v1/env_settings.py | 350 - .../pydantic/v1/error_wrappers.py | 161 - .../site-packages/pydantic/v1/errors.py | 646 -- .../site-packages/pydantic/v1/fields.py | 1253 --- .../site-packages/pydantic/v1/generics.py | 400 - .../site-packages/pydantic/v1/json.py | 112 - .../site-packages/pydantic/v1/main.py | 1107 --- .../site-packages/pydantic/v1/mypy.py | 949 -- .../site-packages/pydantic/v1/networks.py | 747 -- .../site-packages/pydantic/v1/parse.py | 66 - .../site-packages/pydantic/v1/py.typed | 0 .../site-packages/pydantic/v1/schema.py | 1163 --- .../site-packages/pydantic/v1/tools.py | 92 - .../site-packages/pydantic/v1/types.py | 1205 --- .../site-packages/pydantic/v1/typing.py | 608 -- .../site-packages/pydantic/v1/utils.py | 804 -- .../site-packages/pydantic/v1/validators.py | 768 -- .../site-packages/pydantic/v1/version.py | 38 - .../pydantic/validate_call_decorator.py | 116 - .../site-packages/pydantic/validators.py | 5 - .../site-packages/pydantic/version.py | 86 - .../site-packages/pydantic/warnings.py | 96 - .../pydantic_core-2.33.0.dist-info/INSTALLER | 1 - .../pydantic_core-2.33.0.dist-info/METADATA | 160 - .../pydantic_core-2.33.0.dist-info/RECORD | 12 - .../pydantic_core-2.33.0.dist-info/WHEEL | 4 - .../licenses/LICENSE | 21 - .../site-packages/pydantic_core/__init__.py | 144 - .../__pycache__/__init__.cpython-311.pyc | Bin 3763 -> 0 bytes .../__pycache__/core_schema.cpython-311.pyc | Bin 156548 -> 0 bytes ...antic_core.cpython-311-x86_64-linux-gnu.so | Bin 4765960 -> 0 bytes .../pydantic_core/_pydantic_core.pyi | 1039 -- .../pydantic_core/core_schema.py | 4325 -------- .../site-packages/pydantic_core/py.typed | 0 .../setuptools-66.1.1.dist-info/INSTALLER | 1 - .../setuptools-66.1.1.dist-info/LICENSE | 19 - .../setuptools-66.1.1.dist-info/METADATA | 137 - .../setuptools-66.1.1.dist-info/RECORD | 484 - .../setuptools-66.1.1.dist-info/REQUESTED | 0 .../setuptools-66.1.1.dist-info/WHEEL | 5 - .../entry_points.txt | 57 - .../setuptools-66.1.1.dist-info/top_level.txt | 4 - .../site-packages/setuptools/__init__.py | 268 - .../__pycache__/__init__.cpython-311.pyc | Bin 13921 -> 0 bytes .../_deprecation_warning.cpython-311.pyc | Bin 637 -> 0 bytes .../__pycache__/_entry_points.cpython-311.pyc | Bin 5194 -> 0 bytes .../__pycache__/_imp.cpython-311.pyc | Bin 3650 -> 0 bytes .../__pycache__/_importlib.cpython-311.pyc | Bin 1950 -> 0 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 1149 -> 0 bytes .../__pycache__/_path.cpython-311.pyc | Bin 1470 -> 0 bytes .../__pycache__/_reqs.cpython-311.pyc | Bin 1131 -> 0 bytes .../__pycache__/archive_util.cpython-311.pyc | Bin 10159 -> 0 bytes .../__pycache__/build_meta.cpython-311.pyc | Bin 28142 -> 0 bytes .../__pycache__/dep_util.cpython-311.pyc | Bin 1285 -> 0 bytes .../__pycache__/depends.cpython-311.pyc | Bin 7970 -> 0 bytes .../__pycache__/discovery.cpython-311.pyc | Bin 31123 -> 0 bytes .../__pycache__/dist.cpython-311.pyc | Bin 63790 -> 0 bytes .../__pycache__/errors.cpython-311.pyc | Bin 2946 -> 0 bytes .../__pycache__/extension.cpython-311.pyc | Bin 6802 -> 0 bytes .../__pycache__/glob.cpython-311.pyc | Bin 6559 -> 0 bytes .../__pycache__/installer.cpython-311.pyc | Bin 5609 -> 0 bytes .../__pycache__/launch.cpython-311.pyc | Bin 1525 -> 0 bytes .../__pycache__/logging.cpython-311.pyc | Bin 2092 -> 0 bytes .../__pycache__/monkey.cpython-311.pyc | Bin 7002 -> 0 bytes .../__pycache__/msvc.cpython-311.pyc | Bin 64175 -> 0 bytes .../__pycache__/namespaces.cpython-311.pyc | Bin 5657 -> 0 bytes .../__pycache__/package_index.cpython-311.pyc | Bin 61930 -> 0 bytes .../__pycache__/py34compat.cpython-311.pyc | Bin 712 -> 0 bytes .../__pycache__/sandbox.cpython-311.pyc | Bin 27328 -> 0 bytes .../__pycache__/unicode_utils.cpython-311.pyc | Bin 1814 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 432 -> 0 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 15488 -> 0 bytes .../windows_support.cpython-311.pyc | Bin 1429 -> 0 bytes .../setuptools/_deprecation_warning.py | 7 - .../setuptools/_distutils/__init__.py | 14 - .../__pycache__/__init__.cpython-311.pyc | Bin 556 -> 0 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 8526 -> 0 bytes .../__pycache__/_functools.cpython-311.pyc | Bin 858 -> 0 bytes .../__pycache__/_log.cpython-311.pyc | Bin 275 -> 0 bytes .../__pycache__/_macos_compat.cpython-311.pyc | Bin 567 -> 0 bytes .../__pycache__/_msvccompiler.cpython-311.pyc | Bin 25069 -> 0 bytes .../__pycache__/archive_util.cpython-311.pyc | Bin 10617 -> 0 bytes .../__pycache__/bcppcompiler.cpython-311.pyc | Bin 13443 -> 0 bytes .../__pycache__/ccompiler.cpython-311.pyc | Bin 46312 -> 0 bytes .../__pycache__/cmd.cpython-311.pyc | Bin 18836 -> 0 bytes .../__pycache__/config.cpython-311.pyc | Bin 6037 -> 0 bytes .../__pycache__/core.cpython-311.pyc | Bin 9927 -> 0 bytes .../cygwinccompiler.cpython-311.pyc | Bin 13621 -> 0 bytes .../__pycache__/debug.cpython-311.pyc | Bin 319 -> 0 bytes .../__pycache__/dep_util.cpython-311.pyc | Bin 3981 -> 0 bytes .../__pycache__/dir_util.cpython-311.pyc | Bin 10362 -> 0 bytes .../__pycache__/dist.cpython-311.pyc | Bin 55485 -> 0 bytes .../__pycache__/errors.cpython-311.pyc | Bin 6792 -> 0 bytes .../__pycache__/extension.cpython-311.pyc | Bin 10173 -> 0 bytes .../__pycache__/fancy_getopt.cpython-311.pyc | Bin 17232 -> 0 bytes .../__pycache__/file_util.cpython-311.pyc | Bin 10666 -> 0 bytes .../__pycache__/filelist.cpython-311.pyc | Bin 17606 -> 0 bytes .../__pycache__/log.cpython-311.pyc | Bin 2690 -> 0 bytes .../__pycache__/msvc9compiler.cpython-311.pyc | Bin 33555 -> 0 bytes .../__pycache__/msvccompiler.cpython-311.pyc | Bin 26967 -> 0 bytes .../__pycache__/py38compat.cpython-311.pyc | Bin 619 -> 0 bytes .../__pycache__/py39compat.cpython-311.pyc | Bin 987 -> 0 bytes .../__pycache__/spawn.cpython-311.pyc | Bin 4431 -> 0 bytes .../__pycache__/sysconfig.cpython-311.pyc | Bin 22068 -> 0 bytes .../__pycache__/text_file.cpython-311.pyc | Bin 11268 -> 0 bytes .../__pycache__/unixccompiler.cpython-311.pyc | Bin 16491 -> 0 bytes .../__pycache__/util.cpython-311.pyc | Bin 20842 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 11344 -> 0 bytes .../versionpredicate.cpython-311.pyc | Bin 7621 -> 0 bytes .../setuptools/_distutils/_collections.py | 194 - .../setuptools/_distutils/_functools.py | 20 - .../setuptools/_distutils/_log.py | 4 - .../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 | 435 - .../setuptools/_distutils/command/__init__.py | 25 - .../__pycache__/__init__.cpython-311.pyc | Bin 539 -> 0 bytes .../_framework_compat.cpython-311.pyc | Bin 2780 -> 0 bytes .../command/__pycache__/bdist.cpython-311.pyc | Bin 5998 -> 0 bytes .../__pycache__/bdist_dumb.cpython-311.pyc | Bin 5718 -> 0 bytes .../__pycache__/bdist_rpm.cpython-311.pyc | Bin 23252 -> 0 bytes .../command/__pycache__/build.cpython-311.pyc | Bin 6053 -> 0 bytes .../__pycache__/build_clib.cpython-311.pyc | Bin 7761 -> 0 bytes .../__pycache__/build_ext.cpython-311.pyc | Bin 30271 -> 0 bytes .../__pycache__/build_py.cpython-311.pyc | Bin 17597 -> 0 bytes .../__pycache__/build_scripts.cpython-311.pyc | Bin 7851 -> 0 bytes .../command/__pycache__/check.cpython-311.pyc | Bin 7507 -> 0 bytes .../command/__pycache__/clean.cpython-311.pyc | Bin 3183 -> 0 bytes .../__pycache__/config.cpython-311.pyc | Bin 16220 -> 0 bytes .../__pycache__/install.cpython-311.pyc | Bin 29372 -> 0 bytes .../__pycache__/install_data.cpython-311.pyc | Bin 3760 -> 0 bytes .../install_egg_info.cpython-311.pyc | Bin 5215 -> 0 bytes .../install_headers.cpython-311.pyc | Bin 2348 -> 0 bytes .../__pycache__/install_lib.cpython-311.pyc | Bin 8669 -> 0 bytes .../install_scripts.cpython-311.pyc | Bin 3155 -> 0 bytes .../__pycache__/py37compat.cpython-311.pyc | Bin 1536 -> 0 bytes .../__pycache__/register.cpython-311.pyc | Bin 15554 -> 0 bytes .../command/__pycache__/sdist.cpython-311.pyc | Bin 23766 -> 0 bytes .../__pycache__/upload.cpython-311.pyc | Bin 10420 -> 0 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 | 789 -- .../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 | 92 - .../_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 | 321 - .../setuptools/_distutils/command/sdist.py | 531 - .../setuptools/_distutils/command/upload.py | 207 - .../setuptools/_distutils/config.py | 139 - .../setuptools/_distutils/core.py | 291 - .../setuptools/_distutils/cygwinccompiler.py | 358 - .../setuptools/_distutils/debug.py | 5 - .../setuptools/_distutils/dep_util.py | 96 - .../setuptools/_distutils/dir_util.py | 243 - .../setuptools/_distutils/dist.py | 1287 --- .../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 | 57 - .../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 | 552 -- .../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 | 94 - .../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-311.pyc | Bin 190 -> 0 bytes .../__pycache__/ordered_set.cpython-311.pyc | Bin 21776 -> 0 bytes .../typing_extensions.cpython-311.pyc | Bin 107607 -> 0 bytes .../_vendor/__pycache__/zipp.cpython-311.pyc | Bin 15983 -> 0 bytes .../_vendor/importlib_metadata/__init__.py | 1047 -- .../__pycache__/__init__.cpython-311.pyc | Bin 58229 -> 0 bytes .../__pycache__/_adapters.cpython-311.pyc | Bin 3842 -> 0 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 2189 -> 0 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 2711 -> 0 bytes .../__pycache__/_functools.cpython-311.pyc | Bin 3629 -> 0 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 2592 -> 0 bytes .../__pycache__/_meta.cpython-311.pyc | Bin 2996 -> 0 bytes .../__pycache__/_text.cpython-311.pyc | Bin 4387 -> 0 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-311.pyc | Bin 824 -> 0 bytes .../__pycache__/_adapters.cpython-311.pyc | Bin 10741 -> 0 bytes .../__pycache__/_common.cpython-311.pyc | Bin 4268 -> 0 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 5553 -> 0 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 1386 -> 0 bytes .../__pycache__/_legacy.cpython-311.pyc | Bin 6484 -> 0 bytes .../__pycache__/abc.cpython-311.pyc | Bin 7485 -> 0 bytes .../__pycache__/readers.cpython-311.pyc | Bin 8359 -> 0 bytes .../__pycache__/simple.cpython-311.pyc | Bin 6381 -> 0 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-311.pyc | Bin 197 -> 0 bytes .../__pycache__/context.cpython-311.pyc | Bin 10972 -> 0 bytes .../__pycache__/functools.cpython-311.pyc | Bin 20277 -> 0 bytes .../setuptools/_vendor/jaraco/context.py | 253 - .../setuptools/_vendor/jaraco/functools.py | 525 - .../_vendor/jaraco/text/__init__.py | 599 -- .../text/__pycache__/__init__.cpython-311.pyc | Bin 26591 -> 0 bytes .../_vendor/more_itertools/__init__.py | 4 - .../__pycache__/__init__.cpython-311.pyc | Bin 290 -> 0 bytes .../__pycache__/more.cpython-311.pyc | Bin 149177 -> 0 bytes .../__pycache__/recipes.cpython-311.pyc | Bin 23759 -> 0 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-311.pyc | Bin 641 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 562 -> 0 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 13228 -> 0 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 7996 -> 0 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 3684 -> 0 bytes .../__pycache__/markers.cpython-311.pyc | Bin 16530 -> 0 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 7645 -> 0 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 34362 -> 0 bytes .../__pycache__/tags.cpython-311.pyc | Bin 21347 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 6682 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 21874 -> 0 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-311.pyc | Bin 8335 -> 0 bytes .../__pycache__/actions.cpython-311.pyc | Bin 8461 -> 0 bytes .../__pycache__/common.cpython-311.pyc | Bin 14783 -> 0 bytes .../__pycache__/core.cpython-311.pyc | Bin 277635 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 12925 -> 0 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 53626 -> 0 bytes .../__pycache__/results.cpython-311.pyc | Bin 36309 -> 0 bytes .../__pycache__/testing.cpython-311.pyc | Bin 19505 -> 0 bytes .../__pycache__/unicode.cpython-311.pyc | Bin 15363 -> 0 bytes .../__pycache__/util.cpython-311.pyc | Bin 14262 -> 0 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-311.pyc | Bin 27998 -> 0 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-311.pyc | Bin 412 -> 0 bytes .../tomli/__pycache__/_parser.cpython-311.pyc | Bin 30851 -> 0 bytes .../tomli/__pycache__/_re.cpython-311.pyc | Bin 4491 -> 0 bytes .../tomli/__pycache__/_types.cpython-311.pyc | Bin 404 -> 0 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 | 512 - .../site-packages/setuptools/cli-32.exe | Bin 65536 -> 0 bytes .../site-packages/setuptools/cli-64.exe | Bin 74752 -> 0 bytes .../site-packages/setuptools/cli-arm64.exe | Bin 137216 -> 0 bytes .../site-packages/setuptools/cli.exe | Bin 65536 -> 0 bytes .../setuptools/command/__init__.py | 12 - .../__pycache__/__init__.cpython-311.pyc | Bin 631 -> 0 bytes .../command/__pycache__/alias.cpython-311.pyc | Bin 3898 -> 0 bytes .../__pycache__/bdist_egg.cpython-311.pyc | Bin 25580 -> 0 bytes .../__pycache__/bdist_rpm.cpython-311.pyc | Bin 2186 -> 0 bytes .../command/__pycache__/build.cpython-311.pyc | Bin 6986 -> 0 bytes .../__pycache__/build_clib.cpython-311.pyc | Bin 4161 -> 0 bytes .../__pycache__/build_ext.cpython-311.pyc | Bin 22006 -> 0 bytes .../__pycache__/build_py.cpython-311.pyc | Bin 23172 -> 0 bytes .../__pycache__/develop.cpython-311.pyc | Bin 10914 -> 0 bytes .../__pycache__/dist_info.cpython-311.pyc | Bin 7976 -> 0 bytes .../__pycache__/easy_install.cpython-311.pyc | Bin 121496 -> 0 bytes .../editable_wheel.cpython-311.pyc | Bin 51409 -> 0 bytes .../__pycache__/egg_info.cpython-311.pyc | Bin 40834 -> 0 bytes .../__pycache__/install.cpython-311.pyc | Bin 6811 -> 0 bytes .../install_egg_info.cpython-311.pyc | Bin 5337 -> 0 bytes .../__pycache__/install_lib.cpython-311.pyc | Bin 8408 -> 0 bytes .../install_scripts.cpython-311.pyc | Bin 4275 -> 0 bytes .../__pycache__/py36compat.cpython-311.pyc | Bin 8032 -> 0 bytes .../__pycache__/register.cpython-311.pyc | Bin 1122 -> 0 bytes .../__pycache__/rotate.cpython-311.pyc | Bin 4182 -> 0 bytes .../__pycache__/saveopts.cpython-311.pyc | Bin 1362 -> 0 bytes .../command/__pycache__/sdist.cpython-311.pyc | Bin 13434 -> 0 bytes .../__pycache__/setopt.cpython-311.pyc | Bin 7674 -> 0 bytes .../command/__pycache__/test.cpython-311.pyc | Bin 14615 -> 0 bytes .../__pycache__/upload.cpython-311.pyc | Bin 1086 -> 0 bytes .../__pycache__/upload_docs.cpython-311.pyc | Bin 11937 -> 0 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 | 2366 ----- .../setuptools/command/editable_wheel.py | 844 -- .../setuptools/command/egg_info.py | 775 -- .../setuptools/command/install.py | 139 - .../setuptools/command/install_egg_info.py | 83 - .../setuptools/command/install_lib.py | 148 - .../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 | 212 - .../setuptools/config/__init__.py | 35 - .../__pycache__/__init__.cpython-311.pyc | Bin 2026 -> 0 bytes .../_apply_pyprojecttoml.cpython-311.pyc | Bin 22835 -> 0 bytes .../config/__pycache__/expand.cpython-311.pyc | Bin 28240 -> 0 bytes .../__pycache__/pyprojecttoml.cpython-311.pyc | Bin 27871 -> 0 bytes .../__pycache__/setupcfg.cpython-311.pyc | Bin 33280 -> 0 bytes .../setuptools/config/_apply_pyprojecttoml.py | 384 - .../config/_validate_pyproject/__init__.py | 34 - .../__pycache__/__init__.cpython-311.pyc | Bin 2314 -> 0 bytes .../error_reporting.cpython-311.pyc | Bin 20205 -> 0 bytes .../extra_validations.cpython-311.pyc | Bin 1863 -> 0 bytes .../fastjsonschema_exceptions.cpython-311.pyc | Bin 3238 -> 0 bytes ...fastjsonschema_validations.cpython-311.pyc | Bin 192636 -> 0 bytes .../__pycache__/formats.cpython-311.pyc | Bin 14353 -> 0 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 | 498 - .../setuptools/config/setupcfg.py | 769 -- .../site-packages/setuptools/dep_util.py | 25 - .../site-packages/setuptools/depends.py | 176 - .../site-packages/setuptools/discovery.py | 601 -- .../site-packages/setuptools/dist.py | 1218 --- .../site-packages/setuptools/errors.py | 58 - .../site-packages/setuptools/extension.py | 148 - .../setuptools/extern/__init__.py | 76 - .../__pycache__/__init__.cpython-311.pyc | Bin 4390 -> 0 bytes .../site-packages/setuptools/glob.py | 167 - .../site-packages/setuptools/gui-32.exe | Bin 65536 -> 0 bytes .../site-packages/setuptools/gui-64.exe | Bin 75264 -> 0 bytes .../site-packages/setuptools/gui-arm64.exe | Bin 137728 -> 0 bytes .../site-packages/setuptools/gui.exe | Bin 65536 -> 0 bytes .../site-packages/setuptools/installer.py | 104 - .../site-packages/setuptools/launch.py | 36 - .../site-packages/setuptools/logging.py | 37 - .../site-packages/setuptools/monkey.py | 165 - .../site-packages/setuptools/msvc.py | 1703 ---- .../site-packages/setuptools/namespaces.py | 107 - .../site-packages/setuptools/package_index.py | 1177 --- .../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 - .../sniffio-1.3.1.dist-info/INSTALLER | 1 - .../sniffio-1.3.1.dist-info/LICENSE | 3 - .../sniffio-1.3.1.dist-info/LICENSE.APACHE2 | 202 - .../sniffio-1.3.1.dist-info/LICENSE.MIT | 20 - .../sniffio-1.3.1.dist-info/METADATA | 104 - .../sniffio-1.3.1.dist-info/RECORD | 19 - .../sniffio-1.3.1.dist-info/WHEEL | 5 - .../sniffio-1.3.1.dist-info/top_level.txt | 1 - .../site-packages/sniffio/__init__.py | 17 - .../__pycache__/__init__.cpython-311.pyc | Bin 533 -> 0 bytes .../sniffio/__pycache__/_impl.cpython-311.pyc | Bin 3397 -> 0 bytes .../__pycache__/_version.cpython-311.pyc | Bin 201 -> 0 bytes .../python3.11/site-packages/sniffio/_impl.py | 95 - .../site-packages/sniffio/_tests/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 186 -> 0 bytes .../__pycache__/test_sniffio.cpython-311.pyc | Bin 5058 -> 0 bytes .../sniffio/_tests/test_sniffio.py | 84 - .../site-packages/sniffio/_version.py | 3 - .../python3.11/site-packages/sniffio/py.typed | 0 .../starlette-0.46.1.dist-info/INSTALLER | 1 - .../starlette-0.46.1.dist-info/METADATA | 176 - .../starlette-0.46.1.dist-info/RECORD | 74 - .../starlette-0.46.1.dist-info/WHEEL | 4 - .../licenses/LICENSE.md | 27 - .../site-packages/starlette/__init__.py | 1 - .../__pycache__/__init__.cpython-311.pyc | Bin 202 -> 0 bytes .../_exception_handler.cpython-311.pyc | Bin 3606 -> 0 bytes .../__pycache__/_utils.cpython-311.pyc | Bin 5866 -> 0 bytes .../__pycache__/applications.cpython-311.pyc | Bin 13846 -> 0 bytes .../authentication.cpython-311.pyc | Bin 9206 -> 0 bytes .../__pycache__/background.cpython-311.pyc | Bin 2945 -> 0 bytes .../__pycache__/concurrency.cpython-311.pyc | Bin 3696 -> 0 bytes .../__pycache__/config.cpython-311.pyc | Bin 8263 -> 0 bytes .../__pycache__/convertors.cpython-311.pyc | Bin 5774 -> 0 bytes .../datastructures.cpython-311.pyc | Bin 45709 -> 0 bytes .../__pycache__/endpoints.cpython-311.pyc | Bin 8700 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 2605 -> 0 bytes .../__pycache__/formparsers.cpython-311.pyc | Bin 15048 -> 0 bytes .../__pycache__/requests.cpython-311.pyc | Bin 17811 -> 0 bytes .../__pycache__/responses.cpython-311.pyc | Bin 32594 -> 0 bytes .../__pycache__/routing.cpython-311.pyc | Bin 48475 -> 0 bytes .../__pycache__/schemas.cpython-311.pyc | Bin 8043 -> 0 bytes .../__pycache__/staticfiles.cpython-311.pyc | Bin 12666 -> 0 bytes .../__pycache__/status.cpython-311.pyc | Bin 3651 -> 0 bytes .../__pycache__/templating.cpython-311.pyc | Bin 11095 -> 0 bytes .../__pycache__/testclient.cpython-311.pyc | Bin 35824 -> 0 bytes .../__pycache__/types.cpython-311.pyc | Bin 1677 -> 0 bytes .../__pycache__/websockets.cpython-311.pyc | Bin 12957 -> 0 bytes .../starlette/_exception_handler.py | 65 - .../site-packages/starlette/_utils.py | 100 - .../site-packages/starlette/applications.py | 249 - .../site-packages/starlette/authentication.py | 147 - .../site-packages/starlette/background.py | 41 - .../site-packages/starlette/concurrency.py | 62 - .../site-packages/starlette/config.py | 138 - .../site-packages/starlette/convertors.py | 89 - .../site-packages/starlette/datastructures.py | 674 -- .../site-packages/starlette/endpoints.py | 122 - .../site-packages/starlette/exceptions.py | 33 - .../site-packages/starlette/formparsers.py | 275 - .../starlette/middleware/__init__.py | 42 - .../__pycache__/__init__.cpython-311.pyc | Bin 3076 -> 0 bytes .../authentication.cpython-311.pyc | Bin 3246 -> 0 bytes .../__pycache__/base.cpython-311.pyc | Bin 12721 -> 0 bytes .../__pycache__/cors.cpython-311.pyc | Bin 8447 -> 0 bytes .../__pycache__/errors.cpython-311.pyc | Bin 10656 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 4466 -> 0 bytes .../__pycache__/gzip.cpython-311.pyc | Bin 9352 -> 0 bytes .../__pycache__/httpsredirect.cpython-311.pyc | Bin 1945 -> 0 bytes .../__pycache__/sessions.cpython-311.pyc | Bin 5028 -> 0 bytes .../__pycache__/trustedhost.cpython-311.pyc | Bin 3536 -> 0 bytes .../__pycache__/wsgi.cpython-311.pyc | Bin 9689 -> 0 bytes .../starlette/middleware/authentication.py | 52 - .../starlette/middleware/base.py | 220 - .../starlette/middleware/cors.py | 172 - .../starlette/middleware/errors.py | 260 - .../starlette/middleware/exceptions.py | 72 - .../starlette/middleware/gzip.py | 141 - .../starlette/middleware/httpsredirect.py | 19 - .../starlette/middleware/sessions.py | 85 - .../starlette/middleware/trustedhost.py | 60 - .../starlette/middleware/wsgi.py | 152 - .../site-packages/starlette/py.typed | 0 .../site-packages/starlette/requests.py | 322 - .../site-packages/starlette/responses.py | 536 - .../site-packages/starlette/routing.py | 874 -- .../site-packages/starlette/schemas.py | 147 - .../site-packages/starlette/staticfiles.py | 220 - .../site-packages/starlette/status.py | 95 - .../site-packages/starlette/templating.py | 216 - .../site-packages/starlette/testclient.py | 731 -- .../site-packages/starlette/types.py | 24 - .../site-packages/starlette/websockets.py | 195 - .../INSTALLER | 1 - .../METADATA | 68 - .../typing_extensions-4.13.0.dist-info/RECORD | 7 - .../typing_extensions-4.13.0.dist-info/WHEEL | 4 - .../licenses/LICENSE | 279 - .../site-packages/typing_extensions.py | 4566 --------- .../INSTALLER | 1 - .../METADATA | 49 - .../typing_inspection-0.4.0.dist-info/RECORD | 13 - .../typing_inspection-0.4.0.dist-info/WHEEL | 4 - .../licenses/LICENSE | 21 - .../typing_inspection/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 189 -> 0 bytes .../__pycache__/introspection.cpython-311.pyc | Bin 18284 -> 0 bytes .../typing_objects.cpython-311.pyc | Bin 16747 -> 0 bytes .../typing_inspection/introspection.py | 548 -- .../site-packages/typing_inspection/py.typed | 0 .../typing_inspection/typing_objects.py | 582 -- .../typing_inspection/typing_objects.pyi | 396 - .../uvicorn-0.34.0.dist-info/INSTALLER | 1 - .../uvicorn-0.34.0.dist-info/METADATA | 185 - .../uvicorn-0.34.0.dist-info/RECORD | 85 - .../uvicorn-0.34.0.dist-info/REQUESTED | 0 .../uvicorn-0.34.0.dist-info/WHEEL | 4 - .../uvicorn-0.34.0.dist-info/entry_points.txt | 2 - .../licenses/LICENSE.md | 27 - .../site-packages/uvicorn/__init__.py | 5 - .../site-packages/uvicorn/__main__.py | 4 - .../__pycache__/__init__.cpython-311.pyc | Bin 416 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 305 -> 0 bytes .../__pycache__/_subprocess.cpython-311.pyc | Bin 3093 -> 0 bytes .../__pycache__/_types.cpython-311.pyc | Bin 13633 -> 0 bytes .../__pycache__/config.cpython-311.pyc | Bin 26121 -> 0 bytes .../__pycache__/importer.cpython-311.pyc | Bin 2021 -> 0 bytes .../__pycache__/logging.cpython-311.pyc | Bin 8594 -> 0 bytes .../uvicorn/__pycache__/main.cpython-311.pyc | Bin 20422 -> 0 bytes .../__pycache__/server.cpython-311.pyc | Bin 16929 -> 0 bytes .../__pycache__/workers.cpython-311.pyc | Bin 6800 -> 0 bytes .../site-packages/uvicorn/_subprocess.py | 84 - .../site-packages/uvicorn/_types.py | 281 - .../site-packages/uvicorn/config.py | 530 - .../site-packages/uvicorn/importer.py | 34 - .../uvicorn/lifespan/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 188 -> 0 bytes .../lifespan/__pycache__/off.cpython-311.pyc | Bin 1143 -> 0 bytes .../lifespan/__pycache__/on.cpython-311.pyc | Bin 8374 -> 0 bytes .../site-packages/uvicorn/lifespan/off.py | 17 - .../site-packages/uvicorn/lifespan/on.py | 137 - .../site-packages/uvicorn/logging.py | 117 - .../site-packages/uvicorn/loops/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 185 -> 0 bytes .../loops/__pycache__/asyncio.cpython-311.pyc | Bin 804 -> 0 bytes .../loops/__pycache__/auto.cpython-311.pyc | Bin 775 -> 0 bytes .../loops/__pycache__/uvloop.cpython-311.pyc | Bin 578 -> 0 bytes .../site-packages/uvicorn/loops/asyncio.py | 10 - .../site-packages/uvicorn/loops/auto.py | 11 - .../site-packages/uvicorn/loops/uvloop.py | 7 - .../python3.11/site-packages/uvicorn/main.py | 591 -- .../uvicorn/middleware/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 190 -> 0 bytes .../__pycache__/asgi2.cpython-311.pyc | Bin 1207 -> 0 bytes .../message_logger.cpython-311.pyc | Bin 4893 -> 0 bytes .../__pycache__/proxy_headers.cpython-311.pyc | Bin 6680 -> 0 bytes .../__pycache__/wsgi.cpython-311.pyc | Bin 10899 -> 0 bytes .../site-packages/uvicorn/middleware/asgi2.py | 15 - .../uvicorn/middleware/message_logger.py | 87 - .../uvicorn/middleware/proxy_headers.py | 142 - .../site-packages/uvicorn/middleware/wsgi.py | 200 - .../uvicorn/protocols/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 189 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 3554 -> 0 bytes .../uvicorn/protocols/http/__init__.py | 0 .../http/__pycache__/__init__.cpython-311.pyc | Bin 194 -> 0 bytes .../http/__pycache__/auto.cpython-311.pyc | Bin 693 -> 0 bytes .../__pycache__/flow_control.cpython-311.pyc | Bin 3290 -> 0 bytes .../http/__pycache__/h11_impl.cpython-311.pyc | Bin 27809 -> 0 bytes .../httptools_impl.cpython-311.pyc | Bin 30343 -> 0 bytes .../uvicorn/protocols/http/auto.py | 15 - .../uvicorn/protocols/http/flow_control.py | 54 - .../uvicorn/protocols/http/h11_impl.py | 543 -- .../uvicorn/protocols/http/httptools_impl.py | 570 -- .../site-packages/uvicorn/protocols/utils.py | 56 - .../uvicorn/protocols/websockets/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 200 -> 0 bytes .../__pycache__/auto.cpython-311.pyc | Bin 912 -> 0 bytes .../websockets_impl.cpython-311.pyc | Bin 22383 -> 0 bytes .../__pycache__/wsproto_impl.cpython-311.pyc | Bin 22390 -> 0 bytes .../uvicorn/protocols/websockets/auto.py | 21 - .../protocols/websockets/websockets_impl.py | 386 - .../protocols/websockets/wsproto_impl.py | 377 - .../python3.11/site-packages/uvicorn/py.typed | 1 - .../site-packages/uvicorn/server.py | 337 - .../uvicorn/supervisors/__init__.py | 16 - .../__pycache__/__init__.cpython-311.pyc | Bin 879 -> 0 bytes .../__pycache__/basereload.cpython-311.pyc | Bin 7356 -> 0 bytes .../__pycache__/multiprocess.cpython-311.pyc | Bin 14642 -> 0 bytes .../__pycache__/statreload.cpython-311.pyc | Bin 3265 -> 0 bytes .../watchfilesreload.cpython-311.pyc | Bin 5542 -> 0 bytes .../uvicorn/supervisors/basereload.py | 122 - .../uvicorn/supervisors/multiprocess.py | 222 - .../uvicorn/supervisors/statreload.py | 53 - .../uvicorn/supervisors/watchfilesreload.py | 88 - .../site-packages/uvicorn/workers.py | 114 - venv/lib64 | 1 - venv/pyvenv.cfg | 5 - 2305 files changed, 422396 deletions(-) delete mode 100644 venv/bin/Activate.ps1 delete mode 100644 venv/bin/activate delete mode 100644 venv/bin/activate.csh delete mode 100644 venv/bin/activate.fish delete mode 100755 venv/bin/fastapi delete mode 100755 venv/bin/pip delete mode 100755 venv/bin/pip3 delete mode 100755 venv/bin/pip3.11 delete mode 120000 venv/bin/python delete mode 120000 venv/bin/python3 delete mode 120000 venv/bin/python3.11 delete mode 100755 venv/bin/uvicorn delete mode 100644 venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/INSTALLER delete mode 100644 venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/LICENSE.txt delete mode 100644 venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/METADATA delete mode 100644 venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/RECORD delete mode 100644 venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/WHEEL delete mode 100644 venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/top_level.txt delete mode 100644 venv/lib/python3.11/site-packages/__pycache__/typing_extensions.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/_distutils_hack/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/_distutils_hack/override.py delete mode 100644 venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/METADATA delete mode 100644 venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/RECORD delete mode 100644 venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/licenses/LICENSE delete mode 100644 venv/lib/python3.11/site-packages/annotated_types/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/annotated_types/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/annotated_types/__pycache__/test_cases.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/annotated_types/py.typed delete mode 100644 venv/lib/python3.11/site-packages/annotated_types/test_cases.py delete mode 100644 venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/LICENSE delete mode 100644 venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/METADATA delete mode 100644 venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/RECORD delete mode 100644 venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/top_level.txt delete mode 100644 venv/lib/python3.11/site-packages/anyio/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/__pycache__/from_thread.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/__pycache__/lowlevel.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/__pycache__/pytest_plugin.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/__pycache__/to_interpreter.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/__pycache__/to_process.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/__pycache__/to_thread.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/_backends/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/_backends/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/_backends/__pycache__/_asyncio.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/_backends/__pycache__/_trio.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/_backends/_asyncio.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/_backends/_trio.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_asyncio_selector_thread.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_eventloop.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_exceptions.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_fileio.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_resources.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_signals.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_sockets.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_streams.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_subprocesses.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_synchronization.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_tasks.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_tempfile.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_testing.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_typedattr.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_asyncio_selector_thread.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_eventloop.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_exceptions.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_fileio.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_resources.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_signals.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_sockets.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_streams.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_subprocesses.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_synchronization.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_tasks.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_tempfile.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_testing.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_typedattr.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/abc/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/abc/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_eventloop.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_resources.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_sockets.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_streams.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_tasks.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_testing.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/abc/_eventloop.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/abc/_resources.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/abc/_sockets.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/abc/_streams.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/abc/_subprocesses.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/abc/_tasks.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/abc/_testing.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/from_thread.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/lowlevel.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/py.typed delete mode 100644 venv/lib/python3.11/site-packages/anyio/pytest_plugin.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/streams/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/streams/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/streams/__pycache__/buffered.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/streams/__pycache__/file.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/streams/__pycache__/memory.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/streams/__pycache__/stapled.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/streams/__pycache__/text.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/streams/__pycache__/tls.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/anyio/streams/buffered.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/streams/file.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/streams/memory.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/streams/stapled.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/streams/text.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/streams/tls.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/to_interpreter.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/to_process.py delete mode 100644 venv/lib/python3.11/site-packages/anyio/to_thread.py delete mode 100644 venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/LICENSE delete mode 100644 venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/METADATA delete mode 100644 venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/RECORD delete mode 100644 venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/REQUESTED delete mode 100644 venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/top_level.txt delete mode 100644 venv/lib/python3.11/site-packages/bcrypt/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/bcrypt/__init__.pyi delete mode 100644 venv/lib/python3.11/site-packages/bcrypt/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/bcrypt/_bcrypt.abi3.so delete mode 100644 venv/lib/python3.11/site-packages/bcrypt/py.typed delete mode 100644 venv/lib/python3.11/site-packages/click-8.1.8.dist-info/INSTALLER delete mode 100644 venv/lib/python3.11/site-packages/click-8.1.8.dist-info/LICENSE.txt delete mode 100644 venv/lib/python3.11/site-packages/click-8.1.8.dist-info/METADATA delete mode 100644 venv/lib/python3.11/site-packages/click-8.1.8.dist-info/RECORD delete mode 100644 venv/lib/python3.11/site-packages/click-8.1.8.dist-info/WHEEL delete mode 100644 venv/lib/python3.11/site-packages/click/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/_compat.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/_termui_impl.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/_textwrap.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/_winconsole.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/core.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/decorators.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/exceptions.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/formatting.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/globals.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/parser.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/shell_completion.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/termui.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/testing.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/types.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/utils.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/click/_compat.py delete mode 100644 venv/lib/python3.11/site-packages/click/_termui_impl.py delete mode 100644 venv/lib/python3.11/site-packages/click/_textwrap.py delete mode 100644 venv/lib/python3.11/site-packages/click/_winconsole.py delete mode 100644 venv/lib/python3.11/site-packages/click/core.py delete mode 100644 venv/lib/python3.11/site-packages/click/decorators.py delete mode 100644 venv/lib/python3.11/site-packages/click/exceptions.py delete mode 100644 venv/lib/python3.11/site-packages/click/formatting.py delete mode 100644 venv/lib/python3.11/site-packages/click/globals.py delete mode 100644 venv/lib/python3.11/site-packages/click/parser.py delete mode 100644 venv/lib/python3.11/site-packages/click/py.typed delete mode 100644 venv/lib/python3.11/site-packages/click/shell_completion.py delete mode 100644 venv/lib/python3.11/site-packages/click/termui.py delete mode 100644 venv/lib/python3.11/site-packages/click/testing.py delete mode 100644 venv/lib/python3.11/site-packages/click/types.py delete mode 100644 venv/lib/python3.11/site-packages/click/utils.py delete mode 100644 venv/lib/python3.11/site-packages/distutils-precedence.pth delete mode 100644 venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/INSTALLER delete mode 100644 venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/METADATA delete mode 100644 venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/RECORD delete mode 100644 venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/REQUESTED delete mode 100644 venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/WHEEL delete mode 100644 venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/licenses/LICENSE delete mode 100644 venv/lib/python3.11/site-packages/fastapi/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/__main__.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/__pycache__/__main__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/__pycache__/_compat.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/__pycache__/applications.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/__pycache__/background.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/__pycache__/cli.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/__pycache__/concurrency.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/__pycache__/datastructures.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/__pycache__/encoders.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/__pycache__/exception_handlers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/__pycache__/exceptions.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/__pycache__/logger.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/__pycache__/param_functions.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/__pycache__/params.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/__pycache__/requests.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/__pycache__/responses.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/__pycache__/routing.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/__pycache__/staticfiles.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/__pycache__/templating.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/__pycache__/testclient.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/__pycache__/types.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/__pycache__/utils.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/__pycache__/websockets.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/_compat.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/applications.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/background.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/cli.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/concurrency.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/datastructures.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/dependencies/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/dependencies/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/dependencies/__pycache__/models.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/dependencies/__pycache__/utils.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/dependencies/models.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/dependencies/utils.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/encoders.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/exception_handlers.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/exceptions.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/logger.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/middleware/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/middleware/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/middleware/__pycache__/cors.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/middleware/__pycache__/gzip.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/middleware/__pycache__/httpsredirect.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/middleware/__pycache__/trustedhost.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/middleware/__pycache__/wsgi.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/middleware/cors.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/middleware/gzip.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/middleware/httpsredirect.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/middleware/trustedhost.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/middleware/wsgi.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/openapi/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/openapi/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/openapi/__pycache__/constants.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/openapi/__pycache__/docs.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/openapi/__pycache__/models.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/openapi/__pycache__/utils.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/openapi/constants.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/openapi/docs.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/openapi/models.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/openapi/utils.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/param_functions.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/params.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/py.typed delete mode 100644 venv/lib/python3.11/site-packages/fastapi/requests.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/responses.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/routing.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/security/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/security/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/security/__pycache__/api_key.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/security/__pycache__/base.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/security/__pycache__/http.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/security/__pycache__/oauth2.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/security/__pycache__/open_id_connect_url.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/security/__pycache__/utils.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/fastapi/security/api_key.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/security/base.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/security/http.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/security/oauth2.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/security/open_id_connect_url.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/security/utils.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/staticfiles.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/templating.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/testclient.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/types.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/utils.py delete mode 100644 venv/lib/python3.11/site-packages/fastapi/websockets.py delete mode 100644 venv/lib/python3.11/site-packages/h11-0.14.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.11/site-packages/h11-0.14.0.dist-info/LICENSE.txt delete mode 100644 venv/lib/python3.11/site-packages/h11-0.14.0.dist-info/METADATA delete mode 100644 venv/lib/python3.11/site-packages/h11-0.14.0.dist-info/RECORD delete mode 100644 venv/lib/python3.11/site-packages/h11-0.14.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.11/site-packages/h11-0.14.0.dist-info/top_level.txt delete mode 100644 venv/lib/python3.11/site-packages/h11/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/h11/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/h11/__pycache__/_abnf.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/h11/__pycache__/_connection.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/h11/__pycache__/_events.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/h11/__pycache__/_headers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/h11/__pycache__/_readers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/h11/__pycache__/_receivebuffer.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/h11/__pycache__/_state.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/h11/__pycache__/_util.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/h11/__pycache__/_version.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/h11/__pycache__/_writers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/h11/_abnf.py delete mode 100644 venv/lib/python3.11/site-packages/h11/_connection.py delete mode 100644 venv/lib/python3.11/site-packages/h11/_events.py delete mode 100644 venv/lib/python3.11/site-packages/h11/_headers.py delete mode 100644 venv/lib/python3.11/site-packages/h11/_readers.py delete mode 100644 venv/lib/python3.11/site-packages/h11/_receivebuffer.py delete mode 100644 venv/lib/python3.11/site-packages/h11/_state.py delete mode 100644 venv/lib/python3.11/site-packages/h11/_util.py delete mode 100644 venv/lib/python3.11/site-packages/h11/_version.py delete mode 100644 venv/lib/python3.11/site-packages/h11/_writers.py delete mode 100644 venv/lib/python3.11/site-packages/h11/py.typed delete mode 100644 venv/lib/python3.11/site-packages/h11/tests/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/h11/tests/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/h11/tests/__pycache__/helpers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/h11/tests/__pycache__/test_against_stdlib_http.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/h11/tests/__pycache__/test_connection.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/h11/tests/__pycache__/test_events.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/h11/tests/__pycache__/test_headers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/h11/tests/__pycache__/test_helpers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/h11/tests/__pycache__/test_io.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/h11/tests/__pycache__/test_receivebuffer.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/h11/tests/__pycache__/test_state.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/h11/tests/__pycache__/test_util.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/h11/tests/data/test-file delete mode 100644 venv/lib/python3.11/site-packages/h11/tests/helpers.py delete mode 100644 venv/lib/python3.11/site-packages/h11/tests/test_against_stdlib_http.py delete mode 100644 venv/lib/python3.11/site-packages/h11/tests/test_connection.py delete mode 100644 venv/lib/python3.11/site-packages/h11/tests/test_events.py delete mode 100644 venv/lib/python3.11/site-packages/h11/tests/test_headers.py delete mode 100644 venv/lib/python3.11/site-packages/h11/tests/test_helpers.py delete mode 100644 venv/lib/python3.11/site-packages/h11/tests/test_io.py delete mode 100644 venv/lib/python3.11/site-packages/h11/tests/test_receivebuffer.py delete mode 100644 venv/lib/python3.11/site-packages/h11/tests/test_state.py delete mode 100644 venv/lib/python3.11/site-packages/h11/tests/test_util.py delete mode 100644 venv/lib/python3.11/site-packages/idna-3.10.dist-info/INSTALLER delete mode 100644 venv/lib/python3.11/site-packages/idna-3.10.dist-info/LICENSE.md delete mode 100644 venv/lib/python3.11/site-packages/idna-3.10.dist-info/METADATA delete mode 100644 venv/lib/python3.11/site-packages/idna-3.10.dist-info/RECORD delete mode 100644 venv/lib/python3.11/site-packages/idna-3.10.dist-info/WHEEL delete mode 100644 venv/lib/python3.11/site-packages/idna/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/idna/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/idna/__pycache__/codec.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/idna/__pycache__/compat.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/idna/__pycache__/core.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/idna/__pycache__/idnadata.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/idna/__pycache__/intranges.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/idna/__pycache__/package_data.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/idna/__pycache__/uts46data.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/idna/codec.py delete mode 100644 venv/lib/python3.11/site-packages/idna/compat.py delete mode 100644 venv/lib/python3.11/site-packages/idna/core.py delete mode 100644 venv/lib/python3.11/site-packages/idna/idnadata.py delete mode 100644 venv/lib/python3.11/site-packages/idna/intranges.py delete mode 100644 venv/lib/python3.11/site-packages/idna/package_data.py delete mode 100644 venv/lib/python3.11/site-packages/idna/py.typed delete mode 100644 venv/lib/python3.11/site-packages/idna/uts46data.py delete mode 100644 venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/INSTALLER delete mode 100644 venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/METADATA delete mode 100644 venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/RECORD delete mode 100644 venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/REQUESTED delete mode 100644 venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/WHEEL delete mode 100644 venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__pycache__/_identifier.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__pycache__/async_utils.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__pycache__/bccache.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__pycache__/compiler.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__pycache__/constants.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__pycache__/debug.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__pycache__/defaults.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__pycache__/environment.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__pycache__/exceptions.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__pycache__/ext.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__pycache__/filters.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__pycache__/idtracking.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__pycache__/lexer.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__pycache__/loaders.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__pycache__/meta.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__pycache__/nativetypes.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__pycache__/nodes.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__pycache__/optimizer.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__pycache__/parser.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__pycache__/runtime.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__pycache__/sandbox.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__pycache__/tests.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__pycache__/utils.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/jinja2/__pycache__/visitor.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/jinja2/_identifier.py delete mode 100644 venv/lib/python3.11/site-packages/jinja2/async_utils.py delete mode 100644 venv/lib/python3.11/site-packages/jinja2/bccache.py delete mode 100644 venv/lib/python3.11/site-packages/jinja2/compiler.py delete mode 100644 venv/lib/python3.11/site-packages/jinja2/constants.py delete mode 100644 venv/lib/python3.11/site-packages/jinja2/debug.py delete mode 100644 venv/lib/python3.11/site-packages/jinja2/defaults.py delete mode 100644 venv/lib/python3.11/site-packages/jinja2/environment.py delete mode 100644 venv/lib/python3.11/site-packages/jinja2/exceptions.py delete mode 100644 venv/lib/python3.11/site-packages/jinja2/ext.py delete mode 100644 venv/lib/python3.11/site-packages/jinja2/filters.py delete mode 100644 venv/lib/python3.11/site-packages/jinja2/idtracking.py delete mode 100644 venv/lib/python3.11/site-packages/jinja2/lexer.py delete mode 100644 venv/lib/python3.11/site-packages/jinja2/loaders.py delete mode 100644 venv/lib/python3.11/site-packages/jinja2/meta.py delete mode 100644 venv/lib/python3.11/site-packages/jinja2/nativetypes.py delete mode 100644 venv/lib/python3.11/site-packages/jinja2/nodes.py delete mode 100644 venv/lib/python3.11/site-packages/jinja2/optimizer.py delete mode 100644 venv/lib/python3.11/site-packages/jinja2/parser.py delete mode 100644 venv/lib/python3.11/site-packages/jinja2/py.typed delete mode 100644 venv/lib/python3.11/site-packages/jinja2/runtime.py delete mode 100644 venv/lib/python3.11/site-packages/jinja2/sandbox.py delete mode 100644 venv/lib/python3.11/site-packages/jinja2/tests.py delete mode 100644 venv/lib/python3.11/site-packages/jinja2/utils.py delete mode 100644 venv/lib/python3.11/site-packages/jinja2/visitor.py delete mode 100644 venv/lib/python3.11/site-packages/markupsafe/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/markupsafe/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/markupsafe/__pycache__/_native.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/markupsafe/_native.py delete mode 100644 venv/lib/python3.11/site-packages/markupsafe/_speedups.c delete mode 100755 venv/lib/python3.11/site-packages/markupsafe/_speedups.cpython-311-x86_64-linux-gnu.so delete mode 100644 venv/lib/python3.11/site-packages/markupsafe/_speedups.pyi delete mode 100644 venv/lib/python3.11/site-packages/markupsafe/py.typed delete mode 100644 venv/lib/python3.11/site-packages/pip-23.0.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.11/site-packages/pip-23.0.1.dist-info/LICENSE.txt delete mode 100644 venv/lib/python3.11/site-packages/pip-23.0.1.dist-info/METADATA delete mode 100644 venv/lib/python3.11/site-packages/pip-23.0.1.dist-info/RECORD delete mode 100644 venv/lib/python3.11/site-packages/pip-23.0.1.dist-info/REQUESTED delete mode 100644 venv/lib/python3.11/site-packages/pip-23.0.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.11/site-packages/pip-23.0.1.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.11/site-packages/pip-23.0.1.dist-info/top_level.txt delete mode 100644 venv/lib/python3.11/site-packages/pip/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/__main__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/__pip-runner__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/__pycache__/__main__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/__pycache__/__pip-runner__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/build_env.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/cache.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/exceptions.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/pyproject.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/build_env.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cache.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/main.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/parser.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/autocompletion.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/base_command.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/cmdoptions.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/command_context.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/main.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/main_parser.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/parser.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/progress_bars.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/req_command.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/spinners.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/status_codes.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/cache.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/check.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/completion.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/debug.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/download.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/hash.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/help.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/index.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/install.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/list.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/search.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/show.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/cache.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/check.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/completion.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/configuration.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/debug.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/download.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/freeze.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/hash.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/help.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/index.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/inspect.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/install.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/list.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/search.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/show.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/uninstall.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/wheel.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/configuration.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/distributions/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/base.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/distributions/base.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/distributions/installed.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/distributions/sdist.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/distributions/wheel.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/exceptions.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/index/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/index/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/index/__pycache__/collector.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/index/__pycache__/sources.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/index/collector.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/index/package_finder.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/index/sources.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/locations/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/base.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/locations/_distutils.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/locations/_sysconfig.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/locations/base.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/main.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/base.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/_json.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/base.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/_compat.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/_dists.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/_envs.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/pkg_resources.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/candidate.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/format_control.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/index.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/link.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/scheme.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/target_python.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/wheel.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/candidate.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/direct_url.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/format_control.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/index.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/installation_report.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/link.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/scheme.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/search_scope.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/selection_prefs.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/target_python.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/wheel.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/auth.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/cache.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/download.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/session.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/utils.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/auth.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/cache.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/download.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/lazy_wheel.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/session.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/utils.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/xmlrpc.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/check.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/build_tracker.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/metadata.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/metadata_editable.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/metadata_legacy.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/wheel.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/wheel_editable.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/wheel_legacy.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/check.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/freeze.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/install/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/install/editable_legacy.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/install/legacy.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/install/wheel.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/prepare.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/pyproject.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/req/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/constructors.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_file.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_install.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_set.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/req/constructors.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/req/req_file.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/req/req_install.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/req/req_set.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/req/req_uninstall.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/__pycache__/base.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/base.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/legacy/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/legacy/resolver.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/base.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/candidates.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/factory.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/provider.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/reporter.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/requirements.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/resolver.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/self_outdated_check.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/_log.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/compat.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/logging.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/misc.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/models.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/urls.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/_log.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/appdirs.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/compat.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/compatibility_tags.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/datetime.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/deprecation.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/direct_url_helpers.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/distutils_args.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/egg_link.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/encoding.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/entrypoints.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/filesystem.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/filetypes.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/glibc.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/hashes.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/inject_securetransport.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/logging.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/misc.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/models.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/packaging.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/setuptools_build.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/subprocess.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/temp_dir.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/unpacking.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/urls.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/virtualenv.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/wheel.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/vcs/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/git.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/vcs/bazaar.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/vcs/git.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/vcs/mercurial.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/vcs/subversion.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/vcs/versioncontrol.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_internal/wheel_builder.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/__pycache__/six.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/_cmd.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/adapter.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/cache.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/compat.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/controller.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/filewrapper.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/heuristics.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/serialize.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/wrapper.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/certifi/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/certifi/__main__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/certifi/cacert.pem delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/certifi/core.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/big5freq.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/big5prober.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/chardistribution.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/charsetgroupprober.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/charsetprober.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/cli/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/cli/chardetect.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/codingstatemachine.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/codingstatemachinedict.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/cp949prober.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/enums.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/escprober.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/escsm.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/eucjpprober.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/euckrfreq.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/euckrprober.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/euctwfreq.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/euctwprober.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/gb2312freq.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/gb2312prober.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/hebrewprober.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/jisfreq.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/johabfreq.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/johabprober.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/jpcntx.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/langbulgarianmodel.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/langgreekmodel.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/langhebrewmodel.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/langhungarianmodel.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/langrussianmodel.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/langthaimodel.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/langturkishmodel.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/latin1prober.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/macromanprober.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/mbcharsetprober.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/mbcsgroupprober.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/mbcssm.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/languages.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/resultdict.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/sbcharsetprober.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/sbcsgroupprober.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/sjisprober.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/universaldetector.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/utf1632prober.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/utf8prober.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/version.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/ansi.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/ansitowin32.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/initialise.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/ansi_test.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/initialise_test.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/isatty_test.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/utils.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/winterm_test.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/win32.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/winterm.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/compat.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/database.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/index.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/locators.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/manifest.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/markers.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/metadata.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/resources.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/scripts.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/util.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/version.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/wheel.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distro/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distro/__main__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distro/distro.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/core.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/codec.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/compat.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/core.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/idnadata.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/intranges.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/package_data.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/uts46data.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/msgpack/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/msgpack/exceptions.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/msgpack/ext.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/msgpack/fallback.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__about__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/_manylinux.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/_musllinux.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/_structures.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/markers.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/requirements.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/specifiers.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/tags.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/utils.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/version.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pkg_resources/py31compat.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__main__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/android.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/api.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/macos.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/unix.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/version.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/windows.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__main__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/cmdline.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/console.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/filter.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/filters/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatter.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/_mapping.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/bbcode.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/groff.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/html.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/img.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/irc.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/latex.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/other.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/rtf.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/svg.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/terminal.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/terminal256.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexer.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/_mapping.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/python.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/modeline.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/plugin.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/regexopt.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/scanner.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/sphinxext.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/style.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/styles/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/token.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/unistring.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/util.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/actions.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/common.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/core.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/diagram/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/exceptions.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/helpers.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/results.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/testing.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/unicode.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/util.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_compat.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_impl.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/api.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/help.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/models.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__version__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/_internal_utils.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/adapters.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/api.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/auth.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/certs.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/compat.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/cookies.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/exceptions.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/help.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/hooks.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/models.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/packages.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/sessions.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/status_codes.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/structures.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/utils.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/providers.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/reporters.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/structs.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__main__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/align.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/box.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/color.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/console.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/control.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/json.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/live.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/region.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/status.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/style.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/table.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/text.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_cell_widths.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_codes.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_replace.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_export_format.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_extension.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_inspect.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_log_render.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_loop.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_null_file.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_palettes.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_pick.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_ratio.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_spinners.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_stack.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_timer.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_win32_console.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_windows.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_windows_renderer.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_wrap.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/abc.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/align.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/ansi.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/bar.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/box.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/cells.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/color.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/color_triplet.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/columns.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/console.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/constrain.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/containers.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/control.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/default_styles.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/diagnose.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/emoji.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/errors.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/file_proxy.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/filesize.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/highlighter.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/json.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/jupyter.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/layout.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/live.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/live_render.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/logging.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/markup.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/measure.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/padding.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/pager.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/palette.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/panel.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/pretty.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/progress.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/progress_bar.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/prompt.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/protocol.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/region.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/repr.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/rule.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/scope.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/screen.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/segment.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/spinner.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/status.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/style.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/styled.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/syntax.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/table.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/terminal_theme.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/text.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/theme.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/themes.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/traceback.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/tree.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/six.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/_asyncio.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/_utils.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/after.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/before.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/before_sleep.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/nap.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/retry.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/stop.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/tornadoweb.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/wait.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tomli/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tomli/_parser.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tomli/_re.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tomli/_types.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/typing_extensions.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/_collections.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/_version.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/connection.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/connectionpool.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/appengine.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/securetransport.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/socks.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/exceptions.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/fields.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/filepost.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/six.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/poolmanager.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/request.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/response.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/connection.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/proxy.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/queue.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/request.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/response.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/retry.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/ssl_.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/ssltransport.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/timeout.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/url.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/wait.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/vendor.txt delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/webencodings/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/webencodings/labels.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/webencodings/mklabels.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/webencodings/tests.py delete mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/webencodings/x_user_defined.py delete mode 100644 venv/lib/python3.11/site-packages/pip/py.typed delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/__pycache__/typing_extensions.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/__pycache__/zipp.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_adapters.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_common.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_compat.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_itertools.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_legacy.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/abc.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/readers.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/simple.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__pycache__/context.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__pycache__/functools.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/context.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/functools.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/text/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/more.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/more.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/recipes.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__about__.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/tags.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_manylinux.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_musllinux.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_structures.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/markers.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/requirements.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/specifiers.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/tags.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/utils.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/version.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__main__.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/android.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/api.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/version.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/android.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/api.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/macos.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/unix.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/version.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/windows.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/common.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/core.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/results.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/util.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/actions.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/common.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/core.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/diagram/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/exceptions.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/helpers.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/results.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/testing.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/unicode.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/util.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/typing_extensions.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/zipp.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/extern/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic-2.11.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.11/site-packages/pydantic-2.11.1.dist-info/METADATA delete mode 100644 venv/lib/python3.11/site-packages/pydantic-2.11.1.dist-info/RECORD delete mode 100644 venv/lib/python3.11/site-packages/pydantic-2.11.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.11/site-packages/pydantic-2.11.1.dist-info/licenses/LICENSE delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/_migration.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/alias_generators.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/aliases.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/annotated_handlers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/class_validators.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/color.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/config.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/dataclasses.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/datetime_parse.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/decorator.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/env_settings.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/error_wrappers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/errors.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/fields.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/functional_serializers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/functional_validators.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/generics.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/json.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/json_schema.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/main.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/mypy.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/networks.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/parse.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/root_model.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/schema.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/tools.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/type_adapter.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/types.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/typing.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/utils.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/validate_call_decorator.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/validators.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/version.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/warnings.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_config.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_core_metadata.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_core_utils.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_dataclasses.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_decorators.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_decorators_v1.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_discriminated_union.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_docs_extraction.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_fields.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_forward_ref.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_generate_schema.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_generics.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_git.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_import_utils.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_internal_dataclass.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_known_annotated_metadata.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_mock_val_ser.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_model_construction.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_namespace_utils.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_repr.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_schema_gather.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_schema_generation_shared.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_serializers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_signature.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_typing_extra.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_utils.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_validate_call.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_validators.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_config.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_core_metadata.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_dataclasses.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_decorators.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_decorators_v1.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_discriminated_union.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_docs_extraction.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_fields.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_forward_ref.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_generics.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_git.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_import_utils.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_internal_dataclass.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_known_annotated_metadata.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_mock_val_ser.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_namespace_utils.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_repr.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_schema_gather.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_serializers.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_signature.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_utils.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_validators.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/_migration.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/alias_generators.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/aliases.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/annotated_handlers.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/class_validators.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/color.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/config.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/dataclasses.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/datetime_parse.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/decorator.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/__pycache__/class_validators.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/__pycache__/config.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/__pycache__/copy_internals.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/__pycache__/decorator.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/__pycache__/json.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/__pycache__/parse.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/__pycache__/tools.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/class_validators.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/config.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/copy_internals.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/decorator.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/json.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/parse.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/tools.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/env_settings.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/error_wrappers.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/errors.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/experimental/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/experimental/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/experimental/__pycache__/arguments_schema.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/experimental/__pycache__/pipeline.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/experimental/arguments_schema.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/experimental/pipeline.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/fields.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/functional_serializers.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/functional_validators.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/generics.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/json.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/json_schema.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/main.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/mypy.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/networks.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/parse.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/plugin/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/plugin/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/plugin/__pycache__/_loader.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/plugin/__pycache__/_schema_validator.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/plugin/_loader.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/plugin/_schema_validator.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/py.typed delete mode 100644 venv/lib/python3.11/site-packages/pydantic/root_model.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/schema.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/tools.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/type_adapter.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/types.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/typing.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/utils.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/_hypothesis_plugin.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/annotated_types.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/class_validators.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/color.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/config.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/dataclasses.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/datetime_parse.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/decorator.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/env_settings.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/error_wrappers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/errors.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/fields.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/generics.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/json.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/main.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/mypy.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/networks.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/parse.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/schema.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/tools.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/types.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/typing.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/utils.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/validators.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/version.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/_hypothesis_plugin.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/annotated_types.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/class_validators.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/color.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/config.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/dataclasses.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/datetime_parse.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/decorator.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/env_settings.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/error_wrappers.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/errors.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/fields.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/generics.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/json.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/main.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/mypy.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/networks.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/parse.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/py.typed delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/schema.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/tools.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/types.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/typing.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/utils.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/validators.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/version.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/validate_call_decorator.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/validators.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/version.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic/warnings.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic_core-2.33.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.11/site-packages/pydantic_core-2.33.0.dist-info/METADATA delete mode 100644 venv/lib/python3.11/site-packages/pydantic_core-2.33.0.dist-info/RECORD delete mode 100644 venv/lib/python3.11/site-packages/pydantic_core-2.33.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.11/site-packages/pydantic_core-2.33.0.dist-info/licenses/LICENSE delete mode 100644 venv/lib/python3.11/site-packages/pydantic_core/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic_core/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/pydantic_core/__pycache__/core_schema.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pydantic_core/_pydantic_core.cpython-311-x86_64-linux-gnu.so delete mode 100644 venv/lib/python3.11/site-packages/pydantic_core/_pydantic_core.pyi delete mode 100644 venv/lib/python3.11/site-packages/pydantic_core/core_schema.py delete mode 100644 venv/lib/python3.11/site-packages/pydantic_core/py.typed delete mode 100644 venv/lib/python3.11/site-packages/setuptools-66.1.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.11/site-packages/setuptools-66.1.1.dist-info/LICENSE delete mode 100644 venv/lib/python3.11/site-packages/setuptools-66.1.1.dist-info/METADATA delete mode 100644 venv/lib/python3.11/site-packages/setuptools-66.1.1.dist-info/RECORD delete mode 100644 venv/lib/python3.11/site-packages/setuptools-66.1.1.dist-info/REQUESTED delete mode 100644 venv/lib/python3.11/site-packages/setuptools-66.1.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.11/site-packages/setuptools-66.1.1.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.11/site-packages/setuptools-66.1.1.dist-info/top_level.txt delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/_entry_points.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/_imp.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/_importlib.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/_itertools.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/_path.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/_reqs.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/archive_util.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/build_meta.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/dep_util.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/depends.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/discovery.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/dist.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/errors.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/extension.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/glob.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/installer.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/launch.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/logging.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/monkey.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/msvc.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/namespaces.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/package_index.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/py34compat.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/sandbox.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/unicode_utils.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/version.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/wheel.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/windows_support.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_deprecation_warning.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_collections.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_functools.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_log.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_macos_compat.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_msvccompiler.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/archive_util.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/bcppcompiler.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/ccompiler.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/cmd.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/config.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/core.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/cygwinccompiler.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/debug.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/dep_util.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/dir_util.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/dist.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/errors.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/extension.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/fancy_getopt.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/file_util.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/filelist.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/log.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/msvc9compiler.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/msvccompiler.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/py38compat.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/py39compat.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/spawn.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/sysconfig.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/text_file.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/unixccompiler.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/util.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/version.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/versionpredicate.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/_collections.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/_functools.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/_log.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/_macos_compat.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/_msvccompiler.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/archive_util.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/bcppcompiler.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/ccompiler.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/cmd.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/_framework_compat.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/bdist.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/bdist_dumb.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/bdist_rpm.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_clib.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_ext.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_py.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_scripts.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/check.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/clean.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/config.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_data.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_egg_info.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_headers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_lib.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_scripts.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/py37compat.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/register.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/sdist.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/upload.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/_framework_compat.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/bdist.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/bdist_dumb.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/bdist_rpm.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/build.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/build_clib.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/build_ext.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/build_py.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/build_scripts.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/check.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/clean.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/config.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/install.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/install_data.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/install_egg_info.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/install_headers.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/install_lib.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/install_scripts.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/py37compat.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/register.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/sdist.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/upload.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/config.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/core.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/cygwinccompiler.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/debug.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/dep_util.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/dir_util.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/dist.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/errors.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/extension.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/fancy_getopt.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/file_util.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/filelist.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/log.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/msvc9compiler.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/msvccompiler.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/py38compat.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/py39compat.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/spawn.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/sysconfig.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/text_file.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/unixccompiler.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/util.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/version.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/versionpredicate.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_entry_points.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_imp.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_importlib.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_itertools.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_path.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_reqs.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/typing_extensions.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/zipp.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_adapters.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_collections.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_compat.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_functools.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_itertools.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_meta.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_text.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_adapters.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_collections.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_compat.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_functools.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_meta.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_text.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_adapters.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_common.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_compat.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_itertools.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_legacy.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/abc.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/readers.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/simple.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__pycache__/context.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__pycache__/functools.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/context.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/functools.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/text/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__pycache__/more.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/more.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/recipes.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/ordered_set.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__about__.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/_manylinux.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/_musllinux.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/_structures.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/markers.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/requirements.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/specifiers.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/tags.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/utils.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/version.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/common.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/core.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/results.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/util.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/actions.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/common.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/core.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/diagram/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/exceptions.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/helpers.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/results.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/testing.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/unicode.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/util.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/_parser.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/_re.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/_types.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/_parser.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/_re.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/_types.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/typing_extensions.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/zipp.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/archive_util.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/build_meta.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/cli-32.exe delete mode 100644 venv/lib/python3.11/site-packages/setuptools/cli-64.exe delete mode 100644 venv/lib/python3.11/site-packages/setuptools/cli-arm64.exe delete mode 100644 venv/lib/python3.11/site-packages/setuptools/cli.exe delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/alias.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/build.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/build_clib.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/build_ext.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/build_py.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/develop.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/dist_info.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/easy_install.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/editable_wheel.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/egg_info.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/install.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/install_lib.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/install_scripts.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/py36compat.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/register.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/rotate.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/saveopts.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/sdist.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/setopt.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/test.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/upload.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/upload_docs.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/alias.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/bdist_egg.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/bdist_rpm.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/build.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/build_clib.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/build_ext.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/build_py.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/develop.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/dist_info.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/easy_install.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/editable_wheel.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/egg_info.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/install.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/install_egg_info.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/install_lib.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/install_scripts.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/launcher manifest.xml delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/py36compat.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/register.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/rotate.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/saveopts.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/sdist.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/setopt.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/test.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/upload.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/command/upload_docs.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/config/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/config/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/config/__pycache__/_apply_pyprojecttoml.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/config/__pycache__/expand.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/config/__pycache__/pyprojecttoml.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/config/__pycache__/setupcfg.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_apply_pyprojecttoml.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/error_reporting.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/extra_validations.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_exceptions.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_validations.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/formats.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/error_reporting.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/extra_validations.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/formats.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/config/expand.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/config/pyprojecttoml.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/config/setupcfg.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/dep_util.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/depends.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/discovery.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/dist.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/errors.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/extension.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/extern/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/extern/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/setuptools/glob.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/gui-32.exe delete mode 100644 venv/lib/python3.11/site-packages/setuptools/gui-64.exe delete mode 100644 venv/lib/python3.11/site-packages/setuptools/gui-arm64.exe delete mode 100644 venv/lib/python3.11/site-packages/setuptools/gui.exe delete mode 100644 venv/lib/python3.11/site-packages/setuptools/installer.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/launch.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/logging.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/monkey.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/msvc.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/namespaces.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/package_index.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/py34compat.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/sandbox.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/script (dev).tmpl delete mode 100644 venv/lib/python3.11/site-packages/setuptools/script.tmpl delete mode 100644 venv/lib/python3.11/site-packages/setuptools/unicode_utils.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/version.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/wheel.py delete mode 100644 venv/lib/python3.11/site-packages/setuptools/windows_support.py delete mode 100644 venv/lib/python3.11/site-packages/sniffio-1.3.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.11/site-packages/sniffio-1.3.1.dist-info/LICENSE delete mode 100644 venv/lib/python3.11/site-packages/sniffio-1.3.1.dist-info/LICENSE.APACHE2 delete mode 100644 venv/lib/python3.11/site-packages/sniffio-1.3.1.dist-info/LICENSE.MIT delete mode 100644 venv/lib/python3.11/site-packages/sniffio-1.3.1.dist-info/METADATA delete mode 100644 venv/lib/python3.11/site-packages/sniffio-1.3.1.dist-info/RECORD delete mode 100644 venv/lib/python3.11/site-packages/sniffio-1.3.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.11/site-packages/sniffio-1.3.1.dist-info/top_level.txt delete mode 100644 venv/lib/python3.11/site-packages/sniffio/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/sniffio/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/sniffio/__pycache__/_impl.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/sniffio/__pycache__/_version.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/sniffio/_impl.py delete mode 100644 venv/lib/python3.11/site-packages/sniffio/_tests/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/sniffio/_tests/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/sniffio/_tests/__pycache__/test_sniffio.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/sniffio/_tests/test_sniffio.py delete mode 100644 venv/lib/python3.11/site-packages/sniffio/_version.py delete mode 100644 venv/lib/python3.11/site-packages/sniffio/py.typed delete mode 100644 venv/lib/python3.11/site-packages/starlette-0.46.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.11/site-packages/starlette-0.46.1.dist-info/METADATA delete mode 100644 venv/lib/python3.11/site-packages/starlette-0.46.1.dist-info/RECORD delete mode 100644 venv/lib/python3.11/site-packages/starlette-0.46.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.11/site-packages/starlette-0.46.1.dist-info/licenses/LICENSE.md delete mode 100644 venv/lib/python3.11/site-packages/starlette/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/_exception_handler.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/_utils.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/applications.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/authentication.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/background.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/concurrency.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/config.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/convertors.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/datastructures.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/endpoints.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/exceptions.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/formparsers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/requests.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/responses.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/routing.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/schemas.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/staticfiles.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/status.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/templating.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/testclient.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/types.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/websockets.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/_exception_handler.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/_utils.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/applications.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/authentication.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/background.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/concurrency.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/config.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/convertors.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/datastructures.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/endpoints.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/exceptions.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/formparsers.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/__pycache__/authentication.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/__pycache__/base.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/__pycache__/cors.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/__pycache__/errors.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/__pycache__/exceptions.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/__pycache__/gzip.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/__pycache__/httpsredirect.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/__pycache__/sessions.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/__pycache__/trustedhost.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/__pycache__/wsgi.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/authentication.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/base.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/cors.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/errors.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/exceptions.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/gzip.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/httpsredirect.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/sessions.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/trustedhost.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/wsgi.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/py.typed delete mode 100644 venv/lib/python3.11/site-packages/starlette/requests.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/responses.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/routing.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/schemas.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/staticfiles.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/status.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/templating.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/testclient.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/types.py delete mode 100644 venv/lib/python3.11/site-packages/starlette/websockets.py delete mode 100644 venv/lib/python3.11/site-packages/typing_extensions-4.13.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.11/site-packages/typing_extensions-4.13.0.dist-info/METADATA delete mode 100644 venv/lib/python3.11/site-packages/typing_extensions-4.13.0.dist-info/RECORD delete mode 100644 venv/lib/python3.11/site-packages/typing_extensions-4.13.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.11/site-packages/typing_extensions-4.13.0.dist-info/licenses/LICENSE delete mode 100644 venv/lib/python3.11/site-packages/typing_extensions.py delete mode 100644 venv/lib/python3.11/site-packages/typing_inspection-0.4.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.11/site-packages/typing_inspection-0.4.0.dist-info/METADATA delete mode 100644 venv/lib/python3.11/site-packages/typing_inspection-0.4.0.dist-info/RECORD delete mode 100644 venv/lib/python3.11/site-packages/typing_inspection-0.4.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.11/site-packages/typing_inspection-0.4.0.dist-info/licenses/LICENSE delete mode 100644 venv/lib/python3.11/site-packages/typing_inspection/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/typing_inspection/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/typing_inspection/__pycache__/introspection.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/typing_inspection/__pycache__/typing_objects.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/typing_inspection/introspection.py delete mode 100644 venv/lib/python3.11/site-packages/typing_inspection/py.typed delete mode 100644 venv/lib/python3.11/site-packages/typing_inspection/typing_objects.py delete mode 100644 venv/lib/python3.11/site-packages/typing_inspection/typing_objects.pyi delete mode 100644 venv/lib/python3.11/site-packages/uvicorn-0.34.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.11/site-packages/uvicorn-0.34.0.dist-info/METADATA delete mode 100644 venv/lib/python3.11/site-packages/uvicorn-0.34.0.dist-info/RECORD delete mode 100644 venv/lib/python3.11/site-packages/uvicorn-0.34.0.dist-info/REQUESTED delete mode 100644 venv/lib/python3.11/site-packages/uvicorn-0.34.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.11/site-packages/uvicorn-0.34.0.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.11/site-packages/uvicorn-0.34.0.dist-info/licenses/LICENSE.md delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/__main__.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/__pycache__/__main__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/__pycache__/_subprocess.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/__pycache__/_types.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/__pycache__/config.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/__pycache__/importer.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/__pycache__/logging.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/__pycache__/main.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/__pycache__/server.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/__pycache__/workers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/_subprocess.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/_types.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/config.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/importer.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/lifespan/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/lifespan/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/lifespan/__pycache__/off.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/lifespan/__pycache__/on.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/lifespan/off.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/lifespan/on.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/logging.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/loops/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/loops/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/loops/__pycache__/asyncio.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/loops/__pycache__/auto.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/loops/__pycache__/uvloop.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/loops/asyncio.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/loops/auto.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/loops/uvloop.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/main.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/middleware/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/middleware/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/middleware/__pycache__/asgi2.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/middleware/__pycache__/message_logger.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/middleware/__pycache__/proxy_headers.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/middleware/__pycache__/wsgi.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/middleware/asgi2.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/middleware/message_logger.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/middleware/proxy_headers.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/middleware/wsgi.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/__pycache__/utils.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/http/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/http/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/http/__pycache__/auto.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/http/__pycache__/flow_control.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/http/__pycache__/h11_impl.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/http/__pycache__/httptools_impl.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/http/auto.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/http/flow_control.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/http/h11_impl.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/http/httptools_impl.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/utils.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/websockets/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/websockets/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/websockets/__pycache__/auto.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/websockets/__pycache__/websockets_impl.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/websockets/__pycache__/wsproto_impl.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/websockets/auto.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/websockets/websockets_impl.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/websockets/wsproto_impl.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/py.typed delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/server.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/supervisors/__init__.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/supervisors/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/supervisors/__pycache__/basereload.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/supervisors/__pycache__/multiprocess.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/supervisors/__pycache__/statreload.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/supervisors/__pycache__/watchfilesreload.cpython-311.pyc delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/supervisors/basereload.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/supervisors/multiprocess.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/supervisors/statreload.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/supervisors/watchfilesreload.py delete mode 100644 venv/lib/python3.11/site-packages/uvicorn/workers.py delete mode 120000 venv/lib64 delete mode 100644 venv/pyvenv.cfg diff --git a/venv/bin/Activate.ps1 b/venv/bin/Activate.ps1 deleted file mode 100644 index b49d77b..0000000 --- a/venv/bin/Activate.ps1 +++ /dev/null @@ -1,247 +0,0 @@ -<# -.Synopsis -Activate a Python virtual environment for the current PowerShell session. - -.Description -Pushes the python executable for a virtual environment to the front of the -$Env:PATH environment variable and sets the prompt to signify that you are -in a Python virtual environment. Makes use of the command line switches as -well as the `pyvenv.cfg` file values present in the virtual environment. - -.Parameter VenvDir -Path to the directory that contains the virtual environment to activate. The -default value for this is the parent of the directory that the Activate.ps1 -script is located within. - -.Parameter Prompt -The prompt prefix to display when this virtual environment is activated. By -default, this prompt is the name of the virtual environment folder (VenvDir) -surrounded by parentheses and followed by a single space (ie. '(.venv) '). - -.Example -Activate.ps1 -Activates the Python virtual environment that contains the Activate.ps1 script. - -.Example -Activate.ps1 -Verbose -Activates the Python virtual environment that contains the Activate.ps1 script, -and shows extra information about the activation as it executes. - -.Example -Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv -Activates the Python virtual environment located in the specified location. - -.Example -Activate.ps1 -Prompt "MyPython" -Activates the Python virtual environment that contains the Activate.ps1 script, -and prefixes the current prompt with the specified string (surrounded in -parentheses) while the virtual environment is active. - -.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/venv/bin/activate b/venv/bin/activate deleted file mode 100644 index 126d775..0000000 --- a/venv/bin/activate +++ /dev/null @@ -1,69 +0,0 @@ -# This file must be used with "source bin/activate" *from bash* -# you cannot run it directly - -deactivate () { - # reset old environment variables - if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then - PATH="${_OLD_VIRTUAL_PATH:-}" - export PATH - unset _OLD_VIRTUAL_PATH - fi - if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then - PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" - export PYTHONHOME - unset _OLD_VIRTUAL_PYTHONHOME - fi - - # This should detect bash and zsh, which have a hash command that must - # be called to get it to forget past commands. Without forgetting - # past commands the $PATH changes we made may not be respected - if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r 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=/var/www/flipnum/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/venv/bin/activate.csh b/venv/bin/activate.csh deleted file mode 100644 index dc1f411..0000000 --- a/venv/bin/activate.csh +++ /dev/null @@ -1,26 +0,0 @@ -# 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 /var/www/flipnum/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/venv/bin/activate.fish b/venv/bin/activate.fish deleted file mode 100644 index 91b54b9..0000000 --- a/venv/bin/activate.fish +++ /dev/null @@ -1,69 +0,0 @@ -# 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 /var/www/flipnum/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/venv/bin/fastapi b/venv/bin/fastapi deleted file mode 100755 index c7bf100..0000000 --- a/venv/bin/fastapi +++ /dev/null @@ -1,8 +0,0 @@ -#!/var/www/flipnum/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from fastapi.cli import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/pip b/venv/bin/pip deleted file mode 100755 index 606ad46..0000000 --- a/venv/bin/pip +++ /dev/null @@ -1,8 +0,0 @@ -#!/var/www/flipnum/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/venv/bin/pip3 b/venv/bin/pip3 deleted file mode 100755 index 606ad46..0000000 --- a/venv/bin/pip3 +++ /dev/null @@ -1,8 +0,0 @@ -#!/var/www/flipnum/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/venv/bin/pip3.11 b/venv/bin/pip3.11 deleted file mode 100755 index 606ad46..0000000 --- a/venv/bin/pip3.11 +++ /dev/null @@ -1,8 +0,0 @@ -#!/var/www/flipnum/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/venv/bin/python b/venv/bin/python deleted file mode 120000 index b8a0adb..0000000 --- a/venv/bin/python +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/venv/bin/python3 b/venv/bin/python3 deleted file mode 120000 index ae65fda..0000000 --- a/venv/bin/python3 +++ /dev/null @@ -1 +0,0 @@ -/usr/bin/python3 \ No newline at end of file diff --git a/venv/bin/python3.11 b/venv/bin/python3.11 deleted file mode 120000 index b8a0adb..0000000 --- a/venv/bin/python3.11 +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/venv/bin/uvicorn b/venv/bin/uvicorn deleted file mode 100755 index a44748d..0000000 --- a/venv/bin/uvicorn +++ /dev/null @@ -1,8 +0,0 @@ -#!/var/www/flipnum/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from uvicorn.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/INSTALLER b/venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/LICENSE.txt b/venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/LICENSE.txt deleted file mode 100644 index 9d227a0..0000000 --- a/venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/LICENSE.txt +++ /dev/null @@ -1,28 +0,0 @@ -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/venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/METADATA b/venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/METADATA deleted file mode 100644 index 82261f2..0000000 --- a/venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/METADATA +++ /dev/null @@ -1,92 +0,0 @@ -Metadata-Version: 2.1 -Name: MarkupSafe -Version: 3.0.2 -Summary: Safely add untrusted strings to HTML/XML markup. -Maintainer-email: Pallets -License: 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. - -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, https://github.com/pallets/markupsafe/ -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 -Classifier: Typing :: Typed -Requires-Python: >=3.9 -Description-Content-Type: text/markdown -License-File: LICENSE.txt - -# 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. - - -## Examples - -```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 diff --git a/venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/RECORD b/venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/RECORD deleted file mode 100644 index b474513..0000000 --- a/venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/RECORD +++ /dev/null @@ -1,14 +0,0 @@ -MarkupSafe-3.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -MarkupSafe-3.0.2.dist-info/LICENSE.txt,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 -MarkupSafe-3.0.2.dist-info/METADATA,sha256=aAwbZhSmXdfFuMM-rEHpeiHRkBOGESyVLJIuwzHP-nw,3975 -MarkupSafe-3.0.2.dist-info/RECORD,, -MarkupSafe-3.0.2.dist-info/WHEEL,sha256=OhaudQk1f3YCu0uQO5v6u-i01XPoX70c0R3T_XY-jOo,151 -MarkupSafe-3.0.2.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 -markupsafe/__init__.py,sha256=sr-U6_27DfaSrj5jnHYxWN-pvhM27sjlDplMDPZKm7k,13214 -markupsafe/__pycache__/__init__.cpython-311.pyc,, -markupsafe/__pycache__/_native.cpython-311.pyc,, -markupsafe/_native.py,sha256=hSLs8Jmz5aqayuengJJ3kdT5PwNpBWpKrmQSdipndC8,210 -markupsafe/_speedups.c,sha256=O7XulmTo-epI6n2FtMVOrJXl8EAaIwD2iNYmBI5SEoQ,4149 -markupsafe/_speedups.cpython-311-x86_64-linux-gnu.so,sha256=6IDH6Z1ajjClhfGerTB8WLb81uXUpLD8e-e1WzCirVY,43456 -markupsafe/_speedups.pyi,sha256=ENd1bYe7gbBUf2ywyYWOGUpnXOHNJ-cgTNqetlW8h5k,41 -markupsafe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/WHEEL b/venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/WHEEL deleted file mode 100644 index 35db8b0..0000000 --- a/venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (75.2.0) -Root-Is-Purelib: false -Tag: cp311-cp311-manylinux_2_17_x86_64 -Tag: cp311-cp311-manylinux2014_x86_64 - diff --git a/venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/top_level.txt b/venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/top_level.txt deleted file mode 100644 index 75bf729..0000000 --- a/venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -markupsafe diff --git a/venv/lib/python3.11/site-packages/__pycache__/typing_extensions.cpython-311.pyc b/venv/lib/python3.11/site-packages/__pycache__/typing_extensions.cpython-311.pyc deleted file mode 100644 index 5bc46611cd3324dc78358f904efb105b14fc7b93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188995 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�%N^f#!dNxD-KZctB;R%c`C(hfsC^L}IXtkv?v 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 Y>V!Z diff --git a/venv/lib/python3.11/site-packages/_distutils_hack/__init__.py b/venv/lib/python3.11/site-packages/_distutils_hack/__init__.py deleted file mode 100644 index f987a53..0000000 --- a/venv/lib/python3.11/site-packages/_distutils_hack/__init__.py +++ /dev/null @@ -1,222 +0,0 @@ -# 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/venv/lib/python3.11/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 75c371cfcfd253eabdb6b16ac27cc23c8cce78aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11152 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 DJWl{p diff --git a/venv/lib/python3.11/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc b/venv/lib/python3.11/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc deleted file mode 100644 index b8e054a035587d77fd75b3fcdab57eb4c7a2fd9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 309 zcmZ3^%ge<81ZEFkr|SUe#~=<2Fhd!i9e|AK3``8E3@HrD7#SE=12F_FfU{sCAbJ@P zuZ9aSGNdpDGiWm1;*U?sEG{W6$;>H^&qz$p_5+G>#m8sn7UUO|#K+&_PRWnYFH0>d z%1lXJ$?zFuz%M`jvcw|&^73;1w4BU>ywY6#vedjX{hZ7s{esGpjQl)fJwrqN;>?m% z-2$MIiRr1u`e@eZ!_3qxsQkrYlbfGXnv-f*!~rxO6|n&o0|2(|Pa^;T diff --git a/venv/lib/python3.11/site-packages/_distutils_hack/override.py b/venv/lib/python3.11/site-packages/_distutils_hack/override.py deleted file mode 100644 index 2cc433a..0000000 --- a/venv/lib/python3.11/site-packages/_distutils_hack/override.py +++ /dev/null @@ -1 +0,0 @@ -__import__('_distutils_hack').do_override() diff --git a/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/INSTALLER b/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/METADATA b/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/METADATA deleted file mode 100644 index 3ac05cf..0000000 --- a/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/METADATA +++ /dev/null @@ -1,295 +0,0 @@ -Metadata-Version: 2.3 -Name: annotated-types -Version: 0.7.0 -Summary: Reusable constraint types to use with typing.Annotated -Project-URL: Homepage, https://github.com/annotated-types/annotated-types -Project-URL: Source, https://github.com/annotated-types/annotated-types -Project-URL: Changelog, https://github.com/annotated-types/annotated-types/releases -Author-email: Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>, Samuel Colvin , Zac Hatfield-Dodds -License-File: LICENSE -Classifier: Development Status :: 4 - Beta -Classifier: Environment :: Console -Classifier: Environment :: MacOS X -Classifier: Intended Audience :: Developers -Classifier: Intended Audience :: Information Technology -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: POSIX :: Linux -Classifier: Operating System :: Unix -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Typing :: Typed -Requires-Python: >=3.8 -Requires-Dist: typing-extensions>=4.0.0; python_version < '3.9' -Description-Content-Type: text/markdown - -# annotated-types - -[![CI](https://github.com/annotated-types/annotated-types/workflows/CI/badge.svg?event=push)](https://github.com/annotated-types/annotated-types/actions?query=event%3Apush+branch%3Amain+workflow%3ACI) -[![pypi](https://img.shields.io/pypi/v/annotated-types.svg)](https://pypi.python.org/pypi/annotated-types) -[![versions](https://img.shields.io/pypi/pyversions/annotated-types.svg)](https://github.com/annotated-types/annotated-types) -[![license](https://img.shields.io/github/license/annotated-types/annotated-types.svg)](https://github.com/annotated-types/annotated-types/blob/main/LICENSE) - -[PEP-593](https://peps.python.org/pep-0593/) added `typing.Annotated` as a way of -adding context-specific metadata to existing types, and specifies that -`Annotated[T, x]` _should_ be treated as `T` by any tool or library without special -logic for `x`. - -This package provides metadata objects which can be used to represent common -constraints such as upper and lower bounds on scalar values and collection sizes, -a `Predicate` marker for runtime checks, and -descriptions of how we intend these metadata to be interpreted. In some cases, -we also note alternative representations which do not require this package. - -## Install - -```bash -pip install annotated-types -``` - -## Examples - -```python -from typing import Annotated -from annotated_types import Gt, Len, Predicate - -class MyClass: - age: Annotated[int, Gt(18)] # Valid: 19, 20, ... - # Invalid: 17, 18, "19", 19.0, ... - factors: list[Annotated[int, Predicate(is_prime)]] # Valid: 2, 3, 5, 7, 11, ... - # Invalid: 4, 8, -2, 5.0, "prime", ... - - my_list: Annotated[list[int], Len(0, 10)] # Valid: [], [10, 20, 30, 40, 50] - # Invalid: (1, 2), ["abc"], [0] * 20 -``` - -## Documentation - -_While `annotated-types` avoids runtime checks for performance, users should not -construct invalid combinations such as `MultipleOf("non-numeric")` or `Annotated[int, Len(3)]`. -Downstream implementors may choose to raise an error, emit a warning, silently ignore -a metadata item, etc., if the metadata objects described below are used with an -incompatible type - or for any other reason!_ - -### Gt, Ge, Lt, Le - -Express inclusive and/or exclusive bounds on orderable values - which may be numbers, -dates, times, strings, sets, etc. Note that the boundary value need not be of the -same type that was annotated, so long as they can be compared: `Annotated[int, Gt(1.5)]` -is fine, for example, and implies that the value is an integer x such that `x > 1.5`. - -We suggest that implementors may also interpret `functools.partial(operator.le, 1.5)` -as being equivalent to `Gt(1.5)`, for users who wish to avoid a runtime dependency on -the `annotated-types` package. - -To be explicit, these types have the following meanings: - -* `Gt(x)` - value must be "Greater Than" `x` - equivalent to exclusive minimum -* `Ge(x)` - value must be "Greater than or Equal" to `x` - equivalent to inclusive minimum -* `Lt(x)` - value must be "Less Than" `x` - equivalent to exclusive maximum -* `Le(x)` - value must be "Less than or Equal" to `x` - equivalent to inclusive maximum - -### Interval - -`Interval(gt, ge, lt, le)` allows you to specify an upper and lower bound with a single -metadata object. `None` attributes should be ignored, and non-`None` attributes -treated as per the single bounds above. - -### MultipleOf - -`MultipleOf(multiple_of=x)` might be interpreted in two ways: - -1. Python semantics, implying `value % multiple_of == 0`, or -2. [JSONschema semantics](https://json-schema.org/draft/2020-12/json-schema-validation.html#rfc.section.6.2.1), - where `int(value / multiple_of) == value / multiple_of`. - -We encourage users to be aware of these two common interpretations and their -distinct behaviours, especially since very large or non-integer numbers make -it easy to cause silent data corruption due to floating-point imprecision. - -We encourage libraries to carefully document which interpretation they implement. - -### MinLen, MaxLen, Len - -`Len()` implies that `min_length <= len(value) <= max_length` - lower and upper bounds are inclusive. - -As well as `Len()` which can optionally include upper and lower bounds, we also -provide `MinLen(x)` and `MaxLen(y)` which are equivalent to `Len(min_length=x)` -and `Len(max_length=y)` respectively. - -`Len`, `MinLen`, and `MaxLen` may be used with any type which supports `len(value)`. - -Examples of usage: - -* `Annotated[list, MaxLen(10)]` (or `Annotated[list, Len(max_length=10))`) - list must have a length of 10 or less -* `Annotated[str, MaxLen(10)]` - string must have a length of 10 or less -* `Annotated[list, MinLen(3))` (or `Annotated[list, Len(min_length=3))`) - list must have a length of 3 or more -* `Annotated[list, Len(4, 6)]` - list must have a length of 4, 5, or 6 -* `Annotated[list, Len(8, 8)]` - list must have a length of exactly 8 - -#### Changed in v0.4.0 - -* `min_inclusive` has been renamed to `min_length`, no change in meaning -* `max_exclusive` has been renamed to `max_length`, upper bound is now **inclusive** instead of **exclusive** -* The recommendation that slices are interpreted as `Len` has been removed due to ambiguity and different semantic - meaning of the upper bound in slices vs. `Len` - -See [issue #23](https://github.com/annotated-types/annotated-types/issues/23) for discussion. - -### Timezone - -`Timezone` can be used with a `datetime` or a `time` to express which timezones -are allowed. `Annotated[datetime, Timezone(None)]` must be a naive datetime. -`Timezone[...]` ([literal ellipsis](https://docs.python.org/3/library/constants.html#Ellipsis)) -expresses that any timezone-aware datetime is allowed. You may also pass a specific -timezone string or [`tzinfo`](https://docs.python.org/3/library/datetime.html#tzinfo-objects) -object such as `Timezone(timezone.utc)` or `Timezone("Africa/Abidjan")` to express that you only -allow a specific timezone, though we note that this is often a symptom of fragile design. - -#### Changed in v0.x.x - -* `Timezone` accepts [`tzinfo`](https://docs.python.org/3/library/datetime.html#tzinfo-objects) objects instead of - `timezone`, extending compatibility to [`zoneinfo`](https://docs.python.org/3/library/zoneinfo.html) and third party libraries. - -### Unit - -`Unit(unit: str)` expresses that the annotated numeric value is the magnitude of -a quantity with the specified unit. For example, `Annotated[float, Unit("m/s")]` -would be a float representing a velocity in meters per second. - -Please note that `annotated_types` itself makes no attempt to parse or validate -the unit string in any way. That is left entirely to downstream libraries, -such as [`pint`](https://pint.readthedocs.io) or -[`astropy.units`](https://docs.astropy.org/en/stable/units/). - -An example of how a library might use this metadata: - -```python -from annotated_types import Unit -from typing import Annotated, TypeVar, Callable, Any, get_origin, get_args - -# given a type annotated with a unit: -Meters = Annotated[float, Unit("m")] - - -# you can cast the annotation to a specific unit type with any -# callable that accepts a string and returns the desired type -T = TypeVar("T") -def cast_unit(tp: Any, unit_cls: Callable[[str], T]) -> T | None: - if get_origin(tp) is Annotated: - for arg in get_args(tp): - if isinstance(arg, Unit): - return unit_cls(arg.unit) - return None - - -# using `pint` -import pint -pint_unit = cast_unit(Meters, pint.Unit) - - -# using `astropy.units` -import astropy.units as u -astropy_unit = cast_unit(Meters, u.Unit) -``` - -### Predicate - -`Predicate(func: Callable)` expresses that `func(value)` is truthy for valid values. -Users should prefer the statically inspectable metadata above, but if you need -the full power and flexibility of arbitrary runtime predicates... here it is. - -For some common constraints, we provide generic types: - -* `IsLower = Annotated[T, Predicate(str.islower)]` -* `IsUpper = Annotated[T, Predicate(str.isupper)]` -* `IsDigit = Annotated[T, Predicate(str.isdigit)]` -* `IsFinite = Annotated[T, Predicate(math.isfinite)]` -* `IsNotFinite = Annotated[T, Predicate(Not(math.isfinite))]` -* `IsNan = Annotated[T, Predicate(math.isnan)]` -* `IsNotNan = Annotated[T, Predicate(Not(math.isnan))]` -* `IsInfinite = Annotated[T, Predicate(math.isinf)]` -* `IsNotInfinite = Annotated[T, Predicate(Not(math.isinf))]` - -so that you can write e.g. `x: IsFinite[float] = 2.0` instead of the longer -(but exactly equivalent) `x: Annotated[float, Predicate(math.isfinite)] = 2.0`. - -Some libraries might have special logic to handle known or understandable predicates, -for example by checking for `str.isdigit` and using its presence to both call custom -logic to enforce digit-only strings, and customise some generated external schema. -Users are therefore encouraged to avoid indirection like `lambda s: s.lower()`, in -favor of introspectable methods such as `str.lower` or `re.compile("pattern").search`. - -To enable basic negation of commonly used predicates like `math.isnan` without introducing introspection that makes it impossible for implementers to introspect the predicate we provide a `Not` wrapper that simply negates the predicate in an introspectable manner. Several of the predicates listed above are created in this manner. - -We do not specify what behaviour should be expected for predicates that raise -an exception. For example `Annotated[int, Predicate(str.isdigit)]` might silently -skip invalid constraints, or statically raise an error; or it might try calling it -and then propagate or discard the resulting -`TypeError: descriptor 'isdigit' for 'str' objects doesn't apply to a 'int' object` -exception. We encourage libraries to document the behaviour they choose. - -### Doc - -`doc()` can be used to add documentation information in `Annotated`, for function and method parameters, variables, class attributes, return types, and any place where `Annotated` can be used. - -It expects a value that can be statically analyzed, as the main use case is for static analysis, editors, documentation generators, and similar tools. - -It returns a `DocInfo` class with a single attribute `documentation` containing the value passed to `doc()`. - -This is the early adopter's alternative form of the [`typing-doc` proposal](https://github.com/tiangolo/fastapi/blob/typing-doc/typing_doc.md). - -### Integrating downstream types with `GroupedMetadata` - -Implementers may choose to provide a convenience wrapper that groups multiple pieces of metadata. -This can help reduce verbosity and cognitive overhead for users. -For example, an implementer like Pydantic might provide a `Field` or `Meta` type that accepts keyword arguments and transforms these into low-level metadata: - -```python -from dataclasses import dataclass -from typing import Iterator -from annotated_types import GroupedMetadata, Ge - -@dataclass -class Field(GroupedMetadata): - ge: int | None = None - description: str | None = None - - def __iter__(self) -> Iterator[object]: - # Iterating over a GroupedMetadata object should yield annotated-types - # constraint metadata objects which describe it as fully as possible, - # and may include other unknown objects too. - if self.ge is not None: - yield Ge(self.ge) - if self.description is not None: - yield Description(self.description) -``` - -Libraries consuming annotated-types constraints should check for `GroupedMetadata` and unpack it by iterating over the object and treating the results as if they had been "unpacked" in the `Annotated` type. The same logic should be applied to the [PEP 646 `Unpack` type](https://peps.python.org/pep-0646/), so that `Annotated[T, Field(...)]`, `Annotated[T, Unpack[Field(...)]]` and `Annotated[T, *Field(...)]` are all treated consistently. - -Libraries consuming annotated-types should also ignore any metadata they do not recongize that came from unpacking a `GroupedMetadata`, just like they ignore unrecognized metadata in `Annotated` itself. - -Our own `annotated_types.Interval` class is a `GroupedMetadata` which unpacks itself into `Gt`, `Lt`, etc., so this is not an abstract concern. Similarly, `annotated_types.Len` is a `GroupedMetadata` which unpacks itself into `MinLen` (optionally) and `MaxLen`. - -### Consuming metadata - -We intend to not be prescriptive as to _how_ the metadata and constraints are used, but as an example of how one might parse constraints from types annotations see our [implementation in `test_main.py`](https://github.com/annotated-types/annotated-types/blob/f59cf6d1b5255a0fe359b93896759a180bec30ae/tests/test_main.py#L94-L103). - -It is up to the implementer to determine how this metadata is used. -You could use the metadata for runtime type checking, for generating schemas or to generate example data, amongst other use cases. - -## Design & History - -This package was designed at the PyCon 2022 sprints by the maintainers of Pydantic -and Hypothesis, with the goal of making it as easy as possible for end-users to -provide more informative annotations for use by runtime libraries. - -It is deliberately minimal, and following PEP-593 allows considerable downstream -discretion in what (if anything!) they choose to support. Nonetheless, we expect -that staying simple and covering _only_ the most common use-cases will give users -and maintainers the best experience we can. If you'd like more constraints for your -types - follow our lead, by defining them and documenting them downstream! diff --git a/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/RECORD b/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/RECORD deleted file mode 100644 index cb983b0..0000000 --- a/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/RECORD +++ /dev/null @@ -1,10 +0,0 @@ -annotated_types-0.7.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -annotated_types-0.7.0.dist-info/METADATA,sha256=7ltqxksJJ0wCYFGBNIQCWTlWQGeAH0hRFdnK3CB895E,15046 -annotated_types-0.7.0.dist-info/RECORD,, -annotated_types-0.7.0.dist-info/WHEEL,sha256=zEMcRr9Kr03x1ozGwg5v9NQBKn3kndp6LSoSlVg-jhU,87 -annotated_types-0.7.0.dist-info/licenses/LICENSE,sha256=_hBJiEsaDZNCkB6I4H8ykl0ksxIdmXK2poBfuYJLCV0,1083 -annotated_types/__init__.py,sha256=RynLsRKUEGI0KimXydlD1fZEfEzWwDo0Uon3zOKhG1Q,13819 -annotated_types/__pycache__/__init__.cpython-311.pyc,, -annotated_types/__pycache__/test_cases.cpython-311.pyc,, -annotated_types/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -annotated_types/test_cases.py,sha256=zHFX6EpcMbGJ8FzBYDbO56bPwx_DYIVSKbZM-4B3_lg,6421 diff --git a/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/WHEEL b/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/WHEEL deleted file mode 100644 index 516596c..0000000 --- a/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: hatchling 1.24.2 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/licenses/LICENSE b/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/licenses/LICENSE deleted file mode 100644 index d99323a..0000000 --- a/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/licenses/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2022 the contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/annotated_types/__init__.py b/venv/lib/python3.11/site-packages/annotated_types/__init__.py deleted file mode 100644 index 74e0dee..0000000 --- a/venv/lib/python3.11/site-packages/annotated_types/__init__.py +++ /dev/null @@ -1,432 +0,0 @@ -import math -import sys -import types -from dataclasses import dataclass -from datetime import tzinfo -from typing import TYPE_CHECKING, Any, Callable, Iterator, Optional, SupportsFloat, SupportsIndex, TypeVar, Union - -if sys.version_info < (3, 8): - from typing_extensions import Protocol, runtime_checkable -else: - from typing import Protocol, runtime_checkable - -if sys.version_info < (3, 9): - from typing_extensions import Annotated, Literal -else: - from typing import Annotated, Literal - -if sys.version_info < (3, 10): - EllipsisType = type(Ellipsis) - KW_ONLY = {} - SLOTS = {} -else: - from types import EllipsisType - - KW_ONLY = {"kw_only": True} - SLOTS = {"slots": True} - - -__all__ = ( - 'BaseMetadata', - 'GroupedMetadata', - 'Gt', - 'Ge', - 'Lt', - 'Le', - 'Interval', - 'MultipleOf', - 'MinLen', - 'MaxLen', - 'Len', - 'Timezone', - 'Predicate', - 'LowerCase', - 'UpperCase', - 'IsDigits', - 'IsFinite', - 'IsNotFinite', - 'IsNan', - 'IsNotNan', - 'IsInfinite', - 'IsNotInfinite', - 'doc', - 'DocInfo', - '__version__', -) - -__version__ = '0.7.0' - - -T = TypeVar('T') - - -# arguments that start with __ are considered -# positional only -# see https://peps.python.org/pep-0484/#positional-only-arguments - - -class SupportsGt(Protocol): - def __gt__(self: T, __other: T) -> bool: - ... - - -class SupportsGe(Protocol): - def __ge__(self: T, __other: T) -> bool: - ... - - -class SupportsLt(Protocol): - def __lt__(self: T, __other: T) -> bool: - ... - - -class SupportsLe(Protocol): - def __le__(self: T, __other: T) -> bool: - ... - - -class SupportsMod(Protocol): - def __mod__(self: T, __other: T) -> T: - ... - - -class SupportsDiv(Protocol): - def __div__(self: T, __other: T) -> T: - ... - - -class BaseMetadata: - """Base class for all metadata. - - This exists mainly so that implementers - can do `isinstance(..., BaseMetadata)` while traversing field annotations. - """ - - __slots__ = () - - -@dataclass(frozen=True, **SLOTS) -class Gt(BaseMetadata): - """Gt(gt=x) implies that the value must be greater than x. - - It can be used with any type that supports the ``>`` operator, - including numbers, dates and times, strings, sets, and so on. - """ - - gt: SupportsGt - - -@dataclass(frozen=True, **SLOTS) -class Ge(BaseMetadata): - """Ge(ge=x) implies that the value must be greater than or equal to x. - - It can be used with any type that supports the ``>=`` operator, - including numbers, dates and times, strings, sets, and so on. - """ - - ge: SupportsGe - - -@dataclass(frozen=True, **SLOTS) -class Lt(BaseMetadata): - """Lt(lt=x) implies that the value must be less than x. - - It can be used with any type that supports the ``<`` operator, - including numbers, dates and times, strings, sets, and so on. - """ - - lt: SupportsLt - - -@dataclass(frozen=True, **SLOTS) -class Le(BaseMetadata): - """Le(le=x) implies that the value must be less than or equal to x. - - It can be used with any type that supports the ``<=`` operator, - including numbers, dates and times, strings, sets, and so on. - """ - - le: SupportsLe - - -@runtime_checkable -class GroupedMetadata(Protocol): - """A grouping of multiple objects, like typing.Unpack. - - `GroupedMetadata` on its own is not metadata and has no meaning. - All of the constraints and metadata should be fully expressable - in terms of the `BaseMetadata`'s returned by `GroupedMetadata.__iter__()`. - - Concrete implementations should override `GroupedMetadata.__iter__()` - to add their own metadata. - For example: - - >>> @dataclass - >>> class Field(GroupedMetadata): - >>> gt: float | None = None - >>> description: str | None = None - ... - >>> def __iter__(self) -> Iterable[object]: - >>> if self.gt is not None: - >>> yield Gt(self.gt) - >>> if self.description is not None: - >>> yield Description(self.gt) - - Also see the implementation of `Interval` below for an example. - - Parsers should recognize this and unpack it so that it can be used - both with and without unpacking: - - - `Annotated[int, Field(...)]` (parser must unpack Field) - - `Annotated[int, *Field(...)]` (PEP-646) - """ # noqa: trailing-whitespace - - @property - def __is_annotated_types_grouped_metadata__(self) -> Literal[True]: - return True - - def __iter__(self) -> Iterator[object]: - ... - - if not TYPE_CHECKING: - __slots__ = () # allow subclasses to use slots - - def __init_subclass__(cls, *args: Any, **kwargs: Any) -> None: - # Basic ABC like functionality without the complexity of an ABC - super().__init_subclass__(*args, **kwargs) - if cls.__iter__ is GroupedMetadata.__iter__: - raise TypeError("Can't subclass GroupedMetadata without implementing __iter__") - - def __iter__(self) -> Iterator[object]: # noqa: F811 - raise NotImplementedError # more helpful than "None has no attribute..." type errors - - -@dataclass(frozen=True, **KW_ONLY, **SLOTS) -class Interval(GroupedMetadata): - """Interval can express inclusive or exclusive bounds with a single object. - - It accepts keyword arguments ``gt``, ``ge``, ``lt``, and/or ``le``, which - are interpreted the same way as the single-bound constraints. - """ - - gt: Union[SupportsGt, None] = None - ge: Union[SupportsGe, None] = None - lt: Union[SupportsLt, None] = None - le: Union[SupportsLe, None] = None - - def __iter__(self) -> Iterator[BaseMetadata]: - """Unpack an Interval into zero or more single-bounds.""" - if self.gt is not None: - yield Gt(self.gt) - if self.ge is not None: - yield Ge(self.ge) - if self.lt is not None: - yield Lt(self.lt) - if self.le is not None: - yield Le(self.le) - - -@dataclass(frozen=True, **SLOTS) -class MultipleOf(BaseMetadata): - """MultipleOf(multiple_of=x) might be interpreted in two ways: - - 1. Python semantics, implying ``value % multiple_of == 0``, or - 2. JSONschema semantics, where ``int(value / multiple_of) == value / multiple_of`` - - We encourage users to be aware of these two common interpretations, - and libraries to carefully document which they implement. - """ - - multiple_of: Union[SupportsDiv, SupportsMod] - - -@dataclass(frozen=True, **SLOTS) -class MinLen(BaseMetadata): - """ - MinLen() implies minimum inclusive length, - e.g. ``len(value) >= min_length``. - """ - - min_length: Annotated[int, Ge(0)] - - -@dataclass(frozen=True, **SLOTS) -class MaxLen(BaseMetadata): - """ - MaxLen() implies maximum inclusive length, - e.g. ``len(value) <= max_length``. - """ - - max_length: Annotated[int, Ge(0)] - - -@dataclass(frozen=True, **SLOTS) -class Len(GroupedMetadata): - """ - Len() implies that ``min_length <= len(value) <= max_length``. - - Upper bound may be omitted or ``None`` to indicate no upper length bound. - """ - - min_length: Annotated[int, Ge(0)] = 0 - max_length: Optional[Annotated[int, Ge(0)]] = None - - def __iter__(self) -> Iterator[BaseMetadata]: - """Unpack a Len into zone or more single-bounds.""" - if self.min_length > 0: - yield MinLen(self.min_length) - if self.max_length is not None: - yield MaxLen(self.max_length) - - -@dataclass(frozen=True, **SLOTS) -class Timezone(BaseMetadata): - """Timezone(tz=...) requires a datetime to be aware (or ``tz=None``, naive). - - ``Annotated[datetime, Timezone(None)]`` must be a naive datetime. - ``Timezone[...]`` (the ellipsis literal) expresses that the datetime must be - tz-aware but any timezone is allowed. - - You may also pass a specific timezone string or tzinfo object such as - ``Timezone(timezone.utc)`` or ``Timezone("Africa/Abidjan")`` to express that - you only allow a specific timezone, though we note that this is often - a symptom of poor design. - """ - - tz: Union[str, tzinfo, EllipsisType, None] - - -@dataclass(frozen=True, **SLOTS) -class Unit(BaseMetadata): - """Indicates that the value is a physical quantity with the specified unit. - - It is intended for usage with numeric types, where the value represents the - magnitude of the quantity. For example, ``distance: Annotated[float, Unit('m')]`` - or ``speed: Annotated[float, Unit('m/s')]``. - - Interpretation of the unit string is left to the discretion of the consumer. - It is suggested to follow conventions established by python libraries that work - with physical quantities, such as - - - ``pint`` : - - ``astropy.units``: - - For indicating a quantity with a certain dimensionality but without a specific unit - it is recommended to use square brackets, e.g. `Annotated[float, Unit('[time]')]`. - Note, however, ``annotated_types`` itself makes no use of the unit string. - """ - - unit: str - - -@dataclass(frozen=True, **SLOTS) -class Predicate(BaseMetadata): - """``Predicate(func: Callable)`` implies `func(value)` is truthy for valid values. - - Users should prefer statically inspectable metadata, but if you need the full - power and flexibility of arbitrary runtime predicates... here it is. - - We provide a few predefined predicates for common string constraints: - ``IsLower = Predicate(str.islower)``, ``IsUpper = Predicate(str.isupper)``, and - ``IsDigits = Predicate(str.isdigit)``. Users are encouraged to use methods which - can be given special handling, and avoid indirection like ``lambda s: s.lower()``. - - Some libraries might have special logic to handle certain predicates, e.g. by - checking for `str.isdigit` and using its presence to both call custom logic to - enforce digit-only strings, and customise some generated external schema. - - We do not specify what behaviour should be expected for predicates that raise - an exception. For example `Annotated[int, Predicate(str.isdigit)]` might silently - skip invalid constraints, or statically raise an error; or it might try calling it - and then propagate or discard the resulting exception. - """ - - func: Callable[[Any], bool] - - def __repr__(self) -> str: - if getattr(self.func, "__name__", "") == "": - return f"{self.__class__.__name__}({self.func!r})" - if isinstance(self.func, (types.MethodType, types.BuiltinMethodType)) and ( - namespace := getattr(self.func.__self__, "__name__", None) - ): - return f"{self.__class__.__name__}({namespace}.{self.func.__name__})" - if isinstance(self.func, type(str.isascii)): # method descriptor - return f"{self.__class__.__name__}({self.func.__qualname__})" - return f"{self.__class__.__name__}({self.func.__name__})" - - -@dataclass -class Not: - func: Callable[[Any], bool] - - def __call__(self, __v: Any) -> bool: - return not self.func(__v) - - -_StrType = TypeVar("_StrType", bound=str) - -LowerCase = Annotated[_StrType, Predicate(str.islower)] -""" -Return True if the string is a lowercase string, False otherwise. - -A string is lowercase if all cased characters in the string are lowercase and there is at least one cased character in the string. -""" # noqa: E501 -UpperCase = Annotated[_StrType, Predicate(str.isupper)] -""" -Return True if the string is an uppercase string, False otherwise. - -A string is uppercase if all cased characters in the string are uppercase and there is at least one cased character in the string. -""" # noqa: E501 -IsDigit = Annotated[_StrType, Predicate(str.isdigit)] -IsDigits = IsDigit # type: ignore # plural for backwards compatibility, see #63 -""" -Return True if the string is a digit string, False otherwise. - -A string is a digit string if all characters in the string are digits and there is at least one character in the string. -""" # noqa: E501 -IsAscii = Annotated[_StrType, Predicate(str.isascii)] -""" -Return True if all characters in the string are ASCII, False otherwise. - -ASCII characters have code points in the range U+0000-U+007F. Empty string is ASCII too. -""" - -_NumericType = TypeVar('_NumericType', bound=Union[SupportsFloat, SupportsIndex]) -IsFinite = Annotated[_NumericType, Predicate(math.isfinite)] -"""Return True if x is neither an infinity nor a NaN, and False otherwise.""" -IsNotFinite = Annotated[_NumericType, Predicate(Not(math.isfinite))] -"""Return True if x is one of infinity or NaN, and False otherwise""" -IsNan = Annotated[_NumericType, Predicate(math.isnan)] -"""Return True if x is a NaN (not a number), and False otherwise.""" -IsNotNan = Annotated[_NumericType, Predicate(Not(math.isnan))] -"""Return True if x is anything but NaN (not a number), and False otherwise.""" -IsInfinite = Annotated[_NumericType, Predicate(math.isinf)] -"""Return True if x is a positive or negative infinity, and False otherwise.""" -IsNotInfinite = Annotated[_NumericType, Predicate(Not(math.isinf))] -"""Return True if x is neither a positive or negative infinity, and False otherwise.""" - -try: - from typing_extensions import DocInfo, doc # type: ignore [attr-defined] -except ImportError: - - @dataclass(frozen=True, **SLOTS) - class DocInfo: # type: ignore [no-redef] - """ " - The return value of doc(), mainly to be used by tools that want to extract the - Annotated documentation at runtime. - """ - - documentation: str - """The documentation string passed to doc().""" - - def doc( - documentation: str, - ) -> DocInfo: - """ - Add documentation to a type annotation inside of Annotated. - - For example: - - >>> def hi(name: Annotated[int, doc("The name of the user")]) -> None: ... - """ - return DocInfo(documentation) diff --git a/venv/lib/python3.11/site-packages/annotated_types/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/annotated_types/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index b2173515b6becf1a83164891792ba9ee38bd937f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20554 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 diff --git a/venv/lib/python3.11/site-packages/annotated_types/__pycache__/test_cases.cpython-311.pyc b/venv/lib/python3.11/site-packages/annotated_types/__pycache__/test_cases.cpython-311.pyc deleted file mode 100644 index 925b79ec15977fd1af060dc24a6df311f3f27271..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15445 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 diff --git a/venv/lib/python3.11/site-packages/annotated_types/py.typed b/venv/lib/python3.11/site-packages/annotated_types/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/annotated_types/test_cases.py b/venv/lib/python3.11/site-packages/annotated_types/test_cases.py deleted file mode 100644 index d9164d6..0000000 --- a/venv/lib/python3.11/site-packages/annotated_types/test_cases.py +++ /dev/null @@ -1,151 +0,0 @@ -import math -import sys -from datetime import date, datetime, timedelta, timezone -from decimal import Decimal -from typing import Any, Dict, Iterable, Iterator, List, NamedTuple, Set, Tuple - -if sys.version_info < (3, 9): - from typing_extensions import Annotated -else: - from typing import Annotated - -import annotated_types as at - - -class Case(NamedTuple): - """ - A test case for `annotated_types`. - """ - - annotation: Any - valid_cases: Iterable[Any] - invalid_cases: Iterable[Any] - - -def cases() -> Iterable[Case]: - # Gt, Ge, Lt, Le - yield Case(Annotated[int, at.Gt(4)], (5, 6, 1000), (4, 0, -1)) - yield Case(Annotated[float, at.Gt(0.5)], (0.6, 0.7, 0.8, 0.9), (0.5, 0.0, -0.1)) - yield Case( - Annotated[datetime, at.Gt(datetime(2000, 1, 1))], - [datetime(2000, 1, 2), datetime(2000, 1, 3)], - [datetime(2000, 1, 1), datetime(1999, 12, 31)], - ) - yield Case( - Annotated[datetime, at.Gt(date(2000, 1, 1))], - [date(2000, 1, 2), date(2000, 1, 3)], - [date(2000, 1, 1), date(1999, 12, 31)], - ) - yield Case( - Annotated[datetime, at.Gt(Decimal('1.123'))], - [Decimal('1.1231'), Decimal('123')], - [Decimal('1.123'), Decimal('0')], - ) - - yield Case(Annotated[int, at.Ge(4)], (4, 5, 6, 1000, 4), (0, -1)) - yield Case(Annotated[float, at.Ge(0.5)], (0.5, 0.6, 0.7, 0.8, 0.9), (0.4, 0.0, -0.1)) - yield Case( - Annotated[datetime, at.Ge(datetime(2000, 1, 1))], - [datetime(2000, 1, 2), datetime(2000, 1, 3)], - [datetime(1998, 1, 1), datetime(1999, 12, 31)], - ) - - yield Case(Annotated[int, at.Lt(4)], (0, -1), (4, 5, 6, 1000, 4)) - yield Case(Annotated[float, at.Lt(0.5)], (0.4, 0.0, -0.1), (0.5, 0.6, 0.7, 0.8, 0.9)) - yield Case( - Annotated[datetime, at.Lt(datetime(2000, 1, 1))], - [datetime(1999, 12, 31), datetime(1999, 12, 31)], - [datetime(2000, 1, 2), datetime(2000, 1, 3)], - ) - - yield Case(Annotated[int, at.Le(4)], (4, 0, -1), (5, 6, 1000)) - yield Case(Annotated[float, at.Le(0.5)], (0.5, 0.0, -0.1), (0.6, 0.7, 0.8, 0.9)) - yield Case( - Annotated[datetime, at.Le(datetime(2000, 1, 1))], - [datetime(2000, 1, 1), datetime(1999, 12, 31)], - [datetime(2000, 1, 2), datetime(2000, 1, 3)], - ) - - # Interval - yield Case(Annotated[int, at.Interval(gt=4)], (5, 6, 1000), (4, 0, -1)) - yield Case(Annotated[int, at.Interval(gt=4, lt=10)], (5, 6), (4, 10, 1000, 0, -1)) - yield Case(Annotated[float, at.Interval(ge=0.5, le=1)], (0.5, 0.9, 1), (0.49, 1.1)) - yield Case( - Annotated[datetime, at.Interval(gt=datetime(2000, 1, 1), le=datetime(2000, 1, 3))], - [datetime(2000, 1, 2), datetime(2000, 1, 3)], - [datetime(2000, 1, 1), datetime(2000, 1, 4)], - ) - - yield Case(Annotated[int, at.MultipleOf(multiple_of=3)], (0, 3, 9), (1, 2, 4)) - yield Case(Annotated[float, at.MultipleOf(multiple_of=0.5)], (0, 0.5, 1, 1.5), (0.4, 1.1)) - - # lengths - - yield Case(Annotated[str, at.MinLen(3)], ('123', '1234', 'x' * 10), ('', '1', '12')) - yield Case(Annotated[str, at.Len(3)], ('123', '1234', 'x' * 10), ('', '1', '12')) - yield Case(Annotated[List[int], at.MinLen(3)], ([1, 2, 3], [1, 2, 3, 4], [1] * 10), ([], [1], [1, 2])) - yield Case(Annotated[List[int], at.Len(3)], ([1, 2, 3], [1, 2, 3, 4], [1] * 10), ([], [1], [1, 2])) - - yield Case(Annotated[str, at.MaxLen(4)], ('', '1234'), ('12345', 'x' * 10)) - yield Case(Annotated[str, at.Len(0, 4)], ('', '1234'), ('12345', 'x' * 10)) - yield Case(Annotated[List[str], at.MaxLen(4)], ([], ['a', 'bcdef'], ['a', 'b', 'c']), (['a'] * 5, ['b'] * 10)) - yield Case(Annotated[List[str], at.Len(0, 4)], ([], ['a', 'bcdef'], ['a', 'b', 'c']), (['a'] * 5, ['b'] * 10)) - - yield Case(Annotated[str, at.Len(3, 5)], ('123', '12345'), ('', '1', '12', '123456', 'x' * 10)) - yield Case(Annotated[str, at.Len(3, 3)], ('123',), ('12', '1234')) - - yield Case(Annotated[Dict[int, int], at.Len(2, 3)], [{1: 1, 2: 2}], [{}, {1: 1}, {1: 1, 2: 2, 3: 3, 4: 4}]) - yield Case(Annotated[Set[int], at.Len(2, 3)], ({1, 2}, {1, 2, 3}), (set(), {1}, {1, 2, 3, 4})) - yield Case(Annotated[Tuple[int, ...], at.Len(2, 3)], ((1, 2), (1, 2, 3)), ((), (1,), (1, 2, 3, 4))) - - # Timezone - - yield Case( - Annotated[datetime, at.Timezone(None)], [datetime(2000, 1, 1)], [datetime(2000, 1, 1, tzinfo=timezone.utc)] - ) - yield Case( - Annotated[datetime, at.Timezone(...)], [datetime(2000, 1, 1, tzinfo=timezone.utc)], [datetime(2000, 1, 1)] - ) - yield Case( - Annotated[datetime, at.Timezone(timezone.utc)], - [datetime(2000, 1, 1, tzinfo=timezone.utc)], - [datetime(2000, 1, 1), datetime(2000, 1, 1, tzinfo=timezone(timedelta(hours=6)))], - ) - yield Case( - Annotated[datetime, at.Timezone('Europe/London')], - [datetime(2000, 1, 1, tzinfo=timezone(timedelta(0), name='Europe/London'))], - [datetime(2000, 1, 1), datetime(2000, 1, 1, tzinfo=timezone(timedelta(hours=6)))], - ) - - # Quantity - - yield Case(Annotated[float, at.Unit(unit='m')], (5, 4.2), ('5m', '4.2m')) - - # predicate types - - yield Case(at.LowerCase[str], ['abc', 'foobar'], ['', 'A', 'Boom']) - yield Case(at.UpperCase[str], ['ABC', 'DEFO'], ['', 'a', 'abc', 'AbC']) - yield Case(at.IsDigit[str], ['123'], ['', 'ab', 'a1b2']) - yield Case(at.IsAscii[str], ['123', 'foo bar'], ['£100', '😊', 'whatever 👀']) - - yield Case(Annotated[int, at.Predicate(lambda x: x % 2 == 0)], [0, 2, 4], [1, 3, 5]) - - yield Case(at.IsFinite[float], [1.23], [math.nan, math.inf, -math.inf]) - yield Case(at.IsNotFinite[float], [math.nan, math.inf], [1.23]) - yield Case(at.IsNan[float], [math.nan], [1.23, math.inf]) - yield Case(at.IsNotNan[float], [1.23, math.inf], [math.nan]) - yield Case(at.IsInfinite[float], [math.inf], [math.nan, 1.23]) - yield Case(at.IsNotInfinite[float], [math.nan, 1.23], [math.inf]) - - # check stacked predicates - yield Case(at.IsInfinite[Annotated[float, at.Predicate(lambda x: x > 0)]], [math.inf], [-math.inf, 1.23, math.nan]) - - # doc - yield Case(Annotated[int, at.doc("A number")], [1, 2], []) - - # custom GroupedMetadata - class MyCustomGroupedMetadata(at.GroupedMetadata): - def __iter__(self) -> Iterator[at.Predicate]: - yield at.Predicate(lambda x: float(x).is_integer()) - - yield Case(Annotated[float, MyCustomGroupedMetadata()], [0, 2.0], [0.01, 1.5]) diff --git a/venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/INSTALLER b/venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/LICENSE b/venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/LICENSE deleted file mode 100644 index 104eebf..0000000 --- a/venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 Alex Grönholm - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/METADATA b/venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/METADATA deleted file mode 100644 index 9d87e1d..0000000 --- a/venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/METADATA +++ /dev/null @@ -1,105 +0,0 @@ -Metadata-Version: 2.2 -Name: anyio -Version: 4.9.0 -Summary: High level compatibility layer for multiple asynchronous event loop implementations -Author-email: Alex Grönholm -License: MIT -Project-URL: Documentation, https://anyio.readthedocs.io/en/latest/ -Project-URL: Changelog, https://anyio.readthedocs.io/en/stable/versionhistory.html -Project-URL: Source code, https://github.com/agronholm/anyio -Project-URL: Issue tracker, https://github.com/agronholm/anyio/issues -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Framework :: AnyIO -Classifier: Typing :: Typed -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Requires-Python: >=3.9 -Description-Content-Type: text/x-rst -License-File: LICENSE -Requires-Dist: exceptiongroup>=1.0.2; python_version < "3.11" -Requires-Dist: idna>=2.8 -Requires-Dist: sniffio>=1.1 -Requires-Dist: typing_extensions>=4.5; python_version < "3.13" -Provides-Extra: trio -Requires-Dist: trio>=0.26.1; extra == "trio" -Provides-Extra: test -Requires-Dist: anyio[trio]; extra == "test" -Requires-Dist: blockbuster>=1.5.23; extra == "test" -Requires-Dist: coverage[toml]>=7; extra == "test" -Requires-Dist: exceptiongroup>=1.2.0; extra == "test" -Requires-Dist: hypothesis>=4.0; extra == "test" -Requires-Dist: psutil>=5.9; extra == "test" -Requires-Dist: pytest>=7.0; extra == "test" -Requires-Dist: trustme; extra == "test" -Requires-Dist: truststore>=0.9.1; python_version >= "3.10" and extra == "test" -Requires-Dist: uvloop>=0.21; (platform_python_implementation == "CPython" and platform_system != "Windows" and python_version < "3.14") and extra == "test" -Provides-Extra: doc -Requires-Dist: packaging; extra == "doc" -Requires-Dist: Sphinx~=8.2; extra == "doc" -Requires-Dist: sphinx_rtd_theme; extra == "doc" -Requires-Dist: sphinx-autodoc-typehints>=1.2.0; extra == "doc" - -.. image:: https://github.com/agronholm/anyio/actions/workflows/test.yml/badge.svg - :target: https://github.com/agronholm/anyio/actions/workflows/test.yml - :alt: Build Status -.. image:: https://coveralls.io/repos/github/agronholm/anyio/badge.svg?branch=master - :target: https://coveralls.io/github/agronholm/anyio?branch=master - :alt: Code Coverage -.. image:: https://readthedocs.org/projects/anyio/badge/?version=latest - :target: https://anyio.readthedocs.io/en/latest/?badge=latest - :alt: Documentation -.. image:: https://badges.gitter.im/gitterHQ/gitter.svg - :target: https://gitter.im/python-trio/AnyIO - :alt: Gitter chat - -AnyIO is an asynchronous networking and concurrency library that works on top of either asyncio_ or -trio_. It implements trio-like `structured concurrency`_ (SC) on top of asyncio and works in harmony -with the native SC of trio itself. - -Applications and libraries written against AnyIO's API will run unmodified on either asyncio_ or -trio_. AnyIO can also be adopted into a library or application incrementally – bit by bit, no full -refactoring necessary. It will blend in with the native libraries of your chosen backend. - -Documentation -------------- - -View full documentation at: https://anyio.readthedocs.io/ - -Features --------- - -AnyIO offers the following functionality: - -* Task groups (nurseries_ in trio terminology) -* High-level networking (TCP, UDP and UNIX sockets) - - * `Happy eyeballs`_ algorithm for TCP connections (more robust than that of asyncio on Python - 3.8) - * async/await style UDP sockets (unlike asyncio where you still have to use Transports and - Protocols) - -* A versatile API for byte streams and object streams -* Inter-task synchronization and communication (locks, conditions, events, semaphores, object - streams) -* Worker threads -* Subprocesses -* Asynchronous file I/O (using worker threads) -* Signal handling - -AnyIO also comes with its own pytest_ plugin which also supports asynchronous fixtures. -It even works with the popular Hypothesis_ library. - -.. _asyncio: https://docs.python.org/3/library/asyncio.html -.. _trio: https://github.com/python-trio/trio -.. _structured concurrency: https://en.wikipedia.org/wiki/Structured_concurrency -.. _nurseries: https://trio.readthedocs.io/en/stable/reference-core.html#nurseries-and-spawning -.. _Happy eyeballs: https://en.wikipedia.org/wiki/Happy_Eyeballs -.. _pytest: https://docs.pytest.org/en/latest/ -.. _Hypothesis: https://hypothesis.works/ diff --git a/venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/RECORD b/venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/RECORD deleted file mode 100644 index 1e5fa9f..0000000 --- a/venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/RECORD +++ /dev/null @@ -1,88 +0,0 @@ -anyio-4.9.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -anyio-4.9.0.dist-info/LICENSE,sha256=U2GsncWPLvX9LpsJxoKXwX8ElQkJu8gCO9uC6s8iwrA,1081 -anyio-4.9.0.dist-info/METADATA,sha256=vvkWPXXTbrpTCFK7zdcYwQcSQhx6Q4qITM9t_PEQCrY,4682 -anyio-4.9.0.dist-info/RECORD,, -anyio-4.9.0.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91 -anyio-4.9.0.dist-info/entry_points.txt,sha256=_d6Yu6uiaZmNe0CydowirE9Cmg7zUL2g08tQpoS3Qvc,39 -anyio-4.9.0.dist-info/top_level.txt,sha256=QglSMiWX8_5dpoVAEIHdEYzvqFMdSYWmCj6tYw2ITkQ,6 -anyio/__init__.py,sha256=t8bZuNXa5ncwXBaNKbv48BDgZt48RT_zCEtrnPmjNU8,4993 -anyio/__pycache__/__init__.cpython-311.pyc,, -anyio/__pycache__/from_thread.cpython-311.pyc,, -anyio/__pycache__/lowlevel.cpython-311.pyc,, -anyio/__pycache__/pytest_plugin.cpython-311.pyc,, -anyio/__pycache__/to_interpreter.cpython-311.pyc,, -anyio/__pycache__/to_process.cpython-311.pyc,, -anyio/__pycache__/to_thread.cpython-311.pyc,, -anyio/_backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -anyio/_backends/__pycache__/__init__.cpython-311.pyc,, -anyio/_backends/__pycache__/_asyncio.cpython-311.pyc,, -anyio/_backends/__pycache__/_trio.cpython-311.pyc,, -anyio/_backends/_asyncio.py,sha256=AT1oaTfCE-9YFxooMlvld2yDqY5U2A-ANMcBDh9eRfI,93455 -anyio/_backends/_trio.py,sha256=HVfDqRGQ7Xj3JfTcYdgzmC7pZEplqU4NOO5kxNNSZnk,40429 -anyio/_core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -anyio/_core/__pycache__/__init__.cpython-311.pyc,, -anyio/_core/__pycache__/_asyncio_selector_thread.cpython-311.pyc,, -anyio/_core/__pycache__/_eventloop.cpython-311.pyc,, -anyio/_core/__pycache__/_exceptions.cpython-311.pyc,, -anyio/_core/__pycache__/_fileio.cpython-311.pyc,, -anyio/_core/__pycache__/_resources.cpython-311.pyc,, -anyio/_core/__pycache__/_signals.cpython-311.pyc,, -anyio/_core/__pycache__/_sockets.cpython-311.pyc,, -anyio/_core/__pycache__/_streams.cpython-311.pyc,, -anyio/_core/__pycache__/_subprocesses.cpython-311.pyc,, -anyio/_core/__pycache__/_synchronization.cpython-311.pyc,, -anyio/_core/__pycache__/_tasks.cpython-311.pyc,, -anyio/_core/__pycache__/_tempfile.cpython-311.pyc,, -anyio/_core/__pycache__/_testing.cpython-311.pyc,, -anyio/_core/__pycache__/_typedattr.cpython-311.pyc,, -anyio/_core/_asyncio_selector_thread.py,sha256=2PdxFM3cs02Kp6BSppbvmRT7q7asreTW5FgBxEsflBo,5626 -anyio/_core/_eventloop.py,sha256=t_tAwBFPjF8jrZGjlJ6bbYy6KA3bjsbZxV9mvh9t1i0,4695 -anyio/_core/_exceptions.py,sha256=RlPRlwastdmfDPoskdXNO6SI8_l3fclA2wtW6cokU9I,3503 -anyio/_core/_fileio.py,sha256=qFZhkLIz0cGXluvih_vcPUTucgq8UFVgsTCtYbijZIg,23340 -anyio/_core/_resources.py,sha256=NbmU5O5UX3xEyACnkmYX28Fmwdl-f-ny0tHym26e0w0,435 -anyio/_core/_signals.py,sha256=vulT1M1xdLYtAR-eY5TamIgaf1WTlOwOrMGwswlTTr8,905 -anyio/_core/_sockets.py,sha256=5Okc_UThGDEN9KCnsIhqWPRHBNuSy6b4NmG1i51TVF4,27150 -anyio/_core/_streams.py,sha256=OnaKgoDD-FcMSwLvkoAUGP51sG2ZdRvMpxt9q2w1gYA,1804 -anyio/_core/_subprocesses.py,sha256=EXm5igL7dj55iYkPlbYVAqtbqxJxjU-6OndSTIx9SRg,8047 -anyio/_core/_synchronization.py,sha256=DwUh8Tl6cG_UMVC_GyzPoC_U9BpfDfjMl9SINSxcZN4,20320 -anyio/_core/_tasks.py,sha256=f3CuWwo06cCZ6jaOv-JHFKWkgpgf2cvaF25Oh4augMA,4757 -anyio/_core/_tempfile.py,sha256=s-_ucacXbxBH5Bo5eo65lN0lPwZQd5B8yNN_9nARpCM,19696 -anyio/_core/_testing.py,sha256=YUGwA5cgFFbUTv4WFd7cv_BSVr4ryTtPp8owQA3JdWE,2118 -anyio/_core/_typedattr.py,sha256=P4ozZikn3-DbpoYcvyghS_FOYAgbmUxeoU8-L_07pZM,2508 -anyio/abc/__init__.py,sha256=c2OQbTCS_fQowviMXanLPh8m29ccwkXmpDr7uyNZYOo,2652 -anyio/abc/__pycache__/__init__.cpython-311.pyc,, -anyio/abc/__pycache__/_eventloop.cpython-311.pyc,, -anyio/abc/__pycache__/_resources.cpython-311.pyc,, -anyio/abc/__pycache__/_sockets.cpython-311.pyc,, -anyio/abc/__pycache__/_streams.cpython-311.pyc,, -anyio/abc/__pycache__/_subprocesses.cpython-311.pyc,, -anyio/abc/__pycache__/_tasks.cpython-311.pyc,, -anyio/abc/__pycache__/_testing.cpython-311.pyc,, -anyio/abc/_eventloop.py,sha256=UmL8DZCvQTgxzmyBZcGm9kWj9VQY8BMWueLh5S8yWN4,9682 -anyio/abc/_resources.py,sha256=DrYvkNN1hH6Uvv5_5uKySvDsnknGVDe8FCKfko0VtN8,783 -anyio/abc/_sockets.py,sha256=KhWtJxan8jpBXKwPaFeQzI4iRXdFaOIn0HXtDZnaO7U,6262 -anyio/abc/_streams.py,sha256=He_JpkAW2g5veOzcUq0XsRC2nId_i35L-d8cs7Uj1ZQ,6598 -anyio/abc/_subprocesses.py,sha256=cumAPJTktOQtw63IqG0lDpyZqu_l1EElvQHMiwJgL08,2067 -anyio/abc/_tasks.py,sha256=yJWbMwowvqjlAX4oJ3l9Is1w-zwynr2lX1Z02AWJqsY,3080 -anyio/abc/_testing.py,sha256=tBJUzkSfOXJw23fe8qSJ03kJlShOYjjaEyFB6k6MYT8,1821 -anyio/from_thread.py,sha256=MbXHZpgM9wgsRkbGhMNMomEGYj7Y_QYq6a5BZ3c5Ev8,17478 -anyio/lowlevel.py,sha256=nkgmW--SdxGVp0cmLUYazjkigveRm5HY7-gW8Bpp9oY,4169 -anyio/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -anyio/pytest_plugin.py,sha256=qXNwk9Pa7hPQKWocgLl9qijqKGMkGzdH2wJa-jPkGUM,9375 -anyio/streams/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -anyio/streams/__pycache__/__init__.cpython-311.pyc,, -anyio/streams/__pycache__/buffered.cpython-311.pyc,, -anyio/streams/__pycache__/file.cpython-311.pyc,, -anyio/streams/__pycache__/memory.cpython-311.pyc,, -anyio/streams/__pycache__/stapled.cpython-311.pyc,, -anyio/streams/__pycache__/text.cpython-311.pyc,, -anyio/streams/__pycache__/tls.cpython-311.pyc,, -anyio/streams/buffered.py,sha256=UCldKC168YuLvT7n3HtNPnQ2iWAMSTYQWbZvzLwMwkM,4500 -anyio/streams/file.py,sha256=6uoTNb5KbMoj-6gS3_xrrL8uZN8Q4iIvOS1WtGyFfKw,4383 -anyio/streams/memory.py,sha256=o1OVVx0OooteTTe2GytJreum93Ucuw5s4cAsr3X0-Ag,10560 -anyio/streams/stapled.py,sha256=U09pCrmOw9kkNhe6tKopsm1QIMT1lFTFvtb-A7SIe4k,4302 -anyio/streams/text.py,sha256=6x8w8xlfCZKTUWQoJiMPoMhSSJFUBRKgoBNSBtbd9yg,5094 -anyio/streams/tls.py,sha256=HxzpVmUgo8SUSIBass_lvef1pAI1uRSrnysM3iEGzl4,13199 -anyio/to_interpreter.py,sha256=UhuNCIucCRN7ZtyJg35Mlamzs1JpgDvK4xnL4TDWrAo,6527 -anyio/to_process.py,sha256=ZvruelRM-HNmqDaql4sdNODg2QD_uSlwSCxnV4OhsfQ,9595 -anyio/to_thread.py,sha256=WM2JQ2MbVsd5D5CM08bQiTwzZIvpsGjfH1Fy247KoDQ,2396 diff --git a/venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/WHEEL b/venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/WHEEL deleted file mode 100644 index 9c3ae63..0000000 --- a/venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (76.0.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/entry_points.txt b/venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/entry_points.txt deleted file mode 100644 index 44dd9bd..0000000 --- a/venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/entry_points.txt +++ /dev/null @@ -1,2 +0,0 @@ -[pytest11] -anyio = anyio.pytest_plugin diff --git a/venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/top_level.txt b/venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/top_level.txt deleted file mode 100644 index c77c069..0000000 --- a/venv/lib/python3.11/site-packages/anyio-4.9.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -anyio diff --git a/venv/lib/python3.11/site-packages/anyio/__init__.py b/venv/lib/python3.11/site-packages/anyio/__init__.py deleted file mode 100644 index 578cda6..0000000 --- a/venv/lib/python3.11/site-packages/anyio/__init__.py +++ /dev/null @@ -1,85 +0,0 @@ -from __future__ import annotations - -from ._core._eventloop import current_time as current_time -from ._core._eventloop import get_all_backends as get_all_backends -from ._core._eventloop import get_cancelled_exc_class as get_cancelled_exc_class -from ._core._eventloop import run as run -from ._core._eventloop import sleep as sleep -from ._core._eventloop import sleep_forever as sleep_forever -from ._core._eventloop import sleep_until as sleep_until -from ._core._exceptions import BrokenResourceError as BrokenResourceError -from ._core._exceptions import BrokenWorkerIntepreter as BrokenWorkerIntepreter -from ._core._exceptions import BrokenWorkerProcess as BrokenWorkerProcess -from ._core._exceptions import BusyResourceError as BusyResourceError -from ._core._exceptions import ClosedResourceError as ClosedResourceError -from ._core._exceptions import DelimiterNotFound as DelimiterNotFound -from ._core._exceptions import EndOfStream as EndOfStream -from ._core._exceptions import IncompleteRead as IncompleteRead -from ._core._exceptions import TypedAttributeLookupError as TypedAttributeLookupError -from ._core._exceptions import WouldBlock as WouldBlock -from ._core._fileio import AsyncFile as AsyncFile -from ._core._fileio import Path as Path -from ._core._fileio import open_file as open_file -from ._core._fileio import wrap_file as wrap_file -from ._core._resources import aclose_forcefully as aclose_forcefully -from ._core._signals import open_signal_receiver as open_signal_receiver -from ._core._sockets import connect_tcp as connect_tcp -from ._core._sockets import connect_unix as connect_unix -from ._core._sockets import create_connected_udp_socket as create_connected_udp_socket -from ._core._sockets import ( - create_connected_unix_datagram_socket as create_connected_unix_datagram_socket, -) -from ._core._sockets import create_tcp_listener as create_tcp_listener -from ._core._sockets import create_udp_socket as create_udp_socket -from ._core._sockets import create_unix_datagram_socket as create_unix_datagram_socket -from ._core._sockets import create_unix_listener as create_unix_listener -from ._core._sockets import getaddrinfo as getaddrinfo -from ._core._sockets import getnameinfo as getnameinfo -from ._core._sockets import wait_readable as wait_readable -from ._core._sockets import wait_socket_readable as wait_socket_readable -from ._core._sockets import wait_socket_writable as wait_socket_writable -from ._core._sockets import wait_writable as wait_writable -from ._core._streams import create_memory_object_stream as create_memory_object_stream -from ._core._subprocesses import open_process as open_process -from ._core._subprocesses import run_process as run_process -from ._core._synchronization import CapacityLimiter as CapacityLimiter -from ._core._synchronization import ( - CapacityLimiterStatistics as CapacityLimiterStatistics, -) -from ._core._synchronization import Condition as Condition -from ._core._synchronization import ConditionStatistics as ConditionStatistics -from ._core._synchronization import Event as Event -from ._core._synchronization import EventStatistics as EventStatistics -from ._core._synchronization import Lock as Lock -from ._core._synchronization import LockStatistics as LockStatistics -from ._core._synchronization import ResourceGuard as ResourceGuard -from ._core._synchronization import Semaphore as Semaphore -from ._core._synchronization import SemaphoreStatistics as SemaphoreStatistics -from ._core._tasks import TASK_STATUS_IGNORED as TASK_STATUS_IGNORED -from ._core._tasks import CancelScope as CancelScope -from ._core._tasks import create_task_group as create_task_group -from ._core._tasks import current_effective_deadline as current_effective_deadline -from ._core._tasks import fail_after as fail_after -from ._core._tasks import move_on_after as move_on_after -from ._core._tempfile import NamedTemporaryFile as NamedTemporaryFile -from ._core._tempfile import SpooledTemporaryFile as SpooledTemporaryFile -from ._core._tempfile import TemporaryDirectory as TemporaryDirectory -from ._core._tempfile import TemporaryFile as TemporaryFile -from ._core._tempfile import gettempdir as gettempdir -from ._core._tempfile import gettempdirb as gettempdirb -from ._core._tempfile import mkdtemp as mkdtemp -from ._core._tempfile import mkstemp as mkstemp -from ._core._testing import TaskInfo as TaskInfo -from ._core._testing import get_current_task as get_current_task -from ._core._testing import get_running_tasks as get_running_tasks -from ._core._testing import wait_all_tasks_blocked as wait_all_tasks_blocked -from ._core._typedattr import TypedAttributeProvider as TypedAttributeProvider -from ._core._typedattr import TypedAttributeSet as TypedAttributeSet -from ._core._typedattr import typed_attribute as typed_attribute - -# Re-export imports so they look like they live directly in this package -for __value in list(locals().values()): - if getattr(__value, "__module__", "").startswith("anyio."): - __value.__module__ = __name__ - -del __value diff --git a/venv/lib/python3.11/site-packages/anyio/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index e58fa96aa8fdece873eb1e21c5e5fe529b7d1eff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4741 zcma);%TFBH6^C#0YF^E=jSU#T0pka43^rgeHg7N(JT$f^cQPpzRkxu+JzBS_!OY6p zd6C6r6lt=w6v@#G-+Rub|B^~I zGWbmX>p#1{>tyWTScpG$B}n|#QN!5x%w%T5W=?`963nbJtL-YMnpYFo0N3yu;#%NZ zUQ1jDT*vE(lfX%yB(4Xp=k>%5zzw{CxY2HOns^g&6L2$cCT<2!@f2|ixP`Y6w*a^D zR^nFRHr__u2HeiuiQ9oYcn5I@a3}91?gUQrG;!KK<#h2b;#0t<`Dx-V;4}OT@oC_0 z-c5YQ?s0l~FLAeh*6HJY#69*o=R7}8+zWhxUm!jUe34%y?gPHWFA<*uzRWKZp9j9e zuMl4V?&tl)7l8-(0P!W@K|V-)8Tcx{N_+))hz}9>17G9UhzEeL^XtTez&H2};;Z&e zXP6HY57`;#7QaP&4S0l)5MQ@%JEMG*_y+J8A0xgAe23p59tOV4?-FN#$N4z%E#L`0 zK|BIH$tQ_#1K;EKh)02^_!RLN@HC$$z5{%p-zUCn&o~eG1LASuhx{S&1n?}MC7uMH z<8#FKfam!<@f7d^Um%{g7o8=(M0_83nJ*L10I%>B;s?O1e3kei@FV_+couk#uMy7y zuk&@{dEm$VG4X=E;cW6v;zi&m{0Z?A@E80G;$`41zD2xZXPs@nO}q;Hls_eY1pJIY zORy>?p2OdlZy*K#7Uv^-{i|dA2-G%j63_$wN}mPx^$_PU(pQ3;Yv%f!YN&<3(&zQB zWBT~pe5{Tklj3W^wco^Tet+#NZf<1R(B_Zm8cGzKbl3F)J+M62{}JZ~U$aq=Qn-N@ zSdM^l+pY*S-L|zI-Pjkd>4Wby`V8GQgl!8`6E6(Suyr4+s%622uUg+0A`g%v&~ly> z2SS3QspKfQfn`Inb543N?3VDof;7aUlpeO~D!HF~a$m?*HxPL#0_tDxP^x(%JwwpE z?Q;eH=+jX;=WWjy=BMuV1z}r`1>SOd5rTowC8WvsM5#?g)P`3iuxNhn@bdG6qly>rq{zGX6<@Tik zK61p%bcEx{BhB0SEgqvE-*__}c>Xw|njn(355?AbJ+B*9aI{_u9awSqC$21}k{?(G zCPKr!=b9F#78E*<3rd^X#RJGRsBa}u>T1?YvDAX!N=+(`=jDPfF)|yn!qM}4kYYI1 zaY5hi|s*5U%RZkneo&Kj_JD8|ER8E4>1SSWo;Sh+Ga% z4B}8T;aY6V#V(CG-Lf@3SIW+m<3Y9O9y>ZV;7ZMH;p9E3%cF8mq_cU?gQw$Df5)+7 z!Gf3%;GSTL)UmhRy%9nsfFVtbUX%}|9cZ0&_D!rTAw(`={WffAwG?Ueq{W-UtwPgw z7({~`cP)2ULm%E@7lj-?e&o@1Fuw&Jd6)Vaz&mtcnWYR-YqFGftpUCrnjSwM#YRnY zJhNa6O)Ii*>U8(W@`g8tG_1%Kf`Wt!iSK=}4N_T(VGW*7H?Tb~FKfXq@i(4KqST`_ zpx`e;*#uH-k2}3EM4p~^*^HGblopg$ls1%hlnxa59m!-GjTxq{M>mZ7C+b`A~=ypN) z#iXVY6_bzy*sa*;2f7UWLo3)T)@vHR$`Fo^VTix7pFr8q3z-95W)2SzGdbJJy9Fl$ z;dzj;t({E%DA@Dd(czJij1T`~Z^Em&ukQ*!LqVR=G|PpDT^r6H{aim?N`e`=3xnbh z5dY5*-S4XtiA2OMg{u9)?uDvFY%WwSVoyTVB6c-YEn+u9)gm?>sur<{P_>AyhN?wu zGgR%QHj5!s?DN`8hD@=DJqT5c*waw8h>eG;MQkKgEnz%jBp?Arleg#`%d{^J|-ydq4UM{~}mI5B@{{d(t BxLp7M diff --git a/venv/lib/python3.11/site-packages/anyio/__pycache__/from_thread.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/__pycache__/from_thread.cpython-311.pyc deleted file mode 100644 index ebf83391fbd604e1186b711a1bcb45180410a45d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26159 zcmdUXdvIIVncuy5g8&JV04csiLVQV(_z?B9DEUFXWy^FD(T+o}Nr}j$O)o!_I>XmD6N1Jxrbh~XWdz0OEXFC9kDN#(-ai{Ifruz?EIa7^h zr_q#=>`wGd_AtM? zcyFR_vX8la@&3fd$&HCklbhIgeLR%dJh_><8{%6M1Cs-y5Vf2e)Vf1zJZ~qr>_)5o zsKwCaP-1v;SQL^j=CifrV-ce5Qs5m?5Z=Q-e_N=l=)gNx zgyCNe+s(rI5Y}H-izlLWENmmfHkrfTLE`tcEQHBDQLkH&c1Sy=;j8wtuu*B3G=kdh zl`JQO(C%MQs*qUlgp3Fo@IuMS>nah17nvBZfbV^1F z$Kjduj2uPW_Oa7SS`J6jW6Gsu1;@l$IU1G;>ys@>0RcY8;CcoaFmbST5KiVI^H~r7lM0cq%OYg2o@oYo?+Xkx@LAx`1*T zDCaP>W{Pr*CZ)nU@`{9$k!U;~m8PPvMy7aOy=hjPcq$T(E6B-yh%!QZJO^0p6Oq(~ zXrUp3DyO4U>9BHs>WrM4xqzr%)?xd32~>#*gr2}C%qSttF9;`o;i2kT3SPDP6Ehbu zB90f67m%pnnwa`ZG<`7~FW4rgBB=>v;f|y(hUHi|i8g*IrHsjEl!=0EdL|ipG@^~; zE3feMuV@iYo*W43B*A?TNvpd)t5&vIOHhCJ{i#`4{Ax1&nXDvgCD_hQ*aAu z{A$lRJ?3SL$zPvjm#xXp9wDs~HA>ej$RIgsx0Z(h0%x9rlI4nJR(RF=HDOkqw=A*g zUy99L^TND1Z++ito@PLO+gzq5h=+P57!F2K7?gA@84Xfr(L4xF%c%rHW>fO{s2t?O zJXFIHja~@L;RK61S~amT7Iori@Ip$7QMO@}CZCx}07;bKbc!;L27xWj*G(~1)8I>%X2eq0vi(IH1OQ+@7>6vu&kSwRN8qOrrKF*GbYvLFJUlx)J3JkaT}aL(hB3D;4##7shc8@8 zpG_sV4~>irqhF(gG$BB6l;LplQY; z=wj{t`i@-v=0*FW{o#F2Yf-S;10`_3t}X99@`=^rtNBy__}J$!+AZ!t(TZpfA3iMB z2;SBe&(N}G=uZ0X#0O0o&rsHLB>{Og}yS|O|z@-W74T;2+(P7Qe*-12q;I|%Fq zC)wA$%NM_6**U?jHQWp79K3J%@9i!x`IQ zc`u5L;9q~N+$BEvH8^exQDIV)gh|Vbptn)0WZ4H_$qJW^x$JN`n9Dh7lU(?6v#$=R z4s3;8S}!%=*CBOEe*8M6E~yQ_E~y_)7 zCn`@(Ge%?1uLhn@rQ*T);CLz-Jz4N#C61-lC~^m?TJUf$hGrq_`1ttT^J!W(UrB=n zcx8WBi5_}261_mQ_@tW8K+xo^``G#dy)c6&*fPD0JFVP}V@vPn+QLs>Yy+6+BToQcQmXR|1o?z+&>%8@Z(DMaT zMl7Nbv3w2a#`!JzITR4`uqh`Wgj+ri06uyu%xCSCyq|d};G5;BG80c1YE84OP)k8z zr1@Md*oe^w8Y2Um(o^ywD#0d?Q#N+S02Qo=PTVJDS4LO8C0-+vm1FYY1_WswmsXnGuO5=6DWTd4}k-yZOC~$ zSG=KRZ|F{6*1I+5-I`(V!(Y0E`t?P@;%+Q~ytkf3A6WJd+Πj^w-}8ShBm+W>yz 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 diff --git a/venv/lib/python3.11/site-packages/anyio/__pycache__/pytest_plugin.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/__pycache__/pytest_plugin.cpython-311.pyc deleted file mode 100644 index fb2e8464d7c397eb6bf6ef07a9d5a2e19c2e5d9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15170 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 X7!1q8|7Z-59}H%EJ4U`9RWtt$Gt03l diff --git a/venv/lib/python3.11/site-packages/anyio/__pycache__/to_interpreter.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/__pycache__/to_interpreter.cpython-311.pyc deleted file mode 100644 index 3fdd4d60c19d7d9dbad349c5e8a5a95067b2c642..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10009 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 Jcn)A(_TSrJR+<0+ diff --git a/venv/lib/python3.11/site-packages/anyio/__pycache__/to_process.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/__pycache__/to_process.cpython-311.pyc deleted file mode 100644 index 3f29de9275dc58cc46c4a4f3bcc0f617ad545e41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13657 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 diff --git a/venv/lib/python3.11/site-packages/anyio/__pycache__/to_thread.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/__pycache__/to_thread.cpython-311.pyc deleted file mode 100644 index 2bed8072fd1a057da64eaa68278b119de02509d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3180 zcmaJ@-ESLJ7QgcmXX0@_oB}0PNiS`-)VplF6$nJ2Eg!o`2n|C z?u=s$K?tYS#EYxKOP=5tf>nyFa57UhwQ28X-5~pI)^x%+7eFL$mYVw5P*w=3B#i!aH`gP&?u+ddIJt zwMRVtAEa_(AGcSu#AZT-F^m0BL>J-NdW{7EYXltl$<=O)zsn@BW`{|!k6PiOyv}2X zMP1=K4d!lg;lbqWYplgwKkmNeH~pB)ioS2a@_ifk=t(J)wc2h4JSqHBz~arsT6He* zc#8#z^-dVQBG;qU*DFR+W(_91P&hDLCR`pQc6wK)C6hs_BQe+7!aX>h+kE+QD)(|O z?8=p=X|Cc*Vlq&0Fn4&3oC6aRvk``YECYLBBTKjG#ZYiLk28-QaxQzB6eN$^Qn-0K z(BlI9zaT`r_Z2X25)A;ft$(_(t$(7$`8s&x>9G#C?DC8s%p0)#CQ4A3Mq&kw^yvoN zZl)~I?}n>}Q^0JKZF5`OHh!460RX<4ftZlb0KOj^?~?1r=O(1S!0y2IB83a%M&k`m z*ZnOnC+AKAG}Y@gY$myaq#fqRzF4Pgp`<>Dcf%&2Bio|nX5zT_bh=CF1pC15C`KyVBHP-Q z5vPrItRB<6P(W6j(=#BRi7u7QkGQAg@(*3EY^$Wg8l3v;B9uILXr;v@YpRf}fX{AL z6>4+#4$-tiTVVuFgn|Y1ew@%DjO#;yb@xob*%rphk8uUK ztjxd+LdG^Yl%Pi;ZDB`LsGnwHBaC1%1{s1s62*G`brwXKuGHnBusnC@j>bc zK*W_@VT()EGUx^yW({lrc;J>4AVaY!P(~w{D*{BUP>;7HcUg?!2z-ziu0cQ^=m7Ql zi)pIDEiR?+@uB>OF2*=CLV&T#BZr0*L4G(qMmYwuG-kbI1)`KTFq+L^tlNMoxT%>m zCD1G()6Ec~ftIGuMVJ%;DHq__m=c?0GXK{s^?rKi)Vcem)YxiCS<~kWYZw{RxBPUV5nUL`{a8_s^eXa0$NgZM;C~T$61!1zfvOU55QeQZ6b5ca zRY?gNWCZe{c;Fl=!IZ?$&7_ZZ}^~q9ieDuk&-uUQ~h2HqsBh}vc=o8u-AA3e&*EsTJ z=eDufGZy>ipL)MB_RQyc4;y>-{I%!5TuIZuWA*K$*IxRjc*{PuYoFS&1|@Q0sej^B b|MVXR_Gu03@VCe%&C*`h2ITjs3grI*Tvm&d diff --git a/venv/lib/python3.11/site-packages/anyio/_backends/__init__.py b/venv/lib/python3.11/site-packages/anyio/_backends/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/anyio/_backends/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_backends/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 81704d2155d81d28c7bb9f1b50ffad14796933fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187 zcmZ3^%ge<81eOn9r-SInAOZ#$p^VRLK*n^26oz01O-8?!3`I;p{%4TnFF*aV#3KFj z@^byOoXmo}(p>$r)VwnNoXjNsg36MN{5)elLqq-I%#u{yg2d$P#Prl+{lvV=%zXX$ zBp^REFQr&NK0Y%qvm`!Vub}c5hfQvNN@-52T@fqLc#s2%`GLd-W=2NF4-7D(h#4pb E0C8|Hd;kCd diff --git a/venv/lib/python3.11/site-packages/anyio/_backends/__pycache__/_asyncio.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_backends/__pycache__/_asyncio.cpython-311.pyc deleted file mode 100644 index cce6366c574c7b98985b20aa00017b449831c29b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146186 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 Nr7*;yR)BJM`rkg= (3, 10): - from typing import ParamSpec -else: - from typing_extensions import ParamSpec - -if sys.version_info >= (3, 11): - from asyncio import Runner - from typing import TypeVarTuple, Unpack -else: - import contextvars - import enum - import signal - from asyncio import coroutines, events, exceptions, tasks - - from exceptiongroup import BaseExceptionGroup - from typing_extensions import TypeVarTuple, Unpack - - class _State(enum.Enum): - CREATED = "created" - INITIALIZED = "initialized" - CLOSED = "closed" - - class Runner: - # Copied from CPython 3.11 - def __init__( - self, - *, - debug: bool | None = None, - loop_factory: Callable[[], AbstractEventLoop] | None = None, - ): - self._state = _State.CREATED - self._debug = debug - self._loop_factory = loop_factory - self._loop: AbstractEventLoop | None = None - self._context = None - self._interrupt_count = 0 - self._set_event_loop = False - - def __enter__(self) -> Runner: - self._lazy_init() - return self - - def __exit__( - self, - exc_type: type[BaseException], - exc_val: BaseException, - exc_tb: TracebackType, - ) -> None: - self.close() - - def close(self) -> None: - """Shutdown and close event loop.""" - if self._state is not _State.INITIALIZED: - return - try: - loop = self._loop - _cancel_all_tasks(loop) - loop.run_until_complete(loop.shutdown_asyncgens()) - if hasattr(loop, "shutdown_default_executor"): - loop.run_until_complete(loop.shutdown_default_executor()) - else: - loop.run_until_complete(_shutdown_default_executor(loop)) - finally: - if self._set_event_loop: - events.set_event_loop(None) - loop.close() - self._loop = None - self._state = _State.CLOSED - - def get_loop(self) -> AbstractEventLoop: - """Return embedded event loop.""" - self._lazy_init() - return self._loop - - def run(self, coro: Coroutine[T_Retval], *, context=None) -> T_Retval: - """Run a coroutine inside the embedded event loop.""" - if not coroutines.iscoroutine(coro): - raise ValueError(f"a coroutine was expected, got {coro!r}") - - if events._get_running_loop() is not None: - # fail fast with short traceback - raise RuntimeError( - "Runner.run() cannot be called from a running event loop" - ) - - self._lazy_init() - - if context is None: - context = self._context - task = context.run(self._loop.create_task, coro) - - if ( - threading.current_thread() is threading.main_thread() - and signal.getsignal(signal.SIGINT) is signal.default_int_handler - ): - sigint_handler = partial(self._on_sigint, main_task=task) - try: - signal.signal(signal.SIGINT, sigint_handler) - except ValueError: - # `signal.signal` may throw if `threading.main_thread` does - # not support signals (e.g. embedded interpreter with signals - # not registered - see gh-91880) - sigint_handler = None - else: - sigint_handler = None - - self._interrupt_count = 0 - try: - return self._loop.run_until_complete(task) - except exceptions.CancelledError: - if self._interrupt_count > 0: - uncancel = getattr(task, "uncancel", None) - if uncancel is not None and uncancel() == 0: - raise KeyboardInterrupt() - raise # CancelledError - finally: - if ( - sigint_handler is not None - and signal.getsignal(signal.SIGINT) is sigint_handler - ): - signal.signal(signal.SIGINT, signal.default_int_handler) - - def _lazy_init(self) -> None: - if self._state is _State.CLOSED: - raise RuntimeError("Runner is closed") - if self._state is _State.INITIALIZED: - return - if self._loop_factory is None: - self._loop = events.new_event_loop() - if not self._set_event_loop: - # Call set_event_loop only once to avoid calling - # attach_loop multiple times on child watchers - events.set_event_loop(self._loop) - self._set_event_loop = True - else: - self._loop = self._loop_factory() - if self._debug is not None: - self._loop.set_debug(self._debug) - self._context = contextvars.copy_context() - self._state = _State.INITIALIZED - - def _on_sigint(self, signum, frame, main_task: asyncio.Task) -> None: - self._interrupt_count += 1 - if self._interrupt_count == 1 and not main_task.done(): - main_task.cancel() - # wakeup loop if it is blocked by select() with long timeout - self._loop.call_soon_threadsafe(lambda: None) - return - raise KeyboardInterrupt() - - def _cancel_all_tasks(loop: AbstractEventLoop) -> None: - to_cancel = tasks.all_tasks(loop) - if not to_cancel: - return - - for task in to_cancel: - task.cancel() - - loop.run_until_complete(tasks.gather(*to_cancel, return_exceptions=True)) - - for task in to_cancel: - if task.cancelled(): - continue - if task.exception() is not None: - loop.call_exception_handler( - { - "message": "unhandled exception during asyncio.run() shutdown", - "exception": task.exception(), - "task": task, - } - ) - - async def _shutdown_default_executor(loop: AbstractEventLoop) -> None: - """Schedule the shutdown of the default executor.""" - - def _do_shutdown(future: asyncio.futures.Future) -> None: - try: - loop._default_executor.shutdown(wait=True) # type: ignore[attr-defined] - loop.call_soon_threadsafe(future.set_result, None) - except Exception as ex: - loop.call_soon_threadsafe(future.set_exception, ex) - - loop._executor_shutdown_called = True - if loop._default_executor is None: - return - future = loop.create_future() - thread = threading.Thread(target=_do_shutdown, args=(future,)) - thread.start() - try: - await future - finally: - thread.join() - - -T_Retval = TypeVar("T_Retval") -T_contra = TypeVar("T_contra", contravariant=True) -PosArgsT = TypeVarTuple("PosArgsT") -P = ParamSpec("P") - -_root_task: RunVar[asyncio.Task | None] = RunVar("_root_task") - - -def find_root_task() -> asyncio.Task: - root_task = _root_task.get(None) - if root_task is not None and not root_task.done(): - return root_task - - # Look for a task that has been started via run_until_complete() - for task in all_tasks(): - if task._callbacks and not task.done(): - callbacks = [cb for cb, context in task._callbacks] - for cb in callbacks: - if ( - cb is _run_until_complete_cb - or getattr(cb, "__module__", None) == "uvloop.loop" - ): - _root_task.set(task) - return task - - # Look up the topmost task in the AnyIO task tree, if possible - task = cast(asyncio.Task, current_task()) - state = _task_states.get(task) - if state: - cancel_scope = state.cancel_scope - while cancel_scope and cancel_scope._parent_scope is not None: - cancel_scope = cancel_scope._parent_scope - - if cancel_scope is not None: - return cast(asyncio.Task, cancel_scope._host_task) - - return task - - -def get_callable_name(func: Callable) -> str: - module = getattr(func, "__module__", None) - qualname = getattr(func, "__qualname__", None) - return ".".join([x for x in (module, qualname) if x]) - - -# -# Event loop -# - -_run_vars: WeakKeyDictionary[asyncio.AbstractEventLoop, Any] = WeakKeyDictionary() - - -def _task_started(task: asyncio.Task) -> bool: - """Return ``True`` if the task has been started and has not finished.""" - # The task coro should never be None here, as we never add finished tasks to the - # task list - coro = task.get_coro() - assert coro is not None - try: - return getcoroutinestate(coro) in (CORO_RUNNING, CORO_SUSPENDED) - except AttributeError: - # task coro is async_genenerator_asend https://bugs.python.org/issue37771 - raise Exception(f"Cannot determine if task {task} has started or not") from None - - -# -# Timeouts and cancellation -# - - -def is_anyio_cancellation(exc: CancelledError) -> bool: - # Sometimes third party frameworks catch a CancelledError and raise a new one, so as - # a workaround we have to look at the previous ones in __context__ too for a - # matching cancel message - while True: - if ( - exc.args - and isinstance(exc.args[0], str) - and exc.args[0].startswith("Cancelled by cancel scope ") - ): - return True - - if isinstance(exc.__context__, CancelledError): - exc = exc.__context__ - continue - - return False - - -class CancelScope(BaseCancelScope): - def __new__( - cls, *, deadline: float = math.inf, shield: bool = False - ) -> CancelScope: - return object.__new__(cls) - - def __init__(self, deadline: float = math.inf, shield: bool = False): - self._deadline = deadline - self._shield = shield - self._parent_scope: CancelScope | None = None - self._child_scopes: set[CancelScope] = set() - self._cancel_called = False - self._cancelled_caught = False - self._active = False - self._timeout_handle: asyncio.TimerHandle | None = None - self._cancel_handle: asyncio.Handle | None = None - self._tasks: set[asyncio.Task] = set() - self._host_task: asyncio.Task | None = None - if sys.version_info >= (3, 11): - self._pending_uncancellations: int | None = 0 - else: - self._pending_uncancellations = None - - def __enter__(self) -> CancelScope: - if self._active: - raise RuntimeError( - "Each CancelScope may only be used for a single 'with' block" - ) - - self._host_task = host_task = cast(asyncio.Task, current_task()) - self._tasks.add(host_task) - try: - task_state = _task_states[host_task] - except KeyError: - task_state = TaskState(None, self) - _task_states[host_task] = task_state - else: - self._parent_scope = task_state.cancel_scope - task_state.cancel_scope = self - if self._parent_scope is not None: - # If using an eager task factory, the parent scope may not even contain - # the host task - self._parent_scope._child_scopes.add(self) - self._parent_scope._tasks.discard(host_task) - - self._timeout() - self._active = True - - # Start cancelling the host task if the scope was cancelled before entering - if self._cancel_called: - self._deliver_cancellation(self) - - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> bool: - del exc_tb - - if not self._active: - raise RuntimeError("This cancel scope is not active") - if current_task() is not self._host_task: - raise RuntimeError( - "Attempted to exit cancel scope in a different task than it was " - "entered in" - ) - - assert self._host_task is not None - host_task_state = _task_states.get(self._host_task) - if host_task_state is None or host_task_state.cancel_scope is not self: - raise RuntimeError( - "Attempted to exit a cancel scope that isn't the current tasks's " - "current cancel scope" - ) - - try: - self._active = False - if self._timeout_handle: - self._timeout_handle.cancel() - self._timeout_handle = None - - self._tasks.remove(self._host_task) - if self._parent_scope is not None: - self._parent_scope._child_scopes.remove(self) - self._parent_scope._tasks.add(self._host_task) - - host_task_state.cancel_scope = self._parent_scope - - # Restart the cancellation effort in the closest visible, cancelled parent - # scope if necessary - self._restart_cancellation_in_parent() - - # We only swallow the exception iff it was an AnyIO CancelledError, either - # directly as exc_val or inside an exception group and there are no cancelled - # parent cancel scopes visible to us here - if self._cancel_called and not self._parent_cancellation_is_visible_to_us: - # For each level-cancel() call made on the host task, call uncancel() - while self._pending_uncancellations: - self._host_task.uncancel() - self._pending_uncancellations -= 1 - - # Update cancelled_caught and check for exceptions we must not swallow - cannot_swallow_exc_val = False - if exc_val is not None: - for exc in iterate_exceptions(exc_val): - if isinstance(exc, CancelledError) and is_anyio_cancellation( - exc - ): - self._cancelled_caught = True - else: - cannot_swallow_exc_val = True - - return self._cancelled_caught and not cannot_swallow_exc_val - else: - if self._pending_uncancellations: - assert self._parent_scope is not None - assert self._parent_scope._pending_uncancellations is not None - self._parent_scope._pending_uncancellations += ( - self._pending_uncancellations - ) - self._pending_uncancellations = 0 - - return False - finally: - self._host_task = None - del exc_val - - @property - def _effectively_cancelled(self) -> bool: - cancel_scope: CancelScope | None = self - while cancel_scope is not None: - if cancel_scope._cancel_called: - return True - - if cancel_scope.shield: - return False - - cancel_scope = cancel_scope._parent_scope - - return False - - @property - def _parent_cancellation_is_visible_to_us(self) -> bool: - return ( - self._parent_scope is not None - and not self.shield - and self._parent_scope._effectively_cancelled - ) - - def _timeout(self) -> None: - if self._deadline != math.inf: - loop = get_running_loop() - if loop.time() >= self._deadline: - self.cancel() - else: - self._timeout_handle = loop.call_at(self._deadline, self._timeout) - - def _deliver_cancellation(self, origin: CancelScope) -> bool: - """ - Deliver cancellation to directly contained tasks and nested cancel scopes. - - Schedule another run at the end if we still have tasks eligible for - cancellation. - - :param origin: the cancel scope that originated the cancellation - :return: ``True`` if the delivery needs to be retried on the next cycle - - """ - should_retry = False - current = current_task() - for task in self._tasks: - should_retry = True - if task._must_cancel: # type: ignore[attr-defined] - continue - - # The task is eligible for cancellation if it has started - if task is not current and (task is self._host_task or _task_started(task)): - waiter = task._fut_waiter # type: ignore[attr-defined] - if not isinstance(waiter, asyncio.Future) or not waiter.done(): - task.cancel(f"Cancelled by cancel scope {id(origin):x}") - if ( - task is origin._host_task - and origin._pending_uncancellations is not None - ): - origin._pending_uncancellations += 1 - - # Deliver cancellation to child scopes that aren't shielded or running their own - # cancellation callbacks - for scope in self._child_scopes: - if not scope._shield and not scope.cancel_called: - should_retry = scope._deliver_cancellation(origin) or should_retry - - # Schedule another callback if there are still tasks left - if origin is self: - if should_retry: - self._cancel_handle = get_running_loop().call_soon( - self._deliver_cancellation, origin - ) - else: - self._cancel_handle = None - - return should_retry - - def _restart_cancellation_in_parent(self) -> None: - """ - Restart the cancellation effort in the closest directly cancelled parent scope. - - """ - scope = self._parent_scope - while scope is not None: - if scope._cancel_called: - if scope._cancel_handle is None: - scope._deliver_cancellation(scope) - - break - - # No point in looking beyond any shielded scope - if scope._shield: - break - - scope = scope._parent_scope - - def cancel(self) -> None: - if not self._cancel_called: - if self._timeout_handle: - self._timeout_handle.cancel() - self._timeout_handle = None - - self._cancel_called = True - if self._host_task is not None: - self._deliver_cancellation(self) - - @property - def deadline(self) -> float: - return self._deadline - - @deadline.setter - def deadline(self, value: float) -> None: - self._deadline = float(value) - if self._timeout_handle is not None: - self._timeout_handle.cancel() - self._timeout_handle = None - - if self._active and not self._cancel_called: - self._timeout() - - @property - def cancel_called(self) -> bool: - return self._cancel_called - - @property - def cancelled_caught(self) -> bool: - return self._cancelled_caught - - @property - def shield(self) -> bool: - return self._shield - - @shield.setter - def shield(self, value: bool) -> None: - if self._shield != value: - self._shield = value - if not value: - self._restart_cancellation_in_parent() - - -# -# Task states -# - - -class TaskState: - """ - Encapsulates auxiliary task information that cannot be added to the Task instance - itself because there are no guarantees about its implementation. - """ - - __slots__ = "parent_id", "cancel_scope", "__weakref__" - - def __init__(self, parent_id: int | None, cancel_scope: CancelScope | None): - self.parent_id = parent_id - self.cancel_scope = cancel_scope - - -_task_states: WeakKeyDictionary[asyncio.Task, TaskState] = WeakKeyDictionary() - - -# -# Task groups -# - - -class _AsyncioTaskStatus(abc.TaskStatus): - def __init__(self, future: asyncio.Future, parent_id: int): - self._future = future - self._parent_id = parent_id - - def started(self, value: T_contra | None = None) -> None: - try: - self._future.set_result(value) - except asyncio.InvalidStateError: - if not self._future.cancelled(): - raise RuntimeError( - "called 'started' twice on the same task status" - ) from None - - task = cast(asyncio.Task, current_task()) - _task_states[task].parent_id = self._parent_id - - -if sys.version_info >= (3, 12): - _eager_task_factory_code: CodeType | None = asyncio.eager_task_factory.__code__ -else: - _eager_task_factory_code = None - - -class TaskGroup(abc.TaskGroup): - def __init__(self) -> None: - self.cancel_scope: CancelScope = CancelScope() - self._active = False - self._exceptions: list[BaseException] = [] - self._tasks: set[asyncio.Task] = set() - self._on_completed_fut: asyncio.Future[None] | None = None - - async def __aenter__(self) -> TaskGroup: - self.cancel_scope.__enter__() - self._active = True - return self - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> bool | None: - try: - if exc_val is not None: - self.cancel_scope.cancel() - if not isinstance(exc_val, CancelledError): - self._exceptions.append(exc_val) - - loop = get_running_loop() - try: - if self._tasks: - with CancelScope() as wait_scope: - while self._tasks: - self._on_completed_fut = loop.create_future() - - try: - await self._on_completed_fut - except CancelledError as exc: - # Shield the scope against further cancellation attempts, - # as they're not productive (#695) - wait_scope.shield = True - self.cancel_scope.cancel() - - # Set exc_val from the cancellation exception if it was - # previously unset. However, we should not replace a native - # cancellation exception with one raise by a cancel scope. - if exc_val is None or ( - isinstance(exc_val, CancelledError) - and not is_anyio_cancellation(exc) - ): - exc_val = exc - - self._on_completed_fut = None - else: - # If there are no child tasks to wait on, run at least one checkpoint - # anyway - await AsyncIOBackend.cancel_shielded_checkpoint() - - self._active = False - if self._exceptions: - # The exception that got us here should already have been - # added to self._exceptions so it's ok to break exception - # chaining and avoid adding a "During handling of above..." - # for each nesting level. - raise BaseExceptionGroup( - "unhandled errors in a TaskGroup", self._exceptions - ) from None - elif exc_val: - raise exc_val - except BaseException as exc: - if self.cancel_scope.__exit__(type(exc), exc, exc.__traceback__): - return True - - raise - - return self.cancel_scope.__exit__(exc_type, exc_val, exc_tb) - finally: - del exc_val, exc_tb, self._exceptions - - def _spawn( - self, - func: Callable[[Unpack[PosArgsT]], Awaitable[Any]], - args: tuple[Unpack[PosArgsT]], - name: object, - task_status_future: asyncio.Future | None = None, - ) -> asyncio.Task: - def task_done(_task: asyncio.Task) -> None: - task_state = _task_states[_task] - assert task_state.cancel_scope is not None - assert _task in task_state.cancel_scope._tasks - task_state.cancel_scope._tasks.remove(_task) - self._tasks.remove(task) - del _task_states[_task] - - if self._on_completed_fut is not None and not self._tasks: - try: - self._on_completed_fut.set_result(None) - except asyncio.InvalidStateError: - pass - - try: - exc = _task.exception() - except CancelledError as e: - while isinstance(e.__context__, CancelledError): - e = e.__context__ - - exc = e - - if exc is not None: - # The future can only be in the cancelled state if the host task was - # cancelled, so return immediately instead of adding one more - # CancelledError to the exceptions list - if task_status_future is not None and task_status_future.cancelled(): - return - - if task_status_future is None or task_status_future.done(): - if not isinstance(exc, CancelledError): - self._exceptions.append(exc) - - if not self.cancel_scope._effectively_cancelled: - self.cancel_scope.cancel() - else: - task_status_future.set_exception(exc) - elif task_status_future is not None and not task_status_future.done(): - task_status_future.set_exception( - RuntimeError("Child exited without calling task_status.started()") - ) - - if not self._active: - raise RuntimeError( - "This task group is not active; no new tasks can be started." - ) - - kwargs = {} - if task_status_future: - parent_id = id(current_task()) - kwargs["task_status"] = _AsyncioTaskStatus( - task_status_future, id(self.cancel_scope._host_task) - ) - else: - parent_id = id(self.cancel_scope._host_task) - - coro = func(*args, **kwargs) - if not iscoroutine(coro): - prefix = f"{func.__module__}." if hasattr(func, "__module__") else "" - raise TypeError( - f"Expected {prefix}{func.__qualname__}() to return a coroutine, but " - f"the return value ({coro!r}) is not a coroutine object" - ) - - name = get_callable_name(func) if name is None else str(name) - loop = asyncio.get_running_loop() - if ( - (factory := loop.get_task_factory()) - and getattr(factory, "__code__", None) is _eager_task_factory_code - and (closure := getattr(factory, "__closure__", None)) - ): - custom_task_constructor = closure[0].cell_contents - task = custom_task_constructor(coro, loop=loop, name=name) - else: - task = create_task(coro, name=name) - - # Make the spawned task inherit the task group's cancel scope - _task_states[task] = TaskState( - parent_id=parent_id, cancel_scope=self.cancel_scope - ) - self.cancel_scope._tasks.add(task) - self._tasks.add(task) - task.add_done_callback(task_done) - return task - - def start_soon( - self, - func: Callable[[Unpack[PosArgsT]], Awaitable[Any]], - *args: Unpack[PosArgsT], - name: object = None, - ) -> None: - self._spawn(func, args, name) - - async def start( - self, func: Callable[..., Awaitable[Any]], *args: object, name: object = None - ) -> Any: - future: asyncio.Future = asyncio.Future() - task = self._spawn(func, args, name, future) - - # If the task raises an exception after sending a start value without a switch - # point between, the task group is cancelled and this method never proceeds to - # process the completed future. That's why we have to have a shielded cancel - # scope here. - try: - return await future - except CancelledError: - # Cancel the task and wait for it to exit before returning - task.cancel() - with CancelScope(shield=True), suppress(CancelledError): - await task - - raise - - -# -# Threads -# - -_Retval_Queue_Type = tuple[Optional[T_Retval], Optional[BaseException]] - - -class WorkerThread(Thread): - MAX_IDLE_TIME = 10 # seconds - - def __init__( - self, - root_task: asyncio.Task, - workers: set[WorkerThread], - idle_workers: deque[WorkerThread], - ): - super().__init__(name="AnyIO worker thread") - self.root_task = root_task - self.workers = workers - self.idle_workers = idle_workers - self.loop = root_task._loop - self.queue: Queue[ - tuple[Context, Callable, tuple, asyncio.Future, CancelScope] | None - ] = Queue(2) - self.idle_since = AsyncIOBackend.current_time() - self.stopping = False - - def _report_result( - self, future: asyncio.Future, result: Any, exc: BaseException | None - ) -> None: - self.idle_since = AsyncIOBackend.current_time() - if not self.stopping: - self.idle_workers.append(self) - - if not future.cancelled(): - if exc is not None: - if isinstance(exc, StopIteration): - new_exc = RuntimeError("coroutine raised StopIteration") - new_exc.__cause__ = exc - exc = new_exc - - future.set_exception(exc) - else: - future.set_result(result) - - def run(self) -> None: - with claim_worker_thread(AsyncIOBackend, self.loop): - while True: - item = self.queue.get() - if item is None: - # Shutdown command received - return - - context, func, args, future, cancel_scope = item - if not future.cancelled(): - result = None - exception: BaseException | None = None - threadlocals.current_cancel_scope = cancel_scope - try: - result = context.run(func, *args) - except BaseException as exc: - exception = exc - finally: - del threadlocals.current_cancel_scope - - if not self.loop.is_closed(): - self.loop.call_soon_threadsafe( - self._report_result, future, result, exception - ) - - del result, exception - - self.queue.task_done() - del item, context, func, args, future, cancel_scope - - def stop(self, f: asyncio.Task | None = None) -> None: - self.stopping = True - self.queue.put_nowait(None) - self.workers.discard(self) - try: - self.idle_workers.remove(self) - except ValueError: - pass - - -_threadpool_idle_workers: RunVar[deque[WorkerThread]] = RunVar( - "_threadpool_idle_workers" -) -_threadpool_workers: RunVar[set[WorkerThread]] = RunVar("_threadpool_workers") - - -class BlockingPortal(abc.BlockingPortal): - def __new__(cls) -> BlockingPortal: - return object.__new__(cls) - - def __init__(self) -> None: - super().__init__() - self._loop = get_running_loop() - - def _spawn_task_from_thread( - self, - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval] | T_Retval], - args: tuple[Unpack[PosArgsT]], - kwargs: dict[str, Any], - name: object, - future: Future[T_Retval], - ) -> None: - AsyncIOBackend.run_sync_from_thread( - partial(self._task_group.start_soon, name=name), - (self._call_func, func, args, kwargs, future), - self._loop, - ) - - -# -# Subprocesses -# - - -@dataclass(eq=False) -class StreamReaderWrapper(abc.ByteReceiveStream): - _stream: asyncio.StreamReader - - async def receive(self, max_bytes: int = 65536) -> bytes: - data = await self._stream.read(max_bytes) - if data: - return data - else: - raise EndOfStream - - async def aclose(self) -> None: - self._stream.set_exception(ClosedResourceError()) - await AsyncIOBackend.checkpoint() - - -@dataclass(eq=False) -class StreamWriterWrapper(abc.ByteSendStream): - _stream: asyncio.StreamWriter - - async def send(self, item: bytes) -> None: - self._stream.write(item) - await self._stream.drain() - - async def aclose(self) -> None: - self._stream.close() - await AsyncIOBackend.checkpoint() - - -@dataclass(eq=False) -class Process(abc.Process): - _process: asyncio.subprocess.Process - _stdin: StreamWriterWrapper | None - _stdout: StreamReaderWrapper | None - _stderr: StreamReaderWrapper | None - - async def aclose(self) -> None: - with CancelScope(shield=True) as scope: - if self._stdin: - await self._stdin.aclose() - if self._stdout: - await self._stdout.aclose() - if self._stderr: - await self._stderr.aclose() - - scope.shield = False - try: - await self.wait() - except BaseException: - scope.shield = True - self.kill() - await self.wait() - raise - - async def wait(self) -> int: - return await self._process.wait() - - def terminate(self) -> None: - self._process.terminate() - - def kill(self) -> None: - self._process.kill() - - def send_signal(self, signal: int) -> None: - self._process.send_signal(signal) - - @property - def pid(self) -> int: - return self._process.pid - - @property - def returncode(self) -> int | None: - return self._process.returncode - - @property - def stdin(self) -> abc.ByteSendStream | None: - return self._stdin - - @property - def stdout(self) -> abc.ByteReceiveStream | None: - return self._stdout - - @property - def stderr(self) -> abc.ByteReceiveStream | None: - return self._stderr - - -def _forcibly_shutdown_process_pool_on_exit( - workers: set[Process], _task: object -) -> None: - """ - Forcibly shuts down worker processes belonging to this event loop.""" - child_watcher: asyncio.AbstractChildWatcher | None = None - if sys.version_info < (3, 12): - try: - child_watcher = asyncio.get_event_loop_policy().get_child_watcher() - except NotImplementedError: - pass - - # Close as much as possible (w/o async/await) to avoid warnings - for process in workers: - if process.returncode is None: - continue - - process._stdin._stream._transport.close() # type: ignore[union-attr] - process._stdout._stream._transport.close() # type: ignore[union-attr] - process._stderr._stream._transport.close() # type: ignore[union-attr] - process.kill() - if child_watcher: - child_watcher.remove_child_handler(process.pid) - - -async def _shutdown_process_pool_on_exit(workers: set[abc.Process]) -> None: - """ - Shuts down worker processes belonging to this event loop. - - NOTE: this only works when the event loop was started using asyncio.run() or - anyio.run(). - - """ - process: abc.Process - try: - await sleep(math.inf) - except asyncio.CancelledError: - for process in workers: - if process.returncode is None: - process.kill() - - for process in workers: - await process.aclose() - - -# -# Sockets and networking -# - - -class StreamProtocol(asyncio.Protocol): - read_queue: deque[bytes] - read_event: asyncio.Event - write_event: asyncio.Event - exception: Exception | None = None - is_at_eof: bool = False - - def connection_made(self, transport: asyncio.BaseTransport) -> None: - self.read_queue = deque() - self.read_event = asyncio.Event() - self.write_event = asyncio.Event() - self.write_event.set() - cast(asyncio.Transport, transport).set_write_buffer_limits(0) - - def connection_lost(self, exc: Exception | None) -> None: - if exc: - self.exception = BrokenResourceError() - self.exception.__cause__ = exc - - self.read_event.set() - self.write_event.set() - - def data_received(self, data: bytes) -> None: - # ProactorEventloop sometimes sends bytearray instead of bytes - self.read_queue.append(bytes(data)) - self.read_event.set() - - def eof_received(self) -> bool | None: - self.is_at_eof = True - self.read_event.set() - return True - - def pause_writing(self) -> None: - self.write_event = asyncio.Event() - - def resume_writing(self) -> None: - self.write_event.set() - - -class DatagramProtocol(asyncio.DatagramProtocol): - read_queue: deque[tuple[bytes, IPSockAddrType]] - read_event: asyncio.Event - write_event: asyncio.Event - exception: Exception | None = None - - def connection_made(self, transport: asyncio.BaseTransport) -> None: - self.read_queue = deque(maxlen=100) # arbitrary value - self.read_event = asyncio.Event() - self.write_event = asyncio.Event() - self.write_event.set() - - def connection_lost(self, exc: Exception | None) -> None: - self.read_event.set() - self.write_event.set() - - def datagram_received(self, data: bytes, addr: IPSockAddrType) -> None: - addr = convert_ipv6_sockaddr(addr) - self.read_queue.append((data, addr)) - self.read_event.set() - - def error_received(self, exc: Exception) -> None: - self.exception = exc - - def pause_writing(self) -> None: - self.write_event.clear() - - def resume_writing(self) -> None: - self.write_event.set() - - -class SocketStream(abc.SocketStream): - def __init__(self, transport: asyncio.Transport, protocol: StreamProtocol): - self._transport = transport - self._protocol = protocol - self._receive_guard = ResourceGuard("reading from") - self._send_guard = ResourceGuard("writing to") - self._closed = False - - @property - def _raw_socket(self) -> socket.socket: - return self._transport.get_extra_info("socket") - - async def receive(self, max_bytes: int = 65536) -> bytes: - with self._receive_guard: - if ( - not self._protocol.read_event.is_set() - and not self._transport.is_closing() - and not self._protocol.is_at_eof - ): - self._transport.resume_reading() - await self._protocol.read_event.wait() - self._transport.pause_reading() - else: - await AsyncIOBackend.checkpoint() - - try: - chunk = self._protocol.read_queue.popleft() - except IndexError: - if self._closed: - raise ClosedResourceError from None - elif self._protocol.exception: - raise self._protocol.exception from None - else: - raise EndOfStream from None - - if len(chunk) > max_bytes: - # Split the oversized chunk - chunk, leftover = chunk[:max_bytes], chunk[max_bytes:] - self._protocol.read_queue.appendleft(leftover) - - # If the read queue is empty, clear the flag so that the next call will - # block until data is available - if not self._protocol.read_queue: - self._protocol.read_event.clear() - - return chunk - - async def send(self, item: bytes) -> None: - with self._send_guard: - await AsyncIOBackend.checkpoint() - - if self._closed: - raise ClosedResourceError - elif self._protocol.exception is not None: - raise self._protocol.exception - - try: - self._transport.write(item) - except RuntimeError as exc: - if self._transport.is_closing(): - raise BrokenResourceError from exc - else: - raise - - await self._protocol.write_event.wait() - - async def send_eof(self) -> None: - try: - self._transport.write_eof() - except OSError: - pass - - async def aclose(self) -> None: - if not self._transport.is_closing(): - self._closed = True - try: - self._transport.write_eof() - except OSError: - pass - - self._transport.close() - await sleep(0) - self._transport.abort() - - -class _RawSocketMixin: - _receive_future: asyncio.Future | None = None - _send_future: asyncio.Future | None = None - _closing = False - - def __init__(self, raw_socket: socket.socket): - self.__raw_socket = raw_socket - self._receive_guard = ResourceGuard("reading from") - self._send_guard = ResourceGuard("writing to") - - @property - def _raw_socket(self) -> socket.socket: - return self.__raw_socket - - def _wait_until_readable(self, loop: asyncio.AbstractEventLoop) -> asyncio.Future: - def callback(f: object) -> None: - del self._receive_future - loop.remove_reader(self.__raw_socket) - - f = self._receive_future = asyncio.Future() - loop.add_reader(self.__raw_socket, f.set_result, None) - f.add_done_callback(callback) - return f - - def _wait_until_writable(self, loop: asyncio.AbstractEventLoop) -> asyncio.Future: - def callback(f: object) -> None: - del self._send_future - loop.remove_writer(self.__raw_socket) - - f = self._send_future = asyncio.Future() - loop.add_writer(self.__raw_socket, f.set_result, None) - f.add_done_callback(callback) - return f - - async def aclose(self) -> None: - if not self._closing: - self._closing = True - if self.__raw_socket.fileno() != -1: - self.__raw_socket.close() - - if self._receive_future: - self._receive_future.set_result(None) - if self._send_future: - self._send_future.set_result(None) - - -class UNIXSocketStream(_RawSocketMixin, abc.UNIXSocketStream): - async def send_eof(self) -> None: - with self._send_guard: - self._raw_socket.shutdown(socket.SHUT_WR) - - async def receive(self, max_bytes: int = 65536) -> bytes: - loop = get_running_loop() - await AsyncIOBackend.checkpoint() - with self._receive_guard: - while True: - try: - data = self._raw_socket.recv(max_bytes) - except BlockingIOError: - await self._wait_until_readable(loop) - except OSError as exc: - if self._closing: - raise ClosedResourceError from None - else: - raise BrokenResourceError from exc - else: - if not data: - raise EndOfStream - - return data - - async def send(self, item: bytes) -> None: - loop = get_running_loop() - await AsyncIOBackend.checkpoint() - with self._send_guard: - view = memoryview(item) - while view: - try: - bytes_sent = self._raw_socket.send(view) - except BlockingIOError: - await self._wait_until_writable(loop) - except OSError as exc: - if self._closing: - raise ClosedResourceError from None - else: - raise BrokenResourceError from exc - else: - view = view[bytes_sent:] - - async def receive_fds(self, msglen: int, maxfds: int) -> tuple[bytes, list[int]]: - if not isinstance(msglen, int) or msglen < 0: - raise ValueError("msglen must be a non-negative integer") - if not isinstance(maxfds, int) or maxfds < 1: - raise ValueError("maxfds must be a positive integer") - - loop = get_running_loop() - fds = array.array("i") - await AsyncIOBackend.checkpoint() - with self._receive_guard: - while True: - try: - message, ancdata, flags, addr = self._raw_socket.recvmsg( - msglen, socket.CMSG_LEN(maxfds * fds.itemsize) - ) - except BlockingIOError: - await self._wait_until_readable(loop) - except OSError as exc: - if self._closing: - raise ClosedResourceError from None - else: - raise BrokenResourceError from exc - else: - if not message and not ancdata: - raise EndOfStream - - break - - for cmsg_level, cmsg_type, cmsg_data in ancdata: - if cmsg_level != socket.SOL_SOCKET or cmsg_type != socket.SCM_RIGHTS: - raise RuntimeError( - f"Received unexpected ancillary data; message = {message!r}, " - f"cmsg_level = {cmsg_level}, cmsg_type = {cmsg_type}" - ) - - fds.frombytes(cmsg_data[: len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) - - return message, list(fds) - - async def send_fds(self, message: bytes, fds: Collection[int | IOBase]) -> None: - if not message: - raise ValueError("message must not be empty") - if not fds: - raise ValueError("fds must not be empty") - - loop = get_running_loop() - filenos: list[int] = [] - for fd in fds: - if isinstance(fd, int): - filenos.append(fd) - elif isinstance(fd, IOBase): - filenos.append(fd.fileno()) - - fdarray = array.array("i", filenos) - await AsyncIOBackend.checkpoint() - with self._send_guard: - while True: - try: - # The ignore can be removed after mypy picks up - # https://github.com/python/typeshed/pull/5545 - self._raw_socket.sendmsg( - [message], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, fdarray)] - ) - break - except BlockingIOError: - await self._wait_until_writable(loop) - except OSError as exc: - if self._closing: - raise ClosedResourceError from None - else: - raise BrokenResourceError from exc - - -class TCPSocketListener(abc.SocketListener): - _accept_scope: CancelScope | None = None - _closed = False - - def __init__(self, raw_socket: socket.socket): - self.__raw_socket = raw_socket - self._loop = cast(asyncio.BaseEventLoop, get_running_loop()) - self._accept_guard = ResourceGuard("accepting connections from") - - @property - def _raw_socket(self) -> socket.socket: - return self.__raw_socket - - async def accept(self) -> abc.SocketStream: - if self._closed: - raise ClosedResourceError - - with self._accept_guard: - await AsyncIOBackend.checkpoint() - with CancelScope() as self._accept_scope: - try: - client_sock, _addr = await self._loop.sock_accept(self._raw_socket) - except asyncio.CancelledError: - # Workaround for https://bugs.python.org/issue41317 - try: - self._loop.remove_reader(self._raw_socket) - except (ValueError, NotImplementedError): - pass - - if self._closed: - raise ClosedResourceError from None - - raise - finally: - self._accept_scope = None - - client_sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) - transport, protocol = await self._loop.connect_accepted_socket( - StreamProtocol, client_sock - ) - return SocketStream(transport, protocol) - - async def aclose(self) -> None: - if self._closed: - return - - self._closed = True - if self._accept_scope: - # Workaround for https://bugs.python.org/issue41317 - try: - self._loop.remove_reader(self._raw_socket) - except (ValueError, NotImplementedError): - pass - - self._accept_scope.cancel() - await sleep(0) - - self._raw_socket.close() - - -class UNIXSocketListener(abc.SocketListener): - def __init__(self, raw_socket: socket.socket): - self.__raw_socket = raw_socket - self._loop = get_running_loop() - self._accept_guard = ResourceGuard("accepting connections from") - self._closed = False - - async def accept(self) -> abc.SocketStream: - await AsyncIOBackend.checkpoint() - with self._accept_guard: - while True: - try: - client_sock, _ = self.__raw_socket.accept() - client_sock.setblocking(False) - return UNIXSocketStream(client_sock) - except BlockingIOError: - f: asyncio.Future = asyncio.Future() - self._loop.add_reader(self.__raw_socket, f.set_result, None) - f.add_done_callback( - lambda _: self._loop.remove_reader(self.__raw_socket) - ) - await f - except OSError as exc: - if self._closed: - raise ClosedResourceError from None - else: - raise BrokenResourceError from exc - - async def aclose(self) -> None: - self._closed = True - self.__raw_socket.close() - - @property - def _raw_socket(self) -> socket.socket: - return self.__raw_socket - - -class UDPSocket(abc.UDPSocket): - def __init__( - self, transport: asyncio.DatagramTransport, protocol: DatagramProtocol - ): - self._transport = transport - self._protocol = protocol - self._receive_guard = ResourceGuard("reading from") - self._send_guard = ResourceGuard("writing to") - self._closed = False - - @property - def _raw_socket(self) -> socket.socket: - return self._transport.get_extra_info("socket") - - async def aclose(self) -> None: - if not self._transport.is_closing(): - self._closed = True - self._transport.close() - - async def receive(self) -> tuple[bytes, IPSockAddrType]: - with self._receive_guard: - await AsyncIOBackend.checkpoint() - - # If the buffer is empty, ask for more data - if not self._protocol.read_queue and not self._transport.is_closing(): - self._protocol.read_event.clear() - await self._protocol.read_event.wait() - - try: - return self._protocol.read_queue.popleft() - except IndexError: - if self._closed: - raise ClosedResourceError from None - else: - raise BrokenResourceError from None - - async def send(self, item: UDPPacketType) -> None: - with self._send_guard: - await AsyncIOBackend.checkpoint() - await self._protocol.write_event.wait() - if self._closed: - raise ClosedResourceError - elif self._transport.is_closing(): - raise BrokenResourceError - else: - self._transport.sendto(*item) - - -class ConnectedUDPSocket(abc.ConnectedUDPSocket): - def __init__( - self, transport: asyncio.DatagramTransport, protocol: DatagramProtocol - ): - self._transport = transport - self._protocol = protocol - self._receive_guard = ResourceGuard("reading from") - self._send_guard = ResourceGuard("writing to") - self._closed = False - - @property - def _raw_socket(self) -> socket.socket: - return self._transport.get_extra_info("socket") - - async def aclose(self) -> None: - if not self._transport.is_closing(): - self._closed = True - self._transport.close() - - async def receive(self) -> bytes: - with self._receive_guard: - await AsyncIOBackend.checkpoint() - - # If the buffer is empty, ask for more data - if not self._protocol.read_queue and not self._transport.is_closing(): - self._protocol.read_event.clear() - await self._protocol.read_event.wait() - - try: - packet = self._protocol.read_queue.popleft() - except IndexError: - if self._closed: - raise ClosedResourceError from None - else: - raise BrokenResourceError from None - - return packet[0] - - async def send(self, item: bytes) -> None: - with self._send_guard: - await AsyncIOBackend.checkpoint() - await self._protocol.write_event.wait() - if self._closed: - raise ClosedResourceError - elif self._transport.is_closing(): - raise BrokenResourceError - else: - self._transport.sendto(item) - - -class UNIXDatagramSocket(_RawSocketMixin, abc.UNIXDatagramSocket): - async def receive(self) -> UNIXDatagramPacketType: - loop = get_running_loop() - await AsyncIOBackend.checkpoint() - with self._receive_guard: - while True: - try: - data = self._raw_socket.recvfrom(65536) - except BlockingIOError: - await self._wait_until_readable(loop) - except OSError as exc: - if self._closing: - raise ClosedResourceError from None - else: - raise BrokenResourceError from exc - else: - return data - - async def send(self, item: UNIXDatagramPacketType) -> None: - loop = get_running_loop() - await AsyncIOBackend.checkpoint() - with self._send_guard: - while True: - try: - self._raw_socket.sendto(*item) - except BlockingIOError: - await self._wait_until_writable(loop) - except OSError as exc: - if self._closing: - raise ClosedResourceError from None - else: - raise BrokenResourceError from exc - else: - return - - -class ConnectedUNIXDatagramSocket(_RawSocketMixin, abc.ConnectedUNIXDatagramSocket): - async def receive(self) -> bytes: - loop = get_running_loop() - await AsyncIOBackend.checkpoint() - with self._receive_guard: - while True: - try: - data = self._raw_socket.recv(65536) - except BlockingIOError: - await self._wait_until_readable(loop) - except OSError as exc: - if self._closing: - raise ClosedResourceError from None - else: - raise BrokenResourceError from exc - else: - return data - - async def send(self, item: bytes) -> None: - loop = get_running_loop() - await AsyncIOBackend.checkpoint() - with self._send_guard: - while True: - try: - self._raw_socket.send(item) - except BlockingIOError: - await self._wait_until_writable(loop) - except OSError as exc: - if self._closing: - raise ClosedResourceError from None - else: - raise BrokenResourceError from exc - else: - return - - -_read_events: RunVar[dict[int, asyncio.Event]] = RunVar("read_events") -_write_events: RunVar[dict[int, asyncio.Event]] = RunVar("write_events") - - -# -# Synchronization -# - - -class Event(BaseEvent): - def __new__(cls) -> Event: - return object.__new__(cls) - - def __init__(self) -> None: - self._event = asyncio.Event() - - def set(self) -> None: - self._event.set() - - def is_set(self) -> bool: - return self._event.is_set() - - async def wait(self) -> None: - if self.is_set(): - await AsyncIOBackend.checkpoint() - else: - await self._event.wait() - - def statistics(self) -> EventStatistics: - return EventStatistics(len(self._event._waiters)) - - -class Lock(BaseLock): - def __new__(cls, *, fast_acquire: bool = False) -> Lock: - return object.__new__(cls) - - def __init__(self, *, fast_acquire: bool = False) -> None: - self._fast_acquire = fast_acquire - self._owner_task: asyncio.Task | None = None - self._waiters: deque[tuple[asyncio.Task, asyncio.Future]] = deque() - - async def acquire(self) -> None: - task = cast(asyncio.Task, current_task()) - if self._owner_task is None and not self._waiters: - await AsyncIOBackend.checkpoint_if_cancelled() - self._owner_task = task - - # Unless on the "fast path", yield control of the event loop so that other - # tasks can run too - if not self._fast_acquire: - try: - await AsyncIOBackend.cancel_shielded_checkpoint() - except CancelledError: - self.release() - raise - - return - - if self._owner_task == task: - raise RuntimeError("Attempted to acquire an already held Lock") - - fut: asyncio.Future[None] = asyncio.Future() - item = task, fut - self._waiters.append(item) - try: - await fut - except CancelledError: - self._waiters.remove(item) - if self._owner_task is task: - self.release() - - raise - - self._waiters.remove(item) - - def acquire_nowait(self) -> None: - task = cast(asyncio.Task, current_task()) - if self._owner_task is None and not self._waiters: - self._owner_task = task - return - - if self._owner_task is task: - raise RuntimeError("Attempted to acquire an already held Lock") - - raise WouldBlock - - def locked(self) -> bool: - return self._owner_task is not None - - def release(self) -> None: - if self._owner_task != current_task(): - raise RuntimeError("The current task is not holding this lock") - - for task, fut in self._waiters: - if not fut.cancelled(): - self._owner_task = task - fut.set_result(None) - return - - self._owner_task = None - - def statistics(self) -> LockStatistics: - task_info = AsyncIOTaskInfo(self._owner_task) if self._owner_task else None - return LockStatistics(self.locked(), task_info, len(self._waiters)) - - -class Semaphore(BaseSemaphore): - def __new__( - cls, - initial_value: int, - *, - max_value: int | None = None, - fast_acquire: bool = False, - ) -> Semaphore: - return object.__new__(cls) - - def __init__( - self, - initial_value: int, - *, - max_value: int | None = None, - fast_acquire: bool = False, - ): - super().__init__(initial_value, max_value=max_value) - self._value = initial_value - self._max_value = max_value - self._fast_acquire = fast_acquire - self._waiters: deque[asyncio.Future[None]] = deque() - - async def acquire(self) -> None: - if self._value > 0 and not self._waiters: - await AsyncIOBackend.checkpoint_if_cancelled() - self._value -= 1 - - # Unless on the "fast path", yield control of the event loop so that other - # tasks can run too - if not self._fast_acquire: - try: - await AsyncIOBackend.cancel_shielded_checkpoint() - except CancelledError: - self.release() - raise - - return - - fut: asyncio.Future[None] = asyncio.Future() - self._waiters.append(fut) - try: - await fut - except CancelledError: - try: - self._waiters.remove(fut) - except ValueError: - self.release() - - raise - - def acquire_nowait(self) -> None: - if self._value == 0: - raise WouldBlock - - self._value -= 1 - - def release(self) -> None: - if self._max_value is not None and self._value == self._max_value: - raise ValueError("semaphore released too many times") - - for fut in self._waiters: - if not fut.cancelled(): - fut.set_result(None) - self._waiters.remove(fut) - return - - self._value += 1 - - @property - def value(self) -> int: - return self._value - - @property - def max_value(self) -> int | None: - return self._max_value - - def statistics(self) -> SemaphoreStatistics: - return SemaphoreStatistics(len(self._waiters)) - - -class CapacityLimiter(BaseCapacityLimiter): - _total_tokens: float = 0 - - def __new__(cls, total_tokens: float) -> CapacityLimiter: - return object.__new__(cls) - - def __init__(self, total_tokens: float): - self._borrowers: set[Any] = set() - self._wait_queue: OrderedDict[Any, asyncio.Event] = OrderedDict() - self.total_tokens = total_tokens - - async def __aenter__(self) -> None: - await self.acquire() - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - self.release() - - @property - def total_tokens(self) -> float: - return self._total_tokens - - @total_tokens.setter - def total_tokens(self, value: float) -> None: - if not isinstance(value, int) and not math.isinf(value): - raise TypeError("total_tokens must be an int or math.inf") - if value < 1: - raise ValueError("total_tokens must be >= 1") - - waiters_to_notify = max(value - self._total_tokens, 0) - self._total_tokens = value - - # Notify waiting tasks that they have acquired the limiter - while self._wait_queue and waiters_to_notify: - event = self._wait_queue.popitem(last=False)[1] - event.set() - waiters_to_notify -= 1 - - @property - def borrowed_tokens(self) -> int: - return len(self._borrowers) - - @property - def available_tokens(self) -> float: - return self._total_tokens - len(self._borrowers) - - def acquire_nowait(self) -> None: - self.acquire_on_behalf_of_nowait(current_task()) - - def acquire_on_behalf_of_nowait(self, borrower: object) -> None: - if borrower in self._borrowers: - raise RuntimeError( - "this borrower is already holding one of this CapacityLimiter's tokens" - ) - - if self._wait_queue or len(self._borrowers) >= self._total_tokens: - raise WouldBlock - - self._borrowers.add(borrower) - - async def acquire(self) -> None: - return await self.acquire_on_behalf_of(current_task()) - - async def acquire_on_behalf_of(self, borrower: object) -> None: - await AsyncIOBackend.checkpoint_if_cancelled() - try: - self.acquire_on_behalf_of_nowait(borrower) - except WouldBlock: - event = asyncio.Event() - self._wait_queue[borrower] = event - try: - await event.wait() - except BaseException: - self._wait_queue.pop(borrower, None) - raise - - self._borrowers.add(borrower) - else: - try: - await AsyncIOBackend.cancel_shielded_checkpoint() - except BaseException: - self.release() - raise - - def release(self) -> None: - self.release_on_behalf_of(current_task()) - - def release_on_behalf_of(self, borrower: object) -> None: - try: - self._borrowers.remove(borrower) - except KeyError: - raise RuntimeError( - "this borrower isn't holding any of this CapacityLimiter's tokens" - ) from None - - # Notify the next task in line if this limiter has free capacity now - if self._wait_queue and len(self._borrowers) < self._total_tokens: - event = self._wait_queue.popitem(last=False)[1] - event.set() - - def statistics(self) -> CapacityLimiterStatistics: - return CapacityLimiterStatistics( - self.borrowed_tokens, - self.total_tokens, - tuple(self._borrowers), - len(self._wait_queue), - ) - - -_default_thread_limiter: RunVar[CapacityLimiter] = RunVar("_default_thread_limiter") - - -# -# Operating system signals -# - - -class _SignalReceiver: - def __init__(self, signals: tuple[Signals, ...]): - self._signals = signals - self._loop = get_running_loop() - self._signal_queue: deque[Signals] = deque() - self._future: asyncio.Future = asyncio.Future() - self._handled_signals: set[Signals] = set() - - def _deliver(self, signum: Signals) -> None: - self._signal_queue.append(signum) - if not self._future.done(): - self._future.set_result(None) - - def __enter__(self) -> _SignalReceiver: - for sig in set(self._signals): - self._loop.add_signal_handler(sig, self._deliver, sig) - self._handled_signals.add(sig) - - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - for sig in self._handled_signals: - self._loop.remove_signal_handler(sig) - - def __aiter__(self) -> _SignalReceiver: - return self - - async def __anext__(self) -> Signals: - await AsyncIOBackend.checkpoint() - if not self._signal_queue: - self._future = asyncio.Future() - await self._future - - return self._signal_queue.popleft() - - -# -# Testing and debugging -# - - -class AsyncIOTaskInfo(TaskInfo): - def __init__(self, task: asyncio.Task): - task_state = _task_states.get(task) - if task_state is None: - parent_id = None - else: - parent_id = task_state.parent_id - - coro = task.get_coro() - assert coro is not None, "created TaskInfo from a completed Task" - super().__init__(id(task), parent_id, task.get_name(), coro) - self._task = weakref.ref(task) - - def has_pending_cancellation(self) -> bool: - if not (task := self._task()): - # If the task isn't around anymore, it won't have a pending cancellation - return False - - if task._must_cancel: # type: ignore[attr-defined] - return True - elif ( - isinstance(task._fut_waiter, asyncio.Future) # type: ignore[attr-defined] - and task._fut_waiter.cancelled() # type: ignore[attr-defined] - ): - return True - - if task_state := _task_states.get(task): - if cancel_scope := task_state.cancel_scope: - return cancel_scope._effectively_cancelled - - return False - - -class TestRunner(abc.TestRunner): - _send_stream: MemoryObjectSendStream[tuple[Awaitable[Any], asyncio.Future[Any]]] - - def __init__( - self, - *, - debug: bool | None = None, - use_uvloop: bool = False, - loop_factory: Callable[[], AbstractEventLoop] | None = None, - ) -> None: - if use_uvloop and loop_factory is None: - import uvloop - - loop_factory = uvloop.new_event_loop - - self._runner = Runner(debug=debug, loop_factory=loop_factory) - self._exceptions: list[BaseException] = [] - self._runner_task: asyncio.Task | None = None - - def __enter__(self) -> TestRunner: - self._runner.__enter__() - self.get_loop().set_exception_handler(self._exception_handler) - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - self._runner.__exit__(exc_type, exc_val, exc_tb) - - def get_loop(self) -> AbstractEventLoop: - return self._runner.get_loop() - - def _exception_handler( - self, loop: asyncio.AbstractEventLoop, context: dict[str, Any] - ) -> None: - if isinstance(context.get("exception"), Exception): - self._exceptions.append(context["exception"]) - else: - loop.default_exception_handler(context) - - def _raise_async_exceptions(self) -> None: - # Re-raise any exceptions raised in asynchronous callbacks - if self._exceptions: - exceptions, self._exceptions = self._exceptions, [] - if len(exceptions) == 1: - raise exceptions[0] - elif exceptions: - raise BaseExceptionGroup( - "Multiple exceptions occurred in asynchronous callbacks", exceptions - ) - - async def _run_tests_and_fixtures( - self, - receive_stream: MemoryObjectReceiveStream[ - tuple[Awaitable[T_Retval], asyncio.Future[T_Retval]] - ], - ) -> None: - from _pytest.outcomes import OutcomeException - - with receive_stream, self._send_stream: - async for coro, future in receive_stream: - try: - retval = await coro - except CancelledError as exc: - if not future.cancelled(): - future.cancel(*exc.args) - - raise - except BaseException as exc: - if not future.cancelled(): - future.set_exception(exc) - - if not isinstance(exc, (Exception, OutcomeException)): - raise - else: - if not future.cancelled(): - future.set_result(retval) - - async def _call_in_runner_task( - self, - func: Callable[P, Awaitable[T_Retval]], - *args: P.args, - **kwargs: P.kwargs, - ) -> T_Retval: - if not self._runner_task: - self._send_stream, receive_stream = create_memory_object_stream[ - tuple[Awaitable[Any], asyncio.Future] - ](1) - self._runner_task = self.get_loop().create_task( - self._run_tests_and_fixtures(receive_stream) - ) - - coro = func(*args, **kwargs) - future: asyncio.Future[T_Retval] = self.get_loop().create_future() - self._send_stream.send_nowait((coro, future)) - return await future - - def run_asyncgen_fixture( - self, - fixture_func: Callable[..., AsyncGenerator[T_Retval, Any]], - kwargs: dict[str, Any], - ) -> Iterable[T_Retval]: - asyncgen = fixture_func(**kwargs) - fixturevalue: T_Retval = self.get_loop().run_until_complete( - self._call_in_runner_task(asyncgen.asend, None) - ) - self._raise_async_exceptions() - - yield fixturevalue - - try: - self.get_loop().run_until_complete( - self._call_in_runner_task(asyncgen.asend, None) - ) - except StopAsyncIteration: - self._raise_async_exceptions() - else: - self.get_loop().run_until_complete(asyncgen.aclose()) - raise RuntimeError("Async generator fixture did not stop") - - def run_fixture( - self, - fixture_func: Callable[..., Coroutine[Any, Any, T_Retval]], - kwargs: dict[str, Any], - ) -> T_Retval: - retval = self.get_loop().run_until_complete( - self._call_in_runner_task(fixture_func, **kwargs) - ) - self._raise_async_exceptions() - return retval - - def run_test( - self, test_func: Callable[..., Coroutine[Any, Any, Any]], kwargs: dict[str, Any] - ) -> None: - try: - self.get_loop().run_until_complete( - self._call_in_runner_task(test_func, **kwargs) - ) - except Exception as exc: - self._exceptions.append(exc) - - self._raise_async_exceptions() - - -class AsyncIOBackend(AsyncBackend): - @classmethod - def run( - cls, - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], - args: tuple[Unpack[PosArgsT]], - kwargs: dict[str, Any], - options: dict[str, Any], - ) -> T_Retval: - @wraps(func) - async def wrapper() -> T_Retval: - task = cast(asyncio.Task, current_task()) - task.set_name(get_callable_name(func)) - _task_states[task] = TaskState(None, None) - - try: - return await func(*args) - finally: - del _task_states[task] - - debug = options.get("debug", None) - loop_factory = options.get("loop_factory", None) - if loop_factory is None and options.get("use_uvloop", False): - import uvloop - - loop_factory = uvloop.new_event_loop - - with Runner(debug=debug, loop_factory=loop_factory) as runner: - return runner.run(wrapper()) - - @classmethod - def current_token(cls) -> object: - return get_running_loop() - - @classmethod - def current_time(cls) -> float: - return get_running_loop().time() - - @classmethod - def cancelled_exception_class(cls) -> type[BaseException]: - return CancelledError - - @classmethod - async def checkpoint(cls) -> None: - await sleep(0) - - @classmethod - async def checkpoint_if_cancelled(cls) -> None: - task = current_task() - if task is None: - return - - try: - cancel_scope = _task_states[task].cancel_scope - except KeyError: - return - - while cancel_scope: - if cancel_scope.cancel_called: - await sleep(0) - elif cancel_scope.shield: - break - else: - cancel_scope = cancel_scope._parent_scope - - @classmethod - async def cancel_shielded_checkpoint(cls) -> None: - with CancelScope(shield=True): - await sleep(0) - - @classmethod - async def sleep(cls, delay: float) -> None: - await sleep(delay) - - @classmethod - def create_cancel_scope( - cls, *, deadline: float = math.inf, shield: bool = False - ) -> CancelScope: - return CancelScope(deadline=deadline, shield=shield) - - @classmethod - def current_effective_deadline(cls) -> float: - if (task := current_task()) is None: - return math.inf - - try: - cancel_scope = _task_states[task].cancel_scope - except KeyError: - return math.inf - - deadline = math.inf - while cancel_scope: - deadline = min(deadline, cancel_scope.deadline) - if cancel_scope._cancel_called: - deadline = -math.inf - break - elif cancel_scope.shield: - break - else: - cancel_scope = cancel_scope._parent_scope - - return deadline - - @classmethod - def create_task_group(cls) -> abc.TaskGroup: - return TaskGroup() - - @classmethod - def create_event(cls) -> abc.Event: - return Event() - - @classmethod - def create_lock(cls, *, fast_acquire: bool) -> abc.Lock: - return Lock(fast_acquire=fast_acquire) - - @classmethod - def create_semaphore( - cls, - initial_value: int, - *, - max_value: int | None = None, - fast_acquire: bool = False, - ) -> abc.Semaphore: - return Semaphore(initial_value, max_value=max_value, fast_acquire=fast_acquire) - - @classmethod - def create_capacity_limiter(cls, total_tokens: float) -> abc.CapacityLimiter: - return CapacityLimiter(total_tokens) - - @classmethod - async def run_sync_in_worker_thread( # type: ignore[return] - cls, - func: Callable[[Unpack[PosArgsT]], T_Retval], - args: tuple[Unpack[PosArgsT]], - abandon_on_cancel: bool = False, - limiter: abc.CapacityLimiter | None = None, - ) -> T_Retval: - await cls.checkpoint() - - # If this is the first run in this event loop thread, set up the necessary - # variables - try: - idle_workers = _threadpool_idle_workers.get() - workers = _threadpool_workers.get() - except LookupError: - idle_workers = deque() - workers = set() - _threadpool_idle_workers.set(idle_workers) - _threadpool_workers.set(workers) - - async with limiter or cls.current_default_thread_limiter(): - with CancelScope(shield=not abandon_on_cancel) as scope: - future = asyncio.Future[T_Retval]() - root_task = find_root_task() - if not idle_workers: - worker = WorkerThread(root_task, workers, idle_workers) - worker.start() - workers.add(worker) - root_task.add_done_callback( - worker.stop, context=contextvars.Context() - ) - else: - worker = idle_workers.pop() - - # Prune any other workers that have been idle for MAX_IDLE_TIME - # seconds or longer - now = cls.current_time() - while idle_workers: - if ( - now - idle_workers[0].idle_since - < WorkerThread.MAX_IDLE_TIME - ): - break - - expired_worker = idle_workers.popleft() - expired_worker.root_task.remove_done_callback( - expired_worker.stop - ) - expired_worker.stop() - - context = copy_context() - context.run(sniffio.current_async_library_cvar.set, None) - if abandon_on_cancel or scope._parent_scope is None: - worker_scope = scope - else: - worker_scope = scope._parent_scope - - worker.queue.put_nowait((context, func, args, future, worker_scope)) - return await future - - @classmethod - def check_cancelled(cls) -> None: - scope: CancelScope | None = threadlocals.current_cancel_scope - while scope is not None: - if scope.cancel_called: - raise CancelledError(f"Cancelled by cancel scope {id(scope):x}") - - if scope.shield: - return - - scope = scope._parent_scope - - @classmethod - def run_async_from_thread( - cls, - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], - args: tuple[Unpack[PosArgsT]], - token: object, - ) -> T_Retval: - async def task_wrapper(scope: CancelScope) -> T_Retval: - __tracebackhide__ = True - task = cast(asyncio.Task, current_task()) - _task_states[task] = TaskState(None, scope) - scope._tasks.add(task) - try: - return await func(*args) - except CancelledError as exc: - raise concurrent.futures.CancelledError(str(exc)) from None - finally: - scope._tasks.discard(task) - - loop = cast(AbstractEventLoop, token) - context = copy_context() - context.run(sniffio.current_async_library_cvar.set, "asyncio") - wrapper = task_wrapper(threadlocals.current_cancel_scope) - f: concurrent.futures.Future[T_Retval] = context.run( - asyncio.run_coroutine_threadsafe, wrapper, loop - ) - return f.result() - - @classmethod - def run_sync_from_thread( - cls, - func: Callable[[Unpack[PosArgsT]], T_Retval], - args: tuple[Unpack[PosArgsT]], - token: object, - ) -> T_Retval: - @wraps(func) - def wrapper() -> None: - try: - sniffio.current_async_library_cvar.set("asyncio") - f.set_result(func(*args)) - except BaseException as exc: - f.set_exception(exc) - if not isinstance(exc, Exception): - raise - - f: concurrent.futures.Future[T_Retval] = Future() - loop = cast(AbstractEventLoop, token) - loop.call_soon_threadsafe(wrapper) - return f.result() - - @classmethod - def create_blocking_portal(cls) -> abc.BlockingPortal: - return BlockingPortal() - - @classmethod - async def open_process( - cls, - command: StrOrBytesPath | Sequence[StrOrBytesPath], - *, - stdin: int | IO[Any] | None, - stdout: int | IO[Any] | None, - stderr: int | IO[Any] | None, - **kwargs: Any, - ) -> Process: - await cls.checkpoint() - if isinstance(command, PathLike): - command = os.fspath(command) - - if isinstance(command, (str, bytes)): - process = await asyncio.create_subprocess_shell( - command, - stdin=stdin, - stdout=stdout, - stderr=stderr, - **kwargs, - ) - else: - process = await asyncio.create_subprocess_exec( - *command, - stdin=stdin, - stdout=stdout, - stderr=stderr, - **kwargs, - ) - - stdin_stream = StreamWriterWrapper(process.stdin) if process.stdin else None - stdout_stream = StreamReaderWrapper(process.stdout) if process.stdout else None - stderr_stream = StreamReaderWrapper(process.stderr) if process.stderr else None - return Process(process, stdin_stream, stdout_stream, stderr_stream) - - @classmethod - def setup_process_pool_exit_at_shutdown(cls, workers: set[abc.Process]) -> None: - create_task( - _shutdown_process_pool_on_exit(workers), - name="AnyIO process pool shutdown task", - ) - find_root_task().add_done_callback( - partial(_forcibly_shutdown_process_pool_on_exit, workers) # type:ignore[arg-type] - ) - - @classmethod - async def connect_tcp( - cls, host: str, port: int, local_address: IPSockAddrType | None = None - ) -> abc.SocketStream: - transport, protocol = cast( - tuple[asyncio.Transport, StreamProtocol], - await get_running_loop().create_connection( - StreamProtocol, host, port, local_addr=local_address - ), - ) - transport.pause_reading() - return SocketStream(transport, protocol) - - @classmethod - async def connect_unix(cls, path: str | bytes) -> abc.UNIXSocketStream: - await cls.checkpoint() - loop = get_running_loop() - raw_socket = socket.socket(socket.AF_UNIX) - raw_socket.setblocking(False) - while True: - try: - raw_socket.connect(path) - except BlockingIOError: - f: asyncio.Future = asyncio.Future() - loop.add_writer(raw_socket, f.set_result, None) - f.add_done_callback(lambda _: loop.remove_writer(raw_socket)) - await f - except BaseException: - raw_socket.close() - raise - else: - return UNIXSocketStream(raw_socket) - - @classmethod - def create_tcp_listener(cls, sock: socket.socket) -> SocketListener: - return TCPSocketListener(sock) - - @classmethod - def create_unix_listener(cls, sock: socket.socket) -> SocketListener: - return UNIXSocketListener(sock) - - @classmethod - async def create_udp_socket( - cls, - family: AddressFamily, - local_address: IPSockAddrType | None, - remote_address: IPSockAddrType | None, - reuse_port: bool, - ) -> UDPSocket | ConnectedUDPSocket: - transport, protocol = await get_running_loop().create_datagram_endpoint( - DatagramProtocol, - local_addr=local_address, - remote_addr=remote_address, - family=family, - reuse_port=reuse_port, - ) - if protocol.exception: - transport.close() - raise protocol.exception - - if not remote_address: - return UDPSocket(transport, protocol) - else: - return ConnectedUDPSocket(transport, protocol) - - @classmethod - async def create_unix_datagram_socket( # type: ignore[override] - cls, raw_socket: socket.socket, remote_path: str | bytes | None - ) -> abc.UNIXDatagramSocket | abc.ConnectedUNIXDatagramSocket: - await cls.checkpoint() - loop = get_running_loop() - - if remote_path: - while True: - try: - raw_socket.connect(remote_path) - except BlockingIOError: - f: asyncio.Future = asyncio.Future() - loop.add_writer(raw_socket, f.set_result, None) - f.add_done_callback(lambda _: loop.remove_writer(raw_socket)) - await f - except BaseException: - raw_socket.close() - raise - else: - return ConnectedUNIXDatagramSocket(raw_socket) - else: - return UNIXDatagramSocket(raw_socket) - - @classmethod - async def getaddrinfo( - cls, - host: bytes | str | None, - port: str | int | None, - *, - family: int | AddressFamily = 0, - type: int | SocketKind = 0, - proto: int = 0, - flags: int = 0, - ) -> Sequence[ - tuple[ - AddressFamily, - SocketKind, - int, - str, - tuple[str, int] | tuple[str, int, int, int] | tuple[int, bytes], - ] - ]: - return await get_running_loop().getaddrinfo( - host, port, family=family, type=type, proto=proto, flags=flags - ) - - @classmethod - async def getnameinfo( - cls, sockaddr: IPSockAddrType, flags: int = 0 - ) -> tuple[str, str]: - return await get_running_loop().getnameinfo(sockaddr, flags) - - @classmethod - async def wait_readable(cls, obj: FileDescriptorLike) -> None: - await cls.checkpoint() - try: - read_events = _read_events.get() - except LookupError: - read_events = {} - _read_events.set(read_events) - - if not isinstance(obj, int): - obj = obj.fileno() - - if read_events.get(obj): - raise BusyResourceError("reading from") - - loop = get_running_loop() - event = asyncio.Event() - try: - loop.add_reader(obj, event.set) - except NotImplementedError: - from anyio._core._asyncio_selector_thread import get_selector - - selector = get_selector() - selector.add_reader(obj, event.set) - remove_reader = selector.remove_reader - else: - remove_reader = loop.remove_reader - - read_events[obj] = event - try: - await event.wait() - finally: - remove_reader(obj) - del read_events[obj] - - @classmethod - async def wait_writable(cls, obj: FileDescriptorLike) -> None: - await cls.checkpoint() - try: - write_events = _write_events.get() - except LookupError: - write_events = {} - _write_events.set(write_events) - - if not isinstance(obj, int): - obj = obj.fileno() - - if write_events.get(obj): - raise BusyResourceError("writing to") - - loop = get_running_loop() - event = asyncio.Event() - try: - loop.add_writer(obj, event.set) - except NotImplementedError: - from anyio._core._asyncio_selector_thread import get_selector - - selector = get_selector() - selector.add_writer(obj, event.set) - remove_writer = selector.remove_writer - else: - remove_writer = loop.remove_writer - - write_events[obj] = event - try: - await event.wait() - finally: - del write_events[obj] - remove_writer(obj) - - @classmethod - def current_default_thread_limiter(cls) -> CapacityLimiter: - try: - return _default_thread_limiter.get() - except LookupError: - limiter = CapacityLimiter(40) - _default_thread_limiter.set(limiter) - return limiter - - @classmethod - def open_signal_receiver( - cls, *signals: Signals - ) -> AbstractContextManager[AsyncIterator[Signals]]: - return _SignalReceiver(signals) - - @classmethod - def get_current_task(cls) -> TaskInfo: - return AsyncIOTaskInfo(current_task()) # type: ignore[arg-type] - - @classmethod - def get_running_tasks(cls) -> Sequence[TaskInfo]: - return [AsyncIOTaskInfo(task) for task in all_tasks() if not task.done()] - - @classmethod - async def wait_all_tasks_blocked(cls) -> None: - await cls.checkpoint() - this_task = current_task() - while True: - for task in all_tasks(): - if task is this_task: - continue - - waiter = task._fut_waiter # type: ignore[attr-defined] - if waiter is None or waiter.done(): - await sleep(0.1) - break - else: - return - - @classmethod - def create_test_runner(cls, options: dict[str, Any]) -> TestRunner: - return TestRunner(**options) - - -backend_class = AsyncIOBackend diff --git a/venv/lib/python3.11/site-packages/anyio/_backends/_trio.py b/venv/lib/python3.11/site-packages/anyio/_backends/_trio.py deleted file mode 100644 index b80cc04..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_backends/_trio.py +++ /dev/null @@ -1,1334 +0,0 @@ -from __future__ import annotations - -import array -import math -import os -import socket -import sys -import types -import weakref -from collections.abc import ( - AsyncGenerator, - AsyncIterator, - Awaitable, - Callable, - Collection, - Coroutine, - Iterable, - Sequence, -) -from concurrent.futures import Future -from contextlib import AbstractContextManager -from dataclasses import dataclass -from functools import partial -from io import IOBase -from os import PathLike -from signal import Signals -from socket import AddressFamily, SocketKind -from types import TracebackType -from typing import ( - IO, - TYPE_CHECKING, - Any, - Generic, - NoReturn, - TypeVar, - cast, - overload, -) - -import trio.from_thread -import trio.lowlevel -from outcome import Error, Outcome, Value -from trio.lowlevel import ( - current_root_task, - current_task, - wait_readable, - wait_writable, -) -from trio.socket import SocketType as TrioSocketType -from trio.to_thread import run_sync - -from .. import ( - CapacityLimiterStatistics, - EventStatistics, - LockStatistics, - TaskInfo, - WouldBlock, - abc, -) -from .._core._eventloop import claim_worker_thread -from .._core._exceptions import ( - BrokenResourceError, - BusyResourceError, - ClosedResourceError, - EndOfStream, -) -from .._core._sockets import convert_ipv6_sockaddr -from .._core._streams import create_memory_object_stream -from .._core._synchronization import ( - CapacityLimiter as BaseCapacityLimiter, -) -from .._core._synchronization import Event as BaseEvent -from .._core._synchronization import Lock as BaseLock -from .._core._synchronization import ( - ResourceGuard, - SemaphoreStatistics, -) -from .._core._synchronization import Semaphore as BaseSemaphore -from .._core._tasks import CancelScope as BaseCancelScope -from ..abc import IPSockAddrType, UDPPacketType, UNIXDatagramPacketType -from ..abc._eventloop import AsyncBackend, StrOrBytesPath -from ..streams.memory import MemoryObjectSendStream - -if TYPE_CHECKING: - from _typeshed import HasFileno - -if sys.version_info >= (3, 10): - from typing import ParamSpec -else: - from typing_extensions import ParamSpec - -if sys.version_info >= (3, 11): - from typing import TypeVarTuple, Unpack -else: - from exceptiongroup import BaseExceptionGroup - from typing_extensions import TypeVarTuple, Unpack - -T = TypeVar("T") -T_Retval = TypeVar("T_Retval") -T_SockAddr = TypeVar("T_SockAddr", str, IPSockAddrType) -PosArgsT = TypeVarTuple("PosArgsT") -P = ParamSpec("P") - - -# -# Event loop -# - -RunVar = trio.lowlevel.RunVar - - -# -# Timeouts and cancellation -# - - -class CancelScope(BaseCancelScope): - def __new__( - cls, original: trio.CancelScope | None = None, **kwargs: object - ) -> CancelScope: - return object.__new__(cls) - - def __init__(self, original: trio.CancelScope | None = None, **kwargs: Any) -> None: - self.__original = original or trio.CancelScope(**kwargs) - - def __enter__(self) -> CancelScope: - self.__original.__enter__() - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> bool: - return self.__original.__exit__(exc_type, exc_val, exc_tb) - - def cancel(self) -> None: - self.__original.cancel() - - @property - def deadline(self) -> float: - return self.__original.deadline - - @deadline.setter - def deadline(self, value: float) -> None: - self.__original.deadline = value - - @property - def cancel_called(self) -> bool: - return self.__original.cancel_called - - @property - def cancelled_caught(self) -> bool: - return self.__original.cancelled_caught - - @property - def shield(self) -> bool: - return self.__original.shield - - @shield.setter - def shield(self, value: bool) -> None: - self.__original.shield = value - - -# -# Task groups -# - - -class TaskGroup(abc.TaskGroup): - def __init__(self) -> None: - self._active = False - self._nursery_manager = trio.open_nursery(strict_exception_groups=True) - self.cancel_scope = None # type: ignore[assignment] - - async def __aenter__(self) -> TaskGroup: - self._active = True - self._nursery = await self._nursery_manager.__aenter__() - self.cancel_scope = CancelScope(self._nursery.cancel_scope) - return self - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> bool: - try: - # trio.Nursery.__exit__ returns bool; .open_nursery has wrong type - return await self._nursery_manager.__aexit__(exc_type, exc_val, exc_tb) # type: ignore[return-value] - except BaseExceptionGroup as exc: - if not exc.split(trio.Cancelled)[1]: - raise trio.Cancelled._create() from exc - - raise - finally: - del exc_val, exc_tb - self._active = False - - def start_soon( - self, - func: Callable[[Unpack[PosArgsT]], Awaitable[Any]], - *args: Unpack[PosArgsT], - name: object = None, - ) -> None: - if not self._active: - raise RuntimeError( - "This task group is not active; no new tasks can be started." - ) - - self._nursery.start_soon(func, *args, name=name) - - async def start( - self, func: Callable[..., Awaitable[Any]], *args: object, name: object = None - ) -> Any: - if not self._active: - raise RuntimeError( - "This task group is not active; no new tasks can be started." - ) - - return await self._nursery.start(func, *args, name=name) - - -# -# Threads -# - - -class BlockingPortal(abc.BlockingPortal): - def __new__(cls) -> BlockingPortal: - return object.__new__(cls) - - def __init__(self) -> None: - super().__init__() - self._token = trio.lowlevel.current_trio_token() - - def _spawn_task_from_thread( - self, - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval] | T_Retval], - args: tuple[Unpack[PosArgsT]], - kwargs: dict[str, Any], - name: object, - future: Future[T_Retval], - ) -> None: - trio.from_thread.run_sync( - partial(self._task_group.start_soon, name=name), - self._call_func, - func, - args, - kwargs, - future, - trio_token=self._token, - ) - - -# -# Subprocesses -# - - -@dataclass(eq=False) -class ReceiveStreamWrapper(abc.ByteReceiveStream): - _stream: trio.abc.ReceiveStream - - async def receive(self, max_bytes: int | None = None) -> bytes: - try: - data = await self._stream.receive_some(max_bytes) - except trio.ClosedResourceError as exc: - raise ClosedResourceError from exc.__cause__ - except trio.BrokenResourceError as exc: - raise BrokenResourceError from exc.__cause__ - - if data: - return data - else: - raise EndOfStream - - async def aclose(self) -> None: - await self._stream.aclose() - - -@dataclass(eq=False) -class SendStreamWrapper(abc.ByteSendStream): - _stream: trio.abc.SendStream - - async def send(self, item: bytes) -> None: - try: - await self._stream.send_all(item) - except trio.ClosedResourceError as exc: - raise ClosedResourceError from exc.__cause__ - except trio.BrokenResourceError as exc: - raise BrokenResourceError from exc.__cause__ - - async def aclose(self) -> None: - await self._stream.aclose() - - -@dataclass(eq=False) -class Process(abc.Process): - _process: trio.Process - _stdin: abc.ByteSendStream | None - _stdout: abc.ByteReceiveStream | None - _stderr: abc.ByteReceiveStream | None - - async def aclose(self) -> None: - with CancelScope(shield=True): - if self._stdin: - await self._stdin.aclose() - if self._stdout: - await self._stdout.aclose() - if self._stderr: - await self._stderr.aclose() - - try: - await self.wait() - except BaseException: - self.kill() - with CancelScope(shield=True): - await self.wait() - raise - - async def wait(self) -> int: - return await self._process.wait() - - def terminate(self) -> None: - self._process.terminate() - - def kill(self) -> None: - self._process.kill() - - def send_signal(self, signal: Signals) -> None: - self._process.send_signal(signal) - - @property - def pid(self) -> int: - return self._process.pid - - @property - def returncode(self) -> int | None: - return self._process.returncode - - @property - def stdin(self) -> abc.ByteSendStream | None: - return self._stdin - - @property - def stdout(self) -> abc.ByteReceiveStream | None: - return self._stdout - - @property - def stderr(self) -> abc.ByteReceiveStream | None: - return self._stderr - - -class _ProcessPoolShutdownInstrument(trio.abc.Instrument): - def after_run(self) -> None: - super().after_run() - - -current_default_worker_process_limiter: trio.lowlevel.RunVar = RunVar( - "current_default_worker_process_limiter" -) - - -async def _shutdown_process_pool(workers: set[abc.Process]) -> None: - try: - await trio.sleep(math.inf) - except trio.Cancelled: - for process in workers: - if process.returncode is None: - process.kill() - - with CancelScope(shield=True): - for process in workers: - await process.aclose() - - -# -# Sockets and networking -# - - -class _TrioSocketMixin(Generic[T_SockAddr]): - def __init__(self, trio_socket: TrioSocketType) -> None: - self._trio_socket = trio_socket - self._closed = False - - def _check_closed(self) -> None: - if self._closed: - raise ClosedResourceError - if self._trio_socket.fileno() < 0: - raise BrokenResourceError - - @property - def _raw_socket(self) -> socket.socket: - return self._trio_socket._sock # type: ignore[attr-defined] - - async def aclose(self) -> None: - if self._trio_socket.fileno() >= 0: - self._closed = True - self._trio_socket.close() - - def _convert_socket_error(self, exc: BaseException) -> NoReturn: - if isinstance(exc, trio.ClosedResourceError): - raise ClosedResourceError from exc - elif self._trio_socket.fileno() < 0 and self._closed: - raise ClosedResourceError from None - elif isinstance(exc, OSError): - raise BrokenResourceError from exc - else: - raise exc - - -class SocketStream(_TrioSocketMixin, abc.SocketStream): - def __init__(self, trio_socket: TrioSocketType) -> None: - super().__init__(trio_socket) - self._receive_guard = ResourceGuard("reading from") - self._send_guard = ResourceGuard("writing to") - - async def receive(self, max_bytes: int = 65536) -> bytes: - with self._receive_guard: - try: - data = await self._trio_socket.recv(max_bytes) - except BaseException as exc: - self._convert_socket_error(exc) - - if data: - return data - else: - raise EndOfStream - - async def send(self, item: bytes) -> None: - with self._send_guard: - view = memoryview(item) - while view: - try: - bytes_sent = await self._trio_socket.send(view) - except BaseException as exc: - self._convert_socket_error(exc) - - view = view[bytes_sent:] - - async def send_eof(self) -> None: - self._trio_socket.shutdown(socket.SHUT_WR) - - -class UNIXSocketStream(SocketStream, abc.UNIXSocketStream): - async def receive_fds(self, msglen: int, maxfds: int) -> tuple[bytes, list[int]]: - if not isinstance(msglen, int) or msglen < 0: - raise ValueError("msglen must be a non-negative integer") - if not isinstance(maxfds, int) or maxfds < 1: - raise ValueError("maxfds must be a positive integer") - - fds = array.array("i") - await trio.lowlevel.checkpoint() - with self._receive_guard: - while True: - try: - message, ancdata, flags, addr = await self._trio_socket.recvmsg( - msglen, socket.CMSG_LEN(maxfds * fds.itemsize) - ) - except BaseException as exc: - self._convert_socket_error(exc) - else: - if not message and not ancdata: - raise EndOfStream - - break - - for cmsg_level, cmsg_type, cmsg_data in ancdata: - if cmsg_level != socket.SOL_SOCKET or cmsg_type != socket.SCM_RIGHTS: - raise RuntimeError( - f"Received unexpected ancillary data; message = {message!r}, " - f"cmsg_level = {cmsg_level}, cmsg_type = {cmsg_type}" - ) - - fds.frombytes(cmsg_data[: len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) - - return message, list(fds) - - async def send_fds(self, message: bytes, fds: Collection[int | IOBase]) -> None: - if not message: - raise ValueError("message must not be empty") - if not fds: - raise ValueError("fds must not be empty") - - filenos: list[int] = [] - for fd in fds: - if isinstance(fd, int): - filenos.append(fd) - elif isinstance(fd, IOBase): - filenos.append(fd.fileno()) - - fdarray = array.array("i", filenos) - await trio.lowlevel.checkpoint() - with self._send_guard: - while True: - try: - await self._trio_socket.sendmsg( - [message], - [ - ( - socket.SOL_SOCKET, - socket.SCM_RIGHTS, - fdarray, - ) - ], - ) - break - except BaseException as exc: - self._convert_socket_error(exc) - - -class TCPSocketListener(_TrioSocketMixin, abc.SocketListener): - def __init__(self, raw_socket: socket.socket): - super().__init__(trio.socket.from_stdlib_socket(raw_socket)) - self._accept_guard = ResourceGuard("accepting connections from") - - async def accept(self) -> SocketStream: - with self._accept_guard: - try: - trio_socket, _addr = await self._trio_socket.accept() - except BaseException as exc: - self._convert_socket_error(exc) - - trio_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) - return SocketStream(trio_socket) - - -class UNIXSocketListener(_TrioSocketMixin, abc.SocketListener): - def __init__(self, raw_socket: socket.socket): - super().__init__(trio.socket.from_stdlib_socket(raw_socket)) - self._accept_guard = ResourceGuard("accepting connections from") - - async def accept(self) -> UNIXSocketStream: - with self._accept_guard: - try: - trio_socket, _addr = await self._trio_socket.accept() - except BaseException as exc: - self._convert_socket_error(exc) - - return UNIXSocketStream(trio_socket) - - -class UDPSocket(_TrioSocketMixin[IPSockAddrType], abc.UDPSocket): - def __init__(self, trio_socket: TrioSocketType) -> None: - super().__init__(trio_socket) - self._receive_guard = ResourceGuard("reading from") - self._send_guard = ResourceGuard("writing to") - - async def receive(self) -> tuple[bytes, IPSockAddrType]: - with self._receive_guard: - try: - data, addr = await self._trio_socket.recvfrom(65536) - return data, convert_ipv6_sockaddr(addr) - except BaseException as exc: - self._convert_socket_error(exc) - - async def send(self, item: UDPPacketType) -> None: - with self._send_guard: - try: - await self._trio_socket.sendto(*item) - except BaseException as exc: - self._convert_socket_error(exc) - - -class ConnectedUDPSocket(_TrioSocketMixin[IPSockAddrType], abc.ConnectedUDPSocket): - def __init__(self, trio_socket: TrioSocketType) -> None: - super().__init__(trio_socket) - self._receive_guard = ResourceGuard("reading from") - self._send_guard = ResourceGuard("writing to") - - async def receive(self) -> bytes: - with self._receive_guard: - try: - return await self._trio_socket.recv(65536) - except BaseException as exc: - self._convert_socket_error(exc) - - async def send(self, item: bytes) -> None: - with self._send_guard: - try: - await self._trio_socket.send(item) - except BaseException as exc: - self._convert_socket_error(exc) - - -class UNIXDatagramSocket(_TrioSocketMixin[str], abc.UNIXDatagramSocket): - def __init__(self, trio_socket: TrioSocketType) -> None: - super().__init__(trio_socket) - self._receive_guard = ResourceGuard("reading from") - self._send_guard = ResourceGuard("writing to") - - async def receive(self) -> UNIXDatagramPacketType: - with self._receive_guard: - try: - data, addr = await self._trio_socket.recvfrom(65536) - return data, addr - except BaseException as exc: - self._convert_socket_error(exc) - - async def send(self, item: UNIXDatagramPacketType) -> None: - with self._send_guard: - try: - await self._trio_socket.sendto(*item) - except BaseException as exc: - self._convert_socket_error(exc) - - -class ConnectedUNIXDatagramSocket( - _TrioSocketMixin[str], abc.ConnectedUNIXDatagramSocket -): - def __init__(self, trio_socket: TrioSocketType) -> None: - super().__init__(trio_socket) - self._receive_guard = ResourceGuard("reading from") - self._send_guard = ResourceGuard("writing to") - - async def receive(self) -> bytes: - with self._receive_guard: - try: - return await self._trio_socket.recv(65536) - except BaseException as exc: - self._convert_socket_error(exc) - - async def send(self, item: bytes) -> None: - with self._send_guard: - try: - await self._trio_socket.send(item) - except BaseException as exc: - self._convert_socket_error(exc) - - -# -# Synchronization -# - - -class Event(BaseEvent): - def __new__(cls) -> Event: - return object.__new__(cls) - - def __init__(self) -> None: - self.__original = trio.Event() - - def is_set(self) -> bool: - return self.__original.is_set() - - async def wait(self) -> None: - return await self.__original.wait() - - def statistics(self) -> EventStatistics: - orig_statistics = self.__original.statistics() - return EventStatistics(tasks_waiting=orig_statistics.tasks_waiting) - - def set(self) -> None: - self.__original.set() - - -class Lock(BaseLock): - def __new__(cls, *, fast_acquire: bool = False) -> Lock: - return object.__new__(cls) - - def __init__(self, *, fast_acquire: bool = False) -> None: - self._fast_acquire = fast_acquire - self.__original = trio.Lock() - - @staticmethod - def _convert_runtime_error_msg(exc: RuntimeError) -> None: - if exc.args == ("attempt to re-acquire an already held Lock",): - exc.args = ("Attempted to acquire an already held Lock",) - - async def acquire(self) -> None: - if not self._fast_acquire: - try: - await self.__original.acquire() - except RuntimeError as exc: - self._convert_runtime_error_msg(exc) - raise - - return - - # This is the "fast path" where we don't let other tasks run - await trio.lowlevel.checkpoint_if_cancelled() - try: - self.__original.acquire_nowait() - except trio.WouldBlock: - await self.__original._lot.park() - except RuntimeError as exc: - self._convert_runtime_error_msg(exc) - raise - - def acquire_nowait(self) -> None: - try: - self.__original.acquire_nowait() - except trio.WouldBlock: - raise WouldBlock from None - except RuntimeError as exc: - self._convert_runtime_error_msg(exc) - raise - - def locked(self) -> bool: - return self.__original.locked() - - def release(self) -> None: - self.__original.release() - - def statistics(self) -> LockStatistics: - orig_statistics = self.__original.statistics() - owner = TrioTaskInfo(orig_statistics.owner) if orig_statistics.owner else None - return LockStatistics( - orig_statistics.locked, owner, orig_statistics.tasks_waiting - ) - - -class Semaphore(BaseSemaphore): - def __new__( - cls, - initial_value: int, - *, - max_value: int | None = None, - fast_acquire: bool = False, - ) -> Semaphore: - return object.__new__(cls) - - def __init__( - self, - initial_value: int, - *, - max_value: int | None = None, - fast_acquire: bool = False, - ) -> None: - super().__init__(initial_value, max_value=max_value, fast_acquire=fast_acquire) - self.__original = trio.Semaphore(initial_value, max_value=max_value) - - async def acquire(self) -> None: - if not self._fast_acquire: - await self.__original.acquire() - return - - # This is the "fast path" where we don't let other tasks run - await trio.lowlevel.checkpoint_if_cancelled() - try: - self.__original.acquire_nowait() - except trio.WouldBlock: - await self.__original._lot.park() - - def acquire_nowait(self) -> None: - try: - self.__original.acquire_nowait() - except trio.WouldBlock: - raise WouldBlock from None - - @property - def max_value(self) -> int | None: - return self.__original.max_value - - @property - def value(self) -> int: - return self.__original.value - - def release(self) -> None: - self.__original.release() - - def statistics(self) -> SemaphoreStatistics: - orig_statistics = self.__original.statistics() - return SemaphoreStatistics(orig_statistics.tasks_waiting) - - -class CapacityLimiter(BaseCapacityLimiter): - def __new__( - cls, - total_tokens: float | None = None, - *, - original: trio.CapacityLimiter | None = None, - ) -> CapacityLimiter: - return object.__new__(cls) - - def __init__( - self, - total_tokens: float | None = None, - *, - original: trio.CapacityLimiter | None = None, - ) -> None: - if original is not None: - self.__original = original - else: - assert total_tokens is not None - self.__original = trio.CapacityLimiter(total_tokens) - - async def __aenter__(self) -> None: - return await self.__original.__aenter__() - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - await self.__original.__aexit__(exc_type, exc_val, exc_tb) - - @property - def total_tokens(self) -> float: - return self.__original.total_tokens - - @total_tokens.setter - def total_tokens(self, value: float) -> None: - self.__original.total_tokens = value - - @property - def borrowed_tokens(self) -> int: - return self.__original.borrowed_tokens - - @property - def available_tokens(self) -> float: - return self.__original.available_tokens - - def acquire_nowait(self) -> None: - self.__original.acquire_nowait() - - def acquire_on_behalf_of_nowait(self, borrower: object) -> None: - self.__original.acquire_on_behalf_of_nowait(borrower) - - async def acquire(self) -> None: - await self.__original.acquire() - - async def acquire_on_behalf_of(self, borrower: object) -> None: - await self.__original.acquire_on_behalf_of(borrower) - - def release(self) -> None: - return self.__original.release() - - def release_on_behalf_of(self, borrower: object) -> None: - return self.__original.release_on_behalf_of(borrower) - - def statistics(self) -> CapacityLimiterStatistics: - orig = self.__original.statistics() - return CapacityLimiterStatistics( - borrowed_tokens=orig.borrowed_tokens, - total_tokens=orig.total_tokens, - borrowers=tuple(orig.borrowers), - tasks_waiting=orig.tasks_waiting, - ) - - -_capacity_limiter_wrapper: trio.lowlevel.RunVar = RunVar("_capacity_limiter_wrapper") - - -# -# Signal handling -# - - -class _SignalReceiver: - _iterator: AsyncIterator[int] - - def __init__(self, signals: tuple[Signals, ...]): - self._signals = signals - - def __enter__(self) -> _SignalReceiver: - self._cm = trio.open_signal_receiver(*self._signals) - self._iterator = self._cm.__enter__() - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> bool | None: - return self._cm.__exit__(exc_type, exc_val, exc_tb) - - def __aiter__(self) -> _SignalReceiver: - return self - - async def __anext__(self) -> Signals: - signum = await self._iterator.__anext__() - return Signals(signum) - - -# -# Testing and debugging -# - - -class TestRunner(abc.TestRunner): - def __init__(self, **options: Any) -> None: - from queue import Queue - - self._call_queue: Queue[Callable[[], object]] = Queue() - self._send_stream: MemoryObjectSendStream | None = None - self._options = options - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: types.TracebackType | None, - ) -> None: - if self._send_stream: - self._send_stream.close() - while self._send_stream is not None: - self._call_queue.get()() - - async def _run_tests_and_fixtures(self) -> None: - self._send_stream, receive_stream = create_memory_object_stream(1) - with receive_stream: - async for coro, outcome_holder in receive_stream: - try: - retval = await coro - except BaseException as exc: - outcome_holder.append(Error(exc)) - else: - outcome_holder.append(Value(retval)) - - def _main_task_finished(self, outcome: object) -> None: - self._send_stream = None - - def _call_in_runner_task( - self, - func: Callable[P, Awaitable[T_Retval]], - *args: P.args, - **kwargs: P.kwargs, - ) -> T_Retval: - if self._send_stream is None: - trio.lowlevel.start_guest_run( - self._run_tests_and_fixtures, - run_sync_soon_threadsafe=self._call_queue.put, - done_callback=self._main_task_finished, - **self._options, - ) - while self._send_stream is None: - self._call_queue.get()() - - outcome_holder: list[Outcome] = [] - self._send_stream.send_nowait((func(*args, **kwargs), outcome_holder)) - while not outcome_holder: - self._call_queue.get()() - - return outcome_holder[0].unwrap() - - def run_asyncgen_fixture( - self, - fixture_func: Callable[..., AsyncGenerator[T_Retval, Any]], - kwargs: dict[str, Any], - ) -> Iterable[T_Retval]: - asyncgen = fixture_func(**kwargs) - fixturevalue: T_Retval = self._call_in_runner_task(asyncgen.asend, None) - - yield fixturevalue - - try: - self._call_in_runner_task(asyncgen.asend, None) - except StopAsyncIteration: - pass - else: - self._call_in_runner_task(asyncgen.aclose) - raise RuntimeError("Async generator fixture did not stop") - - def run_fixture( - self, - fixture_func: Callable[..., Coroutine[Any, Any, T_Retval]], - kwargs: dict[str, Any], - ) -> T_Retval: - return self._call_in_runner_task(fixture_func, **kwargs) - - def run_test( - self, test_func: Callable[..., Coroutine[Any, Any, Any]], kwargs: dict[str, Any] - ) -> None: - self._call_in_runner_task(test_func, **kwargs) - - -class TrioTaskInfo(TaskInfo): - def __init__(self, task: trio.lowlevel.Task): - parent_id = None - if task.parent_nursery and task.parent_nursery.parent_task: - parent_id = id(task.parent_nursery.parent_task) - - super().__init__(id(task), parent_id, task.name, task.coro) - self._task = weakref.proxy(task) - - def has_pending_cancellation(self) -> bool: - try: - return self._task._cancel_status.effectively_cancelled - except ReferenceError: - # If the task is no longer around, it surely doesn't have a cancellation - # pending - return False - - -class TrioBackend(AsyncBackend): - @classmethod - def run( - cls, - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], - args: tuple[Unpack[PosArgsT]], - kwargs: dict[str, Any], - options: dict[str, Any], - ) -> T_Retval: - return trio.run(func, *args) - - @classmethod - def current_token(cls) -> object: - return trio.lowlevel.current_trio_token() - - @classmethod - def current_time(cls) -> float: - return trio.current_time() - - @classmethod - def cancelled_exception_class(cls) -> type[BaseException]: - return trio.Cancelled - - @classmethod - async def checkpoint(cls) -> None: - await trio.lowlevel.checkpoint() - - @classmethod - async def checkpoint_if_cancelled(cls) -> None: - await trio.lowlevel.checkpoint_if_cancelled() - - @classmethod - async def cancel_shielded_checkpoint(cls) -> None: - await trio.lowlevel.cancel_shielded_checkpoint() - - @classmethod - async def sleep(cls, delay: float) -> None: - await trio.sleep(delay) - - @classmethod - def create_cancel_scope( - cls, *, deadline: float = math.inf, shield: bool = False - ) -> abc.CancelScope: - return CancelScope(deadline=deadline, shield=shield) - - @classmethod - def current_effective_deadline(cls) -> float: - return trio.current_effective_deadline() - - @classmethod - def create_task_group(cls) -> abc.TaskGroup: - return TaskGroup() - - @classmethod - def create_event(cls) -> abc.Event: - return Event() - - @classmethod - def create_lock(cls, *, fast_acquire: bool) -> Lock: - return Lock(fast_acquire=fast_acquire) - - @classmethod - def create_semaphore( - cls, - initial_value: int, - *, - max_value: int | None = None, - fast_acquire: bool = False, - ) -> abc.Semaphore: - return Semaphore(initial_value, max_value=max_value, fast_acquire=fast_acquire) - - @classmethod - def create_capacity_limiter(cls, total_tokens: float) -> CapacityLimiter: - return CapacityLimiter(total_tokens) - - @classmethod - async def run_sync_in_worker_thread( - cls, - func: Callable[[Unpack[PosArgsT]], T_Retval], - args: tuple[Unpack[PosArgsT]], - abandon_on_cancel: bool = False, - limiter: abc.CapacityLimiter | None = None, - ) -> T_Retval: - def wrapper() -> T_Retval: - with claim_worker_thread(TrioBackend, token): - return func(*args) - - token = TrioBackend.current_token() - return await run_sync( - wrapper, - abandon_on_cancel=abandon_on_cancel, - limiter=cast(trio.CapacityLimiter, limiter), - ) - - @classmethod - def check_cancelled(cls) -> None: - trio.from_thread.check_cancelled() - - @classmethod - def run_async_from_thread( - cls, - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], - args: tuple[Unpack[PosArgsT]], - token: object, - ) -> T_Retval: - return trio.from_thread.run(func, *args) - - @classmethod - def run_sync_from_thread( - cls, - func: Callable[[Unpack[PosArgsT]], T_Retval], - args: tuple[Unpack[PosArgsT]], - token: object, - ) -> T_Retval: - return trio.from_thread.run_sync(func, *args) - - @classmethod - def create_blocking_portal(cls) -> abc.BlockingPortal: - return BlockingPortal() - - @classmethod - async def open_process( - cls, - command: StrOrBytesPath | Sequence[StrOrBytesPath], - *, - stdin: int | IO[Any] | None, - stdout: int | IO[Any] | None, - stderr: int | IO[Any] | None, - **kwargs: Any, - ) -> Process: - def convert_item(item: StrOrBytesPath) -> str: - str_or_bytes = os.fspath(item) - if isinstance(str_or_bytes, str): - return str_or_bytes - else: - return os.fsdecode(str_or_bytes) - - if isinstance(command, (str, bytes, PathLike)): - process = await trio.lowlevel.open_process( - convert_item(command), - stdin=stdin, - stdout=stdout, - stderr=stderr, - shell=True, - **kwargs, - ) - else: - process = await trio.lowlevel.open_process( - [convert_item(item) for item in command], - stdin=stdin, - stdout=stdout, - stderr=stderr, - shell=False, - **kwargs, - ) - - stdin_stream = SendStreamWrapper(process.stdin) if process.stdin else None - stdout_stream = ReceiveStreamWrapper(process.stdout) if process.stdout else None - stderr_stream = ReceiveStreamWrapper(process.stderr) if process.stderr else None - return Process(process, stdin_stream, stdout_stream, stderr_stream) - - @classmethod - def setup_process_pool_exit_at_shutdown(cls, workers: set[abc.Process]) -> None: - trio.lowlevel.spawn_system_task(_shutdown_process_pool, workers) - - @classmethod - async def connect_tcp( - cls, host: str, port: int, local_address: IPSockAddrType | None = None - ) -> SocketStream: - family = socket.AF_INET6 if ":" in host else socket.AF_INET - trio_socket = trio.socket.socket(family) - trio_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) - if local_address: - await trio_socket.bind(local_address) - - try: - await trio_socket.connect((host, port)) - except BaseException: - trio_socket.close() - raise - - return SocketStream(trio_socket) - - @classmethod - async def connect_unix(cls, path: str | bytes) -> abc.UNIXSocketStream: - trio_socket = trio.socket.socket(socket.AF_UNIX) - try: - await trio_socket.connect(path) - except BaseException: - trio_socket.close() - raise - - return UNIXSocketStream(trio_socket) - - @classmethod - def create_tcp_listener(cls, sock: socket.socket) -> abc.SocketListener: - return TCPSocketListener(sock) - - @classmethod - def create_unix_listener(cls, sock: socket.socket) -> abc.SocketListener: - return UNIXSocketListener(sock) - - @classmethod - async def create_udp_socket( - cls, - family: socket.AddressFamily, - local_address: IPSockAddrType | None, - remote_address: IPSockAddrType | None, - reuse_port: bool, - ) -> UDPSocket | ConnectedUDPSocket: - trio_socket = trio.socket.socket(family=family, type=socket.SOCK_DGRAM) - - if reuse_port: - trio_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) - - if local_address: - await trio_socket.bind(local_address) - - if remote_address: - await trio_socket.connect(remote_address) - return ConnectedUDPSocket(trio_socket) - else: - return UDPSocket(trio_socket) - - @classmethod - @overload - async def create_unix_datagram_socket( - cls, raw_socket: socket.socket, remote_path: None - ) -> abc.UNIXDatagramSocket: ... - - @classmethod - @overload - async def create_unix_datagram_socket( - cls, raw_socket: socket.socket, remote_path: str | bytes - ) -> abc.ConnectedUNIXDatagramSocket: ... - - @classmethod - async def create_unix_datagram_socket( - cls, raw_socket: socket.socket, remote_path: str | bytes | None - ) -> abc.UNIXDatagramSocket | abc.ConnectedUNIXDatagramSocket: - trio_socket = trio.socket.from_stdlib_socket(raw_socket) - - if remote_path: - await trio_socket.connect(remote_path) - return ConnectedUNIXDatagramSocket(trio_socket) - else: - return UNIXDatagramSocket(trio_socket) - - @classmethod - async def getaddrinfo( - cls, - host: bytes | str | None, - port: str | int | None, - *, - family: int | AddressFamily = 0, - type: int | SocketKind = 0, - proto: int = 0, - flags: int = 0, - ) -> Sequence[ - tuple[ - AddressFamily, - SocketKind, - int, - str, - tuple[str, int] | tuple[str, int, int, int] | tuple[int, bytes], - ] - ]: - return await trio.socket.getaddrinfo(host, port, family, type, proto, flags) - - @classmethod - async def getnameinfo( - cls, sockaddr: IPSockAddrType, flags: int = 0 - ) -> tuple[str, str]: - return await trio.socket.getnameinfo(sockaddr, flags) - - @classmethod - async def wait_readable(cls, obj: HasFileno | int) -> None: - try: - await wait_readable(obj) - except trio.ClosedResourceError as exc: - raise ClosedResourceError().with_traceback(exc.__traceback__) from None - except trio.BusyResourceError: - raise BusyResourceError("reading from") from None - - @classmethod - async def wait_writable(cls, obj: HasFileno | int) -> None: - try: - await wait_writable(obj) - except trio.ClosedResourceError as exc: - raise ClosedResourceError().with_traceback(exc.__traceback__) from None - except trio.BusyResourceError: - raise BusyResourceError("writing to") from None - - @classmethod - def current_default_thread_limiter(cls) -> CapacityLimiter: - try: - return _capacity_limiter_wrapper.get() - except LookupError: - limiter = CapacityLimiter( - original=trio.to_thread.current_default_thread_limiter() - ) - _capacity_limiter_wrapper.set(limiter) - return limiter - - @classmethod - def open_signal_receiver( - cls, *signals: Signals - ) -> AbstractContextManager[AsyncIterator[Signals]]: - return _SignalReceiver(signals) - - @classmethod - def get_current_task(cls) -> TaskInfo: - task = current_task() - return TrioTaskInfo(task) - - @classmethod - def get_running_tasks(cls) -> Sequence[TaskInfo]: - root_task = current_root_task() - assert root_task - task_infos = [TrioTaskInfo(root_task)] - nurseries = root_task.child_nurseries - while nurseries: - new_nurseries: list[trio.Nursery] = [] - for nursery in nurseries: - for task in nursery.child_tasks: - task_infos.append(TrioTaskInfo(task)) - new_nurseries.extend(task.child_nurseries) - - nurseries = new_nurseries - - return task_infos - - @classmethod - async def wait_all_tasks_blocked(cls) -> None: - from trio.testing import wait_all_tasks_blocked - - await wait_all_tasks_blocked() - - @classmethod - def create_test_runner(cls, options: dict[str, Any]) -> TestRunner: - return TestRunner(**options) - - -backend_class = TrioBackend diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__init__.py b/venv/lib/python3.11/site-packages/anyio/_core/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 1d7b6344f0de09c4743487a5f23c1e09ecfd7dcd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183 zcmZ3^%ge<81eOn9r-SInAOZ#$p^VRLK*n^26oz01O-8?!3`I;p{%4TnFE9PF#3KFj z@^byOoXmo}(p>$r)VwnNoXjNsg36MN{5)elLqq-I%#u{yg2d$P#Prl+{lvV=%zXX$ zUY BE#?3K diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_asyncio_selector_thread.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_asyncio_selector_thread.cpython-311.pyc deleted file mode 100644 index 257b782eb812baa25c90e23013cb70843b7679d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9081 zcmeG?T}&KFdezfCL(R}I{QnFL9&EsjjrmEiFN=4bV89Eu4;+KZF1wr2Fw@wBhZ)k{ z7=v(xR`-A+OW`D+?2GK&oaA-Z@onOVSUE+J;=T35K6Z~3nqv#$^$-`LQm8^Zr zSJiY+_b^=ctb5DV6kk=>&sTrnUwy?tR8;s7gm?b)zps8*kI;XS4>NE^hI##OkhzPl zpg4*%NwmbwF$~GOlCC)yP1!k?rraC{DVuaJdFDK{4VNri!gF}ZJLg^U&G~4VJ6XQO z&+$tYa}^8{c+mrWJju!>|D2yeE+lY^Rpt~PLFS41f##~?u4qlXOsI|HccIjU-bZoo zk5JtA$OY}-&j@pM@rpSABW|uf?wUs7%HNRUFr$}8Q>nBZl@sZdGzs5$B$`Y{=aWL1 z)qP{LW0NzH%VWc%dbyGRi^~%;W4eD-SctA9HA)DNi-+EqbX9!&cMyGXXxEn4{vv}kR1ocV>zx&0d`0vL=S zd(9j|&clROWGouw3Nwe$VwstDw*MGLgg)4;g}j9u=3|v-C_$U8%rwqEg4sW@R=@zR zMXUc?^(i-T+f$h@d@WjeN2#^eIQIzl>4~*hbWVkJye0s_F=m51YLZ>OdmPpbt@sTSYh7578Pk7~Pq7aQIQdf1) z49)7SxRTP#B1VNs$WbI`p?eIRy3a_LqX|)W13#zYI*y1!Oi0`i^m0j%=aVov!RUhz z(m1^=>%Qr!i;?N6kqcupx_5dia(QI-?3HsgJ3To{vgH$(E?u6QnTpJeT++({L?)+3 z$1Vr;58Z+^yj5d=2tekn&I#hdyi2+W+X;Ic;$Cc~r&Y8Xi~h z_#U=k76%_JXl;GZ8nl7o=L0Gp)9{#r$MPQ5Tb<*pZlB-b+p~Q8XITOr9x{{49egN@4`sNA6<@5Ycu2!T3LeTe zwvxqf!A~OF^i{ZjG=N?Ne4|I%7hMcMhZH6<0sffRi;%fXxE4|)WGoqGmXOpbD;XqP zJO&cgk}!a0PpLx>z+;z(gnu40lVP{m2>5ij1neSn z%o36UPD>0IAB4T`d(W^i-uGHl97R1aPNA2j3hlFWu1oZt2b<4X_9>VtAa>cwnf3Qf zQ5%xvL^2t=7L`IK*$DB_0vJc3xMdwlq38mLv5<6aMUJOeQ(>Rj2}A3A1T3_~!Wt1h z3u1s2xv7jZsFGVuCsKwq_N}B$^kNHXR|dj8vJ~AYBE^x!T4%XLf4C+1jvLdt9qMo<}aPkAfV3 z;S~!X-&iGuI+1XegG&g5Q_=C4khzPf%7>g0O7lpZDW*Yks-Va%VL=r+M-(}!F;#ik zHTjxKqcCe66(}K4hW@jA`fp;2YOQ@@VgM$yUT=vB`;ni4Drp43Cd#`^vHZ7Fe=~LO zeU2Cg#%AC^Xu#+clv2@S>4=J-zwCA@t*^&q#AGm^%bOVWg zyMbJMTAwl-?1pQ>W$$ChMQ%#K>xKE0mPicrw`O4PzYgu~xQmU})DTdL&5#3=?*uhv z3nP{^$u}7LDE7Ruo&-}olGBXLlr)f?XF=|pAfH^5>!;*v38`2Lg`g;!B=+B$Lsq3l z_@qW*nAgkptRcOM2pF&pQ()Rfl4;O?)GVZO=en?Fm}Fc$Do1tSY&5wd7&e<{DIEui zrh5di!emLu7lbu~FFN34M8XV@-QrP_A0ps10G%WFbr#S{MCF7?pgLCfMdNYM$I-YT zuGd;TR45#U=F(58O?p8*om6J0ne?{Z3C}t$AIQ!dKQ9KW;*17p~IvKMx02C21 zMm1?2)ui9YF4?CeU8(8=tP-YRm29{Q7aj-ogE?@Mxy6co(1Of{278P5oEI%Z8vDWq z)wYHH#X2e#09|YKI>7ob(*2;Nz)$&@ojf-a#x~ldBuI&oOxK`NN}z-A`IximjBzN? zeJNozVkjAjgMxz2s1Svv^bNsO8x5A)aFj1VAL;J^7`9h)Nma2m0)|&35#-GUkgILl zKDm98P)DU=oBNgW{;i=r;=IRlRke5UgMd=i;iT5Zr$_#!Tjft{{Aq>8 zmxf;H%<`R?d6f@qd|2VbFa5P!@@vDS3!(?UGw~v&Ja{2d7O4rrq0i}GvK}s!3Rp;B2k~j@>bljXQ33VUjmec97%}67_ z*YvUj-B89Z*+>Bmj{rW|%Of<3wwX`bh}-%WbIY~C6r>VhBAZIX3KGYuEVN2W`xuI? zezE0kdOdBS4qC!RdttwW_V&jcF4=M-!%YoVEzZLH3%3JXZL^68(Ur2dIPk=j^dmE>i--NZWrS16*uDC5-L6bFXDHpR#CZ2=6KNGK~As+CUzyp{mXX*1W$S!F&8(z8C9QrAqy%n2xPtV&Le1V_?$D9@f4y^PFnefF zJ#l0+xnl@scomU zHt5DQx93_zc@_c2Qk8Gs{JP~BG^-C5K(49v9tS$BK4|Ey`rymj<_G81+O9nER0ngN z-48$bVo~dS=f{)VqxZVOO|w(im96W_NDptQb-h|$uTs|wUJ95}Q|nICK(=Y%X}8*R zT5CG3(D-JzlW&p|q;UV{z?=S#=^(XZsm9DQUeIqUIuL2Cf7ftn}eXbXMzR~yG zFWzMUPKI3~VI7e?8-+c_b(Zivr4f-hB5d`Xt)BM!A?d}F7Y6b|6N%`)NCfWAD@l^) zBay#ai6)I2F-%bP5YS5ixkHN+1Y9J5(l?=4N{5dTb&?q#YV!Cd5< z{I>x7iXZZbuWy+}=-KNk_efND^6T5sp@i(e`P~(FN zAN;kyDPL~3E%bUtx_)CJDO42Yh-mq(tt3K;TPKHo?3X@nxU%faY6hUmNo0lL2Eqvo zEAV0uoFI~IH?Fcog%~e1{#ZImq(Ax3hTiCWOyr diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_eventloop.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_eventloop.cpython-311.pyc deleted file mode 100644 index 0761d38026a470f1ae124e563924f62b7854267b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6918 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 diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_exceptions.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_exceptions.cpython-311.pyc deleted file mode 100644 index ce6ea2b7b010fd4298e7177163c60a8e78ab6354..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7188 zcmcgw+ix7z89%eL-kaBUe2FhfoJ=khmckl(0}O45laNAE7XmF{MAze;v(A#)ndQu^ z*J~UUsi<|OJQ$QJkpL+VRZ5gf<)Kph+WrL_R1V(f49(zrVOg0gmAVeAq!n4y@gpiC(W zl|yD|DujR4R14v$u&fK49finLM3y_uXdyNgQy34u6>kh_M9#{hh@fZGOcXk&Iu#aT zCzug?j~Q{Eys9#G9glxabxB?Vyv{aWx8xuTfmNM1L1J#D-llD7lA-ZoyZTce)oJqXLPjHJ1-L(Z?A_h0O<)Wk>u_~$1=d_idcltg1CUl1%pU?6l zbv_~NQZY+|HZB}9UCLS?=q1M4lwvR(vNEO0DX3omgs{(Y>oj-llF0JoLfB&A!-R(G zw4Qgkp_R{YOLIjfZ_R41t(6?E>6)mw*W5F@tDVsuZHA+n;FiG!I+d)FqtBRJGfJF# z@p+dEOE=}fSsjBo+Cw}&o5olUI%$q8xL&}=Y>Z#zT*yI5`@>tHy7p+oZ zY>r!VV`hG4tXOf+*w#1Gk3T-<j zYiEjn!?Y+_8K+`pr?q?zXT`O$97n73HJnNzZ|N?ML!S|)qH9((TgcIEG#6!vfL6#m zGyIG`$DR5S2wJr0B_fyAPo=>Ik#7S{Ce;VltfB&!vi2D0&o_%@Y>DL*Bm7=+Ds04M zIf`<}5}Q}1B0x>T8}voi-;w7nmlp-cIu;i0wJCYD6@KI3#^@FVmd_WZoIzIWc+&EY z98&l|$O8u0L8mm+I*@GPMbRm5(<3cYuj@nx2e4uyNbD7Z_ejR z-9j`gWMMIM74y5^oTGv@EV2wORbB?exr8PcLgQL0>cz1O1>FT=y|7y;a!)NdvjV1w zc^yuv$OXYSZ{^)gMvR~~752goH*@kuj8eOJCX+RF$H`=zFy5hy&I>73`|!4~Z|n0< zH%8Ua$e9DVbDrJm-nr7fZ%JM4>8r7D{OQ%6!3&FkX4lhKqQB~th1C)5qdhAl>FVHN z+@C)9yRZADWp!D-H8^_FTp2{o_$TGxytAzSJ=XP$=!NKCV#A-shA;Quh>fnqMys*W z)uFvh;S0$n{3Im22xPJ(EKh}E%QklolZxVz@{m9+$wQnivJHvYkc4xJ+j1I);!@B0 zwdvGoliIFe8%RuOQ6ahcxMS;64z>@T_{;1da|!hI>ktzM751OaC>wema#LpW>g%km zq}0iUUWp|#J&kMO*+g62k1W`a*)y(I$72f^$J<+{qEfEB1Q!CxIY*={2HK^y{KQxLy~mxaCC3ZfkJ5$g332;{I9>WX)-4)6IW zxiUPq^!yhwHn6J}iu4ZL>>Yf6=;F|&eIM+*(R*N}_drcWZH*C0u)f{3&gLuC{VU0K z?)u>P`zJ1*xZM*Q=w4?aH5TjYzVk(t?HH*sCH}w$x!FJb{u39UxODh~!#Da5t@IzN zChK=iMZ-IH?l`2yf0{h9ll^h$!xJI(Pl^JX3i)V^fQj+}{E359j!GblZmQ@ZvV#c0 zQqY!oU3KJUxoN`oD*o1y{6Fg>c$k_J*@eg9AlRM8uf=dC5*_<$Y&$aC-GNo#2l4F` zeK(7zdC{5TQq~TEwwWRrorWor=BEQ{F5>l0l$=V?Uz(Ld8t|9Ow&v>2S(sG;2dL>i z!O1bSoUjY9vRYZd+aT{qniV)SO}9#p2hS&45^$+tlzqeNMf5B=dh#p+R)$0xi&552 zqd;24ZP7VFWM66FpmF^odqO(mV>O6;^8B%EpmX>LoK(03a$PWunr_l+D%wIf7J&DL zPk1dP!6l`l0i#FpnJr)>_4%&04Q;COqv+;PUkJ&~R@GY_dEwLNK>Yhg?Bq)9WVLb2 z!-m+(j~+ztYmx26Hbpagn7-2@r376;7fZJD~zC_YDvUr+T{c!H) zu^%B%jeaBEmN}GyxDMy<&Xt^K3^ymG(-k75OO=G&7il_8ruN6 z&8^e z2-SdNf3lihuqmoTi(FnfuC@^IS1racxdwK>jqJMH7M9X&4C|StHiE{{JSH`8=$mS($DG zuKxq&P)|a@^pfGLAI1zvqyzhn;}HDq5_b^t5Tc-4woxDcVQt89ATXe9#-psgfWlWZ z;ai$+1ZESY1AHy1kpkFi0Z?u>f-{+g(z15RG@#Z{@DI`OHA2XDiuaQ|ksb@gWkbO; zZz_TuwI)N?t_WVd2m0%-=k}O?2Ez&>KcSDbVZMW8oJjY5z+LJF9}6^c01NlV{KzYa zd5t43;)$7(%TL+%*;3I@t6gkGKwH)(*bkYWxjb@dX=KiXK3&hk;TUIO%#etnk7$Up z{jbP@A(<_j9XU12hT_lZCDYaBbQ6iVW}Z$CayQj+nD&*3NrjDM4prUfh9q7kVVW@Q z?Ae7U>uw4bKRx|g#I9^@bR zoo8P}Sgdb3_2<#C8_~yBqK}bP9bWCZ;Fd)>`#nx#Ct+&l3QeOBgrNxEd< zD&qp_8cSzG8d#}_vBAPE8_0q`Y>f<#IpWr=#)vZ(iqvSgc*MM}15D-^^Fij+Wr9)P06 zP_`N?HI;G`I#t$6VmJI6+mT{rt2B?Q-E7xMU+y-W0_x40#YXv@Zqu*cZTr!m;;ujL zBm1A3dx3j#0aCJ^IN8g~b1&x3ojK>snKLtI&dmKvSy_pMW8+W$$B7kBNYa0!AKFnQ zZY;O0R!Mq6k|o&^kp?VX77N{5Bi1e}zuLNN{A%yA<7$gI2Ao~afugRW0aur6pt!4e zprosWzhjS-4!FDA{N52M8}M{__`Ne?9q@K}`F&BOe4wJMVxY3Ca=_Q+8}N7e2LfGz zfvT>mf$Fa6fts!w#B<5Tk=lW}t~!2S5}7wJziYll3Rf~8a43x|7^v^6=jpj43kQN- z!GT3xiv|{VEgop-YOqLASGe(vrE4+%gZN+6)nJwON^;o+N%n;2hpWT>T8#_Rt9D6x z4gcckS`w})ma>2HI(fYuyx@2hk6+UwNnJ~gv5F=6Uim(`!5lA}65Yug9PNj9k1YmutVn&BoloM{9@F-1;^}XttzFL(ym~5lZyOqVe`-N4jiB{A{#mUn0yx zi5N?}c7-C5(D6t(?c!nCJN~pI{M1l5+7m`X#d0VS>WPHnar`J646#IiD1uwp!BC>_ zq5f0hW>?y}??Ae&^YMdwx_3RWXV-)K+V`eyJECXPPJoUCJ{3 zqhZ$HlXk^Uhgl>RlHVpuDZ50hJJH9&AsIge(uczF*bw8$lsp`hha%z5vxDJgd)jkg zFdW^91ld`HhtqEQ-5EZU;J-YFkO+~ubEvmB%+lURS$`s&4d~HWNmsQzEVm($s7GO` z%OXptI~LTN^|BMCY=?A|;OanW-Y1t{u;-Lq5#*u_&s~rX53a?Kj#k+RIVr*2Cb=4S zrSfLE2G88`7P$`BGI^`K09OyL^|*S&?6w0k6h+{`I7$OntW3gy#C?4#^(_rlQ$#74irG&@m?CXyQxg-ULS!ggG z30qoknCJ`hbbDiwNNl)2 zdLno{66-ldHv{2BUrde%n}++sEF27-4)t?s55}VOS}?}?Pmmz$^KEVwXf6+u^zoF% z?Hb*Eq(3S$6_4m=T=%#?nuz86)ZQK@=~JKad;Pl!HWcj%WuC{w;ZthVL^u*rZ+jy{ z@jij$jz}aJ10gI!X$WM>{S4d&mj+SW!ZIjjv7r-vX7RRUM!A6(KtU8l~H@o632OQhY~zR6qQ;&K`lLAGG;_V zk$5ba!N!0IxCK>(vTjw&g@jB)AsgQG~AO>%BV1O z59MLG?Z?dv(x_!r>elKJn&1xUs-^v^C2i~O9c;Fy?eTD=m(?ReoL&qDXZEc+9b&77 zhlf}7M*0V%Lj$W$hoh%gMf#7g8axXjj;?E2vu0Hs+*mmn>N$l%iLVMp&-TYwb@#+r zcoiqUKh`pMHtp)}?vM5-y1PdzcTlaN`q`p|wNajB0OzHtnz}LjxN8i5w-F$v?a|Oc zIBknVQ#(bCHIPW{DkpITZeEZQnHElxMx~RPU!xXdi`5~q2D|{Oi%x{m5+xX0g5OuI zY$+~`S~8UhY#Hv;rQO|XJWvqOQ;-SXNAD1$&r7$wRTGIzXD0nA?^4CPH0fH(n(?3~ zgARVsJx9D8Hz*tFB(CCs8ncYlbV3!7DjGy((d#SLh*(!G9ML$X5)>#FsgXx2vgoNn z4<7dXa9HSXQ%09K_)kMmGC>J6tgy;|wco2BMfPTiPG>Kp4!`SXT z3nBZs?TGY(?Kkb`ETb0Y9JM?u;kN}nDD?e0r12%99MEKwV&hUS${=m$I!H*Ops={R z8`UbzPz1g#jhVnlfKHrB;UDn_O0ACKs;SxqUs~{m1)pE|;=-h_Dd!y9J>~UHOSZDA zsj9k(67BD;^1y^+x)g7lOARF^JxevJ9XEm*dXdu!oOF^<=f_EUiyy{rk)A!8K-w9# zbl}ENw43S)7t6GR>o&F)kMu?EMBfKGZ=^iS4H5DqpKF2NAf2?aJlDUgCq-$cHtg@$)mnbHknrY*7MRl3vs4+VYVJf411!eZW0e>Up5P z710#OaU!$@Ah*Porj4mUs}g8UdQGRRmD4%nj`YV9dG#MvUM}vx*eai;I$f+$6gScS zAdt~3zf8<ZWQnoi|*%CV){H2z%sDy|N%8%mt|5}a_d=m@<|O*C(yuSzDw(hfdS(CZr>5GAyzvmuINYVZEn z*!BGtGm;r~6pyW9b zcSu@-NXy%zd2U$dQgCSp?@rCs@V*`l4^J4`ahIi`RZ!|^=%qDXk{v#d__HlhHguTY zpuWBk59*Kl##8|*%OLkY2&SljA@@KfzAOFOk>QCfcCUYGf9}cKr$7& zZiuPH{6t~$H{MvE3T#&b+ml|?>Dtc8$I!F4Hy%!;ov_)!^w>k40_||%hU?Aj0O@YV z1Q?ZDUqyOZv+JGph{+DqY!l;EYW-O+K%5YR(SQ$_7`2M}elflBNs6@wAh)HwR(AdL zjnk<>n-XYCdQGRRjdQ{v0dw9>hhwX<=LGv7K$BpzQ>L1ZYgy>=d%Mn*ws4@1f^vLOiZ|Pos0gd(^?> zeNU0@_Po!jr(%A7m_qscS;F}Hb`kn$-nTfm)M~M=%yZ5pl^UKZfBrG!b35aq#|)vu zc%icAc;?Y|+<{D9E9stBO=f(q@tMc1CHoi|y1Kj5CEeWvd?Eq&?(XiVhC&hbNl|yV z9P8=sW=)hP>GHG-HqgN^OPpovDC~X$n+fbBK;uC%hI)|hsFpJ7PBI?>>OV2wjF8ey zTVwIGt7Ffe2fI7=baK_fs9rIWJJACp5fh4K0o@TGYgxR^N|q(xJKr)Sz~b<|8t8hFQsunUigP?ytDH7yxIxy5lmrK1N(dkck`03K|m z2PS|Ao9KZaAZ#;*=|R2(5Vnot=>btPW#6CVr%D5UzvU>KvTsT9GZVUH+HTC4KF(*uV6x}BChbC7 z8jpVrFIq z*abZN48_uQhy7B`ya~}AX0>?6NFm)FdJIi+o}77h9K2}Cv#NHYgBM!b!nn%sOVlwMqNhJDNN+nk%m{p>=sPLH(pNgW{ zwm7sdpPIoe4E;Vn)E`M;CZ@F)vtF&osI-o$3AKuemR3vxim97C(}`jVtQ}1z*>Sm1 zCvB%hcy(wlzEjB&^Dx92ReH2O9SIFD#jCi9Q=23@a_=@u<+X};(JhyIOrF?%xq0%j zE2pmyzh3l4)jKw8x$|cd0CY-8VQ_xuyH3d+m^gHC%Q%!(ji|=dL72(TDHODk*~ly& zMC9CA7*okvMxN&-_b6sJh?n6ru)SsH=}<;__^XuxCiz1HytH{a7~WkO!IZx`ugi0| z^Ac;ehyt?k0@54Vi)j*t&t$Q2Q1@N@$IAiEOYfEww>mFw8{d|+*KuyO!7;!ZeyRu0 zGY1$$hvoKS!0hz>VF-KJCR?ewmWyNurm*d@6N2qZmvxh(7WPuaQ#a2PPeD?VXr)tOy;)WO^*xjk70&K~)4@CS9e8Vyc%-;GJ}3MG{;7sB)rfbm;L3PPa7Ew4Ri>eLm#H?dTJV+vXJOrQ)g=!WlHOp_g z%O@Hyt(^4V@K4*UwI%OJ0H{2*C8#{U!eFcjrVO`lY}>8M#w(3Ucgs(`zKOjT&yAl; zy5@7)XxF-Y9CrtcA!jy7;3d3w}ApqT*8Lo#YEIQTwp;$$Azx?OaA z%f2MZ&y;=1w7tl&U|K2wM3Ou;!p0!4b_C$C-2M^njPeSH6Dy?D7Iw&XF1Ihs#gJR4 z{0cdpbQR(1#?^%@xtkQrugYFrOXRP}6}XnlSL6V$Zuu%)PRPaNDt9^Y;985{UR=rb zq+I^0JP+3jT<7Cj8TQGqkrT?R!0R=R9f2-C!e5aWn!*D--0Z4S#lshw;#VX58l0h>3ZIAYeBUUhWrp>tp?U#lOHzautxqvxgD|B;^_fg z*U5h*AHsD#xYU8`z4E`8594|tfB%T-{SA2kQ9QpN*T-<(i0k9Hw&L1_>n2>Ez;!dO zPvW}8K>tydemkCi3{SV>+KuZrT#wrVMQau2S%p}VZ@_&}cklrIGkBbO7B>zDE6s{feU(4gTcB-YDl>ZGrwf?%D;>2$JF~y8AevbCzqC+OtMv$h{x7`yh8RqTZ^OYAnt%BA3TwJVgw4!mKyc6IT08`;f%IU?eO$ z!Sw1u?!gm;3(soJbFCnuGN6*Z;RvaPmT{QNi&0N(@a(Z*lPcsv$? zmKAERP)+TFk!kiA!?Qo<61OwPsvRP{lD z&YBQv9`|kSmcys}d*+PWgN*MmD!h5;%DJ~6x??uFQDHg`1gubwm3 zoV;OSnz5K8oxuotCv(I>)rQ)gjeIsR7YE6}H>aGgk&`#!z%l z_HiXUTQ1z2;tq;b#1m!8)7v4-XeOx(6+sV*nvCrF1g$3~jGP%896Fz3Sx)e5e>g(M zc%G8h@qAkJgjJ(ke0E)ZA`&}3D|0BXxyqAeQ-S-oqnmn~aO(l+`9o7v1zON_iU;Z$r{0 zyu=KgB|{kJ?0(!BIhz%RFTz3!Z}^NbAZq3?a{7x_+4_ zfdDcGrd^?U_h2mEeiPN;9mrUU&FsRv?^~;m-NT` zqqNSgC!AGSX=itL_^IyhtEzL+H}F>4nSd${Cyf3@-^P=XQnfJYmCeK$QX5zU6I_1f z-fuOgf*X|JhGfOgiNK|K6Z38y9&@T{B6!mqoUBTDn-p(T($&P7Hd8$))Mv{U&UUbg{UNe+_9n zk-ywt*V9IE9{6>nEq}Rv&p;dEJah-Nt;S0^%F3|DZUlzZ{Hn&9tteW5h}4R{KSX^v zcx#5`{?lmW%2lnB2{{P-;?;PEme=_vc3;{*8A$n;ro77(@3N$8nYk*FF67NOwT?Mx z=S)hDLXAloUw4Z@_D^#Wgf|w;;4@O8Vwer;AQXKW6!%>G`1r>!cc#3HlCDKUy?GNu zu)zv<6s!q7YG{M;w!oMC-3oO#G~KOs*BrFw-MmcXuaLq>2}h7eID)iqla~qR2&t2% zco!yJ3kAz4TkUvXD98*(sNDVv`vKBaQQ#4}kT#=P%MT}4JB!5_~`9 z?*q6oO0R6WK4<7uo}Y(l?dMkC3oB98jb5QhtpH zJ}>>$>sParUp}cUy&peP{*4NtccbFnm~?G43r$A5h+&t3VR_3Yw=9J3s4c4)(@uez z3HKip?n0(S3@Z9Kxk?b~To)?-C9@2-S?6R-?yH zg1pkyBUd+Q&66YR$s;PJOS98+d2iO%cn_kxuU8oCACa)iX6=oqiOm}kp0i@1L}}Vo zXd&;Iop%y0j*O2aUA5*Sp%D|W5g&%pgk3{wrm~_yjS_WG{|PFu->1mD-;ZCJ<3mL# z?SvTt(}^aW{t5YMtrL&&N#d&B*dq>)RwvZ&M>S;@_q2mh%Mmu~B!s z!4?$IOPKda+mNYYI71#PoX_NKZ*0Z%qg-+{7e{_WO0Jk0#ZwbHRhRxQQcAnDDOI#f zww_3wy@ODLq}@hK$A%lhRi7YS0pu4N>0hD$8m-?RP=WIbKbP##@OG>Z@44Z*=wea zEUsGH*}F&qb&AZ5>5}aHuQr1Jp9ts37{{gm3&E;AFZ<4ChzI2J$@hxz*Ia6S)7Ny< z*K}q6>rw2Vkn$Z?e20_n!$O2fZ0YzA>0vWS4}%0wjDt`1vj2@BBkn&(h}ym6Q7+{{ zyWysyy5Ql<%P8JD7AIG@^|}s0c(c+=rVxD~7z{$Nn$gR}~v0jvJ&c7vC=s zzU1@{vz@P+m@KeO`PL}DHA(jxjwq7*7sPp+EZT;S8}XaV&YidDX*q+3MR;A>mUN3It+VZ_E$tQa1=yN`&ydB_WiZ#ryZP*BckEQU0*)Y11elb@ zbOM&!!fJE_iOp0A6THq%g)aeM4rIri1d0GM)q~2!iT`J*1)IQ)xdqGL0T#aHs3fRd zuTcf#$2o`Imt5a|og@Xt5BQ_!R4sk0ms{dg>FmH5E~_PYT?nh49705YF5}0lt#%?V zQ)-l7HS*x&KnhCGS*l)l~gGQ;XM4 z7d!l(cO-zH5g6P3u3PfgywtDMufFcTemYgZRjJ>atjRr7zHN#R<-3i`TDnA-__|S| zzdi-QN^(n~IOCR6peV}lMov*MH*q<)B(R^LW~UwU$KX)4gH z1e(X%ZlPrslKsuPZ!Ua&X{vsoQok=*lY6Fo`xW2*qnPsgq3PHz*SI9|Wu3b!F@QH|vx&dtQgI z9a8EKC2Mlel&?eabtK(l-H$=oNEkq><#s1-X4~y4SJ<%6qoqS?kn~-4f}2Jrs@om&+rQQNmQY@C_RmvJffs^knmI|N~UhyIh($P z(utQ1Vwb73;5W*p&_Zz-cUUcO(%Pg1^2E+jKeaS^Z))p{||6-Obcl zTu2lPON@x|V+7oW1yK_UZKE-a%{RW$nG76C1r8~JLrJgcbR80U83|;Lj9!i)$V}|r z=;hf7HwuZyhWwhjBTj*hwzBV#`*~YxgOFgitkqCJf*U6vh(FGWl8HBa zNNHrnIjg>lP-x=VrZ(#2iNjYTX#>p$ke;@|>E2gQQwp%2%p$ zh*c*Bbs_&u(GMcJ+6BTYysC-bm*iAwgHqZ+?fl}Yz`RROj}P{uT;KVeP!wO z#*}A+;@OaN6+F%QiK^GLRK0$+8Yw$D0;{c5x|n`&r#L+i*%}g5Q3WZ&yTmkIV^!Cn z)UEj1qt~8PR&GtzZBy#DCH=YQSg~lVHeP&s{OP1?ftf#4Xk7iQ$IYFXQeH*8*YGb6 zO-xkVPbs>0nhn@g@zxVPVv<-FZ3dx6$DAcMy_gv>%n>6_=J;ruS1(Z3J7$}x+d$O$ zwLY#s>i@x$I86zvjSFvZ(bFB@ueg`qXvC7$Dq6ByMU6-mH6pwvDG1ai=2t+$QV(C} zfNo+5`CMhY{koX+ae+b{S;80b{+e>c368)PW8%an;)Ljgi5NxT01G12Tq8dk`7Q!p zG3xpNpp{%l&!YX!c=U#h>nc1 z)uL5W#cM%osw%2otkm9fW%srH%8H$-+FeTRt|Y8kIj3ga(wADM-_kb+wR4UA^kZc{ z0018gjh4m8N4Mhuqb>*^%NDy9t&T+aUQL7zV*AllzhV@CSl45s zU_VhHOlFx#3#gc=gQ9Oiu{Sn`tecYuF=oYPh=-NH;iT7ey3|=Oz3_fCG{bRMn}abC zO`d$}pfnpRSeWW9$wv++14mMUBTC>%(rY?hNAkBTHrf>a@4!e^LE%n2vIg2nNoI6^q28BSHoiC>mQ`~wdDYC_7#UyLH8pYxoWBa8I3-qp1 zu9LC;D9yFAFCz=XNaqkSQ#k5qkya2l7a$_{9ZmX|k^89PUv>p;o?~u#Xp9d_fx7g$!wfp*6W&C zOV+_xd>ZWUgeiL*IL8S|=mgdN{zR5a{?ffv#+wl(qY}I|FlUHTUUPl@jq2B%Ql1AD z&x1)$_~AkTm!Q+QdA|}wTj0G4{9enDrI(^}PJQb)>ddba^^+FV{xG6X zY-CoXo8rk+B4U3zvhs266yQ%g@#j%QQe_U#2MZM65^isxPVMBzD}6VduNT2=?I(+a zpDYfZ!eGpb9p=hwFIVdK#rjoHG<+4cNzsI|Rggz`0_?~t8Ux6H-Cp6&EQ3ab{1PvTIw|3=>%&Q#!l62MYP)9E_E^#L~aD^hpYV7ZOTo$wAw*0fxQP*OU}nv zL5i7=AACMZKO{7GIe^$g-DdqHaAB?+*Jfr%WAw2+TDf4FWMZ_ILG4qED5r_zhe5g8 zr!Ec5Hmjs{w%bykO^Rnz(v{~l6-LIBgaj!gwf`S+y9jI4X`2r-y9bHg!V;{;Irl#J zz3%#vlxMTz*_?FcIZgb=3X=pJ)Ds52Q}>HY`KNJ{N6HI~Qga=#F>_9>fO_aVZ#v1w z4gj;6DRMh`Fgsvh+NZ!O)$pMAHU)3__9!{-WLhIZZwa?X8*oA=Pk8mj^?c{=Um(6e zj5w;C^KTc9z>si#DZEw03Mjsu;-zMo39fX$-kGf1pQ_uh)a_6DbI+9bLB&g>57CSu z>C8cB;QyE8o8aKvgoyo8mw{$uQ#nLj5F#i5G~`ZHSQ3N$@oszV5|NCMoZB#k<|;Yj{VVHEEyf-wvZVY6U(< z9Ajtmk829F1ivt8p6vrbdJW(#=s%M#$!<`kvHAx1$IgMVM&0)ev0C`7W#9QCF`TTN zg5j_X&+bGcx;yvXa3;5Rq&%I9r!(m)cyb-`_P3F5es&*0zGiXG8ix%^fW(F$vwt^9 z&o+~N)xo#v()h%UR@?w*5J_6Br?wG1`YXhu`;oOOlX^7@>sw9Avs3ZxOu7o5swy4m zk7Lu76J(V{ikTzR{i6Y`;6}0GbH;P=W3EO7ZrNnFQV+OgW5vy=C2siyIcLK~OLNW^ z1D9OOQramtE=yOmVb8wySfULxpfdN?)->p|Bx*#Gra?bR92911@$wa7VH7b03&~5n zO79zaU#fD0Qb~ilLML3egX9^B&%tP5%7<;vE%=6Sc>wO)Wq6VSHpJ1qxi2&>m%duI z$@WK ze~T2;W%Ts`;WLY!@6ey7NjT~TOXqo)IPJl{M&1020QiQ$P*S+2Cerw;;Jw|W@7z0u{Ma9nayk7^f%q~H(l|k{4GlE93=Y( z#59mcV^q{p%WcvRcTb+41zGJt=2N47F#gi!UF|wEBoW7cf)_QVPpIn2PZx8d`R)Wd zCeZJ{Bql6Jd=nF{+rL?&tlp7o-jVX}RQx+r-dzelMX7#!lILe&$1l0GO9e@Ma|(@a z;(?xS_IWCH;UlGs{{1`!zx<|u`IY-p{{A)s&=HWyUJ(_&K# zh+7Su)ef9){$uOw_!9aaC9o&yHJz?KT<7%YTG;Gz%*T-2bJBB`=d91!p0lehx_!(t zW*xJQ*~g?_2XEOO`W7v#jxYfTOkcylIP@cb%mX+?`^vWCX^$F(Uq~JBCi8c2^Et;0 z(nZHy9S7NR(R$H#(VqJ;pL?ZqaKy;37cb@*wR_NApg&`=Ss;83(i%)(4_n3ZK3eW) z!5{T1vD7bZ8Aew-Gg-sum=TbjucUDYEammMFe=NOxV*^|Gr8yK5UsYCKK0d|-Qjkm zNr*EqZ<_MSHr_cgZ;>2O*8r{eR7K!Y-3tppyKt)9ce(G%=^MlFYN=cV59&&+r3RRm zY-LN|s_;!!*S>J(vu7sl&p&FFW_@+VpF4n_PKfoxd5JGB4#g0o@q3ZOO_*kQGO z*J|J4Ec$M-1&~p<83LcF4%))Q@_m2C(zX4UzT}4B$gZ}me8R# z|K;{#&~g_5tIox&nl}}=UkTiw^qNlB{k$^40pd%@jZG2=5?BNP^7#Edy8Au!kkfAG zQ(j^}O&;wTil&DC5k)hFPG&-R=SfZeFA=I`^+SsB1zo`3(Y>AT7NYxLDu3O{cXbe< z|4Q$@M<7T*MTPIPLD=g;)l5AIMepqfJ#>+b^Nt(6C$>M}ceDorPfNV7_W1aE^}Bk< zuFEG#S@4wXESr)(^cxgok^m3ov^d4b4YyNh7E}IQUs5XF4TN`=?ne9s4>_$X=#l9? zHO7}H`AGsihKl7G3fP_r)#rDZQns;RiiTrgtHrs1yc8mBm z6qUO~@JzU3%6h=?yK@wU-v#MzH$bz4(#RxIOW}8w$YGvH)~%$yyVmO1zb2|HemoTAoDQb4bfGb+1zF-7PRe~X7&+E9Lc27$9Q^MDN?9XvWi(I;`Q z6B&E1pzy+S>coI-QMn~!W#jb_{;5!8Vn851>&^)K<){AQl8He zGn%_(WIfthD&sqSeUk2Ikj*|v-~|FSOkgh(piU}#nLr1zq?y1n z0-S{e()f>GDW=|d_HWv{&qCi<=J1GBs#tb@-&=NnlAkHNpFRYf?=#2x?=9nNz00QY z1z)mL7(k(q1tT0?0V6=z5(?7;r`6F6%bWqYj6eC)4-{r`G*P~K09+PRm>!4^DO((5 zhfzW1L&_9zr_UGC`vU0RUzmA+5j__`_k2<2c`H2^K=-^g^ITUjy5}e#{!wf#YmS8O z`JLxaOJE%W=-zLbJAJF8j>=LGT*l%?!b?bwbXkbZoRX_lDXPA_;bzg|WYOZOWi2m{ zD$82OoJm)!I8(0Hw~GDKR!i}EyrKf&R}vVXCqiA)Udw})X`8M12tG|cD|Ba~KEk8U z3Eh_BwUn(Mq!wr8G1^qEd0;2@#57 z??4(R=(IWD>uCffR;qU^em?oGPuYCAh93WLW@~kWO+*bql5zE}mKtoT^_mT~Z_mB}>EYsy< z4H|l+y*;r=1kN0o+l#k^j`uJ-MRE`zGbt+~Koj5TQf|Pe?Q5~UGkVn+Qt?lUVtdxO z*u}Aw0-cGogP5OZv?!aAEu4|#nlyn1Rk(ct>4 zr&g_Q_;^E1qiof|C wdh{~_gi9dvM%_M_Wg|wpdEq-e{Ac>7kCjW7%JVKos+ed@N!5x@(zsUse+>vcYybcN diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_resources.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_resources.cpython-311.pyc deleted file mode 100644 index a542f41da59653450c4eac6059d6e39a3048214f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1107 zcmZ`&&ui2`6rRbC?YeDNE4H`Npm@l^hAJK`B9wYldaxjLFJYR@ZbP#(%S_U^T0y9Y zErsH#9*c*H)SLbT{SPX5SaMRlSiG!Mq4eaN>~7lyI~g8t-uJ%uUcOA;TUH6dy7T>4 z?Gr}mhdT6@)^YIRO>nkQfC3z$I<8=h0xi%Zt*%#e@QuKXjJjDd!5<1rFO5ne7@R|n zb)X73I2$C4@tDLRXYxQ*g_t!ho6LViB~OG;51@CRIYXFFqdA{9XjT+mRG5Hf1wrFP zu*{g{jQWbuTLo}d5yFR`!Fhl%3>%-pcObgk%SE@*bG(AL&)_Ez>d(Yz1#NdlIL%RB zf8Htx^Gtt?w)9s9NPyL|1H9c6u8Pi~YiJTlBh{Yh^C$%o=V8(g;%HAlmTXuv5tq~^ z%qB{mMZp|uJ{Q#WdhahM z8qI9D)5@!IxHr`#ikjjQ^iku;cVK?P^8)?7j7lSGV;f^_q?z{H>#d@-IkY~sR^BMT zF1N~~n|z&rDUW|GkM9@%v)d-Ha%ygVt0I4tIgOp`9UUE=i{*eEhB4o`)0Vzx8Pmf9 zdsi^nS;xr5%P+gQ04YNKn$AF0^1NySSD$*G&>@uRWWn$L6JAW@lFUCwF2e_O2pLFR z1an-xTjxO%(R*SPj_StCc`$7qW86Yl_xtxZG``=zTm45s+l4_48k}Rq2vq+E@LUn3 diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_signals.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_signals.cpython-311.pyc deleted file mode 100644 index f8b3ce2e94ca968fd9a40fbd68cf4e3f8e07e6bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1352 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 ZoH^LhWP$%7b8uj%rDj=JC15Dx{{!e8)DHjv diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_streams.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_streams.cpython-311.pyc deleted file mode 100644 index a8d66e67053dc8dabbdd2be2fb1c4d6b1ec9627d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2648 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 diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_synchronization.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_synchronization.cpython-311.pyc deleted file mode 100644 index ceaaac54768ef7b59f0a5fa5d46d8e70307e74f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35706 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 AQUCw| diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_tempfile.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_tempfile.cpython-311.pyc deleted file mode 100644 index 262f07dd304af62a6b2fe88fbb70d6579afa435b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28588 zcmeHwX>c4zmR|LV2GD36jmCWxaW_E%q{JDMkSLL&NRiSAq(o>afkQQ$T?L}aJ}^}c zUc!vIBYFpv8LJ~GQ(Dt2IAT{znp%gvw!`a)wLLy!!x0{@8{Cd%yKQaI;ZS(Bj&L-C z8pj0wtiP98RbABw03IXn>`t-pI;$%4T45ng5O;{7-t& zFE9QoOa^Z5p%`e({2{W8LNtWrakfM z>1y`uiq*txr)yc*9rMQPrt9LqXD_h5$~MtjCW0U*#x`rf*^S>2~wThAlJ9+wGlpb z2*NG=@oT!9#q%Lv{i^YLSiAb~Uq6h*qF z7fhJmV2Lp%iKQ`27{;akORhp1X^XT~8Z1fCr{l!;C#2!h?^=nrNKZ;Z;OmpNNgFRY zr~9RENu&53knD$r;J3e`QU-0g+HfL~Ooda?WI~<9v*$ocR>CJ@a?qZudhUEmRu3G^ z)lJFgQU?wmQNnX`vVvH3Q%X1@p9n`zPo1BWgD$*y8V59OsH$O8YE4lh3 zN;D-GUPKJ)AmHK;w);f4Yl19H+azJy{u=lLoM4xolH+N7kzG2Kw6-0RoRaIhO&XT` zm#T_r?zYC3Mzpv=siib-5#EhbJHtDQzEm~sMz87t#j4P^2J!2W+CjN7qDFi!si6MU zSmB?76KX_UyAxuVns8Q0CX(~2n9`$(Gl(aqX2U5ls*2(HR5A{NN5Zk#c`<_4Psx%P zPDo+|*b)fO&yCeEj8n6SABlxkRh(0jXQGmf=TWR;N5#-a%{!X8jtNyb!hHhET@Pej4cYB(lp-&Ni~XOqflRUAo{ z9W!I&&f%x0Y~Dk&UE0yzZn@RN+}7AV*S3<-C=| zMOha*t)+=%MM)|uN5sP7EV?jS?WCw;FpJBaFjOC%RO5_96oV(`_*NQ?et49RpvQ8x zA;#Gu#t1iUIX6#`bE@?GHnb?LJ8tBvc$0ZrUbq3OB2jPP|dN z3G@&U3G@-@Con)@kO1LSs{yFzv1{d}@iSp%{OsAY<1?}7Tw*>xenw858IMIzjL)&b z;mNVBTgO$5>6_=k?-+8_@o?gNG&vrMBo%o)MATxK$tj&U7y)L#rs>vH&#%EB=ulT&ZD!U(t;Q3CI3wu8$MKOzKe`yRy?;QE3CXX=f$Q*=OcdYVG49 zD|W7?P`nFml?qPGs7e4o|8wEb(R;t}cV+y8d3$x8FE3cYJx6VG&DR1zUa0j|28;He zwFzB=ORs*s^ZL$3XU5Z(t@mf@d()m?*10kIpNoW2klR-}2p)Ydtjc@OMdUdWr;h2f zK{drX6OPTxE6tV|Mue2E17HHugQN~<5h6wpL+z+t7!&PBfV0qoa0+35Eg8(BzoB2N zWNl_6(mVBm#mZ1y3_D|-m+1yHFhG{JDnR1;;+v5BFzlrZc=5((~q z3xJa)?-kI9zMeb2!P~yUW#4edH=OoVyjervtQzB2u!)zc3+Ol-(5%eo#$F1E1U3-p zGeZ4FXut>!8X=lFS&E?Bn#UM@U{f#6SC1)=DrE~H+X^sA7b?WEc;c~Tp*%^bwgG^f zSh$tK9);2IIr_+m`8Zw#WxgEyo8SCW@Q(Fmk5jypqZG@+-wvhK;xS_gf4s0^e=C3bb0aufg!=wpLX`) zUUv4~b=BqFg4myJ@5=V}WqUScyG6P?y7P^-uG)OF(6b>QppZ}s?l}av@6zjeJAG2nKEawZb0EyxY_Dg%DPn*{*|&$wy|OhlSNsV znN5fz+!Q84 z-F;#-xLQGB0%K`-`4pNrnM5=ev@-=eS6_sj2_q}*rA(?>4%Q>0FzIA~vLcxz=jK`D zoF|gW7|T_89q%K$qCnyw=1Z=Ll7_+U1qF5aW-S+y)?qZ5M)E=yYAqf~vePa;RWl{K zv$TeW;{QHU>56|BQ~cR1wbELe=4e6tUw3tsW5EBAMO#8r6FbjYkn!amz2VfY0{!h2Rg$MHfni1$%0Aw-vS&QJU&(wB) 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 diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_asyncio_selector_thread.py b/venv/lib/python3.11/site-packages/anyio/_core/_asyncio_selector_thread.py deleted file mode 100644 index 9f35bae..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_asyncio_selector_thread.py +++ /dev/null @@ -1,167 +0,0 @@ -from __future__ import annotations - -import asyncio -import socket -import threading -from collections.abc import Callable -from selectors import EVENT_READ, EVENT_WRITE, DefaultSelector -from typing import TYPE_CHECKING, Any - -if TYPE_CHECKING: - from _typeshed import FileDescriptorLike - -_selector_lock = threading.Lock() -_selector: Selector | None = None - - -class Selector: - def __init__(self) -> None: - self._thread = threading.Thread(target=self.run, name="AnyIO socket selector") - self._selector = DefaultSelector() - self._send, self._receive = socket.socketpair() - self._send.setblocking(False) - self._receive.setblocking(False) - # This somewhat reduces the amount of memory wasted queueing up data - # for wakeups. With these settings, maximum number of 1-byte sends - # before getting BlockingIOError: - # Linux 4.8: 6 - # macOS (darwin 15.5): 1 - # Windows 10: 525347 - # Windows you're weird. (And on Windows setting SNDBUF to 0 makes send - # blocking, even on non-blocking sockets, so don't do that.) - self._receive.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1) - self._send.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1) - # On Windows this is a TCP socket so this might matter. On other - # platforms this fails b/c AF_UNIX sockets aren't actually TCP. - try: - self._send.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) - except OSError: - pass - - self._selector.register(self._receive, EVENT_READ) - self._closed = False - - def start(self) -> None: - self._thread.start() - threading._register_atexit(self._stop) # type: ignore[attr-defined] - - def _stop(self) -> None: - global _selector - self._closed = True - self._notify_self() - self._send.close() - self._thread.join() - self._selector.unregister(self._receive) - self._receive.close() - self._selector.close() - _selector = None - assert not self._selector.get_map(), ( - "selector still has registered file descriptors after shutdown" - ) - - def _notify_self(self) -> None: - try: - self._send.send(b"\x00") - except BlockingIOError: - pass - - def add_reader(self, fd: FileDescriptorLike, callback: Callable[[], Any]) -> None: - loop = asyncio.get_running_loop() - try: - key = self._selector.get_key(fd) - except KeyError: - self._selector.register(fd, EVENT_READ, {EVENT_READ: (loop, callback)}) - else: - if EVENT_READ in key.data: - raise ValueError( - "this file descriptor is already registered for reading" - ) - - key.data[EVENT_READ] = loop, callback - self._selector.modify(fd, key.events | EVENT_READ, key.data) - - self._notify_self() - - def add_writer(self, fd: FileDescriptorLike, callback: Callable[[], Any]) -> None: - loop = asyncio.get_running_loop() - try: - key = self._selector.get_key(fd) - except KeyError: - self._selector.register(fd, EVENT_WRITE, {EVENT_WRITE: (loop, callback)}) - else: - if EVENT_WRITE in key.data: - raise ValueError( - "this file descriptor is already registered for writing" - ) - - key.data[EVENT_WRITE] = loop, callback - self._selector.modify(fd, key.events | EVENT_WRITE, key.data) - - self._notify_self() - - def remove_reader(self, fd: FileDescriptorLike) -> bool: - try: - key = self._selector.get_key(fd) - except KeyError: - return False - - if new_events := key.events ^ EVENT_READ: - del key.data[EVENT_READ] - self._selector.modify(fd, new_events, key.data) - else: - self._selector.unregister(fd) - - return True - - def remove_writer(self, fd: FileDescriptorLike) -> bool: - try: - key = self._selector.get_key(fd) - except KeyError: - return False - - if new_events := key.events ^ EVENT_WRITE: - del key.data[EVENT_WRITE] - self._selector.modify(fd, new_events, key.data) - else: - self._selector.unregister(fd) - - return True - - def run(self) -> None: - while not self._closed: - for key, events in self._selector.select(): - if key.fileobj is self._receive: - try: - while self._receive.recv(4096): - pass - except BlockingIOError: - pass - - continue - - if events & EVENT_READ: - loop, callback = key.data[EVENT_READ] - self.remove_reader(key.fd) - try: - loop.call_soon_threadsafe(callback) - except RuntimeError: - pass # the loop was already closed - - if events & EVENT_WRITE: - loop, callback = key.data[EVENT_WRITE] - self.remove_writer(key.fd) - try: - loop.call_soon_threadsafe(callback) - except RuntimeError: - pass # the loop was already closed - - -def get_selector() -> Selector: - global _selector - - with _selector_lock: - if _selector is None: - _selector = Selector() - _selector.start() - - return _selector diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_eventloop.py b/venv/lib/python3.11/site-packages/anyio/_core/_eventloop.py deleted file mode 100644 index 6dcb458..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_eventloop.py +++ /dev/null @@ -1,166 +0,0 @@ -from __future__ import annotations - -import math -import sys -import threading -from collections.abc import Awaitable, Callable, Generator -from contextlib import contextmanager -from importlib import import_module -from typing import TYPE_CHECKING, Any, TypeVar - -import sniffio - -if sys.version_info >= (3, 11): - from typing import TypeVarTuple, Unpack -else: - from typing_extensions import TypeVarTuple, Unpack - -if TYPE_CHECKING: - from ..abc import AsyncBackend - -# This must be updated when new backends are introduced -BACKENDS = "asyncio", "trio" - -T_Retval = TypeVar("T_Retval") -PosArgsT = TypeVarTuple("PosArgsT") - -threadlocals = threading.local() -loaded_backends: dict[str, type[AsyncBackend]] = {} - - -def run( - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], - *args: Unpack[PosArgsT], - backend: str = "asyncio", - backend_options: dict[str, Any] | None = None, -) -> T_Retval: - """ - Run the given coroutine function in an asynchronous event loop. - - The current thread must not be already running an event loop. - - :param func: a coroutine function - :param args: positional arguments to ``func`` - :param backend: name of the asynchronous event loop implementation – currently - either ``asyncio`` or ``trio`` - :param backend_options: keyword arguments to call the backend ``run()`` - implementation with (documented :ref:`here `) - :return: the return value of the coroutine function - :raises RuntimeError: if an asynchronous event loop is already running in this - thread - :raises LookupError: if the named backend is not found - - """ - try: - asynclib_name = sniffio.current_async_library() - except sniffio.AsyncLibraryNotFoundError: - pass - else: - raise RuntimeError(f"Already running {asynclib_name} in this thread") - - try: - async_backend = get_async_backend(backend) - except ImportError as exc: - raise LookupError(f"No such backend: {backend}") from exc - - token = None - if sniffio.current_async_library_cvar.get(None) is None: - # Since we're in control of the event loop, we can cache the name of the async - # library - token = sniffio.current_async_library_cvar.set(backend) - - try: - backend_options = backend_options or {} - return async_backend.run(func, args, {}, backend_options) - finally: - if token: - sniffio.current_async_library_cvar.reset(token) - - -async def sleep(delay: float) -> None: - """ - Pause the current task for the specified duration. - - :param delay: the duration, in seconds - - """ - return await get_async_backend().sleep(delay) - - -async def sleep_forever() -> None: - """ - Pause the current task until it's cancelled. - - This is a shortcut for ``sleep(math.inf)``. - - .. versionadded:: 3.1 - - """ - await sleep(math.inf) - - -async def sleep_until(deadline: float) -> None: - """ - Pause the current task until the given time. - - :param deadline: the absolute time to wake up at (according to the internal - monotonic clock of the event loop) - - .. versionadded:: 3.1 - - """ - now = current_time() - await sleep(max(deadline - now, 0)) - - -def current_time() -> float: - """ - Return the current value of the event loop's internal clock. - - :return: the clock value (seconds) - - """ - return get_async_backend().current_time() - - -def get_all_backends() -> tuple[str, ...]: - """Return a tuple of the names of all built-in backends.""" - return BACKENDS - - -def get_cancelled_exc_class() -> type[BaseException]: - """Return the current async library's cancellation exception class.""" - return get_async_backend().cancelled_exception_class() - - -# -# Private API -# - - -@contextmanager -def claim_worker_thread( - backend_class: type[AsyncBackend], token: object -) -> Generator[Any, None, None]: - threadlocals.current_async_backend = backend_class - threadlocals.current_token = token - try: - yield - finally: - del threadlocals.current_async_backend - del threadlocals.current_token - - -def get_async_backend(asynclib_name: str | None = None) -> type[AsyncBackend]: - if asynclib_name is None: - asynclib_name = sniffio.current_async_library() - - # We use our own dict instead of sys.modules to get the already imported back-end - # class because the appropriate modules in sys.modules could potentially be only - # partially initialized - try: - return loaded_backends[asynclib_name] - except KeyError: - module = import_module(f"anyio._backends._{asynclib_name}") - loaded_backends[asynclib_name] = module.backend_class - return module.backend_class diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_exceptions.py b/venv/lib/python3.11/site-packages/anyio/_core/_exceptions.py deleted file mode 100644 index 16b9448..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_exceptions.py +++ /dev/null @@ -1,126 +0,0 @@ -from __future__ import annotations - -import sys -from collections.abc import Generator -from textwrap import dedent -from typing import Any - -if sys.version_info < (3, 11): - from exceptiongroup import BaseExceptionGroup - - -class BrokenResourceError(Exception): - """ - Raised when trying to use a resource that has been rendered unusable due to external - causes (e.g. a send stream whose peer has disconnected). - """ - - -class BrokenWorkerProcess(Exception): - """ - Raised by :meth:`~anyio.to_process.run_sync` if the worker process terminates abruptly or - otherwise misbehaves. - """ - - -class BrokenWorkerIntepreter(Exception): - """ - Raised by :meth:`~anyio.to_interpreter.run_sync` if an unexpected exception is - raised in the subinterpreter. - """ - - def __init__(self, excinfo: Any): - # This was adapted from concurrent.futures.interpreter.ExecutionFailed - msg = excinfo.formatted - if not msg: - if excinfo.type and excinfo.msg: - msg = f"{excinfo.type.__name__}: {excinfo.msg}" - else: - msg = excinfo.type.__name__ or excinfo.msg - - super().__init__(msg) - self.excinfo = excinfo - - def __str__(self) -> str: - try: - formatted = self.excinfo.errdisplay - except Exception: - return super().__str__() - else: - return dedent( - f""" - {super().__str__()} - - Uncaught in the interpreter: - - {formatted} - """.strip() - ) - - -class BusyResourceError(Exception): - """ - Raised when two tasks are trying to read from or write to the same resource - concurrently. - """ - - def __init__(self, action: str): - super().__init__(f"Another task is already {action} this resource") - - -class ClosedResourceError(Exception): - """Raised when trying to use a resource that has been closed.""" - - -class DelimiterNotFound(Exception): - """ - Raised during - :meth:`~anyio.streams.buffered.BufferedByteReceiveStream.receive_until` if the - maximum number of bytes has been read without the delimiter being found. - """ - - def __init__(self, max_bytes: int) -> None: - super().__init__( - f"The delimiter was not found among the first {max_bytes} bytes" - ) - - -class EndOfStream(Exception): - """ - Raised when trying to read from a stream that has been closed from the other end. - """ - - -class IncompleteRead(Exception): - """ - Raised during - :meth:`~anyio.streams.buffered.BufferedByteReceiveStream.receive_exactly` or - :meth:`~anyio.streams.buffered.BufferedByteReceiveStream.receive_until` if the - connection is closed before the requested amount of bytes has been read. - """ - - def __init__(self) -> None: - super().__init__( - "The stream was closed before the read operation could be completed" - ) - - -class TypedAttributeLookupError(LookupError): - """ - Raised by :meth:`~anyio.TypedAttributeProvider.extra` when the given typed attribute - is not found and no default value has been given. - """ - - -class WouldBlock(Exception): - """Raised by ``X_nowait`` functions if ``X()`` would block.""" - - -def iterate_exceptions( - exception: BaseException, -) -> Generator[BaseException, None, None]: - if isinstance(exception, BaseExceptionGroup): - for exc in exception.exceptions: - yield from iterate_exceptions(exc) - else: - yield exception diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_fileio.py b/venv/lib/python3.11/site-packages/anyio/_core/_fileio.py deleted file mode 100644 index a0d6198..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_fileio.py +++ /dev/null @@ -1,742 +0,0 @@ -from __future__ import annotations - -import os -import pathlib -import sys -from collections.abc import ( - AsyncIterator, - Callable, - Iterable, - Iterator, - Sequence, -) -from dataclasses import dataclass -from functools import partial -from os import PathLike -from typing import ( - IO, - TYPE_CHECKING, - Any, - AnyStr, - ClassVar, - Final, - Generic, - overload, -) - -from .. import to_thread -from ..abc import AsyncResource - -if TYPE_CHECKING: - from types import ModuleType - - from _typeshed import OpenBinaryMode, OpenTextMode, ReadableBuffer, WriteableBuffer -else: - ReadableBuffer = OpenBinaryMode = OpenTextMode = WriteableBuffer = object - - -class AsyncFile(AsyncResource, Generic[AnyStr]): - """ - An asynchronous file object. - - This class wraps a standard file object and provides async friendly versions of the - following blocking methods (where available on the original file object): - - * read - * read1 - * readline - * readlines - * readinto - * readinto1 - * write - * writelines - * truncate - * seek - * tell - * flush - - All other methods are directly passed through. - - This class supports the asynchronous context manager protocol which closes the - underlying file at the end of the context block. - - This class also supports asynchronous iteration:: - - async with await open_file(...) as f: - async for line in f: - print(line) - """ - - def __init__(self, fp: IO[AnyStr]) -> None: - self._fp: Any = fp - - def __getattr__(self, name: str) -> object: - return getattr(self._fp, name) - - @property - def wrapped(self) -> IO[AnyStr]: - """The wrapped file object.""" - return self._fp - - async def __aiter__(self) -> AsyncIterator[AnyStr]: - while True: - line = await self.readline() - if line: - yield line - else: - break - - async def aclose(self) -> None: - return await to_thread.run_sync(self._fp.close) - - async def read(self, size: int = -1) -> AnyStr: - return await to_thread.run_sync(self._fp.read, size) - - async def read1(self: AsyncFile[bytes], size: int = -1) -> bytes: - return await to_thread.run_sync(self._fp.read1, size) - - async def readline(self) -> AnyStr: - return await to_thread.run_sync(self._fp.readline) - - async def readlines(self) -> list[AnyStr]: - return await to_thread.run_sync(self._fp.readlines) - - async def readinto(self: AsyncFile[bytes], b: WriteableBuffer) -> int: - return await to_thread.run_sync(self._fp.readinto, b) - - async def readinto1(self: AsyncFile[bytes], b: WriteableBuffer) -> int: - return await to_thread.run_sync(self._fp.readinto1, b) - - @overload - async def write(self: AsyncFile[bytes], b: ReadableBuffer) -> int: ... - - @overload - async def write(self: AsyncFile[str], b: str) -> int: ... - - async def write(self, b: ReadableBuffer | str) -> int: - return await to_thread.run_sync(self._fp.write, b) - - @overload - async def writelines( - self: AsyncFile[bytes], lines: Iterable[ReadableBuffer] - ) -> None: ... - - @overload - async def writelines(self: AsyncFile[str], lines: Iterable[str]) -> None: ... - - async def writelines(self, lines: Iterable[ReadableBuffer] | Iterable[str]) -> None: - return await to_thread.run_sync(self._fp.writelines, lines) - - async def truncate(self, size: int | None = None) -> int: - return await to_thread.run_sync(self._fp.truncate, size) - - async def seek(self, offset: int, whence: int | None = os.SEEK_SET) -> int: - return await to_thread.run_sync(self._fp.seek, offset, whence) - - async def tell(self) -> int: - return await to_thread.run_sync(self._fp.tell) - - async def flush(self) -> None: - return await to_thread.run_sync(self._fp.flush) - - -@overload -async def open_file( - file: str | PathLike[str] | int, - mode: OpenBinaryMode, - buffering: int = ..., - encoding: str | None = ..., - errors: str | None = ..., - newline: str | None = ..., - closefd: bool = ..., - opener: Callable[[str, int], int] | None = ..., -) -> AsyncFile[bytes]: ... - - -@overload -async def open_file( - file: str | PathLike[str] | int, - mode: OpenTextMode = ..., - buffering: int = ..., - encoding: str | None = ..., - errors: str | None = ..., - newline: str | None = ..., - closefd: bool = ..., - opener: Callable[[str, int], int] | None = ..., -) -> AsyncFile[str]: ... - - -async def open_file( - file: str | PathLike[str] | int, - mode: str = "r", - buffering: int = -1, - encoding: str | None = None, - errors: str | None = None, - newline: str | None = None, - closefd: bool = True, - opener: Callable[[str, int], int] | None = None, -) -> AsyncFile[Any]: - """ - Open a file asynchronously. - - The arguments are exactly the same as for the builtin :func:`open`. - - :return: an asynchronous file object - - """ - fp = await to_thread.run_sync( - open, file, mode, buffering, encoding, errors, newline, closefd, opener - ) - return AsyncFile(fp) - - -def wrap_file(file: IO[AnyStr]) -> AsyncFile[AnyStr]: - """ - Wrap an existing file as an asynchronous file. - - :param file: an existing file-like object - :return: an asynchronous file object - - """ - return AsyncFile(file) - - -@dataclass(eq=False) -class _PathIterator(AsyncIterator["Path"]): - iterator: Iterator[PathLike[str]] - - async def __anext__(self) -> Path: - nextval = await to_thread.run_sync( - next, self.iterator, None, abandon_on_cancel=True - ) - if nextval is None: - raise StopAsyncIteration from None - - return Path(nextval) - - -class Path: - """ - An asynchronous version of :class:`pathlib.Path`. - - This class cannot be substituted for :class:`pathlib.Path` or - :class:`pathlib.PurePath`, but it is compatible with the :class:`os.PathLike` - interface. - - It implements the Python 3.10 version of :class:`pathlib.Path` interface, except for - the deprecated :meth:`~pathlib.Path.link_to` method. - - Some methods may be unavailable or have limited functionality, based on the Python - version: - - * :meth:`~pathlib.Path.copy` (available on Python 3.14 or later) - * :meth:`~pathlib.Path.copy_into` (available on Python 3.14 or later) - * :meth:`~pathlib.Path.from_uri` (available on Python 3.13 or later) - * :meth:`~pathlib.PurePath.full_match` (available on Python 3.13 or later) - * :attr:`~pathlib.Path.info` (available on Python 3.14 or later) - * :meth:`~pathlib.Path.is_junction` (available on Python 3.12 or later) - * :meth:`~pathlib.PurePath.match` (the ``case_sensitive`` parameter is only - available on Python 3.13 or later) - * :meth:`~pathlib.Path.move` (available on Python 3.14 or later) - * :meth:`~pathlib.Path.move_into` (available on Python 3.14 or later) - * :meth:`~pathlib.PurePath.relative_to` (the ``walk_up`` parameter is only available - on Python 3.12 or later) - * :meth:`~pathlib.Path.walk` (available on Python 3.12 or later) - - Any methods that do disk I/O need to be awaited on. These methods are: - - * :meth:`~pathlib.Path.absolute` - * :meth:`~pathlib.Path.chmod` - * :meth:`~pathlib.Path.cwd` - * :meth:`~pathlib.Path.exists` - * :meth:`~pathlib.Path.expanduser` - * :meth:`~pathlib.Path.group` - * :meth:`~pathlib.Path.hardlink_to` - * :meth:`~pathlib.Path.home` - * :meth:`~pathlib.Path.is_block_device` - * :meth:`~pathlib.Path.is_char_device` - * :meth:`~pathlib.Path.is_dir` - * :meth:`~pathlib.Path.is_fifo` - * :meth:`~pathlib.Path.is_file` - * :meth:`~pathlib.Path.is_junction` - * :meth:`~pathlib.Path.is_mount` - * :meth:`~pathlib.Path.is_socket` - * :meth:`~pathlib.Path.is_symlink` - * :meth:`~pathlib.Path.lchmod` - * :meth:`~pathlib.Path.lstat` - * :meth:`~pathlib.Path.mkdir` - * :meth:`~pathlib.Path.open` - * :meth:`~pathlib.Path.owner` - * :meth:`~pathlib.Path.read_bytes` - * :meth:`~pathlib.Path.read_text` - * :meth:`~pathlib.Path.readlink` - * :meth:`~pathlib.Path.rename` - * :meth:`~pathlib.Path.replace` - * :meth:`~pathlib.Path.resolve` - * :meth:`~pathlib.Path.rmdir` - * :meth:`~pathlib.Path.samefile` - * :meth:`~pathlib.Path.stat` - * :meth:`~pathlib.Path.symlink_to` - * :meth:`~pathlib.Path.touch` - * :meth:`~pathlib.Path.unlink` - * :meth:`~pathlib.Path.walk` - * :meth:`~pathlib.Path.write_bytes` - * :meth:`~pathlib.Path.write_text` - - Additionally, the following methods return an async iterator yielding - :class:`~.Path` objects: - - * :meth:`~pathlib.Path.glob` - * :meth:`~pathlib.Path.iterdir` - * :meth:`~pathlib.Path.rglob` - """ - - __slots__ = "_path", "__weakref__" - - __weakref__: Any - - def __init__(self, *args: str | PathLike[str]) -> None: - self._path: Final[pathlib.Path] = pathlib.Path(*args) - - def __fspath__(self) -> str: - return self._path.__fspath__() - - def __str__(self) -> str: - return self._path.__str__() - - def __repr__(self) -> str: - return f"{self.__class__.__name__}({self.as_posix()!r})" - - def __bytes__(self) -> bytes: - return self._path.__bytes__() - - def __hash__(self) -> int: - return self._path.__hash__() - - def __eq__(self, other: object) -> bool: - target = other._path if isinstance(other, Path) else other - return self._path.__eq__(target) - - def __lt__(self, other: pathlib.PurePath | Path) -> bool: - target = other._path if isinstance(other, Path) else other - return self._path.__lt__(target) - - def __le__(self, other: pathlib.PurePath | Path) -> bool: - target = other._path if isinstance(other, Path) else other - return self._path.__le__(target) - - def __gt__(self, other: pathlib.PurePath | Path) -> bool: - target = other._path if isinstance(other, Path) else other - return self._path.__gt__(target) - - def __ge__(self, other: pathlib.PurePath | Path) -> bool: - target = other._path if isinstance(other, Path) else other - return self._path.__ge__(target) - - def __truediv__(self, other: str | PathLike[str]) -> Path: - return Path(self._path / other) - - def __rtruediv__(self, other: str | PathLike[str]) -> Path: - return Path(other) / self - - @property - def parts(self) -> tuple[str, ...]: - return self._path.parts - - @property - def drive(self) -> str: - return self._path.drive - - @property - def root(self) -> str: - return self._path.root - - @property - def anchor(self) -> str: - return self._path.anchor - - @property - def parents(self) -> Sequence[Path]: - return tuple(Path(p) for p in self._path.parents) - - @property - def parent(self) -> Path: - return Path(self._path.parent) - - @property - def name(self) -> str: - return self._path.name - - @property - def suffix(self) -> str: - return self._path.suffix - - @property - def suffixes(self) -> list[str]: - return self._path.suffixes - - @property - def stem(self) -> str: - return self._path.stem - - async def absolute(self) -> Path: - path = await to_thread.run_sync(self._path.absolute) - return Path(path) - - def as_posix(self) -> str: - return self._path.as_posix() - - def as_uri(self) -> str: - return self._path.as_uri() - - if sys.version_info >= (3, 13): - parser: ClassVar[ModuleType] = pathlib.Path.parser - - @classmethod - def from_uri(cls, uri: str) -> Path: - return Path(pathlib.Path.from_uri(uri)) - - def full_match( - self, path_pattern: str, *, case_sensitive: bool | None = None - ) -> bool: - return self._path.full_match(path_pattern, case_sensitive=case_sensitive) - - def match( - self, path_pattern: str, *, case_sensitive: bool | None = None - ) -> bool: - return self._path.match(path_pattern, case_sensitive=case_sensitive) - else: - - def match(self, path_pattern: str) -> bool: - return self._path.match(path_pattern) - - if sys.version_info >= (3, 14): - - @property - def info(self) -> Any: # TODO: add return type annotation when Typeshed gets it - return self._path.info - - async def copy( - self, - target: str | os.PathLike[str], - *, - follow_symlinks: bool = True, - dirs_exist_ok: bool = False, - preserve_metadata: bool = False, - ) -> Path: - func = partial( - self._path.copy, - follow_symlinks=follow_symlinks, - dirs_exist_ok=dirs_exist_ok, - preserve_metadata=preserve_metadata, - ) - return Path(await to_thread.run_sync(func, target)) - - async def copy_into( - self, - target_dir: str | os.PathLike[str], - *, - follow_symlinks: bool = True, - dirs_exist_ok: bool = False, - preserve_metadata: bool = False, - ) -> Path: - func = partial( - self._path.copy_into, - follow_symlinks=follow_symlinks, - dirs_exist_ok=dirs_exist_ok, - preserve_metadata=preserve_metadata, - ) - return Path(await to_thread.run_sync(func, target_dir)) - - async def move(self, target: str | os.PathLike[str]) -> Path: - # Upstream does not handle anyio.Path properly as a PathLike - target = pathlib.Path(target) - return Path(await to_thread.run_sync(self._path.move, target)) - - async def move_into( - self, - target_dir: str | os.PathLike[str], - ) -> Path: - return Path(await to_thread.run_sync(self._path.move_into, target_dir)) - - def is_relative_to(self, other: str | PathLike[str]) -> bool: - try: - self.relative_to(other) - return True - except ValueError: - return False - - async def chmod(self, mode: int, *, follow_symlinks: bool = True) -> None: - func = partial(os.chmod, follow_symlinks=follow_symlinks) - return await to_thread.run_sync(func, self._path, mode) - - @classmethod - async def cwd(cls) -> Path: - path = await to_thread.run_sync(pathlib.Path.cwd) - return cls(path) - - async def exists(self) -> bool: - return await to_thread.run_sync(self._path.exists, abandon_on_cancel=True) - - async def expanduser(self) -> Path: - return Path( - await to_thread.run_sync(self._path.expanduser, abandon_on_cancel=True) - ) - - def glob(self, pattern: str) -> AsyncIterator[Path]: - gen = self._path.glob(pattern) - return _PathIterator(gen) - - async def group(self) -> str: - return await to_thread.run_sync(self._path.group, abandon_on_cancel=True) - - async def hardlink_to( - self, target: str | bytes | PathLike[str] | PathLike[bytes] - ) -> None: - if isinstance(target, Path): - target = target._path - - await to_thread.run_sync(os.link, target, self) - - @classmethod - async def home(cls) -> Path: - home_path = await to_thread.run_sync(pathlib.Path.home) - return cls(home_path) - - def is_absolute(self) -> bool: - return self._path.is_absolute() - - async def is_block_device(self) -> bool: - return await to_thread.run_sync( - self._path.is_block_device, abandon_on_cancel=True - ) - - async def is_char_device(self) -> bool: - return await to_thread.run_sync( - self._path.is_char_device, abandon_on_cancel=True - ) - - async def is_dir(self) -> bool: - return await to_thread.run_sync(self._path.is_dir, abandon_on_cancel=True) - - async def is_fifo(self) -> bool: - return await to_thread.run_sync(self._path.is_fifo, abandon_on_cancel=True) - - async def is_file(self) -> bool: - return await to_thread.run_sync(self._path.is_file, abandon_on_cancel=True) - - if sys.version_info >= (3, 12): - - async def is_junction(self) -> bool: - return await to_thread.run_sync(self._path.is_junction) - - async def is_mount(self) -> bool: - return await to_thread.run_sync( - os.path.ismount, self._path, abandon_on_cancel=True - ) - - def is_reserved(self) -> bool: - return self._path.is_reserved() - - async def is_socket(self) -> bool: - return await to_thread.run_sync(self._path.is_socket, abandon_on_cancel=True) - - async def is_symlink(self) -> bool: - return await to_thread.run_sync(self._path.is_symlink, abandon_on_cancel=True) - - async def iterdir(self) -> AsyncIterator[Path]: - gen = ( - self._path.iterdir() - if sys.version_info < (3, 13) - else await to_thread.run_sync(self._path.iterdir, abandon_on_cancel=True) - ) - async for path in _PathIterator(gen): - yield path - - def joinpath(self, *args: str | PathLike[str]) -> Path: - return Path(self._path.joinpath(*args)) - - async def lchmod(self, mode: int) -> None: - await to_thread.run_sync(self._path.lchmod, mode) - - async def lstat(self) -> os.stat_result: - return await to_thread.run_sync(self._path.lstat, abandon_on_cancel=True) - - async def mkdir( - self, mode: int = 0o777, parents: bool = False, exist_ok: bool = False - ) -> None: - await to_thread.run_sync(self._path.mkdir, mode, parents, exist_ok) - - @overload - async def open( - self, - mode: OpenBinaryMode, - buffering: int = ..., - encoding: str | None = ..., - errors: str | None = ..., - newline: str | None = ..., - ) -> AsyncFile[bytes]: ... - - @overload - async def open( - self, - mode: OpenTextMode = ..., - buffering: int = ..., - encoding: str | None = ..., - errors: str | None = ..., - newline: str | None = ..., - ) -> AsyncFile[str]: ... - - async def open( - self, - mode: str = "r", - buffering: int = -1, - encoding: str | None = None, - errors: str | None = None, - newline: str | None = None, - ) -> AsyncFile[Any]: - fp = await to_thread.run_sync( - self._path.open, mode, buffering, encoding, errors, newline - ) - return AsyncFile(fp) - - async def owner(self) -> str: - return await to_thread.run_sync(self._path.owner, abandon_on_cancel=True) - - async def read_bytes(self) -> bytes: - return await to_thread.run_sync(self._path.read_bytes) - - async def read_text( - self, encoding: str | None = None, errors: str | None = None - ) -> str: - return await to_thread.run_sync(self._path.read_text, encoding, errors) - - if sys.version_info >= (3, 12): - - def relative_to( - self, *other: str | PathLike[str], walk_up: bool = False - ) -> Path: - return Path(self._path.relative_to(*other, walk_up=walk_up)) - - else: - - def relative_to(self, *other: str | PathLike[str]) -> Path: - return Path(self._path.relative_to(*other)) - - async def readlink(self) -> Path: - target = await to_thread.run_sync(os.readlink, self._path) - return Path(target) - - async def rename(self, target: str | pathlib.PurePath | Path) -> Path: - if isinstance(target, Path): - target = target._path - - await to_thread.run_sync(self._path.rename, target) - return Path(target) - - async def replace(self, target: str | pathlib.PurePath | Path) -> Path: - if isinstance(target, Path): - target = target._path - - await to_thread.run_sync(self._path.replace, target) - return Path(target) - - async def resolve(self, strict: bool = False) -> Path: - func = partial(self._path.resolve, strict=strict) - return Path(await to_thread.run_sync(func, abandon_on_cancel=True)) - - def rglob(self, pattern: str) -> AsyncIterator[Path]: - gen = self._path.rglob(pattern) - return _PathIterator(gen) - - async def rmdir(self) -> None: - await to_thread.run_sync(self._path.rmdir) - - async def samefile(self, other_path: str | PathLike[str]) -> bool: - if isinstance(other_path, Path): - other_path = other_path._path - - return await to_thread.run_sync( - self._path.samefile, other_path, abandon_on_cancel=True - ) - - async def stat(self, *, follow_symlinks: bool = True) -> os.stat_result: - func = partial(os.stat, follow_symlinks=follow_symlinks) - return await to_thread.run_sync(func, self._path, abandon_on_cancel=True) - - async def symlink_to( - self, - target: str | bytes | PathLike[str] | PathLike[bytes], - target_is_directory: bool = False, - ) -> None: - if isinstance(target, Path): - target = target._path - - await to_thread.run_sync(self._path.symlink_to, target, target_is_directory) - - async def touch(self, mode: int = 0o666, exist_ok: bool = True) -> None: - await to_thread.run_sync(self._path.touch, mode, exist_ok) - - async def unlink(self, missing_ok: bool = False) -> None: - try: - await to_thread.run_sync(self._path.unlink) - except FileNotFoundError: - if not missing_ok: - raise - - if sys.version_info >= (3, 12): - - async def walk( - self, - top_down: bool = True, - on_error: Callable[[OSError], object] | None = None, - follow_symlinks: bool = False, - ) -> AsyncIterator[tuple[Path, list[str], list[str]]]: - def get_next_value() -> tuple[pathlib.Path, list[str], list[str]] | None: - try: - return next(gen) - except StopIteration: - return None - - gen = self._path.walk(top_down, on_error, follow_symlinks) - while True: - value = await to_thread.run_sync(get_next_value) - if value is None: - return - - root, dirs, paths = value - yield Path(root), dirs, paths - - def with_name(self, name: str) -> Path: - return Path(self._path.with_name(name)) - - def with_stem(self, stem: str) -> Path: - return Path(self._path.with_name(stem + self._path.suffix)) - - def with_suffix(self, suffix: str) -> Path: - return Path(self._path.with_suffix(suffix)) - - def with_segments(self, *pathsegments: str | PathLike[str]) -> Path: - return Path(*pathsegments) - - async def write_bytes(self, data: bytes) -> int: - return await to_thread.run_sync(self._path.write_bytes, data) - - async def write_text( - self, - data: str, - encoding: str | None = None, - errors: str | None = None, - newline: str | None = None, - ) -> int: - # Path.write_text() does not support the "newline" parameter before Python 3.10 - def sync_write_text() -> int: - with self._path.open( - "w", encoding=encoding, errors=errors, newline=newline - ) as fp: - return fp.write(data) - - return await to_thread.run_sync(sync_write_text) - - -PathLike.register(Path) diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_resources.py b/venv/lib/python3.11/site-packages/anyio/_core/_resources.py deleted file mode 100644 index b9a5344..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_resources.py +++ /dev/null @@ -1,18 +0,0 @@ -from __future__ import annotations - -from ..abc import AsyncResource -from ._tasks import CancelScope - - -async def aclose_forcefully(resource: AsyncResource) -> None: - """ - Close an asynchronous resource in a cancelled scope. - - Doing this closes the resource without waiting on anything. - - :param resource: the resource to close - - """ - with CancelScope() as scope: - scope.cancel() - await resource.aclose() diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_signals.py b/venv/lib/python3.11/site-packages/anyio/_core/_signals.py deleted file mode 100644 index f3451d3..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_signals.py +++ /dev/null @@ -1,27 +0,0 @@ -from __future__ import annotations - -from collections.abc import AsyncIterator -from contextlib import AbstractContextManager -from signal import Signals - -from ._eventloop import get_async_backend - - -def open_signal_receiver( - *signals: Signals, -) -> AbstractContextManager[AsyncIterator[Signals]]: - """ - Start receiving operating system signals. - - :param signals: signals to receive (e.g. ``signal.SIGINT``) - :return: an asynchronous context manager for an asynchronous iterator which yields - signal numbers - - .. warning:: Windows does not support signals natively so it is best to avoid - relying on this in cross-platform applications. - - .. warning:: On asyncio, this permanently replaces any previous signal handler for - the given signals, as set via :meth:`~asyncio.loop.add_signal_handler`. - - """ - return get_async_backend().open_signal_receiver(*signals) diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_sockets.py b/venv/lib/python3.11/site-packages/anyio/_core/_sockets.py deleted file mode 100644 index 054bcdd..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_sockets.py +++ /dev/null @@ -1,792 +0,0 @@ -from __future__ import annotations - -import errno -import os -import socket -import ssl -import stat -import sys -from collections.abc import Awaitable -from ipaddress import IPv6Address, ip_address -from os import PathLike, chmod -from socket import AddressFamily, SocketKind -from typing import TYPE_CHECKING, Any, Literal, cast, overload - -from .. import to_thread -from ..abc import ( - ConnectedUDPSocket, - ConnectedUNIXDatagramSocket, - IPAddressType, - IPSockAddrType, - SocketListener, - SocketStream, - UDPSocket, - UNIXDatagramSocket, - UNIXSocketStream, -) -from ..streams.stapled import MultiListener -from ..streams.tls import TLSStream -from ._eventloop import get_async_backend -from ._resources import aclose_forcefully -from ._synchronization import Event -from ._tasks import create_task_group, move_on_after - -if TYPE_CHECKING: - from _typeshed import FileDescriptorLike -else: - FileDescriptorLike = object - -if sys.version_info < (3, 11): - from exceptiongroup import ExceptionGroup - -if sys.version_info < (3, 13): - from typing_extensions import deprecated -else: - from warnings import deprecated - -IPPROTO_IPV6 = getattr(socket, "IPPROTO_IPV6", 41) # https://bugs.python.org/issue29515 - -AnyIPAddressFamily = Literal[ - AddressFamily.AF_UNSPEC, AddressFamily.AF_INET, AddressFamily.AF_INET6 -] -IPAddressFamily = Literal[AddressFamily.AF_INET, AddressFamily.AF_INET6] - - -# tls_hostname given -@overload -async def connect_tcp( - remote_host: IPAddressType, - remote_port: int, - *, - local_host: IPAddressType | None = ..., - ssl_context: ssl.SSLContext | None = ..., - tls_standard_compatible: bool = ..., - tls_hostname: str, - happy_eyeballs_delay: float = ..., -) -> TLSStream: ... - - -# ssl_context given -@overload -async def connect_tcp( - remote_host: IPAddressType, - remote_port: int, - *, - local_host: IPAddressType | None = ..., - ssl_context: ssl.SSLContext, - tls_standard_compatible: bool = ..., - tls_hostname: str | None = ..., - happy_eyeballs_delay: float = ..., -) -> TLSStream: ... - - -# tls=True -@overload -async def connect_tcp( - remote_host: IPAddressType, - remote_port: int, - *, - local_host: IPAddressType | None = ..., - tls: Literal[True], - ssl_context: ssl.SSLContext | None = ..., - tls_standard_compatible: bool = ..., - tls_hostname: str | None = ..., - happy_eyeballs_delay: float = ..., -) -> TLSStream: ... - - -# tls=False -@overload -async def connect_tcp( - remote_host: IPAddressType, - remote_port: int, - *, - local_host: IPAddressType | None = ..., - tls: Literal[False], - ssl_context: ssl.SSLContext | None = ..., - tls_standard_compatible: bool = ..., - tls_hostname: str | None = ..., - happy_eyeballs_delay: float = ..., -) -> SocketStream: ... - - -# No TLS arguments -@overload -async def connect_tcp( - remote_host: IPAddressType, - remote_port: int, - *, - local_host: IPAddressType | None = ..., - happy_eyeballs_delay: float = ..., -) -> SocketStream: ... - - -async def connect_tcp( - remote_host: IPAddressType, - remote_port: int, - *, - local_host: IPAddressType | None = None, - tls: bool = False, - ssl_context: ssl.SSLContext | None = None, - tls_standard_compatible: bool = True, - tls_hostname: str | None = None, - happy_eyeballs_delay: float = 0.25, -) -> SocketStream | TLSStream: - """ - Connect to a host using the TCP protocol. - - This function implements the stateless version of the Happy Eyeballs algorithm (RFC - 6555). If ``remote_host`` is a host name that resolves to multiple IP addresses, - each one is tried until one connection attempt succeeds. If the first attempt does - not connected within 250 milliseconds, a second attempt is started using the next - address in the list, and so on. On IPv6 enabled systems, an IPv6 address (if - available) is tried first. - - When the connection has been established, a TLS handshake will be done if either - ``ssl_context`` or ``tls_hostname`` is not ``None``, or if ``tls`` is ``True``. - - :param remote_host: the IP address or host name to connect to - :param remote_port: port on the target host to connect to - :param local_host: the interface address or name to bind the socket to before - connecting - :param tls: ``True`` to do a TLS handshake with the connected stream and return a - :class:`~anyio.streams.tls.TLSStream` instead - :param ssl_context: the SSL context object to use (if omitted, a default context is - created) - :param tls_standard_compatible: If ``True``, performs the TLS shutdown handshake - before closing the stream and requires that the server does this as well. - Otherwise, :exc:`~ssl.SSLEOFError` may be raised during reads from the stream. - Some protocols, such as HTTP, require this option to be ``False``. - See :meth:`~ssl.SSLContext.wrap_socket` for details. - :param tls_hostname: host name to check the server certificate against (defaults to - the value of ``remote_host``) - :param happy_eyeballs_delay: delay (in seconds) before starting the next connection - attempt - :return: a socket stream object if no TLS handshake was done, otherwise a TLS stream - :raises OSError: if the connection attempt fails - - """ - # Placed here due to https://github.com/python/mypy/issues/7057 - connected_stream: SocketStream | None = None - - async def try_connect(remote_host: str, event: Event) -> None: - nonlocal connected_stream - try: - stream = await asynclib.connect_tcp(remote_host, remote_port, local_address) - except OSError as exc: - oserrors.append(exc) - return - else: - if connected_stream is None: - connected_stream = stream - tg.cancel_scope.cancel() - else: - await stream.aclose() - finally: - event.set() - - asynclib = get_async_backend() - local_address: IPSockAddrType | None = None - family = socket.AF_UNSPEC - if local_host: - gai_res = await getaddrinfo(str(local_host), None) - family, *_, local_address = gai_res[0] - - target_host = str(remote_host) - try: - addr_obj = ip_address(remote_host) - except ValueError: - addr_obj = None - - if addr_obj is not None: - if isinstance(addr_obj, IPv6Address): - target_addrs = [(socket.AF_INET6, addr_obj.compressed)] - else: - target_addrs = [(socket.AF_INET, addr_obj.compressed)] - else: - # getaddrinfo() will raise an exception if name resolution fails - gai_res = await getaddrinfo( - target_host, remote_port, family=family, type=socket.SOCK_STREAM - ) - - # Organize the list so that the first address is an IPv6 address (if available) - # and the second one is an IPv4 addresses. The rest can be in whatever order. - v6_found = v4_found = False - target_addrs = [] - for af, *rest, sa in gai_res: - if af == socket.AF_INET6 and not v6_found: - v6_found = True - target_addrs.insert(0, (af, sa[0])) - elif af == socket.AF_INET and not v4_found and v6_found: - v4_found = True - target_addrs.insert(1, (af, sa[0])) - else: - target_addrs.append((af, sa[0])) - - oserrors: list[OSError] = [] - try: - async with create_task_group() as tg: - for i, (af, addr) in enumerate(target_addrs): - event = Event() - tg.start_soon(try_connect, addr, event) - with move_on_after(happy_eyeballs_delay): - await event.wait() - - if connected_stream is None: - cause = ( - oserrors[0] - if len(oserrors) == 1 - else ExceptionGroup("multiple connection attempts failed", oserrors) - ) - raise OSError("All connection attempts failed") from cause - finally: - oserrors.clear() - - if tls or tls_hostname or ssl_context: - try: - return await TLSStream.wrap( - connected_stream, - server_side=False, - hostname=tls_hostname or str(remote_host), - ssl_context=ssl_context, - standard_compatible=tls_standard_compatible, - ) - except BaseException: - await aclose_forcefully(connected_stream) - raise - - return connected_stream - - -async def connect_unix(path: str | bytes | PathLike[Any]) -> UNIXSocketStream: - """ - Connect to the given UNIX socket. - - Not available on Windows. - - :param path: path to the socket - :return: a socket stream object - - """ - path = os.fspath(path) - return await get_async_backend().connect_unix(path) - - -async def create_tcp_listener( - *, - local_host: IPAddressType | None = None, - local_port: int = 0, - family: AnyIPAddressFamily = socket.AddressFamily.AF_UNSPEC, - backlog: int = 65536, - reuse_port: bool = False, -) -> MultiListener[SocketStream]: - """ - Create a TCP socket listener. - - :param local_port: port number to listen on - :param local_host: IP address of the interface to listen on. If omitted, listen on - all IPv4 and IPv6 interfaces. To listen on all interfaces on a specific address - family, use ``0.0.0.0`` for IPv4 or ``::`` for IPv6. - :param family: address family (used if ``local_host`` was omitted) - :param backlog: maximum number of queued incoming connections (up to a maximum of - 2**16, or 65536) - :param reuse_port: ``True`` to allow multiple sockets to bind to the same - address/port (not supported on Windows) - :return: a list of listener objects - - """ - asynclib = get_async_backend() - backlog = min(backlog, 65536) - local_host = str(local_host) if local_host is not None else None - gai_res = await getaddrinfo( - local_host, - local_port, - family=family, - type=socket.SocketKind.SOCK_STREAM if sys.platform == "win32" else 0, - flags=socket.AI_PASSIVE | socket.AI_ADDRCONFIG, - ) - listeners: list[SocketListener] = [] - try: - # The set() is here to work around a glibc bug: - # https://sourceware.org/bugzilla/show_bug.cgi?id=14969 - sockaddr: tuple[str, int] | tuple[str, int, int, int] - for fam, kind, *_, sockaddr in sorted(set(gai_res)): - # Workaround for an uvloop bug where we don't get the correct scope ID for - # IPv6 link-local addresses when passing type=socket.SOCK_STREAM to - # getaddrinfo(): https://github.com/MagicStack/uvloop/issues/539 - if sys.platform != "win32" and kind is not SocketKind.SOCK_STREAM: - continue - - raw_socket = socket.socket(fam) - raw_socket.setblocking(False) - - # For Windows, enable exclusive address use. For others, enable address - # reuse. - if sys.platform == "win32": - raw_socket.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1) - else: - raw_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - - if reuse_port: - raw_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) - - # If only IPv6 was requested, disable dual stack operation - if fam == socket.AF_INET6: - raw_socket.setsockopt(IPPROTO_IPV6, socket.IPV6_V6ONLY, 1) - - # Workaround for #554 - if "%" in sockaddr[0]: - addr, scope_id = sockaddr[0].split("%", 1) - sockaddr = (addr, sockaddr[1], 0, int(scope_id)) - - raw_socket.bind(sockaddr) - raw_socket.listen(backlog) - listener = asynclib.create_tcp_listener(raw_socket) - listeners.append(listener) - except BaseException: - for listener in listeners: - await listener.aclose() - - raise - - return MultiListener(listeners) - - -async def create_unix_listener( - path: str | bytes | PathLike[Any], - *, - mode: int | None = None, - backlog: int = 65536, -) -> SocketListener: - """ - Create a UNIX socket listener. - - Not available on Windows. - - :param path: path of the socket - :param mode: permissions to set on the socket - :param backlog: maximum number of queued incoming connections (up to a maximum of - 2**16, or 65536) - :return: a listener object - - .. versionchanged:: 3.0 - If a socket already exists on the file system in the given path, it will be - removed first. - - """ - backlog = min(backlog, 65536) - raw_socket = await setup_unix_local_socket(path, mode, socket.SOCK_STREAM) - try: - raw_socket.listen(backlog) - return get_async_backend().create_unix_listener(raw_socket) - except BaseException: - raw_socket.close() - raise - - -async def create_udp_socket( - family: AnyIPAddressFamily = AddressFamily.AF_UNSPEC, - *, - local_host: IPAddressType | None = None, - local_port: int = 0, - reuse_port: bool = False, -) -> UDPSocket: - """ - Create a UDP socket. - - If ``port`` has been given, the socket will be bound to this port on the local - machine, making this socket suitable for providing UDP based services. - - :param family: address family (``AF_INET`` or ``AF_INET6``) – automatically - determined from ``local_host`` if omitted - :param local_host: IP address or host name of the local interface to bind to - :param local_port: local port to bind to - :param reuse_port: ``True`` to allow multiple sockets to bind to the same - address/port (not supported on Windows) - :return: a UDP socket - - """ - if family is AddressFamily.AF_UNSPEC and not local_host: - raise ValueError('Either "family" or "local_host" must be given') - - if local_host: - gai_res = await getaddrinfo( - str(local_host), - local_port, - family=family, - type=socket.SOCK_DGRAM, - flags=socket.AI_PASSIVE | socket.AI_ADDRCONFIG, - ) - family = cast(AnyIPAddressFamily, gai_res[0][0]) - local_address = gai_res[0][-1] - elif family is AddressFamily.AF_INET6: - local_address = ("::", 0) - else: - local_address = ("0.0.0.0", 0) - - sock = await get_async_backend().create_udp_socket( - family, local_address, None, reuse_port - ) - return cast(UDPSocket, sock) - - -async def create_connected_udp_socket( - remote_host: IPAddressType, - remote_port: int, - *, - family: AnyIPAddressFamily = AddressFamily.AF_UNSPEC, - local_host: IPAddressType | None = None, - local_port: int = 0, - reuse_port: bool = False, -) -> ConnectedUDPSocket: - """ - Create a connected UDP socket. - - Connected UDP sockets can only communicate with the specified remote host/port, an - any packets sent from other sources are dropped. - - :param remote_host: remote host to set as the default target - :param remote_port: port on the remote host to set as the default target - :param family: address family (``AF_INET`` or ``AF_INET6``) – automatically - determined from ``local_host`` or ``remote_host`` if omitted - :param local_host: IP address or host name of the local interface to bind to - :param local_port: local port to bind to - :param reuse_port: ``True`` to allow multiple sockets to bind to the same - address/port (not supported on Windows) - :return: a connected UDP socket - - """ - local_address = None - if local_host: - gai_res = await getaddrinfo( - str(local_host), - local_port, - family=family, - type=socket.SOCK_DGRAM, - flags=socket.AI_PASSIVE | socket.AI_ADDRCONFIG, - ) - family = cast(AnyIPAddressFamily, gai_res[0][0]) - local_address = gai_res[0][-1] - - gai_res = await getaddrinfo( - str(remote_host), remote_port, family=family, type=socket.SOCK_DGRAM - ) - family = cast(AnyIPAddressFamily, gai_res[0][0]) - remote_address = gai_res[0][-1] - - sock = await get_async_backend().create_udp_socket( - family, local_address, remote_address, reuse_port - ) - return cast(ConnectedUDPSocket, sock) - - -async def create_unix_datagram_socket( - *, - local_path: None | str | bytes | PathLike[Any] = None, - local_mode: int | None = None, -) -> UNIXDatagramSocket: - """ - Create a UNIX datagram socket. - - Not available on Windows. - - If ``local_path`` has been given, the socket will be bound to this path, making this - socket suitable for receiving datagrams from other processes. Other processes can - send datagrams to this socket only if ``local_path`` is set. - - If a socket already exists on the file system in the ``local_path``, it will be - removed first. - - :param local_path: the path on which to bind to - :param local_mode: permissions to set on the local socket - :return: a UNIX datagram socket - - """ - raw_socket = await setup_unix_local_socket( - local_path, local_mode, socket.SOCK_DGRAM - ) - return await get_async_backend().create_unix_datagram_socket(raw_socket, None) - - -async def create_connected_unix_datagram_socket( - remote_path: str | bytes | PathLike[Any], - *, - local_path: None | str | bytes | PathLike[Any] = None, - local_mode: int | None = None, -) -> ConnectedUNIXDatagramSocket: - """ - Create a connected UNIX datagram socket. - - Connected datagram sockets can only communicate with the specified remote path. - - If ``local_path`` has been given, the socket will be bound to this path, making - this socket suitable for receiving datagrams from other processes. Other processes - can send datagrams to this socket only if ``local_path`` is set. - - If a socket already exists on the file system in the ``local_path``, it will be - removed first. - - :param remote_path: the path to set as the default target - :param local_path: the path on which to bind to - :param local_mode: permissions to set on the local socket - :return: a connected UNIX datagram socket - - """ - remote_path = os.fspath(remote_path) - raw_socket = await setup_unix_local_socket( - local_path, local_mode, socket.SOCK_DGRAM - ) - return await get_async_backend().create_unix_datagram_socket( - raw_socket, remote_path - ) - - -async def getaddrinfo( - host: bytes | str | None, - port: str | int | None, - *, - family: int | AddressFamily = 0, - type: int | SocketKind = 0, - proto: int = 0, - flags: int = 0, -) -> list[tuple[AddressFamily, SocketKind, int, str, tuple[str, int]]]: - """ - Look up a numeric IP address given a host name. - - Internationalized domain names are translated according to the (non-transitional) - IDNA 2008 standard. - - .. note:: 4-tuple IPv6 socket addresses are automatically converted to 2-tuples of - (host, port), unlike what :func:`socket.getaddrinfo` does. - - :param host: host name - :param port: port number - :param family: socket family (`'AF_INET``, ...) - :param type: socket type (``SOCK_STREAM``, ...) - :param proto: protocol number - :param flags: flags to pass to upstream ``getaddrinfo()`` - :return: list of tuples containing (family, type, proto, canonname, sockaddr) - - .. seealso:: :func:`socket.getaddrinfo` - - """ - # Handle unicode hostnames - if isinstance(host, str): - try: - encoded_host: bytes | None = host.encode("ascii") - except UnicodeEncodeError: - import idna - - encoded_host = idna.encode(host, uts46=True) - else: - encoded_host = host - - gai_res = await get_async_backend().getaddrinfo( - encoded_host, port, family=family, type=type, proto=proto, flags=flags - ) - return [ - (family, type, proto, canonname, convert_ipv6_sockaddr(sockaddr)) - for family, type, proto, canonname, sockaddr in gai_res - # filter out IPv6 results when IPv6 is disabled - if not isinstance(sockaddr[0], int) - ] - - -def getnameinfo(sockaddr: IPSockAddrType, flags: int = 0) -> Awaitable[tuple[str, str]]: - """ - Look up the host name of an IP address. - - :param sockaddr: socket address (e.g. (ipaddress, port) for IPv4) - :param flags: flags to pass to upstream ``getnameinfo()`` - :return: a tuple of (host name, service name) - - .. seealso:: :func:`socket.getnameinfo` - - """ - return get_async_backend().getnameinfo(sockaddr, flags) - - -@deprecated("This function is deprecated; use `wait_readable` instead") -def wait_socket_readable(sock: socket.socket) -> Awaitable[None]: - """ - .. deprecated:: 4.7.0 - Use :func:`wait_readable` instead. - - Wait until the given socket has data to be read. - - .. warning:: Only use this on raw sockets that have not been wrapped by any higher - level constructs like socket streams! - - :param sock: a socket object - :raises ~anyio.ClosedResourceError: if the socket was closed while waiting for the - socket to become readable - :raises ~anyio.BusyResourceError: if another task is already waiting for the socket - to become readable - - """ - return get_async_backend().wait_readable(sock.fileno()) - - -@deprecated("This function is deprecated; use `wait_writable` instead") -def wait_socket_writable(sock: socket.socket) -> Awaitable[None]: - """ - .. deprecated:: 4.7.0 - Use :func:`wait_writable` instead. - - Wait until the given socket can be written to. - - This does **NOT** work on Windows when using the asyncio backend with a proactor - event loop (default on py3.8+). - - .. warning:: Only use this on raw sockets that have not been wrapped by any higher - level constructs like socket streams! - - :param sock: a socket object - :raises ~anyio.ClosedResourceError: if the socket was closed while waiting for the - socket to become writable - :raises ~anyio.BusyResourceError: if another task is already waiting for the socket - to become writable - - """ - return get_async_backend().wait_writable(sock.fileno()) - - -def wait_readable(obj: FileDescriptorLike) -> Awaitable[None]: - """ - Wait until the given object has data to be read. - - On Unix systems, ``obj`` must either be an integer file descriptor, or else an - object with a ``.fileno()`` method which returns an integer file descriptor. Any - kind of file descriptor can be passed, though the exact semantics will depend on - your kernel. For example, this probably won't do anything useful for on-disk files. - - On Windows systems, ``obj`` must either be an integer ``SOCKET`` handle, or else an - object with a ``.fileno()`` method which returns an integer ``SOCKET`` handle. File - descriptors aren't supported, and neither are handles that refer to anything besides - a ``SOCKET``. - - On backends where this functionality is not natively provided (asyncio - ``ProactorEventLoop`` on Windows), it is provided using a separate selector thread - which is set to shut down when the interpreter shuts down. - - .. warning:: Don't use this on raw sockets that have been wrapped by any higher - level constructs like socket streams! - - :param obj: an object with a ``.fileno()`` method or an integer handle - :raises ~anyio.ClosedResourceError: if the object was closed while waiting for the - object to become readable - :raises ~anyio.BusyResourceError: if another task is already waiting for the object - to become readable - - """ - return get_async_backend().wait_readable(obj) - - -def wait_writable(obj: FileDescriptorLike) -> Awaitable[None]: - """ - Wait until the given object can be written to. - - :param obj: an object with a ``.fileno()`` method or an integer handle - :raises ~anyio.ClosedResourceError: if the object was closed while waiting for the - object to become writable - :raises ~anyio.BusyResourceError: if another task is already waiting for the object - to become writable - - .. seealso:: See the documentation of :func:`wait_readable` for the definition of - ``obj`` and notes on backend compatibility. - - .. warning:: Don't use this on raw sockets that have been wrapped by any higher - level constructs like socket streams! - - """ - return get_async_backend().wait_writable(obj) - - -# -# Private API -# - - -def convert_ipv6_sockaddr( - sockaddr: tuple[str, int, int, int] | tuple[str, int], -) -> tuple[str, int]: - """ - Convert a 4-tuple IPv6 socket address to a 2-tuple (address, port) format. - - If the scope ID is nonzero, it is added to the address, separated with ``%``. - Otherwise the flow id and scope id are simply cut off from the tuple. - Any other kinds of socket addresses are returned as-is. - - :param sockaddr: the result of :meth:`~socket.socket.getsockname` - :return: the converted socket address - - """ - # This is more complicated than it should be because of MyPy - if isinstance(sockaddr, tuple) and len(sockaddr) == 4: - host, port, flowinfo, scope_id = sockaddr - if scope_id: - # PyPy (as of v7.3.11) leaves the interface name in the result, so - # we discard it and only get the scope ID from the end - # (https://foss.heptapod.net/pypy/pypy/-/issues/3938) - host = host.split("%")[0] - - # Add scope_id to the address - return f"{host}%{scope_id}", port - else: - return host, port - else: - return sockaddr - - -async def setup_unix_local_socket( - path: None | str | bytes | PathLike[Any], - mode: int | None, - socktype: int, -) -> socket.socket: - """ - Create a UNIX local socket object, deleting the socket at the given path if it - exists. - - Not available on Windows. - - :param path: path of the socket - :param mode: permissions to set on the socket - :param socktype: socket.SOCK_STREAM or socket.SOCK_DGRAM - - """ - path_str: str | None - if path is not None: - path_str = os.fsdecode(path) - - # Linux abstract namespace sockets aren't backed by a concrete file so skip stat call - if not path_str.startswith("\0"): - # Copied from pathlib... - try: - stat_result = os.stat(path) - except OSError as e: - if e.errno not in ( - errno.ENOENT, - errno.ENOTDIR, - errno.EBADF, - errno.ELOOP, - ): - raise - else: - if stat.S_ISSOCK(stat_result.st_mode): - os.unlink(path) - else: - path_str = None - - raw_socket = socket.socket(socket.AF_UNIX, socktype) - raw_socket.setblocking(False) - - if path_str is not None: - try: - await to_thread.run_sync(raw_socket.bind, path_str, abandon_on_cancel=True) - if mode is not None: - await to_thread.run_sync(chmod, path_str, mode, abandon_on_cancel=True) - except BaseException: - raw_socket.close() - raise - - return raw_socket diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_streams.py b/venv/lib/python3.11/site-packages/anyio/_core/_streams.py deleted file mode 100644 index 6a9814e..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_streams.py +++ /dev/null @@ -1,52 +0,0 @@ -from __future__ import annotations - -import math -from typing import TypeVar -from warnings import warn - -from ..streams.memory import ( - MemoryObjectReceiveStream, - MemoryObjectSendStream, - MemoryObjectStreamState, -) - -T_Item = TypeVar("T_Item") - - -class create_memory_object_stream( - tuple[MemoryObjectSendStream[T_Item], MemoryObjectReceiveStream[T_Item]], -): - """ - Create a memory object stream. - - The stream's item type can be annotated like - :func:`create_memory_object_stream[T_Item]`. - - :param max_buffer_size: number of items held in the buffer until ``send()`` starts - blocking - :param item_type: old way of marking the streams with the right generic type for - static typing (does nothing on AnyIO 4) - - .. deprecated:: 4.0 - Use ``create_memory_object_stream[YourItemType](...)`` instead. - :return: a tuple of (send stream, receive stream) - - """ - - def __new__( # type: ignore[misc] - cls, max_buffer_size: float = 0, item_type: object = None - ) -> tuple[MemoryObjectSendStream[T_Item], MemoryObjectReceiveStream[T_Item]]: - if max_buffer_size != math.inf and not isinstance(max_buffer_size, int): - raise ValueError("max_buffer_size must be either an integer or math.inf") - if max_buffer_size < 0: - raise ValueError("max_buffer_size cannot be negative") - if item_type is not None: - warn( - "The item_type argument has been deprecated in AnyIO 4.0. " - "Use create_memory_object_stream[YourItemType](...) instead.", - DeprecationWarning, - stacklevel=2, - ) - - state = MemoryObjectStreamState[T_Item](max_buffer_size) - return (MemoryObjectSendStream(state), MemoryObjectReceiveStream(state)) diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_subprocesses.py b/venv/lib/python3.11/site-packages/anyio/_core/_subprocesses.py deleted file mode 100644 index 36d9b30..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_subprocesses.py +++ /dev/null @@ -1,202 +0,0 @@ -from __future__ import annotations - -import sys -from collections.abc import AsyncIterable, Iterable, Mapping, Sequence -from io import BytesIO -from os import PathLike -from subprocess import PIPE, CalledProcessError, CompletedProcess -from typing import IO, Any, Union, cast - -from ..abc import Process -from ._eventloop import get_async_backend -from ._tasks import create_task_group - -if sys.version_info >= (3, 10): - from typing import TypeAlias -else: - from typing_extensions import TypeAlias - -StrOrBytesPath: TypeAlias = Union[str, bytes, "PathLike[str]", "PathLike[bytes]"] - - -async def run_process( - command: StrOrBytesPath | Sequence[StrOrBytesPath], - *, - input: bytes | None = None, - stdin: int | IO[Any] | None = None, - stdout: int | IO[Any] | None = PIPE, - stderr: int | IO[Any] | None = PIPE, - check: bool = True, - cwd: StrOrBytesPath | None = None, - env: Mapping[str, str] | None = None, - startupinfo: Any = None, - creationflags: int = 0, - start_new_session: bool = False, - pass_fds: Sequence[int] = (), - user: str | int | None = None, - group: str | int | None = None, - extra_groups: Iterable[str | int] | None = None, - umask: int = -1, -) -> CompletedProcess[bytes]: - """ - Run an external command in a subprocess and wait until it completes. - - .. seealso:: :func:`subprocess.run` - - :param command: either a string to pass to the shell, or an iterable of strings - containing the executable name or path and its arguments - :param input: bytes passed to the standard input of the subprocess - :param stdin: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, - a file-like object, or `None`; ``input`` overrides this - :param stdout: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, - a file-like object, or `None` - :param stderr: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, - :data:`subprocess.STDOUT`, a file-like object, or `None` - :param check: if ``True``, raise :exc:`~subprocess.CalledProcessError` if the - process terminates with a return code other than 0 - :param cwd: If not ``None``, change the working directory to this before running the - command - :param env: if not ``None``, this mapping replaces the inherited environment - variables from the parent process - :param startupinfo: an instance of :class:`subprocess.STARTUPINFO` that can be used - to specify process startup parameters (Windows only) - :param creationflags: flags that can be used to control the creation of the - subprocess (see :class:`subprocess.Popen` for the specifics) - :param start_new_session: if ``true`` the setsid() system call will be made in the - child process prior to the execution of the subprocess. (POSIX only) - :param pass_fds: sequence of file descriptors to keep open between the parent and - child processes. (POSIX only) - :param user: effective user to run the process as (Python >= 3.9, POSIX only) - :param group: effective group to run the process as (Python >= 3.9, POSIX only) - :param extra_groups: supplementary groups to set in the subprocess (Python >= 3.9, - POSIX only) - :param umask: if not negative, this umask is applied in the child process before - running the given command (Python >= 3.9, POSIX only) - :return: an object representing the completed process - :raises ~subprocess.CalledProcessError: if ``check`` is ``True`` and the process - exits with a nonzero return code - - """ - - async def drain_stream(stream: AsyncIterable[bytes], index: int) -> None: - buffer = BytesIO() - async for chunk in stream: - buffer.write(chunk) - - stream_contents[index] = buffer.getvalue() - - if stdin is not None and input is not None: - raise ValueError("only one of stdin and input is allowed") - - async with await open_process( - command, - stdin=PIPE if input else stdin, - stdout=stdout, - stderr=stderr, - cwd=cwd, - env=env, - startupinfo=startupinfo, - creationflags=creationflags, - start_new_session=start_new_session, - pass_fds=pass_fds, - user=user, - group=group, - extra_groups=extra_groups, - umask=umask, - ) as process: - stream_contents: list[bytes | None] = [None, None] - async with create_task_group() as tg: - if process.stdout: - tg.start_soon(drain_stream, process.stdout, 0) - - if process.stderr: - tg.start_soon(drain_stream, process.stderr, 1) - - if process.stdin and input: - await process.stdin.send(input) - await process.stdin.aclose() - - await process.wait() - - output, errors = stream_contents - if check and process.returncode != 0: - raise CalledProcessError(cast(int, process.returncode), command, output, errors) - - return CompletedProcess(command, cast(int, process.returncode), output, errors) - - -async def open_process( - command: StrOrBytesPath | Sequence[StrOrBytesPath], - *, - stdin: int | IO[Any] | None = PIPE, - stdout: int | IO[Any] | None = PIPE, - stderr: int | IO[Any] | None = PIPE, - cwd: StrOrBytesPath | None = None, - env: Mapping[str, str] | None = None, - startupinfo: Any = None, - creationflags: int = 0, - start_new_session: bool = False, - pass_fds: Sequence[int] = (), - user: str | int | None = None, - group: str | int | None = None, - extra_groups: Iterable[str | int] | None = None, - umask: int = -1, -) -> Process: - """ - Start an external command in a subprocess. - - .. seealso:: :class:`subprocess.Popen` - - :param command: either a string to pass to the shell, or an iterable of strings - containing the executable name or path and its arguments - :param stdin: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, a - file-like object, or ``None`` - :param stdout: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, - a file-like object, or ``None`` - :param stderr: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, - :data:`subprocess.STDOUT`, a file-like object, or ``None`` - :param cwd: If not ``None``, the working directory is changed before executing - :param env: If env is not ``None``, it must be a mapping that defines the - environment variables for the new process - :param creationflags: flags that can be used to control the creation of the - subprocess (see :class:`subprocess.Popen` for the specifics) - :param startupinfo: an instance of :class:`subprocess.STARTUPINFO` that can be used - to specify process startup parameters (Windows only) - :param start_new_session: if ``true`` the setsid() system call will be made in the - child process prior to the execution of the subprocess. (POSIX only) - :param pass_fds: sequence of file descriptors to keep open between the parent and - child processes. (POSIX only) - :param user: effective user to run the process as (POSIX only) - :param group: effective group to run the process as (POSIX only) - :param extra_groups: supplementary groups to set in the subprocess (POSIX only) - :param umask: if not negative, this umask is applied in the child process before - running the given command (POSIX only) - :return: an asynchronous process object - - """ - kwargs: dict[str, Any] = {} - if user is not None: - kwargs["user"] = user - - if group is not None: - kwargs["group"] = group - - if extra_groups is not None: - kwargs["extra_groups"] = group - - if umask >= 0: - kwargs["umask"] = umask - - return await get_async_backend().open_process( - command, - stdin=stdin, - stdout=stdout, - stderr=stderr, - cwd=cwd, - env=env, - startupinfo=startupinfo, - creationflags=creationflags, - start_new_session=start_new_session, - pass_fds=pass_fds, - **kwargs, - ) diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_synchronization.py b/venv/lib/python3.11/site-packages/anyio/_core/_synchronization.py deleted file mode 100644 index a633132..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_synchronization.py +++ /dev/null @@ -1,732 +0,0 @@ -from __future__ import annotations - -import math -from collections import deque -from dataclasses import dataclass -from types import TracebackType - -from sniffio import AsyncLibraryNotFoundError - -from ..lowlevel import checkpoint -from ._eventloop import get_async_backend -from ._exceptions import BusyResourceError -from ._tasks import CancelScope -from ._testing import TaskInfo, get_current_task - - -@dataclass(frozen=True) -class EventStatistics: - """ - :ivar int tasks_waiting: number of tasks waiting on :meth:`~.Event.wait` - """ - - tasks_waiting: int - - -@dataclass(frozen=True) -class CapacityLimiterStatistics: - """ - :ivar int borrowed_tokens: number of tokens currently borrowed by tasks - :ivar float total_tokens: total number of available tokens - :ivar tuple borrowers: tasks or other objects currently holding tokens borrowed from - this limiter - :ivar int tasks_waiting: number of tasks waiting on - :meth:`~.CapacityLimiter.acquire` or - :meth:`~.CapacityLimiter.acquire_on_behalf_of` - """ - - borrowed_tokens: int - total_tokens: float - borrowers: tuple[object, ...] - tasks_waiting: int - - -@dataclass(frozen=True) -class LockStatistics: - """ - :ivar bool locked: flag indicating if this lock is locked or not - :ivar ~anyio.TaskInfo owner: task currently holding the lock (or ``None`` if the - lock is not held by any task) - :ivar int tasks_waiting: number of tasks waiting on :meth:`~.Lock.acquire` - """ - - locked: bool - owner: TaskInfo | None - tasks_waiting: int - - -@dataclass(frozen=True) -class ConditionStatistics: - """ - :ivar int tasks_waiting: number of tasks blocked on :meth:`~.Condition.wait` - :ivar ~anyio.LockStatistics lock_statistics: statistics of the underlying - :class:`~.Lock` - """ - - tasks_waiting: int - lock_statistics: LockStatistics - - -@dataclass(frozen=True) -class SemaphoreStatistics: - """ - :ivar int tasks_waiting: number of tasks waiting on :meth:`~.Semaphore.acquire` - - """ - - tasks_waiting: int - - -class Event: - def __new__(cls) -> Event: - try: - return get_async_backend().create_event() - except AsyncLibraryNotFoundError: - return EventAdapter() - - def set(self) -> None: - """Set the flag, notifying all listeners.""" - raise NotImplementedError - - def is_set(self) -> bool: - """Return ``True`` if the flag is set, ``False`` if not.""" - raise NotImplementedError - - async def wait(self) -> None: - """ - Wait until the flag has been set. - - If the flag has already been set when this method is called, it returns - immediately. - - """ - raise NotImplementedError - - def statistics(self) -> EventStatistics: - """Return statistics about the current state of this event.""" - raise NotImplementedError - - -class EventAdapter(Event): - _internal_event: Event | None = None - _is_set: bool = False - - def __new__(cls) -> EventAdapter: - return object.__new__(cls) - - @property - def _event(self) -> Event: - if self._internal_event is None: - self._internal_event = get_async_backend().create_event() - if self._is_set: - self._internal_event.set() - - return self._internal_event - - def set(self) -> None: - if self._internal_event is None: - self._is_set = True - else: - self._event.set() - - def is_set(self) -> bool: - if self._internal_event is None: - return self._is_set - - return self._internal_event.is_set() - - async def wait(self) -> None: - await self._event.wait() - - def statistics(self) -> EventStatistics: - if self._internal_event is None: - return EventStatistics(tasks_waiting=0) - - return self._internal_event.statistics() - - -class Lock: - def __new__(cls, *, fast_acquire: bool = False) -> Lock: - try: - return get_async_backend().create_lock(fast_acquire=fast_acquire) - except AsyncLibraryNotFoundError: - return LockAdapter(fast_acquire=fast_acquire) - - async def __aenter__(self) -> None: - await self.acquire() - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - self.release() - - async def acquire(self) -> None: - """Acquire the lock.""" - raise NotImplementedError - - def acquire_nowait(self) -> None: - """ - Acquire the lock, without blocking. - - :raises ~anyio.WouldBlock: if the operation would block - - """ - raise NotImplementedError - - def release(self) -> None: - """Release the lock.""" - raise NotImplementedError - - def locked(self) -> bool: - """Return True if the lock is currently held.""" - raise NotImplementedError - - def statistics(self) -> LockStatistics: - """ - Return statistics about the current state of this lock. - - .. versionadded:: 3.0 - """ - raise NotImplementedError - - -class LockAdapter(Lock): - _internal_lock: Lock | None = None - - def __new__(cls, *, fast_acquire: bool = False) -> LockAdapter: - return object.__new__(cls) - - def __init__(self, *, fast_acquire: bool = False): - self._fast_acquire = fast_acquire - - @property - def _lock(self) -> Lock: - if self._internal_lock is None: - self._internal_lock = get_async_backend().create_lock( - fast_acquire=self._fast_acquire - ) - - return self._internal_lock - - async def __aenter__(self) -> None: - await self._lock.acquire() - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - if self._internal_lock is not None: - self._internal_lock.release() - - async def acquire(self) -> None: - """Acquire the lock.""" - await self._lock.acquire() - - def acquire_nowait(self) -> None: - """ - Acquire the lock, without blocking. - - :raises ~anyio.WouldBlock: if the operation would block - - """ - self._lock.acquire_nowait() - - def release(self) -> None: - """Release the lock.""" - self._lock.release() - - def locked(self) -> bool: - """Return True if the lock is currently held.""" - return self._lock.locked() - - def statistics(self) -> LockStatistics: - """ - Return statistics about the current state of this lock. - - .. versionadded:: 3.0 - - """ - if self._internal_lock is None: - return LockStatistics(False, None, 0) - - return self._internal_lock.statistics() - - -class Condition: - _owner_task: TaskInfo | None = None - - def __init__(self, lock: Lock | None = None): - self._lock = lock or Lock() - self._waiters: deque[Event] = deque() - - async def __aenter__(self) -> None: - await self.acquire() - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - self.release() - - def _check_acquired(self) -> None: - if self._owner_task != get_current_task(): - raise RuntimeError("The current task is not holding the underlying lock") - - async def acquire(self) -> None: - """Acquire the underlying lock.""" - await self._lock.acquire() - self._owner_task = get_current_task() - - def acquire_nowait(self) -> None: - """ - Acquire the underlying lock, without blocking. - - :raises ~anyio.WouldBlock: if the operation would block - - """ - self._lock.acquire_nowait() - self._owner_task = get_current_task() - - def release(self) -> None: - """Release the underlying lock.""" - self._lock.release() - - def locked(self) -> bool: - """Return True if the lock is set.""" - return self._lock.locked() - - def notify(self, n: int = 1) -> None: - """Notify exactly n listeners.""" - self._check_acquired() - for _ in range(n): - try: - event = self._waiters.popleft() - except IndexError: - break - - event.set() - - def notify_all(self) -> None: - """Notify all the listeners.""" - self._check_acquired() - for event in self._waiters: - event.set() - - self._waiters.clear() - - async def wait(self) -> None: - """Wait for a notification.""" - await checkpoint() - event = Event() - self._waiters.append(event) - self.release() - try: - await event.wait() - except BaseException: - if not event.is_set(): - self._waiters.remove(event) - - raise - finally: - with CancelScope(shield=True): - await self.acquire() - - def statistics(self) -> ConditionStatistics: - """ - Return statistics about the current state of this condition. - - .. versionadded:: 3.0 - """ - return ConditionStatistics(len(self._waiters), self._lock.statistics()) - - -class Semaphore: - def __new__( - cls, - initial_value: int, - *, - max_value: int | None = None, - fast_acquire: bool = False, - ) -> Semaphore: - try: - return get_async_backend().create_semaphore( - initial_value, max_value=max_value, fast_acquire=fast_acquire - ) - except AsyncLibraryNotFoundError: - return SemaphoreAdapter(initial_value, max_value=max_value) - - def __init__( - self, - initial_value: int, - *, - max_value: int | None = None, - fast_acquire: bool = False, - ): - if not isinstance(initial_value, int): - raise TypeError("initial_value must be an integer") - if initial_value < 0: - raise ValueError("initial_value must be >= 0") - if max_value is not None: - if not isinstance(max_value, int): - raise TypeError("max_value must be an integer or None") - if max_value < initial_value: - raise ValueError( - "max_value must be equal to or higher than initial_value" - ) - - self._fast_acquire = fast_acquire - - async def __aenter__(self) -> Semaphore: - await self.acquire() - return self - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - self.release() - - async def acquire(self) -> None: - """Decrement the semaphore value, blocking if necessary.""" - raise NotImplementedError - - def acquire_nowait(self) -> None: - """ - Acquire the underlying lock, without blocking. - - :raises ~anyio.WouldBlock: if the operation would block - - """ - raise NotImplementedError - - def release(self) -> None: - """Increment the semaphore value.""" - raise NotImplementedError - - @property - def value(self) -> int: - """The current value of the semaphore.""" - raise NotImplementedError - - @property - def max_value(self) -> int | None: - """The maximum value of the semaphore.""" - raise NotImplementedError - - def statistics(self) -> SemaphoreStatistics: - """ - Return statistics about the current state of this semaphore. - - .. versionadded:: 3.0 - """ - raise NotImplementedError - - -class SemaphoreAdapter(Semaphore): - _internal_semaphore: Semaphore | None = None - - def __new__( - cls, - initial_value: int, - *, - max_value: int | None = None, - fast_acquire: bool = False, - ) -> SemaphoreAdapter: - return object.__new__(cls) - - def __init__( - self, - initial_value: int, - *, - max_value: int | None = None, - fast_acquire: bool = False, - ) -> None: - super().__init__(initial_value, max_value=max_value, fast_acquire=fast_acquire) - self._initial_value = initial_value - self._max_value = max_value - - @property - def _semaphore(self) -> Semaphore: - if self._internal_semaphore is None: - self._internal_semaphore = get_async_backend().create_semaphore( - self._initial_value, max_value=self._max_value - ) - - return self._internal_semaphore - - async def acquire(self) -> None: - await self._semaphore.acquire() - - def acquire_nowait(self) -> None: - self._semaphore.acquire_nowait() - - def release(self) -> None: - self._semaphore.release() - - @property - def value(self) -> int: - if self._internal_semaphore is None: - return self._initial_value - - return self._semaphore.value - - @property - def max_value(self) -> int | None: - return self._max_value - - def statistics(self) -> SemaphoreStatistics: - if self._internal_semaphore is None: - return SemaphoreStatistics(tasks_waiting=0) - - return self._semaphore.statistics() - - -class CapacityLimiter: - def __new__(cls, total_tokens: float) -> CapacityLimiter: - try: - return get_async_backend().create_capacity_limiter(total_tokens) - except AsyncLibraryNotFoundError: - return CapacityLimiterAdapter(total_tokens) - - async def __aenter__(self) -> None: - raise NotImplementedError - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> bool | None: - raise NotImplementedError - - @property - def total_tokens(self) -> float: - """ - The total number of tokens available for borrowing. - - This is a read-write property. If the total number of tokens is increased, the - proportionate number of tasks waiting on this limiter will be granted their - tokens. - - .. versionchanged:: 3.0 - The property is now writable. - - """ - raise NotImplementedError - - @total_tokens.setter - def total_tokens(self, value: float) -> None: - raise NotImplementedError - - @property - def borrowed_tokens(self) -> int: - """The number of tokens that have currently been borrowed.""" - raise NotImplementedError - - @property - def available_tokens(self) -> float: - """The number of tokens currently available to be borrowed""" - raise NotImplementedError - - def acquire_nowait(self) -> None: - """ - Acquire a token for the current task without waiting for one to become - available. - - :raises ~anyio.WouldBlock: if there are no tokens available for borrowing - - """ - raise NotImplementedError - - def acquire_on_behalf_of_nowait(self, borrower: object) -> None: - """ - Acquire a token without waiting for one to become available. - - :param borrower: the entity borrowing a token - :raises ~anyio.WouldBlock: if there are no tokens available for borrowing - - """ - raise NotImplementedError - - async def acquire(self) -> None: - """ - Acquire a token for the current task, waiting if necessary for one to become - available. - - """ - raise NotImplementedError - - async def acquire_on_behalf_of(self, borrower: object) -> None: - """ - Acquire a token, waiting if necessary for one to become available. - - :param borrower: the entity borrowing a token - - """ - raise NotImplementedError - - def release(self) -> None: - """ - Release the token held by the current task. - - :raises RuntimeError: if the current task has not borrowed a token from this - limiter. - - """ - raise NotImplementedError - - def release_on_behalf_of(self, borrower: object) -> None: - """ - Release the token held by the given borrower. - - :raises RuntimeError: if the borrower has not borrowed a token from this - limiter. - - """ - raise NotImplementedError - - def statistics(self) -> CapacityLimiterStatistics: - """ - Return statistics about the current state of this limiter. - - .. versionadded:: 3.0 - - """ - raise NotImplementedError - - -class CapacityLimiterAdapter(CapacityLimiter): - _internal_limiter: CapacityLimiter | None = None - - def __new__(cls, total_tokens: float) -> CapacityLimiterAdapter: - return object.__new__(cls) - - def __init__(self, total_tokens: float) -> None: - self.total_tokens = total_tokens - - @property - def _limiter(self) -> CapacityLimiter: - if self._internal_limiter is None: - self._internal_limiter = get_async_backend().create_capacity_limiter( - self._total_tokens - ) - - return self._internal_limiter - - async def __aenter__(self) -> None: - await self._limiter.__aenter__() - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> bool | None: - return await self._limiter.__aexit__(exc_type, exc_val, exc_tb) - - @property - def total_tokens(self) -> float: - if self._internal_limiter is None: - return self._total_tokens - - return self._internal_limiter.total_tokens - - @total_tokens.setter - def total_tokens(self, value: float) -> None: - if not isinstance(value, int) and value is not math.inf: - raise TypeError("total_tokens must be an int or math.inf") - elif value < 1: - raise ValueError("total_tokens must be >= 1") - - if self._internal_limiter is None: - self._total_tokens = value - return - - self._limiter.total_tokens = value - - @property - def borrowed_tokens(self) -> int: - if self._internal_limiter is None: - return 0 - - return self._internal_limiter.borrowed_tokens - - @property - def available_tokens(self) -> float: - if self._internal_limiter is None: - return self._total_tokens - - return self._internal_limiter.available_tokens - - def acquire_nowait(self) -> None: - self._limiter.acquire_nowait() - - def acquire_on_behalf_of_nowait(self, borrower: object) -> None: - self._limiter.acquire_on_behalf_of_nowait(borrower) - - async def acquire(self) -> None: - await self._limiter.acquire() - - async def acquire_on_behalf_of(self, borrower: object) -> None: - await self._limiter.acquire_on_behalf_of(borrower) - - def release(self) -> None: - self._limiter.release() - - def release_on_behalf_of(self, borrower: object) -> None: - self._limiter.release_on_behalf_of(borrower) - - def statistics(self) -> CapacityLimiterStatistics: - if self._internal_limiter is None: - return CapacityLimiterStatistics( - borrowed_tokens=0, - total_tokens=self.total_tokens, - borrowers=(), - tasks_waiting=0, - ) - - return self._internal_limiter.statistics() - - -class ResourceGuard: - """ - A context manager for ensuring that a resource is only used by a single task at a - time. - - Entering this context manager while the previous has not exited it yet will trigger - :exc:`BusyResourceError`. - - :param action: the action to guard against (visible in the :exc:`BusyResourceError` - when triggered, e.g. "Another task is already {action} this resource") - - .. versionadded:: 4.1 - """ - - __slots__ = "action", "_guarded" - - def __init__(self, action: str = "using"): - self.action: str = action - self._guarded = False - - def __enter__(self) -> None: - if self._guarded: - raise BusyResourceError(self.action) - - self._guarded = True - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - self._guarded = False diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_tasks.py b/venv/lib/python3.11/site-packages/anyio/_core/_tasks.py deleted file mode 100644 index fe49015..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_tasks.py +++ /dev/null @@ -1,158 +0,0 @@ -from __future__ import annotations - -import math -from collections.abc import Generator -from contextlib import contextmanager -from types import TracebackType - -from ..abc._tasks import TaskGroup, TaskStatus -from ._eventloop import get_async_backend - - -class _IgnoredTaskStatus(TaskStatus[object]): - def started(self, value: object = None) -> None: - pass - - -TASK_STATUS_IGNORED = _IgnoredTaskStatus() - - -class CancelScope: - """ - Wraps a unit of work that can be made separately cancellable. - - :param deadline: The time (clock value) when this scope is cancelled automatically - :param shield: ``True`` to shield the cancel scope from external cancellation - """ - - def __new__( - cls, *, deadline: float = math.inf, shield: bool = False - ) -> CancelScope: - return get_async_backend().create_cancel_scope(shield=shield, deadline=deadline) - - def cancel(self) -> None: - """Cancel this scope immediately.""" - raise NotImplementedError - - @property - def deadline(self) -> float: - """ - The time (clock value) when this scope is cancelled automatically. - - Will be ``float('inf')`` if no timeout has been set. - - """ - raise NotImplementedError - - @deadline.setter - def deadline(self, value: float) -> None: - raise NotImplementedError - - @property - def cancel_called(self) -> bool: - """``True`` if :meth:`cancel` has been called.""" - raise NotImplementedError - - @property - def cancelled_caught(self) -> bool: - """ - ``True`` if this scope suppressed a cancellation exception it itself raised. - - This is typically used to check if any work was interrupted, or to see if the - scope was cancelled due to its deadline being reached. The value will, however, - only be ``True`` if the cancellation was triggered by the scope itself (and not - an outer scope). - - """ - raise NotImplementedError - - @property - def shield(self) -> bool: - """ - ``True`` if this scope is shielded from external cancellation. - - While a scope is shielded, it will not receive cancellations from outside. - - """ - raise NotImplementedError - - @shield.setter - def shield(self, value: bool) -> None: - raise NotImplementedError - - def __enter__(self) -> CancelScope: - raise NotImplementedError - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> bool: - raise NotImplementedError - - -@contextmanager -def fail_after( - delay: float | None, shield: bool = False -) -> Generator[CancelScope, None, None]: - """ - Create a context manager which raises a :class:`TimeoutError` if does not finish in - time. - - :param delay: maximum allowed time (in seconds) before raising the exception, or - ``None`` to disable the timeout - :param shield: ``True`` to shield the cancel scope from external cancellation - :return: a context manager that yields a cancel scope - :rtype: :class:`~typing.ContextManager`\\[:class:`~anyio.CancelScope`\\] - - """ - current_time = get_async_backend().current_time - deadline = (current_time() + delay) if delay is not None else math.inf - with get_async_backend().create_cancel_scope( - deadline=deadline, shield=shield - ) as cancel_scope: - yield cancel_scope - - if cancel_scope.cancelled_caught and current_time() >= cancel_scope.deadline: - raise TimeoutError - - -def move_on_after(delay: float | None, shield: bool = False) -> CancelScope: - """ - Create a cancel scope with a deadline that expires after the given delay. - - :param delay: maximum allowed time (in seconds) before exiting the context block, or - ``None`` to disable the timeout - :param shield: ``True`` to shield the cancel scope from external cancellation - :return: a cancel scope - - """ - deadline = ( - (get_async_backend().current_time() + delay) if delay is not None else math.inf - ) - return get_async_backend().create_cancel_scope(deadline=deadline, shield=shield) - - -def current_effective_deadline() -> float: - """ - Return the nearest deadline among all the cancel scopes effective for the current - task. - - :return: a clock value from the event loop's internal clock (or ``float('inf')`` if - there is no deadline in effect, or ``float('-inf')`` if the current scope has - been cancelled) - :rtype: float - - """ - return get_async_backend().current_effective_deadline() - - -def create_task_group() -> TaskGroup: - """ - Create a task group. - - :return: a task group - - """ - return get_async_backend().create_task_group() diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_tempfile.py b/venv/lib/python3.11/site-packages/anyio/_core/_tempfile.py deleted file mode 100644 index 26d70ec..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_tempfile.py +++ /dev/null @@ -1,616 +0,0 @@ -from __future__ import annotations - -import os -import sys -import tempfile -from collections.abc import Iterable -from io import BytesIO, TextIOWrapper -from types import TracebackType -from typing import ( - TYPE_CHECKING, - Any, - AnyStr, - Generic, - overload, -) - -from .. import to_thread -from .._core._fileio import AsyncFile -from ..lowlevel import checkpoint_if_cancelled - -if TYPE_CHECKING: - from _typeshed import OpenBinaryMode, OpenTextMode, ReadableBuffer, WriteableBuffer - - -class TemporaryFile(Generic[AnyStr]): - """ - An asynchronous temporary file that is automatically created and cleaned up. - - This class provides an asynchronous context manager interface to a temporary file. - The file is created using Python's standard `tempfile.TemporaryFile` function in a - background thread, and is wrapped as an asynchronous file using `AsyncFile`. - - :param mode: The mode in which the file is opened. Defaults to "w+b". - :param buffering: The buffering policy (-1 means the default buffering). - :param encoding: The encoding used to decode or encode the file. Only applicable in - text mode. - :param newline: Controls how universal newlines mode works (only applicable in text - mode). - :param suffix: The suffix for the temporary file name. - :param prefix: The prefix for the temporary file name. - :param dir: The directory in which the temporary file is created. - :param errors: The error handling scheme used for encoding/decoding errors. - """ - - _async_file: AsyncFile[AnyStr] - - @overload - def __init__( - self: TemporaryFile[bytes], - mode: OpenBinaryMode = ..., - buffering: int = ..., - encoding: str | None = ..., - newline: str | None = ..., - suffix: str | None = ..., - prefix: str | None = ..., - dir: str | None = ..., - *, - errors: str | None = ..., - ): ... - @overload - def __init__( - self: TemporaryFile[str], - mode: OpenTextMode, - buffering: int = ..., - encoding: str | None = ..., - newline: str | None = ..., - suffix: str | None = ..., - prefix: str | None = ..., - dir: str | None = ..., - *, - errors: str | None = ..., - ): ... - - def __init__( - self, - mode: OpenTextMode | OpenBinaryMode = "w+b", - buffering: int = -1, - encoding: str | None = None, - newline: str | None = None, - suffix: str | None = None, - prefix: str | None = None, - dir: str | None = None, - *, - errors: str | None = None, - ) -> None: - self.mode = mode - self.buffering = buffering - self.encoding = encoding - self.newline = newline - self.suffix: str | None = suffix - self.prefix: str | None = prefix - self.dir: str | None = dir - self.errors = errors - - async def __aenter__(self) -> AsyncFile[AnyStr]: - fp = await to_thread.run_sync( - lambda: tempfile.TemporaryFile( - self.mode, - self.buffering, - self.encoding, - self.newline, - self.suffix, - self.prefix, - self.dir, - errors=self.errors, - ) - ) - self._async_file = AsyncFile(fp) - return self._async_file - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - traceback: TracebackType | None, - ) -> None: - await self._async_file.aclose() - - -class NamedTemporaryFile(Generic[AnyStr]): - """ - An asynchronous named temporary file that is automatically created and cleaned up. - - This class provides an asynchronous context manager for a temporary file with a - visible name in the file system. It uses Python's standard - :func:`~tempfile.NamedTemporaryFile` function and wraps the file object with - :class:`AsyncFile` for asynchronous operations. - - :param mode: The mode in which the file is opened. Defaults to "w+b". - :param buffering: The buffering policy (-1 means the default buffering). - :param encoding: The encoding used to decode or encode the file. Only applicable in - text mode. - :param newline: Controls how universal newlines mode works (only applicable in text - mode). - :param suffix: The suffix for the temporary file name. - :param prefix: The prefix for the temporary file name. - :param dir: The directory in which the temporary file is created. - :param delete: Whether to delete the file when it is closed. - :param errors: The error handling scheme used for encoding/decoding errors. - :param delete_on_close: (Python 3.12+) Whether to delete the file on close. - """ - - _async_file: AsyncFile[AnyStr] - - @overload - def __init__( - self: NamedTemporaryFile[bytes], - mode: OpenBinaryMode = ..., - buffering: int = ..., - encoding: str | None = ..., - newline: str | None = ..., - suffix: str | None = ..., - prefix: str | None = ..., - dir: str | None = ..., - delete: bool = ..., - *, - errors: str | None = ..., - delete_on_close: bool = ..., - ): ... - @overload - def __init__( - self: NamedTemporaryFile[str], - mode: OpenTextMode, - buffering: int = ..., - encoding: str | None = ..., - newline: str | None = ..., - suffix: str | None = ..., - prefix: str | None = ..., - dir: str | None = ..., - delete: bool = ..., - *, - errors: str | None = ..., - delete_on_close: bool = ..., - ): ... - - def __init__( - self, - mode: OpenBinaryMode | OpenTextMode = "w+b", - buffering: int = -1, - encoding: str | None = None, - newline: str | None = None, - suffix: str | None = None, - prefix: str | None = None, - dir: str | None = None, - delete: bool = True, - *, - errors: str | None = None, - delete_on_close: bool = True, - ) -> None: - self._params: dict[str, Any] = { - "mode": mode, - "buffering": buffering, - "encoding": encoding, - "newline": newline, - "suffix": suffix, - "prefix": prefix, - "dir": dir, - "delete": delete, - "errors": errors, - } - if sys.version_info >= (3, 12): - self._params["delete_on_close"] = delete_on_close - - async def __aenter__(self) -> AsyncFile[AnyStr]: - fp = await to_thread.run_sync( - lambda: tempfile.NamedTemporaryFile(**self._params) - ) - self._async_file = AsyncFile(fp) - return self._async_file - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - traceback: TracebackType | None, - ) -> None: - await self._async_file.aclose() - - -class SpooledTemporaryFile(AsyncFile[AnyStr]): - """ - An asynchronous spooled temporary file that starts in memory and is spooled to disk. - - This class provides an asynchronous interface to a spooled temporary file, much like - Python's standard :class:`~tempfile.SpooledTemporaryFile`. It supports asynchronous - write operations and provides a method to force a rollover to disk. - - :param max_size: Maximum size in bytes before the file is rolled over to disk. - :param mode: The mode in which the file is opened. Defaults to "w+b". - :param buffering: The buffering policy (-1 means the default buffering). - :param encoding: The encoding used to decode or encode the file (text mode only). - :param newline: Controls how universal newlines mode works (text mode only). - :param suffix: The suffix for the temporary file name. - :param prefix: The prefix for the temporary file name. - :param dir: The directory in which the temporary file is created. - :param errors: The error handling scheme used for encoding/decoding errors. - """ - - _rolled: bool = False - - @overload - def __init__( - self: SpooledTemporaryFile[bytes], - max_size: int = ..., - mode: OpenBinaryMode = ..., - buffering: int = ..., - encoding: str | None = ..., - newline: str | None = ..., - suffix: str | None = ..., - prefix: str | None = ..., - dir: str | None = ..., - *, - errors: str | None = ..., - ): ... - @overload - def __init__( - self: SpooledTemporaryFile[str], - max_size: int = ..., - mode: OpenTextMode = ..., - buffering: int = ..., - encoding: str | None = ..., - newline: str | None = ..., - suffix: str | None = ..., - prefix: str | None = ..., - dir: str | None = ..., - *, - errors: str | None = ..., - ): ... - - def __init__( - self, - max_size: int = 0, - mode: OpenBinaryMode | OpenTextMode = "w+b", - buffering: int = -1, - encoding: str | None = None, - newline: str | None = None, - suffix: str | None = None, - prefix: str | None = None, - dir: str | None = None, - *, - errors: str | None = None, - ) -> None: - self._tempfile_params: dict[str, Any] = { - "mode": mode, - "buffering": buffering, - "encoding": encoding, - "newline": newline, - "suffix": suffix, - "prefix": prefix, - "dir": dir, - "errors": errors, - } - self._max_size = max_size - if "b" in mode: - super().__init__(BytesIO()) # type: ignore[arg-type] - else: - super().__init__( - TextIOWrapper( # type: ignore[arg-type] - BytesIO(), - encoding=encoding, - errors=errors, - newline=newline, - write_through=True, - ) - ) - - async def aclose(self) -> None: - if not self._rolled: - self._fp.close() - return - - await super().aclose() - - async def _check(self) -> None: - if self._rolled or self._fp.tell() < self._max_size: - return - - await self.rollover() - - async def rollover(self) -> None: - if self._rolled: - return - - self._rolled = True - buffer = self._fp - buffer.seek(0) - self._fp = await to_thread.run_sync( - lambda: tempfile.TemporaryFile(**self._tempfile_params) - ) - await self.write(buffer.read()) - buffer.close() - - @property - def closed(self) -> bool: - return self._fp.closed - - async def read(self, size: int = -1) -> AnyStr: - if not self._rolled: - await checkpoint_if_cancelled() - return self._fp.read(size) - - return await super().read(size) # type: ignore[return-value] - - async def read1(self: SpooledTemporaryFile[bytes], size: int = -1) -> bytes: - if not self._rolled: - await checkpoint_if_cancelled() - return self._fp.read1(size) - - return await super().read1(size) - - async def readline(self) -> AnyStr: - if not self._rolled: - await checkpoint_if_cancelled() - return self._fp.readline() - - return await super().readline() # type: ignore[return-value] - - async def readlines(self) -> list[AnyStr]: - if not self._rolled: - await checkpoint_if_cancelled() - return self._fp.readlines() - - return await super().readlines() # type: ignore[return-value] - - async def readinto(self: SpooledTemporaryFile[bytes], b: WriteableBuffer) -> int: - if not self._rolled: - await checkpoint_if_cancelled() - self._fp.readinto(b) - - return await super().readinto(b) - - async def readinto1(self: SpooledTemporaryFile[bytes], b: WriteableBuffer) -> int: - if not self._rolled: - await checkpoint_if_cancelled() - self._fp.readinto(b) - - return await super().readinto1(b) - - async def seek(self, offset: int, whence: int | None = os.SEEK_SET) -> int: - if not self._rolled: - await checkpoint_if_cancelled() - return self._fp.seek(offset, whence) - - return await super().seek(offset, whence) - - async def tell(self) -> int: - if not self._rolled: - await checkpoint_if_cancelled() - return self._fp.tell() - - return await super().tell() - - async def truncate(self, size: int | None = None) -> int: - if not self._rolled: - await checkpoint_if_cancelled() - return self._fp.truncate(size) - - return await super().truncate(size) - - @overload - async def write(self: SpooledTemporaryFile[bytes], b: ReadableBuffer) -> int: ... - @overload - async def write(self: SpooledTemporaryFile[str], b: str) -> int: ... - - async def write(self, b: ReadableBuffer | str) -> int: - """ - Asynchronously write data to the spooled temporary file. - - If the file has not yet been rolled over, the data is written synchronously, - and a rollover is triggered if the size exceeds the maximum size. - - :param s: The data to write. - :return: The number of bytes written. - :raises RuntimeError: If the underlying file is not initialized. - - """ - if not self._rolled: - await checkpoint_if_cancelled() - result = self._fp.write(b) - await self._check() - return result - - return await super().write(b) # type: ignore[misc] - - @overload - async def writelines( - self: SpooledTemporaryFile[bytes], lines: Iterable[ReadableBuffer] - ) -> None: ... - @overload - async def writelines( - self: SpooledTemporaryFile[str], lines: Iterable[str] - ) -> None: ... - - async def writelines(self, lines: Iterable[str] | Iterable[ReadableBuffer]) -> None: - """ - Asynchronously write a list of lines to the spooled temporary file. - - If the file has not yet been rolled over, the lines are written synchronously, - and a rollover is triggered if the size exceeds the maximum size. - - :param lines: An iterable of lines to write. - :raises RuntimeError: If the underlying file is not initialized. - - """ - if not self._rolled: - await checkpoint_if_cancelled() - result = self._fp.writelines(lines) - await self._check() - return result - - return await super().writelines(lines) # type: ignore[misc] - - -class TemporaryDirectory(Generic[AnyStr]): - """ - An asynchronous temporary directory that is created and cleaned up automatically. - - This class provides an asynchronous context manager for creating a temporary - directory. It wraps Python's standard :class:`~tempfile.TemporaryDirectory` to - perform directory creation and cleanup operations in a background thread. - - :param suffix: Suffix to be added to the temporary directory name. - :param prefix: Prefix to be added to the temporary directory name. - :param dir: The parent directory where the temporary directory is created. - :param ignore_cleanup_errors: Whether to ignore errors during cleanup - (Python 3.10+). - :param delete: Whether to delete the directory upon closing (Python 3.12+). - """ - - def __init__( - self, - suffix: AnyStr | None = None, - prefix: AnyStr | None = None, - dir: AnyStr | None = None, - *, - ignore_cleanup_errors: bool = False, - delete: bool = True, - ) -> None: - self.suffix: AnyStr | None = suffix - self.prefix: AnyStr | None = prefix - self.dir: AnyStr | None = dir - self.ignore_cleanup_errors = ignore_cleanup_errors - self.delete = delete - - self._tempdir: tempfile.TemporaryDirectory | None = None - - async def __aenter__(self) -> str: - params: dict[str, Any] = { - "suffix": self.suffix, - "prefix": self.prefix, - "dir": self.dir, - } - if sys.version_info >= (3, 10): - params["ignore_cleanup_errors"] = self.ignore_cleanup_errors - - if sys.version_info >= (3, 12): - params["delete"] = self.delete - - self._tempdir = await to_thread.run_sync( - lambda: tempfile.TemporaryDirectory(**params) - ) - return await to_thread.run_sync(self._tempdir.__enter__) - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - traceback: TracebackType | None, - ) -> None: - if self._tempdir is not None: - await to_thread.run_sync( - self._tempdir.__exit__, exc_type, exc_value, traceback - ) - - async def cleanup(self) -> None: - if self._tempdir is not None: - await to_thread.run_sync(self._tempdir.cleanup) - - -@overload -async def mkstemp( - suffix: str | None = None, - prefix: str | None = None, - dir: str | None = None, - text: bool = False, -) -> tuple[int, str]: ... - - -@overload -async def mkstemp( - suffix: bytes | None = None, - prefix: bytes | None = None, - dir: bytes | None = None, - text: bool = False, -) -> tuple[int, bytes]: ... - - -async def mkstemp( - suffix: AnyStr | None = None, - prefix: AnyStr | None = None, - dir: AnyStr | None = None, - text: bool = False, -) -> tuple[int, str | bytes]: - """ - Asynchronously create a temporary file and return an OS-level handle and the file - name. - - This function wraps `tempfile.mkstemp` and executes it in a background thread. - - :param suffix: Suffix to be added to the file name. - :param prefix: Prefix to be added to the file name. - :param dir: Directory in which the temporary file is created. - :param text: Whether the file is opened in text mode. - :return: A tuple containing the file descriptor and the file name. - - """ - return await to_thread.run_sync(tempfile.mkstemp, suffix, prefix, dir, text) - - -@overload -async def mkdtemp( - suffix: str | None = None, - prefix: str | None = None, - dir: str | None = None, -) -> str: ... - - -@overload -async def mkdtemp( - suffix: bytes | None = None, - prefix: bytes | None = None, - dir: bytes | None = None, -) -> bytes: ... - - -async def mkdtemp( - suffix: AnyStr | None = None, - prefix: AnyStr | None = None, - dir: AnyStr | None = None, -) -> str | bytes: - """ - Asynchronously create a temporary directory and return its path. - - This function wraps `tempfile.mkdtemp` and executes it in a background thread. - - :param suffix: Suffix to be added to the directory name. - :param prefix: Prefix to be added to the directory name. - :param dir: Parent directory where the temporary directory is created. - :return: The path of the created temporary directory. - - """ - return await to_thread.run_sync(tempfile.mkdtemp, suffix, prefix, dir) - - -async def gettempdir() -> str: - """ - Asynchronously return the name of the directory used for temporary files. - - This function wraps `tempfile.gettempdir` and executes it in a background thread. - - :return: The path of the temporary directory as a string. - - """ - return await to_thread.run_sync(tempfile.gettempdir) - - -async def gettempdirb() -> bytes: - """ - Asynchronously return the name of the directory used for temporary files in bytes. - - This function wraps `tempfile.gettempdirb` and executes it in a background thread. - - :return: The path of the temporary directory as bytes. - - """ - return await to_thread.run_sync(tempfile.gettempdirb) diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_testing.py b/venv/lib/python3.11/site-packages/anyio/_core/_testing.py deleted file mode 100644 index 9e28b22..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_testing.py +++ /dev/null @@ -1,78 +0,0 @@ -from __future__ import annotations - -from collections.abc import Awaitable, Generator -from typing import Any, cast - -from ._eventloop import get_async_backend - - -class TaskInfo: - """ - Represents an asynchronous task. - - :ivar int id: the unique identifier of the task - :ivar parent_id: the identifier of the parent task, if any - :vartype parent_id: Optional[int] - :ivar str name: the description of the task (if any) - :ivar ~collections.abc.Coroutine coro: the coroutine object of the task - """ - - __slots__ = "_name", "id", "parent_id", "name", "coro" - - def __init__( - self, - id: int, - parent_id: int | None, - name: str | None, - coro: Generator[Any, Any, Any] | Awaitable[Any], - ): - func = get_current_task - self._name = f"{func.__module__}.{func.__qualname__}" - self.id: int = id - self.parent_id: int | None = parent_id - self.name: str | None = name - self.coro: Generator[Any, Any, Any] | Awaitable[Any] = coro - - def __eq__(self, other: object) -> bool: - if isinstance(other, TaskInfo): - return self.id == other.id - - return NotImplemented - - def __hash__(self) -> int: - return hash(self.id) - - def __repr__(self) -> str: - return f"{self.__class__.__name__}(id={self.id!r}, name={self.name!r})" - - def has_pending_cancellation(self) -> bool: - """ - Return ``True`` if the task has a cancellation pending, ``False`` otherwise. - - """ - return False - - -def get_current_task() -> TaskInfo: - """ - Return the current task. - - :return: a representation of the current task - - """ - return get_async_backend().get_current_task() - - -def get_running_tasks() -> list[TaskInfo]: - """ - Return a list of running tasks in the current event loop. - - :return: a list of task info objects - - """ - return cast("list[TaskInfo]", get_async_backend().get_running_tasks()) - - -async def wait_all_tasks_blocked() -> None: - """Wait until all other tasks are waiting for something.""" - await get_async_backend().wait_all_tasks_blocked() diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_typedattr.py b/venv/lib/python3.11/site-packages/anyio/_core/_typedattr.py deleted file mode 100644 index f358a44..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_typedattr.py +++ /dev/null @@ -1,81 +0,0 @@ -from __future__ import annotations - -from collections.abc import Callable, Mapping -from typing import Any, TypeVar, final, overload - -from ._exceptions import TypedAttributeLookupError - -T_Attr = TypeVar("T_Attr") -T_Default = TypeVar("T_Default") -undefined = object() - - -def typed_attribute() -> Any: - """Return a unique object, used to mark typed attributes.""" - return object() - - -class TypedAttributeSet: - """ - Superclass for typed attribute collections. - - Checks that every public attribute of every subclass has a type annotation. - """ - - def __init_subclass__(cls) -> None: - annotations: dict[str, Any] = getattr(cls, "__annotations__", {}) - for attrname in dir(cls): - if not attrname.startswith("_") and attrname not in annotations: - raise TypeError( - f"Attribute {attrname!r} is missing its type annotation" - ) - - super().__init_subclass__() - - -class TypedAttributeProvider: - """Base class for classes that wish to provide typed extra attributes.""" - - @property - def extra_attributes(self) -> Mapping[T_Attr, Callable[[], T_Attr]]: - """ - A mapping of the extra attributes to callables that return the corresponding - values. - - If the provider wraps another provider, the attributes from that wrapper should - also be included in the returned mapping (but the wrapper may override the - callables from the wrapped instance). - - """ - return {} - - @overload - def extra(self, attribute: T_Attr) -> T_Attr: ... - - @overload - def extra(self, attribute: T_Attr, default: T_Default) -> T_Attr | T_Default: ... - - @final - def extra(self, attribute: Any, default: object = undefined) -> object: - """ - extra(attribute, default=undefined) - - Return the value of the given typed extra attribute. - - :param attribute: the attribute (member of a :class:`~TypedAttributeSet`) to - look for - :param default: the value that should be returned if no value is found for the - attribute - :raises ~anyio.TypedAttributeLookupError: if the search failed and no default - value was given - - """ - try: - getter = self.extra_attributes[attribute] - except KeyError: - if default is undefined: - raise TypedAttributeLookupError("Attribute not found") from None - else: - return default - - return getter() diff --git a/venv/lib/python3.11/site-packages/anyio/abc/__init__.py b/venv/lib/python3.11/site-packages/anyio/abc/__init__.py deleted file mode 100644 index 3d3b61c..0000000 --- a/venv/lib/python3.11/site-packages/anyio/abc/__init__.py +++ /dev/null @@ -1,55 +0,0 @@ -from __future__ import annotations - -from ._eventloop import AsyncBackend as AsyncBackend -from ._resources import AsyncResource as AsyncResource -from ._sockets import ConnectedUDPSocket as ConnectedUDPSocket -from ._sockets import ConnectedUNIXDatagramSocket as ConnectedUNIXDatagramSocket -from ._sockets import IPAddressType as IPAddressType -from ._sockets import IPSockAddrType as IPSockAddrType -from ._sockets import SocketAttribute as SocketAttribute -from ._sockets import SocketListener as SocketListener -from ._sockets import SocketStream as SocketStream -from ._sockets import UDPPacketType as UDPPacketType -from ._sockets import UDPSocket as UDPSocket -from ._sockets import UNIXDatagramPacketType as UNIXDatagramPacketType -from ._sockets import UNIXDatagramSocket as UNIXDatagramSocket -from ._sockets import UNIXSocketStream as UNIXSocketStream -from ._streams import AnyByteReceiveStream as AnyByteReceiveStream -from ._streams import AnyByteSendStream as AnyByteSendStream -from ._streams import AnyByteStream as AnyByteStream -from ._streams import AnyUnreliableByteReceiveStream as AnyUnreliableByteReceiveStream -from ._streams import AnyUnreliableByteSendStream as AnyUnreliableByteSendStream -from ._streams import AnyUnreliableByteStream as AnyUnreliableByteStream -from ._streams import ByteReceiveStream as ByteReceiveStream -from ._streams import ByteSendStream as ByteSendStream -from ._streams import ByteStream as ByteStream -from ._streams import Listener as Listener -from ._streams import ObjectReceiveStream as ObjectReceiveStream -from ._streams import ObjectSendStream as ObjectSendStream -from ._streams import ObjectStream as ObjectStream -from ._streams import UnreliableObjectReceiveStream as UnreliableObjectReceiveStream -from ._streams import UnreliableObjectSendStream as UnreliableObjectSendStream -from ._streams import UnreliableObjectStream as UnreliableObjectStream -from ._subprocesses import Process as Process -from ._tasks import TaskGroup as TaskGroup -from ._tasks import TaskStatus as TaskStatus -from ._testing import TestRunner as TestRunner - -# Re-exported here, for backwards compatibility -# isort: off -from .._core._synchronization import ( - CapacityLimiter as CapacityLimiter, - Condition as Condition, - Event as Event, - Lock as Lock, - Semaphore as Semaphore, -) -from .._core._tasks import CancelScope as CancelScope -from ..from_thread import BlockingPortal as BlockingPortal - -# Re-export imports so they look like they live directly in this package -for __value in list(locals().values()): - if getattr(__value, "__module__", "").startswith("anyio.abc."): - __value.__module__ = __name__ - -del __value diff --git a/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 02f268e3a11278b7448e80bbdd499c9c7ebd4fde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2884 zcmbuA&rcgi6vt-)d;Qx6jQRaLCYXSoA0#Dd8kHXfB1H)bq^hQ=R%`DBw%H%n>>A`8 zDvmkykXDt_V@|26Uizmj6;fAwO4U=;3sNpsPJJ`R#1nk$>iNrO-psz8dGGD=OEMWl zaNYdtpWVkmf3rdJ3O7J{_gx1!YR&4;51HiP620dhI1OY z8+UWg0QcY?&fP|@nZ;SoJ-~gqk8>|@4(B*$f%|bk=RV*8Jis{zJctK5_X7{%A0%FEa8%Q8DHje7mX|C zReY86tZ~g;#ETN@K;%07ZoGza|JJNMdiBW}wt%?iwFGy-uW_xRZwhz`BHbiQT0xt8 z-3hbsYh15xHL3Nlc1esuW%4OmQf@cbd_VW~k~Y7M3JY(Us~`n&)v|0?b#>cv-m+(d zFR|>@t;&j8c}gq|#z{VYNF2LHD+C-ptF~p4ic7RdYg^kktaHIT{K0$w?pJH7tL{?O zJeyA5-CEW(N*rgWUS&~Iclo`{dFn|w7B9Ol)yp-PFKW2%>5fY*LgBVV!?W#DqM9&H z!XCERUft6u(bi4n9<}U6Sk}`zbGFM2^M3S%?6Or~sk`JMsStgioISbw)V~dBI&&tQ z&gTBc!12hU#L(5ULE6O`KDR=M*nfVy8N0h(xD;~=5n|layeZO>%-#p(Z=sMMpDfdG z3qca6zGj%w4~J?WWa#4sLb%+y*=AsQi`o@v6R2%;M|GZVP`g%zL5vNyp;v2cDz-x$ z_hAkCkiLcQDJq15^r~7_E4o|1r<=Mt)O6O{LFkKpV!1)rJ?PdTx=l>Ax@S|? zVewVfst{wlVmG>S#egNcwYz0gS2co|qL{W;Gl-%D=vhp)>bhN2%a!8&!e?yqNzJWM zn56901P5WyF>Jd^Lk$OXJb!N-%KiZa5yjyzj6-D@(g>3%6ZVgT#+f9TB$=d`q?u%x zbTjDzVNrOx9NNo#StflVa0{iJM;oum1mxa;zIf%OLT?}b4mr0Syb3}V~^UF{)~T7=q$UTz+{feB_{JA zLE`j=M%)GFia(*YsknRaT5Gh(JY5F7^+6cwp&CvQ-dBwpaROOUI0f=9fo5=N5OZ9W zy3T>_?!m?sOEp5`)8mhLJ_v08s0x!vf7J9Hfavk#`T4wXOYlqAVVQ=VvV z(4r@rk8XIP`RI-(nvb?T(R?uo#B3L5$wPv*TXWSzg0+i0?;*i_wC;)4ZqK(oB$$s@ zJkfk~+Y_zb)4%kPVC}N8=^??|MLwVBqK5?Y(VQomk3RQA^Tk8K8GSKfBuy*?q3ITQT#UsFpP9kBc;{^R*Ng)X`cD>ckpZz3^GTG55IdypO{NU%rtMZXtIF<{4%8P%>q=|9_VQmz01 diff --git a/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_eventloop.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_eventloop.cpython-311.pyc deleted file mode 100644 index b1155bd6267f68ad551675e2cc8192827d50cde5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16438 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 ai?KVSA(*ae)AJ9rln-h8N6Vn7<@_I|gX*#X diff --git a/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_resources.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_resources.cpython-311.pyc deleted file mode 100644 index e77ab9656003d20adacd3162e770d110da0dfbc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1815 zcmah}&2Jk;6rb5$uh(`GC$%9Z6m``LvIMp&PE@E;8leg(IgqGGi(ot6oy1mlXU)ty zU-S^v2o;3HF>vD)6ovnTYmU*LinxHdxC$qqcyHEjSX#vF?3?%Iy_tFM_ukA;v$ItK z?d@Ox+^m~~{D#7`m2!q&2w;v#NJ1Ksn0k~VZ$w6HdS+~SmX^(^6x*Jyc`GW%j^|Kf z5blJfV@k*={CV>#2DwW@`;dfXZvN~X!?~yMPqfvrvPN3fKTvGZtj2^$QkM1;p;|^( zUcR&PAx~L0$GR$&EJ$OX_L2}RXV*dGT^4Mu?+rLilySVzWJcG6$?kfXoJB8ggLp(Z z@n}dqBcz@g8lDv{fNz#p3a^B7FxtEvHp2R$bqv<0&-U@0a31_@X0yv`PXr%vl?-LT z_kXFn(3U68xm~8X8$?VgcO#K5iz1K`#aTDvF2j{QnTTYlTshf6wX1rIj}y72z{F*u zXc#0S<-4gHGr=~wba#6Fpa;v-p%ltZd)(~{l`;_klPVr7 zEyV8D1ExKCpv`vsXU^C62SnzHYQNdVJ;uZogX`M$h@o4$qw z-%lNgz7N{TJUH}TBEet9Kro8@8yTgNGa^Xl$U@`by^%#r%@HXQ+b&%jks_HVc5`IV z(hW4u$x{>N4nO pCrf9={=}*s+@~^(MTm&Xw_H{RuxSyEB1oFcD;B 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 diff --git a/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-311.pyc deleted file mode 100644 index fb01adb85bb851c18bbc32fd97a569e3267830c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3662 zcmcIn&2Jk;6rZ)%AMsboM`|3l$ev;nWlF?Rq!sxNVFO>-F=@o8Qd)nD^d{e=e5` z1fI`-|7&wGPsktGiJnZ@Q1)BUct{vwicK7)p(xl+*(oR8NC)k-tvZ=T2HGmi*jXpn z$OY}JopEdY;J>83(v4yRfa{wbv@tkEzgzE ztr#uo3&Zps?r(VvIJpgL(=}}QObI8HugJb@-r~~h3X@k;!}+UypWospx3>9)FSy|h zE6Cd5E(`l+C_1ES_@nICVZn!llZL`bBgK?PnyYMysXOW;fINxkG%~|a;B(D(QPO$P3xMF}i$&MX?D+Rc>*!&T=@));p1g^psVFynQ zbL+x0xs-!TS6ph~u51a<^}3R7b0J|vsn@1;(>A26H)Xfg3E|qh*Wqqc8)gOfyTTo& zE!Q`3ccTZ}KN6zsW4x{s1p`t6k*UGG0v$hh49llo*SBoyZ*e+aoAL*iFSSAptA{e` z0SE`F=`oIqC1%Cwwa4VKGE^nE+Y*(aFK*Pf4N>d$dbPG~b=uV%E&ntot4ms+PkRC}QIpfq-zhP^V#k!a|j@cAM5 z>_d+X)iuxMQ+|O&Quebj9{XfJR{u5^j^!FYmr3i+(@jVy-tO9VpIU9&@uaj`Hcxoz zrc3WwF7tZwJj}EtH4WRAwAqYT9BX{8+H7jEJeanAb7SQ$m3`@RCz>oF@o@6S%JS`N zw{A3>)c2AKB?N04m7GI%d-Xc4W6n=UisnaVHDk$Z;uyFo_0+&xKAFOVFRey}!jmS1oi(B5o3f{BIsyUAcb!KYQ>#Xnv&gR74%bCiW<}NSs81 z&KhQAP>KZ}7G?@a^kA+`2j;J_=dcu0gND8Pj@UfC`R(3b7?~EivrYC`aPYog!E$bQJJu0 zzN}DcbY-G&(k(+$IKFA0`!r58HZCGPh@g1k7Ke&}>Ld%uD~v0I8epX!EJQXQ@amJM z9-lnyXSezy8Vk1#xG~VSCxXnDzTq-MFlxD-u0P{uWTek5cTkR04Z2q+wLCd>OPO8K zk6x#!*Y#)DGz+T1gh3^tD)g5pbe$n+KYN`l1pdK~|QKgGXl6 z#;RUbgG3GLQiuq+V>C^m-%GUL$M&&dUe{g2;krI7=(^*vu8r-Iu7B4x?D0rW*O_PP zy1>h$SVVFH$tfi702$^x0&X?J?~8YlcLvE>B@w1kZl?07__h zE+O4hFYl_CpJoCfTK(dm*<1?NKU^;}MC+k+C$>cn;@BB%Y6q1(L1o zp$bao!iYp<48fnu&fSrU{A`3&aj}RTMk2oyA(hNm3N9Ma!{A^fURTLn3D6OpM#D$~ zy&Rw;I*pD-P=jS9INXA*SgV#W3ff(`mqHW>IMc{54L7-PGbmO_@e<}a~ diff --git a/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_tasks.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_tasks.cpython-311.pyc deleted file mode 100644 index 4aa7a8b543f544e73527f9bee1a4457c1c007059..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4986 zcmds5&2JmW72hS76h%_s@<;q3Pvf+(%Z^+IT=9t2cCgPwe|4?Vjzl0*I!y3m2xlY(4g^diGK>D1qwC6^W@8$Op>KF+@PX6DU% zzxQTF|LW_@EBJi;{eM?-MMe36UfQ2*+)!U#Qx)a0VkwsDD6U#nRcfc4R5gX)w3BwV zs^(^@8Ohh2tlLxVadXw2e9t(&ZoZnA?W|L9i`AmrSM78AtNrdkb-*304yp=IeKpjc z*6MkXp|lAMHO*c#~4e=nunR;(Rqz42}JJ|*>rp*O;{ zZ%4bNr>)eSGJfm@DUYjB!SFmkG(y|=g4yv@)N}LJ^dER=ME%B65DLQ#T^_Fb7DT-_ z*9|)~mK+}CrVYoT7DnishZbKl%m?$EH9npJ^-lBp3cADo(zhcYlg55FT~V-a8s-V^CpH!J}q~tuRaCqvBH(AYAMwePg_MR zv#mV^_nSnys)65U$SX9JC%sjay`n))s+K7iuv{y;m(?5|9E?rj#Rh(_w+MxM1kbM}g7I4oQ>LJ-c#32fB} zSZlqde4<*Z8NzUxTxx~+OJ8v_WHloQxWx$OEcE3NaZkbgJ#>XNZs%xa3F~gAP}EyDhqSutO%w>AGjQT-T$#uDiZfcc@*| z^}o~&Czgml>O>KVEhm@9QKC8{h#bc^_yQ!hk!Um1*VL{yFbd2jHOwbf2!7LtA9J& zmBHCWdd3<$B<+FptTlWnzjNS^S*H&1do2z4Iv4d);@lQ~y=I`sD>D4@6}aLkZ$O+8 zYj0OZZ8Hz76S8d0N z2b9xRFi42f+BMK?^)g0ysl-t5d8NYs=*7m_{v-?PwVE$Nw(JYWQ7}ZDAj_!#zOZ?~ z?0})H2DZfoY(NGq@dWG>6MUlv>s;=IhBGlyVs|_wj0kPB?igZ{RtfpWRCCG zCYj+`%r!QlT@R8mO`{%gR!8p|lA4^!SB*6ri?%(i&q7_G0=QE(hO`|`-9z@;xf&XjZ0If2qYz$$}xRWLzAsU7DVGT*oonDRQ{PkUXQ~KCxokr zv@DJ*1na|PkycSbC)0;Kv^~yD!fPN`$^y{!mtTOpOe>IJ|l!L zD$MTe>}=Wg>|hltR1JW931EU&+XDK1^F)c-y8ux98Zqy}TSnsT;XoJEK7po$$dAg8 z*pTT@;_c9}@^43B>0xEYLlKpENG@VB>8a9(RA329NK@2nIXPA0cC83Xts~CQ$W$se z?Yz)+13AuxuD_la9c~r6;x|MnFQOdZFm>9v_D>OAxMc)g>P=z_dEtFp53)(DY6@%ww zO^Y$o@=W{qb_0`$TSR^j(iPQS@(ZSdvqn0RO_*O&x5QWDIU!5Z6mh8}30Y%kGZ5E^ zbPkCv%}SyvbYt!1&IUQr87tn#IRN=#VCUM}#h2-RDfQKoF7lgdH?uILCA^RmkM_6e6dT%veJ^ zi|4s^b~iJ!msd`n+3W46)8%182hh>&FZWU;VraM2he-V}Nz_U73sO(1nLFy9(xHip zWM!pJHggv`9h&HLSg}}wUM>>{gI?UN4b#EZV*Csp&6n%A7vg9x(pY_z4mN`*jVqfV z%t}8-1Gqvv@eUW1NJJM!L3gDnL+KNU9JRA(1EHdqq!eaBmurFlq$u*B9~E1hpl*9W z@gVVsK%$|zqmJz7IPKxYhid}1dR~gJjq-#eMoFJ8fr74y^1v>a)D_bG-1Ydf@mp~Z zdX#O!W6-^{s;W)p{l>v(SIKY5zov4ban#dP%8jF*rgE-v@M$Wy8t?Y(rn5Wgkw@$Q zNsl$sV@>T+;|8NdE}zEQaH zyl`cwaD{j$zP|n>|GaR1r*M8Nx0fxdK;>cb=;V`&J45GRlIW+7eC&p*67Jso^W;KH O`Z8Af=`Fevn*Rg+%OiRK diff --git a/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_testing.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_testing.cpython-311.pyc deleted file mode 100644 index 72e32369e52aa20200bd0079ed7331e9c87e269d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3023 zcmd5;&2Jk;6rc6y`XdRYrXOibhJsoQtxbi*M?gqzRh1sdfkq&0WLD$dv17U)W@eql zQ4dCnP>KZHnBB_xSFA9ILZx}m!zqvV#2veM_Bid!|R?t-zPkqqGrcHx0W$RqfVE@Lr6ZW6n=M{J$vel0!7 zf))N_>yn+hP3q+*_*mD%3iCWaU_sCK>hx@^Y$6LvX^@RGagOX8U@gwwU5o{i=aPe*JkuO z=wG)_&FD+^X@FuSEU$AJd^zwSuw7B6aNY1M)|Uf^1zb`_1=xCCm+~#{1=R8VeuLiF z;$lcGfPlKp<}}y@2)di_+mqC9f6J|aZuh`CkZ9z}uVgNN-iuO(1;K-X@T@6?5GsxV zA?>gLgZtzzxlJBwYY&mKoa9bN;siSRyt&0hb9;Nc*>QS(Z{Rjzi(5^n*KYQQz?=7e z;?RCpILWUm&+#ehCRQ@+E&wq@PM^$qdyEwrU}7uVVb+OXLvNG+GFrO38_s+ zVt6mixTb0)QvJuw%QlXm1n zHr65QcpG+$nG?^MRNB7p#1B>u-yL5^fU*H7fqNCNf~e=jaU7pSaT>)L5E9oT&7uZ_ zP=^?IdI1D}JRP`F;uKi|F(TtCIl26!B~IX~YNxjYtZ}n5@T|#&q!utC%U5x$kdLZ|&|!}|HkKByhYT6;NX2d15x%R`N8*|~TvHT3%tjPbz)GA4 zArU=5B_g*5wQDL50E`(!vb*ve(eoyp1sAIFMnL#r%ptVxG+OW1rbk}IB|rDSpN>J5^tkW#a0TSQAL$@ zFaMFt<)GUIi>rsC^g$mUqmvMxhQeYuOGta@OUJw)&Z=k>(h&NFv zPjA5}vDfF=u`0l>Hh+1Jy@B>JHe(MCNz)9=rs?|jz`=3VG`|}#C$OO;zl{nWb^u%peSqk+L)w8ffQ=vOg_In zCW&~O1>N2^k#H0*WOi?(BG%YN_ml?AhCT0B{)_Gdva&z# lew?q4zP`8qeQU2Z%8UyiXn^Ld_~}EXeTt@k=GYa&{{nsjAg=%b diff --git a/venv/lib/python3.11/site-packages/anyio/abc/_eventloop.py b/venv/lib/python3.11/site-packages/anyio/abc/_eventloop.py deleted file mode 100644 index 4cfce83..0000000 --- a/venv/lib/python3.11/site-packages/anyio/abc/_eventloop.py +++ /dev/null @@ -1,376 +0,0 @@ -from __future__ import annotations - -import math -import sys -from abc import ABCMeta, abstractmethod -from collections.abc import AsyncIterator, Awaitable, Callable, Sequence -from contextlib import AbstractContextManager -from os import PathLike -from signal import Signals -from socket import AddressFamily, SocketKind, socket -from typing import ( - IO, - TYPE_CHECKING, - Any, - TypeVar, - Union, - overload, -) - -if sys.version_info >= (3, 11): - from typing import TypeVarTuple, Unpack -else: - from typing_extensions import TypeVarTuple, Unpack - -if sys.version_info >= (3, 10): - from typing import TypeAlias -else: - from typing_extensions import TypeAlias - -if TYPE_CHECKING: - from _typeshed import HasFileno - - from .._core._synchronization import CapacityLimiter, Event, Lock, Semaphore - from .._core._tasks import CancelScope - from .._core._testing import TaskInfo - from ..from_thread import BlockingPortal - from ._sockets import ( - ConnectedUDPSocket, - ConnectedUNIXDatagramSocket, - IPSockAddrType, - SocketListener, - SocketStream, - UDPSocket, - UNIXDatagramSocket, - UNIXSocketStream, - ) - from ._subprocesses import Process - from ._tasks import TaskGroup - from ._testing import TestRunner - -T_Retval = TypeVar("T_Retval") -PosArgsT = TypeVarTuple("PosArgsT") -StrOrBytesPath: TypeAlias = Union[str, bytes, "PathLike[str]", "PathLike[bytes]"] - - -class AsyncBackend(metaclass=ABCMeta): - @classmethod - @abstractmethod - def run( - cls, - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], - args: tuple[Unpack[PosArgsT]], - kwargs: dict[str, Any], - options: dict[str, Any], - ) -> T_Retval: - """ - Run the given coroutine function in an asynchronous event loop. - - The current thread must not be already running an event loop. - - :param func: a coroutine function - :param args: positional arguments to ``func`` - :param kwargs: positional arguments to ``func`` - :param options: keyword arguments to call the backend ``run()`` implementation - with - :return: the return value of the coroutine function - """ - - @classmethod - @abstractmethod - def current_token(cls) -> object: - """ - - :return: - """ - - @classmethod - @abstractmethod - def current_time(cls) -> float: - """ - Return the current value of the event loop's internal clock. - - :return: the clock value (seconds) - """ - - @classmethod - @abstractmethod - def cancelled_exception_class(cls) -> type[BaseException]: - """Return the exception class that is raised in a task if it's cancelled.""" - - @classmethod - @abstractmethod - async def checkpoint(cls) -> None: - """ - Check if the task has been cancelled, and allow rescheduling of other tasks. - - This is effectively the same as running :meth:`checkpoint_if_cancelled` and then - :meth:`cancel_shielded_checkpoint`. - """ - - @classmethod - async def checkpoint_if_cancelled(cls) -> None: - """ - Check if the current task group has been cancelled. - - This will check if the task has been cancelled, but will not allow other tasks - to be scheduled if not. - - """ - if cls.current_effective_deadline() == -math.inf: - await cls.checkpoint() - - @classmethod - async def cancel_shielded_checkpoint(cls) -> None: - """ - Allow the rescheduling of other tasks. - - This will give other tasks the opportunity to run, but without checking if the - current task group has been cancelled, unlike with :meth:`checkpoint`. - - """ - with cls.create_cancel_scope(shield=True): - await cls.sleep(0) - - @classmethod - @abstractmethod - async def sleep(cls, delay: float) -> None: - """ - Pause the current task for the specified duration. - - :param delay: the duration, in seconds - """ - - @classmethod - @abstractmethod - def create_cancel_scope( - cls, *, deadline: float = math.inf, shield: bool = False - ) -> CancelScope: - pass - - @classmethod - @abstractmethod - def current_effective_deadline(cls) -> float: - """ - Return the nearest deadline among all the cancel scopes effective for the - current task. - - :return: - - a clock value from the event loop's internal clock - - ``inf`` if there is no deadline in effect - - ``-inf`` if the current scope has been cancelled - :rtype: float - """ - - @classmethod - @abstractmethod - def create_task_group(cls) -> TaskGroup: - pass - - @classmethod - @abstractmethod - def create_event(cls) -> Event: - pass - - @classmethod - @abstractmethod - def create_lock(cls, *, fast_acquire: bool) -> Lock: - pass - - @classmethod - @abstractmethod - def create_semaphore( - cls, - initial_value: int, - *, - max_value: int | None = None, - fast_acquire: bool = False, - ) -> Semaphore: - pass - - @classmethod - @abstractmethod - def create_capacity_limiter(cls, total_tokens: float) -> CapacityLimiter: - pass - - @classmethod - @abstractmethod - async def run_sync_in_worker_thread( - cls, - func: Callable[[Unpack[PosArgsT]], T_Retval], - args: tuple[Unpack[PosArgsT]], - abandon_on_cancel: bool = False, - limiter: CapacityLimiter | None = None, - ) -> T_Retval: - pass - - @classmethod - @abstractmethod - def check_cancelled(cls) -> None: - pass - - @classmethod - @abstractmethod - def run_async_from_thread( - cls, - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], - args: tuple[Unpack[PosArgsT]], - token: object, - ) -> T_Retval: - pass - - @classmethod - @abstractmethod - def run_sync_from_thread( - cls, - func: Callable[[Unpack[PosArgsT]], T_Retval], - args: tuple[Unpack[PosArgsT]], - token: object, - ) -> T_Retval: - pass - - @classmethod - @abstractmethod - def create_blocking_portal(cls) -> BlockingPortal: - pass - - @classmethod - @abstractmethod - async def open_process( - cls, - command: StrOrBytesPath | Sequence[StrOrBytesPath], - *, - stdin: int | IO[Any] | None, - stdout: int | IO[Any] | None, - stderr: int | IO[Any] | None, - **kwargs: Any, - ) -> Process: - pass - - @classmethod - @abstractmethod - def setup_process_pool_exit_at_shutdown(cls, workers: set[Process]) -> None: - pass - - @classmethod - @abstractmethod - async def connect_tcp( - cls, host: str, port: int, local_address: IPSockAddrType | None = None - ) -> SocketStream: - pass - - @classmethod - @abstractmethod - async def connect_unix(cls, path: str | bytes) -> UNIXSocketStream: - pass - - @classmethod - @abstractmethod - def create_tcp_listener(cls, sock: socket) -> SocketListener: - pass - - @classmethod - @abstractmethod - def create_unix_listener(cls, sock: socket) -> SocketListener: - pass - - @classmethod - @abstractmethod - async def create_udp_socket( - cls, - family: AddressFamily, - local_address: IPSockAddrType | None, - remote_address: IPSockAddrType | None, - reuse_port: bool, - ) -> UDPSocket | ConnectedUDPSocket: - pass - - @classmethod - @overload - async def create_unix_datagram_socket( - cls, raw_socket: socket, remote_path: None - ) -> UNIXDatagramSocket: ... - - @classmethod - @overload - async def create_unix_datagram_socket( - cls, raw_socket: socket, remote_path: str | bytes - ) -> ConnectedUNIXDatagramSocket: ... - - @classmethod - @abstractmethod - async def create_unix_datagram_socket( - cls, raw_socket: socket, remote_path: str | bytes | None - ) -> UNIXDatagramSocket | ConnectedUNIXDatagramSocket: - pass - - @classmethod - @abstractmethod - async def getaddrinfo( - cls, - host: bytes | str | None, - port: str | int | None, - *, - family: int | AddressFamily = 0, - type: int | SocketKind = 0, - proto: int = 0, - flags: int = 0, - ) -> Sequence[ - tuple[ - AddressFamily, - SocketKind, - int, - str, - tuple[str, int] | tuple[str, int, int, int] | tuple[int, bytes], - ] - ]: - pass - - @classmethod - @abstractmethod - async def getnameinfo( - cls, sockaddr: IPSockAddrType, flags: int = 0 - ) -> tuple[str, str]: - pass - - @classmethod - @abstractmethod - async def wait_readable(cls, obj: HasFileno | int) -> None: - pass - - @classmethod - @abstractmethod - async def wait_writable(cls, obj: HasFileno | int) -> None: - pass - - @classmethod - @abstractmethod - def current_default_thread_limiter(cls) -> CapacityLimiter: - pass - - @classmethod - @abstractmethod - def open_signal_receiver( - cls, *signals: Signals - ) -> AbstractContextManager[AsyncIterator[Signals]]: - pass - - @classmethod - @abstractmethod - def get_current_task(cls) -> TaskInfo: - pass - - @classmethod - @abstractmethod - def get_running_tasks(cls) -> Sequence[TaskInfo]: - pass - - @classmethod - @abstractmethod - async def wait_all_tasks_blocked(cls) -> None: - pass - - @classmethod - @abstractmethod - def create_test_runner(cls, options: dict[str, Any]) -> TestRunner: - pass diff --git a/venv/lib/python3.11/site-packages/anyio/abc/_resources.py b/venv/lib/python3.11/site-packages/anyio/abc/_resources.py deleted file mode 100644 index 10df115..0000000 --- a/venv/lib/python3.11/site-packages/anyio/abc/_resources.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import annotations - -from abc import ABCMeta, abstractmethod -from types import TracebackType -from typing import TypeVar - -T = TypeVar("T") - - -class AsyncResource(metaclass=ABCMeta): - """ - Abstract base class for all closeable asynchronous resources. - - Works as an asynchronous context manager which returns the instance itself on enter, - and calls :meth:`aclose` on exit. - """ - - __slots__ = () - - async def __aenter__(self: T) -> T: - return self - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - await self.aclose() - - @abstractmethod - async def aclose(self) -> None: - """Close the resource.""" diff --git a/venv/lib/python3.11/site-packages/anyio/abc/_sockets.py b/venv/lib/python3.11/site-packages/anyio/abc/_sockets.py deleted file mode 100644 index 1c6a450..0000000 --- a/venv/lib/python3.11/site-packages/anyio/abc/_sockets.py +++ /dev/null @@ -1,194 +0,0 @@ -from __future__ import annotations - -import socket -from abc import abstractmethod -from collections.abc import Callable, Collection, Mapping -from contextlib import AsyncExitStack -from io import IOBase -from ipaddress import IPv4Address, IPv6Address -from socket import AddressFamily -from types import TracebackType -from typing import Any, TypeVar, Union - -from .._core._typedattr import ( - TypedAttributeProvider, - TypedAttributeSet, - typed_attribute, -) -from ._streams import ByteStream, Listener, UnreliableObjectStream -from ._tasks import TaskGroup - -IPAddressType = Union[str, IPv4Address, IPv6Address] -IPSockAddrType = tuple[str, int] -SockAddrType = Union[IPSockAddrType, str] -UDPPacketType = tuple[bytes, IPSockAddrType] -UNIXDatagramPacketType = tuple[bytes, str] -T_Retval = TypeVar("T_Retval") - - -class _NullAsyncContextManager: - async def __aenter__(self) -> None: - pass - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> bool | None: - return None - - -class SocketAttribute(TypedAttributeSet): - #: the address family of the underlying socket - family: AddressFamily = typed_attribute() - #: the local socket address of the underlying socket - local_address: SockAddrType = typed_attribute() - #: for IP addresses, the local port the underlying socket is bound to - local_port: int = typed_attribute() - #: the underlying stdlib socket object - raw_socket: socket.socket = typed_attribute() - #: the remote address the underlying socket is connected to - remote_address: SockAddrType = typed_attribute() - #: for IP addresses, the remote port the underlying socket is connected to - remote_port: int = typed_attribute() - - -class _SocketProvider(TypedAttributeProvider): - @property - def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: - from .._core._sockets import convert_ipv6_sockaddr as convert - - attributes: dict[Any, Callable[[], Any]] = { - SocketAttribute.family: lambda: self._raw_socket.family, - SocketAttribute.local_address: lambda: convert( - self._raw_socket.getsockname() - ), - SocketAttribute.raw_socket: lambda: self._raw_socket, - } - try: - peername: tuple[str, int] | None = convert(self._raw_socket.getpeername()) - except OSError: - peername = None - - # Provide the remote address for connected sockets - if peername is not None: - attributes[SocketAttribute.remote_address] = lambda: peername - - # Provide local and remote ports for IP based sockets - if self._raw_socket.family in (AddressFamily.AF_INET, AddressFamily.AF_INET6): - attributes[SocketAttribute.local_port] = ( - lambda: self._raw_socket.getsockname()[1] - ) - if peername is not None: - remote_port = peername[1] - attributes[SocketAttribute.remote_port] = lambda: remote_port - - return attributes - - @property - @abstractmethod - def _raw_socket(self) -> socket.socket: - pass - - -class SocketStream(ByteStream, _SocketProvider): - """ - Transports bytes over a socket. - - Supports all relevant extra attributes from :class:`~SocketAttribute`. - """ - - -class UNIXSocketStream(SocketStream): - @abstractmethod - async def send_fds(self, message: bytes, fds: Collection[int | IOBase]) -> None: - """ - Send file descriptors along with a message to the peer. - - :param message: a non-empty bytestring - :param fds: a collection of files (either numeric file descriptors or open file - or socket objects) - """ - - @abstractmethod - async def receive_fds(self, msglen: int, maxfds: int) -> tuple[bytes, list[int]]: - """ - Receive file descriptors along with a message from the peer. - - :param msglen: length of the message to expect from the peer - :param maxfds: maximum number of file descriptors to expect from the peer - :return: a tuple of (message, file descriptors) - """ - - -class SocketListener(Listener[SocketStream], _SocketProvider): - """ - Listens to incoming socket connections. - - Supports all relevant extra attributes from :class:`~SocketAttribute`. - """ - - @abstractmethod - async def accept(self) -> SocketStream: - """Accept an incoming connection.""" - - async def serve( - self, - handler: Callable[[SocketStream], Any], - task_group: TaskGroup | None = None, - ) -> None: - from .. import create_task_group - - async with AsyncExitStack() as stack: - if task_group is None: - task_group = await stack.enter_async_context(create_task_group()) - - while True: - stream = await self.accept() - task_group.start_soon(handler, stream) - - -class UDPSocket(UnreliableObjectStream[UDPPacketType], _SocketProvider): - """ - Represents an unconnected UDP socket. - - Supports all relevant extra attributes from :class:`~SocketAttribute`. - """ - - async def sendto(self, data: bytes, host: str, port: int) -> None: - """ - Alias for :meth:`~.UnreliableObjectSendStream.send` ((data, (host, port))). - - """ - return await self.send((data, (host, port))) - - -class ConnectedUDPSocket(UnreliableObjectStream[bytes], _SocketProvider): - """ - Represents an connected UDP socket. - - Supports all relevant extra attributes from :class:`~SocketAttribute`. - """ - - -class UNIXDatagramSocket( - UnreliableObjectStream[UNIXDatagramPacketType], _SocketProvider -): - """ - Represents an unconnected Unix datagram socket. - - Supports all relevant extra attributes from :class:`~SocketAttribute`. - """ - - async def sendto(self, data: bytes, path: str) -> None: - """Alias for :meth:`~.UnreliableObjectSendStream.send` ((data, path)).""" - return await self.send((data, path)) - - -class ConnectedUNIXDatagramSocket(UnreliableObjectStream[bytes], _SocketProvider): - """ - Represents a connected Unix datagram socket. - - Supports all relevant extra attributes from :class:`~SocketAttribute`. - """ diff --git a/venv/lib/python3.11/site-packages/anyio/abc/_streams.py b/venv/lib/python3.11/site-packages/anyio/abc/_streams.py deleted file mode 100644 index f11d97b..0000000 --- a/venv/lib/python3.11/site-packages/anyio/abc/_streams.py +++ /dev/null @@ -1,203 +0,0 @@ -from __future__ import annotations - -from abc import abstractmethod -from collections.abc import Callable -from typing import Any, Generic, TypeVar, Union - -from .._core._exceptions import EndOfStream -from .._core._typedattr import TypedAttributeProvider -from ._resources import AsyncResource -from ._tasks import TaskGroup - -T_Item = TypeVar("T_Item") -T_co = TypeVar("T_co", covariant=True) -T_contra = TypeVar("T_contra", contravariant=True) - - -class UnreliableObjectReceiveStream( - Generic[T_co], AsyncResource, TypedAttributeProvider -): - """ - An interface for receiving objects. - - This interface makes no guarantees that the received messages arrive in the order in - which they were sent, or that no messages are missed. - - Asynchronously iterating over objects of this type will yield objects matching the - given type parameter. - """ - - def __aiter__(self) -> UnreliableObjectReceiveStream[T_co]: - return self - - async def __anext__(self) -> T_co: - try: - return await self.receive() - except EndOfStream: - raise StopAsyncIteration - - @abstractmethod - async def receive(self) -> T_co: - """ - Receive the next item. - - :raises ~anyio.ClosedResourceError: if the receive stream has been explicitly - closed - :raises ~anyio.EndOfStream: if this stream has been closed from the other end - :raises ~anyio.BrokenResourceError: if this stream has been rendered unusable - due to external causes - """ - - -class UnreliableObjectSendStream( - Generic[T_contra], AsyncResource, TypedAttributeProvider -): - """ - An interface for sending objects. - - This interface makes no guarantees that the messages sent will reach the - recipient(s) in the same order in which they were sent, or at all. - """ - - @abstractmethod - async def send(self, item: T_contra) -> None: - """ - Send an item to the peer(s). - - :param item: the item to send - :raises ~anyio.ClosedResourceError: if the send stream has been explicitly - closed - :raises ~anyio.BrokenResourceError: if this stream has been rendered unusable - due to external causes - """ - - -class UnreliableObjectStream( - UnreliableObjectReceiveStream[T_Item], UnreliableObjectSendStream[T_Item] -): - """ - A bidirectional message stream which does not guarantee the order or reliability of - message delivery. - """ - - -class ObjectReceiveStream(UnreliableObjectReceiveStream[T_co]): - """ - A receive message stream which guarantees that messages are received in the same - order in which they were sent, and that no messages are missed. - """ - - -class ObjectSendStream(UnreliableObjectSendStream[T_contra]): - """ - A send message stream which guarantees that messages are delivered in the same order - in which they were sent, without missing any messages in the middle. - """ - - -class ObjectStream( - ObjectReceiveStream[T_Item], - ObjectSendStream[T_Item], - UnreliableObjectStream[T_Item], -): - """ - A bidirectional message stream which guarantees the order and reliability of message - delivery. - """ - - @abstractmethod - async def send_eof(self) -> None: - """ - Send an end-of-file indication to the peer. - - You should not try to send any further data to this stream after calling this - method. This method is idempotent (does nothing on successive calls). - """ - - -class ByteReceiveStream(AsyncResource, TypedAttributeProvider): - """ - An interface for receiving bytes from a single peer. - - Iterating this byte stream will yield a byte string of arbitrary length, but no more - than 65536 bytes. - """ - - def __aiter__(self) -> ByteReceiveStream: - return self - - async def __anext__(self) -> bytes: - try: - return await self.receive() - except EndOfStream: - raise StopAsyncIteration - - @abstractmethod - async def receive(self, max_bytes: int = 65536) -> bytes: - """ - Receive at most ``max_bytes`` bytes from the peer. - - .. note:: Implementers of this interface should not return an empty - :class:`bytes` object, and users should ignore them. - - :param max_bytes: maximum number of bytes to receive - :return: the received bytes - :raises ~anyio.EndOfStream: if this stream has been closed from the other end - """ - - -class ByteSendStream(AsyncResource, TypedAttributeProvider): - """An interface for sending bytes to a single peer.""" - - @abstractmethod - async def send(self, item: bytes) -> None: - """ - Send the given bytes to the peer. - - :param item: the bytes to send - """ - - -class ByteStream(ByteReceiveStream, ByteSendStream): - """A bidirectional byte stream.""" - - @abstractmethod - async def send_eof(self) -> None: - """ - Send an end-of-file indication to the peer. - - You should not try to send any further data to this stream after calling this - method. This method is idempotent (does nothing on successive calls). - """ - - -#: Type alias for all unreliable bytes-oriented receive streams. -AnyUnreliableByteReceiveStream = Union[ - UnreliableObjectReceiveStream[bytes], ByteReceiveStream -] -#: Type alias for all unreliable bytes-oriented send streams. -AnyUnreliableByteSendStream = Union[UnreliableObjectSendStream[bytes], ByteSendStream] -#: Type alias for all unreliable bytes-oriented streams. -AnyUnreliableByteStream = Union[UnreliableObjectStream[bytes], ByteStream] -#: Type alias for all bytes-oriented receive streams. -AnyByteReceiveStream = Union[ObjectReceiveStream[bytes], ByteReceiveStream] -#: Type alias for all bytes-oriented send streams. -AnyByteSendStream = Union[ObjectSendStream[bytes], ByteSendStream] -#: Type alias for all bytes-oriented streams. -AnyByteStream = Union[ObjectStream[bytes], ByteStream] - - -class Listener(Generic[T_co], AsyncResource, TypedAttributeProvider): - """An interface for objects that let you accept incoming connections.""" - - @abstractmethod - async def serve( - self, handler: Callable[[T_co], Any], task_group: TaskGroup | None = None - ) -> None: - """ - Accept incoming connections as they come in and start tasks to handle them. - - :param handler: a callable that will be used to handle each accepted connection - :param task_group: the task group that will be used to start tasks for handling - each accepted connection (if omitted, an ad-hoc task group will be created) - """ diff --git a/venv/lib/python3.11/site-packages/anyio/abc/_subprocesses.py b/venv/lib/python3.11/site-packages/anyio/abc/_subprocesses.py deleted file mode 100644 index ce0564c..0000000 --- a/venv/lib/python3.11/site-packages/anyio/abc/_subprocesses.py +++ /dev/null @@ -1,79 +0,0 @@ -from __future__ import annotations - -from abc import abstractmethod -from signal import Signals - -from ._resources import AsyncResource -from ._streams import ByteReceiveStream, ByteSendStream - - -class Process(AsyncResource): - """An asynchronous version of :class:`subprocess.Popen`.""" - - @abstractmethod - async def wait(self) -> int: - """ - Wait until the process exits. - - :return: the exit code of the process - """ - - @abstractmethod - def terminate(self) -> None: - """ - Terminates the process, gracefully if possible. - - On Windows, this calls ``TerminateProcess()``. - On POSIX systems, this sends ``SIGTERM`` to the process. - - .. seealso:: :meth:`subprocess.Popen.terminate` - """ - - @abstractmethod - def kill(self) -> None: - """ - Kills the process. - - On Windows, this calls ``TerminateProcess()``. - On POSIX systems, this sends ``SIGKILL`` to the process. - - .. seealso:: :meth:`subprocess.Popen.kill` - """ - - @abstractmethod - def send_signal(self, signal: Signals) -> None: - """ - Send a signal to the subprocess. - - .. seealso:: :meth:`subprocess.Popen.send_signal` - - :param signal: the signal number (e.g. :data:`signal.SIGHUP`) - """ - - @property - @abstractmethod - def pid(self) -> int: - """The process ID of the process.""" - - @property - @abstractmethod - def returncode(self) -> int | None: - """ - The return code of the process. If the process has not yet terminated, this will - be ``None``. - """ - - @property - @abstractmethod - def stdin(self) -> ByteSendStream | None: - """The stream for the standard input of the process.""" - - @property - @abstractmethod - def stdout(self) -> ByteReceiveStream | None: - """The stream for the standard output of the process.""" - - @property - @abstractmethod - def stderr(self) -> ByteReceiveStream | None: - """The stream for the standard error output of the process.""" diff --git a/venv/lib/python3.11/site-packages/anyio/abc/_tasks.py b/venv/lib/python3.11/site-packages/anyio/abc/_tasks.py deleted file mode 100644 index f6e5c40..0000000 --- a/venv/lib/python3.11/site-packages/anyio/abc/_tasks.py +++ /dev/null @@ -1,101 +0,0 @@ -from __future__ import annotations - -import sys -from abc import ABCMeta, abstractmethod -from collections.abc import Awaitable, Callable -from types import TracebackType -from typing import TYPE_CHECKING, Any, Protocol, TypeVar, overload - -if sys.version_info >= (3, 11): - from typing import TypeVarTuple, Unpack -else: - from typing_extensions import TypeVarTuple, Unpack - -if TYPE_CHECKING: - from .._core._tasks import CancelScope - -T_Retval = TypeVar("T_Retval") -T_contra = TypeVar("T_contra", contravariant=True) -PosArgsT = TypeVarTuple("PosArgsT") - - -class TaskStatus(Protocol[T_contra]): - @overload - def started(self: TaskStatus[None]) -> None: ... - - @overload - def started(self, value: T_contra) -> None: ... - - def started(self, value: T_contra | None = None) -> None: - """ - Signal that the task has started. - - :param value: object passed back to the starter of the task - """ - - -class TaskGroup(metaclass=ABCMeta): - """ - Groups several asynchronous tasks together. - - :ivar cancel_scope: the cancel scope inherited by all child tasks - :vartype cancel_scope: CancelScope - - .. note:: On asyncio, support for eager task factories is considered to be - **experimental**. In particular, they don't follow the usual semantics of new - tasks being scheduled on the next iteration of the event loop, and may thus - cause unexpected behavior in code that wasn't written with such semantics in - mind. - """ - - cancel_scope: CancelScope - - @abstractmethod - def start_soon( - self, - func: Callable[[Unpack[PosArgsT]], Awaitable[Any]], - *args: Unpack[PosArgsT], - name: object = None, - ) -> None: - """ - Start a new task in this task group. - - :param func: a coroutine function - :param args: positional arguments to call the function with - :param name: name of the task, for the purposes of introspection and debugging - - .. versionadded:: 3.0 - """ - - @abstractmethod - async def start( - self, - func: Callable[..., Awaitable[Any]], - *args: object, - name: object = None, - ) -> Any: - """ - Start a new task and wait until it signals for readiness. - - :param func: a coroutine function - :param args: positional arguments to call the function with - :param name: name of the task, for the purposes of introspection and debugging - :return: the value passed to ``task_status.started()`` - :raises RuntimeError: if the task finishes without calling - ``task_status.started()`` - - .. versionadded:: 3.0 - """ - - @abstractmethod - async def __aenter__(self) -> TaskGroup: - """Enter the task group context and allow starting new tasks.""" - - @abstractmethod - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> bool | None: - """Exit the task group context waiting for all tasks to finish.""" diff --git a/venv/lib/python3.11/site-packages/anyio/abc/_testing.py b/venv/lib/python3.11/site-packages/anyio/abc/_testing.py deleted file mode 100644 index 7c50ed7..0000000 --- a/venv/lib/python3.11/site-packages/anyio/abc/_testing.py +++ /dev/null @@ -1,65 +0,0 @@ -from __future__ import annotations - -import types -from abc import ABCMeta, abstractmethod -from collections.abc import AsyncGenerator, Callable, Coroutine, Iterable -from typing import Any, TypeVar - -_T = TypeVar("_T") - - -class TestRunner(metaclass=ABCMeta): - """ - Encapsulates a running event loop. Every call made through this object will use the - same event loop. - """ - - def __enter__(self) -> TestRunner: - return self - - @abstractmethod - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: types.TracebackType | None, - ) -> bool | None: ... - - @abstractmethod - def run_asyncgen_fixture( - self, - fixture_func: Callable[..., AsyncGenerator[_T, Any]], - kwargs: dict[str, Any], - ) -> Iterable[_T]: - """ - Run an async generator fixture. - - :param fixture_func: the fixture function - :param kwargs: keyword arguments to call the fixture function with - :return: an iterator yielding the value yielded from the async generator - """ - - @abstractmethod - def run_fixture( - self, - fixture_func: Callable[..., Coroutine[Any, Any, _T]], - kwargs: dict[str, Any], - ) -> _T: - """ - Run an async fixture. - - :param fixture_func: the fixture function - :param kwargs: keyword arguments to call the fixture function with - :return: the return value of the fixture function - """ - - @abstractmethod - def run_test( - self, test_func: Callable[..., Coroutine[Any, Any, Any]], kwargs: dict[str, Any] - ) -> None: - """ - Run an async test function. - - :param test_func: the test function - :param kwargs: keyword arguments to call the test function with - """ diff --git a/venv/lib/python3.11/site-packages/anyio/from_thread.py b/venv/lib/python3.11/site-packages/anyio/from_thread.py deleted file mode 100644 index 6179097..0000000 --- a/venv/lib/python3.11/site-packages/anyio/from_thread.py +++ /dev/null @@ -1,527 +0,0 @@ -from __future__ import annotations - -import sys -from collections.abc import Awaitable, Callable, Generator -from concurrent.futures import Future -from contextlib import ( - AbstractAsyncContextManager, - AbstractContextManager, - contextmanager, -) -from dataclasses import dataclass, field -from inspect import isawaitable -from threading import Lock, Thread, get_ident -from types import TracebackType -from typing import ( - Any, - Generic, - TypeVar, - cast, - overload, -) - -from ._core import _eventloop -from ._core._eventloop import get_async_backend, get_cancelled_exc_class, threadlocals -from ._core._synchronization import Event -from ._core._tasks import CancelScope, create_task_group -from .abc import AsyncBackend -from .abc._tasks import TaskStatus - -if sys.version_info >= (3, 11): - from typing import TypeVarTuple, Unpack -else: - from typing_extensions import TypeVarTuple, Unpack - -T_Retval = TypeVar("T_Retval") -T_co = TypeVar("T_co", covariant=True) -PosArgsT = TypeVarTuple("PosArgsT") - - -def run( - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], *args: Unpack[PosArgsT] -) -> T_Retval: - """ - Call a coroutine function from a worker thread. - - :param func: a coroutine function - :param args: positional arguments for the callable - :return: the return value of the coroutine function - - """ - try: - async_backend = threadlocals.current_async_backend - token = threadlocals.current_token - except AttributeError: - raise RuntimeError( - "This function can only be run from an AnyIO worker thread" - ) from None - - return async_backend.run_async_from_thread(func, args, token=token) - - -def run_sync( - func: Callable[[Unpack[PosArgsT]], T_Retval], *args: Unpack[PosArgsT] -) -> T_Retval: - """ - Call a function in the event loop thread from a worker thread. - - :param func: a callable - :param args: positional arguments for the callable - :return: the return value of the callable - - """ - try: - async_backend = threadlocals.current_async_backend - token = threadlocals.current_token - except AttributeError: - raise RuntimeError( - "This function can only be run from an AnyIO worker thread" - ) from None - - return async_backend.run_sync_from_thread(func, args, token=token) - - -class _BlockingAsyncContextManager(Generic[T_co], AbstractContextManager): - _enter_future: Future[T_co] - _exit_future: Future[bool | None] - _exit_event: Event - _exit_exc_info: tuple[ - type[BaseException] | None, BaseException | None, TracebackType | None - ] = (None, None, None) - - def __init__( - self, async_cm: AbstractAsyncContextManager[T_co], portal: BlockingPortal - ): - self._async_cm = async_cm - self._portal = portal - - async def run_async_cm(self) -> bool | None: - try: - self._exit_event = Event() - value = await self._async_cm.__aenter__() - except BaseException as exc: - self._enter_future.set_exception(exc) - raise - else: - self._enter_future.set_result(value) - - try: - # Wait for the sync context manager to exit. - # This next statement can raise `get_cancelled_exc_class()` if - # something went wrong in a task group in this async context - # manager. - await self._exit_event.wait() - finally: - # In case of cancellation, it could be that we end up here before - # `_BlockingAsyncContextManager.__exit__` is called, and an - # `_exit_exc_info` has been set. - result = await self._async_cm.__aexit__(*self._exit_exc_info) - return result - - def __enter__(self) -> T_co: - self._enter_future = Future() - self._exit_future = self._portal.start_task_soon(self.run_async_cm) - return self._enter_future.result() - - def __exit__( - self, - __exc_type: type[BaseException] | None, - __exc_value: BaseException | None, - __traceback: TracebackType | None, - ) -> bool | None: - self._exit_exc_info = __exc_type, __exc_value, __traceback - self._portal.call(self._exit_event.set) - return self._exit_future.result() - - -class _BlockingPortalTaskStatus(TaskStatus): - def __init__(self, future: Future): - self._future = future - - def started(self, value: object = None) -> None: - self._future.set_result(value) - - -class BlockingPortal: - """An object that lets external threads run code in an asynchronous event loop.""" - - def __new__(cls) -> BlockingPortal: - return get_async_backend().create_blocking_portal() - - def __init__(self) -> None: - self._event_loop_thread_id: int | None = get_ident() - self._stop_event = Event() - self._task_group = create_task_group() - self._cancelled_exc_class = get_cancelled_exc_class() - - async def __aenter__(self) -> BlockingPortal: - await self._task_group.__aenter__() - return self - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> bool | None: - await self.stop() - return await self._task_group.__aexit__(exc_type, exc_val, exc_tb) - - def _check_running(self) -> None: - if self._event_loop_thread_id is None: - raise RuntimeError("This portal is not running") - if self._event_loop_thread_id == get_ident(): - raise RuntimeError( - "This method cannot be called from the event loop thread" - ) - - async def sleep_until_stopped(self) -> None: - """Sleep until :meth:`stop` is called.""" - await self._stop_event.wait() - - async def stop(self, cancel_remaining: bool = False) -> None: - """ - Signal the portal to shut down. - - This marks the portal as no longer accepting new calls and exits from - :meth:`sleep_until_stopped`. - - :param cancel_remaining: ``True`` to cancel all the remaining tasks, ``False`` - to let them finish before returning - - """ - self._event_loop_thread_id = None - self._stop_event.set() - if cancel_remaining: - self._task_group.cancel_scope.cancel() - - async def _call_func( - self, - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval] | T_Retval], - args: tuple[Unpack[PosArgsT]], - kwargs: dict[str, Any], - future: Future[T_Retval], - ) -> None: - def callback(f: Future[T_Retval]) -> None: - if f.cancelled() and self._event_loop_thread_id not in ( - None, - get_ident(), - ): - self.call(scope.cancel) - - try: - retval_or_awaitable = func(*args, **kwargs) - if isawaitable(retval_or_awaitable): - with CancelScope() as scope: - if future.cancelled(): - scope.cancel() - else: - future.add_done_callback(callback) - - retval = await retval_or_awaitable - else: - retval = retval_or_awaitable - except self._cancelled_exc_class: - future.cancel() - future.set_running_or_notify_cancel() - except BaseException as exc: - if not future.cancelled(): - future.set_exception(exc) - - # Let base exceptions fall through - if not isinstance(exc, Exception): - raise - else: - if not future.cancelled(): - future.set_result(retval) - finally: - scope = None # type: ignore[assignment] - - def _spawn_task_from_thread( - self, - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval] | T_Retval], - args: tuple[Unpack[PosArgsT]], - kwargs: dict[str, Any], - name: object, - future: Future[T_Retval], - ) -> None: - """ - Spawn a new task using the given callable. - - Implementers must ensure that the future is resolved when the task finishes. - - :param func: a callable - :param args: positional arguments to be passed to the callable - :param kwargs: keyword arguments to be passed to the callable - :param name: name of the task (will be coerced to a string if not ``None``) - :param future: a future that will resolve to the return value of the callable, - or the exception raised during its execution - - """ - raise NotImplementedError - - @overload - def call( - self, - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], - *args: Unpack[PosArgsT], - ) -> T_Retval: ... - - @overload - def call( - self, func: Callable[[Unpack[PosArgsT]], T_Retval], *args: Unpack[PosArgsT] - ) -> T_Retval: ... - - def call( - self, - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval] | T_Retval], - *args: Unpack[PosArgsT], - ) -> T_Retval: - """ - Call the given function in the event loop thread. - - If the callable returns a coroutine object, it is awaited on. - - :param func: any callable - :raises RuntimeError: if the portal is not running or if this method is called - from within the event loop thread - - """ - return cast(T_Retval, self.start_task_soon(func, *args).result()) - - @overload - def start_task_soon( - self, - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], - *args: Unpack[PosArgsT], - name: object = None, - ) -> Future[T_Retval]: ... - - @overload - def start_task_soon( - self, - func: Callable[[Unpack[PosArgsT]], T_Retval], - *args: Unpack[PosArgsT], - name: object = None, - ) -> Future[T_Retval]: ... - - def start_task_soon( - self, - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval] | T_Retval], - *args: Unpack[PosArgsT], - name: object = None, - ) -> Future[T_Retval]: - """ - Start a task in the portal's task group. - - The task will be run inside a cancel scope which can be cancelled by cancelling - the returned future. - - :param func: the target function - :param args: positional arguments passed to ``func`` - :param name: name of the task (will be coerced to a string if not ``None``) - :return: a future that resolves with the return value of the callable if the - task completes successfully, or with the exception raised in the task - :raises RuntimeError: if the portal is not running or if this method is called - from within the event loop thread - :rtype: concurrent.futures.Future[T_Retval] - - .. versionadded:: 3.0 - - """ - self._check_running() - f: Future[T_Retval] = Future() - self._spawn_task_from_thread(func, args, {}, name, f) - return f - - def start_task( - self, - func: Callable[..., Awaitable[T_Retval]], - *args: object, - name: object = None, - ) -> tuple[Future[T_Retval], Any]: - """ - Start a task in the portal's task group and wait until it signals for readiness. - - This method works the same way as :meth:`.abc.TaskGroup.start`. - - :param func: the target function - :param args: positional arguments passed to ``func`` - :param name: name of the task (will be coerced to a string if not ``None``) - :return: a tuple of (future, task_status_value) where the ``task_status_value`` - is the value passed to ``task_status.started()`` from within the target - function - :rtype: tuple[concurrent.futures.Future[T_Retval], Any] - - .. versionadded:: 3.0 - - """ - - def task_done(future: Future[T_Retval]) -> None: - if not task_status_future.done(): - if future.cancelled(): - task_status_future.cancel() - elif future.exception(): - task_status_future.set_exception(future.exception()) - else: - exc = RuntimeError( - "Task exited without calling task_status.started()" - ) - task_status_future.set_exception(exc) - - self._check_running() - task_status_future: Future = Future() - task_status = _BlockingPortalTaskStatus(task_status_future) - f: Future = Future() - f.add_done_callback(task_done) - self._spawn_task_from_thread(func, args, {"task_status": task_status}, name, f) - return f, task_status_future.result() - - def wrap_async_context_manager( - self, cm: AbstractAsyncContextManager[T_co] - ) -> AbstractContextManager[T_co]: - """ - Wrap an async context manager as a synchronous context manager via this portal. - - Spawns a task that will call both ``__aenter__()`` and ``__aexit__()``, stopping - in the middle until the synchronous context manager exits. - - :param cm: an asynchronous context manager - :return: a synchronous context manager - - .. versionadded:: 2.1 - - """ - return _BlockingAsyncContextManager(cm, self) - - -@dataclass -class BlockingPortalProvider: - """ - A manager for a blocking portal. Used as a context manager. The first thread to - enter this context manager causes a blocking portal to be started with the specific - parameters, and the last thread to exit causes the portal to be shut down. Thus, - there will be exactly one blocking portal running in this context as long as at - least one thread has entered this context manager. - - The parameters are the same as for :func:`~anyio.run`. - - :param backend: name of the backend - :param backend_options: backend options - - .. versionadded:: 4.4 - """ - - backend: str = "asyncio" - backend_options: dict[str, Any] | None = None - _lock: Lock = field(init=False, default_factory=Lock) - _leases: int = field(init=False, default=0) - _portal: BlockingPortal = field(init=False) - _portal_cm: AbstractContextManager[BlockingPortal] | None = field( - init=False, default=None - ) - - def __enter__(self) -> BlockingPortal: - with self._lock: - if self._portal_cm is None: - self._portal_cm = start_blocking_portal( - self.backend, self.backend_options - ) - self._portal = self._portal_cm.__enter__() - - self._leases += 1 - return self._portal - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - portal_cm: AbstractContextManager[BlockingPortal] | None = None - with self._lock: - assert self._portal_cm - assert self._leases > 0 - self._leases -= 1 - if not self._leases: - portal_cm = self._portal_cm - self._portal_cm = None - del self._portal - - if portal_cm: - portal_cm.__exit__(None, None, None) - - -@contextmanager -def start_blocking_portal( - backend: str = "asyncio", backend_options: dict[str, Any] | None = None -) -> Generator[BlockingPortal, Any, None]: - """ - Start a new event loop in a new thread and run a blocking portal in its main task. - - The parameters are the same as for :func:`~anyio.run`. - - :param backend: name of the backend - :param backend_options: backend options - :return: a context manager that yields a blocking portal - - .. versionchanged:: 3.0 - Usage as a context manager is now required. - - """ - - async def run_portal() -> None: - async with BlockingPortal() as portal_: - future.set_result(portal_) - await portal_.sleep_until_stopped() - - def run_blocking_portal() -> None: - if future.set_running_or_notify_cancel(): - try: - _eventloop.run( - run_portal, backend=backend, backend_options=backend_options - ) - except BaseException as exc: - if not future.done(): - future.set_exception(exc) - - future: Future[BlockingPortal] = Future() - thread = Thread(target=run_blocking_portal, daemon=True) - thread.start() - try: - cancel_remaining_tasks = False - portal = future.result() - try: - yield portal - except BaseException: - cancel_remaining_tasks = True - raise - finally: - try: - portal.call(portal.stop, cancel_remaining_tasks) - except RuntimeError: - pass - finally: - thread.join() - - -def check_cancelled() -> None: - """ - Check if the cancel scope of the host task's running the current worker thread has - been cancelled. - - If the host task's current cancel scope has indeed been cancelled, the - backend-specific cancellation exception will be raised. - - :raises RuntimeError: if the current thread was not spawned by - :func:`.to_thread.run_sync` - - """ - try: - async_backend: AsyncBackend = threadlocals.current_async_backend - except AttributeError: - raise RuntimeError( - "This function can only be run from an AnyIO worker thread" - ) from None - - async_backend.check_cancelled() diff --git a/venv/lib/python3.11/site-packages/anyio/lowlevel.py b/venv/lib/python3.11/site-packages/anyio/lowlevel.py deleted file mode 100644 index 14c7668..0000000 --- a/venv/lib/python3.11/site-packages/anyio/lowlevel.py +++ /dev/null @@ -1,161 +0,0 @@ -from __future__ import annotations - -import enum -from dataclasses import dataclass -from typing import Any, Generic, Literal, TypeVar, overload -from weakref import WeakKeyDictionary - -from ._core._eventloop import get_async_backend - -T = TypeVar("T") -D = TypeVar("D") - - -async def checkpoint() -> None: - """ - Check for cancellation and allow the scheduler to switch to another task. - - Equivalent to (but more efficient than):: - - await checkpoint_if_cancelled() - await cancel_shielded_checkpoint() - - - .. versionadded:: 3.0 - - """ - await get_async_backend().checkpoint() - - -async def checkpoint_if_cancelled() -> None: - """ - Enter a checkpoint if the enclosing cancel scope has been cancelled. - - This does not allow the scheduler to switch to a different task. - - .. versionadded:: 3.0 - - """ - await get_async_backend().checkpoint_if_cancelled() - - -async def cancel_shielded_checkpoint() -> None: - """ - Allow the scheduler to switch to another task but without checking for cancellation. - - Equivalent to (but potentially more efficient than):: - - with CancelScope(shield=True): - await checkpoint() - - - .. versionadded:: 3.0 - - """ - await get_async_backend().cancel_shielded_checkpoint() - - -def current_token() -> object: - """ - Return a backend specific token object that can be used to get back to the event - loop. - - """ - return get_async_backend().current_token() - - -_run_vars: WeakKeyDictionary[Any, dict[str, Any]] = WeakKeyDictionary() -_token_wrappers: dict[Any, _TokenWrapper] = {} - - -@dataclass(frozen=True) -class _TokenWrapper: - __slots__ = "_token", "__weakref__" - _token: object - - -class _NoValueSet(enum.Enum): - NO_VALUE_SET = enum.auto() - - -class RunvarToken(Generic[T]): - __slots__ = "_var", "_value", "_redeemed" - - def __init__(self, var: RunVar[T], value: T | Literal[_NoValueSet.NO_VALUE_SET]): - self._var = var - self._value: T | Literal[_NoValueSet.NO_VALUE_SET] = value - self._redeemed = False - - -class RunVar(Generic[T]): - """ - Like a :class:`~contextvars.ContextVar`, except scoped to the running event loop. - """ - - __slots__ = "_name", "_default" - - NO_VALUE_SET: Literal[_NoValueSet.NO_VALUE_SET] = _NoValueSet.NO_VALUE_SET - - _token_wrappers: set[_TokenWrapper] = set() - - def __init__( - self, name: str, default: T | Literal[_NoValueSet.NO_VALUE_SET] = NO_VALUE_SET - ): - self._name = name - self._default = default - - @property - def _current_vars(self) -> dict[str, T]: - token = current_token() - try: - return _run_vars[token] - except KeyError: - run_vars = _run_vars[token] = {} - return run_vars - - @overload - def get(self, default: D) -> T | D: ... - - @overload - def get(self) -> T: ... - - def get( - self, default: D | Literal[_NoValueSet.NO_VALUE_SET] = NO_VALUE_SET - ) -> T | D: - try: - return self._current_vars[self._name] - except KeyError: - if default is not RunVar.NO_VALUE_SET: - return default - elif self._default is not RunVar.NO_VALUE_SET: - return self._default - - raise LookupError( - f'Run variable "{self._name}" has no value and no default set' - ) - - def set(self, value: T) -> RunvarToken[T]: - current_vars = self._current_vars - token = RunvarToken(self, current_vars.get(self._name, RunVar.NO_VALUE_SET)) - current_vars[self._name] = value - return token - - def reset(self, token: RunvarToken[T]) -> None: - if token._var is not self: - raise ValueError("This token does not belong to this RunVar") - - if token._redeemed: - raise ValueError("This token has already been used") - - if token._value is _NoValueSet.NO_VALUE_SET: - try: - del self._current_vars[self._name] - except KeyError: - pass - else: - self._current_vars[self._name] = token._value - - token._redeemed = True - - def __repr__(self) -> str: - return f"" diff --git a/venv/lib/python3.11/site-packages/anyio/py.typed b/venv/lib/python3.11/site-packages/anyio/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/anyio/pytest_plugin.py b/venv/lib/python3.11/site-packages/anyio/pytest_plugin.py deleted file mode 100644 index 21e4ab2..0000000 --- a/venv/lib/python3.11/site-packages/anyio/pytest_plugin.py +++ /dev/null @@ -1,272 +0,0 @@ -from __future__ import annotations - -import socket -import sys -from collections.abc import Callable, Generator, Iterator -from contextlib import ExitStack, contextmanager -from inspect import isasyncgenfunction, iscoroutinefunction, ismethod -from typing import Any, cast - -import pytest -import sniffio -from _pytest.fixtures import SubRequest -from _pytest.outcomes import Exit - -from ._core._eventloop import get_all_backends, get_async_backend -from ._core._exceptions import iterate_exceptions -from .abc import TestRunner - -if sys.version_info < (3, 11): - from exceptiongroup import ExceptionGroup - -_current_runner: TestRunner | None = None -_runner_stack: ExitStack | None = None -_runner_leases = 0 - - -def extract_backend_and_options(backend: object) -> tuple[str, dict[str, Any]]: - if isinstance(backend, str): - return backend, {} - elif isinstance(backend, tuple) and len(backend) == 2: - if isinstance(backend[0], str) and isinstance(backend[1], dict): - return cast(tuple[str, dict[str, Any]], backend) - - raise TypeError("anyio_backend must be either a string or tuple of (string, dict)") - - -@contextmanager -def get_runner( - backend_name: str, backend_options: dict[str, Any] -) -> Iterator[TestRunner]: - global _current_runner, _runner_leases, _runner_stack - if _current_runner is None: - asynclib = get_async_backend(backend_name) - _runner_stack = ExitStack() - if sniffio.current_async_library_cvar.get(None) is None: - # Since we're in control of the event loop, we can cache the name of the - # async library - token = sniffio.current_async_library_cvar.set(backend_name) - _runner_stack.callback(sniffio.current_async_library_cvar.reset, token) - - backend_options = backend_options or {} - _current_runner = _runner_stack.enter_context( - asynclib.create_test_runner(backend_options) - ) - - _runner_leases += 1 - try: - yield _current_runner - finally: - _runner_leases -= 1 - if not _runner_leases: - assert _runner_stack is not None - _runner_stack.close() - _runner_stack = _current_runner = None - - -def pytest_configure(config: Any) -> None: - config.addinivalue_line( - "markers", - "anyio: mark the (coroutine function) test to be run asynchronously via anyio.", - ) - - -@pytest.hookimpl(hookwrapper=True) -def pytest_fixture_setup(fixturedef: Any, request: Any) -> Generator[Any]: - def wrapper( - *args: Any, anyio_backend: Any, request: SubRequest, **kwargs: Any - ) -> Any: - # Rebind any fixture methods to the request instance - if ( - request.instance - and ismethod(func) - and type(func.__self__) is type(request.instance) - ): - local_func = func.__func__.__get__(request.instance) - else: - local_func = func - - backend_name, backend_options = extract_backend_and_options(anyio_backend) - if has_backend_arg: - kwargs["anyio_backend"] = anyio_backend - - if has_request_arg: - kwargs["request"] = request - - with get_runner(backend_name, backend_options) as runner: - if isasyncgenfunction(local_func): - yield from runner.run_asyncgen_fixture(local_func, kwargs) - else: - yield runner.run_fixture(local_func, kwargs) - - # Only apply this to coroutine functions and async generator functions in requests - # that involve the anyio_backend fixture - func = fixturedef.func - if isasyncgenfunction(func) or iscoroutinefunction(func): - if "anyio_backend" in request.fixturenames: - fixturedef.func = wrapper - original_argname = fixturedef.argnames - - if not (has_backend_arg := "anyio_backend" in fixturedef.argnames): - fixturedef.argnames += ("anyio_backend",) - - if not (has_request_arg := "request" in fixturedef.argnames): - fixturedef.argnames += ("request",) - - try: - return (yield) - finally: - fixturedef.func = func - fixturedef.argnames = original_argname - - return (yield) - - -@pytest.hookimpl(tryfirst=True) -def pytest_pycollect_makeitem(collector: Any, name: Any, obj: Any) -> None: - if collector.istestfunction(obj, name): - inner_func = obj.hypothesis.inner_test if hasattr(obj, "hypothesis") else obj - if iscoroutinefunction(inner_func): - marker = collector.get_closest_marker("anyio") - own_markers = getattr(obj, "pytestmark", ()) - if marker or any(marker.name == "anyio" for marker in own_markers): - pytest.mark.usefixtures("anyio_backend")(obj) - - -@pytest.hookimpl(tryfirst=True) -def pytest_pyfunc_call(pyfuncitem: Any) -> bool | None: - def run_with_hypothesis(**kwargs: Any) -> None: - with get_runner(backend_name, backend_options) as runner: - runner.run_test(original_func, kwargs) - - backend = pyfuncitem.funcargs.get("anyio_backend") - if backend: - backend_name, backend_options = extract_backend_and_options(backend) - - if hasattr(pyfuncitem.obj, "hypothesis"): - # Wrap the inner test function unless it's already wrapped - original_func = pyfuncitem.obj.hypothesis.inner_test - if original_func.__qualname__ != run_with_hypothesis.__qualname__: - if iscoroutinefunction(original_func): - pyfuncitem.obj.hypothesis.inner_test = run_with_hypothesis - - return None - - if iscoroutinefunction(pyfuncitem.obj): - funcargs = pyfuncitem.funcargs - testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} - with get_runner(backend_name, backend_options) as runner: - try: - runner.run_test(pyfuncitem.obj, testargs) - except ExceptionGroup as excgrp: - for exc in iterate_exceptions(excgrp): - if isinstance(exc, (Exit, KeyboardInterrupt, SystemExit)): - raise exc from excgrp - - raise - - return True - - return None - - -@pytest.fixture(scope="module", params=get_all_backends()) -def anyio_backend(request: Any) -> Any: - return request.param - - -@pytest.fixture -def anyio_backend_name(anyio_backend: Any) -> str: - if isinstance(anyio_backend, str): - return anyio_backend - else: - return anyio_backend[0] - - -@pytest.fixture -def anyio_backend_options(anyio_backend: Any) -> dict[str, Any]: - if isinstance(anyio_backend, str): - return {} - else: - return anyio_backend[1] - - -class FreePortFactory: - """ - Manages port generation based on specified socket kind, ensuring no duplicate - ports are generated. - - This class provides functionality for generating available free ports on the - system. It is initialized with a specific socket kind and can generate ports - for given address families while avoiding reuse of previously generated ports. - - Users should not instantiate this class directly, but use the - ``free_tcp_port_factory`` and ``free_udp_port_factory`` fixtures instead. For simple - uses cases, ``free_tcp_port`` and ``free_udp_port`` can be used instead. - """ - - def __init__(self, kind: socket.SocketKind) -> None: - self._kind = kind - self._generated = set[int]() - - @property - def kind(self) -> socket.SocketKind: - """ - The type of socket connection (e.g., :data:`~socket.SOCK_STREAM` or - :data:`~socket.SOCK_DGRAM`) used to bind for checking port availability - - """ - return self._kind - - def __call__(self, family: socket.AddressFamily | None = None) -> int: - """ - Return an unbound port for the given address family. - - :param family: if omitted, both IPv4 and IPv6 addresses will be tried - :return: a port number - - """ - if family is not None: - families = [family] - else: - families = [socket.AF_INET] - if socket.has_ipv6: - families.append(socket.AF_INET6) - - while True: - port = 0 - with ExitStack() as stack: - for family in families: - sock = stack.enter_context(socket.socket(family, self._kind)) - addr = "::1" if family == socket.AF_INET6 else "127.0.0.1" - try: - sock.bind((addr, port)) - except OSError: - break - - if not port: - port = sock.getsockname()[1] - else: - if port not in self._generated: - self._generated.add(port) - return port - - -@pytest.fixture(scope="session") -def free_tcp_port_factory() -> FreePortFactory: - return FreePortFactory(socket.SOCK_STREAM) - - -@pytest.fixture(scope="session") -def free_udp_port_factory() -> FreePortFactory: - return FreePortFactory(socket.SOCK_DGRAM) - - -@pytest.fixture -def free_tcp_port(free_tcp_port_factory: Callable[[], int]) -> int: - return free_tcp_port_factory() - - -@pytest.fixture -def free_udp_port(free_udp_port_factory: Callable[[], int]) -> int: - return free_udp_port_factory() diff --git a/venv/lib/python3.11/site-packages/anyio/streams/__init__.py b/venv/lib/python3.11/site-packages/anyio/streams/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index e29797f191e7e1d632d600edd9cd646708970cf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 185 zcmZ3^%ge<81eOn9r-SInAOZ#$p^VRLK*n^26oz01O-8?!3`I;p{%4TnFCYD~#3KFj z@^byOoXmo}(p>$r)VwnNoXjNsg36MN{5)elLqq-I%#u{yg2d$P#Prl+{lvV=%zXXg zlA_ea++zLs_{_Y_lK6PNg34bUHo5sJr8%i~MXW%>LDm=Z1BnmJjEsyQ7+^#ZGf)fw D3ga%{ diff --git a/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/buffered.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/buffered.cpython-311.pyc deleted file mode 100644 index 3bb263f58768a4935f4b8eec6ead48599e23142f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6485 zcmbtYTW=f36`tiTDN^E17A=XgE-T8CMa7b0Nxms|+}NR$w2q6$j@vLvnH6_wZ@eUx z*`;K$l3^rHp$2|X3IkRF7vMwdDu@f@p$~p+oj#-^vo=| zA}J{j(9vo**E2Kc@|`pD2cNGQK|1-je_p-YiqPLlrJ7t;fqC)(3iptRL`FerCeARV z>`)wOHqNHGI7jQO;!L~Zu5?qpiPkyAo%X~%P!;+9T z{jX$_+4QU;Y0_(wAi^>sAbECyRFjfCCsoF^?r1s>%R8j^lJ=RPz*!aM$s;J-LlTNJ zB8od+2U)~f(IIgndkT7hcTSO$To0WOVDF!j{nHe05?wH+X?u*wJ#;sWaf==p(@e&Q z2Snd(F7A<<#cnZhn`_{43$*u$tvlMiVz1aI?!WDf`$S&s01AGwUkt-tjRE0&hXkbiBDy5n$M;PEm*O##F#bF z54gPd}oScz0GayPSA*X1Gl#tZ2c)|1#3IfK$g4vX?b{2Ku5Fyf38EbMg z*{lNHNvcz(3rkuKXH4#5HX|i%b%!ZLcpo6dJh=jeA0Y@CJd0+boVo^GM7KpPyz2u$kkNqQOpYX+H~v~VLq*=w?LMoZeN z3X`1h{{a!&pWrMzjR7}lHKX4LMSs_><6*4{W>->ekBAnT4;|rZ7pfQel4IxC(`eCg z327dC3NcBtH<~nWwS-VTwqm|^T%l$^+cOrK`t@s#_fp+DyU*X-^p_kO`1ER8bkwi2 z$Xuu11s|?GZ=vRl)tLxRzX*P3Z=NwQqLHhxciHPREgfvOjl##r_GSf1=nqvHVIY(7F1;M>m&m0tnsjE?h0l6|NfLu@zS- z)Oq(pp`$QV=+HyaO+bh%A1~cq(t`)foXa=1+19fv8ofupn0&F=7BkvnWyH4rfGI_W zjL6ZA$m#XS=|^%g^0E!C!~qc2nq)0(R_Ov% zE^_tov*cWKip+HiYxqPh1pq{6tuI}2HTHhjp7OBfhYkSDnrLFtRSyUdtJn|%AXBsZ z`f-bn%Kid%u}wpy@IFI1U<35-Q2HG}*p%4~2;Fr+=%zsEzUkfuLXB8pC4JBHu*4OK z9O043G{}Riw|&r#BiU}qCP)NHPGJdiUe>NzF9>1SWT)y}vG16$uw)Zi)l$;T*t7HrGSw4uww%hK< zWPz;ZgFKcGI!XFzWbC&$olxbxWV*7clqzYa6R1iz;FXKMS8?Rs3m=DBDv9>V_Gz+i ztG=p#qB@;F^mOk;2VNrNNCaZ}rmwqESI_Djzv;c-yX-Hu?pt=19U;%q7I8oup~3ag zU_t(@y%;)Sgib(I9SE&5ALW_0TEeyl-We^cy|TZuFd3?>SNInKpW+^^V4Ggnn0o zWzOO3E~EO)ja>e+!{Hnt9ai=g3vIW5X0=-VjB^S?no4H(lLl9tv!{%9$wtD?LuFK- z9Xse8Dx*Czi$8=b7o%-NJgFSKB!YM_3vFf~nN<`iNguw)gqb8JHy})Wx7lL9cf-35 ziG--2OqaGm9>lSmj6v2Voq~@Y@tQ0lL@qK`JWS>CLsE^9tRJ#(-KQ)yc^>}+ssz~7 ze?bPZ9K)1QM6dt0(5SxKS3<-3ZeIzt>-FCjdQE@YS3)QC-988`9WA%Q%aYE7icH90 eLS?wQGQjiQbDcl(747;r%|Wn^{ku-0{P-UTfGTJJ diff --git a/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/file.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/file.cpython-311.pyc deleted file mode 100644 index c1258c7f92c25fd90b1ff5ab0e650b3528135fde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8126 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 diff --git a/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/stapled.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/stapled.cpython-311.pyc deleted file mode 100644 index b4028f0895f6bd23c7869a79590b6c601b4d0e34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8252 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 Qjuc-Zs7=t-hw18n0rsALvH$=8 diff --git a/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/text.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/text.cpython-311.pyc deleted file mode 100644 index 1dda2804884c598e2f09f60c4b609cd079e005e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9007 zcmeHNO>7&-72aJg$rUB8ek{t8Y*`!2jzw7_LrYF#IdyA0cAPeG+S)M;8ZNcst}G_} zQD&ERr7DFA8>vtjMNkxQPK63Iu8jELV@|!dCsJ6z!~z9U6et?>LPPGwr@l9{OL9p` zR+8pWpsU%pv$HdA=DnGD@0&;cF&qwYaGm(uzi#|v56Ar-U)(FmGW_O6p5yLu8mIAD zF2^T%9`iz0NDA=uWqmm@Ddzl1KP?xtfm|>d%t=Wp*OqLfW&Ug^*Pd*Ld_W6kJ96P< zI439NTxYT~*Olzbbtk)XJ;@%P6F6Pcq=#+yp~uhQW|zRd!D*p8oYt;)>3as;V(z{V zYQfE}`|$Y8ec_V5JMiiNUSYj^*SsP-@REU7r{1$`UVWNyiHml9i6f2jcDtI-7fjX6 z6!ON!s9;NH)ofOs&FXgWZFONGlfM!5*}*sS8S{!t>^4m`)pS-h4BJ1K(X$$G@SV;t zekmZgfZYrEGmEDFV?C{BZt9mzqN_Q(+bO-I=QXD&>=v;ad)}FSPfwfPW?ihXp;d=d zLK~fjz6Je*bWP=uaVCS`ybCY)IGs!K8kZE_g{719X@V|lzSrQ3CMNxwAKn7=Etm|@ zHwoWB)j_T8VaU4#k`he5sCCf#eOlKYG1;c=)wp%5MsQwPr7E<71T2XEhP`OSNb6zzSO-~mz-B4yhpN3)<6vHGi9fndg-~n}X ze)s3MCVmgiunxkQPT4&QPZYQpt_+Lg+d;mFt$Yn zn(0a=?~H1C0V?Jclc;%Pp+L+ONCRtQ8hc?PPRy!?uDM;HwD6q{z-jBsIbH9yCOhh< zXz0pZfiT6P0$MaTs_AoTF>4x>Eh-+G&CC?dxrtY2W}=?X2q_R_TA5e#S{9iZ>3L9> zw*#G4Qfh1&JDjJqIWu!oF?1buQR{7n>0Zedv|?6=*-01a4B+mYNm1S^>TQAO^LpNZ z*;TR`!&C}$N@0O+(I}haSWHRnz-zkJZcFYA*#V{lJHRw_{sC`` z8L%Ns15S6XtIw8FY{e7X2d(V@TZXoH5!P_JW@TYGn1`F+{2^rSac0do_p=amF zUU;GH?6C7aMR%Mb!UtSx&o0Dosw95v)~)zlHnWf~=Hjq>Z{kG6+00DF5{bBxG4+WB zHT}MNLpS2EJ2Hhh=mYkG5jVktz%1I~RBEAMm?>0gDz!A+Vp(FI3Q-t=F$QFX`)mIJ ztAFaz)pGwStN+w$xYB?4lkobLQvX!Be+s^=ig&}S@V5!IxpYmN@Pb;ujat70nICXG zXugeG=H7!hcC9tmb_+SLF}w|)`)9r@+&$k%;)gu6uIYXa`L|pxvnVVJ1nx`R-BSLVlg(Vw0#=HIu2tW-0wBbW|y7@h>RvNX`DKZoH2d^WBE z`6v9Xa8*HU8?FoTOP|=PG@Jzs)`F8{6m`TR&dzOIUr0 z)i)}geN~PR4_Edc_*kyC0W)$0n0xe$8lie#f(+C1H_TSwER=6)Z z_gI~Wtj^;l={S|+;)4J)AVct-S`k8X2k>hjvDD2smLG%is0=nVl~;3mDrJXK zDduG$-;qjvP*k(dmtZOd-T;a_Q>g~&q{wv_>GZa7pgw1OXU?S+G z?I6=)6I^-|J}vEO(i*nC3?GblfH>a0r|;gxZzk5nHSG`YmwS#`J;xp;te)emLD%n( zZpfqSd&_ddk`pCq+eCHjapEWd)$RqzxZ3^tD6|pnFqcmqU5l5e;3m=}IYTyAQTEBY z?7KrY4DK+;g5KLB5M1c#5Df)Yu!_kt{NN^wwPn^XZ66CoB zo@hrrfn<>LkCwzEkjmnbRy@%&hUoWXe1KvpTK&JB=FVn1PYgiyLS0lj^F$fWWKHN)iwdHHi$@ynoJSL zJ{r&pY5N({(1s9aBs;VNS|2>a@Z1YeS?|<_wSg7{(xnXo0#WP`-7WO!s{R?aE%lD4 zmD!Azf#Vg1Gt{gLIChSBK~%{(kU_XeWB34KVh)C(d;!NW!~%8EAUR>DbBNxRI(k=b zWwKdiR#yPW-pptaZ<-^8oHAQ5=bfP#<4_0Q(1p95LPu^ainYUl5LURUW{WV8OkPPt z@CxHJD#UN{aK2BQ-oTd&ktnC#z@vJX4#@gC$S6(^y)=AP!+UX*xQ0}i(*BQ=zEV&u z4BK;ioP=(hK_q${f^(L$j+~e$HEM7u!)59gc}=b-+~o&$U>Nw#o75;YhPxWU13(E3 zZb8lZPZEt#$qYhs=h{U(1Tpk-gJMG6m`D9oFs1)VUC7J-5B77##O!!K1jx~z^D)-Qa1rRo!u&=U^GQzWaRCGG!rfEzmMsWOCBhOo*I ztuj!OFztXK&>ekq1mVU?1VU9o&&mmu1f6(en5n034`a@X_yyL(Ad>@|A_G<=`Z$u< zh$PC9Nh>m0>TF5UBy*Ao(>%Bny~k}_DBp+7Zslr@u(hH_hOY%Wy#)QXi>Yw{9!yQq zVP}JsxWeyXE%fgVai8JG@}Uj+(Awp)JZ8ybC28BV!|Z)q_|KN;#?%XQEuiWOh~dCr zwtU^1zeFKhA>jCiJYJS#mK-Zd+ol~v{0P|Yb|UXX-TKdu-f8q49&lN9rJ0BJleP~(Xx_a2woCg}I6Cl*~lk$uX$yW0_+0#&-tn?k3ivhAsJ}st?}2z*ECPOP;Ly;jPN~+Co&Mi{uq(Lhyi0-bPZ#-QBy! z-E_cco*Tk>6oKP{ehv)BLmfdf1Gmuyt7oO*uPSyT3`cU1^FtI5<8~Od8+vY7FB)5q zJUUm3PM4$8R&;vhosu}sQdyj?jEt@wU)M_`Q{|B|?Y1o(}F1qVg!$R)Mlpj$vcv89J9itfd@>s%3jKZO`9 zL4(Y~5}oNnHp?)t5mRT=M8r?%+3oh)PwEg`4q!1lYI1Lh+B0#Dkoq7U2Q&vAr? zX($H4a5Cvc(uIVg2#iuPhfJsLG`=1|fKG3T asg-=Z|C6-Ueeel>dWxjZ$y1q5;ePmR?nN^_%Q&lFf(sEQ%DxmiQ1&*_J3vvSd*YOQsZ&mdErM%~n@YYN;Qb zs-k3aC@*0v85(PBI2+Acnc2Y-$k?liX0pm=Hklv0fSsAiPJX4Es0|y1DBvO)AV&VQ zVjFOT1ju)8byq(~dcB#&Zt?2$t@}9l+}FA1oO?=tTwCkq@Erc@|9S17j&j_8qnG02 zG9&zF|BL6i4>*aF_ym{ar+J>@wuEik#(wS7cJ?bw3+&f1?ZB@+;Y_-wT}k(}o0S(5 zo}_o$%i@lNFIh8P!{W|FZPGvOPX?v~cy~$eL@-%5U6-t%u1_{hHzY&Tp=9H9Bg^w7 znv%`a&B>PO7WVE<>`Jyyw3Jn4k1I-A zF?{1G>Ei69rpVExQ3p(ERgTQ2kv}`1NGur5*JLdci>6|7A|Xo=`K?%lwPtvBN-IYiY5&ArL=lNxu#AH#ZbX| z3RBI0_9EL(GB?dj+_ddgY^!NICQqoEP={obos#_pAlN3?B?-uN?2zl0oXBy^C7_3e=BlWLG#yF+e`68|Yr&MuDiKf)Kw4#X@q6@MjPRg-)C9W-qikygQvLsq7K^=PPRW(Ii z5+~9r*{F>s=2DS4C9S1n>4f39iWQ<7t+DG^{&FI6HJ*~N)FWC#jm)Rw-

fYIa@eN)#nb#&>d3oHtjMKOC>B5&!vP)A%4`|S&Zr2*Nn%y8(#)$7XIPS8A$4@&^ zoIB1^Ea@MRmaI=+mCPfBLnH-bm7{uU9YL)X+md<7DpRNHES}Ri9OA;wAkhqA@tGcc zNZUz6ibRv+*YCuWmE$CJ0!;iq0yn7rKa6B`746bw8Z(%pS~$Ai``PnW^VwwTZ4(n` z9a9K<(MzH~$th&Tet`bA*x^dvVNO?DeDKIm`VuLxxql7>86E0UYw@POx%Zyg{6G%O z(%8PucjsVAedc4_R+dw-!)b5Z&izSkiNUisn{xM9Ub$9l@oRktK6d6kUb%bRa`)z| z+!|+<%B^gBckt{tOu6|-dF2R$^|!u5A3JltS8l#r?k59PZmF|QYWm7$*l%;BFC%;L`pro_yj1I*IT3FfJv6U=fKOy+x-W`6MOEe2VBewL8M zTKs{vczfUBcc1z5KM6Pc{`@h6nh%Upspp*aDz)K2)U+0VXf1xP@4&myyvHqdk6Y?q zUFQm7f|J9X&I8tgwfKE&@wUFXKRL76E!6B5x*MDBoQn0%QWat;qyc=y0Lbbwt6+O|>XWcXKW z@u-UN+}vJ3thTDQcM99KGYo^OEUUxB1^cRr*Fnv#LHpLX@ufb ztWDg)kN>G0IFgDL6|L~w+Gq0<-_;K2p7&723_X%R)#pqA>cNDEIrYT0w+q|e$S-)e zU@t$xf|Yz8^(DSk_ajg4v29xl+uq49*i~E5!7u5fjtrSAGz<1u$c{|+%~q^4SI(y5 z!?Dac-^qOsjg=Jk9K-{&KP>xS|7r1n>TI3l>p12gBltkn0*tdCjy}=H~ zF60`y4Grf7Vz-jAsUZ|Zw;ZTi-*90lHi?Ig4Ht)Em+5?H~rzdidL`2>3^)N*qEvG6?V)zhI6%cPRTNZv2PBnSeqQi zd4Kk^LIkD4YwpFA{$25Zgych%S;%&CdvE**;2PVOEcUl;E^OPJUt6%EU=6=^!TaEf zzpXppU$DEbpi55-?9db8hH49z)>gcVPR)$#D!X8v;VR-wVU7b%?P;HQLu*H#EwpEU zYSv^kfn`v|XN~Q3K$RX_E26NF-ndv1n-_0ntjKx1c;jqELgtGZ94m4mFQM2(Gt3cP z)f8fa0#&bT{!#~^5qL8EM1R|x!lT-PR}YOyM;?qw=Wwh#5R2U2zJ&R&dixPAT9KWg zPAK*bng?z6@WNmX)L@weMD|KBqh}IQZo()phru|Z`#I#Q&J>eToe(^efIpQIGWEz*uG3!dIYS z(XhRwCCbJAB0R`qjo}Ob^Bl3bXxBFp$53oqtmtl&)J_~J-h0}TJiwJlI{VV(G+?^h zlLuOw+fM{_uxM2FBI(p3A#pHtsG>TeD4)7hbhSrMue7UP5k2L{iY#Z&g0TtUOIO1e zLNS|%H4VjqSO9vm26{R&Lr)C}FyE(l8!BP4SaZURVa1BX&1NW(io9O2GhPEv$X#P% z-$+2!5*QS1?1`tP=N+@bO}dHMBwK>qhW>IIuuKa{I6bAwFY+0~$wG@~51 zj=H@!I@PMmkqQUsM>^%S9WIzk4+6pgn=w4^mMoAfdhJv zZW;I{;`c+j4E|nbJ8#Q}&keB|JvV;USvfiQcXMsz9Vj=^p2aHP`6xHbpE}%skqFnrAhPf3#sPZ0IkjL&x~-F)3Hhkf z-%2zHf$7UF$uo8>)he)>#n>q6q~vk>nGT1*PdGV*4CJty<6fEL?T!iLRqhD`a*(*l zXO}sM?8Cynne@oMyR11fyI_nc*>JMZtc-W&uW28H8ymEOpI~gzTc0o;r4;cmIiByy zQ7X|V$BMi`no4bPOI2ggN2wS;l)8KmrA{@ay7+4bK5m@}nRGPnE$33`P~-lp#(jOy zxL^HVX52R(Fz&A%Fz$alVB9wyFz&Bs#=X0}ZnGKpb!ObxYuvlNabIsc{pVgdpnbw& z0}{__|FUjbHrbli$`aV0cgyzN96u&~v%B}Fj?0Nfa&kURjX4%MFZ3W5U9|O+RAkRS z>xXTzALXRpPtD%D==hKMv~;rdUfwv0PPQiJozJf|aYxHeq9eBZXYW3inDAJL($egG z@A(E}LjE?-ZX?|^LYD6TQkGRD7k3tS)fDd_pfoS-{hOR?a}&ip_Uvb7y=29N7;QU^ zUG`s_ynlfw2YCN5NI}I>w+R0)ewN5SgC?!{-*B?OAX+Hm0;Pv zkgvmzh8E4mW_Z>Tq%zPC5Ve)433$phw<45W7?T%?8g2#*R@ePA^o#s?gJ z)A~64eFs?0?Lx)0e=suY9(rZRrr{{OWp@CARkkefRNCb?d_skZx8j!9fravcs(r4% zFc0_(hvYBpHv~QCYo|%*e=s_JcgSfARcsD9?}o}&h6%GyE&ZGjPZ z3a{j_&^Ra%Sq9VIUa0EuXn#FW^_=<}KCh?0YM;2kF6{PuAL7`fuBvwUVYU+9EdgHBy%FnYGRFWXu?uAp&-*+5^0 zD18hSq5DaGz*DP^bAA^WfA&pZs%-*)G%iTLqLWq{=X@o9Vp}`xHZ-S zEu#sp>!d*9Rr*e;3b)jSY=?Q@rWCeT#_Y^QbZAdq#Emyx5%~c<6EQ5Ip7y#|(zlY= zEwE#CL|dv`giO5Gh3_pywo6%MF-1wS$}VfNW3v|6&a8Q~vTv05mb&{>MZfx1KR~cr zL@)sQBM6T2xquf%yswMQ*GE;My5PaDazECWD3wO*?x+0Iluvis?<`Nu;PWBz0UO79 zW{ZoYnJla214bekJ(GLiOLEP0)Pe(Nzyy?Y{h7w4o{I5gGIjSJm%ZtG-{rJs%X4&R z>f&LE1@73Mo>fP=R|iCax`c1(vGwX`yrsSFbq(xzysYY48CV$Ux-JrWDU0fwtg_HN zhEzk}s-XwKg=d-}W#QB{0fj2R7?cR-F7n9*eHOG6!Wpal`L>=BA`*QMhSsMMn;j%= zKOlYwtp;{N)P7BBq~@b%I1Rre9@B(-xNS5UzTPWCX8m2JsM(RNlkASVxpbbLxK4UP z{Vpu#x4jOxB!^Y+G{PKyy%<+OXnH3+geYrtEb9DLtJw`8d~z^4y)Y1YHsAhMD;q{# zSH(s)0hhi+FGGE|Hmv@#Nz}CxaBH_&8CJ`U)Z~xW4li};7IHwZ9bP^clqKO*r|u!b zj|}I6yV~JccB}{=qk9Vvld3xqfx!;Tw{~FAw*#emzKN=5JE6I>JTDL(I2>x*%#<~8~rTy}S&C3}Jx&|FyHk#AFU3E>D)q+$%m6)Z` zihc$7Hd@WUGB0Bbxr7{Td|j9ABRa{+?rzA5B_n@3KYD2;CM|2RM)n5e{AjpRQLb3^ zS1~|c7sN`y@M@x98YoJDqH%0MyFg^Q)VfFv8Xr$es6p<|;Mp_t8%F8Lj$-+Y`qWe# zYCSJHYV>*0OGoE}(BRw-h$3^;3q!&T?C2=I;)Ku>rq^oby$hc>WW@Q7dCKjdoX(QqQp08h#gB} zr&^h#4)=3y8@yU4zy3ZvbWOIV=52pVOxN|Dldbv{A6U~?yaXq=nLkqpy=A^^+{{;U z*01I3T77+&KN}NZAd!orsy`bOJ=G1gnz>TaKsPX5 z-Qdq(U7^+7t+@oK!gO_qfBx!*at)qW-OzM(M}Ge5hK0uqvSI0}j{b+LdRF7ss&T`W z*-QfyH1!SsPxAgYAD3_EVfkd+y0bM{)fPTl@}i2J{-)}J)*9;sCb@G**mw@g8li8vkcxE24qQeLTPnhL(#0dPE-S%>zdyZf?LhcX+-dL zx6CD;A?FiTbHapjJZQb#t*I4jfbt${^%Y(-YlaKU-B?Ag3v{X*77G5oV?uE`4OojO zl+LYdZJ$u;V+mp#F$=nKE&k-}UYz<@#7|9EZM6{R2zUC9-tw40YPHoYs3`KZYD`^H z4Ec#CbcX^!2i9yA4O_#_^;A#Qwb7|a-Iu5LH;Tzc|L|IzUrfpEbi}>U%h|*d<^aKV zRJSDlYwGi8!nfV#)LG6Di&B?}mQFE|8PxwpE&E_Z;O$ictI-Xq2gb@`Goxq$Pw=id^U9i$>z8NyPvke6NF+*iXXABF(h8~B7IE`J1(PvW5V9k6I zZMHcJ5V2@!(6=Upxp-<-_=|`o!`IeXi}Sf~==Q()oAz{1AIRSw(+840H@TX>eUdBq z+c&w4*Z~MH!{uz~Lz>s#-nVIQw>I#@Z8Ri@u{NyMS^ZE=jUk$t%hCz-v&=m->~7pW$~+YQ7uVZIVyb4mGE_;EJ4l)OJH zT$Fr5hLV@O{#lg#X!GSCqU00OlzhU!g_2K5Q}PM_7D_%LP01(xTPXR2G$o(#Z=vK9 z(v*C{zf8#|q$&A?{{>2(EW{y9XlngpsqO2M*dBk#B-g3lb~41dVnuadmomR!*UTwz zR%f`@uWP=}AkqcAvxHSS$x6f_P&bZmCNvwSct+UKOBazs0M__;IGLh14aB>$xq&guFBw<%!!rhz`gl+|PZL&L-xx~(0 z&w*I(v4+?k!Lsoxu~W;a=j|lC;x%3N*)X)mi6&c5lA#9~`sL9V$ZDuF z#B`NzPJ&>iQZGJi&ZAdrlhC=Xv4Vrjif)cKq=*qqy(pgg%exOWo54PHHs08+tE?qG! zF^5wB62Lc&>;jQQ5fA$y%aPt;%6j0xuoqMh`x@6~fqc*3ys4mbPFwP^toEr2B>P7!zGsSzDAC81pvtlg}ENg)YT%+xFo)!h@ zyoi*FofRA5Ub>RQ())|;dyavg8!W@{R=1u8V%7cGP&4=@W#LJ&i)J_N{nhjnB72Sx z9~;?owTYL*tuc+869XxeeV&3tnTtYj)Jd$ynTO+08}hvagOTxXt#x)px{ssQOHcAe z-Z)NY*a_DW|%qJ`gth?J;0NSmOvCnQ?)POFi zuCuAS{F%EBOFYCEtL4AU_l@C`SBm0Jj3I^IFXNl(g?eBNp5_>bx@%L8?b`&4)nzzduZT70 z71(4Gan&nk&3Tp-uju1$(G59?Mbhv3P>F4@t5!kF7J!>#09me`Gw#%I9m&Om4HiRi z)-!hvNPdeu3U?-tZM;ql$q+QF4TYlg&)j)2F{GW6C+XNc4T5MO0im^?a!X-qN4-ltE}c&1+Q=>8@C=$F8*m!6P*Dn96K z7qwox_2_6Lt5Jd1piQS{l}nCb1~)N-ulLO0OD3lwh~bxv^tSL2+@`UQS47Ig`bGOU z7G{MX#q=Y!S)e0PD(t8eM(2!a;!neXxpkiy;-8%5w2cuCG#u5I=-0HOb#CYr<0@PC zsUf1tYsMHw(#W>Nz@`=5e3ijqzoyOSHmzuy8~W7EyWdDblND`=!<$y@@G=d|Wa?F9 zzgr~bx!cxZh+<@LMR9y|n7=|ysWSROXN?`Z+zSc%LHJ9=y(~F`I8F^4JI{e5`#fu0p zf@K?n1sjPSdSpHcCVc3oP{F3)h-JYM9|o(IrK5%}z3n+fH^dD+T=P*gy86iQpme-Y zqoXs%!97nwXQ_FC#MBbM&pVHxfhB|;8WKB_u;}U@x@t8)3Jzgy)ISjE-W@30QL!Qz zE9!m~G3#H`3Ls*I^@1Nhg*alYB`Y$M!r0XeZr(Wa$~vdbU$(-(v#mc1E!CFXl%fBT zHiA{`X&4-g1_$Q{4;wf*)UqL*&|-W-{b{NmoHKKg;ks5fevl}k&R*?dYBA~v|HD3b zuH5i7{Oubq<1d%W8ozOjS&ZIeHxo3rsrpOL{KaQ|e-eu_@jfZR^k-evqnf^C&)(O~ zbJ#z7-!^_5FJ&iq;Lgd3r+CTa{yi`0+&h%}_}TkDO6R`!&Z`sm^5SpW(oNw7;j%=N zd2OG@Yx(qZlHuCe9mn~bQUj;wH@&&PY2Wt7uk)pK*3~r72WT5EFpyf`mq}4l?XSbzyU4eYxf~$hdeaDAtn2w| zWL$4cR%0Yz`tm$Z0=aSy_%kn^d}))Qrp*Xy?5g*z<_FnAJp00mwFmI}s~Wc^n)Us$ zE7bl{pd9p0mpMEl2dZyHq9&n``7^cXZ|2L!rPgCdk@;1CMP_HDc+V-51cn<|9t6cw zv;Bqt1N#Uji`@x6_7`nI-%0}81*z8geSs`Id+g=bal z9NYAr{ytC8v`K-fzfN6B?Bmt8Dzdw8IOHYv?MciHkMfS8*Sf<7)$mIJfV{Y|N7fcr*ho?Y{TM+&6#Z7rl}sZa&>M_^4v7O zRcx$vR>Sn|4wkK`bDr}@-s~H2HU&lylp~pML+E@T+SZ>iCrp;JwTBek>RX1xTyLD= zWxN=0b`$Krm7(!JuD@Ipzd{1n>A$Axw)gs65F2$AftCZ%hK53{BniAPj>M&Z(5nz4 zrpP;=gq(eWwm0(vu}L-Hr=c6zna`Ux@w<;NyC+)>uYj5jFLL%z zzRtW#I{O+~uj~4-mQp+P_o{Ld?kLvdVUz2uscn;Mt(!XZ)Xmd--IM)R!%O}3x2qqi z$>pRXU#zuWdX|FU;>dmTI^J$xO{<@f?WVmve5{8L`E&Cd`jaHX)V2J1uS*qg(9?Q8 zG^{lhzbGKr_9G#=R;g=DL(c*58gg!2q0+CorFq(PsM4>P(lp($&OCic;XU-0l$RKb zjqg+MOXklGzyrsD#G3jyei4xh3`R+RUeZvpdK+HW17cH2SzdaFUx}i(+mR%()Ruo@ zwR~4PLF=WhESZ`%5p<$g67P)yV@c zTLJv4WdTNWTNRmZ*DH40d;N(f)6Xv0joXwzvX3wg`2BSft#xl;*V;hayL^7HU$Ed6 zd&Fwnx0@V&!o!sVUT$}Q(4K8^FGq))!^ZM>1a`@B(0>OEJLtcZH_(6mA$YJ1y-v&f z2;@l9M%|*z>m+1^K%lAv;Koj?muTBgscg~FdCPV*EU}O>QCt95RFju%eNPc17`LXK5WNCp|q^yGv7sPU{04o`5>&qc4vd9JkRf6ed z^|;a1xznF-JUNhR3srHWX=l)?ZA03)Li!=!>lk7rpFV(}iQVCI8>4b!dM1DAH=|au zmT~g{+i6mgCx~C6&2m{^ID3L+37O9hJWKOjwZV!=4^EK4(+x;hWPvnr#)`(16vMO% zY4H1i1g}|#N!~6noZA|cPh|0jf!Iu+3jp5v&n6!*XDb2I>cO=FWBaW97siI>2U1Ie zSRj_IlCdZ@Ft|)NVgk`ZsbfOdu7 z90E9go!EQ4FN_Tz5=bF6UJt)XzL4{32;ainfOml4y*cP~rQu~gx$qus;5Gdays+QE zTV&wqJ@hz6rN`ANW`6 z?2Ww9HxNnX3Z<=xc4ZKJXJR!EGGdCn@rmB`RcJQ~QF-kspKbkqchLGhc)s{Mqx$I0 zJoVKRr)D^m4^UW0xy>28VyC-5QTz;(LFn;*;|}&KyQ4#!tlhCxKkQ!ILzTSC1cR2( z1hSgTx{_0MT#alI9J0vHoG$<+x0*jeBnrU7|DA%ax{uz>Q(rydP6<5w1<%^>u|eOK z3M{Bw;ZNXu2li7b@3`|G`#;A947VCPwXXSX<=0)?&R6OK9kM@1)ALOz;(3K3=i3Ac zA6v|_mkFRqL3zOWHom?W*Jx&YNks8oD;j=;4$Zh@AmE==$2l!lG{Pj|#?+WSK)!&-nDFr|y-_x@g4MPka@@=D1>6 zK^WneWQnP+v~5Wv#8LJ&){vHbO;7BpVdm#iy`_pS!9&!JK5Ej45ZnA^vMWqvG*+x^ z(UwyEI4z^yHwB8I{<((BX#$loXh6!DJD4mr`i5DC22e!ZT-Wdmo7Ci4L0_C=3+P2ck)Nerzil+H!IF&pjHAtt>1WA#1IvfYgjC-t>6;}!dk68^YJWjT^2|VtVsxz4 zlb&@Xv2nk&1Ur+_mpzqQ`KxG8ytp?}dwFD0$RWHR&BVKV8_%s$m! zwm{Og6R8e4($4kMp0^gaaC=?q%Pm*&w*fVpZ*EKp*5XI<)Iw5<;79e*TKo%r$Xefo z(rY+|j9*Yj1pCO9+!n%bCzi1i%~tAnE$FQ|tKe_27X@)=rzDH9<~&J?USQalfT0}i z*5@RCOCmA``28{h%E<<3r8fxEsFLVfb2%K(dWFawzo3%9Q^geIAqSHO{t5{*^an&2 zhL42|Vcqje(0NKu9YNNGF)|6}jp!=tLM2W~up1i~er zAdbX)&`^`A6)GqxL^F`Uj7}6q5UVKlf)}bHB!X38U=qpkI4vq(T5C(|+tzw%;|&lI z5P@9&@Yd0w7}%sKn)>)LCtwf5R;tsSzT zna<;?ig4!u;m<9h0kx~Ci|j4@2-OKh71(@;nGZWsAEa46Y&IXTzcnRvbngbD4@y={PbfwKN zDwpZuuNv-}%1F?-w1lFUmvlOyx3`X^r=8>CPvl1hL!nO7hD)KdzpYSTKBAD(8ap3Q zqZNLN%Fd7W%nWgwZbQk(=BQ#NCy+^;>**+L0(l|3jB__E>jO=6JR>9RaKBw&M^D`Co#bXM~ptu$Rp|&Rh`~UM5Rv+04U`Y{JV>xo04TJk}VD z;(#Zbu_c!LF0+35SAJk{!bEl~LQ?}auYe_wt{QFJn{si{bjr&6-%~e?x|B8s9^t}2o z5zCGY$^Gb)he$iSWa;)-a?F`P8`gFpbvJ1yZ_}PlpM2X}`a>(s^2(`0YBe&X%RY+|j2kuzjZ8dRx zy=G?Z4b#rlqY`HblU!x*?D%2Iu}ab@4-KATNj+)AT+XoV2Sr$b`YDr$)|yFBDjSGq z@1+>ugwS$gik7@q2rVBbb4~?bgdwY@JmN_-`zQa{u;mH;cs*+s@;({>Radq++RD9UpW4HW&9>`Ik(#aG=;ipnn0^);6gA2un!jvghF z`y@Zs?xIMG9x-+Ra`|p+!4=rzuj&+v9+6)$`1tCwV99c8wj6m^@-RoE(`6!1?oR6G zkSD6}K%9}uK}Ua_@2Wpd+>*YZn3f}Ad&$P?Kf=56WcPA$D6`pGxT!u<=~Xa#J3FwY z18R3q$G&NA@vhrXP7F+wR{|xkS6zbqczY&`uTy0EOm#pn-ZkAC$kK1FUdB0GgLn`i zlBy?}YO4|HpHiSP@{O+Vb-@tsfgmYlBU6AhrQblHG6b^A|6#xZ$lkC;;m9_D@=Ijigu$ z*9W8i{UfY}$6h*dg#FvxJ6R&U9dRLV^KxhK#x9&j-K}2|5M|S}KjFW4^=+qG3-_VJ zy}_0G8b9k*KB?)N@?!Ms>$RvoFI!5Y;K!f_Ps)AW&4ELBP5-)i*)!#nyE@)T-xbt* z@b`>m*?Yt9ScetL!J^UWcwwXkcc%+Hkbt%a+>u^ZNngtRq&)cb}tl3cu6lRMqetZB*hAh996pCuMP^A0R9zFXLRC`~*ZHAXhPTvbA=dg)(dG21~)3-6|Vn+RyiQO42 zZa!$#PeS(0>8v z*wg$stTq_D-e0_?0|vha2Cp#~98?S*2hLueyGzh_6pt6@Vk6T$YoDNQxxIYall<{V z_FR2i@wZ{`sEJZg2Fc`uxl@l8ti3q*OM%BRbj+(|+Tz4}K#%O@Cc6id-DV_*g2_Wd z5cNb`;30k;`A%2A-QaKCTy6y#K$^t{I=RDN#shKI9s{1I1w8s?sR2(}1_!smXKk=C z4t&;0whDWNzj%ZHhPQQ|6TK&G06H6h&fCH0MIZ>vdzgK>@1x{Ozufn6&|Xg)0-Xwo z*3;$oT7P8k)wi8iZY^Bpm-{AfXpqWy>{T&oHS2q=wQ#q!aNw;I?JD2LBFjP3aq*gZ zY*~11exbaYr%4#CYb6}a35q=SD!Hb1sxVMd zH>HzjbN&yw3b^~tBZj2~7!0)ErYu1~4kCtW`~#|d06knI)bCsA;gyO_F~O!w6q`O$ zO1Rfh!gbT0Qc4Iet!a#>R%rR8#uO#I1YF9-lv~Ik;xow9N0BKz0sTwlo5ZW9ElIo& zl*k-1nLV2F@i)_y&`%Uh1wbja|4?J%9M6_*moBu z1rndIf?xcjxDOd+36Glt(aIet1-J4XBl(A}#3V*gM&rqDQUvt|sfm*8WU%OLs?hz8 z_#_f&!S!9*|A6=ctmg^rUJq=q*P+{ctL=NX7eD>Gwf6@?3msy7_k7>>ZvT$$4LEdr zKS^s(c=3OQXSV~}v-dP^?J=NvmU}vSr=`854r|!XK=gd}8NShoj^$4IbA$}q+QVPM zK7ZueK=jru((aLnL0+0g6%<$i*&mfzu=U%0ywf&Lv{cQ-<7 z^PsiPS$1pd7Aw$}WcU|7k2vH>_E(5xuOIx2+U23W*rcsad z_ePG#0At!S{Ap+RO^0OnuUiWdcZc3S(Z2HtPOXI9H${jN5LwSq%EGV1^6xwXNq$Xy zEeQ^Oi_JDxG-AKj_)(U ztcX}W5kzy6bA0dyCJw)XO>2G0`+Y{C9B984TL(%mVmFxwJ(dl{FCB|$)5>8g_ zR{4N-jTq|(!s@{5iH`Vz!pima;2|#iLc4L+draQU$llIVr$Uzv_Go3jq zlR5h7GoDjQ0tfT<)Zvl}WssRu#oA!cv`FqdNZ|(uU>_HHaC)ByP%bu!pn?){o3OG4 zvGX|?l*F+TY0x*H?xo`Wk23h;oOT~PEAsW%({2<0y-Pz*>E zOUl3G86?K`;_ZmBI;cLQN1%AcltS)6PP{i)e3z>8iSqAYb>z3se|1J4R;E>}6LMu< zwg`gZB)WTtVX>08+FX?9Z`v(f!o4ki8CNTFA#MAz1V{*tYKTk{w2~lH;mcWJ1F`$RG@VA zB|2A%DZ@vZQ;s;-xwmmJwI!awz7f(lm;DSo&H)Vw4IIQBCcT*H^_LUS zfsllqgH4Un2}~cWifF!Mp7>8m^L}gOW(=9IR@)=(zuTdG?6^P6oHCI1o3;HX#q^g$ zCJvYaEY`^d-uV)p3E2HH73NkW3B(3XOTKd&MOwb3QK%sChV;|(U4O96 znZfPx*bPi0Km)LhioXxnI`85B2&THyIXO|rAMPPKQSTwL>#&j~E>l?G4578N3WKaC z3RW))*hrB!fn3__aed)a2sGw`-2ri9u{&FN6)jwzgXZ~ah9aR`xDee71VdP3y}zPY zFfxM>FWqr=$|KG-4MSjJfBQ$9?oc%17_oDXL~U`8^dcD9+hb~3kd2GI$Iq$LM8B=+ z=h^etY^JlpNqZ-UGB>?+82!a+U->SZopTNTdkXMBd@+VgzCmxI9IyK z&c4UganW<7e|6e#`-K+iUtrQc`qz}+Kf9)-Op1u{S6BgV&+Siw*Hho&(#8HVo@nVG zaH8S7H|p~x`%U6kf61czoxi2~uNN4aaLH>PSla{b7%4?8$Hgh|NBFGdF@{>x<#&Ru zZ{PtxvE2TnCOGr{ZN~80;$?*aLDPem+woF5WW`pkI*#$Crfs%LGLB z_p~DOc~K8~?DRs#dvFS~Y9A*p7_F5$sc%m(x=5?H$JC!2J>oxnq(sFc_+>xvYEmnJ z`!qP|jmdJR?)pw45$HaqJ&STcAAK>sRZy@#Xm=4z4B8{08$>X%ae={&oZoydGxS(_ z+HpK^{bVP=mX2#^yk7yg#BqT5(nX3b3*~E(d=;lE-&|OdhcS1p&XBXy$XyNm5{j?7 zn>bDS#-3mR|88>%@S^3LZWg5L8&3v7xh9=?8FKq_1B`OCr!J_(Bz&93#B7OiO7cq< zd08p|m?btnWIr!*NuVh*S1RG3S#Z-mw*iSFF0ssCJ>D#^%Crvo)g*P+#}ey9H zw+UZC;mT-rCf1~%1!k?1IjSt#ejC0EM3jF;&iNFbQT@@G#LW_ICK&yd znbn~?i3}DhPOzWmkg&3W11`}p$;1M{51B)mq4VsT&vfe3s>95pMX+bmm&|)xa8esT zZeY@e$*!-SVj$m8O?R}x(#0pz`9&~~%{K01ZU!TXU%Q(|!y`5Tm zU|0>O)5s}pf#_puc4BXFeaC_d+((pyTYD!7dZ@>)Aefb>N0`{ej>w7U!PY?X`5_wu z8Ld@|87D9y zUJ=8ckn^G#?&!EG?QJX}kX3-7BUC$~kn_y-luH{)ZK>2_fJOE+z%)tM2uBCg+ZwRP z#X>gVvnTHf+2h7R$|rzB^_XE?AF>5-74r$CgB}x3ZPol1=%|4;mp+ZlaeXsn_M#8! zP*O{6K=VXHokR9~VZNAQ1-Vi{X|UhEw@@I;6bJ1qV0o_yTmtr$IRTq(KK5#u01=eN z_1!3I++o6%vw<&dgE4?iIGLJRC`P*fEsf>)kK({#I&l!4`qM$)U#0_ z$5>)k|3RZ%E<(|lMzg4F&l z)un-^5qY!*Sk-=#`%2*55@KVhw3GHlir^nHNiUquXIu*Qk_E`p zl}d8IC`c6$1Dp{o;fZ;4TlQ{g-ChdpE1iLbrk@1*s;86;ZLutJ$Rm7FN$~UXZWUG3 zTfLMO33Z&cQXrT}_DqBe$~|Q`*%%JkzlLG{QK}|ZBLNJ8C2v@@a^^!f0<)R~RYT6TEy3u(mC$1m z9vZiGc6~?DA|-Oxr*LOG%vUmB-@`K@TX1Q_^mOLTn zWMVLg^zz$6fn;=erd{!d$G1NA_!ePsg>M}O(gtYH6T^fCCaw%dxiwuyk)b=d(x|fd zGcj*P68W00Gq}ptuJ26x&jJ^Q_3r5nHl9$LJ`|rCU+=$ zN2g%4qEo13kHn3>w@@YvVFgtoz^wtzR;~C5Do4cK z_$xL;6C*Dvp_zID2b3nDVaVQ#eHRya1v~;07qd2zAOKtgD`T~x9A9ToB}DCrJfTBO zLLQTVeYi|@RIGg}>(rLHs(>}nrFvo-jWId@Moz4#6W1Q}Wu9P3^cl$pF{qf%=H>}5 zStlH>QmM3FUPLdG#KmdE$g~omE<(o%F`7@G9#O{9O==9-9OsOL7~KM0mq3m> z?hF|>tc$jj6}vtM%5JF4YQ~yQWum1&{+lk0`VUzcgZS$DDvp(fap+A^FQ3%3CHCuO zW&v>4atpn%t~Tu6`GDM6!UXNrkFuJQz?{-Td*^-$GJ)@pA2 zF4a8aRg<=j#Z{{6W|TZrZcr>l*_L%qpkxQ<7CSJRnzbhroFX7fFoG9Vw7e|SzeGA8 zvMRO)OTNHuYI{(PeWmX#>P)oM?C}Gwn*)6bzw&`Km+jYXd~c|-%zAiLS{A`bKpT7TaYa7H5zjH&0)3LIY(B5p~L9XdAFs}cV(1cn~!U0!P$v!6&} zRox}p3wFkv6Mq(Yf$KIwrjxK(PCV3+y-S2g<{`3b0ykk!sEpp?hKAgdH}zx*l@J+% z#r8iKi0)Ad3M`MhPu+evN;19w0t>KdY^{qjs;nS)bGg2k!7#9-dTGcxN$zsiHR%jz zeO9zo4*3yb0iuJ>`VU$^5j&0)o+lSqLI#49{y7@fWwxyKV@ zWv^Xn&&b1DfPG;odhLAW(*STE_dkPk1b{50-$Pg>ETu5?V7_9^K72d?^dVw1*!Yot zV767Vy^?Je`*GQMwe_NZEQ!09csv2i=*Y)qIMH!d850kJ6Gd-hPn$5&zU2D43vPVL zFevFH(^=;2tzjHZkSQTWzRpjn&M)+VXfLZ{>Urn--lU;#QVQJ8H(^Yf$xgKIsxjlx z>s+{G`}9zhka4&yl!TnC^Fu?f&QVC8Ml-rY%#zi>G=%K;2yveU?drlUXt;u{6s<{I zxIQ;LVd#`?)!wT;%^rqa&f*`%o9p{P$|qfpL(!}Aj5&>%8g6H>YW4%TK~JSz0s8`( z=o#;e@L4B>h1oQXmJ!arqD7=K=`IQxxmWZ-#I!(@M2wT1Y@J7P$ui;8AgzhsQ~PtB zo!8~^A(;AtRbr`;GH^Ha$n^B5ENS3;3{5YE5Yc|UN>*IM#jcrH$XLN6CrX3N?9+?e zTwO36Pv>);Y+m9pJ*bZC>oQeP5xm{A!Xs~cws}=1C6G;2l79MD?ww~7H9>+a4`Mi+ z*U4VDcn9>tns!n!vqi42OBE^`{1c){aNSDDn(EI9#UOSSH#a36$#F_1GB}>U-6vXA z7zJ!i2%B%tjv0#DG>EH1WH!Eu3FCPAf=jALrPsaMG<3FWIB{l^BM&Tv}D)v3qWTX;vZ{CUCyJWf#9Y`Tr$d z*ZbrX*H_PK@4qYV&H%V0mG)14E8K+-vICU6{=VRtnA1hY#@?A<{B-& z0(4c^52{*DRfngl%JZt?i$JuCd_h}W0J`A1h@m$?N@htrT}_)`n-II%mh2m%gI0@N zfexr-jTMpG3w6RqTsrsa-?% z$RZZ4(g)rz!Ce>gyO4890SAZOgPH5lncykPD&Z27ZJm$@?hkanBrj+$54OH#&ht4S z;QX$+>PHgOB(glKGJ5Qfad?$T4>*rkZ-E6C4OlPBd>S3;>Xg^-m)DSefxHfLvce#H zJ9@R-dnc7`F`=l0=y&GqFXHTcL1!XCSaZS{dWaWe^jG2&AbSqGp~87#PF^wTv)T$k zVr$N5GKFr~I-et}3!k7#4~kxdpqqs&j4`RUJ3lWMW( zNycJn5C2VZbUZE(pCorfsPna}7l#q5;Nt^!yBj3JP6ZlU8PQb z8{|8R1!F$@wlMc$iDPgnVTP{DT;b1LS&{icxqV_lf?e^kpOm2p%;v6e>kr4WbBp zps|c#YOAf;pn2tybhZQgPhE51kNZ^Aw!^=&;X*?wGQbeeCjb=U#=I9CX;`(Qe%RFaL)3{2Sta z{6(nRZ)rG=SzIk*SsX)Qk`vD&0D`<$bo-Zt>X`NZ8T=!?6Y26eGTQUk=EE5N`PWg` zd-6p3rQ!EZpz@*Jr-&ZVV75Agm79Z z%>ZYnd=@{NVx|?TX1KL5G(H1XP~BtVaQou%8TPu!@-{lv%^%*^gPR<{oJhl$iNlll zwJzRTP6H@vl6C%B`vj)bCQ;?RV+5X3>+94yPv5lS#4?%fwEp?cLW8NCEiqTl zb65LqU3wDwVD>|pn6U;Eo%w^nKWk+S{7I8zNPez+;y=$Fn|M#eAnybYEO@SG;`Ou? zGBu>^?b73M<2k)1SiBzcBD;>_7H;EN&S4gAy#$p-HYNhkYzeogZzrI1|j zyTgh+0Ql7J>KF20Z@?w9Yh9KaH>EP2&$kd>|3Un_A_I8QT;&$~oaJeCbv4;=rX!mK zeDJb$>X@y8FVu#I9N8XEWg}8VV-{J1?rT=%eR{|2E9QHV}r;n*Eu4FZtY>vsWG<1E;bVb5|mJ=`u>Su84rz|95J`m>wpQ0=F3rFj)J_L*d0?}c7+4I%3 zflS=A3a%}gGTJHcv)`7sn0N{W-8I!4c-SA$5n3NDeSDK_CHnPb*wNfi|0PpvlmTm8 z--XTPrRW}q8PmXDKJR+#sp$u2!_-aklI`M7x>sNZSg z0e#PYC#}k`$x@uGVzPN3z`OcAPB2AE^t{T$AGwUGzsO51p<=>qJg_2E(ty6kU$dfmNU&t}v@_3*W`W{6 zrk)lmSwD49sCeU)o4BXcnk`3N0UVoWf51bChdE+K7tGuj$lRAWGbEw#s5pMlKJbx3 zlZbKxAF^iu(JMD+xt61*ZIY6?kD_1!yCFnGE$jCCx8hj#2!%F!89e(uwA`9P%NS^R zr{su=4&pbR6_b1a*CLtiMXu8#zELFTgq_|=(R2^9p&h~>?rB{gxfNO~eI#@j3+W+~ z`ns7m)wPkjBU6hXrFo5q-M>xJQmqlh{wMG4^PA#FvpyCE#{pVc4}9NrD)Wg(k{5Xo z)s_TZiNuJ4GHf|cb4T%BIlq!E)SSbQ1A5&E9(peF(rVOZR;_z1NvNsps2uYJlK!fC z{!i_7=S9l}(d1lY!Gib?$?V*{wFvF?FJtoep`OUKe6F|A#5i|nnYShOn3Z&BcVnkT zNL|MMiHj=iF;7ba1BresZ^} z46Y{b4fGgl7WtU*$-kz^7d#0rHAOP$wLB33<6#Lw`;=3$(iy|ZtLxdM4C+9S32?#P zbsrw1?cIf0&8y(~h7SYX;BVFSk>xq|m_=OKyV(me!!BsUhpn6XwgxtQDjABG^F8yf zCH@6R#{CSXLrbS%k8J9{{r^~hgMWb)e~+m*^`qRBk)-M`F!fg_`@cQd4TWHO|BIJL zww{CLRR*9vr{7*o2}BhjS$jR*_Z}znD8?Dim?fe%K^kf6Y}Jf8LGo#=9R&l?zJh(* zLY-guQZ_#2TyhlImltr%{-<_7+lydyri%xo9LidAPNO))YH<7mzHq`~H-_Kq8rX1C zJ;D31TJSa#{sr0bJ#bU1Tg2g8y$F3oNPZ+#98-oHxd3GHN8H1>$BlYO>qLCqN36)* zhfBPWt^HJ%UN&?%cQs-pO_K|oN=1OTX8%9xG1<*u;&Oc|&+!NN6LS6}INNS-$0&xp zoDTv`9ptcB#Q5=YGlxfm@9f4ZG6Ea6f+m3;74?zkoWw9er_=_t(%#e*k@CF-s!@qv zyCrtrPS+(Ydd;7Xq6&LsrM-_h)ek0yi9ZkaGia}I80{TF1jQV0wG4!H9|s$B`vs z%LUfmRt0WotIZphLj<-0dsp$kbsuH!6NB$fM2{=pm$}Q1>>zJsYeBabdrf4U71@>3 zZ8@7UwmOl<96a`&G5NcfXH_4LJ%SRV4Id%TSo4<8=Zb=aFy)LORWJlS*01YV9ag}s-} zi?y(oz{pG^>b+GZt7U6gvo_?6=VFz~+$0WMn@35?@P`UVGo*(EhXf6UR4MuMFX$A1mG5T!Iab7NAOB0q%pGtxzKsli zR3R_Rh&d~mb-nXPPK!}dVy#z0?Atg7q%3-X)5MVg4<;YcH6}Y6fVtuph~VA_po~E z=5;<+_!c)abFi$H*4*k<+K1n?3U4|byM`U|1IHGkYAp||_a+IyUm;|F+kB_0Pj z?w_eNCa1QUO9NNgl`Bbm^?u`{47u@#*B%zXn*7x5U*Ics1!?A7M1tsXkRq*`v*@RF z_X)ZxD#L872wJz?zo2LQRB{pRu4K%7=!hIZM9agS{7V_7k_hgbB!hmg&EzS*`beb) zrq&mDvF>gLrXV~~)Z1&0+_flUksP7;)!nMxD&OH&Hpox>Wt{FH>LRivx=)-d!HTZH zw->tZJRs^lCvpUTGh0fUrd};VL1Z69X*X3Vr%^5gQTkL9s_X3?%23L!Wi`XgSi==! z#=lECZ#Oi?x}iNBmzco6Kj}V*4C{%i_KOh69wo}R%iCB=%@339)x3&bV$8lk95zlF(hg(L+MkvruGC;H6r=Z(_)bh{z z?q)T=2FE5GQU$FBH*BqpR%V9aP&BGhw;OYW5$@}98&?Va(_RyQobmw9Z}0HW+A4g) zRBz^F`f(UgwxF>R7BQs~r>bt{C5=S;lV?TVAbpmrSP~iS z12fDrKyDbClpEq)p^JWEQ@L|3C;0nOg@4I1Voy>JgAOi|^FsL_vQ?RFghJGe8N-}; ze-bH=`_~U8Kd(m=13E_j6uKYmhRFuByCDZ&QPMJHbEUmbra8_or@pv_M2}05w{@ex zuUy!;fxGL5;f_7AJagSJ``*U|{rxz&WJ1TJuVA@|YE}&~zcK>qXd_)?H*^ije)}~# z`Iy(q{z-TlRQoag1J%YT(-fs@Ww&+Gll16amk4*ws_N-qaD0$m)9%#scm`v*`N74<8pjOaTkzbXd-bh6vfrBzj z%AK1U3L)KgQ9CqT$vA1dC459~pTjWVzz{($NaM;ZuJ_#- ztAH$3+Pf+<_rWA8ioY(mZ)&K1-jjAjppSo!%&hz-U!{T%1j@WTXWnzfhR=}dlB`HQsXzTHR zz+Lo=XWDT#jDFeE!{tQ6ZIo)>PTPM8A_X_dby4;H;@72Bf9tC%0M%Xv*+_Q5T9!2& zvU+qo|CVuEv$sM}lw2o98v70djkNmh-orWc8ic|(;e#kH{eUHkB)r_ zVHR=s8m35OnGtoT_6kOSk@;8Cy;lH0Ku)U`d*4y!^@80jXZfNjJB33$T?seBzT^9t zeL?>Czv%HH_mJPVr|C=t>vo-rNF$31n9TwurV*hjR#Eojx01)vD6CemaF}maud>Pf zpTPf7{4e8wfBqNnKhNqVWoDW(87zMizbRv2QCIID!Cplv6tMkyl)jMCRsScDv}wWNI0bDNOZ&{=Fy zAx<^d!b%1Z^(-RWCTrmX$MZ9Bz;fA3EI46eWS?u*_NHI#P9{qBt~}Q^A0W`jcP5fO ze+>aX*>lljto3MYKtuz3mlE$4?YSRI&%G_D+ZvD12ZUXt&ywxigYCI*Nza{Lw+zPK zMfYm2Z_hl;WY*0$G_>1tyTw+;BLHW9GUBCVWtJ)+G#&vIdC?<+c|wljGj*Phjvp>r z7n~ID&ad!C;hu(d#x@aH5WXnLEb@B*TS)kNfe3juZ%cv(HbDj!C9B96MoX!lQM$*ED31-oLUe?gD0ict6S9NE)Dlqge9SL4Fytu6ult;csoHX%nE zLH;Myfkx(z`N)&C?(H|ZjU}t6ZZud>3z{=6cPUDK7{qlc&~2Zw)5Mg+2=IHlOdDu# zn)RWl*|{UB*||!{J-Rt|3`RQ_C86=NZY6uI*|T}%CNX<;N+tAyQ3>syo@?)fMaSSwQ{;Cq~+i zvwrmp(j(j17H6M3S+>PlxNZYJ-giZGOFS7OvWV>hL;%Ua2uT$b0=v0sfDN*O_Y6|t zj6J6G*F6(55$aN594Xko3;YDO!a9KM4Q_*7TU=<3&;vYdkF~UhwZ>&_l2ikuhViW(zh;!7gn|DAN*>jvVNBlg{kDbPt zIBh!?_l?|tp+AF|_4G>zM=`GBrye}6I?8>+xW0KvSkDmBty%YW+#Aj2T{d@-XLyL? z+~BFXpA#habixCg>msTQoPjzG&N$^PzY?Gdr9kLCQl!zE!;GX+cgwyTU98`2KzB0r zb#78*U-t)7b+xDW*pALMJ_i*WgX}!z3{|N_rx?=qMH*@A>{V?m)ql4DlPr+eFB@0%=tRdBrJ|YsF6Z= zGveYxhxWU^_kiZ0&6Nvd>V%u6?;?LsHvfYC^@k;3p!@54B(mivPj7{|sl}Xrnlgz0 zwU0@qPw{6!bA7kOvGq9jp^kT|pN10?FPlTr#_Hn48GOaRU_6&Mpr0R8=U?C^ep25p znb*t6PTX3san?RLTCK*zfvDMS+!-$2tDawVW@4my9#eP9n3nR)k8o`C+pYe_&pP`{ zHgRgQZK)>_)X%+SNQjZ@DSds=J2=-Os;e%@$H1 z8USg1j)eKIwBPiA?C4=DoeNjm?}RenHF~2!R2|M--;cJV+Ei7Ntr->InN`=*1lpW& z;6$bUkxX%={eE>{wgb~i8Zt}v<)VqM$k^=RPo3gVc~6<~Kj>4Z`oj~a)OSI#Hs8YstQh$c|C~Sded4dnPj-B@mpNAuczrys zulwse$1n4qdc`l~iR}d&@anF7n8GW!#VmkbDgwq|@^TUcN;V1}P7AtNwQ@I9{B8a) zjQHjJLVh1zfDym!d6Gu_hoeY2RQkTHlJ1lI8f_n=iD~Mz;j5D>M9ru+KkGGLuA}+d zEh#SFlATfC*Khwb9tB+WC&uLptNP>PGx?#`uhFsSSy-Fv>uYNLNRv=v&oT|)NQEJ; z;gJw_Z8$Sf>Jm-D?&u1WWs|-m2GF;+O_r4;rTTWJ$=6l$eFjkKT;EkDZPIhu8Oxxc z7**w&lwML))L!V(W7^)8r0pvQBHYz{zb}MY@p%J zovMyv-&I9On~^y?0&WieJCUXwx8FoSn`Rx&c|^+5YcNGa#8C^)=?{8{VIgrxsEeKS zn{49yBfyQEJw2qubGbiLWv<65M$1#iwC2%f$&~lP#=s8`KST#kmAe=>*s^ zq-$2qGx9_@AC_vUFmDx?Sw*&HHg3&U*S9$rXXdaWa8Pca(-t|mv(oHGFIizqUbK20+5NZ!fr;NU_$-IQ@prxI1Fp6WbBAp6yu}uwS)m zt5{DV`x<~mAC0G_wvFrcT@oe1KsqCf|X!HIj*mPuEs~}IwaJJCOsobVo2)x zPGkk1A00Z7%bM|&JMD20jrpI5DPfE+6DI~@^I4MtXRvM-@3s{xBX@8(9xC}PXqCTN z)f;%43sPowkC#v>Yq{dD;eov1w)O1VX*7FRd7HI|1~~d^i&K2U(HGMHub4j&yI5I+3Jj{C4x|+ zXetfIor(;JD786!Ctv)Fdp|C#LmxeZSIbHbY9)aT5PfXs+uU%!DTC zZPI&n^eA_1f%x`gs~ydL7&?zQy=*YkLVi$AfL0NBsl8QO_9<8LSpu}E^=}ytin$+6 zr56OVBHl+4u|L4GrW7dMeh&dW&(~RNZlh*#)5Hj}mGhj~`OKaScj9cB#(Ipi)xH&H zO}Vtk_5F&>Sb|U3>6GShw z>SV$50{rF5g(ijy2U~fe!ZNG4XQ6X(;V4!|9={hSE(93&APERCgoqNq=-;OLnT+;+ z9j!$6$~ldXYE76`n54Jdsd+PA1ylFr=prHiXMdxt^y+hKrnC!<8*CM26Dd~T45IpV?B=`n+jKu`?d&A=w zAW;e)$H+3IdV$C6DKh)t9Ufbr`M<&A_kx&*fX81_>;GW<_=T9=egiy4Z2TYKaU+yJ z1&1l*A9Ag)EhjGczaPWRHJ?5)Oy|HiwHNA%^HmgQd|0;mt+CXWEmUp>gb@vQ_^ROuLrIak3Bg<*6tTTQuu|^ z-azD>jH+AI{hwBAT`ste4tkD)uJ5-p8~DJJ@CQwBOhUe78%nA}sy6TTn=CCzUgxs> zfYVu^Oq5O{Pnwu-hw<#?d}xDLNa8J;uVs?ccNZU|li75VPYLc!S>-inU$J%X&Nf zmhXpOw>&9x^}o}f(`9Ifz^}6eA5I7#8XnyR#lB&^ZCw99z+<0KyLNi~s7#nge>&a# z{orxsU;l6LH~~g^EfB1~ zfc>9DB_FSuL>*653Jh?7_6EsmHWZc z`&$s(b~7hlEvsTX{37*Al}?pc74eSNF$U)tUBWYEJQ6HT*7J!1SX*PrN)h-F67`>$ zOoPCLm7+h%uCP*;p}<@$c6iz+;o=!+6%*5x(F)cv9Qni3IJoKtQ6KO;f#=r0NK@s7 z*NXr-S$8B&HH9Li%RebLPCic$kQye1AtGxF5N;bB;6lsmiKF^vc7{MgcP&jUP#uH# zQ`oWg=sDiqMx~!~mnb{7M_|WGhf=M@;SWq6TFEyD-fqlbDj3)}w9tceMib&ybeOpn@MsI2To>}!x| zv^POG31Jy@#v8nQl5PgM-avqLg<0HIjqDGIwMHa9OjXQhRl@n~@PypTR2WGJ>J(CyWRm#i({(ox( z6ucVVg0;w+`bt|LAye{asfH;jBW~APoszQ5D&18FbV^3aluVE*x!x)c6&A2wr!y!0 z`MonSmOc&@TG>7){|1Y+iHEe_+_8s{7?^dIMStn=!6M}wLeis4bg=}8D#bppY&yg3`>xZF0pbH=|t0tzb4EAI~su@!7G!#s2Sto0^g-N(8|X&6 zyRgVNuL{CJ>dIn|&u7E=cZihPuNXo5d`c$r(o=?#qM}g9Ic=2I`=Q@`llJ%8a=^*m&5z^DfP`RzYSo^Mh7Tbw zMrz2xqmEqyn#*Euou9$JikQ?nfgz!TIhlk}kQJ^|4cj0nw@h_^tN7l+Fr8zX%RnN*H6F_omorh9(Yw@)?>B48 zs!3?=xz&eY(T1o)+oc})cQBfN;&BL&j-Ase**Q(HicCS-JzejZ(!wRczdM1-(E?!y zCJDJ13t?p()0J2h(i4;&0Th#`@+cafQDSvjbG*C>%A8Dgr2%M@R{#q8Rc3dJNz{4e zQ0vXwPpq0+Ix9-PPgi?*y&H%s*awXU(mEr=fV~n*ffmH%57~FHLlWI=h8ju-R4Kw+ zSa=*vGTXjZRs~=ec1SD~>6P&QC(ptlFtlheVbAYpolq^l8h2|j_k~rPu#S7S~n(;I$x~M&y$r z{XK_wi=#udSKKr#5q?3T-tA*(7PCmaync48Y&M=^ic$n3?Y;n}dqXmYW%idU#pUki z2l~LEls^1QF=J3nJ_^yXJozFZVM`5V2(dnuG7RUz^^M`LP=<|+4D3b14B6Z8v3GsX zGc2v-M%Vzsf#XN(M5|iG0z}_yTO*v|40@TupEp=$ia*%~e=5JHfbtL6Ly{|;pT-qH zYQKHHas`R*nwTJK>iQfV-Zh1jJ1#zvOYaW*h9RpWum-Sm&iQcNv|_~=y0Rs-vw#4rI>f$PhmS|g*5 z7hn}BHTf19H7>%6-cUfrTuDG+MqzAFzVKHsL7yW~;If4g++k(;D&n+%n!vo>tY?*ngUKBf-eC^N|j_*ePDpd;tZut8}`tfWPdCmkBAVAe1 z-I1xtGZg?RVY`tB*LNp>g|ICLfFYYubRGxZDF6j^FQoxti9x&9iJ=YLK&Qka-4ghJZcr1j?Bt*o5Z(lo>{c4$xm8PXVFQbn8vUrF0! zkyklisIb63PuU)5%3UN>FxU_=WYvyD404ja@JvI*`X^-uhW8tW*8z*K7d5i*MIsEM zRSEt6WD+y;Ie-x~g= z&);+U(ahg%W&x+q-}B(3&fk+f5J#84|7HH{hW};$o~9eA`KwGWG;jV^Vg7ia81t?3 zSN_=lKjyD>;KB3v7Q_3_^EXD8f7<+AJNMA@cNgRR=J`88YH@N4_;GwcoV7;tAw$h*R=qdBrtba~ zbXJpl-Efd^TYE1FB~F{W zzy8w9UEKj|uaN;O|47s4N0-QqAzQ!`e#Unr!@0hH8@!f7u@3rt-ydai{@$3R$HecM zM-5WE6Zl5)*jp1t3@u~`s?S&Y3|VM{1fNV|vbE14FA|WH|L5l^skDl-FhyWHwMaUp z?ZPdJgz5;ILYwF&1MU%A#z*-VCI~5F+@RMUkddCIJ?@Mf8OALz3=8GIIrw$^{p{uR zLjy-Mag9-fggCu}O_!hV(#vK{xl;X;qYX05#5$&c3>~avIIlJ8-$R{${6stSTL$YL zKoo0&V-niWKYEjzJpbU+cRc@CoIVu25vNRLx4ZZtW5{LnP|C3B88MmnO#SFWf(y!m%G)!dnEUg4JOAw z%DkJ$OszEy)lUnJMUrldwQO}=5+0R~NTpnNmmmKfJ)qo!QV#ux*BfzjpUjCnwm4R1 z2!kZfpnqOiAY=(?0l9!>&aFv#7ZA8V?~($m7}-GTzvF_g)A(oHV<^@Z}x)av>}Iv=~z=nu()yqy4`r9ZnEnjiK3`B&{)fFV?tlxbsKv~X+ecRv$siGj!+*UPMr zw+h(N56axcMxM+IDyh5-tENdl0F45H8H!br0D&%gWlll3g$4SS9`cvWfr zMGA3_0v%M97dcjtg9`?5@bM~~pz|iGV7%>^A2r%w+F)8`WI?u|DcQ-;P?^ATQXq=b zNKP2A=+JFko*X|VPmhq9rFZJG$AxEX2BtITs8>cAdxu0PRVx~8%vS34Kp8C^MK=Wx z@?xJlY)o+V;-4Z4vewmhJhpu3BeREz^ zF(NOsDqv91q2K7hTWH+^xOoAhV2=V@=M^?c5?V}AC|Siu$0W5(4n$uloKIrxeqfO} zM~=!^c}Bq=(*qf&rtlFmh_+oz=b64HYmwQSEFZ&?N#<9^I?DCgFUSzQ_sOy4vW+qJ zOL?&|CrV?k?-hoX+$Uy2WDNFlGFo+`me+S%v3Nc_5qgml6WeK zuJ1OgG4v^Y|6gEk43s|P#3FbRGeJYxBHsEV-5JWh@MhgEN<_iz2ZX43o5M3<8^Q@k z%jWQCK}7AS=GZ6sqYXQw|ky~!xt3GbPClH}i zFI6J64hH2NW8N(&^K*_yp?kOG1)Z@XMpWmMo4bg1o-XTYb3M{F%fup=&)tb^+F2tov~k8}yHRWay|Y zHax4;62*Ge03}(So|E}?WA|Jxq6cPS+}7twRv(hLtmcy{p>44>yNwOlRpf&%gY2md z%0wgYdS|B22%-5_?FE21ayA0tQ?jJY+4_8aT*YW+K>s(=HmG6M3@2IlDB0)9h#VL) zuqtV->ZQbgEXW21RZFTS97itgeHQ)jCa*}ue4wJUs?#g#c{r?43W#_f@K z2D?aB3_9&wps+$v3#`2E$}OFX^4NNhVlIXzuEqTGNG4d@{gXa0Pg*t8kqtRd?REYP z^67Zi(?ZDZ&lOv0ga_#~hd6c8ur|uoZ=Xca=*#3cCs%pvt*7{gMGivyYUP0mL{V-I+{A z{6EwJ3LjOeD11d-J0Ja=p`~jW-qt1P(Yc)1smDPmd%M1QGNXq0<-`^q3!EW-r%SX{ z-|c)#mlwg7!DeZCLPEd~wp3qdtU4!f?FH7vAmecEb0DLzw7lUtRvxD&d7Pdg(7-WJ z{j~3A=E|ZK(NQtuH-8sI$I56(M)fNLcFW>}sti_P^LWV_Ej=ToqntjceU!O6Dz6y3 zvd9V+(3aR*jxS^lOuSSEQV+Ve!Z zH(>p4e<1J3&ROzP0UWwE%LiS9mp= zPhC=<9_14^6-7($VK!Xfy|SEHKgsdI3+|J`py3Lx>@Z&#>767BCS73G zrFma(fwSlT;n{PDn1xImicV9BX)dpvrE%XTSwqg#db}%llyDH8eK9?gwT29lJ(%Z2 zDB!$c6%;!S`4`5<8SMRfwoKxcG9$8a-b(S5qT&&%L|4xtsLV)eGs)!l zn=9p($=u16xrqyf1eqEpNDY@6RmWJZp*8mI#pYBA0hD22V2Q}`6TT%nYq0YFTuzwvbL;Qltmi?(G z7(%+wWzaPIJTv$0vLUjX2Fu?PxE2+7lG^ z^oyCYtiA2?T}C=MNWb`ERPgNrYEMb@e+4vx3$rc~K)uE&Qv%+B`piK9HQC;MvfjM* za=)Ry3TnYp<8KcUi~w4ubDf^z}ga{z~WUzroi}NEP5aMKT`<-+#*5 zkCt|sCE%$0a|*tr%XY8IBminOd$CYjC&SorR{vl?!-wL%YouwZlG$S|oagM5AV;@~0XgLr> zH{%;c)}{XseQe}|GDgGP8Q-ZgzME5n>(gOyBPr;U!R?_#i4xbBp^N8bg#>%;{@foj zxj#m$wn=ibHwg_Bxb&pxTfD?xp{RmDuIr24!p@T~^$ZpJ+=EB-cm43}Uk?~jzK-ZB z05WmzDCZncXz9*`QQ7;C)68}pZ<6!oHcv+0(lL&MxRm}>E4^GQWxmnB8>e|N4JtEI zX{tET%LBi%GfY>4r|Tae<6n8+mOHFxEvt4Ld2uC_eMZo!@KE2X{TInxShL`~tQu~y z+`?NxeZ$c9%#_>M)L3hVltnL(Jd2&waIYW3y?zYWet@*OT5;`atF}9M!J^U&dukR^ zI@tI@=K*hH*(LlkN$hHw1sT1(BrP;4*JXe<7Kzw_8SD$I@G>G z`>eHB-Ps|tQ6A1?CB-EWiR;@5Cj2lIxPFxLZo&?=F(}yM5fFA@=itSEAC>B z>}^X=p?23-KpmJBtli9>T`$wxc$bFm-~K zzR_Ot>AYz2543|^>E~7*3m~AUf0Rybi8Y4IdO)@Ckmr8)HC#S<3tAc z2XO5dk9=T zYAUFVJWulC`c7r~;%7+xKAUN_Uo8uN39e<&R-=!6Ta%FWtS7Pd(qj-1M zFBI<<@FT=D$HTlo3pHf(FsOoZ2l1j*U)_HDnS0lF7)=Yf`qA2|?A{d0j2|T}+bhbf z1z*zJ{j9l|i$+a0^G%9T3{(`8=k8U3Dt6Vmf=f^HDaCQn{}}raFe%pFdePctrS~M@-79Tl~)5VW6wpnGp~KHviMrYj7YuStec$@5QQ8 zq8dwwidQrvt3cyxmxmQ}3tdI7uf z5W8IRL&*3bzj^%dX}CzbpWQB_9A2ObsNqFT!&Uv1xQ$Pr2<>XOul{ASdO7{1`inU? z`A+5w)bz*chqk|j*?KCXf)19KX$RTC=xx&#R)RAY7n8@noXjw2^V8>9a2uZ(bNy_Me%Vqo?85UF1fzpEv{(@LLuZi<)Vb+rUFZPS@*JZ>BZX zhyI6t${p#$R%I2POuWHLZgLJfXI47+au9Z+IL02>nw?Et!6PgA$t5#$HQ|UX^(&MpI8t+BoT;QH;uTeh@@!Dgi z3JUZ(-2Zs}vT7u*a{LzlC=c`Ns+VfD+1RsUlfY2oHI-+8Uk91*pu+ z@q*?39ueG6v+pST^}*{|@mWn0X0?Txov8ywAPo&Uqq+|?wF~t?FzheYO0nQKFyv3s zGUp7d8`z)AqcMcai?5^?&!^-p)}@USdJ}c>pH19q3c&;g0kv*`JVevIMgsui+%W6*3Gb z@gu^dILVJF?P*X>qJNU%bjTjJaoXG$xB|N?NmZpU5^X!5`Td=;h)VdDfTottze8Ss z$g8p)OM2h?iiwaA`oxMFoYN0aGVin2G zPL3z~^TkE9PO1FnLu%-{Rr4-c$yp&0AQUFq@2tP1LGcJiV>FUR3y3^4K zZ6PV5!%zu2KelJHk)R9C5$=4WOt5Eq{x=y3TemKJNy$@b_Jfu4$l&Ss`jVOc=$ZUu zA^?FU2igz5iDZgD8HCa3+oFR`nW9a&zU8z_@z`(9mR@`S+N%DbU6+};LNqH?WXE3N zfuwvV@u!?ia#pm<69?ok*Zd>e^QZJ@zmOIBee`D+J|aCue>MRu2P*$vf7a)qCjN{5 z>{DQX-iP|XNq^?;kHyR}I%wvtlHCSWLTE|2nFNojy8Uh?UDfXTX|(1YuhgJ5HmFp9 zJoCYHV%F|&%Xaw?@fQx)3XV06A<7KO)Px=;pIuVhI<` zKn7-H22sH~f)^;%8oUukVCy;D)dD@nj4pw)niC{_X}%yB?L zEd)^J`>lP>nVCRnZJ+P^=ksaFnSEV*@3q%nd);=uIWlw?Z%BVl5+Wupqw?PZiqD+^ zvWIfY>Jq2#_RXN+{ssV**MCl7S4BKp5gA=W@FtJtUTi)1sD&su_ zA*tk9vCwcKx|RQ_sTSZ(5DBv)9qlZzxY=@p{L?+mywQ1*P)#m(UQyszvbxZx#1HIh zh4G(=Zya>xFT-Sg+Q@g-M@feT{V)`76Ej(F3{$b#1chHjm0RB@Ibg|BX>U(_f*dXF z3{M$t|nvdvw73f)Pw5(?ifeoXa>e26epGO2Qo$P%d!`(n+?DV4V} zgLz13Bx{!yyj-*|8960_u)rkuQcMRA65i5^G9dD>bLCd#_v^#G%3rCvFj1zodhH5Z zjwVtPP4R{7E)fG+7t#K**A#caZNmvpU@HA|(Va5PbATB;00@;$-pg;kTXq7Id^?jY zk>9PB-jQv?0$f-j3osX;GxckZf00jr2mT0}C*~bjW5U%a?)Q-z32vqIZMXbDE(>Dr z@hG4Xg3Drl7W3oxfKnMcolAEatxK3U+>`(nyGWKNQQ({u+kQx{QT_~Po`Um5DQ%Sh zM*Zf<|D*gqaXm;;B3r-Ay@Zx1^c#1m$VZBKd@i&Gak3%$$Fc0d>e2#M2^MH3X>t;?K%$p)=5j~{IP|EPS&ntS2Lu&$2Bx+nZ{%Ce$OaBCE&=Rb5v>$v z+jb@Kh5wXI#Op0sxC``_SASVQIdcH4>LjQqRvW)Wi z&cu&mbduGVtYpz0OqZO$4t#}n44_!&jbN9+IEfeJSF0m&JMRJmqqCyF65QhK7jHqE z*}YU2k)+WU(?|q6xeV-=R7b9YwA>!RtPF-!zPxomH+oXq4h&$9fSdXVwU_Y z<)>nR={Q-G4FsY-ZemPN-6;(N);)}ZIgF3FRK~OvY|Xr%EsvdeKU3qiq=g-Xe#6j# zNNh@?e>;^ekm)ls;M)~sNS~X_;h9qQXT?sNSo;hg`8$>&*aQFi$N9j|7JAO?ps8jc ze_$XqslKmO@N<6aqq)VHVkMB`g`bw$%ix7kt{a_u*uEu}X16QlEi*Ht^Ox+&G%Ng= zpfX)vtrfyv;;rUrzfZyice_Jo^mvJ)!-ZNj$wt9U)^ogCA|d;b>mR*g5&h?f$YNx( zbGVO8fPZ1a1eQ)WaHx#D>ANx`0fm0-rwQKJY3Z1rj7JqE&}a{DlSn@KxjER=s~0NW z)2FKP^*Rk2BWKdOQw7pdyzC@<$Z6-rF5^n7&4KYmx$|3DU7 zWROPr4JzR^Dn4nHzsb_ad)c zuTn3So~hQIYWSr-EOQ?fY_sTLdc6ZO9nSrSRiu)2|FQSi@$3B#)Ry}XOY5xn7j&rB zyMbP$&!3k`pC9SgdS}Q#otRMSKnCk4`D4S>0kNO5Ld;=7$BJ0J5;_lDT(v8?YR43p z1b3#c+ThPgDM}b;B8=i1&%Hc%xebq>bs?EUVgh{Nu9p8E^$NIPRcnBG)O~kSq#;g|Z(`gQ!^HM8w8WskY1; z1Ym0zyC1TL5&VWBWW@J8-vLiJH#-XBZ)KSUydJ9YZa;5-C7-T+R>xR7x|Gx4jPG=$ z>6otFn^PkGe}mvE3Nx%>(FQ4lNukzYR8MNNuF0Yuj5)D@_GSuIOzB|q9nc<9<-6T| z_KDI0WE(I%gDKE~neK+0GsFczMPUmp)J|!ML53^n!u88&D8=qfwjwX7w;&$}nD(CN zF#%6xSOc*V{);Q z!j;wScWZwO6l=AAU|CS7?q=I$s8fGUYS}({S)fF;gMZ?ugtT2jXVZxvJe96f@q^c? zg)JH(8_yt&a0Sn>cv^zp(qV0Lv{TCJ2(%6wJXVinUic|aRv3D3tRUZ~2L=g7_Mk$3 z$O-BDTej9o)UXOT$38$z%Ha$7r^%xRt3_v$6fi>Q8!#ZFtHIc#brENeV&vgbWvhY| z*BiUJq*&Z32*G*>GApcCZ;O15Qd|ElS@ct7dNp#^B6OeC7s_BQQxdTgjmmf}vkTR+ zWemSB#{z*&NWx?;lr?BG@E^nSD`UZBdm&MiU>))NFFBTh0=>#ME&34^1srjE(xP9g zU+~p{WCgZ1@8Zg<=+)=YE7Qy3W3R<5S(;;Kt)gPLC(+lG|9fFJUCOA5NPl z%am3ahomtv;E#{PA;lDn(T)rgl0~mW5!z35?N6mEW8{d7rGuh#Y1xj?wF1;7J_U#> z*dsCY-Ho0SmnljpDr_F4DqL|Z734V`?m<*Aw^(soHd?t=l6#uUy+Lx^)qUr>J0wMWZnMvDf5l5H{iaMGqu*SR z!)LGS_?%eK#fNTe;o)TKKZ$9xX)cFP~3n{UfdVqJ*`jp8i>UfvGZ8^Sv^BKw*ZbV)NWL5|^c#fj>p)lUe`U|GxfsBd5T( zuuf*(cj!GZ@}90aS?a+oZqc@}*+W7+7p|8wu*Nc=+qK1Cv2Lb3E5u7K*G<>`)_DC! zPL3~9muoLcX}yYC?=&T6X+=h3!q4GM!Ce4`dlo)k*JmiJ1RpZwpF-IGBl#yNWywEl z6(W8E`R55;{5$z4ln(hP?Vn8ksaVTAap^W?N3FB&r${I)zi$Z?d-_yqqplYv8rBDt7` zNl^SAZ0+)uWI}Hrr#HVb^1)t0`Jl?`;T*^mwioh{fl>ZrtK4IhQzA;$AO*xYEEr+g91?M+j zYEVtvv=Td?@5yX;UJXqa8!=@d`8+@3zkHV&NcAq4W6{hH7QLrBrTcJ3Et@Qp)%o|g z$XwvS$^wZP^L~~%@u+o~O%`2ZZGw1WfUI2kgB|lfqAqY#QYg46%O=wXTN5`26?Nwr zh$kXoUKn6*Y)3mFalatq$FihvP1yd=_k6MapZEDJm-Szw$MmIs*B;D5y%oIks90OV zCX^oW8~uWl0l zaL=(o>4(9KsMpS3!LI*(tA3zjcW9sAxNSclbGjt_>eKaZ#(M-P)!Y2~K7ZNYefmaU z=_i4_PXe)v17&~r>VNl_?(^sE3!L5HJNuJBMFX~%7(eh_M4`0S7|_4;Rcr}fCf%p$ zx#~ZdZ^M2d(chXXpV4cCmj}=zds&U}h~AuWJNZf=;3Iy;p7^x$Fyazf`_+Q9Y?INJ zGpg2u5)ywjlRHvws)|$NY&>J2;#s5`2&il$KuG>EOvR}-mpxnJdpP`uMf(85SNDef-%CL9n1mzfzlbE`%CZ% zoG3hHk89UrkBQj3uA4fMXl6WExg@c}@JQ5{bslf(K-)$~pTc~T-KcrEk z+f)6Ro#O(W+hifQVh_kPG`pJtnvc<6X5#fSYNOi=1Z+5QupRhY z($&aGsVindiIQn^g;UoPuvL8Ual2&V8S(_VN-*U^K(@mr3fU@eP`G*DjdY9gZwcTe zi_T@8m2}k7Q=BTN%$s6A3FEk!l~t11?f6qLED=|pd$zI<@LK#LTtsYq$-(--_O$Wj}_%OZMT&+q& zd^W(7Df&~_j-5I=J2pat7u%e;jE+@phd#Bhe{y!rs(%76w)5-k<9V?ovRXDT=2m># zi2Uljg26n0T#%dS%|iZ_N({`c2If{bSJg0FnJ;o6`vit;MMjHaA0#Sjc_$3>whNj0 zOaj1y?e}8qj0#)j?+YH6ug=G`yy+k0JMyN#aaOXbO5Sv#blHJ?aT++0EK1U=BX7F> zdchJFUhD@2DbDXN2Uu_}Mc@ymKX=Mrat^6ZccbX;czem!)}A=dUeYT-I&%F?JC=7r zRQw`sXfo_2drJ+Yyy-d{w$=12Ncn@a1h%bn1U5_lX6bHaMyJ58A?60dVMj9L-<7#|fc04^%*kL>oJQwm z3LJQ8Q9nsx`A`l6wzd^!p**4rL1JcySh}T|@rDE(74PLc56A$*{A{OxCYir05BPxe_IZ|t@j~zh%?y9>r(bwY5X`DZupcwQ=!LA zpioCBvY3Xy8H$9U+v>XYuTW&FDg=sL$%1F@e%8C4eAha9vC6uL6I%2{w=fAo-kjjI z!g9;r_ainB2!5)6_=S07YLAX~HD+g-^FYr4b(B1Knc6*sw-qtZR8ggQxetMZB4U~< zreU}k@(DTghIrXXHk(J6VACv5)0$gDX5x$oTd}^2oJ?YN&LMr zfGzGE>izsZp}S{YqG_wI%ZYq`f8It}Hv+osvm7HtlYPl7K?$(oMw*b|4TCbFtAPLr z5I~36$+AWl2=_@`UD6rAIn)cpLY5)evx0UqUGiVplH?hkgZ<^i71&q~I}mcPq?oOI z5aK0Ac`?P2tAUV;Ezxp>0x(kHXb5_&96(Q^0?YTwQjb2)sJ=0qz#JXK50W@N}MMB@73}H^Jc*8dXq_RuAhL2>?#|&5si5vxonl2>TTR`E~G0@1Am;X|T@_j)p zZh6x@t2B%;^2}57*GSAs%$;DUxLjt z<<}>R9(GVy=3s`b`z%_mWrhUd`cN@hbe=Of(T@1_p%MVauTL#(@1W5U;vp2j9{|-& z*sl-CHe*Tv$f}+^m(xFttwdd4X?YJ1g3PPQKL_~Wc#d_z zx>_-hI*i6`>4A-IKb#;_+3wW`tClig%#6mJm@Lyes|z5>B+qNVmzm|xD-;M-_9l{P zpGw?ea9{S!PMY(>U21L(Qcgj?3kH21|WEnQD z+(KbVU2UZ*7_YF?e(j`jP+Ury7z|w_n`~Mkc@G(PD#F?!bdfA-l-(j;Lq_?zD&bixp;)A)BCPF3 zs?F8@oGiFnB%n7H3zNnypX61qIyA4Alu^WQ8D30JSt{B1#SDimC#Iux{~N!+b7@BR z!qxsjr4~!itWaAInT1i`Rs6m(=t2%_1zfzNj}u&{6_j!KyOa8R+(WxeuTa7A@$vy5 z%U%>##BfOdCJ;gx7x5}R-M5gd4b0`@cR5j~SLySKZfO2eaZj*+#7&(JN5vOWmR^ts zAj+^y&@vUgQNDddLKcTP8;(E*I0AvRzr`NP1AGieD%NTjO3w z@_b1eI^Ho+$Gie0GELER0Erd|bMo&2QSCpW@xr>qZ8!ps^o->j})OaYg}Q+wsx3dHA`7l$XZxTNb?v-Vab9$7`(sYL9)&#?jp z6f#!HSY~C&-Eu-!2*KF)c&#Kc1@POS+-jAYO_F6_iM*<#{rW5VQCEj$d?5D$%y#?r zY)%1ZzxEL;+WI(ZgRQJ1+Z9`W^NI9!oeXI9c2%DL|9+SJo9!yQl?Qz;bN1^mfv(+t zjX)r5=(O4k74EB@^%ld22b2BUjnr?tUq527=8V*SorWaX+y?~qeywp@{V(?G&tVSI z`*k>QtNr>H1#`FSdi+=W_4^)K<>RgrVE{g1zuGgI-mozK)`r~=D9*Y@2mN2%u-~o{ z;H(Yn|G52zy#Ng=%Igj`>}*J8dc&Ryh5UvacB<;`_zkPL;FE0FLIfLZ*w03*4ZDUv znHx42Txh>xe+Mw_H|(PVp1omLsPFCZti0nk?37!i(DwMATkqBx}P~*rn=8 zO4&nCZFjUDqz7dWy^jy%)hrye>}o}JJBdnKbXc{|u>9&cnC_CI-{AXE?koI4Z3i=0zVRv&^jhDtrC?KcuW?F zS*8TwRIQ(4w{ATKn9{EKOVZl4_8KYCu3ZczOK-Inp_f9^RFny$+um*`ZZ%FA=af1z zz~{hGvVQG0nbI_k9>ien0H5}l68&UA7pVbZC}E98&E~_mOCzE~ooX@LnX0gW%H+n% zwBM?}x5uCFqMQk>`$LBOQ-$4x-BX#kmfr>p^ zM8q+E{jiFZLP=v@pYXgv$l=;TtsEM}N0Cn+)x*9F)rl8xcG<0kOyH+1y-Z*w%fNf* za+Jsfo}wDWfEB zuMz&ir++OXwnnjtU`>iuq=EwyS3o>isM?Dr&;v8p++6Vx$3(Z#oFa7I_9G%fh%^T; zp!kslUI*fEYb(H!d3K-xw^p!Hs!1=%T|ibbd|-nU*H48aEXEH~DIB-Q<2j-_>|i~; z633p^oR0ShR#jtwS7bM_F~#yR*dLqIr)*o7$XetmkOgq$9# zMMqgl7x|2W{)7ukx3tm+EVpaFH2^6_t#a5_J8Y}J>f+JW_Bn`Vh2MKP_yoDP?J(Yz-#Q8F1 ztV7fbTChF`+S@Bw<9U)oAcTK75h%5&=!?C>g%wsi*Ka(4^U{65S3#izq1U~!zWfza z(0X6&N}!aUhqJI9;s?{ah`+tu$+@v{9qd zLJgd?KrtEUAg}IbhMVQ~foF)Q#Jnkux@|A~N~H`#WQ)X2!Q8>d4-{<*KhU&QUN5QJ zvqm&R$HtltU*8C0_aql31#mCws z_5O-?w4XNQZsaVMGATTn~v|qj!ZDh`UNx<0<`qUgi zp>%u3DD0P7+x$p;O1A_rRJBj2FQ)dY{u`lB{f2M9zv2zdm#&ge%bqCUYO&-uf!Kt$ zK-nie4`Ul$1@xnV(zgP6Zv|q7WCTjz4dlHWIQxsh*+&BvUxd(WiVag;p)}dxV;fhz z;TIz6kM%1F)+`nH#e7M@{(0iAfa`S?^yE9m0ew%Pbi20b6ByM%#oOBA9m27S2ErXa z+PQk(6~+iiXHaMiu_D+S$Pw9g(k|At?A*fI4Z?A;WOS$1{#vTXG+*hPURSeUADF;s z?%v|Yv2GWsM9s)0M|-Rx|GLWX5m%@)h2#YWE6CBH)HacqFpHiVh7q)oJiiDkZ=IAO z4;6WFF}8^c&QE~1G1 zUzT<%GJ+Yd>7pTVsTmp^pD0QUc-D!8+VJUHWZDMDFSirDYVS!+^~(BS6a?{eB~K@Q z56=oGm3&63kK?p!?ksGgu%x34Ma>0khm@YgL{~n3kdaH6^whJl7K=A812KdTBDUhe z;CFqIW3EtdY^n=NB8M*s-l(o7k;4}TCnWB3hewoL5Sjv#`;0M3O6D-9vu`Zh@N_<| zMoWDaZ)nl)(NC4$c5r8so6|(jqpcoM;Epu4xFgBDxpms=&92QxuSeWj@6u$IeuPkO zp>43XDkig>X2o&g-k@VcFew%GfLR;ht=$)zVRMH}oIb9wYRUXQRZFT*Zyep1V0`8_ z*=$5*E|#W5hKt!~d;$&0oLKFURG2`lAO`Bv#xQ*jV|t$u1MPjTJ#~RDl@G}+l5-K7&w^K zB!!wN!|CD*o$Fp@mDEYLEV?k%Ql$x)lx0eYdTFUv%-y`kwJuJEWIzn{59er$#EXJ+ zWmSGz9ruxqTJ&oY4(@VmOB*@*{wF{3YD?tnJZ*8QG`^~nCyHmATv?#{l{oUeZpxd- zmPY_e_3Em!%^t#+TJ}NO>YUz@x|T>A^Hu&wjB>c$#5;i{}UBG0?^I&a0M(7Q{z zI?+_k80E?~xc?^b5R4-Dk^A5dfLR9;_v-GBG=Km{^5)*>UI{4MLU#$`XSGznleo_U_997t&OYGc-vy?#MtRWm&M(4%+u>=y9S?t_vdAMK|g>NqDPT|Q` z;RBbb!VlYpyW6oPub?pSB{nf>i61ipp#d}!GmCb5;L>*bJCfgP9DR%7DV38R>^l8l}uIJFt;|kKGIgGMRrq2TYa^w z%D5s`2q%)3$dO?l%21X<^%SaW&2i_}&8wo@e zVllnOdrD+f!sA(H!lyS%w>K~$9jEaM}G!;rAxN#i0#@#efRdH;~Y6!Hl$bvtuBxo=f1 znY>TU)1v={e)=MZ>GqF&v1@bu#+a}CIzcAKO1D?B;5X9dF4~lyuaLbVjY0+w)2L7* zirtX?ufThgLhia9^t`cZ$)r!Cbp*Uq{eoDF#9P~IxS=zRN4&b)6x!UTxwtnjd`_#NAQelgln+23q# zsgbrxzWg9I$+Nk!TQ>=+eiwYMie!5;a0-IDl* zDP!Vy(#FUc_lfrPPq0VMtRFCPN-dADn}O;$kFem?4BRqZhj6wxL+%z%V29UjkTn*} zkUa~nGfTA?sS9^#g?vtCi>dpOnom8$CYgxG%b4es{6^;6iD5EVaK(yY@~C`v7{g?8 zaz~ooS}J~6626BAIA>xFq`Kp&E3I%W*0mrBq>u&3YVyS8k5>=vZ}POMPot(q$=KpE zhmjFkKX@`hy{rZ}=Z*4*F)vpn5QrPcsw+qp_LBlH{7{qUD`~|Js@T19N$4weqc>|w z)%V+h63?iQcPXe_;`u5avM}_uYBVv`4wX2tK3-7JN)dfOg-b3k2ruz`ol*RlB72Fl z`gqTR{dTbeyI4k*V;NPFYL|LTugldQsmmumOtan`X+AdsiP-9i+kLGL7amL{5fkeym5f6&HmyFMMH;y?a zKXI{)=AJ}f`7~qiJwY)owBOWm&SHmjU8!Gjg4a;(^#*~H1pE=j>b3y*&0>Yg>X*lN6$#>r~^9a-Iqn~Pg2 zi}!1_L!rJME<m_*>J9|Ah2lE%vtK7XO3e7XKf|E&hkcE&le@;cBsYQq85Lv zEPm^Bj&IhUqp0hWEAt!2o|11$Xbx+CWXcd{NLW{i#kl}RaE`jx`(p&3Fv_pl$b7R9 zvc^R0SLS-l)lbu}PiuBR>ym?9$i>0YxHR_g8a2&Cg^fQzd~r9=7~Vr0zj`g*MsgE! z!W$Yr@49&Y3u6sA5Iyh8DJU_T3diB4bq&@W>RD8+G!WKGCoQD}ESqOJhvNl3Ih#X=?Yy^rN{pUToOlXK7--CG0sQ_2*`w9uQ!9zGcvB_a??(} z={G{niEb-h`~r9qg3rk)SGwE>Uv-5{HN;DtMim95<-agRs?n7$1m)|QD4Br!(G@42 zbM7aMRgL*S9q;f$YrN8^J=|g%mN~zcvBS_VXMtBZpbWA=F-K(N0bvhWMA^=OX-)?N z6n$)OgLUCy%5rs5sm!M7CymT{1s1 z0R9gH*3^|b5Y98x7nq%8)-Wq{RN%?mSfy`L9d)9k#A7~Ji@&0dS+9c=`fds03PJBi z;uMb&%29NAM$#Xxq+TlNO|=P@k!10A`@N;dxGfh~_rhU2*qhIs>Ruu$G=B+5aD9fG zcUS8suhS1icJz~IMP+qF`YHN!tsM3Do_SFH{cOYZrP_17y2428)SjEzwG$toOxNz% zIbECj(dXK%kKTs8kbk!Any$UQo*Z(g?jz^pb~&%3NzDPfLQhkynL72K@==fdz=PZ@ z4+Q&X+<(e8hev32+T#r}o5^~#9ihF@vJ``Q0zHFrp`o}XH&F4u_EQMJbiBQH!pP*- z2XonK=G!cSKh{NCeeEFdBG|h>QbFu{Cvg@}VrO!?M%D>-8=^$^Ecd?XC}w!Q+ZE9M zii~0MnnX8;L8kH9Z1xsH;-jrE=EA7W9WFga@1PZ1JCre=F++#sSplMzj;0y?(r^l< z?oWQhZR?kCwBLB5e#xr;6IM;t-zfSeFZ!j8=$9tSXNUTwBR+jwhE|E6{|J=66UckV z_kyE53!ME{;Os=8;w@1zHP|YqjdRvQs5uq3~7VXDsY(J@wHiyon{puy^$p9+(bTDvIa{wAaOqkEo7lsfoHFOY2F zVIGlLfFFo5xpHXVy;Q4Rm@j)Fw8lF;u)?i9wqA?gN{Wi3wS*6^af1t4eQ#}bgU_hp zpi1gnDx(MQzaVjQ3SW`mLAM$_`X*5ZAmqxMbC&t4!i_Nh%3=P7lcOzGhfM_@c%?MY zK^45rRT)0ER{Oyueq+uet^eJvbLzDA7s)hdv;Q(BRixPVIal+0;$^l_Q7HLFk|E`D zp_ZyBw7eBs-l}N12qQgtn>=~-ZlTOQvO?#WeTpd(OTaqM)K>sQK|%ylGo$=&dg>30dAlJ4Lq6aC+rBvUP277g~E-#Oqq^*PJyd z>8j9JB

y_0=z#pO9qp&%l5_j*fa%|5Wrja$FK&BRyW)%|c|4#9mvxl6qGf1;5cZ zk2gxL5R-_CrqDlN--U zhrf53i|Ia%K4|AMAWM{3{41Zv?6r~IA0o0f9uP^nHu_j3iJW|qOkRa&jTZeSs#9%s zVRZBToAfP_-NFu3f<&#ChmUNZQ=zS%2L>T^-osJf6h5+l_P4dw6S5<_yVmdSS-+~CE% z*m>~!)Aw;Hceb8Z+nwgd5k7^1cA9<8^o7Hxl!VT3#(RmHH)5+K*ZGpKEBlE+DF#}1 zFZJN^0V>~;uOQfwti(bWaN7^n5jS!5~YCSN5is_dvPseS0GdqsnjC9qE@lShx zQl_^IntC8HQ1ypFnJaRH)}NH=-Siq|D7yCL*5a(4E-qaEedpE399nm z)Fnx)6-8g-43e|!_aJ+2tI``(`fa3J@JdiQ2|nVlII2bDVhe(v1@7D=(qxPH$>SI4 z6XZp_xrOFH0!k@Xhy0mH){H2 zl9YhC(X+(mT~k7W{Ga_0_8KpHrKs_&RE%GZ*|0aFl0d6F5Vd$?#sn!4ISfV22Q1|J zE(d^`EC9f(n1Quvkw)4C=q`2I_pvY(%G}9pl76famTk5N_#$bT2L}h6%V9&c+DQ~f zg|0>YQp+lwJ`4Q%QQ>Ms6!n#E_qjeaNAL-Pjd6{jcU(LqvfYvuU>1i)odlHz;k4S% zkfvwi_@Ym^*CVdbYR{LZBFXI8GKHOh_Gh#~$em+^-sxmwM+8j2qYM|tfR5f|KSpz% zf)#xGN0)>!>{4y|5+==P0B66EmAhpTl~qv{91wj!L`DNxOOsX>}@Xyp!giNZKD& z+At?=tfc)!rJd)b`K7&uDy^rJcD1D4rP4&_3)B{{(Q8<9^A2PaOtgokEFVLmNZV*F zx`lF)HpVlCT(5Ce5|f5bJ{Pf!ni8cB{cCa?v(VuXX6}(jccktKw1i#UuvhNf{aW;I zv{1R)<*)cmi$29S+psGaiu>h&vu{RI*rdDA#J6pqGn(w{GA~A??w?&r>ezO-BB7n0 zycW($WO+*KGoJ7YIp%DIy-jMLb4&7|{+MDVp_y0r8IRs#`bkO?rkKrzU{?tZF%L6c zJWnGFTWT%z73`DnP;}!D0Y4K!0EK!kFGuoG-OrwHK20jt1=xY$%1u$#GPWS0sb(QR zl`fKrozp3@Td5*1paXti3#C@1{d3VnPPG!p*17tkpG-`&=B4}nDwx@40xM~DEi4_2G{3o}4lAVA(my`|lZHnHT1XPP{3vxr%V z&MRHI=k1v1?F^3~^`5C1g^k>Jn&=BZKr6wIk9*6H?H6{=dfK(*F-3@tk@qXth;F|x zQhNM+%6ko!XKV7qmx^;BamK#JCg4R{P=i1~sNUr=lSO~U{)MbHWLc?Yn=$()ego-c zn-f1FuZmXF)d-nYpDdbZRomfII|ljH-@{&+bo!&#Ppm9%4j7QAC(Np>I^Ae4(UlS} zr7CkesZP(aN}M4juBOD(lt}paIKYPu0>-xpx7sds`dQ7;6Zux3!_vhVAi=kGB#Yjl zBrP0jm&Fa1F|M+*)=L)j-I@R^YZ+P2{h|H+dg0y~au!Iaz^^&p=CMIuKnuYRCVs|X zoE&0-KHNi=D*7y^E4<_~Uc8k%%W_a(3h;lASUpiLY@eN4w3C!|al1OG*pu{mtT>E$ zr*l#BS-Ll^R_v$D+vS9S-*OndH0!~=;eJJt6odDsFdlxzbex32dzj`RF*$bop^+x0 zg_2@1dv9R9V)Yz4*Mygo9Ea<3K#HQbkt=*vR@Nx}(Pw2^*bBla)rx#MalS7WV%U?o zzS&ZC@#bB)UM4dwSx>eye9m!Xgp-#0MR?>{a)pueEYL8I9;6KWy@w=qB~%gZo~L=d z@uz3+qO&zGsa5gRxnJ^9cum-<(egrH`FK(LWO;Y_U)e$T^OBOdDm}lDC?iJ<#mh8?|NOH77l0;Y7p4A7^B$S7OnPI(k?Poo1Amvk4zroInu>TBx7L>N;|oKJRrSB zjxEp@W2>3P_0Ct?Hm4LLqpsRRKeXmVNxAd3ihm(*{aADKMdB=rKVFy&Q%YO3fPc-N zjL!m#w+S1(k)3T`?XReeTs-}Uj1X?Dm2qrk7drc&pwd;(?&V+qvtJPv&;Km*)}!iK zN;dK)-u}>bUqwssJYVS+$DS(|eKrV6j?$ynJ`kf!Y^5vO=6)oj)uW1PSj!-iFSaX| zQ_Tu^d{&yFrH4Wghx$aG{NP)!mjQ|d+QNlke^pH30b;?8Y?_5fnrTW~bP+u#&X9UC z@yBKMAQSX%fB%uL5A9-EIy0gYf(BoA8M9B&;N9j9v2cxfmic2-2dmhlmJ5DvE6Nov zrclg1u$##irP&LO@x~sT$I{Dt5$8!(EEML}mV66A^7$}%?~5%zKuR@tato=wtWwLt z3%TD($zTx*xf2M3m<0baqdIG4z9JVeWAaPHZ<+bFxV6_T^Bcbv%F}*)?pRKV?s-WW z5+9>qly!9dGhbwVj_mEPLLVl+k0f~-+QL`DK$k4K4LY8t4=MVud|;)7qW;HFTIU0j z-?F8#WN`={RNzrwkoq&KEx$3Xnf*vG(qr-3kJVf@L-&JwMXJV|RH7N!>McdT*j6}K zOzLR6;u2L}=Tnt223D{Y zRI-sj$m_lOWK=&^8pm|+Oj$N5$EdVWpVwB@{Ieik&Zb+C}td5B5iug!EJl z=al6_xw-;(pi_4u7DiYzU zJ|4XX?eSk(-IA`8*Ok?|Utou&_zS5p0aDy6H+*DDa6*-FV+*k6&mPDZ13B8ax?8y6 z_lY8By-8lHlFtY?>~iaG*`4?f?VOcIGjE|LsQzQ)SQmza(wzf?#7r=i&(Bz%gOD7X zUdem|IKUG{zoNPNLIwl;S=FI)k*0I&A76-?t-1sOAY(dHWI!l&+22_u3JC zt9#?!Rg5mko7cQfZA#Q_e1_|5%QlzQg%9tRqwINEQ8}Qz+Nh1HXvTcXYuKRgoZLX{ z24?Sz>a%++TI4Cd1F;^=R!-lXmJyuC zkC9^6fH;mpBK*9_NHgZwU-6+96$3p{d-e^lV;khn1*26j-a|XIu!zZQ#Mo?B@k8}i z-JKQfJ0;ZBE{f5*I^@rl9(5nMa6nt!TYdolDN+`JNFRQaQH^k8L_WWB`5kb*&jmYp ztIrtHNx25Jr@v?b(BcKB`i)V^@b`Krr*Q6uKH+%76DbRGYrm^Lc)e&^JxoxSwF~^F zh25H!~qDDl~I<}B*1@-#y2L@|>F4}!{v?Kxn(UL?Zne9z<=7#ES zqr%_o;#&J4XX};(+(9F(Lo(QhO?_X1TzlRnN!@CGeLk0-gD?Sp7gv_eK8*Mv*1f&b z?UiU;{F?&J{Z}}Bpi+Blu~FAeB~fY^vEXmU18$J zvTf*x0H`k1E#Xf62wtkKevNl0d4iyUW2AEtKmzN|UuS1UH~2KqeiaHD;@)zWtluHM zUYX~JO$Lx;Etw(@=-A^~=bTS?W&MA!Ugy4h!g{@S=KquR`cnI^*K67qwO-%))$!|9 z45Mr|f zP6uapo_%IlW;y4z7Lg;vI7UC(h&#%`t+U=idcAp==dEhtla>TFqs{HyoOt^<`U~%U_gnlk zZL=jG2~_N@J_Fnd4rs=7uwBE!U5UO+71VSIz*_A%Ir~cZ2f;`c7u3l5K520YZkj1! zO0k-r_W9y2i9g$M_HG!IO#!{O1+P~z@V^4V`oHBMm>4L(b~?U7&xuWB1&Z+C7!NM7 zg94?WR!^bmUmmAup-hexT~1NT_3+uxy1H?z%w@ik_!_o{MQ(6E7kgZV$7t2sjU+kX zT3X_g-?zH2JJNV-l^$A;e0Dv?k-YCy3_QsH|40+pWi*j2I@{|05&M;$ZZjYd?uEzX z)tuS)uI(jIzLI)i$2s4W5NUV%eH{1f%x3F-9h3KU>Um$Mj`wxyyvA60U#GxF zd@=vXIzEX}UZq!!Y~U_{>`UI)!B=$d9~0R;yM~bb_BjK!=RU9hwA0Lk>XDsKd)#^K zj?yF66FXN;*C%#H<{(e(Na6hI0`iOmfOG3i?3^gGpT6Wv`0%$ZuSD-V4XD1Kg81eQ9Q)!FD0B zok!fRMY~HEcE4LJg&cOsSb<}I3{Sewl$~xD(4wp4hf#hp`3^nJ7)ElyCPcwd`ZbqP zE+zkAUaBWR>MMlQe-B4Bu4jkyXAk0w>)GMH)!l{E_fC~pu56NS-Oo0O3WVw9O(%6f z+obMi4$P+m&P_kJw-oQ+0)U#IPDIfx)=QIRCH+L&~~xOVna+S=Or@;i14NFRFI6bfz; zaKYYSOxgCR*b2n`otwhUExnj|A$njSGnR>TFQTZH^dmG2px=K^F!R$yfBU|dS#+sg z^i6>|iQlyf19&`suKK&+CqXd4PjUEj##PLc{g}KCakCr%nJ_a*1;%3`sk+aCpVx3< ztQavxi^`R}3i+}^(Q_=}Zgsbu-{ZI8&_83sS|q;J#W@HMlztB6#Mnjfv%sgn3M+z5 z&8yWb9H`C&sx?1Nq3EAaO-+<3tB!*L|5<37RAMWp(R@R)B*4h%LIHZM`f2Th$k$)b zeG)WCV}e%u9l_pxBAv{@-iKdLVee2n1$(j5R?$fB!lH+_mZB5@fsQ^)xRW#m^v1?< zzaN)djcg~^6ReQ)z&@6ta9e?7$H_fLD%frk)gg*l3 zL2m#QmuZ>czObZddr zUC7Nww=m&#ghmwOPH~E;D6yldy#exr>6J|)&Z1(|BPoLSQg>-Km}?Cr(f(lG2jv7! zycx$RtUlTs+CuCc>?daqMqTBf}1ipkfD94*Y|2$z?T8xqdLV~l+T3zO5d#mmXU z!>_6#JL^iEFmY>fCtJN0N3_TrG#Vb!gPpOSFRw9+ZBPw!drXU*N~Q3KGML*uzStoI zW@Cr^Qp(wDFNfWsSM8}KHcQYJ+th(65Mg<5DIr%}5+~&P+qzEks&vk~~7r550 z11^hM+4=T1hCY9fJ@nenq8?KDuaobOO~Z=QD)SW612K^K89|n>{ z*;8{38|jlpcjcwVy;-I)%|M!BLoP&7YTPGlBm^^AG%Q_XIVIfnpXIv4 zdvKg$T>x^){9LnEYFc|(i_ViD+{(*IS8lGB(y++t4Oo(7aRt%vi(#Mo1$c^?DFI* zJP{RVu~hS)%7;<@UV5J9+Rfu@4m>tF5GNp-UY;x(WH()}vaP0TZ=z}QNmXX#^|X({ z!Sa3Tt=UZnB*Ms~x>rW3nfy6SL;A!Oej1BkCG-gr6Lc;IDjH7&K4olfOxwo=FNqxS zi*~mX?e19gll!a7(Y?8*gf8Mxm!^3#%&Z1yGV6f}o+C^^Yy z;U`zw+8jE&i%voVMbi0Zg4Zav1^z)VI8(;kuWnLtjJ)mF&toTwjK;cAZ~gL4C1aSqbqwm+hfNhgh`a zM=vu>*~9>fu-76C-_BvE_C6BoIBPFOaLQxvPO^c!| zVB5NdrM9XHMfvz8Amnsmr$0bdPN^HIW3k}AZi>V7rG|bLB!N1QQ^&lXN=`!}9-AQz zSqDLx14E{G44aU&Xk2D1MQ|>p_5rAkeF%Kf$sR$d#k%Qh(VwfnWSx;2RBX~BIthpk z{95e-$+9E>?9r{lqxJky7?rK?Am@@P=Lk`TZ5~Z*`P3@PnCbUvm{$e0xl9tQiQ(xl zCY;=x(@;%zpwenDwF!%o@yGbpvU?&Cn5y_Yqy+l9}Q82PL!jka|62QREkaSCQ;|%=tf7k=B?FxvnLamBH z`Gso1T5@3zzm!o~#C@^LqLsH>Fo*$E5H`;gvvX&01&^-;^X%oBNEI8*3vI}Ie4!wR zv}?7eOB&JbLIYEisUS7V^U`e;+THHWJaQ#03tjD6lj_REc-(x)#^TrE-;}>zSrROs zpw%k1wrt21R>dM2Ru{favByvK{$t@Bz}YCdLY0z5kI*a!MD%`g%$W*=P%DQ>@KRZZ z;O^8i1k&IIW#XPrk6^sjM(z0&0i3IY=VeaU+idP3cLqMy&f^7hDhK8Gu392C*kexf@1BJFr71~PZ zCwxAaDX*Zd0)C`sMHZ42KItv=Ge@*=Hr@2+&ZV9T$Cou(wDMTGr&gg^O|@R87bsx4 zo>kUu#l`7_Q|M<2X3Z^Hp=w?$G-ME3;bSw@pU1_zQ!AZZN1zq1 zT$UUrT(b#+D8{D<#f1?qX4bwW{H!AWiV=N4H6J7vlle!5Ef&d;Rs6dYv`EH8N;#_- zRmGI7_q#}V7f}j?=($`3YU;K041VJ{dGFmy-kYH-peYsyU4fFS$q;0(bZN7M`Z6+G z?z=jz!jd2`tDXTgh6RE>|5X|^Q_xC@p+l!7%A6CzqVFMP-AUiJ1iB|jNhnlc7c&2( zs-_3ueF{BTWc#{|9u`Y6bZiUP%T`NEmQ3-V+}-hQ2j=Hi4~3?_$%I z1xmkCc-kU(`Yf6L?3(3NB6KZnsdWHb8RDa>aJ?xS$QXnd|GkuqDPUD$@wBqATKSx0 zQHAkF52j}1y(7+yAUJg>V6_-Z|YPZ9c?w!AX&}QK2COkAeHXlGqHGlgRTIaNyk$O{sgM;kLPO zG4fg@4th#a#MSRF9OnAEtZhopKPZhHmYwI7@aORuMPzRNOf`AK!4{3nal7+xjG1KM z|M)Oh3H`7XjFRGwxmLO44)r^wTPfF=X2gh3{8Dr)@?VO-_r|V*XShn~=L*r!-9l}( z=lXkN_X{T*>}_v-_8g&+RTpPV7y6s=DV*riWeTLTna|UT0Tb+S7PcZqc!Cl`ILm98;IixNzliOq+ zn3Q1GRh`TM!sVo`&bFDoBq7=0)vqcvbNSAYr`q;1UQ{{pxgho`*N9G9^mS$yvjEm^ z*UzzvH>RygoY`*uL}Qa{FT)eEc081!oJrO97<4OR;0GmuE=Tn&WTkvDM?P$RMM))6 z&fo>I%s#cujA++NN8f&_8KAUUz%;%HeUdAKLOhC3{;Mi(Yg-!m1Okab(D2HzFGc*zofR*BNSjA$0f$e-JniN ziInwJnXC&a`o9cZQD>26V1Y`~lm|$%$nr#LuM(@9ZoVerHnTiS9?UJXHhQLhVU;V9 zNbklBe3&RVSgr{vgO42Ru(eq;1nM;;09sn0UWNGGovf=u0FPg*bwLbE*T&ej2-=5g zi?5&xg7(-Sj}x?44?)O&k0UUE^|MYubsahI=hT!e_-Bf}94yf2+pECV_e6GXN!R*H zs$x{d^GF!g&XSVR+6fmyjqHzZsT7=ts;Y~1u*dk0a*BlO5JW;mB zhrA(p)yDB6PS7fn)&r8qokFXM78b8WH;!XMK<`5J%eb!$=Nz>kE-8 zSyMPyCd-+^{c1&+!UM09%4O`aI`QkQH;Z}sCE6S;)g2cu$0Jt^IEKIcJ_XULbg4V6UNYuStDPWeYBP!IAT^un z&dh43+qsi=gj@?hY5FMJ5p-+QGci2fZ^pe|%~!8=$xf-a45?R3W>27L0Hw&6{$tIh(2WUcFJX) zF+TVY{)&8LlO$Mmv}g~DM(uwpRqxOI&tAw3o^uLh!o6FJEf-5gqnp#nU# z*iGZ)PpKFbx&^(t`1PVgriT46c}BUn;Jce>9g1R5nTo+MPF>C9u%$j88$k zXO!vMZ~-}WDrVVH3Kgx?qPDoK%s~oEzU&xrLjO@NsDXbjeHrCdQczYIJVX9VuHB0* zIkSRlC5wJRPGTOhDcJqW{&i!$*=gnmW&djSxbtwz{`J}n`&TJ^qWvo+zPbIYuwydp zkXOZ8z1$ss6_oh8Z}oMs`ma7O;&|=J`f8t&y>|;R8X|4yqD499Jq8*ZlB>q`kG(Xb zuTNxi@2S#T+fT|mgyT6|<+}F}y}`pTRzGf_&PnlI_;G*iawTdqSPvN1Tpyl{zNS~% zmE2C-+VjUC>iKfc<8BoZ4nbl-@)8jqm`$C0`h$hW{VgaO@(Fg*RAsmsp%d(+O}O&p ztN31pUJM@w?f0`*sx>@*77t&-E@!?d8N*!nc0f zN(|mbeRyXlEPA1r9mtI#-5%b@#i~u#CxaPIwmPi1Fw;Hn zP3?)U37eU&u$gIMS?6XYN}b}x6d&{(iZkJ`fbH5GunxU-hKzY~UAXgY!G|Ge|e2JPqJgK^e>2;7!Nd zV0fmt!5bV@%DtdwbD-k0>i*(bFcQatrsG-)?l3Q)sQ?6zVIb3yYv9?xOilOsWSZZH zj)U<%-%(f6WYLclM>z6S%<9=Tw{KF)$6vO{PMFkehZs2%-Xnb-IjOvucp2g`{rRt@ zsh34E>0TqZ9AZv3CyT;tsDsKo7^(2&7G$X+ehS`%+xrq*07@WTFGQLph)r5SECX2k ztA*Od3=!$EVe*s#yFB;njj4AJ5Jz24mOoZIgFm?76Wel4pp-wMy2M@hii_CFZ~R$+ z$&hcTYv`x(cb<|nL5a5H))0)VQ+A7h95XC27ver4dJSE)TCx2z^XMD>eKNn1q9QcdJ&>Ja@QKWJ;nurb4i5D(Xz z9UzM0g_6?AUrj%#b zrXi}>#;iH^&b~;(HM>&vyoiQmGD;wQ0q{oVB%rqiKk#NN;ktRX8XfBzo7`faDRT-V zP#dBen5R;Sr~)%8No0 zr_Unc1Wdxx;Ye32UR9eG73WR7RJCY?4>og8_?Y`&t8xO$U7-TX!Rc(D<0f}hW<)ts z_seU(X_U2&+o*T&IEY3 zTJS8ofSP$f4N8qrkOj(&tXN9n9MZ4NCN3voIaA>k8xp6J)rrEq{G&G{PT^NJp+xhV zB=8?{Rj~uJ@6fdZs|-)@(u$dQb#Q!m_|?H;wJK^hRro_SABjO~Y~+Vd*H({qNhG^^ zE*5^-J{A{}7^o_84#4(s(N6py?%oAHs_NYP&yWC7(Fv6ZsMVw$6F z_5dwf?=7cZYFjImB%)PHV4yN*oKsFOzMNCrm)=h49owpaiWx{qK!HRN5Gw>wm=FsA z3j`46{r=XPnM?v$+tYsj=luQ1Wbd{2UYBP*_w}r2jpxN)dU3gZu@^52GI=kiUOYH_ z@U(#IJHX2dC+?zGx3r=9M&Ko>Ab8n2%_(fr?}?2&kzQV8D*LCuz=G442cZDqr5RD= zM5YdLBDa+|kuk#@LW)mtwYy5%`ZIB7mLm+`X*4I@FdaGeup3=v`wVA)geeM+KF!~@IU*#JGnY-wG-c76ph`=wR0LV zN;czGd|SRlQnS+4=)V52+=%e8fq5hi@Q44CyZx-3rC6i-?L^E1niDZ!`_Hz|x)LXz ztix+?f2zZu0oPCHu$rBH@!!?wIj?Yv8Z@Rbhi^(;8MW|RySai`#=k87MP{uZqBzO% zmBxhPdyPsiFAz%NTwGf(e;|WvtLR?<#i@9Km$gi!1U*24|hSSCT#N(%seD--1nNaj_Cx_{2CyU8Gl&4~4vT63u>Xb1` z{`c8?x$r-8Hmq_P;ph;cl5b9g61STar`K>d7E0W1j?g0ot~li{>G)~O+iEmn~$u5KHzB9<%$qj`%==SZt+%U5Yq z+xV(?nf{H>^e=I;{*|Ase`V_5N&A+D&|(n|I-8(U9+ANW<*_d^`D0?U{zklz3W8 zDkrgjc0Fyd*D{ z)!EA6^a(08CpP}ywsV0VS&(Ov)bPEk9l=$G1L7xW`#A6yV>1P9ALfoyi{k~{m@B=P z%MD2@z0y5ouHQp)p+ybSs0kqGn-H5UoNMk$IBOBTMV zC$Yj&=AMYgHQYm}pKC&@F;^L>_Gepu!D@ZCRXHZ!uqB?}gjHnTTw!Xw_RJ@YHh+`4 z5bJ#%Z#l8=4PnTsXhM(WO&(mfvd8DMZM6-J8L^74Gnv9JQIJ^=%{qyRcwkMINInoXPl(@OBa8Mr+ejRRS~3+|`#*2a3@HVFtsIAX1_Qt?Z53(c|@o#`v`E06N-KlYfb0uVA=PXP}A%t|D4{uAyz$zznn7VpRGkRoCKe-5Po%q z0pybg!Z*!Zb`4D=3;+BU)hPlrI&nxS`VGwGQNz6G6wVb-vL!7Q05MxGmbNYGQ^Y1s z!Vh7`Uq*9)!KP&60K{-+t1A& zCPOb_=$JJcE<#^ZY@-~r&S%M-A!8Gc4O68b;ze`bOxNbCneQajbpkfc!Mv=ulQjk8 zB1sDcfORrp{`?S5*G9{DG*He_+r!Ml&lf)>5Rr?nwXfsr(92H7pW{Vl2jm6OLBeGE zzks|*`L6#Z$IlrsL}rf+EYO~xc-@trj)9L~?gUB0pn`!;kSzjayyyQn-QZTYIOzrn zu=#1AmFhyiU9PXuS^SaT4%s;Wihmu!O~|)Z$Jn9;(UUqd=&_~}zkvE|!C+J0Dv$eO zvS_}_>8M`h@j$aGD~`LtRjw}{@*VbaIr1K_lI_yrOqW!kE;*532R7-O$UAQEy-@Lc zp&;i+{yNY^nd^HeM2f>DYwp?m(SIL#&DWIG-^Zy$B%`Yf=u8ybA6sDiv)l=8_KN8V zy?WgVvYk2Z`L>08>ph%j1}fW~_;R2^(ij!cg=Uk;%fDJ@D9`uEn;AUj6~E1|6L~&R zM>jm*ZpZhUv-FCx&^zmn);+BoEbI94fa7bBKQ&$lSkM|(MmMOs$q8<9iaA$cwOh<# z-FF0rxWVPFk1Wufn4_uUyODu~u5Y)eD$ImAk=?1T*#dPf6xkUH9(RlP=$A~XzCF&; z=ii9T{Mj2%vo^88^^wr^0H<46fV{%@^n~_RKu_q?Ixo1+E8a-w0E-hm;`m5uwBPl; znL(4iPP`F-G-lAGlhjZ}j(@FCY@S09R&bYBtY6o6$n_MluL%w>~_n!0O;O5@X?CZbpR^4#uO1u&6|1V0F6kkanNMWEd zK){g^&7okkTU@71uf-d@;7Z45n=q+6{Oeqh6Y?Xxcqa(vMYe%f^a~%kz(Pk=K)(*t zS5Mv8rC+Aacg%V5`{M`y?x(Y^|F&+F2YMgxLMn&&m~IdWrvkchSb3(@4am7s00}la z1j_lS2xJnaUg@&SIbL_UE1FQjKuF8OTiG0nI>TH)Dd4=oTpfQD>~xD0{DypMLcRuf z@t~Ps-Td0;&i|Ee)CUn+fKgG~1=QveWJ4c9K|CEDF6vV;J$5p>?mFEMK2!s*x zT^UOE0VkIV=mSTK*glk}`cObeL&4UN`q0WuhJ20g;t{=ae=`4wu3<# zHbDxGl}tbGxD=b{&ozhXc;C$AACUxMg#KaE1dghYV$s zXi#VgwWde|G}zz-*MgAhmPmuNUUiNyAw=T*a7Y8nvnWU;jta6#gQsA3 zHkS|zz$IRs9C>7a^_|P6a$}^lb_ipGyS?Hg{K6Gn-+E{1Q%{^zcKoR=wcHrmj*B#uS=BH~ zBPI-aBEa^GaTXKGbjT@gbm$K}%D2l%jub~oNe;eBaRl23FZ!7&uAkB)o|@mTUx-=~ z;}aihyy)kB{`7q#F*F45B1NEJ1C6Q-?qE6+geGAVuo)P{Au$gqDC%jDw?5?fUxHak zA}v578M%`Z8kzzigH%=lkb!4z^O%z2Hhy9B;t5N>d-0dnRqy*gxf9lqKEW~a7(OLn z(i1+GJf%}Dvf0#9(YksxHq`)oeeC*Hh$kS9>-gC9 z;jk5F=i4J5(zI2{_u}!(99SX@Vg>1K?g*e&QOjNua(b*DLD?HB=lQk>O2~rtzM(LjEx7&rlTx_4D|phOP}QV;U8 z9!#P&fq8)!S?jc{ZZ9=cc+*;`;FTRnvv|o<3?| zkT481@_=-_4Uoj8@5Pssq7>AHhgroGWQI2hv3N0q$7@w&zS;+_!r{H(POsSflEe)? z#OFz@L5w#BS~ZeeoR)Qv#xPM*D6*S&uB1h)v_bzzLXmccfq;a8u29z(zcOau5943@ z{#$8X{&_>N8QK?qN+xA!zr%|@ZrF=d`RJ2|2ZVx~k&pn&E8gM-Hz*M`3G{QHw_L$+ zjVnEXHNgNba)fT7!GQ4MYy(kxJ*DhVIKhO6+7V2kzdMU}Tr_^zH%Bkq%Z<3S!E~6> zemV2je(mw- z${)o2;>TIiIjuKmq%#d84vu)moEy;LsN>C6I(uT@yXohZj*nwBQ@j^Ot}=Kp)78a$ zSz6_INZ0qe>s#e4x#!7WPkZ@C{op59MtosJktoNCBI$=lX$D1J5eF(pjc;*^_k|)` znb*r8aSPO3GLp&zCN8pBN1cJYA!Zz-F8*h5_f2#r&j%fae4I>lf1m?qK>FWD1NXTt z>qMbbEViQ+6Zmo?)E(aq8Ey8W_Xp;o3EC>*#YhRmi_sCKa)}Ke4q-jU8^QR^pGxJu0@C;%jw`brW2k9;7g}XAmyZyFnq$iuz~@(O0mMZu?V;d~Q1MIp^=)wt^9VT4 z)%5!Kt&=ZpyNrbzH?j^OT_F1`vc`=!pn7i&1&<+j;Dc^4c!Q$xia_q$of;h$86yR< z@EG3CFgHRq?g-Qh-GT7J6iY4eblB9pOyiYeMJ$^0<>eSQA@qAx0MlHjIv;Eg6~C)r z-=Ey)!f*Z81HYVIJ%$@;$VL;zOn8-gE-(nxECd9+8WRXr{HnTN+#r zo}So0ym{{72X%v1f%q}bgDq4c?q>^NHl_=3u3})j+bw>@l@=f#$&|v9I{6GvzBz>L zfWQ^?-+|3&oDd*&hm0x2i4lzq`caf1E2-uhEvv1MdAbrh<~`IQoL^ueatr14uu(cX zY;#nG<&9<}iL%f0^$S3N62F67IKR;hco;{>+$|b^In_0*_esc@IZ-X}qO^peD|87u zMN>z=Flv%4ekrn$9n|aij#`$A;>JmmBQ-X$D0FXWUO?MQEa~281Hk#XSGbMV2s`NmJ z0A&rhpy>z*hjC7MzPkenJUK=W;WRY$%#FVTR3$YaQQSh38sfp?*7QBt<`wVbSH{PZ zf-C=c*;iKv@wlu*9A-q0>aqH7O5`B3MVYcp(Q3O~Nb~_;nUDbF_X3MTzHOFq02mmx z9?&%HV$nj~h%J_c-ZVzQ^~Fc$H(ip8x+9@u{Y6MSaTqJ@gbh~O9Wr(hBi}F4W1KaP zTtpoCht^ToWfC$170_g-@k(H`U;!Q?(TvF6*Xg|Y)>(U(HO{#8MQ&UlHgo;^xM}bb zX?El#YI5*UV1Pwl$7cXjM4{4@Aaq(oM(7wOu-WLY!FA}PDn;AG#Udeq&SbR7MG^v` z2-ITgae^S1tp{9V65gPOx zjjBW9NwOBr*wlnLQJ;8ii#X?kknPq&+lDH$RxG%GKJ-O0atR<GE$ay!PEQT33d|@RtJ`SpRWZ8SxdcQ8`zgz+tnH=psrTOl+MUn<~!=~`yA zhU>$xm;_P3d=dxo3v%H`Fx(G0%P#u)>E9Xs?>~Qy8_aXdXu4cP9jI4SMrRe+XnE& zQ5~(T+j3B)oMdoNnJ#irnGO{%H;$RrA-OBjC=Jc0=-p^qDu4o{eHqJpzrx3YyCv*o z`%ih`tkb_Zbm#zU`{PNqj0p2TrSGjislF#GoJunkz?`Mjpluduak^Tefl{&B_@fNo z%EJVz6{IKtb56y~lR;XeR7mu|_U{lUTVX9aPyRVxti%4m9mTtC;4LBoe@wcPoNySlhjbBHtI17y{+7IV#Ve!coc`=3hDugJ zB~}@doduG`LqQG~M9O!##p1Wd4Tx77Zm~lO2AZvpxfB5+3XU6aK!eixputUsuik+W zV|@YzZXUr@qF4*;eU@s0hLHxMU&L9;aSL|rHD23`S6zI^u;TMBH_8btxfvM3lG6_C zl&8?}!Brt}K?@w~@S@WJ2l7GLM5VDT*%*=`d;~^;>8X^U3LQ5}39kFM2~TmB{rO|{ zx4rk(OGDgbJ7P{W#;k+TDTb4*cZ*+kgTw&UhqNMsv(`uht23#|jO!j9!e~I~L6LS; zA>6Zu{$q{MXJXqx|q6K`#$a2p& zQX&_!kh?{$B$0?-HM9WD;ULl^qP&>Kqz0+mQiBWyrfO<|M@zcQ5BV^sJiI#T%FH0u zpSh+#W~8PvDO)H(njk=pHlqUA4oc7#!)gH-Oct%vsI>0lEqDDcdSlh;_dpP7{nke( zB%E-7cNlbrNuxe7N!tv!LCvGX8*oMtM`^hdn7_g3#f(zofH{UGyxGGJFycUzoFY@B zjHEChl@v0dcPLs1`4y`W1}^;lwBgU4{$&(mxu`Sx2)e7mg^a5nK!QsnY!$uXt#gC^D+wA_pT<*NcnzUt zVv-#U2};+zfUj)<7>N?T7XP|a40l--DsI!_fv?5&wRyg`)24Wu^!Q5spmnM4)*f&p z?{MKFZY2lHJ~3;+oJ*&E+t2|zsFX11AT@UStODEWN=8S_*E1eFNe zRCYLmI%S8`F!oADgrj@h7|2I}N`5Cy1$+9W>}xYdD_B6fI%7;31i-X5Hklk!_7i4* zi$n_+1unI#ffC5N2O8L5-!uw*E%uF-YzPCh9~%?-JvUx&rNS|5BL68AeB0QpSe|H$czy64SrfTk4gi_R@9+_X zu{IR^lX1SZ0h(hUP$^c2HDo4E@8KMtZd0_ zBO)3sO)bTuF+D1tgU3N%Tb3<;1*$@3@ClF+KHnJk`CkBrk!!_Z+d3o%Y*hv2`Gx+H}P z>cEu605DpC{9Q07f@q9Ght^mI&_c9cMMPj|Ye_1t+ejgxGTWAFG6*d00u=+B z0V~D&rfp^Ep2_+^Z=ide&a5691>=-PLnyKj4Z;`=2p@Vc4JF_{H|R5aHw;dEn=*7b z`Enozly0dqs7Uy`093mhe90}wE#1a?X()&vk@X>%>0WhSUO;(#p$Akc;KQn%fPqr9 z89#-Fz&MPG#CRK}B3VHpy98VSHS2_de9K~jSw}qN6*po9=cYiP|JcBd zL1Tk{9)_Y_fP^tGGkeBvx{kk(644HQKAZx)JoaMz5G|gX!1`L=!A-dG5+73%-mZVb%?;T##98Mw?nhqRAu1iN~aX zC{zJHV#a9}zz2-#qL$MnOX|M|G7i4cK9rs_<2NhKFLkPEgqRxZf2>jXIAKO zbH7ufU>*m4NfflEZ2m!(3t%6#BYW|sH%b&(fa5A<3h~lo((iMNU+0%47kA0TUsZfM z|Nd(((2Y31m^KD08Yz~HG(Q#Ktc2|mM77Q>-l(t!(I^Y9RMCy|-!JzAz&w%j(+RWc zgT!g(BF*{#qy68udefXsEa$i0!Y(BRHY{4~;`}HnZe*hg=aO$1UP^famhmG``ey=e$mx7$SM?h+cIDpmck4FrwVao8m0<_T#HwX zb42_fP06l>^yL4W4gZH%%CbTi7yqYu)RvTIPlSLWhaAyDu2!{n_erhoYVF7}Y&lBd zD8QH{R#Y)F0z`muCsH%(hH|Lf!E&+XcZgK1;*^!3rj0&RfCD3ACBSOiWO9gWs%IFM zkbuuCxTy&j5e z=c8e;Ro*r}DlvcYAXh;o_e*FZDzsv1{A7mtTTc@m#G%cg#QgD8q5$rN?K{P|W)Ep$ zLH@&+{C#55c|92YxPuv>ogmp#((Rk5+wD5(= zB_>S!^jPHpNDR+*A6!J<5sHVbC6tO)8`dgb{K?|qZ+Lg| z<@a%8;-X&R3y45yq=u~!v!Xyzjv@I5WFjzE)@LD6VAmuO1$)y

N+*pAkH~Qyxkg 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

EQQy)ND2 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≫z$xc#7UDdGsuxk;fG$3vZEN>NY6t11?;iTks>*n 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 k`=tHmAhd0!}GD4cr#14 -Requires-Python: >=3.7 -Description-Content-Type: text/markdown -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Typing :: Typed -Requires-Dist: colorama; platform_system == 'Windows' -Requires-Dist: importlib-metadata; python_version < '3.8' -Project-URL: Changes, https://click.palletsprojects.com/changes/ -Project-URL: Chat, https://discord.gg/pallets -Project-URL: Documentation, https://click.palletsprojects.com/ -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Source, https://github.com/pallets/click/ - -# $ 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 - - -## A Simple Example - -```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() -``` - -``` -$ 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 - diff --git a/venv/lib/python3.11/site-packages/click-8.1.8.dist-info/RECORD b/venv/lib/python3.11/site-packages/click-8.1.8.dist-info/RECORD deleted file mode 100644 index e38eddf..0000000 --- a/venv/lib/python3.11/site-packages/click-8.1.8.dist-info/RECORD +++ /dev/null @@ -1,38 +0,0 @@ -click-8.1.8.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -click-8.1.8.dist-info/LICENSE.txt,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475 -click-8.1.8.dist-info/METADATA,sha256=WJtQ6uGS2ybLfvUE4vC0XIhIBr4yFGwjrMBR2fiCQ-Q,2263 -click-8.1.8.dist-info/RECORD,, -click-8.1.8.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82 -click/__init__.py,sha256=j1DJeCbga4ribkv5uyvIAzI0oFN13fW9mevDKShFelo,3188 -click/__pycache__/__init__.cpython-311.pyc,, -click/__pycache__/_compat.cpython-311.pyc,, -click/__pycache__/_termui_impl.cpython-311.pyc,, -click/__pycache__/_textwrap.cpython-311.pyc,, -click/__pycache__/_winconsole.cpython-311.pyc,, -click/__pycache__/core.cpython-311.pyc,, -click/__pycache__/decorators.cpython-311.pyc,, -click/__pycache__/exceptions.cpython-311.pyc,, -click/__pycache__/formatting.cpython-311.pyc,, -click/__pycache__/globals.cpython-311.pyc,, -click/__pycache__/parser.cpython-311.pyc,, -click/__pycache__/shell_completion.cpython-311.pyc,, -click/__pycache__/termui.cpython-311.pyc,, -click/__pycache__/testing.cpython-311.pyc,, -click/__pycache__/types.cpython-311.pyc,, -click/__pycache__/utils.cpython-311.pyc,, -click/_compat.py,sha256=IGKh_J5QdfKELitnRfTGHneejWxoCw_NX9tfMbdcg3w,18730 -click/_termui_impl.py,sha256=a5z7I9gOFeMmu7Gb6_RPyQ8GPuVP1EeblixcWSPSQPk,24783 -click/_textwrap.py,sha256=10fQ64OcBUMuK7mFvh8363_uoOxPlRItZBmKzRJDgoY,1353 -click/_winconsole.py,sha256=5ju3jQkcZD0W27WEMGqmEP4y_crUVzPCqsX_FYb7BO0,7860 -click/core.py,sha256=Q1nEVdctZwvIPOlt4vfHko0TYnHCeE40UEEul8Wpyvs,114748 -click/decorators.py,sha256=7t6F-QWowtLh6F_6l-4YV4Y4yNTcqFQEu9i37zIz68s,18925 -click/exceptions.py,sha256=V7zDT6emqJ8iNl0kF1P5kpFmLMWQ1T1L7aNNKM4YR0w,9600 -click/formatting.py,sha256=Frf0-5W33-loyY_i9qrwXR8-STnW3m5gvyxLVUdyxyk,9706 -click/globals.py,sha256=cuJ6Bbo073lgEEmhjr394PeM-QFmXM-Ci-wmfsd7H5g,1954 -click/parser.py,sha256=h4sndcpF5OHrZQN8vD8IWb5OByvW7ABbhRToxovrqS8,19067 -click/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -click/shell_completion.py,sha256=TR0dXEGcvWb9Eo3aaQEXGhnvNS3FF4H4QcuLnvAvYo4,18636 -click/termui.py,sha256=dLxiS70UOvIYBda_nEEZaPAFOVDVmRs1sEPMuLDowQo,28310 -click/testing.py,sha256=3RA8anCf7TZ8-5RAF5it2Te-aWXBAL5VLasQnMiC2ZQ,16282 -click/types.py,sha256=BD5Qqq4h-8kawBmOIzJlmq4xzThAf4wCvaOLZSBDNx0,36422 -click/utils.py,sha256=ce-IrO9ilII76LGkU354pOdHbepM8UftfNH7SfMU_28,20330 diff --git a/venv/lib/python3.11/site-packages/click-8.1.8.dist-info/WHEEL b/venv/lib/python3.11/site-packages/click-8.1.8.dist-info/WHEEL deleted file mode 100644 index e3c6fee..0000000 --- a/venv/lib/python3.11/site-packages/click-8.1.8.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.10.1 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv/lib/python3.11/site-packages/click/__init__.py b/venv/lib/python3.11/site-packages/click/__init__.py deleted file mode 100644 index 2610d0e..0000000 --- a/venv/lib/python3.11/site-packages/click/__init__.py +++ /dev/null @@ -1,75 +0,0 @@ -""" -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 HelpOption as HelpOption -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.8" diff --git a/venv/lib/python3.11/site-packages/click/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/click/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index fda4f770d017ae85865163e71d3feb666699794c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3719 zcma)-OH&(15XVQL7m^TQjNh2WVBSbPZNL}|0&Ef+h=I#owpOb}+IU|zy8`1=zC}Jl zDqkX>VUJrnC6!Yu7gyz$Q@UF`JS80hU4Q+iHPb!aGur*7yF0_+Z}pGAt3i&jKXGvV z*Kq~^jCC^hGpjJpDzQq36|*~dM+~_WxRZAh$ARNKPMiQv@C0!ZILVX5Dc}@O5vPIE zJWbpM+{L?yGr$?1Aw*1{KO}wt{D?myehB=SKPG+z z{DeOtehfUw2Z^5mKjlw}2Z4w95b;xBg)78Ez{7l)Sh1ejBYcE-7e2KUSyv&!0=d2g@Oa7909(aYX5HA3)@>SwR;5EKRyafD; zzam}+Ugzt?FMwb3*TgS@H~0qe3h*Z1Bwhu6!`~3E0dMgw;#a`ie4BV3xWr4uuYq^? z4)KPyYwz(r;!WVU{4Mbt;CK8T@fPqt-zVM%{*He~Tmt@{e-FIF-&b~z+2r1rMy6z$ z`X|No6;1I?+p`Si=rX9ej$*r&I*d%m_e^0_l=7t#)C|QBDwbJRTrco6;TuZeDz^5? z$Xp0BFrBKRySA-46~!_gn5+xa3w-6Q?i7?$$1*<|iVIQ1RdjzwF@temDQmt_$!Nl@ z!^)eDY#r@GN-a<-uHh?=8(?rlxiEtoq=me7y#~pvrmkQ{)6c;7p6hF6%P3_2iop|M zGS*0MiE7<8oB%kx4T(z49l|hmi+xvEaxKfy1JiYy-#dZv8CNFW!sa}H+=sdqn70d) zhu+oft|LuowhNyX7BYRuA%pD=N3q^XG=}<$Y|GU4iBHZflk6 zzMcA7)c{`}e9gUFdvf6Uw&*-vrrpoFaa~x~o@p7oLeNHgKbXD`cjVh8xdZnYj`60( z48^`)(T(-*x!A8}Te~iV=BZcZ^;eBR)$2mQ;i|V)=bFJFi%&<9&@Ds5M!`8y^RX5~ zues{EsX;rdG%IdYOsqTwLG>EVPg+{t(QDvLcv{`Z9%Mb?R)yjF<>m|++8*5xA0y&a zKe)7TYO3yBV|@GY@IAParJ8H%_+@%W3yc%fMvh~T;4`uJ{&4FAAhTz=TJTYGsO_Em z2k1=iJ2$T8O*^^tX!(&A;2x95Cm;6@-eRDWI{c0SvZn_}9}i2r$H%)nFpQs`?$hVh zR(sB(YMFQYFWp!XrlBb3J|Pf!L?o}vt)C?JhYvp4ui6T|3z zhTc@wa?6_KixC_pJ-T9Ilm>7??Yb$RO zeKC)Y1(ZdUC6r~97bq`LR!~+^)=*xdtfRa}*#K!I>VXM6-9*P5lr5BPloHAgNF%GN z*AD^pSN0FM*uOi)b4?U4E-s2^mgzZlyLfIm=S6tx7d?74EEeYHi@q5cv!14Zg5Qr{ z)bTA+R8`Y4163_}m;a{Mn=gzLGb+TnW0Bx|=yN)0<{H>b7FQdr0m$t6&n)^5BAnPlxw za5H3*wd-o@DYw?%T9`~c6f{{R3jM63V+ diff --git a/venv/lib/python3.11/site-packages/click/__pycache__/_compat.cpython-311.pyc b/venv/lib/python3.11/site-packages/click/__pycache__/_compat.cpython-311.pyc deleted file mode 100644 index b0450178364291775de1643c4c68b56d4bb62416..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28661 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%0APacY$AYBsVYxZ2eOB{n4eM zvTjehagX9>yppoiST?RYq2LPfcTS(Ln-rO2$Ny- pPSx#bx_akb{sSRhy&q@i(w5#&%_bk-w4pcxIJI2}u}8MV`M-i*8p8kp diff --git a/venv/lib/python3.11/site-packages/click/__pycache__/_termui_impl.cpython-311.pyc b/venv/lib/python3.11/site-packages/click/__pycache__/_termui_impl.cpython-311.pyc deleted file mode 100644 index cc2ecd82890496203846b8852ab32f6c7ccc4383..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33262 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�GM+Qoe|TJ zPm{H5Hvi``u_m-z&{26 diff --git a/venv/lib/python3.11/site-packages/click/__pycache__/_textwrap.cpython-311.pyc b/venv/lib/python3.11/site-packages/click/__pycache__/_textwrap.cpython-311.pyc deleted file mode 100644 index 452ea755c71a2421257bbd156703371a4310ed92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2631 zcmaJ@TW=dh6rR0$ZEtSQrF9#(ZqkI9mY7`1rL91vEf9ecp&}3wuyVbd#K~su&aUGm zT}zP&k{eZO9xBDCMY4EEi^>D)D^L6b8?A)3PeBNYikGbd66y<_S=$>Yz0A&@IWy-n zXU=|e?0YRO0R-*M-~O7N;1K$qOd1X5ZrgnyhAku`nNrboZKS4YnA0k=$WF5qqS1Ru zX4a9+Drml8hqf7n9>7~`)0|9QK{4(TnNG$iyEU2C3}x9^OlXN&1t;rz?%+lR-0oc< zTS!6El#F0cN@3>NhN8lS8!W`~TnVG_5En0VGCvcLee3MBPZ4B6;babM{0$c}zvpd+ zmHq4NHi#ZH#ArGo2V5Htq(Sf!lzBLhXa_%rLwt%8nT&$%HmocuSXX2zIhWNIbX!Pf zv81Ln#rCo!kPugNx(NoQhyo7EL{2J>KteS`>vkk4!f^h_eDNUAbp*sPk+4Vy`3fnY_~i9)o| zo?MPEC2%~K%f)BZR7T4##+MXrDXylj#xpC%Tv{6&9vO-2DMNV$TrL29^>|WEB^Tln zfpiYgFq~PjJEXaUCabVzBihwS6IzC!5|e=S5|B0YPb=yP7rRS`zBzvXM5X(*)qT1U z*a@~-!Kj0L{;_IjUuo3p94uU_hI%%y7XzEutx$jABAKmjUT@6Au3J+ZQ^kuFF=~m? zvKX!Q4HTw|?^ML&Ww%#5!VaRqUtM$R*WUOqz41!#h}An%5l1a?wA|R=0U4||^6 zTk!)@K0#X)pb|Vc*@0)t(;{f6ag$aQFpm|xEUMG5^|mOuYmjs z&l=i^oUkIVmW3nL=t(R3T3Lux1+gp~wS=R^rHU|6W8Jl5mT;^zSP_QG0%0AN^`EPX z9fix}+36cET(ZRD)q%5Q>?^zdUxz{cXATI?mc@G4gAm6<_5zQ7=G!myFg8mNzYhYW zpt(h?3d|OoMR|H(A)`v(hXDnzy{IT$LSKx24lv6zc@_ZV0S<~EBU1|`t8m>x;*}ea z&?R@>+n~;v+#O`HchI-=!NPNMOr}fC<=8Vd59qqZ36n6MP=Oe4`xPh>3QiabsWNKH zASGYNy`X?2gtP;(+4*!zi}5w&oFFSSUb2~#ybSdS3|utnq;wI8G(Zxpflx|o>dNY& zW{flm2Ej zJydvir!BPk(MGP2tA-<1IKIj6h^@CKHYSQa<(`*HT|l5$#34%@D!YBBt@GB(#!4}C zBY!hr7J4y3DEt-*lB6XT6-lxKlC+qXvrzjaTa=`0*@Rk`P*8k7Op)TN8yF6+8Tc?* zWAf!}VZtC;Ok*4+YcB)&9=YD#3xmnWaS2J1{u7Wj?{VmMZfqxf3rZGgQmK7>M?=@+i*-vU^ diff --git a/venv/lib/python3.11/site-packages/click/__pycache__/_winconsole.cpython-311.pyc b/venv/lib/python3.11/site-packages/click/__pycache__/_winconsole.cpython-311.pyc deleted file mode 100644 index 58f6534f02f0f772552b3ef72e36083b75cdd720..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13321 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 NV;gj^zpP>a{x=7+ZhQa$ diff --git a/venv/lib/python3.11/site-packages/click/__pycache__/core.cpython-311.pyc b/venv/lib/python3.11/site-packages/click/__pycache__/core.cpython-311.pyc deleted file mode 100644 index ce701863f87d733a907d867eca5f0391b7511616..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142550 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 P-oDSTK6pqXHV6G5-JtTx diff --git a/venv/lib/python3.11/site-packages/click/__pycache__/decorators.cpython-311.pyc b/venv/lib/python3.11/site-packages/click/__pycache__/decorators.cpython-311.pyc deleted file mode 100644 index c7b0639bbdecaeb6589adf00e7d89fda35232a65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26323 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 diff --git a/venv/lib/python3.11/site-packages/click/__pycache__/formatting.cpython-311.pyc b/venv/lib/python3.11/site-packages/click/__pycache__/formatting.cpython-311.pyc deleted file mode 100644 index befcca383c26ad4ef8fa115d03e7ca2717c4adce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15676 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 diff --git a/venv/lib/python3.11/site-packages/click/__pycache__/globals.cpython-311.pyc b/venv/lib/python3.11/site-packages/click/__pycache__/globals.cpython-311.pyc deleted file mode 100644 index 32e72fcbd2d7428233d491d79663d19298f76732..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3341 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 EKjONN(*OVf diff --git a/venv/lib/python3.11/site-packages/click/__pycache__/shell_completion.cpython-311.pyc b/venv/lib/python3.11/site-packages/click/__pycache__/shell_completion.cpython-311.pyc deleted file mode 100644 index 0fb7e179e882ea14051801eb42ef2f4fcd371200..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24116 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 diff --git a/venv/lib/python3.11/site-packages/click/__pycache__/termui.cpython-311.pyc b/venv/lib/python3.11/site-packages/click/__pycache__/termui.cpython-311.pyc deleted file mode 100644 index 530ff04482d554d06a3ebd319f7be756b25a1570..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34465 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 ZU8!2_zl8_z<<1y?e5CTnrU{FO{|g&&dbI!m diff --git a/venv/lib/python3.11/site-packages/click/__pycache__/testing.cpython-311.pyc b/venv/lib/python3.11/site-packages/click/__pycache__/testing.cpython-311.pyc deleted file mode 100644 index d12f36e690f93048f0d7e2a797ac1c35d2bf61ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25956 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 diff --git a/venv/lib/python3.11/site-packages/click/__pycache__/types.cpython-311.pyc b/venv/lib/python3.11/site-packages/click/__pycache__/types.cpython-311.pyc deleted file mode 100644 index 5e8f03011fd97f14156fcbb01981cfdb29450b0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53699 zcmeIb3vgT4nI?GgBtU=!NCJG5f+&&_Wr=#)7OD5!loi_6!;a~sNQeL>$RxpBfO=45 zOlMpZIIZr`US-X61`ke~e?_-lr0EK<~dzE&-! zT+bz_8wwzG?|5*ceyE;fSHa&f)WH7g@y3a!p(cxDm5xdg-)mCD|DIKnKES`YhMGB~ z1|hZ4=J!zJ5Ad&qwQyJ+!U82>tsE9aSba%Y8;3O@tg$4lox_?C)?5;{io;qE)>;x4 z;;=S^wU>mg=CD-=3q@BK)uDsKRwJyVBy0_btwC64v?IFaJv(ZTf2H=F9NLA@?vgLN zIBYG#*5S*pqA$BSv11*K2&3M;d^ll5@ttoo974N!=-fhFXwMFl?>rRp7>OB zayXHcqv477EqU*OaOByr9G-|KqcVbhV{v&RoE#pDjYlW(7Oz~#!!wtU;FQF$haj`0LRnR*Ju~yU({NoX!rQ&=(HTV zcrH4rW2#rJCgUt62lmIQ}IL$Fr1)g-Vv5#$;){=b^TyI5S_em zAuJD%#}dim#MF2UONN|xik=&#)k3`pMX=%jK^o3mQqmAME4_!O541PuHQ$nka;eGC zJz_D(j~IaFoMqOs!dJG3eU(%ZSfoFTrNE5v$*x)HyoTh=StqTtmO1>-S|g6@R!o2A z%>Q{bjINe3xWzJuB?^6p!7v)19>=hZhNctIvFY&;g3+(Zczir`HaZ!V!%6gl*8GSh zZyXDcQqM%iD>NTzPdS7|FV z0X?}M?|Q8HN**QuOef&XOFs`t_05Z&Zwy@<$_Cfn32wa| z+Yq-{zI+QweudWSF`?{N*Y2TCdb3OS08DeJfT+chW0cBdK^ES+PnNWpM zZSdj2fq$M#RNA+sS<9;pv(gg$r56p+S(_P$Jqe2Ir1ZXp5WWfp3chcbL-<WV0z576;;<9{30c^nH=sV8VBlC)JwC}OO~(;9S1N(2n+)ov2K-H zO|{i~G7jK~7Q&((8`A&`K`Ld@OK6K&XdS&)T1W)<7@CFg0meF%#n`;2mqnsBgu;o? z#pw7r?po%YF^#m97jc1Mg=oMAo9j*X9m7()wdNnnDF$}tS{3+Nd!s0>}wFD4{s(9bBN$V*3V1Oi0R zMTyH_h`8F=7hQq*Jxy~1Pw)~%Hy}w`fheh%iaz&-zGQB|lI+mnA~PUGGNH(*JkgwL z@5`uIB!q#$nR4klQB!_~9?~-q(~!6hW&kSp;MGixKJk?19-){-z5;Y^ko>`vmuFqx zDqk?cM}m#?|DYcZ!Tl*q#Igi`=>>E}L!!)R55d&%Gy;#Jev=^;!{j*v91*K(OpZ@7 z%>Y0f6BsEqJ7af1yOW{mDXk5d{zyz<7KcX9O;5g@0AvOefEWURzG%8Afojk!U@|eL z2m%Jgfr=>_28=Qy)eu7OK|fGG3z}d95Z4&S_(U{3smxHk0PTeJ9;61Lo{0@wxsdTB zkuqEmLYDz`V@!V-K0+3;vy*W-8tDy%o}o#5F_r*vqi`)}t&<+u=9C>{^Zk?h2#VJo;u@^^sE= zdWlk41qXx3FV)m7xE9Xb@vXY;TeW1*hWawT{;aP*?dlgpt3q7{DwDl~ak0Xd$1w;G zC_>jQv$k354T~A8_=W{*_4cQtkb?+6R3sKr;JXSm&<2!=Ks#s} z^eD(kpZ1o*&2uSlr<7-^^(LX`Z%{m<(1E^HOTL!HCzowEA5T~JWvctK)qQDKpQwH% zdPZ=PqH+zQo2p*4z?}uMgaz);@mjPK<_r(wxV~uhGYQ;3@^!{JdlTodt}x*wcvV2q zjclutQ2fk!5bFsAebI4py;!1+0C3_&jnn!8av(%tTET7ruGBOE{y}$Z!!;3~z^sd7 zfunIxQy0TDelcO>0AL2i^^}-1pnY#hSY0Cx^Hc%W3_S-XFT_WA1=4^gQ8%0?QXz(g zKJ*_2%FEHOf%8EGk)e7eN$9QAPb`$_s50G@g41+XfIm-3L*c)GwjuOM9enzbB%WQ- z;Hx(EaCD|oABN_T-=J?5(B3ZjYg29>fIZg1!JcNh4WaqU;o*sRWO|$^Bk%C=*8o%$ zI;moK7$o5EupFRxmSo;_ka#xFhvmHe4Cu$aZ+MuOZh-_KBJs!aHUQ$2cOvHt}lit~n17^#6=$R4BHRM}O z4ikgqG~z$;EO6_2!(YMbbGQl;IUQ2>WAn!sR$p7ccq&`lk+!eLFJoVyYiplBoZ51= ze_{0M-n6|Pzl^=T;FLVo^8@n(uMPl~_3cjE8y8n!U%&L+J3}{Z?+j;~A5YtN;g_-R zD%k5BI~K#&$CgemufEZ>G?Z=MT#)dt*x4+t@6C1f6xiV%dvCmWI@7h`MDcIw`@0t`Jvcp)*GjvYSn+QCO}Qo zU)(hP#ZA*+K-1Jy!-x<0YvI)T9JRT+)`E@hU7N*y&wjpBk?Yg`P}aS=;6ONylClm@ z7anJ$7-HIGQ+yAI*wLB&#OjaQBi5(`%yZjo_V*BK5UDsLcEEB+zV;wsC-bzld3#Ex zA#CDU5v54^JZOhwUINYOe#0UY;S2dh-C#U9pz>U!k;Aeam*2NA^_ie$MG(?FO=lWQ z3(?EGwIxJM5Yay`eNw$TQ@tizy(aBi!!0q`Q^8O}-ivT~A2|#hTv!#b@Fp+IN9Y~F zf#SJ3Nbksb8~+KK&H7vgr9OZBo};Q@wKzH#5;Sf*b?3fKa#p|gWe(Keik_haO+Dkn z3%VZMgY!*O-$ZRX4-I}|WAJs>Vtg`+KqBZxh#>4>vpdnNw(}a7F6vt8n=xxj8nZ+k zuX%^u5vMU$qykSY!lrB^E}fMR;es*5Ao$^2wUUD6??G8SDe01B$cwS$%~u_no*dPN z5zrDm@>m));qKaC+JLMHcR$ZnCudd~rm?{n_%+fn#pR3mG(5C=Y@*kRCngh1Ld6@& zZ^9eFqlrz%lHk$Qn+n#ezNev^pmgS?TvOZiwv_#NtEOo{Q-G(zSK#@M zH0k@NSv2u~1g_Sw92H_-IP(Q8NV1lHXStjh$}X9Md~ z?p$l=`asIP(4BEL<$R54SECr|o%lxJsKlBRC@alU6Yl853vR4`2hUp&+^x)*D<;d< zNJ*_(B&k!9PgwAMQX6~JNakA8{<7EzhP9r+45IyDZWtjEdSnXhCVjbWjD z6shLDrzc|&8b|q6-WiF~1EU%;b&MI;5=3**+@T8L{Ld-&cj18Mak|_+#Bl6;vv2Wq zrfyBPZcW;|=CixLrh?>j_ZS?jt*Y;CW6R>#l(7I=OX+8=cMq}B@WPXZS52b;;il>&RJib4DVBm(3QXgrbQ z@-aNhUnXaO9BNZBRh}Xrqj6Qr>=-3NWEe}(R}sWZ&^|FuPE%BJ-lc$l4F~f<{VQ0l zj;6)ut`9BO+z2jL0I3NsS7+OvEJ%2N>k!|H9hVKC6ysrd2j=$*PNm1uqo6qCGoU#1 zXh3oBsGvCT6{Ih8#C)a7jpARsw3X=sUYT(QKzX~q9z}pd=&Aw{yJ4Mhm_nR}kP2f8 zSSMUqCn~VwxPXbc;de(Wv0ixcfzy*%t4F~wiwf-sl0iU3LX6>+K#agmjB}a*EyEd_ z{Ir}X3&q1(Pp#$h?o}q!M@UH}Re%tyTqx68P?W9U&=2N4rw5-s@yx-)Cr=(eBua3C z5~J859&RK$0925%EVY#_gBtut^c^koSe<;WsX6Y-!S^eRX9O)^GEECH8MJ{fCc^{; z6p;%Hl3LugXl zijEkdRG44G0qQ%+0&xwckz*+5FEBK4ha|C=gd(k++GZyrF1( zsqp8|5IOO0;edAs`Dy(^^zG9b&zh_Ulc~zxbhoxMQ`?=b?M@vmSSzb`t1I-$Ok+>B zu}5FWT~)h5-YU-Brq*oJ)=bm(Y}57yXRfYk@#LGk7j_q{w%~qCF4Xk{@AtjS&u2p0 zv!U&ajzypXEo(7t5omPPh%elXWkUP1p?wr}k+1W0H+wRzyRxmj z77hbTs6jC(xK;`@rHQC9*=`~K zILjJ}k@^7QiM}fx9lc!D$3?3~Dh-CteGmXVvpn~5&r#?`@Z$s*m z0Kf7iUKhjDDSAiFpVBvF;c1PdSy|u7XMm^lXn?19RNyIm1?pwDtU) zr!_)4c{R{v^K-s+(F(4ErVAYj=;`1~(xIzk!ZrXzr6KP;crG3rjfVGtDj|X8C_f76 zo5E05g-75elko6dbo6BsnVp4@5?t$WXe@RK&k*AN!(ClnU$i}C4D;vDPK#3vzHpJEL*g&PmP^E9;GC^b=3 zq|QPe63NJfI14%Ny7Ab{QC0OOE+=|ekgE!D64UaOOu+FhB=!ktk*Rr86Nony#wCSZ zgT%+<7sHoH;zQ~NN?o9#7dsmh;(sb6Dy)==TSAVW4a*S}2r3F=A!v1l6VYMl3PPX@ zq1*`M15go~yi6gu{UA9y z28}oFvyJhoWMV`p9znu)DNGzHC9cZOHtV4CP` z601CiIP%xwfMpUQzxEt3Jj?n}ATwH+DP8Y7>i3n{Snl8OJNHI$5C z((PHoz4TgHZcXZTI^RgH!IRb~5$nq|TqM~Ufn@S~QpEnY4O&hP_B+YnQ!)6tWj60p zbtLnaD|yS@=a!c~w|uq7p0}Tm$0oTg^DdG>K~FA{_f3(eE^D%}=9)U9sDgQqGLlK% z-8{00;-9Hi+Si~-Bw-Os5M6}9Rp0d1xi`-(Ca=$C>NjNTH>5n^D0pkG?!gl0Ubh&{ zwr{&RbGvGdDjw4zGGo$+P7NyxmJsD$xVRt>2lzo$K@q>%t&~# z_T&U+KQ0G~3*aZ9}EI$HHxn z4zLUZY2@tzatdV;!@3tfBXg6*R5Q)SrZsCVVWW_g*o?2h+VlC-H5)R%jalEuJHG9= zecNxn@Grme2VeQP^UpS9cE6C_{X*KeJ>&aw*7xPK>&x7L0+l5!wp8VgPzi3&^=Rd9 z+6W%a*&~+Mz~4KMAaNa%iph!BZLjWn-KMKzy!!a-w({*=jH=JsQ#Nq1t*^Oe9p!t% zoL6by#-2)SowYC7)p8o|=2TE88|w7S=4hXFT#%qE3nEHKEie)7<@t)qD!n90Vx=mV zu}#fHqIty4Il-|s5PItOl9a5|{j`lNNdgh&GNq0I^MN-0%?b@m8d{}(Nq4M6&ROS; z3Ul09>+3~Ime@!}dIPRO({e#wKt+2%LYudw7>3VR9i*~6Yx%FNSDm2Gm}@}}^hB(^ zo8?(}jdS4h%3Y-0OQP;QGabrQP&hcfyT&1oA5ZM*)#C(dN;D&pc`4m=Nc@(cU+iA$ z)*c1)&{_d;33_lb55PmK8W*(XD;WE8(0j%h#{1H%cnr^4QK?p?QcyMxl*44OZoPq| z@>PW3L?gojK;&I22E~l_1T`GiZe z3qamB5uVE1iDxJT12iP_Hf$V|e+xcHK|{C|GatOl7~<0At4$*+A^!%xVB!{yIifXa z58lpHnGnF>f+Whq6tFQq}i7)v3LUiR`K;)2j~V zTH5clY`fjE?dIW3OMkYdKXn{z2IH9H(RXjt?mL?f-rjUDv*~bl)8T>xQSQ^&{FI#3 zAmr)(K-Sj*g#dSTu4V0=md&?YHfLJ4W?QxzQ+$MUyp4-{(w-jta&@bhHe~BIrM;W( z)i=Ktdo%W~?cGDmoi{dQLQiHxPiE?OWb1dNJUN&5+wO0Q;0Cp@il=A^NImhWbG7tc=n@;#48}ZQbXV9>7aGsbz_gMR=Bh|18)ZI=U}- z(c7q-+YpnO&Ao3279-ckGfj_Wn;uL1dX=B6mkTcMLbOsh`xP1`q}R1NHG zmL@FUa)RebqgJ_$Vmd5A^d(>B1#ZrcFzqYZ$4Gz;NPxX`fuHOEAa<(h81H6K^DP^v zVlSUc%E`iVEZW66VEJ-}ThK&;5Rpx#N>QH{pa&!Bas(wL-h z`=6W27$M!VA5O_SzYQ-R9D(y4%hQqt0~~983vW-tyVC1*t9h9J^M+Z=^U_-ui*&VB zCvYwKN^bWAwfp;GsmNPKd3Y)dg;*m$ckiOzMVF@JJu~YR=w?<;Ghhp9%p)`*wxevH z{gw1rm=)>zWB4sTceCdATYuDg>wIR*Kz7RjUM+l01R34(6P#OtP-H_ZY+Sh&%p-RR zNTB=8Dsb0OMpk@oDM<@}zixgx^*VI1pGTuCT%M4J<&}y%>%!zdU32vE&A2s~2 z>BFWwTMpmea`+>((R0}?&moZ7h$0z(rENrWol&iBcnH-xOXH+!&SI5b2gPe16K`0r zR-14{1y}e1zGdKKsv=ND0*C@t?D?WGphcy1FR_NIiUHu;CVordh3bXs#jlB#Kzq&g z>8Z%qm)CpcGRfbg(j6s7XG{Dp9@RyhYAzHj2*~C=fZ+-jn8;UP!#Mbg5m7thOk?35 z35E6vUIz8ZOt5U#o}g+Fg7FzG;`Ndn%Fm<#to=TzZ+d%;kp#cz@nt>j1a9T);A&De3~A)?GBNTxK={we~f$`C~!VSKEh{s zxs#8Rk6K8Mk~0Q}mqexQuFy+z{*nS-L35#@)W3qYnp8K*2}#}nNk^@YjU@BmxMX>! za(UZ3K7RNpz_;{sr}|mpd_C`{6LQe@dF+e@dJDX$?P1rSR9*#{9zMiVsxBA$97h5q&q1%(w!6> zaiE%F&suUIh_#KeNahol#yw;OtJ*S zrdma&QNc0|SA=9CF32>7@=2W5JS`1SMVB2MKG+i55)cy+Iy`@LdYMV9E+WuW&s52>1%rzkvysD zGs_-8dII}p)=kDIH&S*pL_~!zBC(#(z{zJqJD%9QMafSUNW4H>Tm zM%)m({BVH@wjq2P4d`VETcCZW zW{t#SGK5!36}V5iFkl8Jun7bE>_~S98@W*?B#iyqs@O$AbH$g5{?PtX!4wZLbL(&s zs8U=El!tS}DrdUH*g~|+ssIe~Ca#o8=u-CEk&(4sFK+Cb*w__WOKog;KGpS9f7h4# zyG~NT7kwNuL>5Cv#&nVf^A$>!O$>iRj4Aj*D;(mNPT9_aIQqUxj>9}M>tK&<#-$c< zrbhK?h0|YYMF8jcM@UyygC)O_OU4W3OpQ7tGyzYPkb>2S42o|ZK)JmK0N=jd;E>QK zg+Bp|8xhrn*i((TR$qbVS0?Y_jn9LkhBkv(hpM@fL?@_K)+o~%rwXsfXIR_IYr7g{ zItFdmF3O5jNlcw;#|y5$V0;m+yM$Mz7pPd|EG{z+3-aB@xZjdvWc0|oSA@DNrPbJYlcqsZCKd$){ZxKEFQXkJX6<`t?NnqHYh*W2GOaVlnHT> zMyV?5rB&@&ydlk9BR4{?4C%s}N%oTxRDbAe<$}7Ay;wU|RpO=$VdzK!cybtzs#HlU zRe~a6@-v2;4-6;e%fskWWsw>t5Hi!IwL`gJDtTfTQUT&?wYeMb*0p5oI+so_AIa2h z%hqj6d$$R_Sc{v~DHI3FvkTi7wnM4K-AJ0NUL+tiSG#QQSh{R0Xgq6@kqgMxENObE zx)+F>lO#PMIKkH;>8tI;{#Y{hiW*3K_ad7db5PcL6%vP0s|B3)tE(VVH1vY@p-J&8 zNtIGAW8UT-H4j*pG7#laawTc&pmNbp1*6o#lsa1G1N@82EIC-JRNou#ij=`_j$3NV zL6I^z2IcSK^O=o0FE$d#Vnv)zc#cy8VhxA&cFXx%0i_%^ayupdf;rp7%~@M{E_PN?ZVD4Fqw9^N;l z#e_z^?Yx>7g2qB+H-T)Uz4ugnep$+`gh&&AH3~9m}_3OeCo!FB+NZzxi493YCk0hkh-Qm=dZi( zagyK)4t4>RIyR(F2oG`b8R6OQ+P}v3lMV~q!Jd+>2L}*MJ_sjor>z@e1Hxf?$)J#- z8%y!m(7V;-{Ew>h9jf?6JgM-E?zy_awSL|@^V~b9uTN0*?expoHx%q%N43JlBA)?N z(4zrV;86h;@D-#L903KWI3_4ig%@-^*nsjGSxjV7QT#<3c@9%g^A&X%=CB=exO|8s z>I72;YP9%wMJ!`p?1gb)UkvTu)ZjtXwEMD*GHoRoPaZIhjC(Y_#ypD*U>ZsjF*1!P zR}J49bMZb=KQpyzqK-&yqz;BAQBLe07V5B7@VmiKss}@FI<2!z+MNs?e+%DdnjCbOvUg)a%81N#;yrUVeuAS4=9qnMB5;o%yOFu-Bh zCOQkOd6>W#U(mjhhPB?%1S0P{y-cJ0F~q_2_Dg{V(A2J6T|M6#L%3Dtlv}VFPn9YB@yIlh+8Rv$XGrNEh16cb zFd!hT-gpMdtP%3UuXPptR5rd~1;qj69{=K^&6gM!*va}o;YE*2C*JeU=_#V!R_uk9 z2>Z5@b~Y0D{~fjU^T=yO0^e10$JKb-)tK`KuDOI0Y`XT<96Po3*VY$2lDp|XHc3Km z4~KS2RzmB+-}H-ZebxHw00uJk7q|n`xHM-^YOO03Dae&yC5gl?wpj;a&(KQ|Y1$HB zVHTR)Sp!d;vRmn3iBr~q2u(Kq>!Oq^5TzkZ#c}YRNB{=Lk`R#=OCMzWUHfp z{r9+LIt3!5DItM(ON>*QAaCdj-*ha-!OuN4&?Lhm9ZtdoE9*z|`pl5-Pf(`3bv%my zqyUQq5%bowcyl(%kTLHhR1(0NX;=;Qf#DTl{p?J1SY+car;j9Oke*EP^t^K%h6b@H zIM3o9z9hEe(wJhX3TNJcJ2jTfc!jq82~Bn)i!j-N+_)Q4KKlEls`m94uDij zY5%Y))37JouqW-`b5F!TR6~>#Hv=EGWg7No8}_FCd+&K_82ejzo^M9{Z%4-8m-YAE z@$b9s-|k>ac5-YmOf`+S1f3tUZ^l7f6uks8u~FYw z40+|@m;X0%?!qY|7yb=i%`}t@c`@XKFyNjV zBF)1xs?NNXtr6>_C1RViMC`Mc@0r+--;;ZUZCN}B2fw8?~^SLD? z|0V9|Btp*RR&r=LmZ?iri5CT#BwiDEQ5Gi`9KO$}qYfhu=*{+y>*v${%?p(amCI*R zj+}4cJKGoSZ}ea5&(?LPeFOL{2k!LjzTLAs)3Z0*vllNu3W@-7T?5>n?>hzuj~qGD zQ&Y?#Jb-MN7|uJ!#^d3ne28A?oWY~?c#ND5a(G21D8LmIx+_t79D|df$+J%^jz6Q9 zKY1e@>P=0Lq0Fma77Z;Qe}0)NAD;xgVX9Rquqjc1!*Oxz73|ZgiZ?i4CFjL8pwG( zD&#zT1!*N`57cB953`0$dfiUGe*{$%y!}|bEm5BFI<_u>M~Pdp(`t1bvk*g(?vL&Y zmIC$4DE_reof{9Ri*?4LFwiyR0DI60!Wt&Jzzh&Zxx53DNsXPCuYmeR^eoi(8u7h} zE~Ej$Gnb~Y#`DhG1_n<(gy$VJrVdI~%nE4P>3r`%YMLuE2(pdm+g@ZK?<1$4oFn8g zH;e}`O*oO^8uG0s=ijN$|4SpZ4^Q*jU(N$Hs$8I9{!0bB#Ss*&TSAh^d_<`u+LaPC zwW~^%lrelpXPkgZ;--kqEY_3$1X1(B<&IMFCI1)S`^dB-m>j>IZEa z#)eV0Cy%Ba(b1K#f?;E;sxYq{jWC+R_zX7L>f22j7fy^QDl)(vMn-`2j_`g~c*A^l z0hB@5j3sZ2CAA9$d*K5epjN9DY;A|P}^@Rmv zES6kOK7AoE6&F@%HIzx=g(^6VhK6w+j5T0v4S6BHmbAL@8J4>furzL1ml2CUKplWr zsYTE;#l~nd7mKzed!<0el&o~il%waUgNp6$?%jsXBad1=-bv+D*KX@V6s-k0oC=3Q2={chOOLV|37pEXkuXgtA?(o(*|_&6S1*S6gw!QG6P8+JSU(p zA(Ih{kr5()N7S|KR|cLvj3Eo)Ja}Yf<}jl{gz=~sG5Q!re*>OhhCMFWtdJcz$}q7B z;@joAS%>UP5_zp$upbD#;RF1O>lTk71oMpQPYayJI%A{59p~ zEyj)Y#rXijg%Ffi3|^+0>f^P#EJ^nneL@aSc$5-<2al1YvsTfPO-{SyZNif6DxvYJ zm{=j#NagWc6Pd?v1f9oTLFlnpPbEp_M$ZhM7ez(SN4-I??v57Az9C*q6l zkM4>FriL&rdK$KW0U>58>OZ2%!m0x>Hm+eP`3kZz6QP?+8lb`V+VviMx;&x049Oe^YK1TgjT}L7B3&31WV0U7jN|t5?+QP`ar1eGB&zB)l{mVOJLf-<15j z@E3_RdK~2>7&zt)yYds%eGF<1LW-biP^g+6r)e6$h3JgsdutZHl=iH~?`~bgqT`L7 z*LJ48?e~0vZ(sS=mDlI4&fW2K-1c>3e4SZeXUYzyV7l(fw1^{mc(-P~Tkm-LZhQMaazLt)@gB)~k9_R-IC0-*hT|GU=Xv%h>;(IPXP!C! z5Pm|vx%w(Y;VkO^fR-kLsKL|)&Tp`+0kyxUP9Wz5wHeV>^V%Qt3JP|=rYA-|1Gk7C z4csC;D%>LY3X<9Bv^eSo&Rq`(?$BEujf{`}A}y@(aKp znr94u+8O?olS~60vg^Emvy4(!$loPOqvR@rH5S;7w3mlUr7*6k&HvhAEwRQT-s17G#^M2^eC#xIRq>jeG_$M2`kAghvGo!AB=L7@dws218UB6ByD+|9^uJ zBk5oMZ0GaZTo{7-magz+JTo}z6=yyhmUc`~K#7Y%s z6H^Q(>p_5qr*Y;ngx++{;AL=TVTugQS2}x`M5$1#5GTGxvAGXNCSAl1%RFFYffOZf2mfR1m6=xrtRvz#)y@thNE|hvXIm_Z#1#p~K21)z~Qb=i;n*!yej^ahw1T z+mz#BI`U~UDaXfgDw{Z+kZYsZ`_!8^HUTqHF=*1ELs774F!q%$qJ5hK&(QJEeCiyX z0ZmK@lmuVX&RWWgYeSZgBQU`UIRnl`+*Bj!Exzw06I>mX3ToXi$q0ENifxVwxLY#O-W>CfOfuUvCNX1DoN?eFp=#X%z zg6PM5vEfmYqM%|B|6@oKTZNbaIA56euTnd3b2zN7MY85UKT7@)P&@4EQ zRFT7AtO%2=Au^K2nl%J2&^-7lO@nbK01T%BE3MOjLufeyHFU5zcQQo=w4ip4N6MRB zrP6GKsY%7?>I9A$L@m+r1d6nyoXhbPjmNnfMLwb_A%)T=oDlEiU6dD{7bXt-vdDvZ zr;zF$$=hiH=UwWo%R3=Xg~40cNy0qHJ4Kp;SSJKoy$JiW;s3#LI7F;NpI8l(fIu27 zul^Ex$RIQc371!q6C!6dIUR6RJ>-?b%j+Rm9YG6d%)WOBi+K#i1#;+@f=$pbcB|UP z^{sgFD2LtT#1o;8r9`0}32+m93!YzwxmrvUfR{ndT5>_}g!17Fe#)0Guw)Vc1MM44 zuNe9tTJxYOnSa`WPvrlZ94%-iW#SrcETaPPkB~=#)EmKgE5AcnRUn3Wtk})Y4>v+B zIOE!vb?r;L_8ASob|R6_+mpRG-6cNx5(eRhP(0E5Y&d!DI4lX!i?4pww40b}&aFHS z4+fe+2j^ANoyA*m!K%I1N|HfCtC*gOSQI<3(DMRYnzXF6@0jCb$6JK-IG`!D@kris z@f5UdX#9cmk|4A7II;H}x8nO&ogZSv8m4s%CoRzkEP4O?)UpRr z1MmW%8`YQgguvCf)|d9S-t|;n?OT9(`o<%h+!fpk?He#`{P z`BcS(&;7;iS&sW=;w%#?%uW1%qcFw0bIt53LFATi=m-o{ng`?@k-00VJQa5fvEQ&Z z8(3-tQ*<+D@N4h~ehqzxUuA$w*!l#_P*=2vLb&bK=2_d4Ays9x;5KV8)o!jOjIwD% z!Z?(S2UF-u+orc(HGLg1o-I;l#y}+zw{rc%YsoexopTka>vK@oUbj+xjq2L7&hwgr zwz=-+CyO+>_7T(5NEUMn<|lwCD7As1LEuQauou36&V_M8)NjcJ^}4nC%i>YPN_8%s z)Pa(veI@qAoa^f@A&Da2MT>fn1}3`PMJtPi7nsj2YiDe0`$IiJY!!?phH32_CNn33 z0c!_x0;omH5%skJn({hDOH{s!D2d_tB$OIJOXTbLh9lR2j*iD*M-8S*^45W8gnAo| zUYV%ZJofxhbm+rPC(h+7o;k^qF2N$9Edp#5fS2c<@~Y$lNR5xlE-HmrV8u!yEKxqU zhdH$57`U`v22G0k_(uegzK!o82lGOpvKY*GR%JbO_Lagb`NUsy&6#d^@>Ve8-<$RC zC5B16`xy&w(CfKf*R$M}soR{b+nhRdj|4`ps!ex;ZIJClxwCI6^3KG~Qy;$cap2Ed z3N~wfEu?Anv=gtscEJkKO`u_6FZ7@81iEeqx|YslyLV**yR(7a>A>z!8XB)%csqPO z^6r**9>4zb^43g4Z?>T~?eG1hy(i}nE+nsAUg~^jBecU?K05WYmyrA_Sj~ik8D%w@5SwBTPqJgVf)#xO^3JG{%DH>{x32>xgLW^H$FKB3l!KM zW1qD}Y&VMRCY+@WN{%pbp0x9fRjO1m;fVEH$iayarW4RHxP|2%Jp!Z1G}^@3Fob0T zF=k|(?F`Zj^{8T+XTV&O=L~4OYQ~6?_%FghB#wqeGe98Iimn10_j|apSvytq(oHYA z$l0X^6>~<(?8;0X&uOzU$G@ei-HTA5y^W=|?(X^9VZCqWrZeq-Qdl`o`*x&VI~emt z{;e1cgK`_WN0f7k4JVB5r{b_CP!D3{?bMU`3UWcOG2J1I)e){EjMW_`-&5oqB8P>* z1LQkK4lNK2X7dil73J+nR;U3J$?*`Ib~{Udk`;$l?Y+ClONJmu~7AbPF!fE}* zO%PN#g6XwKNthh`7>DoSR_xUFIG(Z4fyNgX66x07o0bpl07a)i^rRbhW_`N~4hlzg z496Vv8`C+*{Du!Y4y3|YqgPuB9)1OALGaJuK5waZ^s(hTx|8KQx|8KQ+=&IOS-!(F zSrPmKM~I)eb317OG{Tu_!X6wF_8grCqvoY#@4z!~aCS9_2=u#l+2Lah_W(Ra7%sLT znz7a?v&b35fH@qH(KbkCr^AuFgIHcsU=FL0FiSfUl&`Y7ZiZhb=ReR$T#W#bPaYib zwAh{Ttj?0qbJx2sET6u4G}E;!+eN2U3o;WiwX06?J@`5jDrIaNPZZQKWj2P@6C%{*j_NXu?HLfmH7AI-;4h$q^L64CHSk=62hJX(C28bfYPx$xse| zBmkYfW-y=w*s0#cOz4(qC6`HKTt`~^7dx|(Zb6hGl+pWGD45w zxFj(KiQAKiO~k+sQrSuU;87K26bmdDiByR3J+s8H!*PO+!iZ0*%c`=ZMlZnv zENszHjW{-VeL|l)4hAo=@t8l#(U>zyY;kp?nzqD)pT_yK0(Mg2nGyRDM>|pBMn+CS zT|u|sr{tyX6VuY+Y?xC`oM*5qr)A_Pt2HO>?F2O!+51bp9GjXV+j<5Bfod=ue>r>^ z#`VTw-8ZC&1Hhgl0aekM}bVn)khhnf*sEMLB6KpuLHkS5!O# z7$qO8FTd#H=%wiBbjjy*T$B3#i&9V-5VSD&hrUE7HtD??J_D}BG&rlIF|Ndf|FYIM ziOUmEM}Ham{QJ?LU&p{lJ*kgjLmJ&Qp{YvKMl1Ws$RHYt=E}>_=v3(0%gJ-`$+eI^iKDZ$ zN+-|@s2nse_q8?@3^T;W%yak-gyEO=rcd4^K z?^35Ao$Vy1ciwB9Ecr@3le}9id%jX{lhI0bNyMGd4f=loWewt6K01ROd*ls58xeZUiN5qw=HyWfXRv<+hTAhe> zV*HZR(NZl+r$`03I2}`-#o8xDdE$U5c{lROyEVWp@5OVEM?Q+1{1iE4dR=~+oMYrX zL(Xw>zC;cYQ}S<;Lj($}^@PY@^fiCTN$4NaHhNBsw-?iB5|?0}5XCZ6^(^L;CRtd6 zE>FCT_e^3nw6QFqsROraRls02Zqf{uwyVBe>pD6?t|_NH2IxaK?SI8#Uk-N%u{GFp zx2=8g!gpW1{$lFT)qxcLa#b}~ze)-z9oRjO$ne~4Y+8KmyVcjL)i|HvMfZ2z*WKz1 zfl3nsJ&Foy7Y!F4vVQ>2e+q#HhL=9LABEp*c@M+?18oZE0ublQy-Onk{IepV$clr3 z2hdAskOVbNNVUPxfrptI?t7!4WFPfE#Rkdwa6t)i`FG}EV{lR!S<%g{z#hXZg(_Aw zuOLNpI3VTVzz{*PxfRsq^DdJ#h0p2zBB2Vk825BN5-1X?ylUiqGj|%1#bu_0665GE zHOOS$bQ;P+Ml)u*$f}rs%OFKhLjyLFRFa0)%cW@;k2BV#0gy*XOIq4SPjL$7dZA2; zd7h18s4)1Dk$~V^Fn_}}mWV{5r~oN10w7_<0hj!EfZ}bzhw@`^Oj4oR(RdWf4#T{7 zU~Pfw!At`Wq0)fkG?1}X$w z-`$3$Ygd*Y&ouO88+y|Io?K1vTGQLnbj=$4iUXOMnr`2Gv-9_Re$;d8aAxa)?A8OB zhJ)FLgK7UksNbsQjk~BqX4`ls=@C(xJeJmD@u7u|?6d0QB3_9nw1l|gHYip@t()w! zF4z+15T-3f@^08imBwvzPNNja01=$!53(sf+`GJ*<9jH8t`KgPO3=~arabk9v&gK? zT*c&XKzd=2R6u$G!W{L`#%==UBvv>Vt|+xp>x;aomN)lfloCaX7Re=z`c_+(?kI&u zi9d>&o#Yz*>*6_4%n>dxRhiU}6*u&G;)2oY?Rl-WW-HFC+ziRw1M*kVW}56wFBOao z8DwRVq9fIRJz4>+uBqA;)m-B${DW&=yuIMpqW@8ILa6wXXH7FmQ|OzuC$-rGSt=nN ze3@Zx;?erQX!FFcP5)~wqepCo=6_HtxXg3s*QOP;nYv;tSWIJq)>XcKsj=Yx^=ySl zgZ$tnRu1-9AJD?MQC>^v0D*MCk`LY zS0rFmjqo)h74!W1(7*|%8KLFI=XK=mCx)MSnkmS<{RQ$89htX(8D4B+2vG)|AqvBihI8L`_f)_EwH_;F9bTUYBzAgnpJe#)!uEj9e0 z_4}>MXELj|WLIywv%2s0>b}hCo!QkpGr?Wi;4aA4?VhUIyNLV3;)yq2y7tn7b;0`C z-8xu=c2~i8jOvgzxGRuj*F2ePS#_sn>+P1UH@9Y5p2)U5kq#(7*oS<}{igeFAegS- znF;L526o*E9K0Pkm}^^o{l(uI{_WvRTW_|l_YYTn9L)4RlkIy3`(}e|bT?QJS$wb_ z#Sb<^_70=FWQG?GY$%wV3KWRM-}O?U@fzsbimKXoBkzpg-1=dErh8AeTf8!s8JW48ae4FD1^aCJ`P zd*YoJm*s!4^}{DKT|2W~Fx-PSFy^diM%)P;x*a(5&CtJG@_S=5iyuS^%f7NG!tBc)DM35cdU@A)w2H}`hEPy2GBo6p@y0&2g zJ56Cj%svN8B&3FcP4-2qVyuSY45t8B{$r_O5OHeMz+iz7G3YfuuDWoP=M>}mhw8UN#1|Kn-j6KU5I z%mVCjA31gE$f+YopwMAgmNu#mA?fl-Dt%+wjr_bq6AxD2M-JioWtBS)QNUB={FIzy zFWar~l_2niQpgn;H*;!pAP**um`^{-%UC#?>0P^OKW9-`6F*p_RC z`L{MU0@s#n>&Uf)a+|inEd*N}I8zzUJ=h*{(1Q~TL7{?t!Y%;$gjoRcdC3x775S=h z-bcYlK2j(z)R3=M3IvOcwioIsAV5*Hyf{PQ^jDTK7Ke8QX(gx8;|S)0j~8sX-*ay+ zIB+jWW~cdSi{r6-zD)%Oc~B*Th6lefX?XA(Xn1TXc-SkIxI*%V zv{n>W162z{IiYl6*I6bJkD+{23XPd!GG|Yv)oKd0g=*BHj@1?dAT@k>$0<6)FWi8Y z=oEyJiX0JA*>m9wF#vJs2^=J=ZY0lzyf8d91?f6Y{v)*p==rIp%mnCHg|)mfhW5HC zTcEHNXCjX6RkVF4u>mq+veU-v2X7}D!G1B??Sd>6l>j1AE-72VMq%bwY_h_BnX#x0 z0Y7Jt$minI*u4b(0_YBkopX8=J{KN)`Uc28ZY;rz6mK6QnX4-HiC zJHDtJq~hZE!LTCp6=yHvj6m!+#D+kYd$Y8-lFO&8v-Ae~8)4-vL2Qhp7ibWuWtM3@ zY8oyOc9uma6dQ1$n&=~j{ez|*7=*pp@c&>P9Kvm01CzJ-9B@eZw2901E3AVi*^&dH z#QS@&ffL~ajBDo1r@5CNWQ?OZ*}MXouTjL=ELz9Li#L!?-kQ8@mN#cV{>5)?SKb(jpTF8+12)!hTb(w4}{c zn{)jW%7GXn*w?{1eC$A?nGJ*44TF&Ft#F(HH8VH$6g>YJ5;*QG0|HvoZ7^X=2nkC( zZ00Vr<9(Sf1FmY(+52W#hO?*jE@Kr=G#d33qX(u&;zP2X+!f6xg>J7nHN$E)kzs2n2irKu~bGU2GSeoSjJQUI z{!&kf&rs`8Zps1iEq&>hzGds;f$K-%Df)>H`%A>eP)Xs&^Gl{yGOAJ%V`rvP&-QB)nL-l?z zx4YU*R&ib(kFVk~6Ze0{Bgzc*z2xQpl?qM!Wagz$e6(#p0=ZfH%hV1~Er&3MhE2(36zbBsp4i%iFFxR}DDslM z$K^>^tHuw3}eccvI1Xnyyi06G%?N$)B&Z`_dh;-rT`CuE$#j* z;H&Z)GAERzE}Hgh8?GdZZuWU+uc1Q?EE z2+02jl9ap2p}Z5cG=pZJpBGv!Ji$X^)GBLknK}Mf=()t>`0_Jlk_Vnn2cCZa@#U?{ zUt2h_aAMK2`1sPAOt3o}>_$M*kHrcJnD5NTrILvA9UV!+SM#=+*px~^>$8K4 zPA7@V7vU%r^vH;5Pg9kt0(YpiKcLbAp#K~+T>~}?&AhSq+TN7wZh)*#9lLfc1%;cy zqU*LNM3Qy&7_r7&;MrW@xm=*_eubTwm2mz&Xu+m8yO-A8j4gC$YWHPp_raDp_?ZQt zR0UqGi)_8Xp}kMlKMzR$U{U@5#X(v+K02J)ek{BF7y>har?YTUlvSPkHUz!)WexeKKO=Z(qFPc*G7j` z>&hNUS~!%ev|Vu;$#=D5ZI~kfegX~;k;x#7MwCBGM#xVQMXc>9;B{7^e3`x_l2qAG z0Fo6CU>;1aO{#kav0N)AYQP+T?F{UVB?f^Up9qCj9tWpm(9%94ESH^{*|tAPR#b@W z2FC;Z0C2Kl9ffvagkd8EMU8|s6=#w8x*2OvFAlqvQFZw;Mvwe`@_mmS>L-SnGQ(kp zzL)78!`%Oie1AjE-;r~OoEjvMuf&dw=`*}dBwxKh0jnWo{Npg$;E?|xigg+en6tca zU!gC&XQ!ix7hxnOZ)Xyo&@L?DApyK6sAS~)EdlRK@Ib^^DZ#k*@p~2S`I&{Y>H40# zFokyZUB|o0#kq`UW7Y%x(rPz=q2zBMX&{a?ZeRS`wV4Gw?7Rlr7bEYU{=Gv>U&_>N z&DP;m2wP3(-KO@p6Yp+c4t)2O>#t;*Hf5VOEgV=l@JUnKV&uEc*P9m(eD+BV@_3`| zT3hPCy@r;Q_mhg6g^uq;GZn4bidKTgO?P3|{lx2+uU>||2oV~~RD`k>kaAjZ*oChK zi*kkgH&4!Ap1+LLkKKj6#47F0U0-dglAcb_Uzxvxv{GJrIyFBtKXcbtm-5`JsH24H z`LlxE<)|rGE8I1AeNBrUZ^tseby?p!R0e|4`cAC#A9th!&x#)mwl&bU6B0# zB7OFA7c?-*=r2y3Qk{EVf9g=dfk%id5dk} z+aFb0;0g-s2_fnJ3iVbJ9hi4wghMr6u+nKAkf~pVbemA4d<718pMb1ICI+YMqE}Eq zCoUUp>X9qyg<~4_eG)AE78}%QmsGy$)Qis^9zOWg;e$^P3?9wbh@6IT9#C|WcLafz z0*i?_1tBUElw*azyx$~&KpsMF!2_HGT|7ADbL5*M=L$JLB!^B9 zBj@kQ2~fRxJ0D{&yjSiBz2imlDT=}ad7OMalXw#G{Gq91FnPCzqO6AVxoa0>{L|yn zJ@U5@1wSdV4o!z$)D}xla?kT$PV&t2Urwr==f9j(n^u20sV!~(<)l#B{L4wLY4h)% zv^H)2mHVnQEt!5fsUvOv<)oIh`B(bpp3VN+UZ??Bw&d&`Y4vx{-j+81a`she^Dk%L zoHqXo&I48p#&~)6KEMCe7<$a^uyj)9#m*uOW8>|odXPV8>A`{2CC;}|7Gn45?WcOs_Hz~sOf8ppQ!n14wMdi{MYqvBs?q3#2-wPP%R_ zHF}U5U5Vgtu;4(7QU?mcORdyKE!0Lzl6+C` zd+u}Kr^YDHTk0*ajZo^)5Ww3{^`NamidpI`x@oW=rWUmMg2jTp!sXo*+MPl^HHOQW z{<{}zuA_>w?t+NmY55(?vMa)nmzyO%@^o%Db>)e4m3pHAaY7`e>NL zS$OW+5YD4_fI{YHkWbCG_W$^BcFO^N{y4_BVrS4Q`PQVXJ2KUs+3L=D4+N8yO{rBG zcXQU=JnzI~Mcw@PtCO!y&fD*(f+v$&~l>ZN*W{}MQ diff --git a/venv/lib/python3.11/site-packages/click/__pycache__/utils.cpython-311.pyc b/venv/lib/python3.11/site-packages/click/__pycache__/utils.cpython-311.pyc deleted file mode 100644 index 7614d3ad7fd75da770743cd4d2200f56d4ff10ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28027 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 DMV5=j diff --git a/venv/lib/python3.11/site-packages/click/_compat.py b/venv/lib/python3.11/site-packages/click/_compat.py deleted file mode 100644 index 9153d15..0000000 --- a/venv/lib/python3.11/site-packages/click/_compat.py +++ /dev/null @@ -1,623 +0,0 @@ -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( - 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/venv/lib/python3.11/site-packages/click/_termui_impl.py b/venv/lib/python3.11/site-packages/click/_termui_impl.py deleted file mode 100644 index ad9f8f6..0000000 --- a/venv/lib/python3.11/site-packages/click/_termui_impl.py +++ /dev/null @@ -1,788 +0,0 @@ -""" -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 shutil import which -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: - if _tempfilepager(generator, pager_cmd, color): - return - elif _pipepager(generator, pager_cmd, color): - return - if os.environ.get("TERM") in ("dumb", "emacs"): - return _nullpager(stdout, generator, color) - if (WIN or sys.platform.startswith("os2")) and _tempfilepager( - generator, "more", color - ): - return - if _pipepager(generator, "less", color): - return - - import tempfile - - fd, filename = tempfile.mkstemp() - os.close(fd) - try: - if _pipepager(generator, "more", color): - return - return _nullpager(stdout, generator, color) - finally: - os.unlink(filename) - - -def _pipepager(generator: t.Iterable[str], cmd: str, color: t.Optional[bool]) -> bool: - """Page through text by feeding it to another program. Invoking a - pager through this might support colors. - - Returns True if the command was found, False otherwise and thus another - pager should be attempted. - """ - cmd_absolute = which(cmd) - if cmd_absolute is None: - return False - - 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_absolute], - shell=True, - stdin=subprocess.PIPE, - env=env, - errors="replace", - text=True, - ) - assert c.stdin is not None - try: - for text in generator: - if not color: - text = strip_ansi(text) - - c.stdin.write(text) - except (OSError, KeyboardInterrupt): - pass - else: - c.stdin.close() - - # Less doesn't respect ^C, but catches it for its own UI purposes (aborting - # search or other commands inside less). - # - # That means when the user hits ^C, the parent process (click) terminates, - # but less is still alive, paging the output and messing up the terminal. - # - # If the user wants to make the pager exit on ^C, they should set - # `LESS='-K'`. It's not our decision to make. - while True: - try: - c.wait() - except KeyboardInterrupt: - pass - else: - break - - return True - - -def _tempfilepager( - generator: t.Iterable[str], - cmd: str, - color: t.Optional[bool], -) -> bool: - """Page through text by invoking a program on a temporary file. - - Returns True if the command was found, False otherwise and thus another - pager should be attempted. - """ - # Which is necessary for Windows, it is also recommended in the Popen docs. - cmd_absolute = which(cmd) - if cmd_absolute is None: - return False - - import subprocess - 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: - subprocess.call([cmd_absolute, filename]) - except OSError: - # Command not found - pass - finally: - os.close(fd) - os.unlink(filename) - - return True - - -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 which(editor) is not None: - 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) - args = ["explorer", f"/select,{url}"] - else: - args = ["start"] - if wait: - args.append("/WAIT") - args.append("") - args.append(url) - try: - return subprocess.call(args) - except OSError: - # Command not found - return 127 - elif CYGWIN: - if locate: - url = _unquote_file(url) - args = ["cygstart", os.path.dirname(url)] - else: - args = ["cygstart"] - if wait: - args.append("-w") - args.append(url) - try: - return subprocess.call(args) - except OSError: - # Command not found - return 127 - - 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 termios - import tty - - @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/venv/lib/python3.11/site-packages/click/_textwrap.py b/venv/lib/python3.11/site-packages/click/_textwrap.py deleted file mode 100644 index b47dcbd..0000000 --- a/venv/lib/python3.11/site-packages/click/_textwrap.py +++ /dev/null @@ -1,49 +0,0 @@ -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/venv/lib/python3.11/site-packages/click/_winconsole.py b/venv/lib/python3.11/site-packages/click/_winconsole.py deleted file mode 100644 index 6b20df3..0000000 --- a/venv/lib/python3.11/site-packages/click/_winconsole.py +++ /dev/null @@ -1,279 +0,0 @@ -# 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/venv/lib/python3.11/site-packages/click/core.py b/venv/lib/python3.11/site-packages/click/core.py deleted file mode 100644 index e630501..0000000 --- a/venv/lib/python3.11/site-packages/click/core.py +++ /dev/null @@ -1,3047 +0,0 @@ -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 .decorators import HelpOption - 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"]: - """Returns all declared parameters in the order they should be processed. - - The declared parameters are re-shuffled depending on the order in which - they were invoked, as well as the eagerness of each parameters. - - The invocation order takes precedence over the declaration order. I.e. the - order in which the user provided them to the CLI is respected. - - This behavior and its effect on callback evaluation is detailed at: - https://click.palletsprojects.com/en/stable/advanced/#callback-evaluation-order - """ - - 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, - __callback: "t.Callable[..., V]", - *args: t.Any, - **kwargs: t.Any, - ) -> V: ... - - @t.overload - def invoke( - __self, - __callback: "Command", - *args: t.Any, - **kwargs: t.Any, - ) -> t.Any: ... - - def invoke( - __self, - __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) -> 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, # type: ignore[arg-type] - info_name=info_name, - parent=parent, - **extra, - ) - - 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._help_option: t.Optional[HelpOption] = None - 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. - - Unless ``add_help_option`` is ``False``. - - .. versionchanged:: 8.1.8 - The help option is now cached to avoid creating it multiple times. - """ - help_options = self.get_help_option_names(ctx) - - if not help_options or not self.add_help_option: - return None - - # Cache the help option object in private _help_option attribute to - # avoid creating it multiple times. Not doing this will break the - # callback odering by iter_params_for_processing(), which relies on - # object comparison. - if self._help_option is None: - # Avoid circular import. - from .decorators import HelpOption - - self._help_option = HelpOption(help_options) - - return self._help_option - - 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 # type: ignore[return-value] - - 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( - f"Could not determine name for option with declarations {decls!r}" - ) - - 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 default_value else self.secondary_opts)[0] - )[1] - elif self.is_bool_flag and not self.secondary_opts and not default_value: - default_string = "" - elif 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("Argument is marked as exposed, but does not have a name.") - 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/venv/lib/python3.11/site-packages/click/decorators.py b/venv/lib/python3.11/site-packages/click/decorators.py deleted file mode 100644 index bcf8906..0000000 --- a/venv/lib/python3.11/site-packages/click/decorators.py +++ /dev/null @@ -1,562 +0,0 @@ -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 - - -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 - - -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 - 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) - - -class HelpOption(Option): - """Pre-configured ``--help`` option which immediately prints the help page - and exits the program. - """ - - def __init__( - self, - param_decls: t.Optional[t.Sequence[str]] = None, - **kwargs: t.Any, - ) -> None: - 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.setdefault("callback", self.show_help) - - super().__init__(param_decls, **kwargs) - - @staticmethod - def show_help(ctx: Context, param: Parameter, value: bool) -> None: - """Callback that print the help page on ```` and exits.""" - if value and not ctx.resilient_parsing: - echo(ctx.get_help(), color=ctx.color) - ctx.exit() - - -def help_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: - """Decorator for the pre-configured ``--help`` option defined above. - - :param param_decls: One or more option names. Defaults to the single - value ``"--help"``. - :param kwargs: Extra arguments are passed to :func:`option`. - """ - kwargs.setdefault("cls", HelpOption) - return option(*param_decls, **kwargs) diff --git a/venv/lib/python3.11/site-packages/click/exceptions.py b/venv/lib/python3.11/site-packages/click/exceptions.py deleted file mode 100644 index 0b83151..0000000 --- a/venv/lib/python3.11/site-packages/click/exceptions.py +++ /dev/null @@ -1,296 +0,0 @@ -import typing as t -from gettext import gettext as _ -from gettext import ngettext - -from ._compat import get_text_stderr -from .globals import resolve_color_default -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) - # The context will be removed by the time we print the message, so cache - # the color settings here to be used later on (in `show`) - self.show_color: t.Optional[bool] = resolve_color_default() - 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, - color=self.show_color, - ) - - -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/venv/lib/python3.11/site-packages/click/formatting.py b/venv/lib/python3.11/site-packages/click/formatting.py deleted file mode 100644 index ddd2a2f..0000000 --- a/venv/lib/python3.11/site-packages/click/formatting.py +++ /dev/null @@ -1,301 +0,0 @@ -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/venv/lib/python3.11/site-packages/click/globals.py b/venv/lib/python3.11/site-packages/click/globals.py deleted file mode 100644 index 191e712..0000000 --- a/venv/lib/python3.11/site-packages/click/globals.py +++ /dev/null @@ -1,67 +0,0 @@ -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/venv/lib/python3.11/site-packages/click/parser.py b/venv/lib/python3.11/site-packages/click/parser.py deleted file mode 100644 index 600b843..0000000 --- a/venv/lib/python3.11/site-packages/click/parser.py +++ /dev/null @@ -1,531 +0,0 @@ -""" -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/venv/lib/python3.11/site-packages/click/py.typed b/venv/lib/python3.11/site-packages/click/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/click/shell_completion.py b/venv/lib/python3.11/site-packages/click/shell_completion.py deleted file mode 100644 index 07d0f09..0000000 --- a/venv/lib/python3.11/site-packages/click/shell_completion.py +++ /dev/null @@ -1,603 +0,0 @@ -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 shutil - import subprocess - - bash_exe = shutil.which("bash") - - if bash_exe is None: - match = None - else: - output = subprocess.run( - [bash_exe, "--norc", "-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/venv/lib/python3.11/site-packages/click/termui.py b/venv/lib/python3.11/site-packages/click/termui.py deleted file mode 100644 index c084f19..0000000 --- a/venv/lib/python3.11/site-packages/click/termui.py +++ /dev/null @@ -1,784 +0,0 @@ -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) - 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/venv/lib/python3.11/site-packages/click/testing.py b/venv/lib/python3.11/site-packages/click/testing.py deleted file mode 100644 index 772b215..0000000 --- a/venv/lib/python3.11/site-packages/click/testing.py +++ /dev/null @@ -1,483 +0,0 @@ -import contextlib -import io -import os -import shlex -import shutil -import sys -import tempfile -import typing as t -from types import TracebackType - -from . import _compat -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 - old__compat_should_strip_ansi = _compat.should_strip_ansi - termui.visible_prompt_func = visible_input - termui.hidden_prompt_func = hidden_input - termui._getchar = _getchar - utils.should_strip_ansi = should_strip_ansi # type: ignore - _compat.should_strip_ansi = should_strip_ansi - - 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 - _compat.should_strip_ansi = old__compat_should_strip_ansi - 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: - pass diff --git a/venv/lib/python3.11/site-packages/click/types.py b/venv/lib/python3.11/site-packages/click/types.py deleted file mode 100644 index a70fd58..0000000 --- a/venv/lib/python3.11/site-packages/click/types.py +++ /dev/null @@ -1,1093 +0,0 @@ -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. - - 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. - - .. versionchanged:: 2.0 - Added the ``atomic`` parameter. - """ - - 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: - 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!r} 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/venv/lib/python3.11/site-packages/click/utils.py b/venv/lib/python3.11/site-packages/click/utils.py deleted file mode 100644 index 836c6f2..0000000 --- a/venv/lib/python3.11/site-packages/click/utils.py +++ /dev/null @@ -1,624 +0,0 @@ -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: - 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, color) # 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: t.Union[str, "os.PathLike[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 or Path 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/venv/lib/python3.11/site-packages/distutils-precedence.pth b/venv/lib/python3.11/site-packages/distutils-precedence.pth deleted file mode 100644 index 7f009fe..0000000 --- a/venv/lib/python3.11/site-packages/distutils-precedence.pth +++ /dev/null @@ -1 +0,0 @@ -import os; var = 'SETUPTOOLS_USE_DISTUTILS'; enabled = os.environ.get(var, 'local') == 'local'; enabled and __import__('_distutils_hack').add_shim(); diff --git a/venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/INSTALLER b/venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/METADATA b/venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/METADATA deleted file mode 100644 index 0d84502..0000000 --- a/venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/METADATA +++ /dev/null @@ -1,565 +0,0 @@ -Metadata-Version: 2.1 -Name: fastapi -Version: 0.115.12 -Summary: FastAPI framework, high performance, easy to learn, fast to code, ready for production -Author-Email: =?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= -Classifier: Intended Audience :: Information Technology -Classifier: Intended Audience :: System Administrators -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python -Classifier: Topic :: Internet -Classifier: Topic :: Software Development :: Libraries :: Application Frameworks -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Software Development :: Libraries -Classifier: Topic :: Software Development -Classifier: Typing :: Typed -Classifier: Development Status :: 4 - Beta -Classifier: Environment :: Web Environment -Classifier: Framework :: AsyncIO -Classifier: Framework :: FastAPI -Classifier: Framework :: Pydantic -Classifier: Framework :: Pydantic :: 1 -Classifier: Framework :: Pydantic :: 2 -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers -Classifier: Topic :: Internet :: WWW/HTTP -Project-URL: Homepage, https://github.com/fastapi/fastapi -Project-URL: Documentation, https://fastapi.tiangolo.com/ -Project-URL: Repository, https://github.com/fastapi/fastapi -Project-URL: Issues, https://github.com/fastapi/fastapi/issues -Project-URL: Changelog, https://fastapi.tiangolo.com/release-notes/ -Requires-Python: >=3.8 -Requires-Dist: starlette<0.47.0,>=0.40.0 -Requires-Dist: pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0,>=1.7.4 -Requires-Dist: typing-extensions>=4.8.0 -Provides-Extra: standard -Requires-Dist: fastapi-cli[standard]>=0.0.5; extra == "standard" -Requires-Dist: httpx>=0.23.0; extra == "standard" -Requires-Dist: jinja2>=3.1.5; extra == "standard" -Requires-Dist: python-multipart>=0.0.18; extra == "standard" -Requires-Dist: email-validator>=2.0.0; extra == "standard" -Requires-Dist: uvicorn[standard]>=0.12.0; extra == "standard" -Provides-Extra: all -Requires-Dist: fastapi-cli[standard]>=0.0.5; extra == "all" -Requires-Dist: httpx>=0.23.0; extra == "all" -Requires-Dist: jinja2>=3.1.5; extra == "all" -Requires-Dist: python-multipart>=0.0.18; extra == "all" -Requires-Dist: itsdangerous>=1.1.0; extra == "all" -Requires-Dist: pyyaml>=5.3.1; extra == "all" -Requires-Dist: ujson!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,>=4.0.1; extra == "all" -Requires-Dist: orjson>=3.2.1; extra == "all" -Requires-Dist: email-validator>=2.0.0; extra == "all" -Requires-Dist: uvicorn[standard]>=0.12.0; extra == "all" -Requires-Dist: pydantic-settings>=2.0.0; extra == "all" -Requires-Dist: pydantic-extra-types>=2.0.0; extra == "all" -Description-Content-Type: text/markdown - -

- FastAPI -

-

- FastAPI framework, high performance, easy to learn, fast to code, ready for production -

-

- - Test - - - Coverage - - - Package version - - - Supported Python versions - -

- ---- - -**Documentation**: https://fastapi.tiangolo.com - -**Source Code**: https://github.com/fastapi/fastapi - ---- - -FastAPI is a modern, fast (high-performance), web framework for building APIs with Python based on standard Python type hints. - -The key features are: - -* **Fast**: Very high performance, on par with **NodeJS** and **Go** (thanks to Starlette and Pydantic). [One of the fastest Python frameworks available](#performance). -* **Fast to code**: Increase the speed to develop features by about 200% to 300%. * -* **Fewer bugs**: Reduce about 40% of human (developer) induced errors. * -* **Intuitive**: Great editor support. Completion everywhere. Less time debugging. -* **Easy**: Designed to be easy to use and learn. Less time reading docs. -* **Short**: Minimize code duplication. Multiple features from each parameter declaration. Fewer bugs. -* **Robust**: Get production-ready code. With automatic interactive documentation. -* **Standards-based**: Based on (and fully compatible with) the open standards for APIs: OpenAPI (previously known as Swagger) and JSON Schema. - -* estimation based on tests on an internal development team, building production applications. - -## Sponsors - - - - - - - - - - - - - - - - - - - - - - - - -Other sponsors - -## Opinions - -"_[...] I'm using **FastAPI** a ton these days. [...] I'm actually planning to use it for all of my team's **ML services at Microsoft**. Some of them are getting integrated into the core **Windows** product and some **Office** products._" - -
Kabir Khan - Microsoft (ref)
- ---- - -"_We adopted the **FastAPI** library to spawn a **REST** server that can be queried to obtain **predictions**. [for Ludwig]_" - -
Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref)
- ---- - -"_**Netflix** is pleased to announce the open-source release of our **crisis management** orchestration framework: **Dispatch**! [built with **FastAPI**]_" - -
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
- ---- - -"_I’m over the moon excited about **FastAPI**. It’s so fun!_" - -
Brian Okken - Python Bytes podcast host (ref)
- ---- - -"_Honestly, what you've built looks super solid and polished. In many ways, it's what I wanted **Hug** to be - it's really inspiring to see someone build that._" - -
Timothy Crosley - Hug creator (ref)
- ---- - -"_If you're looking to learn one **modern framework** for building REST APIs, check out **FastAPI** [...] It's fast, easy to use and easy to learn [...]_" - -"_We've switched over to **FastAPI** for our **APIs** [...] I think you'll like it [...]_" - -
Ines Montani - Matthew Honnibal - Explosion AI founders - spaCy creators (ref) - (ref)
- ---- - -"_If anyone is looking to build a production Python API, I would highly recommend **FastAPI**. It is **beautifully designed**, **simple to use** and **highly scalable**, it has become a **key component** in our API first development strategy and is driving many automations and services such as our Virtual TAC Engineer._" - -
Deon Pillsbury - Cisco (ref)
- ---- - -## **Typer**, the FastAPI of CLIs - - - -If you are building a CLI app to be used in the terminal instead of a web API, check out **Typer**. - -**Typer** is FastAPI's little sibling. And it's intended to be the **FastAPI of CLIs**. ⌨️ 🚀 - -## Requirements - -FastAPI stands on the shoulders of giants: - -* Starlette for the web parts. -* Pydantic for the data parts. - -## Installation - -Create and activate a virtual environment and then install FastAPI: - -
- -```console -$ pip install "fastapi[standard]" - ----> 100% -``` - -
- -**Note**: Make sure you put `"fastapi[standard]"` in quotes to ensure it works in all terminals. - -## Example - -### Create it - -* Create a file `main.py` with: - -```Python -from typing import Union - -from fastapi import FastAPI - -app = FastAPI() - - -@app.get("/") -def read_root(): - return {"Hello": "World"} - - -@app.get("/items/{item_id}") -def read_item(item_id: int, q: Union[str, None] = None): - return {"item_id": item_id, "q": q} -``` - -
-Or use async def... - -If your code uses `async` / `await`, use `async def`: - -```Python hl_lines="9 14" -from typing import Union - -from fastapi import FastAPI - -app = FastAPI() - - -@app.get("/") -async def read_root(): - return {"Hello": "World"} - - -@app.get("/items/{item_id}") -async def read_item(item_id: int, q: Union[str, None] = None): - return {"item_id": item_id, "q": q} -``` - -**Note**: - -If you don't know, check the _"In a hurry?"_ section about `async` and `await` in the docs. - -
- -### Run it - -Run the server with: - -
- -```console -$ fastapi dev main.py - - ╭────────── FastAPI CLI - Development mode ───────────╮ - │ │ - │ Serving at: http://127.0.0.1:8000 │ - │ │ - │ API docs: http://127.0.0.1:8000/docs │ - │ │ - │ Running in development mode, for production use: │ - │ │ - │ fastapi run │ - │ │ - ╰─────────────────────────────────────────────────────╯ - -INFO: Will watch for changes in these directories: ['/home/user/code/awesomeapp'] -INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) -INFO: Started reloader process [2248755] using WatchFiles -INFO: Started server process [2248757] -INFO: Waiting for application startup. -INFO: Application startup complete. -``` - -
- -
-About the command fastapi dev main.py... - -The command `fastapi dev` reads your `main.py` file, detects the **FastAPI** app in it, and starts a server using Uvicorn. - -By default, `fastapi dev` will start with auto-reload enabled for local development. - -You can read more about it in the FastAPI CLI docs. - -
- -### Check it - -Open your browser at http://127.0.0.1:8000/items/5?q=somequery. - -You will see the JSON response as: - -```JSON -{"item_id": 5, "q": "somequery"} -``` - -You already created an API that: - -* Receives HTTP requests in the _paths_ `/` and `/items/{item_id}`. -* Both _paths_ take `GET` operations (also known as HTTP _methods_). -* The _path_ `/items/{item_id}` has a _path parameter_ `item_id` that should be an `int`. -* The _path_ `/items/{item_id}` has an optional `str` _query parameter_ `q`. - -### Interactive API docs - -Now go to http://127.0.0.1:8000/docs. - -You will see the automatic interactive API documentation (provided by Swagger UI): - -![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) - -### Alternative API docs - -And now, go to http://127.0.0.1:8000/redoc. - -You will see the alternative automatic documentation (provided by ReDoc): - -![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) - -## Example upgrade - -Now modify the file `main.py` to receive a body from a `PUT` request. - -Declare the body using standard Python types, thanks to Pydantic. - -```Python hl_lines="4 9-12 25-27" -from typing import Union - -from fastapi import FastAPI -from pydantic import BaseModel - -app = FastAPI() - - -class Item(BaseModel): - name: str - price: float - is_offer: Union[bool, None] = None - - -@app.get("/") -def read_root(): - return {"Hello": "World"} - - -@app.get("/items/{item_id}") -def read_item(item_id: int, q: Union[str, None] = None): - return {"item_id": item_id, "q": q} - - -@app.put("/items/{item_id}") -def update_item(item_id: int, item: Item): - return {"item_name": item.name, "item_id": item_id} -``` - -The `fastapi dev` server should reload automatically. - -### Interactive API docs upgrade - -Now go to http://127.0.0.1:8000/docs. - -* The interactive API documentation will be automatically updated, including the new body: - -![Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) - -* Click on the button "Try it out", it allows you to fill the parameters and directly interact with the API: - -![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png) - -* Then click on the "Execute" button, the user interface will communicate with your API, send the parameters, get the results and show them on the screen: - -![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png) - -### Alternative API docs upgrade - -And now, go to http://127.0.0.1:8000/redoc. - -* The alternative documentation will also reflect the new query parameter and body: - -![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) - -### Recap - -In summary, you declare **once** the types of parameters, body, etc. as function parameters. - -You do that with standard modern Python types. - -You don't have to learn a new syntax, the methods or classes of a specific library, etc. - -Just standard **Python**. - -For example, for an `int`: - -```Python -item_id: int -``` - -or for a more complex `Item` model: - -```Python -item: Item -``` - -...and with that single declaration you get: - -* Editor support, including: - * Completion. - * Type checks. -* Validation of data: - * Automatic and clear errors when the data is invalid. - * Validation even for deeply nested JSON objects. -* Conversion of input data: coming from the network to Python data and types. Reading from: - * JSON. - * Path parameters. - * Query parameters. - * Cookies. - * Headers. - * Forms. - * Files. -* Conversion of output data: converting from Python data and types to network data (as JSON): - * Convert Python types (`str`, `int`, `float`, `bool`, `list`, etc). - * `datetime` objects. - * `UUID` objects. - * Database models. - * ...and many more. -* Automatic interactive API documentation, including 2 alternative user interfaces: - * Swagger UI. - * ReDoc. - ---- - -Coming back to the previous code example, **FastAPI** will: - -* Validate that there is an `item_id` in the path for `GET` and `PUT` requests. -* Validate that the `item_id` is of type `int` for `GET` and `PUT` requests. - * If it is not, the client will see a useful, clear error. -* Check if there is an optional query parameter named `q` (as in `http://127.0.0.1:8000/items/foo?q=somequery`) for `GET` requests. - * As the `q` parameter is declared with `= None`, it is optional. - * Without the `None` it would be required (as is the body in the case with `PUT`). -* For `PUT` requests to `/items/{item_id}`, read the body as JSON: - * Check that it has a required attribute `name` that should be a `str`. - * Check that it has a required attribute `price` that has to be a `float`. - * Check that it has an optional attribute `is_offer`, that should be a `bool`, if present. - * All this would also work for deeply nested JSON objects. -* Convert from and to JSON automatically. -* Document everything with OpenAPI, that can be used by: - * Interactive documentation systems. - * Automatic client code generation systems, for many languages. -* Provide 2 interactive documentation web interfaces directly. - ---- - -We just scratched the surface, but you already get the idea of how it all works. - -Try changing the line with: - -```Python - return {"item_name": item.name, "item_id": item_id} -``` - -...from: - -```Python - ... "item_name": item.name ... -``` - -...to: - -```Python - ... "item_price": item.price ... -``` - -...and see how your editor will auto-complete the attributes and know their types: - -![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) - -For a more complete example including more features, see the Tutorial - User Guide. - -**Spoiler alert**: the tutorial - user guide includes: - -* Declaration of **parameters** from other different places as: **headers**, **cookies**, **form fields** and **files**. -* How to set **validation constraints** as `maximum_length` or `regex`. -* A very powerful and easy to use **Dependency Injection** system. -* Security and authentication, including support for **OAuth2** with **JWT tokens** and **HTTP Basic** auth. -* More advanced (but equally easy) techniques for declaring **deeply nested JSON models** (thanks to Pydantic). -* **GraphQL** integration with Strawberry and other libraries. -* Many extra features (thanks to Starlette) as: - * **WebSockets** - * extremely easy tests based on HTTPX and `pytest` - * **CORS** - * **Cookie Sessions** - * ...and more. - -## Performance - -Independent TechEmpower benchmarks show **FastAPI** applications running under Uvicorn as one of the fastest Python frameworks available, only below Starlette and Uvicorn themselves (used internally by FastAPI). (*) - -To understand more about it, see the section Benchmarks. - -## Dependencies - -FastAPI depends on Pydantic and Starlette. - -### `standard` Dependencies - -When you install FastAPI with `pip install "fastapi[standard]"` it comes with the `standard` group of optional dependencies: - -Used by Pydantic: - -* email-validator - for email validation. - -Used by Starlette: - -* httpx - Required if you want to use the `TestClient`. -* jinja2 - Required if you want to use the default template configuration. -* python-multipart - Required if you want to support form "parsing", with `request.form()`. - -Used by FastAPI / Starlette: - -* uvicorn - for the server that loads and serves your application. This includes `uvicorn[standard]`, which includes some dependencies (e.g. `uvloop`) needed for high performance serving. -* `fastapi-cli` - to provide the `fastapi` command. - -### Without `standard` Dependencies - -If you don't want to include the `standard` optional dependencies, you can install with `pip install fastapi` instead of `pip install "fastapi[standard]"`. - -### Additional Optional Dependencies - -There are some additional dependencies you might want to install. - -Additional optional Pydantic dependencies: - -* pydantic-settings - for settings management. -* pydantic-extra-types - for extra types to be used with Pydantic. - -Additional optional FastAPI dependencies: - -* orjson - Required if you want to use `ORJSONResponse`. -* ujson - Required if you want to use `UJSONResponse`. - -## License - -This project is licensed under the terms of the MIT license. diff --git a/venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/RECORD b/venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/RECORD deleted file mode 100644 index 2f6b263..0000000 --- a/venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/RECORD +++ /dev/null @@ -1,97 +0,0 @@ -../../../bin/fastapi,sha256=-T1qWBID_FYSB-oZMzU2-PdXctLtODjw34du-cbFzVw,227 -fastapi-0.115.12.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -fastapi-0.115.12.dist-info/METADATA,sha256=mV7D-DjELmGAedtcxayASLcleQv41h4mqHQhlqtLu1s,27671 -fastapi-0.115.12.dist-info/RECORD,, -fastapi-0.115.12.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -fastapi-0.115.12.dist-info/WHEEL,sha256=thaaA2w1JzcGC48WYufAs8nrYZjJm8LqNfnXFOFyCC4,90 -fastapi-0.115.12.dist-info/entry_points.txt,sha256=GCf-WbIZxyGT4MUmrPGj1cOHYZoGsNPHAvNkT6hnGeA,61 -fastapi-0.115.12.dist-info/licenses/LICENSE,sha256=Tsif_IFIW5f-xYSy1KlhAy7v_oNEU4lP2cEnSQbMdE4,1086 -fastapi/__init__.py,sha256=sgu-sth5uRYC--mOXSta-IPYjnDKUrpRSz6LuvKHf9o,1082 -fastapi/__main__.py,sha256=bKePXLdO4SsVSM6r9SVoLickJDcR2c0cTOxZRKq26YQ,37 -fastapi/__pycache__/__init__.cpython-311.pyc,, -fastapi/__pycache__/__main__.cpython-311.pyc,, -fastapi/__pycache__/_compat.cpython-311.pyc,, -fastapi/__pycache__/applications.cpython-311.pyc,, -fastapi/__pycache__/background.cpython-311.pyc,, -fastapi/__pycache__/cli.cpython-311.pyc,, -fastapi/__pycache__/concurrency.cpython-311.pyc,, -fastapi/__pycache__/datastructures.cpython-311.pyc,, -fastapi/__pycache__/encoders.cpython-311.pyc,, -fastapi/__pycache__/exception_handlers.cpython-311.pyc,, -fastapi/__pycache__/exceptions.cpython-311.pyc,, -fastapi/__pycache__/logger.cpython-311.pyc,, -fastapi/__pycache__/param_functions.cpython-311.pyc,, -fastapi/__pycache__/params.cpython-311.pyc,, -fastapi/__pycache__/requests.cpython-311.pyc,, -fastapi/__pycache__/responses.cpython-311.pyc,, -fastapi/__pycache__/routing.cpython-311.pyc,, -fastapi/__pycache__/staticfiles.cpython-311.pyc,, -fastapi/__pycache__/templating.cpython-311.pyc,, -fastapi/__pycache__/testclient.cpython-311.pyc,, -fastapi/__pycache__/types.cpython-311.pyc,, -fastapi/__pycache__/utils.cpython-311.pyc,, -fastapi/__pycache__/websockets.cpython-311.pyc,, -fastapi/_compat.py,sha256=Rg7kA7uue4Z6yr8T7hf8b7G6PeC_06mK004Nnykijfk,23953 -fastapi/applications.py,sha256=Ix-o9pQAWhEDf9J0Q1hZ0nBB1uP72c-Y3oiYzvrwqiM,176316 -fastapi/background.py,sha256=rouLirxUANrcYC824MSMypXL_Qb2HYg2YZqaiEqbEKI,1768 -fastapi/cli.py,sha256=OYhZb0NR_deuT5ofyPF2NoNBzZDNOP8Salef2nk-HqA,418 -fastapi/concurrency.py,sha256=MirfowoSpkMQZ8j_g0ZxaQKpV6eB3G-dB5TgcXCrgEA,1424 -fastapi/datastructures.py,sha256=b2PEz77XGq-u3Ur1Inwk0AGjOsQZO49yF9C7IPJ15cY,5766 -fastapi/dependencies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -fastapi/dependencies/__pycache__/__init__.cpython-311.pyc,, -fastapi/dependencies/__pycache__/models.cpython-311.pyc,, -fastapi/dependencies/__pycache__/utils.cpython-311.pyc,, -fastapi/dependencies/models.py,sha256=Pjl6vx-4nZ5Tta9kJa3-RfQKkXtCpS09-FhMgs9eWNs,1507 -fastapi/dependencies/utils.py,sha256=SwOOdQYOC0E4thJ-n1a0ohslWN9duyasNY_JBdWPTsY,35971 -fastapi/encoders.py,sha256=LvwYmFeOz4tVwvgBoC5rvZnbr7hZr73KGrU8O7zSptU,11068 -fastapi/exception_handlers.py,sha256=MBrIOA-ugjJDivIi4rSsUJBdTsjuzN76q4yh0q1COKw,1332 -fastapi/exceptions.py,sha256=taNixuFEXb67lI1bnX1ubq8y8TseJ4yoPlWjyP0fTzk,4969 -fastapi/logger.py,sha256=I9NNi3ov8AcqbsbC9wl1X-hdItKgYt2XTrx1f99Zpl4,54 -fastapi/middleware/__init__.py,sha256=oQDxiFVcc1fYJUOIFvphnK7pTT5kktmfL32QXpBFvvo,58 -fastapi/middleware/__pycache__/__init__.cpython-311.pyc,, -fastapi/middleware/__pycache__/cors.cpython-311.pyc,, -fastapi/middleware/__pycache__/gzip.cpython-311.pyc,, -fastapi/middleware/__pycache__/httpsredirect.cpython-311.pyc,, -fastapi/middleware/__pycache__/trustedhost.cpython-311.pyc,, -fastapi/middleware/__pycache__/wsgi.cpython-311.pyc,, -fastapi/middleware/cors.py,sha256=ynwjWQZoc_vbhzZ3_ZXceoaSrslHFHPdoM52rXr0WUU,79 -fastapi/middleware/gzip.py,sha256=xM5PcsH8QlAimZw4VDvcmTnqQamslThsfe3CVN2voa0,79 -fastapi/middleware/httpsredirect.py,sha256=rL8eXMnmLijwVkH7_400zHri1AekfeBd6D6qs8ix950,115 -fastapi/middleware/trustedhost.py,sha256=eE5XGRxGa7c5zPnMJDGp3BxaL25k5iVQlhnv-Pk0Pss,109 -fastapi/middleware/wsgi.py,sha256=Z3Ue-7wni4lUZMvH3G9ek__acgYdJstbnpZX_HQAboY,79 -fastapi/openapi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -fastapi/openapi/__pycache__/__init__.cpython-311.pyc,, -fastapi/openapi/__pycache__/constants.cpython-311.pyc,, -fastapi/openapi/__pycache__/docs.cpython-311.pyc,, -fastapi/openapi/__pycache__/models.cpython-311.pyc,, -fastapi/openapi/__pycache__/utils.cpython-311.pyc,, -fastapi/openapi/constants.py,sha256=adGzmis1L1HJRTE3kJ5fmHS_Noq6tIY6pWv_SFzoFDU,153 -fastapi/openapi/docs.py,sha256=XcQq-ZbQdC5sI0gIGu5MoHK1q-OFaqws7-ORTo6sjY4,10348 -fastapi/openapi/models.py,sha256=PqkxQiqcEgjKuhfUIWPZPQcyTcubtUCB3vcObLsB7VE,15397 -fastapi/openapi/utils.py,sha256=e00G_p0IdpiffBUaq31BUyiloXbpld8RryKYnYKisdY,23964 -fastapi/param_functions.py,sha256=JHNPLIYvoAwdnZZavIVsxOat8x23fX_Kl33reh7HKl8,64019 -fastapi/params.py,sha256=g450axUBQgQJODdtM7WBxZbQj9Z64inFvadrgHikBbU,28237 -fastapi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -fastapi/requests.py,sha256=zayepKFcienBllv3snmWI20Gk0oHNVLU4DDhqXBb4LU,142 -fastapi/responses.py,sha256=QNQQlwpKhQoIPZTTWkpc9d_QGeGZ_aVQPaDV3nQ8m7c,1761 -fastapi/routing.py,sha256=qwk_Vm1k4vDGdeEskNCVYTK01fDgYikqfOS_lf0DqAc,176216 -fastapi/security/__init__.py,sha256=bO8pNmxqVRXUjfl2mOKiVZLn0FpBQ61VUYVjmppnbJw,881 -fastapi/security/__pycache__/__init__.cpython-311.pyc,, -fastapi/security/__pycache__/api_key.cpython-311.pyc,, -fastapi/security/__pycache__/base.cpython-311.pyc,, -fastapi/security/__pycache__/http.cpython-311.pyc,, -fastapi/security/__pycache__/oauth2.cpython-311.pyc,, -fastapi/security/__pycache__/open_id_connect_url.cpython-311.pyc,, -fastapi/security/__pycache__/utils.cpython-311.pyc,, -fastapi/security/api_key.py,sha256=cBI5Z4zWVjL1uJrsjTeLy7MafHPAO2HQPzTrpyoIYWA,9094 -fastapi/security/base.py,sha256=dl4pvbC-RxjfbWgPtCWd8MVU-7CB2SZ22rJDXVCXO6c,141 -fastapi/security/http.py,sha256=rWR2x-5CUsjWmRucYthwRig6MG1o-boyrr4Xo-PuuxU,13606 -fastapi/security/oauth2.py,sha256=xCo5j1qpze6CvEuJHIneOI0v2fodGVMpHHVnHpiLfoM,21589 -fastapi/security/open_id_connect_url.py,sha256=8vizZ2tGqEp1ur8SwtVgyHJhGAJ5AqahgcvSpaIioDI,2722 -fastapi/security/utils.py,sha256=bd8T0YM7UQD5ATKucr1bNtAvz_Y3__dVNAv5UebiPvc,293 -fastapi/staticfiles.py,sha256=iirGIt3sdY2QZXd36ijs3Cj-T0FuGFda3cd90kM9Ikw,69 -fastapi/templating.py,sha256=4zsuTWgcjcEainMJFAlW6-gnslm6AgOS1SiiDWfmQxk,76 -fastapi/testclient.py,sha256=nBvaAmX66YldReJNZXPOk1sfuo2Q6hs8bOvIaCep6LQ,66 -fastapi/types.py,sha256=nFb36sK3DSoqoyo7Miwy3meKK5UdFBgkAgLSzQlUVyI,383 -fastapi/utils.py,sha256=y8Bj5ttMaI9tS4D60OUgXqKnktBr99NdYUnHHV9LgoY,7948 -fastapi/websockets.py,sha256=419uncYObEKZG0YcrXscfQQYLSWoE10jqxVMetGdR98,222 diff --git a/venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/REQUESTED b/venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/WHEEL b/venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/WHEEL deleted file mode 100644 index 64b991e..0000000 --- a/venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: pdm-backend (2.4.3) -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/entry_points.txt b/venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/entry_points.txt deleted file mode 100644 index b81849e..0000000 --- a/venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/entry_points.txt +++ /dev/null @@ -1,5 +0,0 @@ -[console_scripts] -fastapi = fastapi.cli:main - -[gui_scripts] - diff --git a/venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/licenses/LICENSE b/venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/licenses/LICENSE deleted file mode 100644 index 3e92463..0000000 --- a/venv/lib/python3.11/site-packages/fastapi-0.115.12.dist-info/licenses/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 Sebastián Ramírez - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/fastapi/__init__.py b/venv/lib/python3.11/site-packages/fastapi/__init__.py deleted file mode 100644 index 80eb783..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -"""FastAPI framework, high performance, easy to learn, fast to code, ready for production""" - -__version__ = "0.115.12" - -from starlette import status as status - -from .applications import FastAPI as FastAPI -from .background import BackgroundTasks as BackgroundTasks -from .datastructures import UploadFile as UploadFile -from .exceptions import HTTPException as HTTPException -from .exceptions import WebSocketException as WebSocketException -from .param_functions import Body as Body -from .param_functions import Cookie as Cookie -from .param_functions import Depends as Depends -from .param_functions import File as File -from .param_functions import Form as Form -from .param_functions import Header as Header -from .param_functions import Path as Path -from .param_functions import Query as Query -from .param_functions import Security as Security -from .requests import Request as Request -from .responses import Response as Response -from .routing import APIRouter as APIRouter -from .websockets import WebSocket as WebSocket -from .websockets import WebSocketDisconnect as WebSocketDisconnect diff --git a/venv/lib/python3.11/site-packages/fastapi/__main__.py b/venv/lib/python3.11/site-packages/fastapi/__main__.py deleted file mode 100644 index fc36465..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/__main__.py +++ /dev/null @@ -1,3 +0,0 @@ -from fastapi.cli import main - -main() diff --git a/venv/lib/python3.11/site-packages/fastapi/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 5d098315cc13743851e0d171e1afc4090d8271fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1394 zcma)*OK;RL5XZgUNA|t#ZeP4};Zac<%Ii=e1O+O%pwbqQETqUyyxVAl3!+}u#C%wE36V)*fMOfYFNWH!&O!f8@OS(2HeC= z!*$jQ+qiAG0o=hI!%g66JZ-oIJcDNpw}HF3Yq$g4!#%^(z_WPP@C@)Ao-^D9p2zcs zdu$C6ZAOWRmhC>|XxHODEDB2eu??H;Sa3h_RKTM* z)vGJ3t2b9xuYJ+uUMfr~QW2HNFNNQ(b@*Ob>8ulPI1oIE{2d~P5<>N7G2_JF2p9#g z^=M~j^Wkfc#=0~Fx-aPNHur{9{T(f>bAJr0mHV6z1D$9+pfQbnU9ogntF!@4=}nK| ztEtc{n?&uwZ~19Lh0d>TQ!f#L(rj(fR|%C$hqtJVc_ek=8cb}9C(0D49eoX~^p2bd zf%JG3QBOTtvL}}7`rLEfNyBybsgTeJI5ilGU{pb&BFtsdByr3FkLW(7DCqz zq62N8D44&1K_`MrVVPa@&v>M$LO|4Xv=b9JRkxo+=1`>2{|eF2rm0O!o3=I`ZKk!E z(WVP#QWd{@m!hZL8obQ(FU73(EjTe1L<2FWz50mmN^>Mq%tJsdfcc2NgGE0!oP8pk z(P-rKSrA7_=YF6rg8f!36bc!7nWC2m?ZtPE19TzH>i{jMd1YuV%_~DU(!4TsE6poI zchkHww3OzRp(|-#8FJFRj?4O=I{)suoT8jEw3_CXp-X9ASw00S92Z$hQBE0JPmhy0 H59ja;Eis(J diff --git a/venv/lib/python3.11/site-packages/fastapi/__pycache__/__main__.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/__pycache__/__main__.cpython-311.pyc deleted file mode 100644 index 879f32c7bb143f066120ded3c9412510a265b8a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 zcmZ3^%ge<81Xd4Ur>g?##~=<2FhLog)qsrY3@HpLj5!Rsj8Tk?3``8EjLU$ct6^#x z7#UKSf*CZKUxGw58E>)VCT8aOX)@j7PD?BGw;(Y&J25@ASRZPZetbO0 z`1p9eg34bUHo5sJr8%i~MI1n58G*PMq6Z8t4J?gpEo=>7Si}ZY F3INDrK`#IR diff --git a/venv/lib/python3.11/site-packages/fastapi/__pycache__/_compat.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/__pycache__/_compat.cpython-311.pyc deleted file mode 100644 index e53e97d22e2d5eee2a0dfc41dc8f85e8e8135720..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32746 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 diff --git a/venv/lib/python3.11/site-packages/fastapi/__pycache__/cli.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/__pycache__/cli.cpython-311.pyc deleted file mode 100644 index 38779fc6d8beea5efe2d2fb42955fc74ad019834..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 757 zcmaJ<&1(}u6o0cH$>wVVO-`Pcrk8+rEk%?ff(Jo+$U(g{B4wN1ri;6?!|WunMIn|R zQt;%Zo;_5g|4aoBVIiP+5-$t6gr0npY%3`GX5Me!=e#$M`BmKuFpO0a|H*r>+3k3AjpI*#fE!;HA0+1LEqgcBHk5t2}{b?uWdl zNfIq|eA-HK+!H-cJK5#)Lq(K4We6uA=EeoYmP=lPklu`5!6|lnhP)sGLcf#&{`4La zaTN)0ih*ZW!Pq%qhf3>U=V@g1V$TwLp0(@5!ePGEiNesK?sba=o`XK0qCE(#G3`+Rw$SS&D~{V$~0R1>2U_}g*{iO#rBMN)p;qrwlp2b@P7N0bk}ICi>TEL*lN z?%REb+k?Tt-VJ<4d!gO;Xx|R}9h>coy@;-_uC3XzFT5Mf>AaAMcGjGYrB>NKmvftg zfkJ!>VF;5_Ed^Cy8801-@)M&n>K>bK&5=1Vuf4zh*=&3<8|Ox2qLtrl9&HZiYl?|D zC@#N5tEnZ`tjxA7gS@DdLvK=g6takm`I9~YFQJXgKXzf<4I{S~c=vb}Rr$i$K}c0X zNUCV0KGtrY|Fvgd^GhiZQvVI(YHj#XE}2@N&1R{glWGe8fVhlR4s!)K&ezm;q^AA? DMfAEM diff --git a/venv/lib/python3.11/site-packages/fastapi/__pycache__/concurrency.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/__pycache__/concurrency.cpython-311.pyc deleted file mode 100644 index 00291fc989d225e5875e3739cd7848bfcf9c590a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1856 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 diff --git a/venv/lib/python3.11/site-packages/fastapi/__pycache__/encoders.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/__pycache__/encoders.cpython-311.pyc deleted file mode 100644 index faaa3023afb0b37ab0b7cb8341876ba34ca62273..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12443 zcmcgSTWlNGm6z|gNQsn0y+^NDv}IAUEXQ_i*S0LzPHow)>>_5iphujM#e_pLGb79L zQmI?`gDwn|>3R{hNKh4Myh_~y`Rq@D{n?-XbZBsq!2klhSoEXVpUEZ#g8uBDbBClj zl;U`^-5p+@xsP+tJ?GqW?>+b4`KLg@OW-;FZ~t-o!~sJ79TT;uvl{vQ*LFhQCpQR3 zI7@~kjJG9WfwVPa6>JHcU{BaBm~YEC1ZToYcp*7Jev?bbT+LZ|lkwk>X-I;cwBhf+Qo=m3@O+N==oWes zJwk7ySLjRh3H^zFVIVO;@w^#E7)%V(xGys#3@3(Z+@Bc{MiZkn9>}~R>`UyU@s`Y( z5KF{_{fYfF9n2gM#uMYh!NftD4rL~Ucp@%LCMF@>%C%*tghPo#!gOLG>`` zdfUQBP0}`Kho9woPXNnYAJmL~9X9B$doLWmkB@TwU)2U^cL20|&Pw=m{MjdNS_FF(8^E3Gm5f*P;vS!3S|YK%dR^OSDv1z7v* zSO;E!HD1R$_yVknI#&DzSd)O&`!YS&q@Af3&^%OcdHMxd5wN8Qcld!L@omnsKw?M! zj0Qg+vuZw$Ut(7>GM7%tnuFutS>a{1Jx`<1K;Me zyvWKq@%mbxkGVD5ne3Y8o@Fx`b}_?i_H)Rx{Zd+zHTRXgoX%z0jOMt$lE*@NZL(LHCf*__PEJg3>tPCS!djOW+n}p zVrnWbrDgtLo=v^Y-sYwF5-Z7UJ{{+?DPUTZCh}|II8dWt0BMH++$XBf|C85#{My5l zk4`G~=;x3}G!Mt8l6Tn53U87P<)X6Pg~-dw_EudxoaJo?k{5$AePf(}hRpWAKxCIu zvUh3B%KjQidKq};sB99$GF7{0ScyqzWhS@8$jiLQ?~|Bpj^Xd-b6Gwsk25*UT}?|o zvy{oPvX@f1zMO_y60;)lODh>>b(zmHt2`!|*<4nVMHbDV)`Fa4L_QCr2?#RtD*`X3 zQ)73>Cu5WrR2F&Q2bkb*^CC00xFQ1!GUZAJ+vZ}`rnm`%{dD#=@CwZX>ui-Rlnq*d z;f>-jOJLAE$B4O=EO$^A)A>ABT7+@S1FJ>{Gi;V)@~kNF6O@rFD zTHrwytN`Q8P*7T$Ff?%L)F}qK9A}PX)n3M`@{SEnO-v5O4Cx^HG8O9RloJt$1Pm`X zD5i6;@=k5NQA3gAA``-!{tQ&-nBS6A89 zQ^7E@WqIa`DX!Rdu&s3L;k%FCRos1l3Pwsd%fW$4a6oYnh;gWFvg>a+W<~HS35;4N zu!%$LAaX_rEM@<%?h_eSSmfAK;xQ7Ya@zLv56y%|o9KPd^);E)UOChG+I-3dOR)|8tx)aOl4UZ{t}Y zHAOh+l+mn*ofgkR1<4HnRB-0;x4&^auDr3>e059n4K2O%c&*x!7Mh!%y>f2uy9>#) zH9pJ57*KGw$!FJbrx4~B|SeGpK0${1Olofr(N1X-m01Q>zL}W^H7{kc{^S&U( z>>}z{i`FLmxT?CD z%}&J~gHUnDw)m|#%I+B>U8cFJZ&uolKBle6BCUw3f}o+HSysF^I$V+ zR$}wD<+P@&nxv?c8rI7*W4KLBddZ{~P!p3|k+H|5<=je!qw6c?QYM%zC|qL3=;E6f zb9d4lE|obE^$V&;C&xq&W&kk_iz{!`oM0|yVF_f;T)j9BO*3n`71}$HMd?GP4B`Og zMQ}pbVDU_`xWEIRiR>yE1NJPIrE%4!?Hg=KEqij-xzov#PIH~u3XQH{6 z3J~r8UVJvYX0n52v~ZTWHBVcovNp-ll3J1EoKRa#@BQd2B{3uZuVi5vgILuI7Mpkq zO7CRYOlp}I){+vt#IskL=ejv#Hr_Q3n&pSh6f7;PX?dBB7M!k_TR;=WwMov}W&$>$ zI2KqK4XL*o*wn%DB!J(NUQB1wGS~%DTDW%UjKN)X8I#75deaDloir|XxV>gG4RsDm zdGOhn(kTX*gNYC(tNN@6`ySwsGn%1%j+@vtMr;mdIb;2lm=v4cR~^d66oJV_J_Z&m zreO}fXRLy|SJspVyn)(-4lep8pR3^KfuHEgThe6RRd9(*jm}f^rmx_-L&Sb7;J*lK z=Xj;L{sPq8Y;ewM?Cjxk4N;fNv+gx-LJOWJ;EFx1yKQ0sxbZf(ld@XK0(mrCu>A0V zslG*a?zAbRk6V3~tY*4W(6qg^>~bBgO_Z(Qkg~Ojvem>dk?G;M!K9f(QGg!v$^M!I z;O`xjgF7kk{p<2^)--tn{rwdCoIdM5=;-4R@f-USXz6LawRJz|DEPrr+y#j3Si`zst{vzDv4S7#7JLQwZ=6rSfqz;*Y=EPM zol4{_aITG~xtGOp6CT<$eVXxhwOixe0UWrXeb*Dv!qd7Yp#3^8c<>?j*C>OXnyt?T zTE?vweRkCws+H`j7nDbL%9{DzMQ3COSAL}-KGqO#7*$-8wJzD4xV9ExbTr9`=U~;R z85@r@o3QJBy-Tt`fK>)eV~1>Z)F?N;&6_N8QOB+-$Jz9XUC-Su*L>Lg>D=;FP8d!9oj+ zk+^A01gm2Tt%*`$TTx5;|AKw!gsa6M88Z}!zN8{Z}=BK3LXE5@Q(dlvF&q7Vjo z8mzr}^vEc7^#T13$tPmSwXBl6wwq+taucq2F(>P8E-_gS9J5qcps%nTxQ6kv ze}E3B4i%gb(?bXJ7k7>#q#PU{EE`9=uq^`L3S6nGkIJE=X1Gz5Ld|1@EhiQkZXRw? z*O>Egh7UVh+>i?F+dLz|g$wL*VKCnu9|0$0x!uVMLj0mR&U*2k&_ zdL2`>0f6^T1)lJs!_HMD%UMa|rBM!^!6J ze3lc>V9t5W@xaE6rd`3;0uLWuex;xhD6sYWWJfsybplE@r zf~&V7cGR(E;Wa0Z!bws$Ak~iIcE9P}f_Mw%N3aBc>6(LHhg`CejuE9jwkh79S6%Ho zaXO~9eZi9L;ju@@Hd++lD-hK1c>7nz_ z4xKL_x==ZEK_}M06b0qbM9Hu8Pi%+#Hd31>%HhdMcoNQYTc^~X14_?94<@xpd+K=ntAI?sEC)!qYoz!id;0KPz=6PL&Pmk@D>E3Sb}TiG=N z_fk6XJG{_(B|N&BDu?%1!uwGKN~)2SzJo})Cx&FhUL*_P3j{jx0@)7YZUb$|Wmj*- z)r)89U23rH(VF6p8hW~0b}p4r;i7D0*V`O&^s1d*MgMkZ_r~-uj{f}U&yIg^ z{JkGM{z1{N`q~s9s5tuJ?568ymp-^u_Ky`WeMN3}-!Ec6kNxbx2M3^6J;y0{_2A`;{9^v+^IJ3J-l=J_vv6pMaFwH>wWB)xm@6@RT|-4P7?S231RWy%R^@?LuX-xJHT83l->PBSE+B?*Ir6(oGkld6<-XDz{9BF?$WCp)9;;l zd_wUL7y*X3htZuL$M|+IT$+8j_GqnWFWSG{_C;U-IL3E?Iy6#rs_vGb1b!SSv1NC( z;*Ns3>Q=jFd^_B^VSDe`<735h#dBY72cy7<2kO><>TmnWh5q${o#74ur z(Pj8BM8wk#V~Mtkyol#F#s#26*IvyDYaw`RVk@HIEwC6y5J7-PG9vD+McjIdQ2?5K zWhKptxR=oa)lW+%a5un@ zB~!{?K_%nLUg0@8qkLV^-4;t%sl9af@%rZSuLPxYy3%?W=1xo3@51!e4E${tW@A++ z@YV~gNq6PI37T#O`+Huqs&?3VoRJ)4~oVIs-uuU{(up_=`zBi183{coc6B1icm0ZN$-1l=U#iBgEk? z9@g72-a#B~rNeqB#-qd$DuwkfjCW)HwBCd9UL(H`91IyI$w8=k+Elj>LeZvMt%1;IHoFJBKLEPT;qiT8b9tS* zjpDbFmQK|jDz!ffR`G3!??8M2y3L9B?iQyWruZW-jXz59kC0##S4@K!C(?E!Z2-E> zgS34?r~WF%owtxk-wv`Jk)4PPK)1ON*%NWL~;Jj)jEj(rqxZ zr;uT%zG`4!u#)zER7(V0n4_Bun{&{2uUC5FN=LlXI$3c~y+~Q@PW__M8wo4v7}()) cPw_jP`kMweeB$Qx=u$&R8r``Y(ob6c8xU*kwEzGB diff --git a/venv/lib/python3.11/site-packages/fastapi/__pycache__/exception_handlers.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/__pycache__/exception_handlers.cpython-311.pyc deleted file mode 100644 index bb6c6ca621b7d958022155cedf21b964e98ce471..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2336 zcmbsqOKclObk^%#+gX3|YZ?e85#m!*YBx=VNQ;6>WFW<|quL~@FRP7r(zxCAnwd$` zlps|K;((Co0jV5wKp|}+xCVp-M~;q^O4dq|inxHdEK0fb#GA3RiAj(uF`j+%=FNL= z-n^f`iN!h)jEleidHsTd&~JRRKhzeo_bnjzkcmvmLbgaz~fDKpqS)wz0LiTGMz6ML^%oXp%R;~KvP2%(m0Fe7@Ukk4JkwB}SPcEkG^oSfoP z`i1l7^$&8BSM%eULgDh;*^Hja6(@?<-2Ul;K78)n8~S8EJ28GupPI;LFBd2BIX6U_ zFLPyltL&--vw2c22U>yT3j`Uhz_+&r;C&=PV3`DHYb;BqWTG`0p$+(&WZUe4@CMJYHNciyB@OOx zhFqUBs-^{YrfN%W-yCB#{m2J*lZpY8;#LwJ$cUOCL zePr{kZSB&IcF9AM@{Y8dIJr9hb$)BQp2%z`GCPS(J)GIqPBtQ4cSpXwSPwtHKE9d% zdD@c$QS~nb;4udt3MlFx+=SXPBMgKU`1TlpqnW|{*db^H%#Rk2^y;Df0O8hHgLPwn zgW7YYA|1_$q?~I;Bp~AChRRNr;VMf8o6(AbF2ZkeRm|%ZLVplC%FP=ZB7OY)#a0>U z3x0(klb?~OtUT`bWvpS!nKi&S}_V>#_E^nu@JE^QEBkftpU5)3i*34az zz)t~0V3K`qXR9hxt-k=;%%X0eykD%81i>!CbK8yWpU$(2MMe8?eF^{Bl<@evy-@YU z!i?dRU)_}OigLRTj#@6FgttDo=kP)EPk=TPowowF^WYdT_s!HnmD;|PnD<+m-PK)K=pc^%g#BA1Pg)0{bJp a3h*TQJ(;hAV`6=zL_7ud9{LX;eEJXVbUi)* diff --git a/venv/lib/python3.11/site-packages/fastapi/__pycache__/exceptions.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/__pycache__/exceptions.cpython-311.pyc deleted file mode 100644 index faf3fe5424a5853d5d8706e07647784a353812bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8249 zcmd^EO>7&-6`tkqlALni$rCypSsmMte%n#hi&Bn@3>z2Xin*5ocT zyObbS zWp))iG93a5kXMNsxkc0{O?(n0fxrlE`!D>A}Gjs9WjV$F#pkntsbaq5)EozX4Xc(qGqK4|H zJ{RzpNDYHjluJdPAQc5Ek;Z78#%o*qdbkGh2^wN*ASbSpoS?>UwPspY$qgZsfay&z z9ECC`a zbB;>cLY``7D$aGz%;gOUJ~^E^3`cqh)Xgh}yecVWXr-C?tbz;c*Q<)D3`x|?rlcv| zpADOH@&%qRyzK%<5%R%EL!P%XquXuPBB&esNM#^{j2yc|}tT zdF`5Xjt}F?;GAiejFEIY2a-xDpEC1`c1+A6L} z*Xg39=Xij;Hhp2L$w*kalCBxx#I^lk*^17=%D|#7%{1}Q4u^~VgB=Z{a_xA6`UvBb zoeen~8~$Jp#B8*E5y*$aN5u3p4I!UE-2?dA&%GLsTSv&UupC$pelFDK1I&T2@dT!l zLADEoSqGBcK<)>uuu(2iW{I+#*Yc(;C&O0ApoLt6q!p9pY(X&$SvJs2oT8gwolnmz zEWNO>kj@qIC9Pac&r@waUC7U-?dUs^I(95=fCn8ZDcS4FHEOu=o%Z%SBUM^ty`Xcc zr_O;>u1PNd&o~U^UpL7=Pmx&L&!V@Ze-``xB=+6A{JWk%_EyBc4e`xQ@y&|+*#>DG z@l>)Eho&h-D$7<}#*|bpU^yYn@0XQ=!->i=>`b!ETA`g4%xflVgA&8lU^rfe>tqEX zG`Xo(t1}&0S}4f!eSu+SFmO>$v%M&fn>;5mWc(WlSnvK-1AD?^l_1Foq_v~E3(3j; z@Fk&2kbc>{e=E@rpVhO~K%k@RQ83in_Lu;v2E(oGkAu;kcs0!ByGX}gUp9!cVUz_@ z4MtE_?1)#px$Hr*d*4=~Yi(xzz`C(Mc;~&%#Pd(;WOuxJh&OzZ#M`Pb@gld+w({vI z+viS4T~^1r!Do9FNOM+KW8WsHQxP(5O{V|m91rplo}op^&@rB&;}9rumH=~<_h89+ z=#NVtT={>?(%!(0Z%ELJIOCG%lkghPFeQ5llgaq13brjqixRg=>?-H*?ZzLq>Pdd+l)Vs z!@dcg*og0WKG&dz0g!D3(xC&FFT=JZEdyTD=#XU3$6)dbKowr&O@x!kIlyqn=c5RK z8IEEEj@Z!W;bw0mjOK|OK@X}? z78F2+-T+fd7Ec8Lv5<++!d$*Ur5RRk=%45Pv8MKnW@&z&$|k*0s|7VRc7tO z1IQ^Td{+Po@Da|Y58!J*K70%?gktO*>(*{Bu+3oXI-rI3K zc&CB5F$e_V-EbYeTUS4Ok%PPAo8s|``{7{XzA%++Vg1 zb4btY`JN~J31s{pNF7)^gkTNHnE>LnV|&9VsszZFZN1-syxIY!p>z)i zX&q|^*37l!W}@E#T_U2jIHENm)nE&vwN^lDz1ZeBVy+WzU%bPoAU4v%0a?*YcvWMV zR)y#wx?I7MomZ!V;L$mi z^}-1H#4-=hE^Yvv)`$!x`@u6B!!WonSW(&5kqp=Yb{wh=Yz=vs&j=5y{vCSvqUsme z1ViB_+3I~}HFP_%3V(cNvhIQcmtdLOgeSv~$TImc*7C=(hYiD9Qs9>GpmA(Kqn7sW zWP@$|FM)61g)dmp-g$euBJSheC!>uE9swcysKrAR6|*!Fern(YK8CMIK7_CFE|6Lm z5W@S{Z+sTKyHX`keAvZ*8c9S5_pgihI`6h3r~hk--7EH0=RHxVz-Rk=K_mXqP z*68W%W$5aE!_CX#ThnuE-x5$TxA;=J{T4HHYRq$Uk4DZJnrckR3PS~tKO_Qeli&K8T zX!T6Hth(z{j%TfX9@E=fe5BH0nA*S4byZ z-X`zJ6$0hc8{~8~5)=UcHj}l{M_BvVXC=Y{pq^&3o_vJ0aAoZBcLfE=h|Q$(%u!Uj p2bDSk2|VRI>=9N!-hs#C=RYsi&d~q> diff --git a/venv/lib/python3.11/site-packages/fastapi/__pycache__/logger.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/__pycache__/logger.cpython-311.pyc deleted file mode 100644 index b4b0760fc07551a671f750556c402cd1170e01b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 277 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 diff --git a/venv/lib/python3.11/site-packages/fastapi/__pycache__/params.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/__pycache__/params.cpython-311.pyc deleted file mode 100644 index 669fbfb7c66a9e675c3e9b7e405199e0953cb0b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29235 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 qcd+hVp5YXaj31-*Jb zUz}Nzs#}nloSm4STCAUz2sF7MQy*rkUP0wA4x8Nkl+v73yCP1Yv5Y`mtPdnUFf%eT U-e9o5fQoJ~7+%1Jir9gA0AS)$asU7T diff --git a/venv/lib/python3.11/site-packages/fastapi/__pycache__/responses.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/__pycache__/responses.cpython-311.pyc deleted file mode 100644 index 0b8b390ff7e088fb0c24b3b05899ae9b1f5fff40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2748 zcmds3&2QX96d$kc{cv})*(5C=s>Jl;Kv1%)s)(Sfs)!(8kZxAl^biBGob@De@!HGS zn>0&>R;b4wdTTF8Jq1t;Tcr|FPrPUEZr8L$2yWQpH@|sr z=FQBT_p|*~CZiCzE^{b8MGkdw%8e;$Zvz@=|f2ohwy}(6bkF$Mz5K9&(!S=$8z!&r&`dBEnKiss02PIdz&ka z=Yz@pM8&Z^W_x~|Gq29=N^Bsm7*@=U!>u5!-hip8ybl?_3!1&Y_6xxi`VDfmkFN_x z?7p}Qp7;9R@AlEt5ri1hE{xjikA$O=i;ame+*Q~DU1JbC*r;VO1H)W*8I2s}Eao7y z-8yHQ?p92*A=kb2$+yQvUk?2EvQe+rTtCk2ies>QF<)|-wazoJ5EoZP>65v_md*>? z+uMb8%dFY;YGI4nTLn1qLT$&}bnNr_bLR@K>9NV0Uin1dU~Vt|g+e9)))!x0vTK*kJfkcDaNLz@*^t7ehE46yZq}DHQmR z!*d|~V++-q!@U{K9nNvF;maUce{@ezk{835%q9K?^b_E5DLf*Bq%Gx|m&3a^CKwosb|%-H#T&SaIPWf4J o>!U}gef%7gi^uVeG)2BkObg-zBA}F|X@xvc64PVigHZwGpNjIvu>b%7 diff --git a/venv/lib/python3.11/site-packages/fastapi/__pycache__/routing.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/__pycache__/routing.cpython-311.pyc deleted file mode 100644 index fbd724259a30a37e8f573aa0c07cee88fbfaa34e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92501 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ΝNHbqG8K#?>@#-h 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 Ztb2aS0d}o9T=hN=zNWG_J5Z3N`(G|@5HbJ& diff --git a/venv/lib/python3.11/site-packages/fastapi/__pycache__/staticfiles.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/__pycache__/staticfiles.cpython-311.pyc deleted file mode 100644 index 752973d370ad2833d3ab4a16644e9a2355da018f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253 zcmZ3^%ge<81Xd4Ur@I2_#~=<2FhLogg@BCd3@HpLj5!Rsj8Tk?3@J>(44TX@K?*b( zZ*d2gB$i|*yJhC27W-*3-4ZP>Ni51qEh$OW1G0cJX&{**W}xbo44*-oetGJbB^K$I zmzV3O!&3GO)JRM tM>12dpz;@oO>TZlX-=wL5eLv@Mj$Sh1ri^a85tRGFxXtchKksLDgYacM%(}Z diff --git a/venv/lib/python3.11/site-packages/fastapi/__pycache__/templating.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/__pycache__/templating.cpython-311.pyc deleted file mode 100644 index 914b2e42fb4c62a399e203ee7eee7330481d13ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 255 zcmZ3^%ge<81Xd4Ur~3fu#~=<2FhLogg@BCd3@HpLj5!Rsj8Tk?3@J>(44TX@K?*b( zZ}EF&=4B-sg{0;dRF+H_dKP?ex xY(b_z!brV>%3mBdx%nxjIjMF<96*B^fw))}NPJ*sWMsU-;CulaDq;hw006jLN5cRB diff --git a/venv/lib/python3.11/site-packages/fastapi/__pycache__/testclient.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/__pycache__/testclient.cpython-311.pyc deleted file mode 100644 index c8930c5518e98da32607eac098ef63685fc1d53d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 250 zcmZ3^%ge<81Xd4Ur#k`Z#~=<2FhLogg@BCd3@HpLj5!Rsj8Tk?3@J>(44TX@K?*b( zZ*hgB7MD2ZWTxho_-QiT5-Bc8EXqkODM{5U0ZJr;C5o7VYF9FR25I@_pn;8058}@ssI20 diff --git a/venv/lib/python3.11/site-packages/fastapi/__pycache__/types.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/__pycache__/types.cpython-311.pyc deleted file mode 100644 index 2c3380db246bac99e54f032496823ed65c87aba3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 910 zcmb7CJ5L)y5Z?2>&6($=2t;W@<05xLc}akx5Q7j%(2%6qZt;!HiM#V@?*O}sONtb9 zaX~>55u#AINI}U@I3yR=Rz#_iG?D12vg?4b%gpZ1?l&{v%xHH%7YcdAW%m2;>U#;H z9|GKpesj2*qUtvOVLhP)S0{x zHJDK%K|nSGV9KIjPMN#`DO27wVqm(^?+9h;+sLm)oN2x$39QvT2-w&nlxviv;N2#0 zc!0WD+lf48_6UMrw3(XnJz)y)s#M$%)40Wts#M{CszPZ(iI=2?P^M7g$(a#1JQAgT znGOk?C2V>XQj(^W4htkFDP>l#sdW;<8i|?gM=4WRqViJx3%cS#=(^zjEbkV(RaCXr`_W$z|Jg`rKF@6RSYVA)nCuR?U(=n diff --git a/venv/lib/python3.11/site-packages/fastapi/__pycache__/utils.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/__pycache__/utils.cpython-311.pyc deleted file mode 100644 index ced65c0b25ed9717c9b66564cf7bb6c1d586e05d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9389 zcmcgRTWlLwc6a!GlNL#ddXHX~DeGZNPU0kvTt~JO$F^)lavp3FhUScH(tPcmkrjEV zt#)g4<-l##B1HtOgK`Tyt3@0jK>J~!`{Dg5_M;1s#snq?5TK&ikDx#?X%ZmFSI@b_ z$53$=`_m4GXYM`s+%xxa?s?6xyj~Z9>$(5BTqvt{iud)5(iWSuc*))jMQ-7$C86Z2%fF)yRF zWPDkF%+JbPCJ+lie`{u6wk_6{4aS1mP%M-U$HLk6SbMf3){%|GBH7MZC!@Dzy0YD| z?rcx2ht=(w-fUm2FWVpMXLU!0&kn=}SlO8w%nrqdI3il9O>hbB%y4!jHo_4T5&a*- z1V5?Imc;gp4$&?4bv7`qwI!3GWmNDS13JMgdc*@_RN$7(%~ruDjxAXP|4mEmpb&so zpXd^!&30(p2W{g5C$_^cC~)v=Te1s5pbd#OAuKvYyBHNC#&QuGt@g^6k}qC zky?nr=z|8DPUtgWsCPl#Feaf}91?mA?LINI6cT!GT4NJ1y1qM{&@YAr9(w)BtF(uk zO&GXoi%qgw;;Ia?m5DAngdtdsDPdR`ft8BF>g8Oz$V&SW_92RI3KLOO^8CD z!@?M>M7P+}(&yk4aK7*3fX6uSm=?GN5}o)0rC>hFsh*S+7ZP$JnMp`e)Tw$G-@JG# zKKJsexwB{HUsBB{a;vK4WGX4EzVpj+;&MhjpC}YkxhtyULP1XDbBT;4NN`_%&zTjXrq3$?w@yx6FWm!~%@wsys=1-lB<8m&< z=T5+is%}Y6$jeeZ3A|Jr73F1`OJdjhWrhO&zj_70honf>O}Je}P(;@WWo6kwUnCzx z?UM#(jVp43`5NO^FhkjLop=arw{?DT)&^+ReE5wwRP!`~83acVJO#iGtBH&9#qWS@ z7RT_#A>jMPzhmk50AP0JR8EeXDCkk529wK_;?f$XB!M0!JpbL?)b#|NT3K0{TFRsf zx#jHCbuo8+DwDcARalj;=5sTXhYwFluyhlJMDkkViYQGjfxILNsi|c-m60Y3t7<>U z<>kDv8c$?0`4v%!FXgH6WpoN&HU@v`Jb-mlwYQb+T~&W@L*BKwX~f=P1K_BE011RP z5hDymtfoM6fP@ed+hZo8d3uX6W*|PW*FeIv_kdUvo><+FV z+nv);_>dTPLPmV;O5-xHOWpvNT>Zi_Tg@Cy4rJX_;8JAG zB-h*FNy9~3VV`kri(JuMwBP4GhMu1^)_l#D3jn3pNZD%q)@(&mvn`Fx>fws=8I=D~u&`ml2= zg5hZJ)UC@4IFL#HRWTv(**q1W5TW_aVw&Q@yH7d@m_7lP;;A)1Z&R zm@&GjOP7fslmjL#C_PMKRNJ)`lm!VTnQvUW_G&Yl(>N0lipCB_P2xc;)``|mA_vMH z6Wh~eOK1mmxz##V4fkur)b6_XY_+4Obmg;4n%Ok$`jPtqGzV$t%i+m;&;IiH zyU%a9s_k9dV`cACaIc?cj67CX)#3YF@B7}(>s#_>uHqO`93y3R@9GV^oqg5eBh~J~ zYR_<$AFp=yXe>>q-A>$LtXJBGg9@kBoFdZz3? z3Ut;`6YTiHijRNnn|S1#&`dV(Nv_(}ubHu+ktY1o?C`^T0BC5qw0#a|NHYVcZ@>Lk zLS69NY4?d)^4r;`Up!*|HTZDJ3`mX;M^ThitG=q|fUaS_(0*9qk1F%4{{i@O4h$Gn z>K8Q?!BM!yt=naTI(#1tSks(=a&9Oe0t&lT!O#xbpx%q%thAawYA>47I0kmDnTn=0 zv+S+ck)Mo0Tf6r3y)C1x)-JiNULwTUr|FNw*jmi)n&}o-GAPz&|Gl$VGZ)S4m*fs3 zMY^GWi>CW~IRpJIQ2nS6VSbJIlnire@@h3oC&}CVnngx`s&*AEx48S}*0C4OO|C^t z8jmr%@Qt?z9pg*pF#JwF{V!D0W))C>NvN-Qex2El?_9?+DM<#?SD3vq`UD=6$1?e3A|uU0p-%Ys$OWC_ zZ^5t-GY^`(4t4{b-Z|@jUXqOn7q}`Q7-|EmOVVlw3(cT7a1& z)v*i=&@idolIqNfE4AsPH1Y4EcfdARUjtl-Ec~TjP~Wg)-?)e)s1eQ@uKGh89?eD^ zp|ZVur()Q^;SHi)$pJao_HKS@+f?y5`J0< zKMg|U1qTMeCbu(rq8bX9&VlDL)drr+R2z6MQ*E0L1p?6%cTZOW2g`wj-`L2$p>6AZ z*MkG)z+5FTrv&EK&w!h7XKMY70#R#w_XpS3&)mFF9oVl7JcGEtYNYp$7fWGqSMKy- zslD1esPwWfUDa-0={|_qh_T3zDEw21?XB89ioHW47OP7$wa7m^1iQ#;LbF24mw0-< zMzG;j96jK1IlMRjg7w_#J6!ebyM3YBIRd2pNZOC2{fx95NP7kv!{{GY`e*RnJypXn z4C8Ff(&Bw=8F*wFs91&+%TU=eRCR~IFVw?WTULa8f{+A}VHcjuhMThumDVUdjcyRT z1WvZp%aG)i>wyJuLGmSeEhAnRGvArsdR^t> zQJd-jFFprx7lia!!n~ROG6)!7*PG}O=nq+o<;$uSvothn(e)T6Eod4WJ;vcnxOj~- zulD`%InwJueHZ=`rnEpC*of78^Sox_oU?y$bX9{P&1tpTzJ&O|_B8^G6l|J@baZbX z-#WQ@eDnDFxt(D6gQvGfO2Ja55}Z+jGwbK7?StjuQ*f7F`_)_j^wuxmx%-Y@hbDIi zWQKI%vQo_CQ8eZ)cCaB}{{}6Xq{DgY7l;gL3KVHkaIQ__ogw>+ir-L zWO{}C3=(=EPA1u1@5j8n22HC6E*Nt3CDgCqyFLcYCk-qUKX?O(pJkrr08jG>m{8c+ zMyhU>X@aOen~>RVQwc~^yMFLMG|g%JN6R9JF)aeo zKO()B6iBv9*(ZA}}!(&!S;>_z;W1HUttpVH2mFg`m&(d}>yB#yIeoz4;m#vgbxBe1v) z6I$nlGXll;Q&=O4@h*toUt#&@2-X3p7B<%w$II7_tV6azWcACEUv z$PkUuam1Qo0IKD3KA&M9nAmp}mY~!F6!b`#@zS*iZW*0Ja0tO9fbSf~APu{m5ohU# zP{rdS^}^c1u5etHIM-{xD)FzgUzH4(TW`(e;!GO({{roV+g~Ol#(S6e*4a-pIdLfe zw;)8gIj&4z{Qg}f4Qg$N(^0W>KtKh0n+t8e zQ#!fbdH2F+iw~mz5-$&*RKlm=sNviJK(GcSmyf%|eHQ*qdNB7e^x038!>7SA0P1%~ z^yd@cAjgewNjQx0lC(W@_dQnJ3w-40v1;%B>cJz`k*Vtbv1)gJb>_GhJjjJK0-);h zYG!!ux_z1zkv7uNza^LEwmVDn5JxHPM>IR)9mLnZnY{hB=ERzd_(Pi~w(7w`?73@oXjZ^$q!sj8xyV);LIEzay}%xOLBP)q zl`N%&?V-{ecOkP6)d!0YhaO4~5B%mGRxMv#WY4`|*w3|tCN8%h*gjZpe@Y2Ft(gI} t+tyKzjBTGSN1jpIj%rpw!K`iWvb%Td$7T1JVm+wY5ect)BA}=~{udtz!+`(* diff --git a/venv/lib/python3.11/site-packages/fastapi/__pycache__/websockets.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/__pycache__/websockets.cpython-311.pyc deleted file mode 100644 index ced9d2ad2f2bfbfceaedeea9bfbf613ec5998039..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 360 zcmZ3^%ge<81Xd4Ur{4q8k3k$5V1hC}YXKS48B!Qh7;_kM8KW2(L2M=R5etZ51rjS6J_AXHUmp5piADP5<>mTmIhh4{ zrMdcLsd;7kIhjfN1(hWk`FX~AhKBmZnI);Z1&PVoiRr1u`e}(k3kovz5r*p(RQ}?y w$<0qG%}KQ@0)+@85EnZFi4V+-jEpxJ%rBs#8w}nTP|*zr#|zj{5eLu|016prTL1t6 diff --git a/venv/lib/python3.11/site-packages/fastapi/_compat.py b/venv/lib/python3.11/site-packages/fastapi/_compat.py deleted file mode 100644 index c07e4a3..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/_compat.py +++ /dev/null @@ -1,659 +0,0 @@ -from collections import deque -from copy import copy -from dataclasses import dataclass, is_dataclass -from enum import Enum -from functools import lru_cache -from typing import ( - Any, - Callable, - Deque, - Dict, - FrozenSet, - List, - Mapping, - Sequence, - Set, - Tuple, - Type, - Union, -) - -from fastapi.exceptions import RequestErrorModel -from fastapi.types import IncEx, ModelNameMap, UnionType -from pydantic import BaseModel, create_model -from pydantic.version import VERSION as PYDANTIC_VERSION -from starlette.datastructures import UploadFile -from typing_extensions import Annotated, Literal, get_args, get_origin - -PYDANTIC_VERSION_MINOR_TUPLE = tuple(int(x) for x in PYDANTIC_VERSION.split(".")[:2]) -PYDANTIC_V2 = PYDANTIC_VERSION_MINOR_TUPLE[0] == 2 - - -sequence_annotation_to_type = { - Sequence: list, - List: list, - list: list, - Tuple: tuple, - tuple: tuple, - Set: set, - set: set, - FrozenSet: frozenset, - frozenset: frozenset, - Deque: deque, - deque: deque, -} - -sequence_types = tuple(sequence_annotation_to_type.keys()) - -Url: Type[Any] - -if PYDANTIC_V2: - from pydantic import PydanticSchemaGenerationError as PydanticSchemaGenerationError - from pydantic import TypeAdapter - from pydantic import ValidationError as ValidationError - from pydantic._internal._schema_generation_shared import ( # type: ignore[attr-defined] - GetJsonSchemaHandler as GetJsonSchemaHandler, - ) - from pydantic._internal._typing_extra import eval_type_lenient - from pydantic._internal._utils import lenient_issubclass as lenient_issubclass - from pydantic.fields import FieldInfo - from pydantic.json_schema import GenerateJsonSchema as GenerateJsonSchema - from pydantic.json_schema import JsonSchemaValue as JsonSchemaValue - from pydantic_core import CoreSchema as CoreSchema - from pydantic_core import PydanticUndefined, PydanticUndefinedType - from pydantic_core import Url as Url - - try: - from pydantic_core.core_schema import ( - with_info_plain_validator_function as with_info_plain_validator_function, - ) - except ImportError: # pragma: no cover - from pydantic_core.core_schema import ( - general_plain_validator_function as with_info_plain_validator_function, # noqa: F401 - ) - - RequiredParam = PydanticUndefined - Undefined = PydanticUndefined - UndefinedType = PydanticUndefinedType - evaluate_forwardref = eval_type_lenient - Validator = Any - - class BaseConfig: - pass - - class ErrorWrapper(Exception): - pass - - @dataclass - class ModelField: - field_info: FieldInfo - name: str - mode: Literal["validation", "serialization"] = "validation" - - @property - def alias(self) -> str: - a = self.field_info.alias - return a if a is not None else self.name - - @property - def required(self) -> bool: - return self.field_info.is_required() - - @property - def default(self) -> Any: - return self.get_default() - - @property - def type_(self) -> Any: - return self.field_info.annotation - - def __post_init__(self) -> None: - self._type_adapter: TypeAdapter[Any] = TypeAdapter( - Annotated[self.field_info.annotation, self.field_info] - ) - - def get_default(self) -> Any: - if self.field_info.is_required(): - return Undefined - return self.field_info.get_default(call_default_factory=True) - - def validate( - self, - value: Any, - values: Dict[str, Any] = {}, # noqa: B006 - *, - loc: Tuple[Union[int, str], ...] = (), - ) -> Tuple[Any, Union[List[Dict[str, Any]], None]]: - try: - return ( - self._type_adapter.validate_python(value, from_attributes=True), - None, - ) - except ValidationError as exc: - return None, _regenerate_error_with_loc( - errors=exc.errors(include_url=False), loc_prefix=loc - ) - - def serialize( - self, - value: Any, - *, - mode: Literal["json", "python"] = "json", - include: Union[IncEx, None] = None, - exclude: Union[IncEx, None] = None, - by_alias: bool = True, - exclude_unset: bool = False, - exclude_defaults: bool = False, - exclude_none: bool = False, - ) -> Any: - # What calls this code passes a value that already called - # self._type_adapter.validate_python(value) - return self._type_adapter.dump_python( - value, - mode=mode, - include=include, - exclude=exclude, - by_alias=by_alias, - exclude_unset=exclude_unset, - exclude_defaults=exclude_defaults, - exclude_none=exclude_none, - ) - - def __hash__(self) -> int: - # Each ModelField is unique for our purposes, to allow making a dict from - # ModelField to its JSON Schema. - return id(self) - - def get_annotation_from_field_info( - annotation: Any, field_info: FieldInfo, field_name: str - ) -> Any: - return annotation - - def _normalize_errors(errors: Sequence[Any]) -> List[Dict[str, Any]]: - return errors # type: ignore[return-value] - - def _model_rebuild(model: Type[BaseModel]) -> None: - model.model_rebuild() - - def _model_dump( - model: BaseModel, mode: Literal["json", "python"] = "json", **kwargs: Any - ) -> Any: - return model.model_dump(mode=mode, **kwargs) - - def _get_model_config(model: BaseModel) -> Any: - return model.model_config - - def get_schema_from_model_field( - *, - field: ModelField, - schema_generator: GenerateJsonSchema, - model_name_map: ModelNameMap, - field_mapping: Dict[ - Tuple[ModelField, Literal["validation", "serialization"]], JsonSchemaValue - ], - separate_input_output_schemas: bool = True, - ) -> Dict[str, Any]: - override_mode: Union[Literal["validation"], None] = ( - None if separate_input_output_schemas else "validation" - ) - # This expects that GenerateJsonSchema was already used to generate the definitions - json_schema = field_mapping[(field, override_mode or field.mode)] - if "$ref" not in json_schema: - # TODO remove when deprecating Pydantic v1 - # Ref: https://github.com/pydantic/pydantic/blob/d61792cc42c80b13b23e3ffa74bc37ec7c77f7d1/pydantic/schema.py#L207 - json_schema["title"] = ( - field.field_info.title or field.alias.title().replace("_", " ") - ) - return json_schema - - def get_compat_model_name_map(fields: List[ModelField]) -> ModelNameMap: - return {} - - def get_definitions( - *, - fields: List[ModelField], - schema_generator: GenerateJsonSchema, - model_name_map: ModelNameMap, - separate_input_output_schemas: bool = True, - ) -> Tuple[ - Dict[ - Tuple[ModelField, Literal["validation", "serialization"]], JsonSchemaValue - ], - Dict[str, Dict[str, Any]], - ]: - override_mode: Union[Literal["validation"], None] = ( - None if separate_input_output_schemas else "validation" - ) - inputs = [ - (field, override_mode or field.mode, field._type_adapter.core_schema) - for field in fields - ] - field_mapping, definitions = schema_generator.generate_definitions( - inputs=inputs - ) - return field_mapping, definitions # type: ignore[return-value] - - def is_scalar_field(field: ModelField) -> bool: - from fastapi import params - - return field_annotation_is_scalar( - field.field_info.annotation - ) and not isinstance(field.field_info, params.Body) - - def is_sequence_field(field: ModelField) -> bool: - return field_annotation_is_sequence(field.field_info.annotation) - - def is_scalar_sequence_field(field: ModelField) -> bool: - return field_annotation_is_scalar_sequence(field.field_info.annotation) - - def is_bytes_field(field: ModelField) -> bool: - return is_bytes_or_nonable_bytes_annotation(field.type_) - - def is_bytes_sequence_field(field: ModelField) -> bool: - return is_bytes_sequence_annotation(field.type_) - - def copy_field_info(*, field_info: FieldInfo, annotation: Any) -> FieldInfo: - cls = type(field_info) - merged_field_info = cls.from_annotation(annotation) - new_field_info = copy(field_info) - new_field_info.metadata = merged_field_info.metadata - new_field_info.annotation = merged_field_info.annotation - return new_field_info - - def serialize_sequence_value(*, field: ModelField, value: Any) -> Sequence[Any]: - origin_type = ( - get_origin(field.field_info.annotation) or field.field_info.annotation - ) - assert issubclass(origin_type, sequence_types) # type: ignore[arg-type] - return sequence_annotation_to_type[origin_type](value) # type: ignore[no-any-return] - - def get_missing_field_error(loc: Tuple[str, ...]) -> Dict[str, Any]: - error = ValidationError.from_exception_data( - "Field required", [{"type": "missing", "loc": loc, "input": {}}] - ).errors(include_url=False)[0] - error["input"] = None - return error # type: ignore[return-value] - - def create_body_model( - *, fields: Sequence[ModelField], model_name: str - ) -> Type[BaseModel]: - field_params = {f.name: (f.field_info.annotation, f.field_info) for f in fields} - BodyModel: Type[BaseModel] = create_model(model_name, **field_params) # type: ignore[call-overload] - return BodyModel - - def get_model_fields(model: Type[BaseModel]) -> List[ModelField]: - return [ - ModelField(field_info=field_info, name=name) - for name, field_info in model.model_fields.items() - ] - -else: - from fastapi.openapi.constants import REF_PREFIX as REF_PREFIX - from pydantic import AnyUrl as Url # noqa: F401 - from pydantic import ( # type: ignore[assignment] - BaseConfig as BaseConfig, # noqa: F401 - ) - from pydantic import ValidationError as ValidationError # noqa: F401 - from pydantic.class_validators import ( # type: ignore[no-redef] - Validator as Validator, # noqa: F401 - ) - from pydantic.error_wrappers import ( # type: ignore[no-redef] - ErrorWrapper as ErrorWrapper, # noqa: F401 - ) - from pydantic.errors import MissingError - from pydantic.fields import ( # type: ignore[attr-defined] - SHAPE_FROZENSET, - SHAPE_LIST, - SHAPE_SEQUENCE, - SHAPE_SET, - SHAPE_SINGLETON, - SHAPE_TUPLE, - SHAPE_TUPLE_ELLIPSIS, - ) - from pydantic.fields import FieldInfo as FieldInfo - from pydantic.fields import ( # type: ignore[no-redef,attr-defined] - ModelField as ModelField, # noqa: F401 - ) - - # Keeping old "Required" functionality from Pydantic V1, without - # shadowing typing.Required. - RequiredParam: Any = Ellipsis # type: ignore[no-redef] - from pydantic.fields import ( # type: ignore[no-redef,attr-defined] - Undefined as Undefined, - ) - from pydantic.fields import ( # type: ignore[no-redef, attr-defined] - UndefinedType as UndefinedType, # noqa: F401 - ) - from pydantic.schema import ( - field_schema, - get_flat_models_from_fields, - get_model_name_map, - model_process_schema, - ) - from pydantic.schema import ( # type: ignore[no-redef] # noqa: F401 - get_annotation_from_field_info as get_annotation_from_field_info, - ) - from pydantic.typing import ( # type: ignore[no-redef] - evaluate_forwardref as evaluate_forwardref, # noqa: F401 - ) - from pydantic.utils import ( # type: ignore[no-redef] - lenient_issubclass as lenient_issubclass, # noqa: F401 - ) - - GetJsonSchemaHandler = Any # type: ignore[assignment,misc] - JsonSchemaValue = Dict[str, Any] # type: ignore[misc] - CoreSchema = Any # type: ignore[assignment,misc] - - sequence_shapes = { - SHAPE_LIST, - SHAPE_SET, - SHAPE_FROZENSET, - SHAPE_TUPLE, - SHAPE_SEQUENCE, - SHAPE_TUPLE_ELLIPSIS, - } - sequence_shape_to_type = { - SHAPE_LIST: list, - SHAPE_SET: set, - SHAPE_TUPLE: tuple, - SHAPE_SEQUENCE: list, - SHAPE_TUPLE_ELLIPSIS: list, - } - - @dataclass - class GenerateJsonSchema: # type: ignore[no-redef] - ref_template: str - - class PydanticSchemaGenerationError(Exception): # type: ignore[no-redef] - pass - - def with_info_plain_validator_function( # type: ignore[misc] - function: Callable[..., Any], - *, - ref: Union[str, None] = None, - metadata: Any = None, - serialization: Any = None, - ) -> Any: - return {} - - def get_model_definitions( - *, - flat_models: Set[Union[Type[BaseModel], Type[Enum]]], - model_name_map: Dict[Union[Type[BaseModel], Type[Enum]], str], - ) -> Dict[str, Any]: - definitions: Dict[str, Dict[str, Any]] = {} - for model in flat_models: - m_schema, m_definitions, m_nested_models = model_process_schema( - model, model_name_map=model_name_map, ref_prefix=REF_PREFIX - ) - definitions.update(m_definitions) - model_name = model_name_map[model] - if "description" in m_schema: - m_schema["description"] = m_schema["description"].split("\f")[0] - definitions[model_name] = m_schema - return definitions - - def is_pv1_scalar_field(field: ModelField) -> bool: - from fastapi import params - - field_info = field.field_info - if not ( - field.shape == SHAPE_SINGLETON # type: ignore[attr-defined] - and not lenient_issubclass(field.type_, BaseModel) - and not lenient_issubclass(field.type_, dict) - and not field_annotation_is_sequence(field.type_) - and not is_dataclass(field.type_) - and not isinstance(field_info, params.Body) - ): - return False - if field.sub_fields: # type: ignore[attr-defined] - if not all( - is_pv1_scalar_field(f) - for f in field.sub_fields # type: ignore[attr-defined] - ): - return False - return True - - def is_pv1_scalar_sequence_field(field: ModelField) -> bool: - if (field.shape in sequence_shapes) and not lenient_issubclass( # type: ignore[attr-defined] - field.type_, BaseModel - ): - if field.sub_fields is not None: # type: ignore[attr-defined] - for sub_field in field.sub_fields: # type: ignore[attr-defined] - if not is_pv1_scalar_field(sub_field): - return False - return True - if _annotation_is_sequence(field.type_): - return True - return False - - def _normalize_errors(errors: Sequence[Any]) -> List[Dict[str, Any]]: - use_errors: List[Any] = [] - for error in errors: - if isinstance(error, ErrorWrapper): - new_errors = ValidationError( # type: ignore[call-arg] - errors=[error], model=RequestErrorModel - ).errors() - use_errors.extend(new_errors) - elif isinstance(error, list): - use_errors.extend(_normalize_errors(error)) - else: - use_errors.append(error) - return use_errors - - def _model_rebuild(model: Type[BaseModel]) -> None: - model.update_forward_refs() - - def _model_dump( - model: BaseModel, mode: Literal["json", "python"] = "json", **kwargs: Any - ) -> Any: - return model.dict(**kwargs) - - def _get_model_config(model: BaseModel) -> Any: - return model.__config__ # type: ignore[attr-defined] - - def get_schema_from_model_field( - *, - field: ModelField, - schema_generator: GenerateJsonSchema, - model_name_map: ModelNameMap, - field_mapping: Dict[ - Tuple[ModelField, Literal["validation", "serialization"]], JsonSchemaValue - ], - separate_input_output_schemas: bool = True, - ) -> Dict[str, Any]: - # This expects that GenerateJsonSchema was already used to generate the definitions - return field_schema( # type: ignore[no-any-return] - field, model_name_map=model_name_map, ref_prefix=REF_PREFIX - )[0] - - def get_compat_model_name_map(fields: List[ModelField]) -> ModelNameMap: - models = get_flat_models_from_fields(fields, known_models=set()) - return get_model_name_map(models) # type: ignore[no-any-return] - - def get_definitions( - *, - fields: List[ModelField], - schema_generator: GenerateJsonSchema, - model_name_map: ModelNameMap, - separate_input_output_schemas: bool = True, - ) -> Tuple[ - Dict[ - Tuple[ModelField, Literal["validation", "serialization"]], JsonSchemaValue - ], - Dict[str, Dict[str, Any]], - ]: - models = get_flat_models_from_fields(fields, known_models=set()) - return {}, get_model_definitions( - flat_models=models, model_name_map=model_name_map - ) - - def is_scalar_field(field: ModelField) -> bool: - return is_pv1_scalar_field(field) - - def is_sequence_field(field: ModelField) -> bool: - return field.shape in sequence_shapes or _annotation_is_sequence(field.type_) # type: ignore[attr-defined] - - def is_scalar_sequence_field(field: ModelField) -> bool: - return is_pv1_scalar_sequence_field(field) - - def is_bytes_field(field: ModelField) -> bool: - return lenient_issubclass(field.type_, bytes) - - def is_bytes_sequence_field(field: ModelField) -> bool: - return field.shape in sequence_shapes and lenient_issubclass(field.type_, bytes) # type: ignore[attr-defined] - - def copy_field_info(*, field_info: FieldInfo, annotation: Any) -> FieldInfo: - return copy(field_info) - - def serialize_sequence_value(*, field: ModelField, value: Any) -> Sequence[Any]: - return sequence_shape_to_type[field.shape](value) # type: ignore[no-any-return,attr-defined] - - def get_missing_field_error(loc: Tuple[str, ...]) -> Dict[str, Any]: - missing_field_error = ErrorWrapper(MissingError(), loc=loc) # type: ignore[call-arg] - new_error = ValidationError([missing_field_error], RequestErrorModel) - return new_error.errors()[0] # type: ignore[return-value] - - def create_body_model( - *, fields: Sequence[ModelField], model_name: str - ) -> Type[BaseModel]: - BodyModel = create_model(model_name) - for f in fields: - BodyModel.__fields__[f.name] = f # type: ignore[index] - return BodyModel - - def get_model_fields(model: Type[BaseModel]) -> List[ModelField]: - return list(model.__fields__.values()) # type: ignore[attr-defined] - - -def _regenerate_error_with_loc( - *, errors: Sequence[Any], loc_prefix: Tuple[Union[str, int], ...] -) -> List[Dict[str, Any]]: - updated_loc_errors: List[Any] = [ - {**err, "loc": loc_prefix + err.get("loc", ())} - for err in _normalize_errors(errors) - ] - - return updated_loc_errors - - -def _annotation_is_sequence(annotation: Union[Type[Any], None]) -> bool: - if lenient_issubclass(annotation, (str, bytes)): - return False - return lenient_issubclass(annotation, sequence_types) - - -def field_annotation_is_sequence(annotation: Union[Type[Any], None]) -> bool: - origin = get_origin(annotation) - if origin is Union or origin is UnionType: - for arg in get_args(annotation): - if field_annotation_is_sequence(arg): - return True - return False - return _annotation_is_sequence(annotation) or _annotation_is_sequence( - get_origin(annotation) - ) - - -def value_is_sequence(value: Any) -> bool: - return isinstance(value, sequence_types) and not isinstance(value, (str, bytes)) # type: ignore[arg-type] - - -def _annotation_is_complex(annotation: Union[Type[Any], None]) -> bool: - return ( - lenient_issubclass(annotation, (BaseModel, Mapping, UploadFile)) - or _annotation_is_sequence(annotation) - or is_dataclass(annotation) - ) - - -def field_annotation_is_complex(annotation: Union[Type[Any], None]) -> bool: - origin = get_origin(annotation) - if origin is Union or origin is UnionType: - return any(field_annotation_is_complex(arg) for arg in get_args(annotation)) - - return ( - _annotation_is_complex(annotation) - or _annotation_is_complex(origin) - or hasattr(origin, "__pydantic_core_schema__") - or hasattr(origin, "__get_pydantic_core_schema__") - ) - - -def field_annotation_is_scalar(annotation: Any) -> bool: - # handle Ellipsis here to make tuple[int, ...] work nicely - return annotation is Ellipsis or not field_annotation_is_complex(annotation) - - -def field_annotation_is_scalar_sequence(annotation: Union[Type[Any], None]) -> bool: - origin = get_origin(annotation) - if origin is Union or origin is UnionType: - at_least_one_scalar_sequence = False - for arg in get_args(annotation): - if field_annotation_is_scalar_sequence(arg): - at_least_one_scalar_sequence = True - continue - elif not field_annotation_is_scalar(arg): - return False - return at_least_one_scalar_sequence - return field_annotation_is_sequence(annotation) and all( - field_annotation_is_scalar(sub_annotation) - for sub_annotation in get_args(annotation) - ) - - -def is_bytes_or_nonable_bytes_annotation(annotation: Any) -> bool: - if lenient_issubclass(annotation, bytes): - return True - origin = get_origin(annotation) - if origin is Union or origin is UnionType: - for arg in get_args(annotation): - if lenient_issubclass(arg, bytes): - return True - return False - - -def is_uploadfile_or_nonable_uploadfile_annotation(annotation: Any) -> bool: - if lenient_issubclass(annotation, UploadFile): - return True - origin = get_origin(annotation) - if origin is Union or origin is UnionType: - for arg in get_args(annotation): - if lenient_issubclass(arg, UploadFile): - return True - return False - - -def is_bytes_sequence_annotation(annotation: Any) -> bool: - origin = get_origin(annotation) - if origin is Union or origin is UnionType: - at_least_one = False - for arg in get_args(annotation): - if is_bytes_sequence_annotation(arg): - at_least_one = True - continue - return at_least_one - return field_annotation_is_sequence(annotation) and all( - is_bytes_or_nonable_bytes_annotation(sub_annotation) - for sub_annotation in get_args(annotation) - ) - - -def is_uploadfile_sequence_annotation(annotation: Any) -> bool: - origin = get_origin(annotation) - if origin is Union or origin is UnionType: - at_least_one = False - for arg in get_args(annotation): - if is_uploadfile_sequence_annotation(arg): - at_least_one = True - continue - return at_least_one - return field_annotation_is_sequence(annotation) and all( - is_uploadfile_or_nonable_uploadfile_annotation(sub_annotation) - for sub_annotation in get_args(annotation) - ) - - -@lru_cache -def get_cached_model_fields(model: Type[BaseModel]) -> List[ModelField]: - return get_model_fields(model) diff --git a/venv/lib/python3.11/site-packages/fastapi/applications.py b/venv/lib/python3.11/site-packages/fastapi/applications.py deleted file mode 100644 index 6d427cd..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/applications.py +++ /dev/null @@ -1,4585 +0,0 @@ -from enum import Enum -from typing import ( - Any, - Awaitable, - Callable, - Coroutine, - Dict, - List, - Optional, - Sequence, - Type, - TypeVar, - Union, -) - -from fastapi import routing -from fastapi.datastructures import Default, DefaultPlaceholder -from fastapi.exception_handlers import ( - http_exception_handler, - request_validation_exception_handler, - websocket_request_validation_exception_handler, -) -from fastapi.exceptions import RequestValidationError, WebSocketRequestValidationError -from fastapi.logger import logger -from fastapi.openapi.docs import ( - get_redoc_html, - get_swagger_ui_html, - get_swagger_ui_oauth2_redirect_html, -) -from fastapi.openapi.utils import get_openapi -from fastapi.params import Depends -from fastapi.types import DecoratedCallable, IncEx -from fastapi.utils import generate_unique_id -from starlette.applications import Starlette -from starlette.datastructures import State -from starlette.exceptions import HTTPException -from starlette.middleware import Middleware -from starlette.middleware.base import BaseHTTPMiddleware -from starlette.requests import Request -from starlette.responses import HTMLResponse, JSONResponse, Response -from starlette.routing import BaseRoute -from starlette.types import ASGIApp, Lifespan, Receive, Scope, Send -from typing_extensions import Annotated, Doc, deprecated - -AppType = TypeVar("AppType", bound="FastAPI") - - -class FastAPI(Starlette): - """ - `FastAPI` app class, the main entrypoint to use FastAPI. - - Read more in the - [FastAPI docs for First Steps](https://fastapi.tiangolo.com/tutorial/first-steps/). - - ## Example - - ```python - from fastapi import FastAPI - - app = FastAPI() - ``` - """ - - def __init__( - self: AppType, - *, - debug: Annotated[ - bool, - Doc( - """ - Boolean indicating if debug tracebacks should be returned on server - errors. - - Read more in the - [Starlette docs for Applications](https://www.starlette.io/applications/#instantiating-the-application). - """ - ), - ] = False, - routes: Annotated[ - Optional[List[BaseRoute]], - Doc( - """ - **Note**: you probably shouldn't use this parameter, it is inherited - from Starlette and supported for compatibility. - - --- - - A list of routes to serve incoming HTTP and WebSocket requests. - """ - ), - deprecated( - """ - You normally wouldn't use this parameter with FastAPI, it is inherited - from Starlette and supported for compatibility. - - In FastAPI, you normally would use the *path operation methods*, - like `app.get()`, `app.post()`, etc. - """ - ), - ] = None, - title: Annotated[ - str, - Doc( - """ - The title of the API. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more in the - [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api). - - **Example** - - ```python - from fastapi import FastAPI - - app = FastAPI(title="ChimichangApp") - ``` - """ - ), - ] = "FastAPI", - summary: Annotated[ - Optional[str], - Doc( - """ - A short summary of the API. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more in the - [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api). - - **Example** - - ```python - from fastapi import FastAPI - - app = FastAPI(summary="Deadpond's favorite app. Nuff said.") - ``` - """ - ), - ] = None, - description: Annotated[ - str, - Doc( - ''' - A description of the API. Supports Markdown (using - [CommonMark syntax](https://commonmark.org/)). - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more in the - [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api). - - **Example** - - ```python - from fastapi import FastAPI - - app = FastAPI( - description=""" - ChimichangApp API helps you do awesome stuff. 🚀 - - ## Items - - You can **read items**. - - ## Users - - You will be able to: - - * **Create users** (_not implemented_). - * **Read users** (_not implemented_). - - """ - ) - ``` - ''' - ), - ] = "", - version: Annotated[ - str, - Doc( - """ - The version of the API. - - **Note** This is the version of your application, not the version of - the OpenAPI specification nor the version of FastAPI being used. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more in the - [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api). - - **Example** - - ```python - from fastapi import FastAPI - - app = FastAPI(version="0.0.1") - ``` - """ - ), - ] = "0.1.0", - openapi_url: Annotated[ - Optional[str], - Doc( - """ - The URL where the OpenAPI schema will be served from. - - If you set it to `None`, no OpenAPI schema will be served publicly, and - the default automatic endpoints `/docs` and `/redoc` will also be - disabled. - - Read more in the - [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#openapi-url). - - **Example** - - ```python - from fastapi import FastAPI - - app = FastAPI(openapi_url="/api/v1/openapi.json") - ``` - """ - ), - ] = "/openapi.json", - openapi_tags: Annotated[ - Optional[List[Dict[str, Any]]], - Doc( - """ - A list of tags used by OpenAPI, these are the same `tags` you can set - in the *path operations*, like: - - * `@app.get("/users/", tags=["users"])` - * `@app.get("/items/", tags=["items"])` - - The order of the tags can be used to specify the order shown in - tools like Swagger UI, used in the automatic path `/docs`. - - It's not required to specify all the tags used. - - The tags that are not declared MAY be organized randomly or based - on the tools' logic. Each tag name in the list MUST be unique. - - The value of each item is a `dict` containing: - - * `name`: The name of the tag. - * `description`: A short description of the tag. - [CommonMark syntax](https://commonmark.org/) MAY be used for rich - text representation. - * `externalDocs`: Additional external documentation for this tag. If - provided, it would contain a `dict` with: - * `description`: A short description of the target documentation. - [CommonMark syntax](https://commonmark.org/) MAY be used for - rich text representation. - * `url`: The URL for the target documentation. Value MUST be in - the form of a URL. - - Read more in the - [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-tags). - - **Example** - - ```python - from fastapi import FastAPI - - tags_metadata = [ - { - "name": "users", - "description": "Operations with users. The **login** logic is also here.", - }, - { - "name": "items", - "description": "Manage items. So _fancy_ they have their own docs.", - "externalDocs": { - "description": "Items external docs", - "url": "https://fastapi.tiangolo.com/", - }, - }, - ] - - app = FastAPI(openapi_tags=tags_metadata) - ``` - """ - ), - ] = None, - servers: Annotated[ - Optional[List[Dict[str, Union[str, Any]]]], - Doc( - """ - A `list` of `dict`s with connectivity information to a target server. - - You would use it, for example, if your application is served from - different domains and you want to use the same Swagger UI in the - browser to interact with each of them (instead of having multiple - browser tabs open). Or if you want to leave fixed the possible URLs. - - If the servers `list` is not provided, or is an empty `list`, the - default value would be a `dict` with a `url` value of `/`. - - Each item in the `list` is a `dict` containing: - - * `url`: A URL to the target host. This URL supports Server Variables - and MAY be relative, to indicate that the host location is relative - to the location where the OpenAPI document is being served. Variable - substitutions will be made when a variable is named in `{`brackets`}`. - * `description`: An optional string describing the host designated by - the URL. [CommonMark syntax](https://commonmark.org/) MAY be used for - rich text representation. - * `variables`: A `dict` between a variable name and its value. The value - is used for substitution in the server's URL template. - - Read more in the - [FastAPI docs for Behind a Proxy](https://fastapi.tiangolo.com/advanced/behind-a-proxy/#additional-servers). - - **Example** - - ```python - from fastapi import FastAPI - - app = FastAPI( - servers=[ - {"url": "https://stag.example.com", "description": "Staging environment"}, - {"url": "https://prod.example.com", "description": "Production environment"}, - ] - ) - ``` - """ - ), - ] = None, - dependencies: Annotated[ - Optional[Sequence[Depends]], - Doc( - """ - A list of global dependencies, they will be applied to each - *path operation*, including in sub-routers. - - Read more about it in the - [FastAPI docs for Global Dependencies](https://fastapi.tiangolo.com/tutorial/dependencies/global-dependencies/). - - **Example** - - ```python - from fastapi import Depends, FastAPI - - from .dependencies import func_dep_1, func_dep_2 - - app = FastAPI(dependencies=[Depends(func_dep_1), Depends(func_dep_2)]) - ``` - """ - ), - ] = None, - default_response_class: Annotated[ - Type[Response], - Doc( - """ - The default response class to be used. - - Read more in the - [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#default-response-class). - - **Example** - - ```python - from fastapi import FastAPI - from fastapi.responses import ORJSONResponse - - app = FastAPI(default_response_class=ORJSONResponse) - ``` - """ - ), - ] = Default(JSONResponse), - redirect_slashes: Annotated[ - bool, - Doc( - """ - Whether to detect and redirect slashes in URLs when the client doesn't - use the same format. - - **Example** - - ```python - from fastapi import FastAPI - - app = FastAPI(redirect_slashes=True) # the default - - @app.get("/items/") - async def read_items(): - return [{"item_id": "Foo"}] - ``` - - With this app, if a client goes to `/items` (without a trailing slash), - they will be automatically redirected with an HTTP status code of 307 - to `/items/`. - """ - ), - ] = True, - docs_url: Annotated[ - Optional[str], - Doc( - """ - The path to the automatic interactive API documentation. - It is handled in the browser by Swagger UI. - - The default URL is `/docs`. You can disable it by setting it to `None`. - - If `openapi_url` is set to `None`, this will be automatically disabled. - - Read more in the - [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#docs-urls). - - **Example** - - ```python - from fastapi import FastAPI - - app = FastAPI(docs_url="/documentation", redoc_url=None) - ``` - """ - ), - ] = "/docs", - redoc_url: Annotated[ - Optional[str], - Doc( - """ - The path to the alternative automatic interactive API documentation - provided by ReDoc. - - The default URL is `/redoc`. You can disable it by setting it to `None`. - - If `openapi_url` is set to `None`, this will be automatically disabled. - - Read more in the - [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#docs-urls). - - **Example** - - ```python - from fastapi import FastAPI - - app = FastAPI(docs_url="/documentation", redoc_url="redocumentation") - ``` - """ - ), - ] = "/redoc", - swagger_ui_oauth2_redirect_url: Annotated[ - Optional[str], - Doc( - """ - The OAuth2 redirect endpoint for the Swagger UI. - - By default it is `/docs/oauth2-redirect`. - - This is only used if you use OAuth2 (with the "Authorize" button) - with Swagger UI. - """ - ), - ] = "/docs/oauth2-redirect", - swagger_ui_init_oauth: Annotated[ - Optional[Dict[str, Any]], - Doc( - """ - OAuth2 configuration for the Swagger UI, by default shown at `/docs`. - - Read more about the available configuration options in the - [Swagger UI docs](https://swagger.io/docs/open-source-tools/swagger-ui/usage/oauth2/). - """ - ), - ] = None, - middleware: Annotated[ - Optional[Sequence[Middleware]], - Doc( - """ - List of middleware to be added when creating the application. - - In FastAPI you would normally do this with `app.add_middleware()` - instead. - - Read more in the - [FastAPI docs for Middleware](https://fastapi.tiangolo.com/tutorial/middleware/). - """ - ), - ] = None, - exception_handlers: Annotated[ - Optional[ - Dict[ - Union[int, Type[Exception]], - Callable[[Request, Any], Coroutine[Any, Any, Response]], - ] - ], - Doc( - """ - A dictionary with handlers for exceptions. - - In FastAPI, you would normally use the decorator - `@app.exception_handler()`. - - Read more in the - [FastAPI docs for Handling Errors](https://fastapi.tiangolo.com/tutorial/handling-errors/). - """ - ), - ] = None, - on_startup: Annotated[ - Optional[Sequence[Callable[[], Any]]], - Doc( - """ - A list of startup event handler functions. - - You should instead use the `lifespan` handlers. - - Read more in the [FastAPI docs for `lifespan`](https://fastapi.tiangolo.com/advanced/events/). - """ - ), - ] = None, - on_shutdown: Annotated[ - Optional[Sequence[Callable[[], Any]]], - Doc( - """ - A list of shutdown event handler functions. - - You should instead use the `lifespan` handlers. - - Read more in the - [FastAPI docs for `lifespan`](https://fastapi.tiangolo.com/advanced/events/). - """ - ), - ] = None, - lifespan: Annotated[ - Optional[Lifespan[AppType]], - Doc( - """ - A `Lifespan` context manager handler. This replaces `startup` and - `shutdown` functions with a single context manager. - - Read more in the - [FastAPI docs for `lifespan`](https://fastapi.tiangolo.com/advanced/events/). - """ - ), - ] = None, - terms_of_service: Annotated[ - Optional[str], - Doc( - """ - A URL to the Terms of Service for your API. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more at the - [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api). - - **Example** - - ```python - app = FastAPI(terms_of_service="http://example.com/terms/") - ``` - """ - ), - ] = None, - contact: Annotated[ - Optional[Dict[str, Union[str, Any]]], - Doc( - """ - A dictionary with the contact information for the exposed API. - - It can contain several fields. - - * `name`: (`str`) The name of the contact person/organization. - * `url`: (`str`) A URL pointing to the contact information. MUST be in - the format of a URL. - * `email`: (`str`) The email address of the contact person/organization. - MUST be in the format of an email address. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more at the - [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api). - - **Example** - - ```python - app = FastAPI( - contact={ - "name": "Deadpoolio the Amazing", - "url": "http://x-force.example.com/contact/", - "email": "dp@x-force.example.com", - } - ) - ``` - """ - ), - ] = None, - license_info: Annotated[ - Optional[Dict[str, Union[str, Any]]], - Doc( - """ - A dictionary with the license information for the exposed API. - - It can contain several fields. - - * `name`: (`str`) **REQUIRED** (if a `license_info` is set). The - license name used for the API. - * `identifier`: (`str`) An [SPDX](https://spdx.dev/) license expression - for the API. The `identifier` field is mutually exclusive of the `url` - field. Available since OpenAPI 3.1.0, FastAPI 0.99.0. - * `url`: (`str`) A URL to the license used for the API. This MUST be - the format of a URL. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more at the - [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api). - - **Example** - - ```python - app = FastAPI( - license_info={ - "name": "Apache 2.0", - "url": "https://www.apache.org/licenses/LICENSE-2.0.html", - } - ) - ``` - """ - ), - ] = None, - openapi_prefix: Annotated[ - str, - Doc( - """ - A URL prefix for the OpenAPI URL. - """ - ), - deprecated( - """ - "openapi_prefix" has been deprecated in favor of "root_path", which - follows more closely the ASGI standard, is simpler, and more - automatic. - """ - ), - ] = "", - root_path: Annotated[ - str, - Doc( - """ - A path prefix handled by a proxy that is not seen by the application - but is seen by external clients, which affects things like Swagger UI. - - Read more about it at the - [FastAPI docs for Behind a Proxy](https://fastapi.tiangolo.com/advanced/behind-a-proxy/). - - **Example** - - ```python - from fastapi import FastAPI - - app = FastAPI(root_path="/api/v1") - ``` - """ - ), - ] = "", - root_path_in_servers: Annotated[ - bool, - Doc( - """ - To disable automatically generating the URLs in the `servers` field - in the autogenerated OpenAPI using the `root_path`. - - Read more about it in the - [FastAPI docs for Behind a Proxy](https://fastapi.tiangolo.com/advanced/behind-a-proxy/#disable-automatic-server-from-root_path). - - **Example** - - ```python - from fastapi import FastAPI - - app = FastAPI(root_path_in_servers=False) - ``` - """ - ), - ] = True, - responses: Annotated[ - Optional[Dict[Union[int, str], Dict[str, Any]]], - Doc( - """ - Additional responses to be shown in OpenAPI. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Additional Responses in OpenAPI](https://fastapi.tiangolo.com/advanced/additional-responses/). - - And in the - [FastAPI docs for Bigger Applications](https://fastapi.tiangolo.com/tutorial/bigger-applications/#include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies). - """ - ), - ] = None, - callbacks: Annotated[ - Optional[List[BaseRoute]], - Doc( - """ - OpenAPI callbacks that should apply to all *path operations*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). - """ - ), - ] = None, - webhooks: Annotated[ - Optional[routing.APIRouter], - Doc( - """ - Add OpenAPI webhooks. This is similar to `callbacks` but it doesn't - depend on specific *path operations*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - **Note**: This is available since OpenAPI 3.1.0, FastAPI 0.99.0. - - Read more about it in the - [FastAPI docs for OpenAPI Webhooks](https://fastapi.tiangolo.com/advanced/openapi-webhooks/). - """ - ), - ] = None, - deprecated: Annotated[ - Optional[bool], - Doc( - """ - Mark all *path operations* as deprecated. You probably don't need it, - but it's available. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - include_in_schema: Annotated[ - bool, - Doc( - """ - To include (or not) all the *path operations* in the generated OpenAPI. - You probably don't need it, but it's available. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). - """ - ), - ] = True, - swagger_ui_parameters: Annotated[ - Optional[Dict[str, Any]], - Doc( - """ - Parameters to configure Swagger UI, the autogenerated interactive API - documentation (by default at `/docs`). - - Read more about it in the - [FastAPI docs about how to Configure Swagger UI](https://fastapi.tiangolo.com/how-to/configure-swagger-ui/). - """ - ), - ] = None, - generate_unique_id_function: Annotated[ - Callable[[routing.APIRoute], str], - Doc( - """ - Customize the function used to generate unique IDs for the *path - operations* shown in the generated OpenAPI. - - This is particularly useful when automatically generating clients or - SDKs for your API. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = Default(generate_unique_id), - separate_input_output_schemas: Annotated[ - bool, - Doc( - """ - Whether to generate separate OpenAPI schemas for request body and - response body when the results would be more precise. - - This is particularly useful when automatically generating clients. - - For example, if you have a model like: - - ```python - from pydantic import BaseModel - - class Item(BaseModel): - name: str - tags: list[str] = [] - ``` - - When `Item` is used for input, a request body, `tags` is not required, - the client doesn't have to provide it. - - But when using `Item` for output, for a response body, `tags` is always - available because it has a default value, even if it's just an empty - list. So, the client should be able to always expect it. - - In this case, there would be two different schemas, one for input and - another one for output. - """ - ), - ] = True, - **extra: Annotated[ - Any, - Doc( - """ - Extra keyword arguments to be stored in the app, not used by FastAPI - anywhere. - """ - ), - ], - ) -> None: - self.debug = debug - self.title = title - self.summary = summary - self.description = description - self.version = version - self.terms_of_service = terms_of_service - self.contact = contact - self.license_info = license_info - self.openapi_url = openapi_url - self.openapi_tags = openapi_tags - self.root_path_in_servers = root_path_in_servers - self.docs_url = docs_url - self.redoc_url = redoc_url - self.swagger_ui_oauth2_redirect_url = swagger_ui_oauth2_redirect_url - self.swagger_ui_init_oauth = swagger_ui_init_oauth - self.swagger_ui_parameters = swagger_ui_parameters - self.servers = servers or [] - self.separate_input_output_schemas = separate_input_output_schemas - self.extra = extra - self.openapi_version: Annotated[ - str, - Doc( - """ - The version string of OpenAPI. - - FastAPI will generate OpenAPI version 3.1.0, and will output that as - the OpenAPI version. But some tools, even though they might be - compatible with OpenAPI 3.1.0, might not recognize it as a valid. - - So you could override this value to trick those tools into using - the generated OpenAPI. Have in mind that this is a hack. But if you - avoid using features added in OpenAPI 3.1.0, it might work for your - use case. - - This is not passed as a parameter to the `FastAPI` class to avoid - giving the false idea that FastAPI would generate a different OpenAPI - schema. It is only available as an attribute. - - **Example** - - ```python - from fastapi import FastAPI - - app = FastAPI() - - app.openapi_version = "3.0.2" - ``` - """ - ), - ] = "3.1.0" - self.openapi_schema: Optional[Dict[str, Any]] = None - if self.openapi_url: - assert self.title, "A title must be provided for OpenAPI, e.g.: 'My API'" - assert self.version, "A version must be provided for OpenAPI, e.g.: '2.1.0'" - # TODO: remove when discarding the openapi_prefix parameter - if openapi_prefix: - logger.warning( - '"openapi_prefix" has been deprecated in favor of "root_path", which ' - "follows more closely the ASGI standard, is simpler, and more " - "automatic. Check the docs at " - "https://fastapi.tiangolo.com/advanced/sub-applications/" - ) - self.webhooks: Annotated[ - routing.APIRouter, - Doc( - """ - The `app.webhooks` attribute is an `APIRouter` with the *path - operations* that will be used just for documentation of webhooks. - - Read more about it in the - [FastAPI docs for OpenAPI Webhooks](https://fastapi.tiangolo.com/advanced/openapi-webhooks/). - """ - ), - ] = webhooks or routing.APIRouter() - self.root_path = root_path or openapi_prefix - self.state: Annotated[ - State, - Doc( - """ - A state object for the application. This is the same object for the - entire application, it doesn't change from request to request. - - You normally wouldn't use this in FastAPI, for most of the cases you - would instead use FastAPI dependencies. - - This is simply inherited from Starlette. - - Read more about it in the - [Starlette docs for Applications](https://www.starlette.io/applications/#storing-state-on-the-app-instance). - """ - ), - ] = State() - self.dependency_overrides: Annotated[ - Dict[Callable[..., Any], Callable[..., Any]], - Doc( - """ - A dictionary with overrides for the dependencies. - - Each key is the original dependency callable, and the value is the - actual dependency that should be called. - - This is for testing, to replace expensive dependencies with testing - versions. - - Read more about it in the - [FastAPI docs for Testing Dependencies with Overrides](https://fastapi.tiangolo.com/advanced/testing-dependencies/). - """ - ), - ] = {} - self.router: routing.APIRouter = routing.APIRouter( - routes=routes, - redirect_slashes=redirect_slashes, - dependency_overrides_provider=self, - on_startup=on_startup, - on_shutdown=on_shutdown, - lifespan=lifespan, - default_response_class=default_response_class, - dependencies=dependencies, - callbacks=callbacks, - deprecated=deprecated, - include_in_schema=include_in_schema, - responses=responses, - generate_unique_id_function=generate_unique_id_function, - ) - self.exception_handlers: Dict[ - Any, Callable[[Request, Any], Union[Response, Awaitable[Response]]] - ] = {} if exception_handlers is None else dict(exception_handlers) - self.exception_handlers.setdefault(HTTPException, http_exception_handler) - self.exception_handlers.setdefault( - RequestValidationError, request_validation_exception_handler - ) - self.exception_handlers.setdefault( - WebSocketRequestValidationError, - # Starlette still has incorrect type specification for the handlers - websocket_request_validation_exception_handler, # type: ignore - ) - - self.user_middleware: List[Middleware] = ( - [] if middleware is None else list(middleware) - ) - self.middleware_stack: Union[ASGIApp, None] = None - self.setup() - - def openapi(self) -> Dict[str, Any]: - """ - Generate the OpenAPI schema of the application. This is called by FastAPI - internally. - - The first time it is called it stores the result in the attribute - `app.openapi_schema`, and next times it is called, it just returns that same - result. To avoid the cost of generating the schema every time. - - If you need to modify the generated OpenAPI schema, you could modify it. - - Read more in the - [FastAPI docs for OpenAPI](https://fastapi.tiangolo.com/how-to/extending-openapi/). - """ - if not self.openapi_schema: - self.openapi_schema = get_openapi( - title=self.title, - version=self.version, - openapi_version=self.openapi_version, - summary=self.summary, - description=self.description, - terms_of_service=self.terms_of_service, - contact=self.contact, - license_info=self.license_info, - routes=self.routes, - webhooks=self.webhooks.routes, - tags=self.openapi_tags, - servers=self.servers, - separate_input_output_schemas=self.separate_input_output_schemas, - ) - return self.openapi_schema - - def setup(self) -> None: - if self.openapi_url: - urls = (server_data.get("url") for server_data in self.servers) - server_urls = {url for url in urls if url} - - async def openapi(req: Request) -> JSONResponse: - root_path = req.scope.get("root_path", "").rstrip("/") - if root_path not in server_urls: - if root_path and self.root_path_in_servers: - self.servers.insert(0, {"url": root_path}) - server_urls.add(root_path) - return JSONResponse(self.openapi()) - - self.add_route(self.openapi_url, openapi, include_in_schema=False) - if self.openapi_url and self.docs_url: - - async def swagger_ui_html(req: Request) -> HTMLResponse: - root_path = req.scope.get("root_path", "").rstrip("/") - openapi_url = root_path + self.openapi_url - oauth2_redirect_url = self.swagger_ui_oauth2_redirect_url - if oauth2_redirect_url: - oauth2_redirect_url = root_path + oauth2_redirect_url - return get_swagger_ui_html( - openapi_url=openapi_url, - title=f"{self.title} - Swagger UI", - oauth2_redirect_url=oauth2_redirect_url, - init_oauth=self.swagger_ui_init_oauth, - swagger_ui_parameters=self.swagger_ui_parameters, - ) - - self.add_route(self.docs_url, swagger_ui_html, include_in_schema=False) - - if self.swagger_ui_oauth2_redirect_url: - - async def swagger_ui_redirect(req: Request) -> HTMLResponse: - return get_swagger_ui_oauth2_redirect_html() - - self.add_route( - self.swagger_ui_oauth2_redirect_url, - swagger_ui_redirect, - include_in_schema=False, - ) - if self.openapi_url and self.redoc_url: - - async def redoc_html(req: Request) -> HTMLResponse: - root_path = req.scope.get("root_path", "").rstrip("/") - openapi_url = root_path + self.openapi_url - return get_redoc_html( - openapi_url=openapi_url, title=f"{self.title} - ReDoc" - ) - - self.add_route(self.redoc_url, redoc_html, include_in_schema=False) - - async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: - if self.root_path: - scope["root_path"] = self.root_path - await super().__call__(scope, receive, send) - - def add_api_route( - self, - path: str, - endpoint: Callable[..., Any], - *, - response_model: Any = Default(None), - status_code: Optional[int] = None, - tags: Optional[List[Union[str, Enum]]] = None, - dependencies: Optional[Sequence[Depends]] = None, - summary: Optional[str] = None, - description: Optional[str] = None, - response_description: str = "Successful Response", - responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None, - deprecated: Optional[bool] = None, - methods: Optional[List[str]] = None, - operation_id: Optional[str] = None, - response_model_include: Optional[IncEx] = None, - response_model_exclude: Optional[IncEx] = None, - response_model_by_alias: bool = True, - response_model_exclude_unset: bool = False, - response_model_exclude_defaults: bool = False, - response_model_exclude_none: bool = False, - include_in_schema: bool = True, - response_class: Union[Type[Response], DefaultPlaceholder] = Default( - JSONResponse - ), - name: Optional[str] = None, - openapi_extra: Optional[Dict[str, Any]] = None, - generate_unique_id_function: Callable[[routing.APIRoute], str] = Default( - generate_unique_id - ), - ) -> None: - self.router.add_api_route( - path, - endpoint=endpoint, - response_model=response_model, - status_code=status_code, - tags=tags, - dependencies=dependencies, - summary=summary, - description=description, - response_description=response_description, - responses=responses, - deprecated=deprecated, - methods=methods, - operation_id=operation_id, - response_model_include=response_model_include, - response_model_exclude=response_model_exclude, - response_model_by_alias=response_model_by_alias, - response_model_exclude_unset=response_model_exclude_unset, - response_model_exclude_defaults=response_model_exclude_defaults, - response_model_exclude_none=response_model_exclude_none, - include_in_schema=include_in_schema, - response_class=response_class, - name=name, - openapi_extra=openapi_extra, - generate_unique_id_function=generate_unique_id_function, - ) - - def api_route( - self, - path: str, - *, - response_model: Any = Default(None), - status_code: Optional[int] = None, - tags: Optional[List[Union[str, Enum]]] = None, - dependencies: Optional[Sequence[Depends]] = None, - summary: Optional[str] = None, - description: Optional[str] = None, - response_description: str = "Successful Response", - responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None, - deprecated: Optional[bool] = None, - methods: Optional[List[str]] = None, - operation_id: Optional[str] = None, - response_model_include: Optional[IncEx] = None, - response_model_exclude: Optional[IncEx] = None, - response_model_by_alias: bool = True, - response_model_exclude_unset: bool = False, - response_model_exclude_defaults: bool = False, - response_model_exclude_none: bool = False, - include_in_schema: bool = True, - response_class: Type[Response] = Default(JSONResponse), - name: Optional[str] = None, - openapi_extra: Optional[Dict[str, Any]] = None, - generate_unique_id_function: Callable[[routing.APIRoute], str] = Default( - generate_unique_id - ), - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - def decorator(func: DecoratedCallable) -> DecoratedCallable: - self.router.add_api_route( - path, - func, - response_model=response_model, - status_code=status_code, - tags=tags, - dependencies=dependencies, - summary=summary, - description=description, - response_description=response_description, - responses=responses, - deprecated=deprecated, - methods=methods, - operation_id=operation_id, - response_model_include=response_model_include, - response_model_exclude=response_model_exclude, - response_model_by_alias=response_model_by_alias, - response_model_exclude_unset=response_model_exclude_unset, - response_model_exclude_defaults=response_model_exclude_defaults, - response_model_exclude_none=response_model_exclude_none, - include_in_schema=include_in_schema, - response_class=response_class, - name=name, - openapi_extra=openapi_extra, - generate_unique_id_function=generate_unique_id_function, - ) - return func - - return decorator - - def add_api_websocket_route( - self, - path: str, - endpoint: Callable[..., Any], - name: Optional[str] = None, - *, - dependencies: Optional[Sequence[Depends]] = None, - ) -> None: - self.router.add_api_websocket_route( - path, - endpoint, - name=name, - dependencies=dependencies, - ) - - def websocket( - self, - path: Annotated[ - str, - Doc( - """ - WebSocket path. - """ - ), - ], - name: Annotated[ - Optional[str], - Doc( - """ - A name for the WebSocket. Only used internally. - """ - ), - ] = None, - *, - dependencies: Annotated[ - Optional[Sequence[Depends]], - Doc( - """ - A list of dependencies (using `Depends()`) to be used for this - WebSocket. - - Read more about it in the - [FastAPI docs for WebSockets](https://fastapi.tiangolo.com/advanced/websockets/). - """ - ), - ] = None, - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - """ - Decorate a WebSocket function. - - Read more about it in the - [FastAPI docs for WebSockets](https://fastapi.tiangolo.com/advanced/websockets/). - - **Example** - - ```python - from fastapi import FastAPI, WebSocket - - app = FastAPI() - - @app.websocket("/ws") - async def websocket_endpoint(websocket: WebSocket): - await websocket.accept() - while True: - data = await websocket.receive_text() - await websocket.send_text(f"Message text was: {data}") - ``` - """ - - def decorator(func: DecoratedCallable) -> DecoratedCallable: - self.add_api_websocket_route( - path, - func, - name=name, - dependencies=dependencies, - ) - return func - - return decorator - - def include_router( - self, - router: Annotated[routing.APIRouter, Doc("The `APIRouter` to include.")], - *, - prefix: Annotated[str, Doc("An optional path prefix for the router.")] = "", - tags: Annotated[ - Optional[List[Union[str, Enum]]], - Doc( - """ - A list of tags to be applied to all the *path operations* in this - router. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - dependencies: Annotated[ - Optional[Sequence[Depends]], - Doc( - """ - A list of dependencies (using `Depends()`) to be applied to all the - *path operations* in this router. - - Read more about it in the - [FastAPI docs for Bigger Applications - Multiple Files](https://fastapi.tiangolo.com/tutorial/bigger-applications/#include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies). - - **Example** - - ```python - from fastapi import Depends, FastAPI - - from .dependencies import get_token_header - from .internal import admin - - app = FastAPI() - - app.include_router( - admin.router, - dependencies=[Depends(get_token_header)], - ) - ``` - """ - ), - ] = None, - responses: Annotated[ - Optional[Dict[Union[int, str], Dict[str, Any]]], - Doc( - """ - Additional responses to be shown in OpenAPI. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Additional Responses in OpenAPI](https://fastapi.tiangolo.com/advanced/additional-responses/). - - And in the - [FastAPI docs for Bigger Applications](https://fastapi.tiangolo.com/tutorial/bigger-applications/#include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies). - """ - ), - ] = None, - deprecated: Annotated[ - Optional[bool], - Doc( - """ - Mark all the *path operations* in this router as deprecated. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - **Example** - - ```python - from fastapi import FastAPI - - from .internal import old_api - - app = FastAPI() - - app.include_router( - old_api.router, - deprecated=True, - ) - ``` - """ - ), - ] = None, - include_in_schema: Annotated[ - bool, - Doc( - """ - Include (or not) all the *path operations* in this router in the - generated OpenAPI schema. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - - **Example** - - ```python - from fastapi import FastAPI - - from .internal import old_api - - app = FastAPI() - - app.include_router( - old_api.router, - include_in_schema=False, - ) - ``` - """ - ), - ] = True, - default_response_class: Annotated[ - Type[Response], - Doc( - """ - Default response class to be used for the *path operations* in this - router. - - Read more in the - [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#default-response-class). - - **Example** - - ```python - from fastapi import FastAPI - from fastapi.responses import ORJSONResponse - - from .internal import old_api - - app = FastAPI() - - app.include_router( - old_api.router, - default_response_class=ORJSONResponse, - ) - ``` - """ - ), - ] = Default(JSONResponse), - callbacks: Annotated[ - Optional[List[BaseRoute]], - Doc( - """ - List of *path operations* that will be used as OpenAPI callbacks. - - This is only for OpenAPI documentation, the callbacks won't be used - directly. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). - """ - ), - ] = None, - generate_unique_id_function: Annotated[ - Callable[[routing.APIRoute], str], - Doc( - """ - Customize the function used to generate unique IDs for the *path - operations* shown in the generated OpenAPI. - - This is particularly useful when automatically generating clients or - SDKs for your API. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = Default(generate_unique_id), - ) -> None: - """ - Include an `APIRouter` in the same app. - - Read more about it in the - [FastAPI docs for Bigger Applications](https://fastapi.tiangolo.com/tutorial/bigger-applications/). - - ## Example - - ```python - from fastapi import FastAPI - - from .users import users_router - - app = FastAPI() - - app.include_router(users_router) - ``` - """ - self.router.include_router( - router, - prefix=prefix, - tags=tags, - dependencies=dependencies, - responses=responses, - deprecated=deprecated, - include_in_schema=include_in_schema, - default_response_class=default_response_class, - callbacks=callbacks, - generate_unique_id_function=generate_unique_id_function, - ) - - def get( - self, - path: Annotated[ - str, - Doc( - """ - The URL path to be used for this *path operation*. - - For example, in `http://example.com/items`, the path is `/items`. - """ - ), - ], - *, - response_model: Annotated[ - Any, - Doc( - """ - The type to use for the response. - - It could be any valid Pydantic *field* type. So, it doesn't have to - be a Pydantic model, it could be other things, like a `list`, `dict`, - etc. - - It will be used for: - - * Documentation: the generated OpenAPI (and the UI at `/docs`) will - show it as the response (JSON Schema). - * Serialization: you could return an arbitrary object and the - `response_model` would be used to serialize that object into the - corresponding JSON. - * Filtering: the JSON sent to the client will only contain the data - (fields) defined in the `response_model`. If you returned an object - that contains an attribute `password` but the `response_model` does - not include that field, the JSON sent to the client would not have - that `password`. - * Validation: whatever you return will be serialized with the - `response_model`, converting any data as necessary to generate the - corresponding JSON. But if the data in the object returned is not - valid, that would mean a violation of the contract with the client, - so it's an error from the API developer. So, FastAPI will raise an - error and return a 500 error code (Internal Server Error). - - Read more about it in the - [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). - """ - ), - ] = Default(None), - status_code: Annotated[ - Optional[int], - Doc( - """ - The default status code to be used for the response. - - You could override the status code by returning a response directly. - - Read more about it in the - [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). - """ - ), - ] = None, - tags: Annotated[ - Optional[List[Union[str, Enum]]], - Doc( - """ - A list of tags to be applied to the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). - """ - ), - ] = None, - dependencies: Annotated[ - Optional[Sequence[Depends]], - Doc( - """ - A list of dependencies (using `Depends()`) to be applied to the - *path operation*. - - Read more about it in the - [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). - """ - ), - ] = None, - summary: Annotated[ - Optional[str], - Doc( - """ - A summary for the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - A description for the *path operation*. - - If not provided, it will be extracted automatically from the docstring - of the *path operation function*. - - It can contain Markdown. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - response_description: Annotated[ - str, - Doc( - """ - The description for the default response. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = "Successful Response", - responses: Annotated[ - Optional[Dict[Union[int, str], Dict[str, Any]]], - Doc( - """ - Additional responses that could be returned by this *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - deprecated: Annotated[ - Optional[bool], - Doc( - """ - Mark this *path operation* as deprecated. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - operation_id: Annotated[ - Optional[str], - Doc( - """ - Custom operation ID to be used by this *path operation*. - - By default, it is generated automatically. - - If you provide a custom operation ID, you need to make sure it is - unique for the whole API. - - You can customize the - operation ID generation with the parameter - `generate_unique_id_function` in the `FastAPI` class. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = None, - response_model_include: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to include only certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_exclude: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to exclude certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_by_alias: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response model - should be serialized by alias when an alias is used. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = True, - response_model_exclude_unset: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that were not set and - have their default values. This is different from - `response_model_exclude_defaults` in that if the fields are set, - they will be included in the response, even if the value is the same - as the default. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_defaults: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that have the same value - as the default. This is different from `response_model_exclude_unset` - in that if the fields are set but contain the same default values, - they will be excluded from the response. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_none: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data should - exclude fields set to `None`. - - This is much simpler (less smart) than `response_model_exclude_unset` - and `response_model_exclude_defaults`. You probably want to use one of - those two instead of this one, as those allow returning `None` values - when it makes sense. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). - """ - ), - ] = False, - include_in_schema: Annotated[ - bool, - Doc( - """ - Include this *path operation* in the generated OpenAPI schema. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). - """ - ), - ] = True, - response_class: Annotated[ - Type[Response], - Doc( - """ - Response class to be used for this *path operation*. - - This will not be used if you return a response directly. - - Read more about it in the - [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). - """ - ), - ] = Default(JSONResponse), - name: Annotated[ - Optional[str], - Doc( - """ - Name for this *path operation*. Only used internally. - """ - ), - ] = None, - callbacks: Annotated[ - Optional[List[BaseRoute]], - Doc( - """ - List of *path operations* that will be used as OpenAPI callbacks. - - This is only for OpenAPI documentation, the callbacks won't be used - directly. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). - """ - ), - ] = None, - openapi_extra: Annotated[ - Optional[Dict[str, Any]], - Doc( - """ - Extra metadata to be included in the OpenAPI schema for this *path - operation*. - - Read more about it in the - [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). - """ - ), - ] = None, - generate_unique_id_function: Annotated[ - Callable[[routing.APIRoute], str], - Doc( - """ - Customize the function used to generate unique IDs for the *path - operations* shown in the generated OpenAPI. - - This is particularly useful when automatically generating clients or - SDKs for your API. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = Default(generate_unique_id), - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - """ - Add a *path operation* using an HTTP GET operation. - - ## Example - - ```python - from fastapi import FastAPI - - app = FastAPI() - - @app.get("/items/") - def read_items(): - return [{"name": "Empanada"}, {"name": "Arepa"}] - ``` - """ - return self.router.get( - path, - response_model=response_model, - status_code=status_code, - tags=tags, - dependencies=dependencies, - summary=summary, - description=description, - response_description=response_description, - responses=responses, - deprecated=deprecated, - operation_id=operation_id, - response_model_include=response_model_include, - response_model_exclude=response_model_exclude, - response_model_by_alias=response_model_by_alias, - response_model_exclude_unset=response_model_exclude_unset, - response_model_exclude_defaults=response_model_exclude_defaults, - response_model_exclude_none=response_model_exclude_none, - include_in_schema=include_in_schema, - response_class=response_class, - name=name, - callbacks=callbacks, - openapi_extra=openapi_extra, - generate_unique_id_function=generate_unique_id_function, - ) - - def put( - self, - path: Annotated[ - str, - Doc( - """ - The URL path to be used for this *path operation*. - - For example, in `http://example.com/items`, the path is `/items`. - """ - ), - ], - *, - response_model: Annotated[ - Any, - Doc( - """ - The type to use for the response. - - It could be any valid Pydantic *field* type. So, it doesn't have to - be a Pydantic model, it could be other things, like a `list`, `dict`, - etc. - - It will be used for: - - * Documentation: the generated OpenAPI (and the UI at `/docs`) will - show it as the response (JSON Schema). - * Serialization: you could return an arbitrary object and the - `response_model` would be used to serialize that object into the - corresponding JSON. - * Filtering: the JSON sent to the client will only contain the data - (fields) defined in the `response_model`. If you returned an object - that contains an attribute `password` but the `response_model` does - not include that field, the JSON sent to the client would not have - that `password`. - * Validation: whatever you return will be serialized with the - `response_model`, converting any data as necessary to generate the - corresponding JSON. But if the data in the object returned is not - valid, that would mean a violation of the contract with the client, - so it's an error from the API developer. So, FastAPI will raise an - error and return a 500 error code (Internal Server Error). - - Read more about it in the - [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). - """ - ), - ] = Default(None), - status_code: Annotated[ - Optional[int], - Doc( - """ - The default status code to be used for the response. - - You could override the status code by returning a response directly. - - Read more about it in the - [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). - """ - ), - ] = None, - tags: Annotated[ - Optional[List[Union[str, Enum]]], - Doc( - """ - A list of tags to be applied to the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). - """ - ), - ] = None, - dependencies: Annotated[ - Optional[Sequence[Depends]], - Doc( - """ - A list of dependencies (using `Depends()`) to be applied to the - *path operation*. - - Read more about it in the - [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). - """ - ), - ] = None, - summary: Annotated[ - Optional[str], - Doc( - """ - A summary for the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - A description for the *path operation*. - - If not provided, it will be extracted automatically from the docstring - of the *path operation function*. - - It can contain Markdown. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - response_description: Annotated[ - str, - Doc( - """ - The description for the default response. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = "Successful Response", - responses: Annotated[ - Optional[Dict[Union[int, str], Dict[str, Any]]], - Doc( - """ - Additional responses that could be returned by this *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - deprecated: Annotated[ - Optional[bool], - Doc( - """ - Mark this *path operation* as deprecated. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - operation_id: Annotated[ - Optional[str], - Doc( - """ - Custom operation ID to be used by this *path operation*. - - By default, it is generated automatically. - - If you provide a custom operation ID, you need to make sure it is - unique for the whole API. - - You can customize the - operation ID generation with the parameter - `generate_unique_id_function` in the `FastAPI` class. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = None, - response_model_include: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to include only certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_exclude: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to exclude certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_by_alias: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response model - should be serialized by alias when an alias is used. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = True, - response_model_exclude_unset: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that were not set and - have their default values. This is different from - `response_model_exclude_defaults` in that if the fields are set, - they will be included in the response, even if the value is the same - as the default. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_defaults: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that have the same value - as the default. This is different from `response_model_exclude_unset` - in that if the fields are set but contain the same default values, - they will be excluded from the response. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_none: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data should - exclude fields set to `None`. - - This is much simpler (less smart) than `response_model_exclude_unset` - and `response_model_exclude_defaults`. You probably want to use one of - those two instead of this one, as those allow returning `None` values - when it makes sense. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). - """ - ), - ] = False, - include_in_schema: Annotated[ - bool, - Doc( - """ - Include this *path operation* in the generated OpenAPI schema. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). - """ - ), - ] = True, - response_class: Annotated[ - Type[Response], - Doc( - """ - Response class to be used for this *path operation*. - - This will not be used if you return a response directly. - - Read more about it in the - [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). - """ - ), - ] = Default(JSONResponse), - name: Annotated[ - Optional[str], - Doc( - """ - Name for this *path operation*. Only used internally. - """ - ), - ] = None, - callbacks: Annotated[ - Optional[List[BaseRoute]], - Doc( - """ - List of *path operations* that will be used as OpenAPI callbacks. - - This is only for OpenAPI documentation, the callbacks won't be used - directly. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). - """ - ), - ] = None, - openapi_extra: Annotated[ - Optional[Dict[str, Any]], - Doc( - """ - Extra metadata to be included in the OpenAPI schema for this *path - operation*. - - Read more about it in the - [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). - """ - ), - ] = None, - generate_unique_id_function: Annotated[ - Callable[[routing.APIRoute], str], - Doc( - """ - Customize the function used to generate unique IDs for the *path - operations* shown in the generated OpenAPI. - - This is particularly useful when automatically generating clients or - SDKs for your API. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = Default(generate_unique_id), - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - """ - Add a *path operation* using an HTTP PUT operation. - - ## Example - - ```python - from fastapi import FastAPI - from pydantic import BaseModel - - class Item(BaseModel): - name: str - description: str | None = None - - app = FastAPI() - - @app.put("/items/{item_id}") - def replace_item(item_id: str, item: Item): - return {"message": "Item replaced", "id": item_id} - ``` - """ - return self.router.put( - path, - response_model=response_model, - status_code=status_code, - tags=tags, - dependencies=dependencies, - summary=summary, - description=description, - response_description=response_description, - responses=responses, - deprecated=deprecated, - operation_id=operation_id, - response_model_include=response_model_include, - response_model_exclude=response_model_exclude, - response_model_by_alias=response_model_by_alias, - response_model_exclude_unset=response_model_exclude_unset, - response_model_exclude_defaults=response_model_exclude_defaults, - response_model_exclude_none=response_model_exclude_none, - include_in_schema=include_in_schema, - response_class=response_class, - name=name, - callbacks=callbacks, - openapi_extra=openapi_extra, - generate_unique_id_function=generate_unique_id_function, - ) - - def post( - self, - path: Annotated[ - str, - Doc( - """ - The URL path to be used for this *path operation*. - - For example, in `http://example.com/items`, the path is `/items`. - """ - ), - ], - *, - response_model: Annotated[ - Any, - Doc( - """ - The type to use for the response. - - It could be any valid Pydantic *field* type. So, it doesn't have to - be a Pydantic model, it could be other things, like a `list`, `dict`, - etc. - - It will be used for: - - * Documentation: the generated OpenAPI (and the UI at `/docs`) will - show it as the response (JSON Schema). - * Serialization: you could return an arbitrary object and the - `response_model` would be used to serialize that object into the - corresponding JSON. - * Filtering: the JSON sent to the client will only contain the data - (fields) defined in the `response_model`. If you returned an object - that contains an attribute `password` but the `response_model` does - not include that field, the JSON sent to the client would not have - that `password`. - * Validation: whatever you return will be serialized with the - `response_model`, converting any data as necessary to generate the - corresponding JSON. But if the data in the object returned is not - valid, that would mean a violation of the contract with the client, - so it's an error from the API developer. So, FastAPI will raise an - error and return a 500 error code (Internal Server Error). - - Read more about it in the - [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). - """ - ), - ] = Default(None), - status_code: Annotated[ - Optional[int], - Doc( - """ - The default status code to be used for the response. - - You could override the status code by returning a response directly. - - Read more about it in the - [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). - """ - ), - ] = None, - tags: Annotated[ - Optional[List[Union[str, Enum]]], - Doc( - """ - A list of tags to be applied to the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). - """ - ), - ] = None, - dependencies: Annotated[ - Optional[Sequence[Depends]], - Doc( - """ - A list of dependencies (using `Depends()`) to be applied to the - *path operation*. - - Read more about it in the - [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). - """ - ), - ] = None, - summary: Annotated[ - Optional[str], - Doc( - """ - A summary for the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - A description for the *path operation*. - - If not provided, it will be extracted automatically from the docstring - of the *path operation function*. - - It can contain Markdown. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - response_description: Annotated[ - str, - Doc( - """ - The description for the default response. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = "Successful Response", - responses: Annotated[ - Optional[Dict[Union[int, str], Dict[str, Any]]], - Doc( - """ - Additional responses that could be returned by this *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - deprecated: Annotated[ - Optional[bool], - Doc( - """ - Mark this *path operation* as deprecated. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - operation_id: Annotated[ - Optional[str], - Doc( - """ - Custom operation ID to be used by this *path operation*. - - By default, it is generated automatically. - - If you provide a custom operation ID, you need to make sure it is - unique for the whole API. - - You can customize the - operation ID generation with the parameter - `generate_unique_id_function` in the `FastAPI` class. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = None, - response_model_include: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to include only certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_exclude: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to exclude certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_by_alias: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response model - should be serialized by alias when an alias is used. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = True, - response_model_exclude_unset: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that were not set and - have their default values. This is different from - `response_model_exclude_defaults` in that if the fields are set, - they will be included in the response, even if the value is the same - as the default. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_defaults: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that have the same value - as the default. This is different from `response_model_exclude_unset` - in that if the fields are set but contain the same default values, - they will be excluded from the response. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_none: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data should - exclude fields set to `None`. - - This is much simpler (less smart) than `response_model_exclude_unset` - and `response_model_exclude_defaults`. You probably want to use one of - those two instead of this one, as those allow returning `None` values - when it makes sense. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). - """ - ), - ] = False, - include_in_schema: Annotated[ - bool, - Doc( - """ - Include this *path operation* in the generated OpenAPI schema. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). - """ - ), - ] = True, - response_class: Annotated[ - Type[Response], - Doc( - """ - Response class to be used for this *path operation*. - - This will not be used if you return a response directly. - - Read more about it in the - [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). - """ - ), - ] = Default(JSONResponse), - name: Annotated[ - Optional[str], - Doc( - """ - Name for this *path operation*. Only used internally. - """ - ), - ] = None, - callbacks: Annotated[ - Optional[List[BaseRoute]], - Doc( - """ - List of *path operations* that will be used as OpenAPI callbacks. - - This is only for OpenAPI documentation, the callbacks won't be used - directly. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). - """ - ), - ] = None, - openapi_extra: Annotated[ - Optional[Dict[str, Any]], - Doc( - """ - Extra metadata to be included in the OpenAPI schema for this *path - operation*. - - Read more about it in the - [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). - """ - ), - ] = None, - generate_unique_id_function: Annotated[ - Callable[[routing.APIRoute], str], - Doc( - """ - Customize the function used to generate unique IDs for the *path - operations* shown in the generated OpenAPI. - - This is particularly useful when automatically generating clients or - SDKs for your API. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = Default(generate_unique_id), - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - """ - Add a *path operation* using an HTTP POST operation. - - ## Example - - ```python - from fastapi import FastAPI - from pydantic import BaseModel - - class Item(BaseModel): - name: str - description: str | None = None - - app = FastAPI() - - @app.post("/items/") - def create_item(item: Item): - return {"message": "Item created"} - ``` - """ - return self.router.post( - path, - response_model=response_model, - status_code=status_code, - tags=tags, - dependencies=dependencies, - summary=summary, - description=description, - response_description=response_description, - responses=responses, - deprecated=deprecated, - operation_id=operation_id, - response_model_include=response_model_include, - response_model_exclude=response_model_exclude, - response_model_by_alias=response_model_by_alias, - response_model_exclude_unset=response_model_exclude_unset, - response_model_exclude_defaults=response_model_exclude_defaults, - response_model_exclude_none=response_model_exclude_none, - include_in_schema=include_in_schema, - response_class=response_class, - name=name, - callbacks=callbacks, - openapi_extra=openapi_extra, - generate_unique_id_function=generate_unique_id_function, - ) - - def delete( - self, - path: Annotated[ - str, - Doc( - """ - The URL path to be used for this *path operation*. - - For example, in `http://example.com/items`, the path is `/items`. - """ - ), - ], - *, - response_model: Annotated[ - Any, - Doc( - """ - The type to use for the response. - - It could be any valid Pydantic *field* type. So, it doesn't have to - be a Pydantic model, it could be other things, like a `list`, `dict`, - etc. - - It will be used for: - - * Documentation: the generated OpenAPI (and the UI at `/docs`) will - show it as the response (JSON Schema). - * Serialization: you could return an arbitrary object and the - `response_model` would be used to serialize that object into the - corresponding JSON. - * Filtering: the JSON sent to the client will only contain the data - (fields) defined in the `response_model`. If you returned an object - that contains an attribute `password` but the `response_model` does - not include that field, the JSON sent to the client would not have - that `password`. - * Validation: whatever you return will be serialized with the - `response_model`, converting any data as necessary to generate the - corresponding JSON. But if the data in the object returned is not - valid, that would mean a violation of the contract with the client, - so it's an error from the API developer. So, FastAPI will raise an - error and return a 500 error code (Internal Server Error). - - Read more about it in the - [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). - """ - ), - ] = Default(None), - status_code: Annotated[ - Optional[int], - Doc( - """ - The default status code to be used for the response. - - You could override the status code by returning a response directly. - - Read more about it in the - [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). - """ - ), - ] = None, - tags: Annotated[ - Optional[List[Union[str, Enum]]], - Doc( - """ - A list of tags to be applied to the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). - """ - ), - ] = None, - dependencies: Annotated[ - Optional[Sequence[Depends]], - Doc( - """ - A list of dependencies (using `Depends()`) to be applied to the - *path operation*. - - Read more about it in the - [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). - """ - ), - ] = None, - summary: Annotated[ - Optional[str], - Doc( - """ - A summary for the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - A description for the *path operation*. - - If not provided, it will be extracted automatically from the docstring - of the *path operation function*. - - It can contain Markdown. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - response_description: Annotated[ - str, - Doc( - """ - The description for the default response. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = "Successful Response", - responses: Annotated[ - Optional[Dict[Union[int, str], Dict[str, Any]]], - Doc( - """ - Additional responses that could be returned by this *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - deprecated: Annotated[ - Optional[bool], - Doc( - """ - Mark this *path operation* as deprecated. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - operation_id: Annotated[ - Optional[str], - Doc( - """ - Custom operation ID to be used by this *path operation*. - - By default, it is generated automatically. - - If you provide a custom operation ID, you need to make sure it is - unique for the whole API. - - You can customize the - operation ID generation with the parameter - `generate_unique_id_function` in the `FastAPI` class. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = None, - response_model_include: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to include only certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_exclude: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to exclude certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_by_alias: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response model - should be serialized by alias when an alias is used. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = True, - response_model_exclude_unset: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that were not set and - have their default values. This is different from - `response_model_exclude_defaults` in that if the fields are set, - they will be included in the response, even if the value is the same - as the default. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_defaults: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that have the same value - as the default. This is different from `response_model_exclude_unset` - in that if the fields are set but contain the same default values, - they will be excluded from the response. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_none: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data should - exclude fields set to `None`. - - This is much simpler (less smart) than `response_model_exclude_unset` - and `response_model_exclude_defaults`. You probably want to use one of - those two instead of this one, as those allow returning `None` values - when it makes sense. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). - """ - ), - ] = False, - include_in_schema: Annotated[ - bool, - Doc( - """ - Include this *path operation* in the generated OpenAPI schema. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). - """ - ), - ] = True, - response_class: Annotated[ - Type[Response], - Doc( - """ - Response class to be used for this *path operation*. - - This will not be used if you return a response directly. - - Read more about it in the - [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). - """ - ), - ] = Default(JSONResponse), - name: Annotated[ - Optional[str], - Doc( - """ - Name for this *path operation*. Only used internally. - """ - ), - ] = None, - callbacks: Annotated[ - Optional[List[BaseRoute]], - Doc( - """ - List of *path operations* that will be used as OpenAPI callbacks. - - This is only for OpenAPI documentation, the callbacks won't be used - directly. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). - """ - ), - ] = None, - openapi_extra: Annotated[ - Optional[Dict[str, Any]], - Doc( - """ - Extra metadata to be included in the OpenAPI schema for this *path - operation*. - - Read more about it in the - [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). - """ - ), - ] = None, - generate_unique_id_function: Annotated[ - Callable[[routing.APIRoute], str], - Doc( - """ - Customize the function used to generate unique IDs for the *path - operations* shown in the generated OpenAPI. - - This is particularly useful when automatically generating clients or - SDKs for your API. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = Default(generate_unique_id), - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - """ - Add a *path operation* using an HTTP DELETE operation. - - ## Example - - ```python - from fastapi import FastAPI - - app = FastAPI() - - @app.delete("/items/{item_id}") - def delete_item(item_id: str): - return {"message": "Item deleted"} - ``` - """ - return self.router.delete( - path, - response_model=response_model, - status_code=status_code, - tags=tags, - dependencies=dependencies, - summary=summary, - description=description, - response_description=response_description, - responses=responses, - deprecated=deprecated, - operation_id=operation_id, - response_model_include=response_model_include, - response_model_exclude=response_model_exclude, - response_model_by_alias=response_model_by_alias, - response_model_exclude_unset=response_model_exclude_unset, - response_model_exclude_defaults=response_model_exclude_defaults, - response_model_exclude_none=response_model_exclude_none, - include_in_schema=include_in_schema, - response_class=response_class, - name=name, - callbacks=callbacks, - openapi_extra=openapi_extra, - generate_unique_id_function=generate_unique_id_function, - ) - - def options( - self, - path: Annotated[ - str, - Doc( - """ - The URL path to be used for this *path operation*. - - For example, in `http://example.com/items`, the path is `/items`. - """ - ), - ], - *, - response_model: Annotated[ - Any, - Doc( - """ - The type to use for the response. - - It could be any valid Pydantic *field* type. So, it doesn't have to - be a Pydantic model, it could be other things, like a `list`, `dict`, - etc. - - It will be used for: - - * Documentation: the generated OpenAPI (and the UI at `/docs`) will - show it as the response (JSON Schema). - * Serialization: you could return an arbitrary object and the - `response_model` would be used to serialize that object into the - corresponding JSON. - * Filtering: the JSON sent to the client will only contain the data - (fields) defined in the `response_model`. If you returned an object - that contains an attribute `password` but the `response_model` does - not include that field, the JSON sent to the client would not have - that `password`. - * Validation: whatever you return will be serialized with the - `response_model`, converting any data as necessary to generate the - corresponding JSON. But if the data in the object returned is not - valid, that would mean a violation of the contract with the client, - so it's an error from the API developer. So, FastAPI will raise an - error and return a 500 error code (Internal Server Error). - - Read more about it in the - [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). - """ - ), - ] = Default(None), - status_code: Annotated[ - Optional[int], - Doc( - """ - The default status code to be used for the response. - - You could override the status code by returning a response directly. - - Read more about it in the - [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). - """ - ), - ] = None, - tags: Annotated[ - Optional[List[Union[str, Enum]]], - Doc( - """ - A list of tags to be applied to the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). - """ - ), - ] = None, - dependencies: Annotated[ - Optional[Sequence[Depends]], - Doc( - """ - A list of dependencies (using `Depends()`) to be applied to the - *path operation*. - - Read more about it in the - [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). - """ - ), - ] = None, - summary: Annotated[ - Optional[str], - Doc( - """ - A summary for the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - A description for the *path operation*. - - If not provided, it will be extracted automatically from the docstring - of the *path operation function*. - - It can contain Markdown. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - response_description: Annotated[ - str, - Doc( - """ - The description for the default response. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = "Successful Response", - responses: Annotated[ - Optional[Dict[Union[int, str], Dict[str, Any]]], - Doc( - """ - Additional responses that could be returned by this *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - deprecated: Annotated[ - Optional[bool], - Doc( - """ - Mark this *path operation* as deprecated. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - operation_id: Annotated[ - Optional[str], - Doc( - """ - Custom operation ID to be used by this *path operation*. - - By default, it is generated automatically. - - If you provide a custom operation ID, you need to make sure it is - unique for the whole API. - - You can customize the - operation ID generation with the parameter - `generate_unique_id_function` in the `FastAPI` class. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = None, - response_model_include: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to include only certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_exclude: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to exclude certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_by_alias: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response model - should be serialized by alias when an alias is used. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = True, - response_model_exclude_unset: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that were not set and - have their default values. This is different from - `response_model_exclude_defaults` in that if the fields are set, - they will be included in the response, even if the value is the same - as the default. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_defaults: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that have the same value - as the default. This is different from `response_model_exclude_unset` - in that if the fields are set but contain the same default values, - they will be excluded from the response. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_none: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data should - exclude fields set to `None`. - - This is much simpler (less smart) than `response_model_exclude_unset` - and `response_model_exclude_defaults`. You probably want to use one of - those two instead of this one, as those allow returning `None` values - when it makes sense. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). - """ - ), - ] = False, - include_in_schema: Annotated[ - bool, - Doc( - """ - Include this *path operation* in the generated OpenAPI schema. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). - """ - ), - ] = True, - response_class: Annotated[ - Type[Response], - Doc( - """ - Response class to be used for this *path operation*. - - This will not be used if you return a response directly. - - Read more about it in the - [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). - """ - ), - ] = Default(JSONResponse), - name: Annotated[ - Optional[str], - Doc( - """ - Name for this *path operation*. Only used internally. - """ - ), - ] = None, - callbacks: Annotated[ - Optional[List[BaseRoute]], - Doc( - """ - List of *path operations* that will be used as OpenAPI callbacks. - - This is only for OpenAPI documentation, the callbacks won't be used - directly. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). - """ - ), - ] = None, - openapi_extra: Annotated[ - Optional[Dict[str, Any]], - Doc( - """ - Extra metadata to be included in the OpenAPI schema for this *path - operation*. - - Read more about it in the - [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). - """ - ), - ] = None, - generate_unique_id_function: Annotated[ - Callable[[routing.APIRoute], str], - Doc( - """ - Customize the function used to generate unique IDs for the *path - operations* shown in the generated OpenAPI. - - This is particularly useful when automatically generating clients or - SDKs for your API. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = Default(generate_unique_id), - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - """ - Add a *path operation* using an HTTP OPTIONS operation. - - ## Example - - ```python - from fastapi import FastAPI - - app = FastAPI() - - @app.options("/items/") - def get_item_options(): - return {"additions": ["Aji", "Guacamole"]} - ``` - """ - return self.router.options( - path, - response_model=response_model, - status_code=status_code, - tags=tags, - dependencies=dependencies, - summary=summary, - description=description, - response_description=response_description, - responses=responses, - deprecated=deprecated, - operation_id=operation_id, - response_model_include=response_model_include, - response_model_exclude=response_model_exclude, - response_model_by_alias=response_model_by_alias, - response_model_exclude_unset=response_model_exclude_unset, - response_model_exclude_defaults=response_model_exclude_defaults, - response_model_exclude_none=response_model_exclude_none, - include_in_schema=include_in_schema, - response_class=response_class, - name=name, - callbacks=callbacks, - openapi_extra=openapi_extra, - generate_unique_id_function=generate_unique_id_function, - ) - - def head( - self, - path: Annotated[ - str, - Doc( - """ - The URL path to be used for this *path operation*. - - For example, in `http://example.com/items`, the path is `/items`. - """ - ), - ], - *, - response_model: Annotated[ - Any, - Doc( - """ - The type to use for the response. - - It could be any valid Pydantic *field* type. So, it doesn't have to - be a Pydantic model, it could be other things, like a `list`, `dict`, - etc. - - It will be used for: - - * Documentation: the generated OpenAPI (and the UI at `/docs`) will - show it as the response (JSON Schema). - * Serialization: you could return an arbitrary object and the - `response_model` would be used to serialize that object into the - corresponding JSON. - * Filtering: the JSON sent to the client will only contain the data - (fields) defined in the `response_model`. If you returned an object - that contains an attribute `password` but the `response_model` does - not include that field, the JSON sent to the client would not have - that `password`. - * Validation: whatever you return will be serialized with the - `response_model`, converting any data as necessary to generate the - corresponding JSON. But if the data in the object returned is not - valid, that would mean a violation of the contract with the client, - so it's an error from the API developer. So, FastAPI will raise an - error and return a 500 error code (Internal Server Error). - - Read more about it in the - [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). - """ - ), - ] = Default(None), - status_code: Annotated[ - Optional[int], - Doc( - """ - The default status code to be used for the response. - - You could override the status code by returning a response directly. - - Read more about it in the - [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). - """ - ), - ] = None, - tags: Annotated[ - Optional[List[Union[str, Enum]]], - Doc( - """ - A list of tags to be applied to the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). - """ - ), - ] = None, - dependencies: Annotated[ - Optional[Sequence[Depends]], - Doc( - """ - A list of dependencies (using `Depends()`) to be applied to the - *path operation*. - - Read more about it in the - [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). - """ - ), - ] = None, - summary: Annotated[ - Optional[str], - Doc( - """ - A summary for the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - A description for the *path operation*. - - If not provided, it will be extracted automatically from the docstring - of the *path operation function*. - - It can contain Markdown. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - response_description: Annotated[ - str, - Doc( - """ - The description for the default response. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = "Successful Response", - responses: Annotated[ - Optional[Dict[Union[int, str], Dict[str, Any]]], - Doc( - """ - Additional responses that could be returned by this *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - deprecated: Annotated[ - Optional[bool], - Doc( - """ - Mark this *path operation* as deprecated. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - operation_id: Annotated[ - Optional[str], - Doc( - """ - Custom operation ID to be used by this *path operation*. - - By default, it is generated automatically. - - If you provide a custom operation ID, you need to make sure it is - unique for the whole API. - - You can customize the - operation ID generation with the parameter - `generate_unique_id_function` in the `FastAPI` class. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = None, - response_model_include: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to include only certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_exclude: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to exclude certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_by_alias: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response model - should be serialized by alias when an alias is used. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = True, - response_model_exclude_unset: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that were not set and - have their default values. This is different from - `response_model_exclude_defaults` in that if the fields are set, - they will be included in the response, even if the value is the same - as the default. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_defaults: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that have the same value - as the default. This is different from `response_model_exclude_unset` - in that if the fields are set but contain the same default values, - they will be excluded from the response. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_none: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data should - exclude fields set to `None`. - - This is much simpler (less smart) than `response_model_exclude_unset` - and `response_model_exclude_defaults`. You probably want to use one of - those two instead of this one, as those allow returning `None` values - when it makes sense. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). - """ - ), - ] = False, - include_in_schema: Annotated[ - bool, - Doc( - """ - Include this *path operation* in the generated OpenAPI schema. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). - """ - ), - ] = True, - response_class: Annotated[ - Type[Response], - Doc( - """ - Response class to be used for this *path operation*. - - This will not be used if you return a response directly. - - Read more about it in the - [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). - """ - ), - ] = Default(JSONResponse), - name: Annotated[ - Optional[str], - Doc( - """ - Name for this *path operation*. Only used internally. - """ - ), - ] = None, - callbacks: Annotated[ - Optional[List[BaseRoute]], - Doc( - """ - List of *path operations* that will be used as OpenAPI callbacks. - - This is only for OpenAPI documentation, the callbacks won't be used - directly. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). - """ - ), - ] = None, - openapi_extra: Annotated[ - Optional[Dict[str, Any]], - Doc( - """ - Extra metadata to be included in the OpenAPI schema for this *path - operation*. - - Read more about it in the - [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). - """ - ), - ] = None, - generate_unique_id_function: Annotated[ - Callable[[routing.APIRoute], str], - Doc( - """ - Customize the function used to generate unique IDs for the *path - operations* shown in the generated OpenAPI. - - This is particularly useful when automatically generating clients or - SDKs for your API. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = Default(generate_unique_id), - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - """ - Add a *path operation* using an HTTP HEAD operation. - - ## Example - - ```python - from fastapi import FastAPI, Response - - app = FastAPI() - - @app.head("/items/", status_code=204) - def get_items_headers(response: Response): - response.headers["X-Cat-Dog"] = "Alone in the world" - ``` - """ - return self.router.head( - path, - response_model=response_model, - status_code=status_code, - tags=tags, - dependencies=dependencies, - summary=summary, - description=description, - response_description=response_description, - responses=responses, - deprecated=deprecated, - operation_id=operation_id, - response_model_include=response_model_include, - response_model_exclude=response_model_exclude, - response_model_by_alias=response_model_by_alias, - response_model_exclude_unset=response_model_exclude_unset, - response_model_exclude_defaults=response_model_exclude_defaults, - response_model_exclude_none=response_model_exclude_none, - include_in_schema=include_in_schema, - response_class=response_class, - name=name, - callbacks=callbacks, - openapi_extra=openapi_extra, - generate_unique_id_function=generate_unique_id_function, - ) - - def patch( - self, - path: Annotated[ - str, - Doc( - """ - The URL path to be used for this *path operation*. - - For example, in `http://example.com/items`, the path is `/items`. - """ - ), - ], - *, - response_model: Annotated[ - Any, - Doc( - """ - The type to use for the response. - - It could be any valid Pydantic *field* type. So, it doesn't have to - be a Pydantic model, it could be other things, like a `list`, `dict`, - etc. - - It will be used for: - - * Documentation: the generated OpenAPI (and the UI at `/docs`) will - show it as the response (JSON Schema). - * Serialization: you could return an arbitrary object and the - `response_model` would be used to serialize that object into the - corresponding JSON. - * Filtering: the JSON sent to the client will only contain the data - (fields) defined in the `response_model`. If you returned an object - that contains an attribute `password` but the `response_model` does - not include that field, the JSON sent to the client would not have - that `password`. - * Validation: whatever you return will be serialized with the - `response_model`, converting any data as necessary to generate the - corresponding JSON. But if the data in the object returned is not - valid, that would mean a violation of the contract with the client, - so it's an error from the API developer. So, FastAPI will raise an - error and return a 500 error code (Internal Server Error). - - Read more about it in the - [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). - """ - ), - ] = Default(None), - status_code: Annotated[ - Optional[int], - Doc( - """ - The default status code to be used for the response. - - You could override the status code by returning a response directly. - - Read more about it in the - [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). - """ - ), - ] = None, - tags: Annotated[ - Optional[List[Union[str, Enum]]], - Doc( - """ - A list of tags to be applied to the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). - """ - ), - ] = None, - dependencies: Annotated[ - Optional[Sequence[Depends]], - Doc( - """ - A list of dependencies (using `Depends()`) to be applied to the - *path operation*. - - Read more about it in the - [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). - """ - ), - ] = None, - summary: Annotated[ - Optional[str], - Doc( - """ - A summary for the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - A description for the *path operation*. - - If not provided, it will be extracted automatically from the docstring - of the *path operation function*. - - It can contain Markdown. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - response_description: Annotated[ - str, - Doc( - """ - The description for the default response. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = "Successful Response", - responses: Annotated[ - Optional[Dict[Union[int, str], Dict[str, Any]]], - Doc( - """ - Additional responses that could be returned by this *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - deprecated: Annotated[ - Optional[bool], - Doc( - """ - Mark this *path operation* as deprecated. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - operation_id: Annotated[ - Optional[str], - Doc( - """ - Custom operation ID to be used by this *path operation*. - - By default, it is generated automatically. - - If you provide a custom operation ID, you need to make sure it is - unique for the whole API. - - You can customize the - operation ID generation with the parameter - `generate_unique_id_function` in the `FastAPI` class. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = None, - response_model_include: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to include only certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_exclude: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to exclude certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_by_alias: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response model - should be serialized by alias when an alias is used. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = True, - response_model_exclude_unset: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that were not set and - have their default values. This is different from - `response_model_exclude_defaults` in that if the fields are set, - they will be included in the response, even if the value is the same - as the default. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_defaults: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that have the same value - as the default. This is different from `response_model_exclude_unset` - in that if the fields are set but contain the same default values, - they will be excluded from the response. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_none: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data should - exclude fields set to `None`. - - This is much simpler (less smart) than `response_model_exclude_unset` - and `response_model_exclude_defaults`. You probably want to use one of - those two instead of this one, as those allow returning `None` values - when it makes sense. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). - """ - ), - ] = False, - include_in_schema: Annotated[ - bool, - Doc( - """ - Include this *path operation* in the generated OpenAPI schema. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). - """ - ), - ] = True, - response_class: Annotated[ - Type[Response], - Doc( - """ - Response class to be used for this *path operation*. - - This will not be used if you return a response directly. - - Read more about it in the - [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). - """ - ), - ] = Default(JSONResponse), - name: Annotated[ - Optional[str], - Doc( - """ - Name for this *path operation*. Only used internally. - """ - ), - ] = None, - callbacks: Annotated[ - Optional[List[BaseRoute]], - Doc( - """ - List of *path operations* that will be used as OpenAPI callbacks. - - This is only for OpenAPI documentation, the callbacks won't be used - directly. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). - """ - ), - ] = None, - openapi_extra: Annotated[ - Optional[Dict[str, Any]], - Doc( - """ - Extra metadata to be included in the OpenAPI schema for this *path - operation*. - - Read more about it in the - [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). - """ - ), - ] = None, - generate_unique_id_function: Annotated[ - Callable[[routing.APIRoute], str], - Doc( - """ - Customize the function used to generate unique IDs for the *path - operations* shown in the generated OpenAPI. - - This is particularly useful when automatically generating clients or - SDKs for your API. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = Default(generate_unique_id), - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - """ - Add a *path operation* using an HTTP PATCH operation. - - ## Example - - ```python - from fastapi import FastAPI - from pydantic import BaseModel - - class Item(BaseModel): - name: str - description: str | None = None - - app = FastAPI() - - @app.patch("/items/") - def update_item(item: Item): - return {"message": "Item updated in place"} - ``` - """ - return self.router.patch( - path, - response_model=response_model, - status_code=status_code, - tags=tags, - dependencies=dependencies, - summary=summary, - description=description, - response_description=response_description, - responses=responses, - deprecated=deprecated, - operation_id=operation_id, - response_model_include=response_model_include, - response_model_exclude=response_model_exclude, - response_model_by_alias=response_model_by_alias, - response_model_exclude_unset=response_model_exclude_unset, - response_model_exclude_defaults=response_model_exclude_defaults, - response_model_exclude_none=response_model_exclude_none, - include_in_schema=include_in_schema, - response_class=response_class, - name=name, - callbacks=callbacks, - openapi_extra=openapi_extra, - generate_unique_id_function=generate_unique_id_function, - ) - - def trace( - self, - path: Annotated[ - str, - Doc( - """ - The URL path to be used for this *path operation*. - - For example, in `http://example.com/items`, the path is `/items`. - """ - ), - ], - *, - response_model: Annotated[ - Any, - Doc( - """ - The type to use for the response. - - It could be any valid Pydantic *field* type. So, it doesn't have to - be a Pydantic model, it could be other things, like a `list`, `dict`, - etc. - - It will be used for: - - * Documentation: the generated OpenAPI (and the UI at `/docs`) will - show it as the response (JSON Schema). - * Serialization: you could return an arbitrary object and the - `response_model` would be used to serialize that object into the - corresponding JSON. - * Filtering: the JSON sent to the client will only contain the data - (fields) defined in the `response_model`. If you returned an object - that contains an attribute `password` but the `response_model` does - not include that field, the JSON sent to the client would not have - that `password`. - * Validation: whatever you return will be serialized with the - `response_model`, converting any data as necessary to generate the - corresponding JSON. But if the data in the object returned is not - valid, that would mean a violation of the contract with the client, - so it's an error from the API developer. So, FastAPI will raise an - error and return a 500 error code (Internal Server Error). - - Read more about it in the - [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). - """ - ), - ] = Default(None), - status_code: Annotated[ - Optional[int], - Doc( - """ - The default status code to be used for the response. - - You could override the status code by returning a response directly. - - Read more about it in the - [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). - """ - ), - ] = None, - tags: Annotated[ - Optional[List[Union[str, Enum]]], - Doc( - """ - A list of tags to be applied to the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). - """ - ), - ] = None, - dependencies: Annotated[ - Optional[Sequence[Depends]], - Doc( - """ - A list of dependencies (using `Depends()`) to be applied to the - *path operation*. - - Read more about it in the - [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). - """ - ), - ] = None, - summary: Annotated[ - Optional[str], - Doc( - """ - A summary for the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - A description for the *path operation*. - - If not provided, it will be extracted automatically from the docstring - of the *path operation function*. - - It can contain Markdown. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - response_description: Annotated[ - str, - Doc( - """ - The description for the default response. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = "Successful Response", - responses: Annotated[ - Optional[Dict[Union[int, str], Dict[str, Any]]], - Doc( - """ - Additional responses that could be returned by this *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - deprecated: Annotated[ - Optional[bool], - Doc( - """ - Mark this *path operation* as deprecated. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - operation_id: Annotated[ - Optional[str], - Doc( - """ - Custom operation ID to be used by this *path operation*. - - By default, it is generated automatically. - - If you provide a custom operation ID, you need to make sure it is - unique for the whole API. - - You can customize the - operation ID generation with the parameter - `generate_unique_id_function` in the `FastAPI` class. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = None, - response_model_include: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to include only certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_exclude: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to exclude certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_by_alias: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response model - should be serialized by alias when an alias is used. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = True, - response_model_exclude_unset: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that were not set and - have their default values. This is different from - `response_model_exclude_defaults` in that if the fields are set, - they will be included in the response, even if the value is the same - as the default. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_defaults: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that have the same value - as the default. This is different from `response_model_exclude_unset` - in that if the fields are set but contain the same default values, - they will be excluded from the response. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_none: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data should - exclude fields set to `None`. - - This is much simpler (less smart) than `response_model_exclude_unset` - and `response_model_exclude_defaults`. You probably want to use one of - those two instead of this one, as those allow returning `None` values - when it makes sense. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). - """ - ), - ] = False, - include_in_schema: Annotated[ - bool, - Doc( - """ - Include this *path operation* in the generated OpenAPI schema. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). - """ - ), - ] = True, - response_class: Annotated[ - Type[Response], - Doc( - """ - Response class to be used for this *path operation*. - - This will not be used if you return a response directly. - - Read more about it in the - [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). - """ - ), - ] = Default(JSONResponse), - name: Annotated[ - Optional[str], - Doc( - """ - Name for this *path operation*. Only used internally. - """ - ), - ] = None, - callbacks: Annotated[ - Optional[List[BaseRoute]], - Doc( - """ - List of *path operations* that will be used as OpenAPI callbacks. - - This is only for OpenAPI documentation, the callbacks won't be used - directly. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). - """ - ), - ] = None, - openapi_extra: Annotated[ - Optional[Dict[str, Any]], - Doc( - """ - Extra metadata to be included in the OpenAPI schema for this *path - operation*. - - Read more about it in the - [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). - """ - ), - ] = None, - generate_unique_id_function: Annotated[ - Callable[[routing.APIRoute], str], - Doc( - """ - Customize the function used to generate unique IDs for the *path - operations* shown in the generated OpenAPI. - - This is particularly useful when automatically generating clients or - SDKs for your API. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = Default(generate_unique_id), - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - """ - Add a *path operation* using an HTTP TRACE operation. - - ## Example - - ```python - from fastapi import FastAPI - - app = FastAPI() - - @app.put("/items/{item_id}") - def trace_item(item_id: str): - return None - ``` - """ - return self.router.trace( - path, - response_model=response_model, - status_code=status_code, - tags=tags, - dependencies=dependencies, - summary=summary, - description=description, - response_description=response_description, - responses=responses, - deprecated=deprecated, - operation_id=operation_id, - response_model_include=response_model_include, - response_model_exclude=response_model_exclude, - response_model_by_alias=response_model_by_alias, - response_model_exclude_unset=response_model_exclude_unset, - response_model_exclude_defaults=response_model_exclude_defaults, - response_model_exclude_none=response_model_exclude_none, - include_in_schema=include_in_schema, - response_class=response_class, - name=name, - callbacks=callbacks, - openapi_extra=openapi_extra, - generate_unique_id_function=generate_unique_id_function, - ) - - def websocket_route( - self, path: str, name: Union[str, None] = None - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - def decorator(func: DecoratedCallable) -> DecoratedCallable: - self.router.add_websocket_route(path, func, name=name) - return func - - return decorator - - @deprecated( - """ - on_event is deprecated, use lifespan event handlers instead. - - Read more about it in the - [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). - """ - ) - def on_event( - self, - event_type: Annotated[ - str, - Doc( - """ - The type of event. `startup` or `shutdown`. - """ - ), - ], - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - """ - Add an event handler for the application. - - `on_event` is deprecated, use `lifespan` event handlers instead. - - Read more about it in the - [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/#alternative-events-deprecated). - """ - return self.router.on_event(event_type) - - def middleware( - self, - middleware_type: Annotated[ - str, - Doc( - """ - The type of middleware. Currently only supports `http`. - """ - ), - ], - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - """ - Add a middleware to the application. - - Read more about it in the - [FastAPI docs for Middleware](https://fastapi.tiangolo.com/tutorial/middleware/). - - ## Example - - ```python - import time - - from fastapi import FastAPI, Request - - app = FastAPI() - - - @app.middleware("http") - async def add_process_time_header(request: Request, call_next): - start_time = time.time() - response = await call_next(request) - process_time = time.time() - start_time - response.headers["X-Process-Time"] = str(process_time) - return response - ``` - """ - - def decorator(func: DecoratedCallable) -> DecoratedCallable: - self.add_middleware(BaseHTTPMiddleware, dispatch=func) - return func - - return decorator - - def exception_handler( - self, - exc_class_or_status_code: Annotated[ - Union[int, Type[Exception]], - Doc( - """ - The Exception class this would handle, or a status code. - """ - ), - ], - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - """ - Add an exception handler to the app. - - Read more about it in the - [FastAPI docs for Handling Errors](https://fastapi.tiangolo.com/tutorial/handling-errors/). - - ## Example - - ```python - from fastapi import FastAPI, Request - from fastapi.responses import JSONResponse - - - class UnicornException(Exception): - def __init__(self, name: str): - self.name = name - - - app = FastAPI() - - - @app.exception_handler(UnicornException) - async def unicorn_exception_handler(request: Request, exc: UnicornException): - return JSONResponse( - status_code=418, - content={"message": f"Oops! {exc.name} did something. There goes a rainbow..."}, - ) - ``` - """ - - def decorator(func: DecoratedCallable) -> DecoratedCallable: - self.add_exception_handler(exc_class_or_status_code, func) - return func - - return decorator diff --git a/venv/lib/python3.11/site-packages/fastapi/background.py b/venv/lib/python3.11/site-packages/fastapi/background.py deleted file mode 100644 index 203578a..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/background.py +++ /dev/null @@ -1,59 +0,0 @@ -from typing import Any, Callable - -from starlette.background import BackgroundTasks as StarletteBackgroundTasks -from typing_extensions import Annotated, Doc, ParamSpec - -P = ParamSpec("P") - - -class BackgroundTasks(StarletteBackgroundTasks): - """ - A collection of background tasks that will be called after a response has been - sent to the client. - - Read more about it in the - [FastAPI docs for Background Tasks](https://fastapi.tiangolo.com/tutorial/background-tasks/). - - ## Example - - ```python - from fastapi import BackgroundTasks, FastAPI - - app = FastAPI() - - - def write_notification(email: str, message=""): - with open("log.txt", mode="w") as email_file: - content = f"notification for {email}: {message}" - email_file.write(content) - - - @app.post("/send-notification/{email}") - async def send_notification(email: str, background_tasks: BackgroundTasks): - background_tasks.add_task(write_notification, email, message="some notification") - return {"message": "Notification sent in the background"} - ``` - """ - - def add_task( - self, - func: Annotated[ - Callable[P, Any], - Doc( - """ - The function to call after the response is sent. - - It can be a regular `def` function or an `async def` function. - """ - ), - ], - *args: P.args, - **kwargs: P.kwargs, - ) -> None: - """ - Add a function to be called in the background after the response is sent. - - Read more about it in the - [FastAPI docs for Background Tasks](https://fastapi.tiangolo.com/tutorial/background-tasks/). - """ - return super().add_task(func, *args, **kwargs) diff --git a/venv/lib/python3.11/site-packages/fastapi/cli.py b/venv/lib/python3.11/site-packages/fastapi/cli.py deleted file mode 100644 index 8d3301e..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/cli.py +++ /dev/null @@ -1,13 +0,0 @@ -try: - from fastapi_cli.cli import main as cli_main - -except ImportError: # pragma: no cover - cli_main = None # type: ignore - - -def main() -> None: - if not cli_main: # type: ignore[truthy-function] - message = 'To use the fastapi command, please install "fastapi[standard]":\n\n\tpip install "fastapi[standard]"\n' - print(message) - raise RuntimeError(message) # noqa: B904 - cli_main() diff --git a/venv/lib/python3.11/site-packages/fastapi/concurrency.py b/venv/lib/python3.11/site-packages/fastapi/concurrency.py deleted file mode 100644 index 3202c70..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/concurrency.py +++ /dev/null @@ -1,39 +0,0 @@ -from contextlib import asynccontextmanager as asynccontextmanager -from typing import AsyncGenerator, ContextManager, TypeVar - -import anyio.to_thread -from anyio import CapacityLimiter -from starlette.concurrency import iterate_in_threadpool as iterate_in_threadpool # noqa -from starlette.concurrency import run_in_threadpool as run_in_threadpool # noqa -from starlette.concurrency import ( # noqa - run_until_first_complete as run_until_first_complete, -) - -_T = TypeVar("_T") - - -@asynccontextmanager -async def contextmanager_in_threadpool( - cm: ContextManager[_T], -) -> AsyncGenerator[_T, None]: - # blocking __exit__ from running waiting on a free thread - # can create race conditions/deadlocks if the context manager itself - # has its own internal pool (e.g. a database connection pool) - # to avoid this we let __exit__ run without a capacity limit - # since we're creating a new limiter for each call, any non-zero limit - # works (1 is arbitrary) - exit_limiter = CapacityLimiter(1) - try: - yield await run_in_threadpool(cm.__enter__) - except Exception as e: - ok = bool( - await anyio.to_thread.run_sync( - cm.__exit__, type(e), e, e.__traceback__, limiter=exit_limiter - ) - ) - if not ok: - raise e - else: - await anyio.to_thread.run_sync( - cm.__exit__, None, None, None, limiter=exit_limiter - ) diff --git a/venv/lib/python3.11/site-packages/fastapi/datastructures.py b/venv/lib/python3.11/site-packages/fastapi/datastructures.py deleted file mode 100644 index cf8406b..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/datastructures.py +++ /dev/null @@ -1,204 +0,0 @@ -from typing import ( - Any, - BinaryIO, - Callable, - Dict, - Iterable, - Optional, - Type, - TypeVar, - cast, -) - -from fastapi._compat import ( - PYDANTIC_V2, - CoreSchema, - GetJsonSchemaHandler, - JsonSchemaValue, - with_info_plain_validator_function, -) -from starlette.datastructures import URL as URL # noqa: F401 -from starlette.datastructures import Address as Address # noqa: F401 -from starlette.datastructures import FormData as FormData # noqa: F401 -from starlette.datastructures import Headers as Headers # noqa: F401 -from starlette.datastructures import QueryParams as QueryParams # noqa: F401 -from starlette.datastructures import State as State # noqa: F401 -from starlette.datastructures import UploadFile as StarletteUploadFile -from typing_extensions import Annotated, Doc - - -class UploadFile(StarletteUploadFile): - """ - A file uploaded in a request. - - Define it as a *path operation function* (or dependency) parameter. - - If you are using a regular `def` function, you can use the `upload_file.file` - attribute to access the raw standard Python file (blocking, not async), useful and - needed for non-async code. - - Read more about it in the - [FastAPI docs for Request Files](https://fastapi.tiangolo.com/tutorial/request-files/). - - ## Example - - ```python - from typing import Annotated - - from fastapi import FastAPI, File, UploadFile - - app = FastAPI() - - - @app.post("/files/") - async def create_file(file: Annotated[bytes, File()]): - return {"file_size": len(file)} - - - @app.post("/uploadfile/") - async def create_upload_file(file: UploadFile): - return {"filename": file.filename} - ``` - """ - - file: Annotated[ - BinaryIO, - Doc("The standard Python file object (non-async)."), - ] - filename: Annotated[Optional[str], Doc("The original file name.")] - size: Annotated[Optional[int], Doc("The size of the file in bytes.")] - headers: Annotated[Headers, Doc("The headers of the request.")] - content_type: Annotated[ - Optional[str], Doc("The content type of the request, from the headers.") - ] - - async def write( - self, - data: Annotated[ - bytes, - Doc( - """ - The bytes to write to the file. - """ - ), - ], - ) -> None: - """ - Write some bytes to the file. - - You normally wouldn't use this from a file you read in a request. - - To be awaitable, compatible with async, this is run in threadpool. - """ - return await super().write(data) - - async def read( - self, - size: Annotated[ - int, - Doc( - """ - The number of bytes to read from the file. - """ - ), - ] = -1, - ) -> bytes: - """ - Read some bytes from the file. - - To be awaitable, compatible with async, this is run in threadpool. - """ - return await super().read(size) - - async def seek( - self, - offset: Annotated[ - int, - Doc( - """ - The position in bytes to seek to in the file. - """ - ), - ], - ) -> None: - """ - Move to a position in the file. - - Any next read or write will be done from that position. - - To be awaitable, compatible with async, this is run in threadpool. - """ - return await super().seek(offset) - - async def close(self) -> None: - """ - Close the file. - - To be awaitable, compatible with async, this is run in threadpool. - """ - return await super().close() - - @classmethod - def __get_validators__(cls: Type["UploadFile"]) -> Iterable[Callable[..., Any]]: - yield cls.validate - - @classmethod - def validate(cls: Type["UploadFile"], v: Any) -> Any: - if not isinstance(v, StarletteUploadFile): - raise ValueError(f"Expected UploadFile, received: {type(v)}") - return v - - @classmethod - def _validate(cls, __input_value: Any, _: Any) -> "UploadFile": - if not isinstance(__input_value, StarletteUploadFile): - raise ValueError(f"Expected UploadFile, received: {type(__input_value)}") - return cast(UploadFile, __input_value) - - if not PYDANTIC_V2: - - @classmethod - def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None: - field_schema.update({"type": "string", "format": "binary"}) - - @classmethod - def __get_pydantic_json_schema__( - cls, core_schema: CoreSchema, handler: GetJsonSchemaHandler - ) -> JsonSchemaValue: - return {"type": "string", "format": "binary"} - - @classmethod - def __get_pydantic_core_schema__( - cls, source: Type[Any], handler: Callable[[Any], CoreSchema] - ) -> CoreSchema: - return with_info_plain_validator_function(cls._validate) - - -class DefaultPlaceholder: - """ - You shouldn't use this class directly. - - It's used internally to recognize when a default value has been overwritten, even - if the overridden default value was truthy. - """ - - def __init__(self, value: Any): - self.value = value - - def __bool__(self) -> bool: - return bool(self.value) - - def __eq__(self, o: object) -> bool: - return isinstance(o, DefaultPlaceholder) and o.value == self.value - - -DefaultType = TypeVar("DefaultType") - - -def Default(value: DefaultType) -> DefaultType: - """ - You shouldn't use this function directly. - - It's used internally to recognize when a default value has been overwritten, even - if the overridden default value was truthy. - """ - return DefaultPlaceholder(value) # type: ignore diff --git a/venv/lib/python3.11/site-packages/fastapi/dependencies/__init__.py b/venv/lib/python3.11/site-packages/fastapi/dependencies/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/fastapi/dependencies/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/dependencies/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 50a4fc4aacb57a2007a113e97804d9377ee4efa7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 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 diff --git a/venv/lib/python3.11/site-packages/fastapi/dependencies/models.py b/venv/lib/python3.11/site-packages/fastapi/dependencies/models.py deleted file mode 100644 index 418c117..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/dependencies/models.py +++ /dev/null @@ -1,37 +0,0 @@ -from dataclasses import dataclass, field -from typing import Any, Callable, List, Optional, Sequence, Tuple - -from fastapi._compat import ModelField -from fastapi.security.base import SecurityBase - - -@dataclass -class SecurityRequirement: - security_scheme: SecurityBase - scopes: Optional[Sequence[str]] = None - - -@dataclass -class Dependant: - path_params: List[ModelField] = field(default_factory=list) - query_params: List[ModelField] = field(default_factory=list) - header_params: List[ModelField] = field(default_factory=list) - cookie_params: List[ModelField] = field(default_factory=list) - body_params: List[ModelField] = field(default_factory=list) - dependencies: List["Dependant"] = field(default_factory=list) - security_requirements: List[SecurityRequirement] = field(default_factory=list) - name: Optional[str] = None - call: Optional[Callable[..., Any]] = None - request_param_name: Optional[str] = None - websocket_param_name: Optional[str] = None - http_connection_param_name: Optional[str] = None - response_param_name: Optional[str] = None - background_tasks_param_name: Optional[str] = None - security_scopes_param_name: Optional[str] = None - security_scopes: Optional[List[str]] = None - use_cache: bool = True - path: Optional[str] = None - cache_key: Tuple[Optional[Callable[..., Any]], Tuple[str, ...]] = field(init=False) - - def __post_init__(self) -> None: - self.cache_key = (self.call, tuple(sorted(set(self.security_scopes or [])))) diff --git a/venv/lib/python3.11/site-packages/fastapi/dependencies/utils.py b/venv/lib/python3.11/site-packages/fastapi/dependencies/utils.py deleted file mode 100644 index 84dfa4d..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/dependencies/utils.py +++ /dev/null @@ -1,980 +0,0 @@ -import inspect -from contextlib import AsyncExitStack, contextmanager -from copy import copy, deepcopy -from dataclasses import dataclass -from typing import ( - Any, - Callable, - Coroutine, - Dict, - ForwardRef, - List, - Mapping, - Optional, - Sequence, - Tuple, - Type, - Union, - cast, -) - -import anyio -from fastapi import params -from fastapi._compat import ( - PYDANTIC_V2, - ErrorWrapper, - ModelField, - RequiredParam, - Undefined, - _regenerate_error_with_loc, - copy_field_info, - create_body_model, - evaluate_forwardref, - field_annotation_is_scalar, - get_annotation_from_field_info, - get_cached_model_fields, - get_missing_field_error, - is_bytes_field, - is_bytes_sequence_field, - is_scalar_field, - is_scalar_sequence_field, - is_sequence_field, - is_uploadfile_or_nonable_uploadfile_annotation, - is_uploadfile_sequence_annotation, - lenient_issubclass, - sequence_types, - serialize_sequence_value, - value_is_sequence, -) -from fastapi.background import BackgroundTasks -from fastapi.concurrency import ( - asynccontextmanager, - contextmanager_in_threadpool, -) -from fastapi.dependencies.models import Dependant, SecurityRequirement -from fastapi.logger import logger -from fastapi.security.base import SecurityBase -from fastapi.security.oauth2 import OAuth2, SecurityScopes -from fastapi.security.open_id_connect_url import OpenIdConnect -from fastapi.utils import create_model_field, get_path_param_names -from pydantic import BaseModel -from pydantic.fields import FieldInfo -from starlette.background import BackgroundTasks as StarletteBackgroundTasks -from starlette.concurrency import run_in_threadpool -from starlette.datastructures import ( - FormData, - Headers, - ImmutableMultiDict, - QueryParams, - UploadFile, -) -from starlette.requests import HTTPConnection, Request -from starlette.responses import Response -from starlette.websockets import WebSocket -from typing_extensions import Annotated, get_args, get_origin - -multipart_not_installed_error = ( - 'Form data requires "python-multipart" to be installed. \n' - 'You can install "python-multipart" with: \n\n' - "pip install python-multipart\n" -) -multipart_incorrect_install_error = ( - 'Form data requires "python-multipart" to be installed. ' - 'It seems you installed "multipart" instead. \n' - 'You can remove "multipart" with: \n\n' - "pip uninstall multipart\n\n" - 'And then install "python-multipart" with: \n\n' - "pip install python-multipart\n" -) - - -def ensure_multipart_is_installed() -> None: - try: - from python_multipart import __version__ - - # Import an attribute that can be mocked/deleted in testing - assert __version__ > "0.0.12" - except (ImportError, AssertionError): - try: - # __version__ is available in both multiparts, and can be mocked - from multipart import __version__ # type: ignore[no-redef,import-untyped] - - assert __version__ - try: - # parse_options_header is only available in the right multipart - from multipart.multipart import ( # type: ignore[import-untyped] - parse_options_header, - ) - - assert parse_options_header - except ImportError: - logger.error(multipart_incorrect_install_error) - raise RuntimeError(multipart_incorrect_install_error) from None - except ImportError: - logger.error(multipart_not_installed_error) - raise RuntimeError(multipart_not_installed_error) from None - - -def get_param_sub_dependant( - *, - param_name: str, - depends: params.Depends, - path: str, - security_scopes: Optional[List[str]] = None, -) -> Dependant: - assert depends.dependency - return get_sub_dependant( - depends=depends, - dependency=depends.dependency, - path=path, - name=param_name, - security_scopes=security_scopes, - ) - - -def get_parameterless_sub_dependant(*, depends: params.Depends, path: str) -> Dependant: - assert callable(depends.dependency), ( - "A parameter-less dependency must have a callable dependency" - ) - return get_sub_dependant(depends=depends, dependency=depends.dependency, path=path) - - -def get_sub_dependant( - *, - depends: params.Depends, - dependency: Callable[..., Any], - path: str, - name: Optional[str] = None, - security_scopes: Optional[List[str]] = None, -) -> Dependant: - security_requirement = None - security_scopes = security_scopes or [] - if isinstance(depends, params.Security): - dependency_scopes = depends.scopes - security_scopes.extend(dependency_scopes) - if isinstance(dependency, SecurityBase): - use_scopes: List[str] = [] - if isinstance(dependency, (OAuth2, OpenIdConnect)): - use_scopes = security_scopes - security_requirement = SecurityRequirement( - security_scheme=dependency, scopes=use_scopes - ) - sub_dependant = get_dependant( - path=path, - call=dependency, - name=name, - security_scopes=security_scopes, - use_cache=depends.use_cache, - ) - if security_requirement: - sub_dependant.security_requirements.append(security_requirement) - return sub_dependant - - -CacheKey = Tuple[Optional[Callable[..., Any]], Tuple[str, ...]] - - -def get_flat_dependant( - dependant: Dependant, - *, - skip_repeats: bool = False, - visited: Optional[List[CacheKey]] = None, -) -> Dependant: - if visited is None: - visited = [] - visited.append(dependant.cache_key) - - flat_dependant = Dependant( - path_params=dependant.path_params.copy(), - query_params=dependant.query_params.copy(), - header_params=dependant.header_params.copy(), - cookie_params=dependant.cookie_params.copy(), - body_params=dependant.body_params.copy(), - security_requirements=dependant.security_requirements.copy(), - use_cache=dependant.use_cache, - path=dependant.path, - ) - for sub_dependant in dependant.dependencies: - if skip_repeats and sub_dependant.cache_key in visited: - continue - flat_sub = get_flat_dependant( - sub_dependant, skip_repeats=skip_repeats, visited=visited - ) - flat_dependant.path_params.extend(flat_sub.path_params) - flat_dependant.query_params.extend(flat_sub.query_params) - flat_dependant.header_params.extend(flat_sub.header_params) - flat_dependant.cookie_params.extend(flat_sub.cookie_params) - flat_dependant.body_params.extend(flat_sub.body_params) - flat_dependant.security_requirements.extend(flat_sub.security_requirements) - return flat_dependant - - -def _get_flat_fields_from_params(fields: List[ModelField]) -> List[ModelField]: - if not fields: - return fields - first_field = fields[0] - if len(fields) == 1 and lenient_issubclass(first_field.type_, BaseModel): - fields_to_extract = get_cached_model_fields(first_field.type_) - return fields_to_extract - return fields - - -def get_flat_params(dependant: Dependant) -> List[ModelField]: - flat_dependant = get_flat_dependant(dependant, skip_repeats=True) - path_params = _get_flat_fields_from_params(flat_dependant.path_params) - query_params = _get_flat_fields_from_params(flat_dependant.query_params) - header_params = _get_flat_fields_from_params(flat_dependant.header_params) - cookie_params = _get_flat_fields_from_params(flat_dependant.cookie_params) - return path_params + query_params + header_params + cookie_params - - -def get_typed_signature(call: Callable[..., Any]) -> inspect.Signature: - signature = inspect.signature(call) - globalns = getattr(call, "__globals__", {}) - typed_params = [ - inspect.Parameter( - name=param.name, - kind=param.kind, - default=param.default, - annotation=get_typed_annotation(param.annotation, globalns), - ) - for param in signature.parameters.values() - ] - typed_signature = inspect.Signature(typed_params) - return typed_signature - - -def get_typed_annotation(annotation: Any, globalns: Dict[str, Any]) -> Any: - if isinstance(annotation, str): - annotation = ForwardRef(annotation) - annotation = evaluate_forwardref(annotation, globalns, globalns) - return annotation - - -def get_typed_return_annotation(call: Callable[..., Any]) -> Any: - signature = inspect.signature(call) - annotation = signature.return_annotation - - if annotation is inspect.Signature.empty: - return None - - globalns = getattr(call, "__globals__", {}) - return get_typed_annotation(annotation, globalns) - - -def get_dependant( - *, - path: str, - call: Callable[..., Any], - name: Optional[str] = None, - security_scopes: Optional[List[str]] = None, - use_cache: bool = True, -) -> Dependant: - path_param_names = get_path_param_names(path) - endpoint_signature = get_typed_signature(call) - signature_params = endpoint_signature.parameters - dependant = Dependant( - call=call, - name=name, - path=path, - security_scopes=security_scopes, - use_cache=use_cache, - ) - for param_name, param in signature_params.items(): - is_path_param = param_name in path_param_names - param_details = analyze_param( - param_name=param_name, - annotation=param.annotation, - value=param.default, - is_path_param=is_path_param, - ) - if param_details.depends is not None: - sub_dependant = get_param_sub_dependant( - param_name=param_name, - depends=param_details.depends, - path=path, - security_scopes=security_scopes, - ) - dependant.dependencies.append(sub_dependant) - continue - if add_non_field_param_to_dependency( - param_name=param_name, - type_annotation=param_details.type_annotation, - dependant=dependant, - ): - assert param_details.field is None, ( - f"Cannot specify multiple FastAPI annotations for {param_name!r}" - ) - continue - assert param_details.field is not None - if isinstance(param_details.field.field_info, params.Body): - dependant.body_params.append(param_details.field) - else: - add_param_to_fields(field=param_details.field, dependant=dependant) - return dependant - - -def add_non_field_param_to_dependency( - *, param_name: str, type_annotation: Any, dependant: Dependant -) -> Optional[bool]: - if lenient_issubclass(type_annotation, Request): - dependant.request_param_name = param_name - return True - elif lenient_issubclass(type_annotation, WebSocket): - dependant.websocket_param_name = param_name - return True - elif lenient_issubclass(type_annotation, HTTPConnection): - dependant.http_connection_param_name = param_name - return True - elif lenient_issubclass(type_annotation, Response): - dependant.response_param_name = param_name - return True - elif lenient_issubclass(type_annotation, StarletteBackgroundTasks): - dependant.background_tasks_param_name = param_name - return True - elif lenient_issubclass(type_annotation, SecurityScopes): - dependant.security_scopes_param_name = param_name - return True - return None - - -@dataclass -class ParamDetails: - type_annotation: Any - depends: Optional[params.Depends] - field: Optional[ModelField] - - -def analyze_param( - *, - param_name: str, - annotation: Any, - value: Any, - is_path_param: bool, -) -> ParamDetails: - field_info = None - depends = None - type_annotation: Any = Any - use_annotation: Any = Any - if annotation is not inspect.Signature.empty: - use_annotation = annotation - type_annotation = annotation - # Extract Annotated info - if get_origin(use_annotation) is Annotated: - annotated_args = get_args(annotation) - type_annotation = annotated_args[0] - fastapi_annotations = [ - arg - for arg in annotated_args[1:] - if isinstance(arg, (FieldInfo, params.Depends)) - ] - fastapi_specific_annotations = [ - arg - for arg in fastapi_annotations - if isinstance(arg, (params.Param, params.Body, params.Depends)) - ] - if fastapi_specific_annotations: - fastapi_annotation: Union[FieldInfo, params.Depends, None] = ( - fastapi_specific_annotations[-1] - ) - else: - fastapi_annotation = None - # Set default for Annotated FieldInfo - if isinstance(fastapi_annotation, FieldInfo): - # Copy `field_info` because we mutate `field_info.default` below. - field_info = copy_field_info( - field_info=fastapi_annotation, annotation=use_annotation - ) - assert ( - field_info.default is Undefined or field_info.default is RequiredParam - ), ( - f"`{field_info.__class__.__name__}` default value cannot be set in" - f" `Annotated` for {param_name!r}. Set the default value with `=` instead." - ) - if value is not inspect.Signature.empty: - assert not is_path_param, "Path parameters cannot have default values" - field_info.default = value - else: - field_info.default = RequiredParam - # Get Annotated Depends - elif isinstance(fastapi_annotation, params.Depends): - depends = fastapi_annotation - # Get Depends from default value - if isinstance(value, params.Depends): - assert depends is None, ( - "Cannot specify `Depends` in `Annotated` and default value" - f" together for {param_name!r}" - ) - assert field_info is None, ( - "Cannot specify a FastAPI annotation in `Annotated` and `Depends` as a" - f" default value together for {param_name!r}" - ) - depends = value - # Get FieldInfo from default value - elif isinstance(value, FieldInfo): - assert field_info is None, ( - "Cannot specify FastAPI annotations in `Annotated` and default value" - f" together for {param_name!r}" - ) - field_info = value - if PYDANTIC_V2: - field_info.annotation = type_annotation - - # Get Depends from type annotation - if depends is not None and depends.dependency is None: - # Copy `depends` before mutating it - depends = copy(depends) - depends.dependency = type_annotation - - # Handle non-param type annotations like Request - if lenient_issubclass( - type_annotation, - ( - Request, - WebSocket, - HTTPConnection, - Response, - StarletteBackgroundTasks, - SecurityScopes, - ), - ): - assert depends is None, f"Cannot specify `Depends` for type {type_annotation!r}" - assert field_info is None, ( - f"Cannot specify FastAPI annotation for type {type_annotation!r}" - ) - # Handle default assignations, neither field_info nor depends was not found in Annotated nor default value - elif field_info is None and depends is None: - default_value = value if value is not inspect.Signature.empty else RequiredParam - if is_path_param: - # We might check here that `default_value is RequiredParam`, but the fact is that the same - # parameter might sometimes be a path parameter and sometimes not. See - # `tests/test_infer_param_optionality.py` for an example. - field_info = params.Path(annotation=use_annotation) - elif is_uploadfile_or_nonable_uploadfile_annotation( - type_annotation - ) or is_uploadfile_sequence_annotation(type_annotation): - field_info = params.File(annotation=use_annotation, default=default_value) - elif not field_annotation_is_scalar(annotation=type_annotation): - field_info = params.Body(annotation=use_annotation, default=default_value) - else: - field_info = params.Query(annotation=use_annotation, default=default_value) - - field = None - # It's a field_info, not a dependency - if field_info is not None: - # Handle field_info.in_ - if is_path_param: - assert isinstance(field_info, params.Path), ( - f"Cannot use `{field_info.__class__.__name__}` for path param" - f" {param_name!r}" - ) - elif ( - isinstance(field_info, params.Param) - and getattr(field_info, "in_", None) is None - ): - field_info.in_ = params.ParamTypes.query - use_annotation_from_field_info = get_annotation_from_field_info( - use_annotation, - field_info, - param_name, - ) - if isinstance(field_info, params.Form): - ensure_multipart_is_installed() - if not field_info.alias and getattr(field_info, "convert_underscores", None): - alias = param_name.replace("_", "-") - else: - alias = field_info.alias or param_name - field_info.alias = alias - field = create_model_field( - name=param_name, - type_=use_annotation_from_field_info, - default=field_info.default, - alias=alias, - required=field_info.default in (RequiredParam, Undefined), - field_info=field_info, - ) - if is_path_param: - assert is_scalar_field(field=field), ( - "Path params must be of one of the supported types" - ) - elif isinstance(field_info, params.Query): - assert ( - is_scalar_field(field) - or is_scalar_sequence_field(field) - or ( - lenient_issubclass(field.type_, BaseModel) - # For Pydantic v1 - and getattr(field, "shape", 1) == 1 - ) - ) - - return ParamDetails(type_annotation=type_annotation, depends=depends, field=field) - - -def add_param_to_fields(*, field: ModelField, dependant: Dependant) -> None: - field_info = field.field_info - field_info_in = getattr(field_info, "in_", None) - if field_info_in == params.ParamTypes.path: - dependant.path_params.append(field) - elif field_info_in == params.ParamTypes.query: - dependant.query_params.append(field) - elif field_info_in == params.ParamTypes.header: - dependant.header_params.append(field) - else: - assert field_info_in == params.ParamTypes.cookie, ( - f"non-body parameters must be in path, query, header or cookie: {field.name}" - ) - dependant.cookie_params.append(field) - - -def is_coroutine_callable(call: Callable[..., Any]) -> bool: - if inspect.isroutine(call): - return inspect.iscoroutinefunction(call) - if inspect.isclass(call): - return False - dunder_call = getattr(call, "__call__", None) # noqa: B004 - return inspect.iscoroutinefunction(dunder_call) - - -def is_async_gen_callable(call: Callable[..., Any]) -> bool: - if inspect.isasyncgenfunction(call): - return True - dunder_call = getattr(call, "__call__", None) # noqa: B004 - return inspect.isasyncgenfunction(dunder_call) - - -def is_gen_callable(call: Callable[..., Any]) -> bool: - if inspect.isgeneratorfunction(call): - return True - dunder_call = getattr(call, "__call__", None) # noqa: B004 - return inspect.isgeneratorfunction(dunder_call) - - -async def solve_generator( - *, call: Callable[..., Any], stack: AsyncExitStack, sub_values: Dict[str, Any] -) -> Any: - if is_gen_callable(call): - cm = contextmanager_in_threadpool(contextmanager(call)(**sub_values)) - elif is_async_gen_callable(call): - cm = asynccontextmanager(call)(**sub_values) - return await stack.enter_async_context(cm) - - -@dataclass -class SolvedDependency: - values: Dict[str, Any] - errors: List[Any] - background_tasks: Optional[StarletteBackgroundTasks] - response: Response - dependency_cache: Dict[Tuple[Callable[..., Any], Tuple[str]], Any] - - -async def solve_dependencies( - *, - request: Union[Request, WebSocket], - dependant: Dependant, - body: Optional[Union[Dict[str, Any], FormData]] = None, - background_tasks: Optional[StarletteBackgroundTasks] = None, - response: Optional[Response] = None, - dependency_overrides_provider: Optional[Any] = None, - dependency_cache: Optional[Dict[Tuple[Callable[..., Any], Tuple[str]], Any]] = None, - async_exit_stack: AsyncExitStack, - embed_body_fields: bool, -) -> SolvedDependency: - values: Dict[str, Any] = {} - errors: List[Any] = [] - if response is None: - response = Response() - del response.headers["content-length"] - response.status_code = None # type: ignore - dependency_cache = dependency_cache or {} - sub_dependant: Dependant - for sub_dependant in dependant.dependencies: - sub_dependant.call = cast(Callable[..., Any], sub_dependant.call) - sub_dependant.cache_key = cast( - Tuple[Callable[..., Any], Tuple[str]], sub_dependant.cache_key - ) - call = sub_dependant.call - use_sub_dependant = sub_dependant - if ( - dependency_overrides_provider - and dependency_overrides_provider.dependency_overrides - ): - original_call = sub_dependant.call - call = getattr( - dependency_overrides_provider, "dependency_overrides", {} - ).get(original_call, original_call) - use_path: str = sub_dependant.path # type: ignore - use_sub_dependant = get_dependant( - path=use_path, - call=call, - name=sub_dependant.name, - security_scopes=sub_dependant.security_scopes, - ) - - solved_result = await solve_dependencies( - request=request, - dependant=use_sub_dependant, - body=body, - background_tasks=background_tasks, - response=response, - dependency_overrides_provider=dependency_overrides_provider, - dependency_cache=dependency_cache, - async_exit_stack=async_exit_stack, - embed_body_fields=embed_body_fields, - ) - background_tasks = solved_result.background_tasks - dependency_cache.update(solved_result.dependency_cache) - if solved_result.errors: - errors.extend(solved_result.errors) - continue - if sub_dependant.use_cache and sub_dependant.cache_key in dependency_cache: - solved = dependency_cache[sub_dependant.cache_key] - elif is_gen_callable(call) or is_async_gen_callable(call): - solved = await solve_generator( - call=call, stack=async_exit_stack, sub_values=solved_result.values - ) - elif is_coroutine_callable(call): - solved = await call(**solved_result.values) - else: - solved = await run_in_threadpool(call, **solved_result.values) - if sub_dependant.name is not None: - values[sub_dependant.name] = solved - if sub_dependant.cache_key not in dependency_cache: - dependency_cache[sub_dependant.cache_key] = solved - path_values, path_errors = request_params_to_args( - dependant.path_params, request.path_params - ) - query_values, query_errors = request_params_to_args( - dependant.query_params, request.query_params - ) - header_values, header_errors = request_params_to_args( - dependant.header_params, request.headers - ) - cookie_values, cookie_errors = request_params_to_args( - dependant.cookie_params, request.cookies - ) - values.update(path_values) - values.update(query_values) - values.update(header_values) - values.update(cookie_values) - errors += path_errors + query_errors + header_errors + cookie_errors - if dependant.body_params: - ( - body_values, - body_errors, - ) = await request_body_to_args( # body_params checked above - body_fields=dependant.body_params, - received_body=body, - embed_body_fields=embed_body_fields, - ) - values.update(body_values) - errors.extend(body_errors) - if dependant.http_connection_param_name: - values[dependant.http_connection_param_name] = request - if dependant.request_param_name and isinstance(request, Request): - values[dependant.request_param_name] = request - elif dependant.websocket_param_name and isinstance(request, WebSocket): - values[dependant.websocket_param_name] = request - if dependant.background_tasks_param_name: - if background_tasks is None: - background_tasks = BackgroundTasks() - values[dependant.background_tasks_param_name] = background_tasks - if dependant.response_param_name: - values[dependant.response_param_name] = response - if dependant.security_scopes_param_name: - values[dependant.security_scopes_param_name] = SecurityScopes( - scopes=dependant.security_scopes - ) - return SolvedDependency( - values=values, - errors=errors, - background_tasks=background_tasks, - response=response, - dependency_cache=dependency_cache, - ) - - -def _validate_value_with_model_field( - *, field: ModelField, value: Any, values: Dict[str, Any], loc: Tuple[str, ...] -) -> Tuple[Any, List[Any]]: - if value is None: - if field.required: - return None, [get_missing_field_error(loc=loc)] - else: - return deepcopy(field.default), [] - v_, errors_ = field.validate(value, values, loc=loc) - if isinstance(errors_, ErrorWrapper): - return None, [errors_] - elif isinstance(errors_, list): - new_errors = _regenerate_error_with_loc(errors=errors_, loc_prefix=()) - return None, new_errors - else: - return v_, [] - - -def _get_multidict_value( - field: ModelField, values: Mapping[str, Any], alias: Union[str, None] = None -) -> Any: - alias = alias or field.alias - if is_sequence_field(field) and isinstance(values, (ImmutableMultiDict, Headers)): - value = values.getlist(alias) - else: - value = values.get(alias, None) - if ( - value is None - or ( - isinstance(field.field_info, params.Form) - and isinstance(value, str) # For type checks - and value == "" - ) - or (is_sequence_field(field) and len(value) == 0) - ): - if field.required: - return - else: - return deepcopy(field.default) - return value - - -def request_params_to_args( - fields: Sequence[ModelField], - received_params: Union[Mapping[str, Any], QueryParams, Headers], -) -> Tuple[Dict[str, Any], List[Any]]: - values: Dict[str, Any] = {} - errors: List[Dict[str, Any]] = [] - - if not fields: - return values, errors - - first_field = fields[0] - fields_to_extract = fields - single_not_embedded_field = False - default_convert_underscores = True - if len(fields) == 1 and lenient_issubclass(first_field.type_, BaseModel): - fields_to_extract = get_cached_model_fields(first_field.type_) - single_not_embedded_field = True - # If headers are in a Pydantic model, the way to disable convert_underscores - # would be with Header(convert_underscores=False) at the Pydantic model level - default_convert_underscores = getattr( - first_field.field_info, "convert_underscores", True - ) - - params_to_process: Dict[str, Any] = {} - - processed_keys = set() - - for field in fields_to_extract: - alias = None - if isinstance(received_params, Headers): - # Handle fields extracted from a Pydantic Model for a header, each field - # doesn't have a FieldInfo of type Header with the default convert_underscores=True - convert_underscores = getattr( - field.field_info, "convert_underscores", default_convert_underscores - ) - if convert_underscores: - alias = ( - field.alias - if field.alias != field.name - else field.name.replace("_", "-") - ) - value = _get_multidict_value(field, received_params, alias=alias) - if value is not None: - params_to_process[field.name] = value - processed_keys.add(alias or field.alias) - processed_keys.add(field.name) - - for key, value in received_params.items(): - if key not in processed_keys: - params_to_process[key] = value - - if single_not_embedded_field: - field_info = first_field.field_info - assert isinstance(field_info, params.Param), ( - "Params must be subclasses of Param" - ) - loc: Tuple[str, ...] = (field_info.in_.value,) - v_, errors_ = _validate_value_with_model_field( - field=first_field, value=params_to_process, values=values, loc=loc - ) - return {first_field.name: v_}, errors_ - - for field in fields: - value = _get_multidict_value(field, received_params) - field_info = field.field_info - assert isinstance(field_info, params.Param), ( - "Params must be subclasses of Param" - ) - loc = (field_info.in_.value, field.alias) - v_, errors_ = _validate_value_with_model_field( - field=field, value=value, values=values, loc=loc - ) - if errors_: - errors.extend(errors_) - else: - values[field.name] = v_ - return values, errors - - -def _should_embed_body_fields(fields: List[ModelField]) -> bool: - if not fields: - return False - # More than one dependency could have the same field, it would show up as multiple - # fields but it's the same one, so count them by name - body_param_names_set = {field.name for field in fields} - # A top level field has to be a single field, not multiple - if len(body_param_names_set) > 1: - return True - first_field = fields[0] - # If it explicitly specifies it is embedded, it has to be embedded - if getattr(first_field.field_info, "embed", None): - return True - # If it's a Form (or File) field, it has to be a BaseModel to be top level - # otherwise it has to be embedded, so that the key value pair can be extracted - if isinstance(first_field.field_info, params.Form) and not lenient_issubclass( - first_field.type_, BaseModel - ): - return True - return False - - -async def _extract_form_body( - body_fields: List[ModelField], - received_body: FormData, -) -> Dict[str, Any]: - values = {} - first_field = body_fields[0] - first_field_info = first_field.field_info - - for field in body_fields: - value = _get_multidict_value(field, received_body) - if ( - isinstance(first_field_info, params.File) - and is_bytes_field(field) - and isinstance(value, UploadFile) - ): - value = await value.read() - elif ( - is_bytes_sequence_field(field) - and isinstance(first_field_info, params.File) - and value_is_sequence(value) - ): - # For types - assert isinstance(value, sequence_types) # type: ignore[arg-type] - results: List[Union[bytes, str]] = [] - - async def process_fn( - fn: Callable[[], Coroutine[Any, Any, Any]], - ) -> None: - result = await fn() - results.append(result) # noqa: B023 - - async with anyio.create_task_group() as tg: - for sub_value in value: - tg.start_soon(process_fn, sub_value.read) - value = serialize_sequence_value(field=field, value=results) - if value is not None: - values[field.alias] = value - for key, value in received_body.items(): - if key not in values: - values[key] = value - return values - - -async def request_body_to_args( - body_fields: List[ModelField], - received_body: Optional[Union[Dict[str, Any], FormData]], - embed_body_fields: bool, -) -> Tuple[Dict[str, Any], List[Dict[str, Any]]]: - values: Dict[str, Any] = {} - errors: List[Dict[str, Any]] = [] - assert body_fields, "request_body_to_args() should be called with fields" - single_not_embedded_field = len(body_fields) == 1 and not embed_body_fields - first_field = body_fields[0] - body_to_process = received_body - - fields_to_extract: List[ModelField] = body_fields - - if single_not_embedded_field and lenient_issubclass(first_field.type_, BaseModel): - fields_to_extract = get_cached_model_fields(first_field.type_) - - if isinstance(received_body, FormData): - body_to_process = await _extract_form_body(fields_to_extract, received_body) - - if single_not_embedded_field: - loc: Tuple[str, ...] = ("body",) - v_, errors_ = _validate_value_with_model_field( - field=first_field, value=body_to_process, values=values, loc=loc - ) - return {first_field.name: v_}, errors_ - for field in body_fields: - loc = ("body", field.alias) - value: Optional[Any] = None - if body_to_process is not None: - try: - value = body_to_process.get(field.alias) - # If the received body is a list, not a dict - except AttributeError: - errors.append(get_missing_field_error(loc)) - continue - v_, errors_ = _validate_value_with_model_field( - field=field, value=value, values=values, loc=loc - ) - if errors_: - errors.extend(errors_) - else: - values[field.name] = v_ - return values, errors - - -def get_body_field( - *, flat_dependant: Dependant, name: str, embed_body_fields: bool -) -> Optional[ModelField]: - """ - Get a ModelField representing the request body for a path operation, combining - all body parameters into a single field if necessary. - - Used to check if it's form data (with `isinstance(body_field, params.Form)`) - or JSON and to generate the JSON Schema for a request body. - - This is **not** used to validate/parse the request body, that's done with each - individual body parameter. - """ - if not flat_dependant.body_params: - return None - first_param = flat_dependant.body_params[0] - if not embed_body_fields: - return first_param - model_name = "Body_" + name - BodyModel = create_body_model( - fields=flat_dependant.body_params, model_name=model_name - ) - required = any(True for f in flat_dependant.body_params if f.required) - BodyFieldInfo_kwargs: Dict[str, Any] = { - "annotation": BodyModel, - "alias": "body", - } - if not required: - BodyFieldInfo_kwargs["default"] = None - if any(isinstance(f.field_info, params.File) for f in flat_dependant.body_params): - BodyFieldInfo: Type[params.Body] = params.File - elif any(isinstance(f.field_info, params.Form) for f in flat_dependant.body_params): - BodyFieldInfo = params.Form - else: - BodyFieldInfo = params.Body - - body_param_media_types = [ - f.field_info.media_type - for f in flat_dependant.body_params - if isinstance(f.field_info, params.Body) - ] - if len(set(body_param_media_types)) == 1: - BodyFieldInfo_kwargs["media_type"] = body_param_media_types[0] - final_field = create_model_field( - name="body", - type_=BodyModel, - required=required, - alias="body", - field_info=BodyFieldInfo(**BodyFieldInfo_kwargs), - ) - return final_field diff --git a/venv/lib/python3.11/site-packages/fastapi/encoders.py b/venv/lib/python3.11/site-packages/fastapi/encoders.py deleted file mode 100644 index 451ea07..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/encoders.py +++ /dev/null @@ -1,343 +0,0 @@ -import dataclasses -import datetime -from collections import defaultdict, deque -from decimal import Decimal -from enum import Enum -from ipaddress import ( - IPv4Address, - IPv4Interface, - IPv4Network, - IPv6Address, - IPv6Interface, - IPv6Network, -) -from pathlib import Path, PurePath -from re import Pattern -from types import GeneratorType -from typing import Any, Callable, Dict, List, Optional, Tuple, Type, Union -from uuid import UUID - -from fastapi.types import IncEx -from pydantic import BaseModel -from pydantic.color import Color -from pydantic.networks import AnyUrl, NameEmail -from pydantic.types import SecretBytes, SecretStr -from typing_extensions import Annotated, Doc - -from ._compat import PYDANTIC_V2, UndefinedType, Url, _model_dump - - -# Taken from Pydantic v1 as is -def isoformat(o: Union[datetime.date, datetime.time]) -> str: - return o.isoformat() - - -# Taken from Pydantic v1 as is -# TODO: pv2 should this return strings instead? -def decimal_encoder(dec_value: Decimal) -> Union[int, float]: - """ - Encodes a Decimal as int of there's no exponent, otherwise float - - This is useful when we use ConstrainedDecimal to represent Numeric(x,0) - where a integer (but not int typed) is used. Encoding this as a float - results in failed round-tripping between encode and parse. - Our Id type is a prime example of this. - - >>> decimal_encoder(Decimal("1.0")) - 1.0 - - >>> decimal_encoder(Decimal("1")) - 1 - """ - if dec_value.as_tuple().exponent >= 0: # type: ignore[operator] - return int(dec_value) - else: - return float(dec_value) - - -ENCODERS_BY_TYPE: Dict[Type[Any], Callable[[Any], Any]] = { - bytes: lambda o: o.decode(), - Color: str, - datetime.date: isoformat, - datetime.datetime: isoformat, - datetime.time: isoformat, - datetime.timedelta: lambda td: td.total_seconds(), - Decimal: decimal_encoder, - Enum: lambda o: o.value, - frozenset: list, - deque: list, - GeneratorType: list, - IPv4Address: str, - IPv4Interface: str, - IPv4Network: str, - IPv6Address: str, - IPv6Interface: str, - IPv6Network: str, - NameEmail: str, - Path: str, - Pattern: lambda o: o.pattern, - SecretBytes: str, - SecretStr: str, - set: list, - UUID: str, - Url: str, - AnyUrl: str, -} - - -def generate_encoders_by_class_tuples( - type_encoder_map: Dict[Any, Callable[[Any], Any]], -) -> Dict[Callable[[Any], Any], Tuple[Any, ...]]: - encoders_by_class_tuples: Dict[Callable[[Any], Any], Tuple[Any, ...]] = defaultdict( - tuple - ) - for type_, encoder in type_encoder_map.items(): - encoders_by_class_tuples[encoder] += (type_,) - return encoders_by_class_tuples - - -encoders_by_class_tuples = generate_encoders_by_class_tuples(ENCODERS_BY_TYPE) - - -def jsonable_encoder( - obj: Annotated[ - Any, - Doc( - """ - The input object to convert to JSON. - """ - ), - ], - include: Annotated[ - Optional[IncEx], - Doc( - """ - Pydantic's `include` parameter, passed to Pydantic models to set the - fields to include. - """ - ), - ] = None, - exclude: Annotated[ - Optional[IncEx], - Doc( - """ - Pydantic's `exclude` parameter, passed to Pydantic models to set the - fields to exclude. - """ - ), - ] = None, - by_alias: Annotated[ - bool, - Doc( - """ - Pydantic's `by_alias` parameter, passed to Pydantic models to define if - the output should use the alias names (when provided) or the Python - attribute names. In an API, if you set an alias, it's probably because you - want to use it in the result, so you probably want to leave this set to - `True`. - """ - ), - ] = True, - exclude_unset: Annotated[ - bool, - Doc( - """ - Pydantic's `exclude_unset` parameter, passed to Pydantic models to define - if it should exclude from the output the fields that were not explicitly - set (and that only had their default values). - """ - ), - ] = False, - exclude_defaults: Annotated[ - bool, - Doc( - """ - Pydantic's `exclude_defaults` parameter, passed to Pydantic models to define - if it should exclude from the output the fields that had the same default - value, even when they were explicitly set. - """ - ), - ] = False, - exclude_none: Annotated[ - bool, - Doc( - """ - Pydantic's `exclude_none` parameter, passed to Pydantic models to define - if it should exclude from the output any fields that have a `None` value. - """ - ), - ] = False, - custom_encoder: Annotated[ - Optional[Dict[Any, Callable[[Any], Any]]], - Doc( - """ - Pydantic's `custom_encoder` parameter, passed to Pydantic models to define - a custom encoder. - """ - ), - ] = None, - sqlalchemy_safe: Annotated[ - bool, - Doc( - """ - Exclude from the output any fields that start with the name `_sa`. - - This is mainly a hack for compatibility with SQLAlchemy objects, they - store internal SQLAlchemy-specific state in attributes named with `_sa`, - and those objects can't (and shouldn't be) serialized to JSON. - """ - ), - ] = True, -) -> Any: - """ - Convert any object to something that can be encoded in JSON. - - This is used internally by FastAPI to make sure anything you return can be - encoded as JSON before it is sent to the client. - - You can also use it yourself, for example to convert objects before saving them - in a database that supports only JSON. - - Read more about it in the - [FastAPI docs for JSON Compatible Encoder](https://fastapi.tiangolo.com/tutorial/encoder/). - """ - custom_encoder = custom_encoder or {} - if custom_encoder: - if type(obj) in custom_encoder: - return custom_encoder[type(obj)](obj) - else: - for encoder_type, encoder_instance in custom_encoder.items(): - if isinstance(obj, encoder_type): - return encoder_instance(obj) - if include is not None and not isinstance(include, (set, dict)): - include = set(include) - if exclude is not None and not isinstance(exclude, (set, dict)): - exclude = set(exclude) - if isinstance(obj, BaseModel): - # TODO: remove when deprecating Pydantic v1 - encoders: Dict[Any, Any] = {} - if not PYDANTIC_V2: - encoders = getattr(obj.__config__, "json_encoders", {}) # type: ignore[attr-defined] - if custom_encoder: - encoders.update(custom_encoder) - obj_dict = _model_dump( - obj, - mode="json", - include=include, - exclude=exclude, - by_alias=by_alias, - exclude_unset=exclude_unset, - exclude_none=exclude_none, - exclude_defaults=exclude_defaults, - ) - if "__root__" in obj_dict: - obj_dict = obj_dict["__root__"] - return jsonable_encoder( - obj_dict, - exclude_none=exclude_none, - exclude_defaults=exclude_defaults, - # TODO: remove when deprecating Pydantic v1 - custom_encoder=encoders, - sqlalchemy_safe=sqlalchemy_safe, - ) - if dataclasses.is_dataclass(obj): - obj_dict = dataclasses.asdict(obj) - return jsonable_encoder( - obj_dict, - include=include, - exclude=exclude, - by_alias=by_alias, - exclude_unset=exclude_unset, - exclude_defaults=exclude_defaults, - exclude_none=exclude_none, - custom_encoder=custom_encoder, - sqlalchemy_safe=sqlalchemy_safe, - ) - if isinstance(obj, Enum): - return obj.value - if isinstance(obj, PurePath): - return str(obj) - if isinstance(obj, (str, int, float, type(None))): - return obj - if isinstance(obj, UndefinedType): - return None - if isinstance(obj, dict): - encoded_dict = {} - allowed_keys = set(obj.keys()) - if include is not None: - allowed_keys &= set(include) - if exclude is not None: - allowed_keys -= set(exclude) - for key, value in obj.items(): - if ( - ( - not sqlalchemy_safe - or (not isinstance(key, str)) - or (not key.startswith("_sa")) - ) - and (value is not None or not exclude_none) - and key in allowed_keys - ): - encoded_key = jsonable_encoder( - key, - by_alias=by_alias, - exclude_unset=exclude_unset, - exclude_none=exclude_none, - custom_encoder=custom_encoder, - sqlalchemy_safe=sqlalchemy_safe, - ) - encoded_value = jsonable_encoder( - value, - by_alias=by_alias, - exclude_unset=exclude_unset, - exclude_none=exclude_none, - custom_encoder=custom_encoder, - sqlalchemy_safe=sqlalchemy_safe, - ) - encoded_dict[encoded_key] = encoded_value - return encoded_dict - if isinstance(obj, (list, set, frozenset, GeneratorType, tuple, deque)): - encoded_list = [] - for item in obj: - encoded_list.append( - jsonable_encoder( - item, - include=include, - exclude=exclude, - by_alias=by_alias, - exclude_unset=exclude_unset, - exclude_defaults=exclude_defaults, - exclude_none=exclude_none, - custom_encoder=custom_encoder, - sqlalchemy_safe=sqlalchemy_safe, - ) - ) - return encoded_list - - if type(obj) in ENCODERS_BY_TYPE: - return ENCODERS_BY_TYPE[type(obj)](obj) - for encoder, classes_tuple in encoders_by_class_tuples.items(): - if isinstance(obj, classes_tuple): - return encoder(obj) - - try: - data = dict(obj) - except Exception as e: - errors: List[Exception] = [] - errors.append(e) - try: - data = vars(obj) - except Exception as e: - errors.append(e) - raise ValueError(errors) from e - return jsonable_encoder( - data, - include=include, - exclude=exclude, - by_alias=by_alias, - exclude_unset=exclude_unset, - exclude_defaults=exclude_defaults, - exclude_none=exclude_none, - custom_encoder=custom_encoder, - sqlalchemy_safe=sqlalchemy_safe, - ) diff --git a/venv/lib/python3.11/site-packages/fastapi/exception_handlers.py b/venv/lib/python3.11/site-packages/fastapi/exception_handlers.py deleted file mode 100644 index 6c2ba7f..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/exception_handlers.py +++ /dev/null @@ -1,34 +0,0 @@ -from fastapi.encoders import jsonable_encoder -from fastapi.exceptions import RequestValidationError, WebSocketRequestValidationError -from fastapi.utils import is_body_allowed_for_status_code -from fastapi.websockets import WebSocket -from starlette.exceptions import HTTPException -from starlette.requests import Request -from starlette.responses import JSONResponse, Response -from starlette.status import HTTP_422_UNPROCESSABLE_ENTITY, WS_1008_POLICY_VIOLATION - - -async def http_exception_handler(request: Request, exc: HTTPException) -> Response: - headers = getattr(exc, "headers", None) - if not is_body_allowed_for_status_code(exc.status_code): - return Response(status_code=exc.status_code, headers=headers) - return JSONResponse( - {"detail": exc.detail}, status_code=exc.status_code, headers=headers - ) - - -async def request_validation_exception_handler( - request: Request, exc: RequestValidationError -) -> JSONResponse: - return JSONResponse( - status_code=HTTP_422_UNPROCESSABLE_ENTITY, - content={"detail": jsonable_encoder(exc.errors())}, - ) - - -async def websocket_request_validation_exception_handler( - websocket: WebSocket, exc: WebSocketRequestValidationError -) -> None: - await websocket.close( - code=WS_1008_POLICY_VIOLATION, reason=jsonable_encoder(exc.errors()) - ) diff --git a/venv/lib/python3.11/site-packages/fastapi/exceptions.py b/venv/lib/python3.11/site-packages/fastapi/exceptions.py deleted file mode 100644 index 44d4ada..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/exceptions.py +++ /dev/null @@ -1,176 +0,0 @@ -from typing import Any, Dict, Optional, Sequence, Type, Union - -from pydantic import BaseModel, create_model -from starlette.exceptions import HTTPException as StarletteHTTPException -from starlette.exceptions import WebSocketException as StarletteWebSocketException -from typing_extensions import Annotated, Doc - - -class HTTPException(StarletteHTTPException): - """ - An HTTP exception you can raise in your own code to show errors to the client. - - This is for client errors, invalid authentication, invalid data, etc. Not for server - errors in your code. - - Read more about it in the - [FastAPI docs for Handling Errors](https://fastapi.tiangolo.com/tutorial/handling-errors/). - - ## Example - - ```python - from fastapi import FastAPI, HTTPException - - app = FastAPI() - - items = {"foo": "The Foo Wrestlers"} - - - @app.get("/items/{item_id}") - async def read_item(item_id: str): - if item_id not in items: - raise HTTPException(status_code=404, detail="Item not found") - return {"item": items[item_id]} - ``` - """ - - def __init__( - self, - status_code: Annotated[ - int, - Doc( - """ - HTTP status code to send to the client. - """ - ), - ], - detail: Annotated[ - Any, - Doc( - """ - Any data to be sent to the client in the `detail` key of the JSON - response. - """ - ), - ] = None, - headers: Annotated[ - Optional[Dict[str, str]], - Doc( - """ - Any headers to send to the client in the response. - """ - ), - ] = None, - ) -> None: - super().__init__(status_code=status_code, detail=detail, headers=headers) - - -class WebSocketException(StarletteWebSocketException): - """ - A WebSocket exception you can raise in your own code to show errors to the client. - - This is for client errors, invalid authentication, invalid data, etc. Not for server - errors in your code. - - Read more about it in the - [FastAPI docs for WebSockets](https://fastapi.tiangolo.com/advanced/websockets/). - - ## Example - - ```python - from typing import Annotated - - from fastapi import ( - Cookie, - FastAPI, - WebSocket, - WebSocketException, - status, - ) - - app = FastAPI() - - @app.websocket("/items/{item_id}/ws") - async def websocket_endpoint( - *, - websocket: WebSocket, - session: Annotated[str | None, Cookie()] = None, - item_id: str, - ): - if session is None: - raise WebSocketException(code=status.WS_1008_POLICY_VIOLATION) - await websocket.accept() - while True: - data = await websocket.receive_text() - await websocket.send_text(f"Session cookie is: {session}") - await websocket.send_text(f"Message text was: {data}, for item ID: {item_id}") - ``` - """ - - def __init__( - self, - code: Annotated[ - int, - Doc( - """ - A closing code from the - [valid codes defined in the specification](https://datatracker.ietf.org/doc/html/rfc6455#section-7.4.1). - """ - ), - ], - reason: Annotated[ - Union[str, None], - Doc( - """ - The reason to close the WebSocket connection. - - It is UTF-8-encoded data. The interpretation of the reason is up to the - application, it is not specified by the WebSocket specification. - - It could contain text that could be human-readable or interpretable - by the client code, etc. - """ - ), - ] = None, - ) -> None: - super().__init__(code=code, reason=reason) - - -RequestErrorModel: Type[BaseModel] = create_model("Request") -WebSocketErrorModel: Type[BaseModel] = create_model("WebSocket") - - -class FastAPIError(RuntimeError): - """ - A generic, FastAPI-specific error. - """ - - -class ValidationException(Exception): - def __init__(self, errors: Sequence[Any]) -> None: - self._errors = errors - - def errors(self) -> Sequence[Any]: - return self._errors - - -class RequestValidationError(ValidationException): - def __init__(self, errors: Sequence[Any], *, body: Any = None) -> None: - super().__init__(errors) - self.body = body - - -class WebSocketRequestValidationError(ValidationException): - pass - - -class ResponseValidationError(ValidationException): - def __init__(self, errors: Sequence[Any], *, body: Any = None) -> None: - super().__init__(errors) - self.body = body - - def __str__(self) -> str: - message = f"{len(self._errors)} validation errors:\n" - for err in self._errors: - message += f" {err}\n" - return message diff --git a/venv/lib/python3.11/site-packages/fastapi/logger.py b/venv/lib/python3.11/site-packages/fastapi/logger.py deleted file mode 100644 index 5b2c4ad..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/logger.py +++ /dev/null @@ -1,3 +0,0 @@ -import logging - -logger = logging.getLogger("fastapi") diff --git a/venv/lib/python3.11/site-packages/fastapi/middleware/__init__.py b/venv/lib/python3.11/site-packages/fastapi/middleware/__init__.py deleted file mode 100644 index 620296d..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/middleware/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from starlette.middleware import Middleware as Middleware diff --git a/venv/lib/python3.11/site-packages/fastapi/middleware/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/middleware/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index c0315854403b8c9f6adeac78f2bd1471a043ee73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259 zcmZ3^%ge<81Xd4Ur&|H(#~=<2FhLogg@BCd3@HpLj5!Rsj8Tk?3@J>(44TX@K?*b( zZ*lo%rljPgmM0da`e`!V5-Bc8EXqkODM{7Kg-aAM1J$l%_zcqWD^R~Iu}HtXyj(vm zC$k{0G*`bYHLpxRCo@UEpt2+*KhIdt&``fPvm{lwATc>RF+H_dKP?exY(b_z!btu2 y_{_Y_lK6PNg34bUHo5sJr8%i~MI1mI7=gH07D#+xW@Kc%!C-j-8!BQ0ssI4bpGe05 diff --git a/venv/lib/python3.11/site-packages/fastapi/middleware/__pycache__/cors.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/middleware/__pycache__/cors.cpython-311.pyc deleted file mode 100644 index b2afb588f16b44425ebbd9d59fde75de7cfb3288..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 264 zcmZ3^%ge<81Xd4Ur~3ox#~=<2FhLogg@BCd3@HpLj5!Rsj8Tk?3@J>(44TX@K?*b( zZ}B<%2L=0PrljPgmM0da`e`!Vk}NJsEXqkODM{7Kg-hrq=NAGw;(Y&J25@ASU)Wh zXm&xSKEhmmkhyvVmA^P_a`RJ4b5iY!IDn=z0&%e{kodsN$jEqu!R-PzRKx~U0RUl( BO6&jt diff --git a/venv/lib/python3.11/site-packages/fastapi/middleware/__pycache__/gzip.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/middleware/__pycache__/gzip.cpython-311.pyc deleted file mode 100644 index eb6214c58a26bf1a37c25be04af597df63ec6b14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 264 zcmZ3^%ge<81Xd4Ur~3ox#~=<2FhLogg@BCd3@HpLj5!Rsj8Tk?3@J>(44TX@K?*b( zZ}GWDWfu5mrljPgmM0da`e`!Vk}NJsEXqkODM{7Kg-htAS7jCyF#|QNWcUoy`^#6q zEU`$xyu4gLEhn=euQXS`EH$r8KPNLuzo4=tBR|hr&(Ki6II|>Gw;(Y&J25@ASU)Wh zXm&xSKEhmmkhyvVmA^P_a`RJ4b5iY!IDn=z0&%e{kodsN$jEqu!R-PzRKx~U0RWaP BOEmxh diff --git a/venv/lib/python3.11/site-packages/fastapi/middleware/__pycache__/httpsredirect.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/middleware/__pycache__/httpsredirect.cpython-311.pyc deleted file mode 100644 index 630692ccd9c98115f81f760fdd88fd43c165e817..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 307 zcmZ3^%ge<81Xd4Urxye1#~=<2FhLogg@BCd3@HpLj5!Rsj8Tk?3@J>(44TX@K?*b( zZ;5+^gaiZ!rKV&Sr6!m7W~QX%q?RWZrTS?y-BKzpNi51qEh$OW%Y{qmWt5Z@6c<4? z6fpyhS;_DjWZJJV{j$U&{qpj1{j{9Sg1pjP{j$`&GX0#)B>jTQl8pR3V?9Gd{o>4$ zRNaEa(44TX@K?*b( zZ;6H!l@^zzrg-ERm-uF;q~xTQCl;mpX)@hXC@x7X%1JFLN!81ROX!tAlxF~y7cm2k zSjq4iWYVt?{j$U&{qpj1{j{9Sg1pjP{j$`&GX0#)B>jTQl8pR3V?9Gd{o>4$RNaEa z(44TX@K?*b( zZ}Ei(yLGw;(Y&J25@ASU)Wh zXm&xSKEhmmkhyvVmA^P_a`RJ4b5iY!IDn=z0&%e{kodsN$jEqu!R-PzRKx~U0RU#~ BO7#E$ diff --git a/venv/lib/python3.11/site-packages/fastapi/middleware/cors.py b/venv/lib/python3.11/site-packages/fastapi/middleware/cors.py deleted file mode 100644 index 8dfaad0..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/middleware/cors.py +++ /dev/null @@ -1 +0,0 @@ -from starlette.middleware.cors import CORSMiddleware as CORSMiddleware # noqa diff --git a/venv/lib/python3.11/site-packages/fastapi/middleware/gzip.py b/venv/lib/python3.11/site-packages/fastapi/middleware/gzip.py deleted file mode 100644 index bbeb2cc..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/middleware/gzip.py +++ /dev/null @@ -1 +0,0 @@ -from starlette.middleware.gzip import GZipMiddleware as GZipMiddleware # noqa diff --git a/venv/lib/python3.11/site-packages/fastapi/middleware/httpsredirect.py b/venv/lib/python3.11/site-packages/fastapi/middleware/httpsredirect.py deleted file mode 100644 index b7a3d8e..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/middleware/httpsredirect.py +++ /dev/null @@ -1,3 +0,0 @@ -from starlette.middleware.httpsredirect import ( # noqa - HTTPSRedirectMiddleware as HTTPSRedirectMiddleware, -) diff --git a/venv/lib/python3.11/site-packages/fastapi/middleware/trustedhost.py b/venv/lib/python3.11/site-packages/fastapi/middleware/trustedhost.py deleted file mode 100644 index 08d7e03..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/middleware/trustedhost.py +++ /dev/null @@ -1,3 +0,0 @@ -from starlette.middleware.trustedhost import ( # noqa - TrustedHostMiddleware as TrustedHostMiddleware, -) diff --git a/venv/lib/python3.11/site-packages/fastapi/middleware/wsgi.py b/venv/lib/python3.11/site-packages/fastapi/middleware/wsgi.py deleted file mode 100644 index c4c6a79..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/middleware/wsgi.py +++ /dev/null @@ -1 +0,0 @@ -from starlette.middleware.wsgi import WSGIMiddleware as WSGIMiddleware # noqa diff --git a/venv/lib/python3.11/site-packages/fastapi/openapi/__init__.py b/venv/lib/python3.11/site-packages/fastapi/openapi/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/fastapi/openapi/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/openapi/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 38a330b468c1c28ba12885ca84f87459c0596539..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187 zcmZ3^%ge<81Xd4Ur-SInAOZ#$p^VRLK*n^26oz01O-8?!3`I;p{%4TnFF*aV#3KFj z@^byOoXmo}(p>$r)VwnNoXjNsg36MN{5)elLqq-I%#u{yg2d$P#Prl+{j|j5lEi{c z{rrN|JP;ippP83g5+AQuQ2C3)CO1E&G$+-rh!to&$N|OtK;i>4BO~Jn1{hJq3={(Z DcmD-F}u5l++q$04Y|eQ;p*seizUE6IOG;_= vnv-f*#0NB=5r~WBfy4)9Mn=XPBCZ!8h(YiMuSx^g4SwAQ9uO?z0jdE2Rv2m~ diff --git a/venv/lib/python3.11/site-packages/fastapi/openapi/__pycache__/docs.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/openapi/__pycache__/docs.cpython-311.pyc deleted file mode 100644 index c37058ce27abcdd1c15b904e6532a03147b74dbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11435 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 diff --git a/venv/lib/python3.11/site-packages/fastapi/openapi/__pycache__/utils.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/openapi/__pycache__/utils.cpython-311.pyc deleted file mode 100644 index cef51757ee259d453f4a30adf6bba618aa40fea7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23293 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 diff --git a/venv/lib/python3.11/site-packages/fastapi/openapi/constants.py b/venv/lib/python3.11/site-packages/fastapi/openapi/constants.py deleted file mode 100644 index d724ee3..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/openapi/constants.py +++ /dev/null @@ -1,3 +0,0 @@ -METHODS_WITH_BODY = {"GET", "HEAD", "POST", "PUT", "DELETE", "PATCH"} -REF_PREFIX = "#/components/schemas/" -REF_TEMPLATE = "#/components/schemas/{model}" diff --git a/venv/lib/python3.11/site-packages/fastapi/openapi/docs.py b/venv/lib/python3.11/site-packages/fastapi/openapi/docs.py deleted file mode 100644 index c2ec358..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/openapi/docs.py +++ /dev/null @@ -1,344 +0,0 @@ -import json -from typing import Any, Dict, Optional - -from fastapi.encoders import jsonable_encoder -from starlette.responses import HTMLResponse -from typing_extensions import Annotated, Doc - -swagger_ui_default_parameters: Annotated[ - Dict[str, Any], - Doc( - """ - Default configurations for Swagger UI. - - You can use it as a template to add any other configurations needed. - """ - ), -] = { - "dom_id": "#swagger-ui", - "layout": "BaseLayout", - "deepLinking": True, - "showExtensions": True, - "showCommonExtensions": True, -} - - -def get_swagger_ui_html( - *, - openapi_url: Annotated[ - str, - Doc( - """ - The OpenAPI URL that Swagger UI should load and use. - - This is normally done automatically by FastAPI using the default URL - `/openapi.json`. - """ - ), - ], - title: Annotated[ - str, - Doc( - """ - The HTML `` content, normally shown in the browser tab. - """ - ), - ], - swagger_js_url: Annotated[ - str, - Doc( - """ - The URL to use to load the Swagger UI JavaScript. - - It is normally set to a CDN URL. - """ - ), - ] = "https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js", - swagger_css_url: Annotated[ - str, - Doc( - """ - The URL to use to load the Swagger UI CSS. - - It is normally set to a CDN URL. - """ - ), - ] = "https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css", - swagger_favicon_url: Annotated[ - str, - Doc( - """ - The URL of the favicon to use. It is normally shown in the browser tab. - """ - ), - ] = "https://fastapi.tiangolo.com/img/favicon.png", - oauth2_redirect_url: Annotated[ - Optional[str], - Doc( - """ - The OAuth2 redirect URL, it is normally automatically handled by FastAPI. - """ - ), - ] = None, - init_oauth: Annotated[ - Optional[Dict[str, Any]], - Doc( - """ - A dictionary with Swagger UI OAuth2 initialization configurations. - """ - ), - ] = None, - swagger_ui_parameters: Annotated[ - Optional[Dict[str, Any]], - Doc( - """ - Configuration parameters for Swagger UI. - - It defaults to [swagger_ui_default_parameters][fastapi.openapi.docs.swagger_ui_default_parameters]. - """ - ), - ] = None, -) -> HTMLResponse: - """ - Generate and return the HTML that loads Swagger UI for the interactive - API docs (normally served at `/docs`). - - You would only call this function yourself if you needed to override some parts, - for example the URLs to use to load Swagger UI's JavaScript and CSS. - - Read more about it in the - [FastAPI docs for Configure Swagger UI](https://fastapi.tiangolo.com/how-to/configure-swagger-ui/) - and the [FastAPI docs for Custom Docs UI Static Assets (Self-Hosting)](https://fastapi.tiangolo.com/how-to/custom-docs-ui-assets/). - """ - current_swagger_ui_parameters = swagger_ui_default_parameters.copy() - if swagger_ui_parameters: - current_swagger_ui_parameters.update(swagger_ui_parameters) - - html = f""" - <!DOCTYPE html> - <html> - <head> - <link type="text/css" rel="stylesheet" href="{swagger_css_url}"> - <link rel="shortcut icon" href="{swagger_favicon_url}"> - <title>{title} - - -
-
- - - - - - """ - return HTMLResponse(html) - - -def get_redoc_html( - *, - openapi_url: Annotated[ - str, - Doc( - """ - The OpenAPI URL that ReDoc should load and use. - - This is normally done automatically by FastAPI using the default URL - `/openapi.json`. - """ - ), - ], - title: Annotated[ - str, - Doc( - """ - The HTML `` content, normally shown in the browser tab. - """ - ), - ], - redoc_js_url: Annotated[ - str, - Doc( - """ - The URL to use to load the ReDoc JavaScript. - - It is normally set to a CDN URL. - """ - ), - ] = "https://cdn.jsdelivr.net/npm/redoc@next/bundles/redoc.standalone.js", - redoc_favicon_url: Annotated[ - str, - Doc( - """ - The URL of the favicon to use. It is normally shown in the browser tab. - """ - ), - ] = "https://fastapi.tiangolo.com/img/favicon.png", - with_google_fonts: Annotated[ - bool, - Doc( - """ - Load and use Google Fonts. - """ - ), - ] = True, -) -> HTMLResponse: - """ - Generate and return the HTML response that loads ReDoc for the alternative - API docs (normally served at `/redoc`). - - You would only call this function yourself if you needed to override some parts, - for example the URLs to use to load ReDoc's JavaScript and CSS. - - Read more about it in the - [FastAPI docs for Custom Docs UI Static Assets (Self-Hosting)](https://fastapi.tiangolo.com/how-to/custom-docs-ui-assets/). - """ - html = f""" - <!DOCTYPE html> - <html> - <head> - <title>{title} - - - - """ - if with_google_fonts: - html += """ - - """ - html += f""" - - - - - - - - - - - """ - return HTMLResponse(html) - - -def get_swagger_ui_oauth2_redirect_html() -> HTMLResponse: - """ - Generate the HTML response with the OAuth2 redirection for Swagger UI. - - You normally don't need to use or change this. - """ - # copied from https://github.com/swagger-api/swagger-ui/blob/v4.14.0/dist/oauth2-redirect.html - html = """ - - - - Swagger UI: OAuth2 Redirect - - - - - - """ - return HTMLResponse(content=html) diff --git a/venv/lib/python3.11/site-packages/fastapi/openapi/models.py b/venv/lib/python3.11/site-packages/fastapi/openapi/models.py deleted file mode 100644 index ed07b40..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/openapi/models.py +++ /dev/null @@ -1,445 +0,0 @@ -from enum import Enum -from typing import Any, Callable, Dict, Iterable, List, Optional, Set, Type, Union - -from fastapi._compat import ( - PYDANTIC_V2, - CoreSchema, - GetJsonSchemaHandler, - JsonSchemaValue, - _model_rebuild, - with_info_plain_validator_function, -) -from fastapi.logger import logger -from pydantic import AnyUrl, BaseModel, Field -from typing_extensions import Annotated, Literal, TypedDict -from typing_extensions import deprecated as typing_deprecated - -try: - import email_validator - - assert email_validator # make autoflake ignore the unused import - from pydantic import EmailStr -except ImportError: # pragma: no cover - - class EmailStr(str): # type: ignore - @classmethod - def __get_validators__(cls) -> Iterable[Callable[..., Any]]: - yield cls.validate - - @classmethod - def validate(cls, v: Any) -> str: - logger.warning( - "email-validator not installed, email fields will be treated as str.\n" - "To install, run: pip install email-validator" - ) - return str(v) - - @classmethod - def _validate(cls, __input_value: Any, _: Any) -> str: - logger.warning( - "email-validator not installed, email fields will be treated as str.\n" - "To install, run: pip install email-validator" - ) - return str(__input_value) - - @classmethod - def __get_pydantic_json_schema__( - cls, core_schema: CoreSchema, handler: GetJsonSchemaHandler - ) -> JsonSchemaValue: - return {"type": "string", "format": "email"} - - @classmethod - def __get_pydantic_core_schema__( - cls, source: Type[Any], handler: Callable[[Any], CoreSchema] - ) -> CoreSchema: - return with_info_plain_validator_function(cls._validate) - - -class BaseModelWithConfig(BaseModel): - if PYDANTIC_V2: - model_config = {"extra": "allow"} - - else: - - class Config: - extra = "allow" - - -class Contact(BaseModelWithConfig): - name: Optional[str] = None - url: Optional[AnyUrl] = None - email: Optional[EmailStr] = None - - -class License(BaseModelWithConfig): - name: str - identifier: Optional[str] = None - url: Optional[AnyUrl] = None - - -class Info(BaseModelWithConfig): - title: str - summary: Optional[str] = None - description: Optional[str] = None - termsOfService: Optional[str] = None - contact: Optional[Contact] = None - license: Optional[License] = None - version: str - - -class ServerVariable(BaseModelWithConfig): - enum: Annotated[Optional[List[str]], Field(min_length=1)] = None - default: str - description: Optional[str] = None - - -class Server(BaseModelWithConfig): - url: Union[AnyUrl, str] - description: Optional[str] = None - variables: Optional[Dict[str, ServerVariable]] = None - - -class Reference(BaseModel): - ref: str = Field(alias="$ref") - - -class Discriminator(BaseModel): - propertyName: str - mapping: Optional[Dict[str, str]] = None - - -class XML(BaseModelWithConfig): - name: Optional[str] = None - namespace: Optional[str] = None - prefix: Optional[str] = None - attribute: Optional[bool] = None - wrapped: Optional[bool] = None - - -class ExternalDocumentation(BaseModelWithConfig): - description: Optional[str] = None - url: AnyUrl - - -class Schema(BaseModelWithConfig): - # Ref: JSON Schema 2020-12: https://json-schema.org/draft/2020-12/json-schema-core.html#name-the-json-schema-core-vocabu - # Core Vocabulary - schema_: Optional[str] = Field(default=None, alias="$schema") - vocabulary: Optional[str] = Field(default=None, alias="$vocabulary") - id: Optional[str] = Field(default=None, alias="$id") - anchor: Optional[str] = Field(default=None, alias="$anchor") - dynamicAnchor: Optional[str] = Field(default=None, alias="$dynamicAnchor") - ref: Optional[str] = Field(default=None, alias="$ref") - dynamicRef: Optional[str] = Field(default=None, alias="$dynamicRef") - defs: Optional[Dict[str, "SchemaOrBool"]] = Field(default=None, alias="$defs") - comment: Optional[str] = Field(default=None, alias="$comment") - # Ref: JSON Schema 2020-12: https://json-schema.org/draft/2020-12/json-schema-core.html#name-a-vocabulary-for-applying-s - # A Vocabulary for Applying Subschemas - allOf: Optional[List["SchemaOrBool"]] = None - anyOf: Optional[List["SchemaOrBool"]] = None - oneOf: Optional[List["SchemaOrBool"]] = None - not_: Optional["SchemaOrBool"] = Field(default=None, alias="not") - if_: Optional["SchemaOrBool"] = Field(default=None, alias="if") - then: Optional["SchemaOrBool"] = None - else_: Optional["SchemaOrBool"] = Field(default=None, alias="else") - dependentSchemas: Optional[Dict[str, "SchemaOrBool"]] = None - prefixItems: Optional[List["SchemaOrBool"]] = None - # TODO: uncomment and remove below when deprecating Pydantic v1 - # It generales a list of schemas for tuples, before prefixItems was available - # items: Optional["SchemaOrBool"] = None - items: Optional[Union["SchemaOrBool", List["SchemaOrBool"]]] = None - contains: Optional["SchemaOrBool"] = None - properties: Optional[Dict[str, "SchemaOrBool"]] = None - patternProperties: Optional[Dict[str, "SchemaOrBool"]] = None - additionalProperties: Optional["SchemaOrBool"] = None - propertyNames: Optional["SchemaOrBool"] = None - unevaluatedItems: Optional["SchemaOrBool"] = None - unevaluatedProperties: Optional["SchemaOrBool"] = None - # Ref: JSON Schema Validation 2020-12: https://json-schema.org/draft/2020-12/json-schema-validation.html#name-a-vocabulary-for-structural - # A Vocabulary for Structural Validation - type: Optional[str] = None - enum: Optional[List[Any]] = None - const: Optional[Any] = None - multipleOf: Optional[float] = Field(default=None, gt=0) - maximum: Optional[float] = None - exclusiveMaximum: Optional[float] = None - minimum: Optional[float] = None - exclusiveMinimum: Optional[float] = None - maxLength: Optional[int] = Field(default=None, ge=0) - minLength: Optional[int] = Field(default=None, ge=0) - pattern: Optional[str] = None - maxItems: Optional[int] = Field(default=None, ge=0) - minItems: Optional[int] = Field(default=None, ge=0) - uniqueItems: Optional[bool] = None - maxContains: Optional[int] = Field(default=None, ge=0) - minContains: Optional[int] = Field(default=None, ge=0) - maxProperties: Optional[int] = Field(default=None, ge=0) - minProperties: Optional[int] = Field(default=None, ge=0) - required: Optional[List[str]] = None - dependentRequired: Optional[Dict[str, Set[str]]] = None - # Ref: JSON Schema Validation 2020-12: https://json-schema.org/draft/2020-12/json-schema-validation.html#name-vocabularies-for-semantic-c - # Vocabularies for Semantic Content With "format" - format: Optional[str] = None - # Ref: JSON Schema Validation 2020-12: https://json-schema.org/draft/2020-12/json-schema-validation.html#name-a-vocabulary-for-the-conten - # A Vocabulary for the Contents of String-Encoded Data - contentEncoding: Optional[str] = None - contentMediaType: Optional[str] = None - contentSchema: Optional["SchemaOrBool"] = None - # Ref: JSON Schema Validation 2020-12: https://json-schema.org/draft/2020-12/json-schema-validation.html#name-a-vocabulary-for-basic-meta - # A Vocabulary for Basic Meta-Data Annotations - title: Optional[str] = None - description: Optional[str] = None - default: Optional[Any] = None - deprecated: Optional[bool] = None - readOnly: Optional[bool] = None - writeOnly: Optional[bool] = None - examples: Optional[List[Any]] = None - # Ref: OpenAPI 3.1.0: https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#schema-object - # Schema Object - discriminator: Optional[Discriminator] = None - xml: Optional[XML] = None - externalDocs: Optional[ExternalDocumentation] = None - example: Annotated[ - Optional[Any], - typing_deprecated( - "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " - "although still supported. Use examples instead." - ), - ] = None - - -# Ref: https://json-schema.org/draft/2020-12/json-schema-core.html#name-json-schema-documents -# A JSON Schema MUST be an object or a boolean. -SchemaOrBool = Union[Schema, bool] - - -class Example(TypedDict, total=False): - summary: Optional[str] - description: Optional[str] - value: Optional[Any] - externalValue: Optional[AnyUrl] - - if PYDANTIC_V2: # type: ignore [misc] - __pydantic_config__ = {"extra": "allow"} - - else: - - class Config: - extra = "allow" - - -class ParameterInType(Enum): - query = "query" - header = "header" - path = "path" - cookie = "cookie" - - -class Encoding(BaseModelWithConfig): - contentType: Optional[str] = None - headers: Optional[Dict[str, Union["Header", Reference]]] = None - style: Optional[str] = None - explode: Optional[bool] = None - allowReserved: Optional[bool] = None - - -class MediaType(BaseModelWithConfig): - schema_: Optional[Union[Schema, Reference]] = Field(default=None, alias="schema") - example: Optional[Any] = None - examples: Optional[Dict[str, Union[Example, Reference]]] = None - encoding: Optional[Dict[str, Encoding]] = None - - -class ParameterBase(BaseModelWithConfig): - description: Optional[str] = None - required: Optional[bool] = None - deprecated: Optional[bool] = None - # Serialization rules for simple scenarios - style: Optional[str] = None - explode: Optional[bool] = None - allowReserved: Optional[bool] = None - schema_: Optional[Union[Schema, Reference]] = Field(default=None, alias="schema") - example: Optional[Any] = None - examples: Optional[Dict[str, Union[Example, Reference]]] = None - # Serialization rules for more complex scenarios - content: Optional[Dict[str, MediaType]] = None - - -class Parameter(ParameterBase): - name: str - in_: ParameterInType = Field(alias="in") - - -class Header(ParameterBase): - pass - - -class RequestBody(BaseModelWithConfig): - description: Optional[str] = None - content: Dict[str, MediaType] - required: Optional[bool] = None - - -class Link(BaseModelWithConfig): - operationRef: Optional[str] = None - operationId: Optional[str] = None - parameters: Optional[Dict[str, Union[Any, str]]] = None - requestBody: Optional[Union[Any, str]] = None - description: Optional[str] = None - server: Optional[Server] = None - - -class Response(BaseModelWithConfig): - description: str - headers: Optional[Dict[str, Union[Header, Reference]]] = None - content: Optional[Dict[str, MediaType]] = None - links: Optional[Dict[str, Union[Link, Reference]]] = None - - -class Operation(BaseModelWithConfig): - tags: Optional[List[str]] = None - summary: Optional[str] = None - description: Optional[str] = None - externalDocs: Optional[ExternalDocumentation] = None - operationId: Optional[str] = None - parameters: Optional[List[Union[Parameter, Reference]]] = None - requestBody: Optional[Union[RequestBody, Reference]] = None - # Using Any for Specification Extensions - responses: Optional[Dict[str, Union[Response, Any]]] = None - callbacks: Optional[Dict[str, Union[Dict[str, "PathItem"], Reference]]] = None - deprecated: Optional[bool] = None - security: Optional[List[Dict[str, List[str]]]] = None - servers: Optional[List[Server]] = None - - -class PathItem(BaseModelWithConfig): - ref: Optional[str] = Field(default=None, alias="$ref") - summary: Optional[str] = None - description: Optional[str] = None - get: Optional[Operation] = None - put: Optional[Operation] = None - post: Optional[Operation] = None - delete: Optional[Operation] = None - options: Optional[Operation] = None - head: Optional[Operation] = None - patch: Optional[Operation] = None - trace: Optional[Operation] = None - servers: Optional[List[Server]] = None - parameters: Optional[List[Union[Parameter, Reference]]] = None - - -class SecuritySchemeType(Enum): - apiKey = "apiKey" - http = "http" - oauth2 = "oauth2" - openIdConnect = "openIdConnect" - - -class SecurityBase(BaseModelWithConfig): - type_: SecuritySchemeType = Field(alias="type") - description: Optional[str] = None - - -class APIKeyIn(Enum): - query = "query" - header = "header" - cookie = "cookie" - - -class APIKey(SecurityBase): - type_: SecuritySchemeType = Field(default=SecuritySchemeType.apiKey, alias="type") - in_: APIKeyIn = Field(alias="in") - name: str - - -class HTTPBase(SecurityBase): - type_: SecuritySchemeType = Field(default=SecuritySchemeType.http, alias="type") - scheme: str - - -class HTTPBearer(HTTPBase): - scheme: Literal["bearer"] = "bearer" - bearerFormat: Optional[str] = None - - -class OAuthFlow(BaseModelWithConfig): - refreshUrl: Optional[str] = None - scopes: Dict[str, str] = {} - - -class OAuthFlowImplicit(OAuthFlow): - authorizationUrl: str - - -class OAuthFlowPassword(OAuthFlow): - tokenUrl: str - - -class OAuthFlowClientCredentials(OAuthFlow): - tokenUrl: str - - -class OAuthFlowAuthorizationCode(OAuthFlow): - authorizationUrl: str - tokenUrl: str - - -class OAuthFlows(BaseModelWithConfig): - implicit: Optional[OAuthFlowImplicit] = None - password: Optional[OAuthFlowPassword] = None - clientCredentials: Optional[OAuthFlowClientCredentials] = None - authorizationCode: Optional[OAuthFlowAuthorizationCode] = None - - -class OAuth2(SecurityBase): - type_: SecuritySchemeType = Field(default=SecuritySchemeType.oauth2, alias="type") - flows: OAuthFlows - - -class OpenIdConnect(SecurityBase): - type_: SecuritySchemeType = Field( - default=SecuritySchemeType.openIdConnect, alias="type" - ) - openIdConnectUrl: str - - -SecurityScheme = Union[APIKey, HTTPBase, OAuth2, OpenIdConnect, HTTPBearer] - - -class Components(BaseModelWithConfig): - schemas: Optional[Dict[str, Union[Schema, Reference]]] = None - responses: Optional[Dict[str, Union[Response, Reference]]] = None - parameters: Optional[Dict[str, Union[Parameter, Reference]]] = None - examples: Optional[Dict[str, Union[Example, Reference]]] = None - requestBodies: Optional[Dict[str, Union[RequestBody, Reference]]] = None - headers: Optional[Dict[str, Union[Header, Reference]]] = None - securitySchemes: Optional[Dict[str, Union[SecurityScheme, Reference]]] = None - links: Optional[Dict[str, Union[Link, Reference]]] = None - # Using Any for Specification Extensions - callbacks: Optional[Dict[str, Union[Dict[str, PathItem], Reference, Any]]] = None - pathItems: Optional[Dict[str, Union[PathItem, Reference]]] = None - - -class Tag(BaseModelWithConfig): - name: str - description: Optional[str] = None - externalDocs: Optional[ExternalDocumentation] = None - - -class OpenAPI(BaseModelWithConfig): - openapi: str - info: Info - jsonSchemaDialect: Optional[str] = None - servers: Optional[List[Server]] = None - # Using Any for Specification Extensions - paths: Optional[Dict[str, Union[PathItem, Any]]] = None - webhooks: Optional[Dict[str, Union[PathItem, Reference]]] = None - components: Optional[Components] = None - security: Optional[List[Dict[str, List[str]]]] = None - tags: Optional[List[Tag]] = None - externalDocs: Optional[ExternalDocumentation] = None - - -_model_rebuild(Schema) -_model_rebuild(Operation) -_model_rebuild(Encoding) diff --git a/venv/lib/python3.11/site-packages/fastapi/openapi/utils.py b/venv/lib/python3.11/site-packages/fastapi/openapi/utils.py deleted file mode 100644 index 808646c..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/openapi/utils.py +++ /dev/null @@ -1,569 +0,0 @@ -import http.client -import inspect -import warnings -from typing import Any, Dict, List, Optional, Sequence, Set, Tuple, Type, Union, cast - -from fastapi import routing -from fastapi._compat import ( - GenerateJsonSchema, - JsonSchemaValue, - ModelField, - Undefined, - get_compat_model_name_map, - get_definitions, - get_schema_from_model_field, - lenient_issubclass, -) -from fastapi.datastructures import DefaultPlaceholder -from fastapi.dependencies.models import Dependant -from fastapi.dependencies.utils import ( - _get_flat_fields_from_params, - get_flat_dependant, - get_flat_params, -) -from fastapi.encoders import jsonable_encoder -from fastapi.openapi.constants import METHODS_WITH_BODY, REF_PREFIX, REF_TEMPLATE -from fastapi.openapi.models import OpenAPI -from fastapi.params import Body, ParamTypes -from fastapi.responses import Response -from fastapi.types import ModelNameMap -from fastapi.utils import ( - deep_dict_update, - generate_operation_id_for_path, - is_body_allowed_for_status_code, -) -from pydantic import BaseModel -from starlette.responses import JSONResponse -from starlette.routing import BaseRoute -from starlette.status import HTTP_422_UNPROCESSABLE_ENTITY -from typing_extensions import Literal - -validation_error_definition = { - "title": "ValidationError", - "type": "object", - "properties": { - "loc": { - "title": "Location", - "type": "array", - "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, - }, - "msg": {"title": "Message", "type": "string"}, - "type": {"title": "Error Type", "type": "string"}, - }, - "required": ["loc", "msg", "type"], -} - -validation_error_response_definition = { - "title": "HTTPValidationError", - "type": "object", - "properties": { - "detail": { - "title": "Detail", - "type": "array", - "items": {"$ref": REF_PREFIX + "ValidationError"}, - } - }, -} - -status_code_ranges: Dict[str, str] = { - "1XX": "Information", - "2XX": "Success", - "3XX": "Redirection", - "4XX": "Client Error", - "5XX": "Server Error", - "DEFAULT": "Default Response", -} - - -def get_openapi_security_definitions( - flat_dependant: Dependant, -) -> Tuple[Dict[str, Any], List[Dict[str, Any]]]: - security_definitions = {} - operation_security = [] - for security_requirement in flat_dependant.security_requirements: - security_definition = jsonable_encoder( - security_requirement.security_scheme.model, - by_alias=True, - exclude_none=True, - ) - security_name = security_requirement.security_scheme.scheme_name - security_definitions[security_name] = security_definition - operation_security.append({security_name: security_requirement.scopes}) - return security_definitions, operation_security - - -def _get_openapi_operation_parameters( - *, - dependant: Dependant, - schema_generator: GenerateJsonSchema, - model_name_map: ModelNameMap, - field_mapping: Dict[ - Tuple[ModelField, Literal["validation", "serialization"]], JsonSchemaValue - ], - separate_input_output_schemas: bool = True, -) -> List[Dict[str, Any]]: - parameters = [] - flat_dependant = get_flat_dependant(dependant, skip_repeats=True) - path_params = _get_flat_fields_from_params(flat_dependant.path_params) - query_params = _get_flat_fields_from_params(flat_dependant.query_params) - header_params = _get_flat_fields_from_params(flat_dependant.header_params) - cookie_params = _get_flat_fields_from_params(flat_dependant.cookie_params) - parameter_groups = [ - (ParamTypes.path, path_params), - (ParamTypes.query, query_params), - (ParamTypes.header, header_params), - (ParamTypes.cookie, cookie_params), - ] - default_convert_underscores = True - if len(flat_dependant.header_params) == 1: - first_field = flat_dependant.header_params[0] - if lenient_issubclass(first_field.type_, BaseModel): - default_convert_underscores = getattr( - first_field.field_info, "convert_underscores", True - ) - for param_type, param_group in parameter_groups: - for param in param_group: - field_info = param.field_info - # field_info = cast(Param, field_info) - if not getattr(field_info, "include_in_schema", True): - continue - param_schema = get_schema_from_model_field( - field=param, - schema_generator=schema_generator, - model_name_map=model_name_map, - field_mapping=field_mapping, - separate_input_output_schemas=separate_input_output_schemas, - ) - name = param.alias - convert_underscores = getattr( - param.field_info, - "convert_underscores", - default_convert_underscores, - ) - if ( - param_type == ParamTypes.header - and param.alias == param.name - and convert_underscores - ): - name = param.name.replace("_", "-") - - parameter = { - "name": name, - "in": param_type.value, - "required": param.required, - "schema": param_schema, - } - if field_info.description: - parameter["description"] = field_info.description - openapi_examples = getattr(field_info, "openapi_examples", None) - example = getattr(field_info, "example", None) - if openapi_examples: - parameter["examples"] = jsonable_encoder(openapi_examples) - elif example != Undefined: - parameter["example"] = jsonable_encoder(example) - if getattr(field_info, "deprecated", None): - parameter["deprecated"] = True - parameters.append(parameter) - return parameters - - -def get_openapi_operation_request_body( - *, - body_field: Optional[ModelField], - schema_generator: GenerateJsonSchema, - model_name_map: ModelNameMap, - field_mapping: Dict[ - Tuple[ModelField, Literal["validation", "serialization"]], JsonSchemaValue - ], - separate_input_output_schemas: bool = True, -) -> Optional[Dict[str, Any]]: - if not body_field: - return None - assert isinstance(body_field, ModelField) - body_schema = get_schema_from_model_field( - field=body_field, - schema_generator=schema_generator, - model_name_map=model_name_map, - field_mapping=field_mapping, - separate_input_output_schemas=separate_input_output_schemas, - ) - field_info = cast(Body, body_field.field_info) - request_media_type = field_info.media_type - required = body_field.required - request_body_oai: Dict[str, Any] = {} - if required: - request_body_oai["required"] = required - request_media_content: Dict[str, Any] = {"schema": body_schema} - if field_info.openapi_examples: - request_media_content["examples"] = jsonable_encoder( - field_info.openapi_examples - ) - elif field_info.example != Undefined: - request_media_content["example"] = jsonable_encoder(field_info.example) - request_body_oai["content"] = {request_media_type: request_media_content} - return request_body_oai - - -def generate_operation_id( - *, route: routing.APIRoute, method: str -) -> str: # pragma: nocover - warnings.warn( - "fastapi.openapi.utils.generate_operation_id() was deprecated, " - "it is not used internally, and will be removed soon", - DeprecationWarning, - stacklevel=2, - ) - if route.operation_id: - return route.operation_id - path: str = route.path_format - return generate_operation_id_for_path(name=route.name, path=path, method=method) - - -def generate_operation_summary(*, route: routing.APIRoute, method: str) -> str: - if route.summary: - return route.summary - return route.name.replace("_", " ").title() - - -def get_openapi_operation_metadata( - *, route: routing.APIRoute, method: str, operation_ids: Set[str] -) -> Dict[str, Any]: - operation: Dict[str, Any] = {} - if route.tags: - operation["tags"] = route.tags - operation["summary"] = generate_operation_summary(route=route, method=method) - if route.description: - operation["description"] = route.description - operation_id = route.operation_id or route.unique_id - if operation_id in operation_ids: - message = ( - f"Duplicate Operation ID {operation_id} for function " - + f"{route.endpoint.__name__}" - ) - file_name = getattr(route.endpoint, "__globals__", {}).get("__file__") - if file_name: - message += f" at {file_name}" - warnings.warn(message, stacklevel=1) - operation_ids.add(operation_id) - operation["operationId"] = operation_id - if route.deprecated: - operation["deprecated"] = route.deprecated - return operation - - -def get_openapi_path( - *, - route: routing.APIRoute, - operation_ids: Set[str], - schema_generator: GenerateJsonSchema, - model_name_map: ModelNameMap, - field_mapping: Dict[ - Tuple[ModelField, Literal["validation", "serialization"]], JsonSchemaValue - ], - separate_input_output_schemas: bool = True, -) -> Tuple[Dict[str, Any], Dict[str, Any], Dict[str, Any]]: - path = {} - security_schemes: Dict[str, Any] = {} - definitions: Dict[str, Any] = {} - assert route.methods is not None, "Methods must be a list" - if isinstance(route.response_class, DefaultPlaceholder): - current_response_class: Type[Response] = route.response_class.value - else: - current_response_class = route.response_class - assert current_response_class, "A response class is needed to generate OpenAPI" - route_response_media_type: Optional[str] = current_response_class.media_type - if route.include_in_schema: - for method in route.methods: - operation = get_openapi_operation_metadata( - route=route, method=method, operation_ids=operation_ids - ) - parameters: List[Dict[str, Any]] = [] - flat_dependant = get_flat_dependant(route.dependant, skip_repeats=True) - security_definitions, operation_security = get_openapi_security_definitions( - flat_dependant=flat_dependant - ) - if operation_security: - operation.setdefault("security", []).extend(operation_security) - if security_definitions: - security_schemes.update(security_definitions) - operation_parameters = _get_openapi_operation_parameters( - dependant=route.dependant, - schema_generator=schema_generator, - model_name_map=model_name_map, - field_mapping=field_mapping, - separate_input_output_schemas=separate_input_output_schemas, - ) - parameters.extend(operation_parameters) - if parameters: - all_parameters = { - (param["in"], param["name"]): param for param in parameters - } - required_parameters = { - (param["in"], param["name"]): param - for param in parameters - if param.get("required") - } - # Make sure required definitions of the same parameter take precedence - # over non-required definitions - all_parameters.update(required_parameters) - operation["parameters"] = list(all_parameters.values()) - if method in METHODS_WITH_BODY: - request_body_oai = get_openapi_operation_request_body( - body_field=route.body_field, - schema_generator=schema_generator, - model_name_map=model_name_map, - field_mapping=field_mapping, - separate_input_output_schemas=separate_input_output_schemas, - ) - if request_body_oai: - operation["requestBody"] = request_body_oai - if route.callbacks: - callbacks = {} - for callback in route.callbacks: - if isinstance(callback, routing.APIRoute): - ( - cb_path, - cb_security_schemes, - cb_definitions, - ) = get_openapi_path( - route=callback, - operation_ids=operation_ids, - schema_generator=schema_generator, - model_name_map=model_name_map, - field_mapping=field_mapping, - separate_input_output_schemas=separate_input_output_schemas, - ) - callbacks[callback.name] = {callback.path: cb_path} - operation["callbacks"] = callbacks - if route.status_code is not None: - status_code = str(route.status_code) - else: - # It would probably make more sense for all response classes to have an - # explicit default status_code, and to extract it from them, instead of - # doing this inspection tricks, that would probably be in the future - # TODO: probably make status_code a default class attribute for all - # responses in Starlette - response_signature = inspect.signature(current_response_class.__init__) - status_code_param = response_signature.parameters.get("status_code") - if status_code_param is not None: - if isinstance(status_code_param.default, int): - status_code = str(status_code_param.default) - operation.setdefault("responses", {}).setdefault(status_code, {})[ - "description" - ] = route.response_description - if route_response_media_type and is_body_allowed_for_status_code( - route.status_code - ): - response_schema = {"type": "string"} - if lenient_issubclass(current_response_class, JSONResponse): - if route.response_field: - response_schema = get_schema_from_model_field( - field=route.response_field, - schema_generator=schema_generator, - model_name_map=model_name_map, - field_mapping=field_mapping, - separate_input_output_schemas=separate_input_output_schemas, - ) - else: - response_schema = {} - operation.setdefault("responses", {}).setdefault( - status_code, {} - ).setdefault("content", {}).setdefault(route_response_media_type, {})[ - "schema" - ] = response_schema - if route.responses: - operation_responses = operation.setdefault("responses", {}) - for ( - additional_status_code, - additional_response, - ) in route.responses.items(): - process_response = additional_response.copy() - process_response.pop("model", None) - status_code_key = str(additional_status_code).upper() - if status_code_key == "DEFAULT": - status_code_key = "default" - openapi_response = operation_responses.setdefault( - status_code_key, {} - ) - assert isinstance(process_response, dict), ( - "An additional response must be a dict" - ) - field = route.response_fields.get(additional_status_code) - additional_field_schema: Optional[Dict[str, Any]] = None - if field: - additional_field_schema = get_schema_from_model_field( - field=field, - schema_generator=schema_generator, - model_name_map=model_name_map, - field_mapping=field_mapping, - separate_input_output_schemas=separate_input_output_schemas, - ) - media_type = route_response_media_type or "application/json" - additional_schema = ( - process_response.setdefault("content", {}) - .setdefault(media_type, {}) - .setdefault("schema", {}) - ) - deep_dict_update(additional_schema, additional_field_schema) - status_text: Optional[str] = status_code_ranges.get( - str(additional_status_code).upper() - ) or http.client.responses.get(int(additional_status_code)) - description = ( - process_response.get("description") - or openapi_response.get("description") - or status_text - or "Additional Response" - ) - deep_dict_update(openapi_response, process_response) - openapi_response["description"] = description - http422 = str(HTTP_422_UNPROCESSABLE_ENTITY) - all_route_params = get_flat_params(route.dependant) - if (all_route_params or route.body_field) and not any( - status in operation["responses"] - for status in [http422, "4XX", "default"] - ): - operation["responses"][http422] = { - "description": "Validation Error", - "content": { - "application/json": { - "schema": {"$ref": REF_PREFIX + "HTTPValidationError"} - } - }, - } - if "ValidationError" not in definitions: - definitions.update( - { - "ValidationError": validation_error_definition, - "HTTPValidationError": validation_error_response_definition, - } - ) - if route.openapi_extra: - deep_dict_update(operation, route.openapi_extra) - path[method.lower()] = operation - return path, security_schemes, definitions - - -def get_fields_from_routes( - routes: Sequence[BaseRoute], -) -> List[ModelField]: - body_fields_from_routes: List[ModelField] = [] - responses_from_routes: List[ModelField] = [] - request_fields_from_routes: List[ModelField] = [] - callback_flat_models: List[ModelField] = [] - for route in routes: - if getattr(route, "include_in_schema", None) and isinstance( - route, routing.APIRoute - ): - if route.body_field: - assert isinstance(route.body_field, ModelField), ( - "A request body must be a Pydantic Field" - ) - body_fields_from_routes.append(route.body_field) - if route.response_field: - responses_from_routes.append(route.response_field) - if route.response_fields: - responses_from_routes.extend(route.response_fields.values()) - if route.callbacks: - callback_flat_models.extend(get_fields_from_routes(route.callbacks)) - params = get_flat_params(route.dependant) - request_fields_from_routes.extend(params) - - flat_models = callback_flat_models + list( - body_fields_from_routes + responses_from_routes + request_fields_from_routes - ) - return flat_models - - -def get_openapi( - *, - title: str, - version: str, - openapi_version: str = "3.1.0", - summary: Optional[str] = None, - description: Optional[str] = None, - routes: Sequence[BaseRoute], - webhooks: Optional[Sequence[BaseRoute]] = None, - tags: Optional[List[Dict[str, Any]]] = None, - servers: Optional[List[Dict[str, Union[str, Any]]]] = None, - terms_of_service: Optional[str] = None, - contact: Optional[Dict[str, Union[str, Any]]] = None, - license_info: Optional[Dict[str, Union[str, Any]]] = None, - separate_input_output_schemas: bool = True, -) -> Dict[str, Any]: - info: Dict[str, Any] = {"title": title, "version": version} - if summary: - info["summary"] = summary - if description: - info["description"] = description - if terms_of_service: - info["termsOfService"] = terms_of_service - if contact: - info["contact"] = contact - if license_info: - info["license"] = license_info - output: Dict[str, Any] = {"openapi": openapi_version, "info": info} - if servers: - output["servers"] = servers - components: Dict[str, Dict[str, Any]] = {} - paths: Dict[str, Dict[str, Any]] = {} - webhook_paths: Dict[str, Dict[str, Any]] = {} - operation_ids: Set[str] = set() - all_fields = get_fields_from_routes(list(routes or []) + list(webhooks or [])) - model_name_map = get_compat_model_name_map(all_fields) - schema_generator = GenerateJsonSchema(ref_template=REF_TEMPLATE) - field_mapping, definitions = get_definitions( - fields=all_fields, - schema_generator=schema_generator, - model_name_map=model_name_map, - separate_input_output_schemas=separate_input_output_schemas, - ) - for route in routes or []: - if isinstance(route, routing.APIRoute): - result = get_openapi_path( - route=route, - operation_ids=operation_ids, - schema_generator=schema_generator, - model_name_map=model_name_map, - field_mapping=field_mapping, - separate_input_output_schemas=separate_input_output_schemas, - ) - if result: - path, security_schemes, path_definitions = result - if path: - paths.setdefault(route.path_format, {}).update(path) - if security_schemes: - components.setdefault("securitySchemes", {}).update( - security_schemes - ) - if path_definitions: - definitions.update(path_definitions) - for webhook in webhooks or []: - if isinstance(webhook, routing.APIRoute): - result = get_openapi_path( - route=webhook, - operation_ids=operation_ids, - schema_generator=schema_generator, - model_name_map=model_name_map, - field_mapping=field_mapping, - separate_input_output_schemas=separate_input_output_schemas, - ) - if result: - path, security_schemes, path_definitions = result - if path: - webhook_paths.setdefault(webhook.path_format, {}).update(path) - if security_schemes: - components.setdefault("securitySchemes", {}).update( - security_schemes - ) - if path_definitions: - definitions.update(path_definitions) - if definitions: - components["schemas"] = {k: definitions[k] for k in sorted(definitions)} - if components: - output["components"] = components - output["paths"] = paths - if webhook_paths: - output["webhooks"] = webhook_paths - if tags: - output["tags"] = tags - return jsonable_encoder(OpenAPI(**output), by_alias=True, exclude_none=True) # type: ignore diff --git a/venv/lib/python3.11/site-packages/fastapi/param_functions.py b/venv/lib/python3.11/site-packages/fastapi/param_functions.py deleted file mode 100644 index b362162..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/param_functions.py +++ /dev/null @@ -1,2360 +0,0 @@ -from typing import Any, Callable, Dict, List, Optional, Sequence, Union - -from fastapi import params -from fastapi._compat import Undefined -from fastapi.openapi.models import Example -from typing_extensions import Annotated, Doc, deprecated - -_Unset: Any = Undefined - - -def Path( # noqa: N802 - default: Annotated[ - Any, - Doc( - """ - Default value if the parameter field is not set. - - This doesn't affect `Path` parameters as the value is always required. - The parameter is available only for compatibility. - """ - ), - ] = ..., - *, - default_factory: Annotated[ - Union[Callable[[], Any], None], - Doc( - """ - A callable to generate the default value. - - This doesn't affect `Path` parameters as the value is always required. - The parameter is available only for compatibility. - """ - ), - ] = _Unset, - alias: Annotated[ - Optional[str], - Doc( - """ - An alternative name for the parameter field. - - This will be used to extract the data and for the generated OpenAPI. - It is particularly useful when you can't use the name you want because it - is a Python reserved keyword or similar. - """ - ), - ] = None, - alias_priority: Annotated[ - Union[int, None], - Doc( - """ - Priority of the alias. This affects whether an alias generator is used. - """ - ), - ] = _Unset, - # TODO: update when deprecating Pydantic v1, import these types - # validation_alias: str | AliasPath | AliasChoices | None - validation_alias: Annotated[ - Union[str, None], - Doc( - """ - 'Whitelist' validation step. The parameter field will be the single one - allowed by the alias or set of aliases defined. - """ - ), - ] = None, - serialization_alias: Annotated[ - Union[str, None], - Doc( - """ - 'Blacklist' validation step. The vanilla parameter field will be the - single one of the alias' or set of aliases' fields and all the other - fields will be ignored at serialization time. - """ - ), - ] = None, - title: Annotated[ - Optional[str], - Doc( - """ - Human-readable title. - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - Human-readable description. - """ - ), - ] = None, - gt: Annotated[ - Optional[float], - Doc( - """ - Greater than. If set, value must be greater than this. Only applicable to - numbers. - """ - ), - ] = None, - ge: Annotated[ - Optional[float], - Doc( - """ - Greater than or equal. If set, value must be greater than or equal to - this. Only applicable to numbers. - """ - ), - ] = None, - lt: Annotated[ - Optional[float], - Doc( - """ - Less than. If set, value must be less than this. Only applicable to numbers. - """ - ), - ] = None, - le: Annotated[ - Optional[float], - Doc( - """ - Less than or equal. If set, value must be less than or equal to this. - Only applicable to numbers. - """ - ), - ] = None, - min_length: Annotated[ - Optional[int], - Doc( - """ - Minimum length for strings. - """ - ), - ] = None, - max_length: Annotated[ - Optional[int], - Doc( - """ - Maximum length for strings. - """ - ), - ] = None, - pattern: Annotated[ - Optional[str], - Doc( - """ - RegEx pattern for strings. - """ - ), - ] = None, - regex: Annotated[ - Optional[str], - Doc( - """ - RegEx pattern for strings. - """ - ), - deprecated( - "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." - ), - ] = None, - discriminator: Annotated[ - Union[str, None], - Doc( - """ - Parameter field name for discriminating the type in a tagged union. - """ - ), - ] = None, - strict: Annotated[ - Union[bool, None], - Doc( - """ - If `True`, strict validation is applied to the field. - """ - ), - ] = _Unset, - multiple_of: Annotated[ - Union[float, None], - Doc( - """ - Value must be a multiple of this. Only applicable to numbers. - """ - ), - ] = _Unset, - allow_inf_nan: Annotated[ - Union[bool, None], - Doc( - """ - Allow `inf`, `-inf`, `nan`. Only applicable to numbers. - """ - ), - ] = _Unset, - max_digits: Annotated[ - Union[int, None], - Doc( - """ - Maximum number of allow digits for strings. - """ - ), - ] = _Unset, - decimal_places: Annotated[ - Union[int, None], - Doc( - """ - Maximum number of decimal places allowed for numbers. - """ - ), - ] = _Unset, - examples: Annotated[ - Optional[List[Any]], - Doc( - """ - Example values for this field. - """ - ), - ] = None, - example: Annotated[ - Optional[Any], - deprecated( - "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " - "although still supported. Use examples instead." - ), - ] = _Unset, - openapi_examples: Annotated[ - Optional[Dict[str, Example]], - Doc( - """ - OpenAPI-specific examples. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Swagger UI (that provides the `/docs` interface) has better support for the - OpenAPI-specific examples than the JSON Schema `examples`, that's the main - use case for this. - - Read more about it in the - [FastAPI docs for Declare Request Example Data](https://fastapi.tiangolo.com/tutorial/schema-extra-example/#using-the-openapi_examples-parameter). - """ - ), - ] = None, - deprecated: Annotated[ - Union[deprecated, str, bool, None], - Doc( - """ - Mark this parameter field as deprecated. - - It will affect the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - include_in_schema: Annotated[ - bool, - Doc( - """ - To include (or not) this parameter field in the generated OpenAPI. - You probably don't need it, but it's available. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = True, - json_schema_extra: Annotated[ - Union[Dict[str, Any], None], - Doc( - """ - Any additional JSON schema data. - """ - ), - ] = None, - **extra: Annotated[ - Any, - Doc( - """ - Include extra fields used by the JSON Schema. - """ - ), - deprecated( - """ - The `extra` kwargs is deprecated. Use `json_schema_extra` instead. - """ - ), - ], -) -> Any: - """ - Declare a path parameter for a *path operation*. - - Read more about it in the - [FastAPI docs for Path Parameters and Numeric Validations](https://fastapi.tiangolo.com/tutorial/path-params-numeric-validations/). - - ```python - from typing import Annotated - - from fastapi import FastAPI, Path - - app = FastAPI() - - - @app.get("/items/{item_id}") - async def read_items( - item_id: Annotated[int, Path(title="The ID of the item to get")], - ): - return {"item_id": item_id} - ``` - """ - return params.Path( - default=default, - default_factory=default_factory, - alias=alias, - alias_priority=alias_priority, - validation_alias=validation_alias, - serialization_alias=serialization_alias, - title=title, - description=description, - gt=gt, - ge=ge, - lt=lt, - le=le, - min_length=min_length, - max_length=max_length, - pattern=pattern, - regex=regex, - discriminator=discriminator, - strict=strict, - multiple_of=multiple_of, - allow_inf_nan=allow_inf_nan, - max_digits=max_digits, - decimal_places=decimal_places, - example=example, - examples=examples, - openapi_examples=openapi_examples, - deprecated=deprecated, - include_in_schema=include_in_schema, - json_schema_extra=json_schema_extra, - **extra, - ) - - -def Query( # noqa: N802 - default: Annotated[ - Any, - Doc( - """ - Default value if the parameter field is not set. - """ - ), - ] = Undefined, - *, - default_factory: Annotated[ - Union[Callable[[], Any], None], - Doc( - """ - A callable to generate the default value. - - This doesn't affect `Path` parameters as the value is always required. - The parameter is available only for compatibility. - """ - ), - ] = _Unset, - alias: Annotated[ - Optional[str], - Doc( - """ - An alternative name for the parameter field. - - This will be used to extract the data and for the generated OpenAPI. - It is particularly useful when you can't use the name you want because it - is a Python reserved keyword or similar. - """ - ), - ] = None, - alias_priority: Annotated[ - Union[int, None], - Doc( - """ - Priority of the alias. This affects whether an alias generator is used. - """ - ), - ] = _Unset, - # TODO: update when deprecating Pydantic v1, import these types - # validation_alias: str | AliasPath | AliasChoices | None - validation_alias: Annotated[ - Union[str, None], - Doc( - """ - 'Whitelist' validation step. The parameter field will be the single one - allowed by the alias or set of aliases defined. - """ - ), - ] = None, - serialization_alias: Annotated[ - Union[str, None], - Doc( - """ - 'Blacklist' validation step. The vanilla parameter field will be the - single one of the alias' or set of aliases' fields and all the other - fields will be ignored at serialization time. - """ - ), - ] = None, - title: Annotated[ - Optional[str], - Doc( - """ - Human-readable title. - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - Human-readable description. - """ - ), - ] = None, - gt: Annotated[ - Optional[float], - Doc( - """ - Greater than. If set, value must be greater than this. Only applicable to - numbers. - """ - ), - ] = None, - ge: Annotated[ - Optional[float], - Doc( - """ - Greater than or equal. If set, value must be greater than or equal to - this. Only applicable to numbers. - """ - ), - ] = None, - lt: Annotated[ - Optional[float], - Doc( - """ - Less than. If set, value must be less than this. Only applicable to numbers. - """ - ), - ] = None, - le: Annotated[ - Optional[float], - Doc( - """ - Less than or equal. If set, value must be less than or equal to this. - Only applicable to numbers. - """ - ), - ] = None, - min_length: Annotated[ - Optional[int], - Doc( - """ - Minimum length for strings. - """ - ), - ] = None, - max_length: Annotated[ - Optional[int], - Doc( - """ - Maximum length for strings. - """ - ), - ] = None, - pattern: Annotated[ - Optional[str], - Doc( - """ - RegEx pattern for strings. - """ - ), - ] = None, - regex: Annotated[ - Optional[str], - Doc( - """ - RegEx pattern for strings. - """ - ), - deprecated( - "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." - ), - ] = None, - discriminator: Annotated[ - Union[str, None], - Doc( - """ - Parameter field name for discriminating the type in a tagged union. - """ - ), - ] = None, - strict: Annotated[ - Union[bool, None], - Doc( - """ - If `True`, strict validation is applied to the field. - """ - ), - ] = _Unset, - multiple_of: Annotated[ - Union[float, None], - Doc( - """ - Value must be a multiple of this. Only applicable to numbers. - """ - ), - ] = _Unset, - allow_inf_nan: Annotated[ - Union[bool, None], - Doc( - """ - Allow `inf`, `-inf`, `nan`. Only applicable to numbers. - """ - ), - ] = _Unset, - max_digits: Annotated[ - Union[int, None], - Doc( - """ - Maximum number of allow digits for strings. - """ - ), - ] = _Unset, - decimal_places: Annotated[ - Union[int, None], - Doc( - """ - Maximum number of decimal places allowed for numbers. - """ - ), - ] = _Unset, - examples: Annotated[ - Optional[List[Any]], - Doc( - """ - Example values for this field. - """ - ), - ] = None, - example: Annotated[ - Optional[Any], - deprecated( - "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " - "although still supported. Use examples instead." - ), - ] = _Unset, - openapi_examples: Annotated[ - Optional[Dict[str, Example]], - Doc( - """ - OpenAPI-specific examples. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Swagger UI (that provides the `/docs` interface) has better support for the - OpenAPI-specific examples than the JSON Schema `examples`, that's the main - use case for this. - - Read more about it in the - [FastAPI docs for Declare Request Example Data](https://fastapi.tiangolo.com/tutorial/schema-extra-example/#using-the-openapi_examples-parameter). - """ - ), - ] = None, - deprecated: Annotated[ - Union[deprecated, str, bool, None], - Doc( - """ - Mark this parameter field as deprecated. - - It will affect the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - include_in_schema: Annotated[ - bool, - Doc( - """ - To include (or not) this parameter field in the generated OpenAPI. - You probably don't need it, but it's available. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = True, - json_schema_extra: Annotated[ - Union[Dict[str, Any], None], - Doc( - """ - Any additional JSON schema data. - """ - ), - ] = None, - **extra: Annotated[ - Any, - Doc( - """ - Include extra fields used by the JSON Schema. - """ - ), - deprecated( - """ - The `extra` kwargs is deprecated. Use `json_schema_extra` instead. - """ - ), - ], -) -> Any: - return params.Query( - default=default, - default_factory=default_factory, - alias=alias, - alias_priority=alias_priority, - validation_alias=validation_alias, - serialization_alias=serialization_alias, - title=title, - description=description, - gt=gt, - ge=ge, - lt=lt, - le=le, - min_length=min_length, - max_length=max_length, - pattern=pattern, - regex=regex, - discriminator=discriminator, - strict=strict, - multiple_of=multiple_of, - allow_inf_nan=allow_inf_nan, - max_digits=max_digits, - decimal_places=decimal_places, - example=example, - examples=examples, - openapi_examples=openapi_examples, - deprecated=deprecated, - include_in_schema=include_in_schema, - json_schema_extra=json_schema_extra, - **extra, - ) - - -def Header( # noqa: N802 - default: Annotated[ - Any, - Doc( - """ - Default value if the parameter field is not set. - """ - ), - ] = Undefined, - *, - default_factory: Annotated[ - Union[Callable[[], Any], None], - Doc( - """ - A callable to generate the default value. - - This doesn't affect `Path` parameters as the value is always required. - The parameter is available only for compatibility. - """ - ), - ] = _Unset, - alias: Annotated[ - Optional[str], - Doc( - """ - An alternative name for the parameter field. - - This will be used to extract the data and for the generated OpenAPI. - It is particularly useful when you can't use the name you want because it - is a Python reserved keyword or similar. - """ - ), - ] = None, - alias_priority: Annotated[ - Union[int, None], - Doc( - """ - Priority of the alias. This affects whether an alias generator is used. - """ - ), - ] = _Unset, - # TODO: update when deprecating Pydantic v1, import these types - # validation_alias: str | AliasPath | AliasChoices | None - validation_alias: Annotated[ - Union[str, None], - Doc( - """ - 'Whitelist' validation step. The parameter field will be the single one - allowed by the alias or set of aliases defined. - """ - ), - ] = None, - serialization_alias: Annotated[ - Union[str, None], - Doc( - """ - 'Blacklist' validation step. The vanilla parameter field will be the - single one of the alias' or set of aliases' fields and all the other - fields will be ignored at serialization time. - """ - ), - ] = None, - convert_underscores: Annotated[ - bool, - Doc( - """ - Automatically convert underscores to hyphens in the parameter field name. - - Read more about it in the - [FastAPI docs for Header Parameters](https://fastapi.tiangolo.com/tutorial/header-params/#automatic-conversion) - """ - ), - ] = True, - title: Annotated[ - Optional[str], - Doc( - """ - Human-readable title. - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - Human-readable description. - """ - ), - ] = None, - gt: Annotated[ - Optional[float], - Doc( - """ - Greater than. If set, value must be greater than this. Only applicable to - numbers. - """ - ), - ] = None, - ge: Annotated[ - Optional[float], - Doc( - """ - Greater than or equal. If set, value must be greater than or equal to - this. Only applicable to numbers. - """ - ), - ] = None, - lt: Annotated[ - Optional[float], - Doc( - """ - Less than. If set, value must be less than this. Only applicable to numbers. - """ - ), - ] = None, - le: Annotated[ - Optional[float], - Doc( - """ - Less than or equal. If set, value must be less than or equal to this. - Only applicable to numbers. - """ - ), - ] = None, - min_length: Annotated[ - Optional[int], - Doc( - """ - Minimum length for strings. - """ - ), - ] = None, - max_length: Annotated[ - Optional[int], - Doc( - """ - Maximum length for strings. - """ - ), - ] = None, - pattern: Annotated[ - Optional[str], - Doc( - """ - RegEx pattern for strings. - """ - ), - ] = None, - regex: Annotated[ - Optional[str], - Doc( - """ - RegEx pattern for strings. - """ - ), - deprecated( - "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." - ), - ] = None, - discriminator: Annotated[ - Union[str, None], - Doc( - """ - Parameter field name for discriminating the type in a tagged union. - """ - ), - ] = None, - strict: Annotated[ - Union[bool, None], - Doc( - """ - If `True`, strict validation is applied to the field. - """ - ), - ] = _Unset, - multiple_of: Annotated[ - Union[float, None], - Doc( - """ - Value must be a multiple of this. Only applicable to numbers. - """ - ), - ] = _Unset, - allow_inf_nan: Annotated[ - Union[bool, None], - Doc( - """ - Allow `inf`, `-inf`, `nan`. Only applicable to numbers. - """ - ), - ] = _Unset, - max_digits: Annotated[ - Union[int, None], - Doc( - """ - Maximum number of allow digits for strings. - """ - ), - ] = _Unset, - decimal_places: Annotated[ - Union[int, None], - Doc( - """ - Maximum number of decimal places allowed for numbers. - """ - ), - ] = _Unset, - examples: Annotated[ - Optional[List[Any]], - Doc( - """ - Example values for this field. - """ - ), - ] = None, - example: Annotated[ - Optional[Any], - deprecated( - "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " - "although still supported. Use examples instead." - ), - ] = _Unset, - openapi_examples: Annotated[ - Optional[Dict[str, Example]], - Doc( - """ - OpenAPI-specific examples. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Swagger UI (that provides the `/docs` interface) has better support for the - OpenAPI-specific examples than the JSON Schema `examples`, that's the main - use case for this. - - Read more about it in the - [FastAPI docs for Declare Request Example Data](https://fastapi.tiangolo.com/tutorial/schema-extra-example/#using-the-openapi_examples-parameter). - """ - ), - ] = None, - deprecated: Annotated[ - Union[deprecated, str, bool, None], - Doc( - """ - Mark this parameter field as deprecated. - - It will affect the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - include_in_schema: Annotated[ - bool, - Doc( - """ - To include (or not) this parameter field in the generated OpenAPI. - You probably don't need it, but it's available. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = True, - json_schema_extra: Annotated[ - Union[Dict[str, Any], None], - Doc( - """ - Any additional JSON schema data. - """ - ), - ] = None, - **extra: Annotated[ - Any, - Doc( - """ - Include extra fields used by the JSON Schema. - """ - ), - deprecated( - """ - The `extra` kwargs is deprecated. Use `json_schema_extra` instead. - """ - ), - ], -) -> Any: - return params.Header( - default=default, - default_factory=default_factory, - alias=alias, - alias_priority=alias_priority, - validation_alias=validation_alias, - serialization_alias=serialization_alias, - convert_underscores=convert_underscores, - title=title, - description=description, - gt=gt, - ge=ge, - lt=lt, - le=le, - min_length=min_length, - max_length=max_length, - pattern=pattern, - regex=regex, - discriminator=discriminator, - strict=strict, - multiple_of=multiple_of, - allow_inf_nan=allow_inf_nan, - max_digits=max_digits, - decimal_places=decimal_places, - example=example, - examples=examples, - openapi_examples=openapi_examples, - deprecated=deprecated, - include_in_schema=include_in_schema, - json_schema_extra=json_schema_extra, - **extra, - ) - - -def Cookie( # noqa: N802 - default: Annotated[ - Any, - Doc( - """ - Default value if the parameter field is not set. - """ - ), - ] = Undefined, - *, - default_factory: Annotated[ - Union[Callable[[], Any], None], - Doc( - """ - A callable to generate the default value. - - This doesn't affect `Path` parameters as the value is always required. - The parameter is available only for compatibility. - """ - ), - ] = _Unset, - alias: Annotated[ - Optional[str], - Doc( - """ - An alternative name for the parameter field. - - This will be used to extract the data and for the generated OpenAPI. - It is particularly useful when you can't use the name you want because it - is a Python reserved keyword or similar. - """ - ), - ] = None, - alias_priority: Annotated[ - Union[int, None], - Doc( - """ - Priority of the alias. This affects whether an alias generator is used. - """ - ), - ] = _Unset, - # TODO: update when deprecating Pydantic v1, import these types - # validation_alias: str | AliasPath | AliasChoices | None - validation_alias: Annotated[ - Union[str, None], - Doc( - """ - 'Whitelist' validation step. The parameter field will be the single one - allowed by the alias or set of aliases defined. - """ - ), - ] = None, - serialization_alias: Annotated[ - Union[str, None], - Doc( - """ - 'Blacklist' validation step. The vanilla parameter field will be the - single one of the alias' or set of aliases' fields and all the other - fields will be ignored at serialization time. - """ - ), - ] = None, - title: Annotated[ - Optional[str], - Doc( - """ - Human-readable title. - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - Human-readable description. - """ - ), - ] = None, - gt: Annotated[ - Optional[float], - Doc( - """ - Greater than. If set, value must be greater than this. Only applicable to - numbers. - """ - ), - ] = None, - ge: Annotated[ - Optional[float], - Doc( - """ - Greater than or equal. If set, value must be greater than or equal to - this. Only applicable to numbers. - """ - ), - ] = None, - lt: Annotated[ - Optional[float], - Doc( - """ - Less than. If set, value must be less than this. Only applicable to numbers. - """ - ), - ] = None, - le: Annotated[ - Optional[float], - Doc( - """ - Less than or equal. If set, value must be less than or equal to this. - Only applicable to numbers. - """ - ), - ] = None, - min_length: Annotated[ - Optional[int], - Doc( - """ - Minimum length for strings. - """ - ), - ] = None, - max_length: Annotated[ - Optional[int], - Doc( - """ - Maximum length for strings. - """ - ), - ] = None, - pattern: Annotated[ - Optional[str], - Doc( - """ - RegEx pattern for strings. - """ - ), - ] = None, - regex: Annotated[ - Optional[str], - Doc( - """ - RegEx pattern for strings. - """ - ), - deprecated( - "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." - ), - ] = None, - discriminator: Annotated[ - Union[str, None], - Doc( - """ - Parameter field name for discriminating the type in a tagged union. - """ - ), - ] = None, - strict: Annotated[ - Union[bool, None], - Doc( - """ - If `True`, strict validation is applied to the field. - """ - ), - ] = _Unset, - multiple_of: Annotated[ - Union[float, None], - Doc( - """ - Value must be a multiple of this. Only applicable to numbers. - """ - ), - ] = _Unset, - allow_inf_nan: Annotated[ - Union[bool, None], - Doc( - """ - Allow `inf`, `-inf`, `nan`. Only applicable to numbers. - """ - ), - ] = _Unset, - max_digits: Annotated[ - Union[int, None], - Doc( - """ - Maximum number of allow digits for strings. - """ - ), - ] = _Unset, - decimal_places: Annotated[ - Union[int, None], - Doc( - """ - Maximum number of decimal places allowed for numbers. - """ - ), - ] = _Unset, - examples: Annotated[ - Optional[List[Any]], - Doc( - """ - Example values for this field. - """ - ), - ] = None, - example: Annotated[ - Optional[Any], - deprecated( - "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " - "although still supported. Use examples instead." - ), - ] = _Unset, - openapi_examples: Annotated[ - Optional[Dict[str, Example]], - Doc( - """ - OpenAPI-specific examples. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Swagger UI (that provides the `/docs` interface) has better support for the - OpenAPI-specific examples than the JSON Schema `examples`, that's the main - use case for this. - - Read more about it in the - [FastAPI docs for Declare Request Example Data](https://fastapi.tiangolo.com/tutorial/schema-extra-example/#using-the-openapi_examples-parameter). - """ - ), - ] = None, - deprecated: Annotated[ - Union[deprecated, str, bool, None], - Doc( - """ - Mark this parameter field as deprecated. - - It will affect the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - include_in_schema: Annotated[ - bool, - Doc( - """ - To include (or not) this parameter field in the generated OpenAPI. - You probably don't need it, but it's available. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = True, - json_schema_extra: Annotated[ - Union[Dict[str, Any], None], - Doc( - """ - Any additional JSON schema data. - """ - ), - ] = None, - **extra: Annotated[ - Any, - Doc( - """ - Include extra fields used by the JSON Schema. - """ - ), - deprecated( - """ - The `extra` kwargs is deprecated. Use `json_schema_extra` instead. - """ - ), - ], -) -> Any: - return params.Cookie( - default=default, - default_factory=default_factory, - alias=alias, - alias_priority=alias_priority, - validation_alias=validation_alias, - serialization_alias=serialization_alias, - title=title, - description=description, - gt=gt, - ge=ge, - lt=lt, - le=le, - min_length=min_length, - max_length=max_length, - pattern=pattern, - regex=regex, - discriminator=discriminator, - strict=strict, - multiple_of=multiple_of, - allow_inf_nan=allow_inf_nan, - max_digits=max_digits, - decimal_places=decimal_places, - example=example, - examples=examples, - openapi_examples=openapi_examples, - deprecated=deprecated, - include_in_schema=include_in_schema, - json_schema_extra=json_schema_extra, - **extra, - ) - - -def Body( # noqa: N802 - default: Annotated[ - Any, - Doc( - """ - Default value if the parameter field is not set. - """ - ), - ] = Undefined, - *, - default_factory: Annotated[ - Union[Callable[[], Any], None], - Doc( - """ - A callable to generate the default value. - - This doesn't affect `Path` parameters as the value is always required. - The parameter is available only for compatibility. - """ - ), - ] = _Unset, - embed: Annotated[ - Union[bool, None], - Doc( - """ - When `embed` is `True`, the parameter will be expected in a JSON body as a - key instead of being the JSON body itself. - - This happens automatically when more than one `Body` parameter is declared. - - Read more about it in the - [FastAPI docs for Body - Multiple Parameters](https://fastapi.tiangolo.com/tutorial/body-multiple-params/#embed-a-single-body-parameter). - """ - ), - ] = None, - media_type: Annotated[ - str, - Doc( - """ - The media type of this parameter field. Changing it would affect the - generated OpenAPI, but currently it doesn't affect the parsing of the data. - """ - ), - ] = "application/json", - alias: Annotated[ - Optional[str], - Doc( - """ - An alternative name for the parameter field. - - This will be used to extract the data and for the generated OpenAPI. - It is particularly useful when you can't use the name you want because it - is a Python reserved keyword or similar. - """ - ), - ] = None, - alias_priority: Annotated[ - Union[int, None], - Doc( - """ - Priority of the alias. This affects whether an alias generator is used. - """ - ), - ] = _Unset, - # TODO: update when deprecating Pydantic v1, import these types - # validation_alias: str | AliasPath | AliasChoices | None - validation_alias: Annotated[ - Union[str, None], - Doc( - """ - 'Whitelist' validation step. The parameter field will be the single one - allowed by the alias or set of aliases defined. - """ - ), - ] = None, - serialization_alias: Annotated[ - Union[str, None], - Doc( - """ - 'Blacklist' validation step. The vanilla parameter field will be the - single one of the alias' or set of aliases' fields and all the other - fields will be ignored at serialization time. - """ - ), - ] = None, - title: Annotated[ - Optional[str], - Doc( - """ - Human-readable title. - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - Human-readable description. - """ - ), - ] = None, - gt: Annotated[ - Optional[float], - Doc( - """ - Greater than. If set, value must be greater than this. Only applicable to - numbers. - """ - ), - ] = None, - ge: Annotated[ - Optional[float], - Doc( - """ - Greater than or equal. If set, value must be greater than or equal to - this. Only applicable to numbers. - """ - ), - ] = None, - lt: Annotated[ - Optional[float], - Doc( - """ - Less than. If set, value must be less than this. Only applicable to numbers. - """ - ), - ] = None, - le: Annotated[ - Optional[float], - Doc( - """ - Less than or equal. If set, value must be less than or equal to this. - Only applicable to numbers. - """ - ), - ] = None, - min_length: Annotated[ - Optional[int], - Doc( - """ - Minimum length for strings. - """ - ), - ] = None, - max_length: Annotated[ - Optional[int], - Doc( - """ - Maximum length for strings. - """ - ), - ] = None, - pattern: Annotated[ - Optional[str], - Doc( - """ - RegEx pattern for strings. - """ - ), - ] = None, - regex: Annotated[ - Optional[str], - Doc( - """ - RegEx pattern for strings. - """ - ), - deprecated( - "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." - ), - ] = None, - discriminator: Annotated[ - Union[str, None], - Doc( - """ - Parameter field name for discriminating the type in a tagged union. - """ - ), - ] = None, - strict: Annotated[ - Union[bool, None], - Doc( - """ - If `True`, strict validation is applied to the field. - """ - ), - ] = _Unset, - multiple_of: Annotated[ - Union[float, None], - Doc( - """ - Value must be a multiple of this. Only applicable to numbers. - """ - ), - ] = _Unset, - allow_inf_nan: Annotated[ - Union[bool, None], - Doc( - """ - Allow `inf`, `-inf`, `nan`. Only applicable to numbers. - """ - ), - ] = _Unset, - max_digits: Annotated[ - Union[int, None], - Doc( - """ - Maximum number of allow digits for strings. - """ - ), - ] = _Unset, - decimal_places: Annotated[ - Union[int, None], - Doc( - """ - Maximum number of decimal places allowed for numbers. - """ - ), - ] = _Unset, - examples: Annotated[ - Optional[List[Any]], - Doc( - """ - Example values for this field. - """ - ), - ] = None, - example: Annotated[ - Optional[Any], - deprecated( - "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " - "although still supported. Use examples instead." - ), - ] = _Unset, - openapi_examples: Annotated[ - Optional[Dict[str, Example]], - Doc( - """ - OpenAPI-specific examples. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Swagger UI (that provides the `/docs` interface) has better support for the - OpenAPI-specific examples than the JSON Schema `examples`, that's the main - use case for this. - - Read more about it in the - [FastAPI docs for Declare Request Example Data](https://fastapi.tiangolo.com/tutorial/schema-extra-example/#using-the-openapi_examples-parameter). - """ - ), - ] = None, - deprecated: Annotated[ - Union[deprecated, str, bool, None], - Doc( - """ - Mark this parameter field as deprecated. - - It will affect the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - include_in_schema: Annotated[ - bool, - Doc( - """ - To include (or not) this parameter field in the generated OpenAPI. - You probably don't need it, but it's available. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = True, - json_schema_extra: Annotated[ - Union[Dict[str, Any], None], - Doc( - """ - Any additional JSON schema data. - """ - ), - ] = None, - **extra: Annotated[ - Any, - Doc( - """ - Include extra fields used by the JSON Schema. - """ - ), - deprecated( - """ - The `extra` kwargs is deprecated. Use `json_schema_extra` instead. - """ - ), - ], -) -> Any: - return params.Body( - default=default, - default_factory=default_factory, - embed=embed, - media_type=media_type, - alias=alias, - alias_priority=alias_priority, - validation_alias=validation_alias, - serialization_alias=serialization_alias, - title=title, - description=description, - gt=gt, - ge=ge, - lt=lt, - le=le, - min_length=min_length, - max_length=max_length, - pattern=pattern, - regex=regex, - discriminator=discriminator, - strict=strict, - multiple_of=multiple_of, - allow_inf_nan=allow_inf_nan, - max_digits=max_digits, - decimal_places=decimal_places, - example=example, - examples=examples, - openapi_examples=openapi_examples, - deprecated=deprecated, - include_in_schema=include_in_schema, - json_schema_extra=json_schema_extra, - **extra, - ) - - -def Form( # noqa: N802 - default: Annotated[ - Any, - Doc( - """ - Default value if the parameter field is not set. - """ - ), - ] = Undefined, - *, - default_factory: Annotated[ - Union[Callable[[], Any], None], - Doc( - """ - A callable to generate the default value. - - This doesn't affect `Path` parameters as the value is always required. - The parameter is available only for compatibility. - """ - ), - ] = _Unset, - media_type: Annotated[ - str, - Doc( - """ - The media type of this parameter field. Changing it would affect the - generated OpenAPI, but currently it doesn't affect the parsing of the data. - """ - ), - ] = "application/x-www-form-urlencoded", - alias: Annotated[ - Optional[str], - Doc( - """ - An alternative name for the parameter field. - - This will be used to extract the data and for the generated OpenAPI. - It is particularly useful when you can't use the name you want because it - is a Python reserved keyword or similar. - """ - ), - ] = None, - alias_priority: Annotated[ - Union[int, None], - Doc( - """ - Priority of the alias. This affects whether an alias generator is used. - """ - ), - ] = _Unset, - # TODO: update when deprecating Pydantic v1, import these types - # validation_alias: str | AliasPath | AliasChoices | None - validation_alias: Annotated[ - Union[str, None], - Doc( - """ - 'Whitelist' validation step. The parameter field will be the single one - allowed by the alias or set of aliases defined. - """ - ), - ] = None, - serialization_alias: Annotated[ - Union[str, None], - Doc( - """ - 'Blacklist' validation step. The vanilla parameter field will be the - single one of the alias' or set of aliases' fields and all the other - fields will be ignored at serialization time. - """ - ), - ] = None, - title: Annotated[ - Optional[str], - Doc( - """ - Human-readable title. - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - Human-readable description. - """ - ), - ] = None, - gt: Annotated[ - Optional[float], - Doc( - """ - Greater than. If set, value must be greater than this. Only applicable to - numbers. - """ - ), - ] = None, - ge: Annotated[ - Optional[float], - Doc( - """ - Greater than or equal. If set, value must be greater than or equal to - this. Only applicable to numbers. - """ - ), - ] = None, - lt: Annotated[ - Optional[float], - Doc( - """ - Less than. If set, value must be less than this. Only applicable to numbers. - """ - ), - ] = None, - le: Annotated[ - Optional[float], - Doc( - """ - Less than or equal. If set, value must be less than or equal to this. - Only applicable to numbers. - """ - ), - ] = None, - min_length: Annotated[ - Optional[int], - Doc( - """ - Minimum length for strings. - """ - ), - ] = None, - max_length: Annotated[ - Optional[int], - Doc( - """ - Maximum length for strings. - """ - ), - ] = None, - pattern: Annotated[ - Optional[str], - Doc( - """ - RegEx pattern for strings. - """ - ), - ] = None, - regex: Annotated[ - Optional[str], - Doc( - """ - RegEx pattern for strings. - """ - ), - deprecated( - "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." - ), - ] = None, - discriminator: Annotated[ - Union[str, None], - Doc( - """ - Parameter field name for discriminating the type in a tagged union. - """ - ), - ] = None, - strict: Annotated[ - Union[bool, None], - Doc( - """ - If `True`, strict validation is applied to the field. - """ - ), - ] = _Unset, - multiple_of: Annotated[ - Union[float, None], - Doc( - """ - Value must be a multiple of this. Only applicable to numbers. - """ - ), - ] = _Unset, - allow_inf_nan: Annotated[ - Union[bool, None], - Doc( - """ - Allow `inf`, `-inf`, `nan`. Only applicable to numbers. - """ - ), - ] = _Unset, - max_digits: Annotated[ - Union[int, None], - Doc( - """ - Maximum number of allow digits for strings. - """ - ), - ] = _Unset, - decimal_places: Annotated[ - Union[int, None], - Doc( - """ - Maximum number of decimal places allowed for numbers. - """ - ), - ] = _Unset, - examples: Annotated[ - Optional[List[Any]], - Doc( - """ - Example values for this field. - """ - ), - ] = None, - example: Annotated[ - Optional[Any], - deprecated( - "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " - "although still supported. Use examples instead." - ), - ] = _Unset, - openapi_examples: Annotated[ - Optional[Dict[str, Example]], - Doc( - """ - OpenAPI-specific examples. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Swagger UI (that provides the `/docs` interface) has better support for the - OpenAPI-specific examples than the JSON Schema `examples`, that's the main - use case for this. - - Read more about it in the - [FastAPI docs for Declare Request Example Data](https://fastapi.tiangolo.com/tutorial/schema-extra-example/#using-the-openapi_examples-parameter). - """ - ), - ] = None, - deprecated: Annotated[ - Union[deprecated, str, bool, None], - Doc( - """ - Mark this parameter field as deprecated. - - It will affect the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - include_in_schema: Annotated[ - bool, - Doc( - """ - To include (or not) this parameter field in the generated OpenAPI. - You probably don't need it, but it's available. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = True, - json_schema_extra: Annotated[ - Union[Dict[str, Any], None], - Doc( - """ - Any additional JSON schema data. - """ - ), - ] = None, - **extra: Annotated[ - Any, - Doc( - """ - Include extra fields used by the JSON Schema. - """ - ), - deprecated( - """ - The `extra` kwargs is deprecated. Use `json_schema_extra` instead. - """ - ), - ], -) -> Any: - return params.Form( - default=default, - default_factory=default_factory, - media_type=media_type, - alias=alias, - alias_priority=alias_priority, - validation_alias=validation_alias, - serialization_alias=serialization_alias, - title=title, - description=description, - gt=gt, - ge=ge, - lt=lt, - le=le, - min_length=min_length, - max_length=max_length, - pattern=pattern, - regex=regex, - discriminator=discriminator, - strict=strict, - multiple_of=multiple_of, - allow_inf_nan=allow_inf_nan, - max_digits=max_digits, - decimal_places=decimal_places, - example=example, - examples=examples, - openapi_examples=openapi_examples, - deprecated=deprecated, - include_in_schema=include_in_schema, - json_schema_extra=json_schema_extra, - **extra, - ) - - -def File( # noqa: N802 - default: Annotated[ - Any, - Doc( - """ - Default value if the parameter field is not set. - """ - ), - ] = Undefined, - *, - default_factory: Annotated[ - Union[Callable[[], Any], None], - Doc( - """ - A callable to generate the default value. - - This doesn't affect `Path` parameters as the value is always required. - The parameter is available only for compatibility. - """ - ), - ] = _Unset, - media_type: Annotated[ - str, - Doc( - """ - The media type of this parameter field. Changing it would affect the - generated OpenAPI, but currently it doesn't affect the parsing of the data. - """ - ), - ] = "multipart/form-data", - alias: Annotated[ - Optional[str], - Doc( - """ - An alternative name for the parameter field. - - This will be used to extract the data and for the generated OpenAPI. - It is particularly useful when you can't use the name you want because it - is a Python reserved keyword or similar. - """ - ), - ] = None, - alias_priority: Annotated[ - Union[int, None], - Doc( - """ - Priority of the alias. This affects whether an alias generator is used. - """ - ), - ] = _Unset, - # TODO: update when deprecating Pydantic v1, import these types - # validation_alias: str | AliasPath | AliasChoices | None - validation_alias: Annotated[ - Union[str, None], - Doc( - """ - 'Whitelist' validation step. The parameter field will be the single one - allowed by the alias or set of aliases defined. - """ - ), - ] = None, - serialization_alias: Annotated[ - Union[str, None], - Doc( - """ - 'Blacklist' validation step. The vanilla parameter field will be the - single one of the alias' or set of aliases' fields and all the other - fields will be ignored at serialization time. - """ - ), - ] = None, - title: Annotated[ - Optional[str], - Doc( - """ - Human-readable title. - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - Human-readable description. - """ - ), - ] = None, - gt: Annotated[ - Optional[float], - Doc( - """ - Greater than. If set, value must be greater than this. Only applicable to - numbers. - """ - ), - ] = None, - ge: Annotated[ - Optional[float], - Doc( - """ - Greater than or equal. If set, value must be greater than or equal to - this. Only applicable to numbers. - """ - ), - ] = None, - lt: Annotated[ - Optional[float], - Doc( - """ - Less than. If set, value must be less than this. Only applicable to numbers. - """ - ), - ] = None, - le: Annotated[ - Optional[float], - Doc( - """ - Less than or equal. If set, value must be less than or equal to this. - Only applicable to numbers. - """ - ), - ] = None, - min_length: Annotated[ - Optional[int], - Doc( - """ - Minimum length for strings. - """ - ), - ] = None, - max_length: Annotated[ - Optional[int], - Doc( - """ - Maximum length for strings. - """ - ), - ] = None, - pattern: Annotated[ - Optional[str], - Doc( - """ - RegEx pattern for strings. - """ - ), - ] = None, - regex: Annotated[ - Optional[str], - Doc( - """ - RegEx pattern for strings. - """ - ), - deprecated( - "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." - ), - ] = None, - discriminator: Annotated[ - Union[str, None], - Doc( - """ - Parameter field name for discriminating the type in a tagged union. - """ - ), - ] = None, - strict: Annotated[ - Union[bool, None], - Doc( - """ - If `True`, strict validation is applied to the field. - """ - ), - ] = _Unset, - multiple_of: Annotated[ - Union[float, None], - Doc( - """ - Value must be a multiple of this. Only applicable to numbers. - """ - ), - ] = _Unset, - allow_inf_nan: Annotated[ - Union[bool, None], - Doc( - """ - Allow `inf`, `-inf`, `nan`. Only applicable to numbers. - """ - ), - ] = _Unset, - max_digits: Annotated[ - Union[int, None], - Doc( - """ - Maximum number of allow digits for strings. - """ - ), - ] = _Unset, - decimal_places: Annotated[ - Union[int, None], - Doc( - """ - Maximum number of decimal places allowed for numbers. - """ - ), - ] = _Unset, - examples: Annotated[ - Optional[List[Any]], - Doc( - """ - Example values for this field. - """ - ), - ] = None, - example: Annotated[ - Optional[Any], - deprecated( - "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " - "although still supported. Use examples instead." - ), - ] = _Unset, - openapi_examples: Annotated[ - Optional[Dict[str, Example]], - Doc( - """ - OpenAPI-specific examples. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Swagger UI (that provides the `/docs` interface) has better support for the - OpenAPI-specific examples than the JSON Schema `examples`, that's the main - use case for this. - - Read more about it in the - [FastAPI docs for Declare Request Example Data](https://fastapi.tiangolo.com/tutorial/schema-extra-example/#using-the-openapi_examples-parameter). - """ - ), - ] = None, - deprecated: Annotated[ - Union[deprecated, str, bool, None], - Doc( - """ - Mark this parameter field as deprecated. - - It will affect the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - include_in_schema: Annotated[ - bool, - Doc( - """ - To include (or not) this parameter field in the generated OpenAPI. - You probably don't need it, but it's available. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = True, - json_schema_extra: Annotated[ - Union[Dict[str, Any], None], - Doc( - """ - Any additional JSON schema data. - """ - ), - ] = None, - **extra: Annotated[ - Any, - Doc( - """ - Include extra fields used by the JSON Schema. - """ - ), - deprecated( - """ - The `extra` kwargs is deprecated. Use `json_schema_extra` instead. - """ - ), - ], -) -> Any: - return params.File( - default=default, - default_factory=default_factory, - media_type=media_type, - alias=alias, - alias_priority=alias_priority, - validation_alias=validation_alias, - serialization_alias=serialization_alias, - title=title, - description=description, - gt=gt, - ge=ge, - lt=lt, - le=le, - min_length=min_length, - max_length=max_length, - pattern=pattern, - regex=regex, - discriminator=discriminator, - strict=strict, - multiple_of=multiple_of, - allow_inf_nan=allow_inf_nan, - max_digits=max_digits, - decimal_places=decimal_places, - example=example, - examples=examples, - openapi_examples=openapi_examples, - deprecated=deprecated, - include_in_schema=include_in_schema, - json_schema_extra=json_schema_extra, - **extra, - ) - - -def Depends( # noqa: N802 - dependency: Annotated[ - Optional[Callable[..., Any]], - Doc( - """ - A "dependable" callable (like a function). - - Don't call it directly, FastAPI will call it for you, just pass the object - directly. - """ - ), - ] = None, - *, - use_cache: Annotated[ - bool, - Doc( - """ - By default, after a dependency is called the first time in a request, if - the dependency is declared again for the rest of the request (for example - if the dependency is needed by several dependencies), the value will be - re-used for the rest of the request. - - Set `use_cache` to `False` to disable this behavior and ensure the - dependency is called again (if declared more than once) in the same request. - """ - ), - ] = True, -) -> Any: - """ - Declare a FastAPI dependency. - - It takes a single "dependable" callable (like a function). - - Don't call it directly, FastAPI will call it for you. - - Read more about it in the - [FastAPI docs for Dependencies](https://fastapi.tiangolo.com/tutorial/dependencies/). - - **Example** - - ```python - from typing import Annotated - - from fastapi import Depends, FastAPI - - app = FastAPI() - - - async def common_parameters(q: str | None = None, skip: int = 0, limit: int = 100): - return {"q": q, "skip": skip, "limit": limit} - - - @app.get("/items/") - async def read_items(commons: Annotated[dict, Depends(common_parameters)]): - return commons - ``` - """ - return params.Depends(dependency=dependency, use_cache=use_cache) - - -def Security( # noqa: N802 - dependency: Annotated[ - Optional[Callable[..., Any]], - Doc( - """ - A "dependable" callable (like a function). - - Don't call it directly, FastAPI will call it for you, just pass the object - directly. - """ - ), - ] = None, - *, - scopes: Annotated[ - Optional[Sequence[str]], - Doc( - """ - OAuth2 scopes required for the *path operation* that uses this Security - dependency. - - The term "scope" comes from the OAuth2 specification, it seems to be - intentionally vague and interpretable. It normally refers to permissions, - in cases to roles. - - These scopes are integrated with OpenAPI (and the API docs at `/docs`). - So they are visible in the OpenAPI specification. - ) - """ - ), - ] = None, - use_cache: Annotated[ - bool, - Doc( - """ - By default, after a dependency is called the first time in a request, if - the dependency is declared again for the rest of the request (for example - if the dependency is needed by several dependencies), the value will be - re-used for the rest of the request. - - Set `use_cache` to `False` to disable this behavior and ensure the - dependency is called again (if declared more than once) in the same request. - """ - ), - ] = True, -) -> Any: - """ - Declare a FastAPI Security dependency. - - The only difference with a regular dependency is that it can declare OAuth2 - scopes that will be integrated with OpenAPI and the automatic UI docs (by default - at `/docs`). - - It takes a single "dependable" callable (like a function). - - Don't call it directly, FastAPI will call it for you. - - Read more about it in the - [FastAPI docs for Security](https://fastapi.tiangolo.com/tutorial/security/) and - in the - [FastAPI docs for OAuth2 scopes](https://fastapi.tiangolo.com/advanced/security/oauth2-scopes/). - - **Example** - - ```python - from typing import Annotated - - from fastapi import Security, FastAPI - - from .db import User - from .security import get_current_active_user - - app = FastAPI() - - @app.get("/users/me/items/") - async def read_own_items( - current_user: Annotated[User, Security(get_current_active_user, scopes=["items"])] - ): - return [{"item_id": "Foo", "owner": current_user.username}] - ``` - """ - return params.Security(dependency=dependency, scopes=scopes, use_cache=use_cache) diff --git a/venv/lib/python3.11/site-packages/fastapi/params.py b/venv/lib/python3.11/site-packages/fastapi/params.py deleted file mode 100644 index 8f5601d..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/params.py +++ /dev/null @@ -1,786 +0,0 @@ -import warnings -from enum import Enum -from typing import Any, Callable, Dict, List, Optional, Sequence, Union - -from fastapi.openapi.models import Example -from pydantic.fields import FieldInfo -from typing_extensions import Annotated, deprecated - -from ._compat import ( - PYDANTIC_V2, - PYDANTIC_VERSION_MINOR_TUPLE, - Undefined, -) - -_Unset: Any = Undefined - - -class ParamTypes(Enum): - query = "query" - header = "header" - path = "path" - cookie = "cookie" - - -class Param(FieldInfo): - in_: ParamTypes - - def __init__( - self, - default: Any = Undefined, - *, - default_factory: Union[Callable[[], Any], None] = _Unset, - annotation: Optional[Any] = None, - alias: Optional[str] = None, - alias_priority: Union[int, None] = _Unset, - # TODO: update when deprecating Pydantic v1, import these types - # validation_alias: str | AliasPath | AliasChoices | None - validation_alias: Union[str, None] = None, - serialization_alias: Union[str, None] = None, - title: Optional[str] = None, - description: Optional[str] = None, - gt: Optional[float] = None, - ge: Optional[float] = None, - lt: Optional[float] = None, - le: Optional[float] = None, - min_length: Optional[int] = None, - max_length: Optional[int] = None, - pattern: Optional[str] = None, - regex: Annotated[ - Optional[str], - deprecated( - "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." - ), - ] = None, - discriminator: Union[str, None] = None, - strict: Union[bool, None] = _Unset, - multiple_of: Union[float, None] = _Unset, - allow_inf_nan: Union[bool, None] = _Unset, - max_digits: Union[int, None] = _Unset, - decimal_places: Union[int, None] = _Unset, - examples: Optional[List[Any]] = None, - example: Annotated[ - Optional[Any], - deprecated( - "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " - "although still supported. Use examples instead." - ), - ] = _Unset, - openapi_examples: Optional[Dict[str, Example]] = None, - deprecated: Union[deprecated, str, bool, None] = None, - include_in_schema: bool = True, - json_schema_extra: Union[Dict[str, Any], None] = None, - **extra: Any, - ): - if example is not _Unset: - warnings.warn( - "`example` has been deprecated, please use `examples` instead", - category=DeprecationWarning, - stacklevel=4, - ) - self.example = example - self.include_in_schema = include_in_schema - self.openapi_examples = openapi_examples - kwargs = dict( - default=default, - default_factory=default_factory, - alias=alias, - title=title, - description=description, - gt=gt, - ge=ge, - lt=lt, - le=le, - min_length=min_length, - max_length=max_length, - discriminator=discriminator, - multiple_of=multiple_of, - allow_inf_nan=allow_inf_nan, - max_digits=max_digits, - decimal_places=decimal_places, - **extra, - ) - if examples is not None: - kwargs["examples"] = examples - if regex is not None: - warnings.warn( - "`regex` has been deprecated, please use `pattern` instead", - category=DeprecationWarning, - stacklevel=4, - ) - current_json_schema_extra = json_schema_extra or extra - if PYDANTIC_VERSION_MINOR_TUPLE < (2, 7): - self.deprecated = deprecated - else: - kwargs["deprecated"] = deprecated - if PYDANTIC_V2: - kwargs.update( - { - "annotation": annotation, - "alias_priority": alias_priority, - "validation_alias": validation_alias, - "serialization_alias": serialization_alias, - "strict": strict, - "json_schema_extra": current_json_schema_extra, - } - ) - kwargs["pattern"] = pattern or regex - else: - kwargs["regex"] = pattern or regex - kwargs.update(**current_json_schema_extra) - use_kwargs = {k: v for k, v in kwargs.items() if v is not _Unset} - - super().__init__(**use_kwargs) - - def __repr__(self) -> str: - return f"{self.__class__.__name__}({self.default})" - - -class Path(Param): - in_ = ParamTypes.path - - def __init__( - self, - default: Any = ..., - *, - default_factory: Union[Callable[[], Any], None] = _Unset, - annotation: Optional[Any] = None, - alias: Optional[str] = None, - alias_priority: Union[int, None] = _Unset, - # TODO: update when deprecating Pydantic v1, import these types - # validation_alias: str | AliasPath | AliasChoices | None - validation_alias: Union[str, None] = None, - serialization_alias: Union[str, None] = None, - title: Optional[str] = None, - description: Optional[str] = None, - gt: Optional[float] = None, - ge: Optional[float] = None, - lt: Optional[float] = None, - le: Optional[float] = None, - min_length: Optional[int] = None, - max_length: Optional[int] = None, - pattern: Optional[str] = None, - regex: Annotated[ - Optional[str], - deprecated( - "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." - ), - ] = None, - discriminator: Union[str, None] = None, - strict: Union[bool, None] = _Unset, - multiple_of: Union[float, None] = _Unset, - allow_inf_nan: Union[bool, None] = _Unset, - max_digits: Union[int, None] = _Unset, - decimal_places: Union[int, None] = _Unset, - examples: Optional[List[Any]] = None, - example: Annotated[ - Optional[Any], - deprecated( - "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " - "although still supported. Use examples instead." - ), - ] = _Unset, - openapi_examples: Optional[Dict[str, Example]] = None, - deprecated: Union[deprecated, str, bool, None] = None, - include_in_schema: bool = True, - json_schema_extra: Union[Dict[str, Any], None] = None, - **extra: Any, - ): - assert default is ..., "Path parameters cannot have a default value" - self.in_ = self.in_ - super().__init__( - default=default, - default_factory=default_factory, - annotation=annotation, - alias=alias, - alias_priority=alias_priority, - validation_alias=validation_alias, - serialization_alias=serialization_alias, - title=title, - description=description, - gt=gt, - ge=ge, - lt=lt, - le=le, - min_length=min_length, - max_length=max_length, - pattern=pattern, - regex=regex, - discriminator=discriminator, - strict=strict, - multiple_of=multiple_of, - allow_inf_nan=allow_inf_nan, - max_digits=max_digits, - decimal_places=decimal_places, - deprecated=deprecated, - example=example, - examples=examples, - openapi_examples=openapi_examples, - include_in_schema=include_in_schema, - json_schema_extra=json_schema_extra, - **extra, - ) - - -class Query(Param): - in_ = ParamTypes.query - - def __init__( - self, - default: Any = Undefined, - *, - default_factory: Union[Callable[[], Any], None] = _Unset, - annotation: Optional[Any] = None, - alias: Optional[str] = None, - alias_priority: Union[int, None] = _Unset, - # TODO: update when deprecating Pydantic v1, import these types - # validation_alias: str | AliasPath | AliasChoices | None - validation_alias: Union[str, None] = None, - serialization_alias: Union[str, None] = None, - title: Optional[str] = None, - description: Optional[str] = None, - gt: Optional[float] = None, - ge: Optional[float] = None, - lt: Optional[float] = None, - le: Optional[float] = None, - min_length: Optional[int] = None, - max_length: Optional[int] = None, - pattern: Optional[str] = None, - regex: Annotated[ - Optional[str], - deprecated( - "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." - ), - ] = None, - discriminator: Union[str, None] = None, - strict: Union[bool, None] = _Unset, - multiple_of: Union[float, None] = _Unset, - allow_inf_nan: Union[bool, None] = _Unset, - max_digits: Union[int, None] = _Unset, - decimal_places: Union[int, None] = _Unset, - examples: Optional[List[Any]] = None, - example: Annotated[ - Optional[Any], - deprecated( - "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " - "although still supported. Use examples instead." - ), - ] = _Unset, - openapi_examples: Optional[Dict[str, Example]] = None, - deprecated: Union[deprecated, str, bool, None] = None, - include_in_schema: bool = True, - json_schema_extra: Union[Dict[str, Any], None] = None, - **extra: Any, - ): - super().__init__( - default=default, - default_factory=default_factory, - annotation=annotation, - alias=alias, - alias_priority=alias_priority, - validation_alias=validation_alias, - serialization_alias=serialization_alias, - title=title, - description=description, - gt=gt, - ge=ge, - lt=lt, - le=le, - min_length=min_length, - max_length=max_length, - pattern=pattern, - regex=regex, - discriminator=discriminator, - strict=strict, - multiple_of=multiple_of, - allow_inf_nan=allow_inf_nan, - max_digits=max_digits, - decimal_places=decimal_places, - deprecated=deprecated, - example=example, - examples=examples, - openapi_examples=openapi_examples, - include_in_schema=include_in_schema, - json_schema_extra=json_schema_extra, - **extra, - ) - - -class Header(Param): - in_ = ParamTypes.header - - def __init__( - self, - default: Any = Undefined, - *, - default_factory: Union[Callable[[], Any], None] = _Unset, - annotation: Optional[Any] = None, - alias: Optional[str] = None, - alias_priority: Union[int, None] = _Unset, - # TODO: update when deprecating Pydantic v1, import these types - # validation_alias: str | AliasPath | AliasChoices | None - validation_alias: Union[str, None] = None, - serialization_alias: Union[str, None] = None, - convert_underscores: bool = True, - title: Optional[str] = None, - description: Optional[str] = None, - gt: Optional[float] = None, - ge: Optional[float] = None, - lt: Optional[float] = None, - le: Optional[float] = None, - min_length: Optional[int] = None, - max_length: Optional[int] = None, - pattern: Optional[str] = None, - regex: Annotated[ - Optional[str], - deprecated( - "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." - ), - ] = None, - discriminator: Union[str, None] = None, - strict: Union[bool, None] = _Unset, - multiple_of: Union[float, None] = _Unset, - allow_inf_nan: Union[bool, None] = _Unset, - max_digits: Union[int, None] = _Unset, - decimal_places: Union[int, None] = _Unset, - examples: Optional[List[Any]] = None, - example: Annotated[ - Optional[Any], - deprecated( - "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " - "although still supported. Use examples instead." - ), - ] = _Unset, - openapi_examples: Optional[Dict[str, Example]] = None, - deprecated: Union[deprecated, str, bool, None] = None, - include_in_schema: bool = True, - json_schema_extra: Union[Dict[str, Any], None] = None, - **extra: Any, - ): - self.convert_underscores = convert_underscores - super().__init__( - default=default, - default_factory=default_factory, - annotation=annotation, - alias=alias, - alias_priority=alias_priority, - validation_alias=validation_alias, - serialization_alias=serialization_alias, - title=title, - description=description, - gt=gt, - ge=ge, - lt=lt, - le=le, - min_length=min_length, - max_length=max_length, - pattern=pattern, - regex=regex, - discriminator=discriminator, - strict=strict, - multiple_of=multiple_of, - allow_inf_nan=allow_inf_nan, - max_digits=max_digits, - decimal_places=decimal_places, - deprecated=deprecated, - example=example, - examples=examples, - openapi_examples=openapi_examples, - include_in_schema=include_in_schema, - json_schema_extra=json_schema_extra, - **extra, - ) - - -class Cookie(Param): - in_ = ParamTypes.cookie - - def __init__( - self, - default: Any = Undefined, - *, - default_factory: Union[Callable[[], Any], None] = _Unset, - annotation: Optional[Any] = None, - alias: Optional[str] = None, - alias_priority: Union[int, None] = _Unset, - # TODO: update when deprecating Pydantic v1, import these types - # validation_alias: str | AliasPath | AliasChoices | None - validation_alias: Union[str, None] = None, - serialization_alias: Union[str, None] = None, - title: Optional[str] = None, - description: Optional[str] = None, - gt: Optional[float] = None, - ge: Optional[float] = None, - lt: Optional[float] = None, - le: Optional[float] = None, - min_length: Optional[int] = None, - max_length: Optional[int] = None, - pattern: Optional[str] = None, - regex: Annotated[ - Optional[str], - deprecated( - "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." - ), - ] = None, - discriminator: Union[str, None] = None, - strict: Union[bool, None] = _Unset, - multiple_of: Union[float, None] = _Unset, - allow_inf_nan: Union[bool, None] = _Unset, - max_digits: Union[int, None] = _Unset, - decimal_places: Union[int, None] = _Unset, - examples: Optional[List[Any]] = None, - example: Annotated[ - Optional[Any], - deprecated( - "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " - "although still supported. Use examples instead." - ), - ] = _Unset, - openapi_examples: Optional[Dict[str, Example]] = None, - deprecated: Union[deprecated, str, bool, None] = None, - include_in_schema: bool = True, - json_schema_extra: Union[Dict[str, Any], None] = None, - **extra: Any, - ): - super().__init__( - default=default, - default_factory=default_factory, - annotation=annotation, - alias=alias, - alias_priority=alias_priority, - validation_alias=validation_alias, - serialization_alias=serialization_alias, - title=title, - description=description, - gt=gt, - ge=ge, - lt=lt, - le=le, - min_length=min_length, - max_length=max_length, - pattern=pattern, - regex=regex, - discriminator=discriminator, - strict=strict, - multiple_of=multiple_of, - allow_inf_nan=allow_inf_nan, - max_digits=max_digits, - decimal_places=decimal_places, - deprecated=deprecated, - example=example, - examples=examples, - openapi_examples=openapi_examples, - include_in_schema=include_in_schema, - json_schema_extra=json_schema_extra, - **extra, - ) - - -class Body(FieldInfo): - def __init__( - self, - default: Any = Undefined, - *, - default_factory: Union[Callable[[], Any], None] = _Unset, - annotation: Optional[Any] = None, - embed: Union[bool, None] = None, - media_type: str = "application/json", - alias: Optional[str] = None, - alias_priority: Union[int, None] = _Unset, - # TODO: update when deprecating Pydantic v1, import these types - # validation_alias: str | AliasPath | AliasChoices | None - validation_alias: Union[str, None] = None, - serialization_alias: Union[str, None] = None, - title: Optional[str] = None, - description: Optional[str] = None, - gt: Optional[float] = None, - ge: Optional[float] = None, - lt: Optional[float] = None, - le: Optional[float] = None, - min_length: Optional[int] = None, - max_length: Optional[int] = None, - pattern: Optional[str] = None, - regex: Annotated[ - Optional[str], - deprecated( - "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." - ), - ] = None, - discriminator: Union[str, None] = None, - strict: Union[bool, None] = _Unset, - multiple_of: Union[float, None] = _Unset, - allow_inf_nan: Union[bool, None] = _Unset, - max_digits: Union[int, None] = _Unset, - decimal_places: Union[int, None] = _Unset, - examples: Optional[List[Any]] = None, - example: Annotated[ - Optional[Any], - deprecated( - "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " - "although still supported. Use examples instead." - ), - ] = _Unset, - openapi_examples: Optional[Dict[str, Example]] = None, - deprecated: Union[deprecated, str, bool, None] = None, - include_in_schema: bool = True, - json_schema_extra: Union[Dict[str, Any], None] = None, - **extra: Any, - ): - self.embed = embed - self.media_type = media_type - if example is not _Unset: - warnings.warn( - "`example` has been deprecated, please use `examples` instead", - category=DeprecationWarning, - stacklevel=4, - ) - self.example = example - self.include_in_schema = include_in_schema - self.openapi_examples = openapi_examples - kwargs = dict( - default=default, - default_factory=default_factory, - alias=alias, - title=title, - description=description, - gt=gt, - ge=ge, - lt=lt, - le=le, - min_length=min_length, - max_length=max_length, - discriminator=discriminator, - multiple_of=multiple_of, - allow_inf_nan=allow_inf_nan, - max_digits=max_digits, - decimal_places=decimal_places, - **extra, - ) - if examples is not None: - kwargs["examples"] = examples - if regex is not None: - warnings.warn( - "`regex` has been deprecated, please use `pattern` instead", - category=DeprecationWarning, - stacklevel=4, - ) - current_json_schema_extra = json_schema_extra or extra - if PYDANTIC_VERSION_MINOR_TUPLE < (2, 7): - self.deprecated = deprecated - else: - kwargs["deprecated"] = deprecated - if PYDANTIC_V2: - kwargs.update( - { - "annotation": annotation, - "alias_priority": alias_priority, - "validation_alias": validation_alias, - "serialization_alias": serialization_alias, - "strict": strict, - "json_schema_extra": current_json_schema_extra, - } - ) - kwargs["pattern"] = pattern or regex - else: - kwargs["regex"] = pattern or regex - kwargs.update(**current_json_schema_extra) - - use_kwargs = {k: v for k, v in kwargs.items() if v is not _Unset} - - super().__init__(**use_kwargs) - - def __repr__(self) -> str: - return f"{self.__class__.__name__}({self.default})" - - -class Form(Body): - def __init__( - self, - default: Any = Undefined, - *, - default_factory: Union[Callable[[], Any], None] = _Unset, - annotation: Optional[Any] = None, - media_type: str = "application/x-www-form-urlencoded", - alias: Optional[str] = None, - alias_priority: Union[int, None] = _Unset, - # TODO: update when deprecating Pydantic v1, import these types - # validation_alias: str | AliasPath | AliasChoices | None - validation_alias: Union[str, None] = None, - serialization_alias: Union[str, None] = None, - title: Optional[str] = None, - description: Optional[str] = None, - gt: Optional[float] = None, - ge: Optional[float] = None, - lt: Optional[float] = None, - le: Optional[float] = None, - min_length: Optional[int] = None, - max_length: Optional[int] = None, - pattern: Optional[str] = None, - regex: Annotated[ - Optional[str], - deprecated( - "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." - ), - ] = None, - discriminator: Union[str, None] = None, - strict: Union[bool, None] = _Unset, - multiple_of: Union[float, None] = _Unset, - allow_inf_nan: Union[bool, None] = _Unset, - max_digits: Union[int, None] = _Unset, - decimal_places: Union[int, None] = _Unset, - examples: Optional[List[Any]] = None, - example: Annotated[ - Optional[Any], - deprecated( - "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " - "although still supported. Use examples instead." - ), - ] = _Unset, - openapi_examples: Optional[Dict[str, Example]] = None, - deprecated: Union[deprecated, str, bool, None] = None, - include_in_schema: bool = True, - json_schema_extra: Union[Dict[str, Any], None] = None, - **extra: Any, - ): - super().__init__( - default=default, - default_factory=default_factory, - annotation=annotation, - media_type=media_type, - alias=alias, - alias_priority=alias_priority, - validation_alias=validation_alias, - serialization_alias=serialization_alias, - title=title, - description=description, - gt=gt, - ge=ge, - lt=lt, - le=le, - min_length=min_length, - max_length=max_length, - pattern=pattern, - regex=regex, - discriminator=discriminator, - strict=strict, - multiple_of=multiple_of, - allow_inf_nan=allow_inf_nan, - max_digits=max_digits, - decimal_places=decimal_places, - deprecated=deprecated, - example=example, - examples=examples, - openapi_examples=openapi_examples, - include_in_schema=include_in_schema, - json_schema_extra=json_schema_extra, - **extra, - ) - - -class File(Form): - def __init__( - self, - default: Any = Undefined, - *, - default_factory: Union[Callable[[], Any], None] = _Unset, - annotation: Optional[Any] = None, - media_type: str = "multipart/form-data", - alias: Optional[str] = None, - alias_priority: Union[int, None] = _Unset, - # TODO: update when deprecating Pydantic v1, import these types - # validation_alias: str | AliasPath | AliasChoices | None - validation_alias: Union[str, None] = None, - serialization_alias: Union[str, None] = None, - title: Optional[str] = None, - description: Optional[str] = None, - gt: Optional[float] = None, - ge: Optional[float] = None, - lt: Optional[float] = None, - le: Optional[float] = None, - min_length: Optional[int] = None, - max_length: Optional[int] = None, - pattern: Optional[str] = None, - regex: Annotated[ - Optional[str], - deprecated( - "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." - ), - ] = None, - discriminator: Union[str, None] = None, - strict: Union[bool, None] = _Unset, - multiple_of: Union[float, None] = _Unset, - allow_inf_nan: Union[bool, None] = _Unset, - max_digits: Union[int, None] = _Unset, - decimal_places: Union[int, None] = _Unset, - examples: Optional[List[Any]] = None, - example: Annotated[ - Optional[Any], - deprecated( - "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " - "although still supported. Use examples instead." - ), - ] = _Unset, - openapi_examples: Optional[Dict[str, Example]] = None, - deprecated: Union[deprecated, str, bool, None] = None, - include_in_schema: bool = True, - json_schema_extra: Union[Dict[str, Any], None] = None, - **extra: Any, - ): - super().__init__( - default=default, - default_factory=default_factory, - annotation=annotation, - media_type=media_type, - alias=alias, - alias_priority=alias_priority, - validation_alias=validation_alias, - serialization_alias=serialization_alias, - title=title, - description=description, - gt=gt, - ge=ge, - lt=lt, - le=le, - min_length=min_length, - max_length=max_length, - pattern=pattern, - regex=regex, - discriminator=discriminator, - strict=strict, - multiple_of=multiple_of, - allow_inf_nan=allow_inf_nan, - max_digits=max_digits, - decimal_places=decimal_places, - deprecated=deprecated, - example=example, - examples=examples, - openapi_examples=openapi_examples, - include_in_schema=include_in_schema, - json_schema_extra=json_schema_extra, - **extra, - ) - - -class Depends: - def __init__( - self, dependency: Optional[Callable[..., Any]] = None, *, use_cache: bool = True - ): - self.dependency = dependency - self.use_cache = use_cache - - def __repr__(self) -> str: - attr = getattr(self.dependency, "__name__", type(self.dependency).__name__) - cache = "" if self.use_cache else ", use_cache=False" - return f"{self.__class__.__name__}({attr}{cache})" - - -class Security(Depends): - def __init__( - self, - dependency: Optional[Callable[..., Any]] = None, - *, - scopes: Optional[Sequence[str]] = None, - use_cache: bool = True, - ): - super().__init__(dependency=dependency, use_cache=use_cache) - self.scopes = scopes or [] diff --git a/venv/lib/python3.11/site-packages/fastapi/py.typed b/venv/lib/python3.11/site-packages/fastapi/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/fastapi/requests.py b/venv/lib/python3.11/site-packages/fastapi/requests.py deleted file mode 100644 index d16552c..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/requests.py +++ /dev/null @@ -1,2 +0,0 @@ -from starlette.requests import HTTPConnection as HTTPConnection # noqa: F401 -from starlette.requests import Request as Request # noqa: F401 diff --git a/venv/lib/python3.11/site-packages/fastapi/responses.py b/venv/lib/python3.11/site-packages/fastapi/responses.py deleted file mode 100644 index 6c8db6f..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/responses.py +++ /dev/null @@ -1,48 +0,0 @@ -from typing import Any - -from starlette.responses import FileResponse as FileResponse # noqa -from starlette.responses import HTMLResponse as HTMLResponse # noqa -from starlette.responses import JSONResponse as JSONResponse # noqa -from starlette.responses import PlainTextResponse as PlainTextResponse # noqa -from starlette.responses import RedirectResponse as RedirectResponse # noqa -from starlette.responses import Response as Response # noqa -from starlette.responses import StreamingResponse as StreamingResponse # noqa - -try: - import ujson -except ImportError: # pragma: nocover - ujson = None # type: ignore - - -try: - import orjson -except ImportError: # pragma: nocover - orjson = None # type: ignore - - -class UJSONResponse(JSONResponse): - """ - JSON response using the high-performance ujson library to serialize data to JSON. - - Read more about it in the - [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/). - """ - - def render(self, content: Any) -> bytes: - assert ujson is not None, "ujson must be installed to use UJSONResponse" - return ujson.dumps(content, ensure_ascii=False).encode("utf-8") - - -class ORJSONResponse(JSONResponse): - """ - JSON response using the high-performance orjson library to serialize data to JSON. - - Read more about it in the - [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/). - """ - - def render(self, content: Any) -> bytes: - assert orjson is not None, "orjson must be installed to use ORJSONResponse" - return orjson.dumps( - content, option=orjson.OPT_NON_STR_KEYS | orjson.OPT_SERIALIZE_NUMPY - ) diff --git a/venv/lib/python3.11/site-packages/fastapi/routing.py b/venv/lib/python3.11/site-packages/fastapi/routing.py deleted file mode 100644 index 457481e..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/routing.py +++ /dev/null @@ -1,4439 +0,0 @@ -import asyncio -import dataclasses -import email.message -import inspect -import json -from contextlib import AsyncExitStack, asynccontextmanager -from enum import Enum, IntEnum -from typing import ( - Any, - AsyncIterator, - Callable, - Coroutine, - Dict, - List, - Mapping, - Optional, - Sequence, - Set, - Tuple, - Type, - Union, -) - -from fastapi import params -from fastapi._compat import ( - ModelField, - Undefined, - _get_model_config, - _model_dump, - _normalize_errors, - lenient_issubclass, -) -from fastapi.datastructures import Default, DefaultPlaceholder -from fastapi.dependencies.models import Dependant -from fastapi.dependencies.utils import ( - _should_embed_body_fields, - get_body_field, - get_dependant, - get_flat_dependant, - get_parameterless_sub_dependant, - get_typed_return_annotation, - solve_dependencies, -) -from fastapi.encoders import jsonable_encoder -from fastapi.exceptions import ( - FastAPIError, - RequestValidationError, - ResponseValidationError, - WebSocketRequestValidationError, -) -from fastapi.types import DecoratedCallable, IncEx -from fastapi.utils import ( - create_cloned_field, - create_model_field, - generate_unique_id, - get_value_or_default, - is_body_allowed_for_status_code, -) -from pydantic import BaseModel -from starlette import routing -from starlette.concurrency import run_in_threadpool -from starlette.exceptions import HTTPException -from starlette.requests import Request -from starlette.responses import JSONResponse, Response -from starlette.routing import ( - BaseRoute, - Match, - compile_path, - get_name, - request_response, - websocket_session, -) -from starlette.routing import Mount as Mount # noqa -from starlette.types import AppType, ASGIApp, Lifespan, Scope -from starlette.websockets import WebSocket -from typing_extensions import Annotated, Doc, deprecated - - -def _prepare_response_content( - res: Any, - *, - exclude_unset: bool, - exclude_defaults: bool = False, - exclude_none: bool = False, -) -> Any: - if isinstance(res, BaseModel): - read_with_orm_mode = getattr(_get_model_config(res), "read_with_orm_mode", None) - if read_with_orm_mode: - # Let from_orm extract the data from this model instead of converting - # it now to a dict. - # Otherwise, there's no way to extract lazy data that requires attribute - # access instead of dict iteration, e.g. lazy relationships. - return res - return _model_dump( - res, - by_alias=True, - exclude_unset=exclude_unset, - exclude_defaults=exclude_defaults, - exclude_none=exclude_none, - ) - elif isinstance(res, list): - return [ - _prepare_response_content( - item, - exclude_unset=exclude_unset, - exclude_defaults=exclude_defaults, - exclude_none=exclude_none, - ) - for item in res - ] - elif isinstance(res, dict): - return { - k: _prepare_response_content( - v, - exclude_unset=exclude_unset, - exclude_defaults=exclude_defaults, - exclude_none=exclude_none, - ) - for k, v in res.items() - } - elif dataclasses.is_dataclass(res): - return dataclasses.asdict(res) - return res - - -def _merge_lifespan_context( - original_context: Lifespan[Any], nested_context: Lifespan[Any] -) -> Lifespan[Any]: - @asynccontextmanager - async def merged_lifespan( - app: AppType, - ) -> AsyncIterator[Optional[Mapping[str, Any]]]: - async with original_context(app) as maybe_original_state: - async with nested_context(app) as maybe_nested_state: - if maybe_nested_state is None and maybe_original_state is None: - yield None # old ASGI compatibility - else: - yield {**(maybe_nested_state or {}), **(maybe_original_state or {})} - - return merged_lifespan # type: ignore[return-value] - - -async def serialize_response( - *, - field: Optional[ModelField] = None, - response_content: Any, - include: Optional[IncEx] = None, - exclude: Optional[IncEx] = None, - by_alias: bool = True, - exclude_unset: bool = False, - exclude_defaults: bool = False, - exclude_none: bool = False, - is_coroutine: bool = True, -) -> Any: - if field: - errors = [] - if not hasattr(field, "serialize"): - # pydantic v1 - response_content = _prepare_response_content( - response_content, - exclude_unset=exclude_unset, - exclude_defaults=exclude_defaults, - exclude_none=exclude_none, - ) - if is_coroutine: - value, errors_ = field.validate(response_content, {}, loc=("response",)) - else: - value, errors_ = await run_in_threadpool( - field.validate, response_content, {}, loc=("response",) - ) - if isinstance(errors_, list): - errors.extend(errors_) - elif errors_: - errors.append(errors_) - if errors: - raise ResponseValidationError( - errors=_normalize_errors(errors), body=response_content - ) - - if hasattr(field, "serialize"): - return field.serialize( - value, - include=include, - exclude=exclude, - by_alias=by_alias, - exclude_unset=exclude_unset, - exclude_defaults=exclude_defaults, - exclude_none=exclude_none, - ) - - return jsonable_encoder( - value, - include=include, - exclude=exclude, - by_alias=by_alias, - exclude_unset=exclude_unset, - exclude_defaults=exclude_defaults, - exclude_none=exclude_none, - ) - else: - return jsonable_encoder(response_content) - - -async def run_endpoint_function( - *, dependant: Dependant, values: Dict[str, Any], is_coroutine: bool -) -> Any: - # Only called by get_request_handler. Has been split into its own function to - # facilitate profiling endpoints, since inner functions are harder to profile. - assert dependant.call is not None, "dependant.call must be a function" - - if is_coroutine: - return await dependant.call(**values) - else: - return await run_in_threadpool(dependant.call, **values) - - -def get_request_handler( - dependant: Dependant, - body_field: Optional[ModelField] = None, - status_code: Optional[int] = None, - response_class: Union[Type[Response], DefaultPlaceholder] = Default(JSONResponse), - response_field: Optional[ModelField] = None, - response_model_include: Optional[IncEx] = None, - response_model_exclude: Optional[IncEx] = None, - response_model_by_alias: bool = True, - response_model_exclude_unset: bool = False, - response_model_exclude_defaults: bool = False, - response_model_exclude_none: bool = False, - dependency_overrides_provider: Optional[Any] = None, - embed_body_fields: bool = False, -) -> Callable[[Request], Coroutine[Any, Any, Response]]: - assert dependant.call is not None, "dependant.call must be a function" - is_coroutine = asyncio.iscoroutinefunction(dependant.call) - is_body_form = body_field and isinstance(body_field.field_info, params.Form) - if isinstance(response_class, DefaultPlaceholder): - actual_response_class: Type[Response] = response_class.value - else: - actual_response_class = response_class - - async def app(request: Request) -> Response: - response: Union[Response, None] = None - async with AsyncExitStack() as file_stack: - try: - body: Any = None - if body_field: - if is_body_form: - body = await request.form() - file_stack.push_async_callback(body.close) - else: - body_bytes = await request.body() - if body_bytes: - json_body: Any = Undefined - content_type_value = request.headers.get("content-type") - if not content_type_value: - json_body = await request.json() - else: - message = email.message.Message() - message["content-type"] = content_type_value - if message.get_content_maintype() == "application": - subtype = message.get_content_subtype() - if subtype == "json" or subtype.endswith("+json"): - json_body = await request.json() - if json_body != Undefined: - body = json_body - else: - body = body_bytes - except json.JSONDecodeError as e: - validation_error = RequestValidationError( - [ - { - "type": "json_invalid", - "loc": ("body", e.pos), - "msg": "JSON decode error", - "input": {}, - "ctx": {"error": e.msg}, - } - ], - body=e.doc, - ) - raise validation_error from e - except HTTPException: - # If a middleware raises an HTTPException, it should be raised again - raise - except Exception as e: - http_error = HTTPException( - status_code=400, detail="There was an error parsing the body" - ) - raise http_error from e - errors: List[Any] = [] - async with AsyncExitStack() as async_exit_stack: - solved_result = await solve_dependencies( - request=request, - dependant=dependant, - body=body, - dependency_overrides_provider=dependency_overrides_provider, - async_exit_stack=async_exit_stack, - embed_body_fields=embed_body_fields, - ) - errors = solved_result.errors - if not errors: - raw_response = await run_endpoint_function( - dependant=dependant, - values=solved_result.values, - is_coroutine=is_coroutine, - ) - if isinstance(raw_response, Response): - if raw_response.background is None: - raw_response.background = solved_result.background_tasks - response = raw_response - else: - response_args: Dict[str, Any] = { - "background": solved_result.background_tasks - } - # If status_code was set, use it, otherwise use the default from the - # response class, in the case of redirect it's 307 - current_status_code = ( - status_code - if status_code - else solved_result.response.status_code - ) - if current_status_code is not None: - response_args["status_code"] = current_status_code - if solved_result.response.status_code: - response_args["status_code"] = ( - solved_result.response.status_code - ) - content = await serialize_response( - field=response_field, - response_content=raw_response, - include=response_model_include, - exclude=response_model_exclude, - by_alias=response_model_by_alias, - exclude_unset=response_model_exclude_unset, - exclude_defaults=response_model_exclude_defaults, - exclude_none=response_model_exclude_none, - is_coroutine=is_coroutine, - ) - response = actual_response_class(content, **response_args) - if not is_body_allowed_for_status_code(response.status_code): - response.body = b"" - response.headers.raw.extend(solved_result.response.headers.raw) - if errors: - validation_error = RequestValidationError( - _normalize_errors(errors), body=body - ) - raise validation_error - if response is None: - raise FastAPIError( - "No response object was returned. There's a high chance that the " - "application code is raising an exception and a dependency with yield " - "has a block with a bare except, or a block with except Exception, " - "and is not raising the exception again. Read more about it in the " - "docs: https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-with-yield/#dependencies-with-yield-and-except" - ) - return response - - return app - - -def get_websocket_app( - dependant: Dependant, - dependency_overrides_provider: Optional[Any] = None, - embed_body_fields: bool = False, -) -> Callable[[WebSocket], Coroutine[Any, Any, Any]]: - async def app(websocket: WebSocket) -> None: - async with AsyncExitStack() as async_exit_stack: - # TODO: remove this scope later, after a few releases - # This scope fastapi_astack is no longer used by FastAPI, kept for - # compatibility, just in case - websocket.scope["fastapi_astack"] = async_exit_stack - solved_result = await solve_dependencies( - request=websocket, - dependant=dependant, - dependency_overrides_provider=dependency_overrides_provider, - async_exit_stack=async_exit_stack, - embed_body_fields=embed_body_fields, - ) - if solved_result.errors: - raise WebSocketRequestValidationError( - _normalize_errors(solved_result.errors) - ) - assert dependant.call is not None, "dependant.call must be a function" - await dependant.call(**solved_result.values) - - return app - - -class APIWebSocketRoute(routing.WebSocketRoute): - def __init__( - self, - path: str, - endpoint: Callable[..., Any], - *, - name: Optional[str] = None, - dependencies: Optional[Sequence[params.Depends]] = None, - dependency_overrides_provider: Optional[Any] = None, - ) -> None: - self.path = path - self.endpoint = endpoint - self.name = get_name(endpoint) if name is None else name - self.dependencies = list(dependencies or []) - self.path_regex, self.path_format, self.param_convertors = compile_path(path) - self.dependant = get_dependant(path=self.path_format, call=self.endpoint) - for depends in self.dependencies[::-1]: - self.dependant.dependencies.insert( - 0, - get_parameterless_sub_dependant(depends=depends, path=self.path_format), - ) - self._flat_dependant = get_flat_dependant(self.dependant) - self._embed_body_fields = _should_embed_body_fields( - self._flat_dependant.body_params - ) - self.app = websocket_session( - get_websocket_app( - dependant=self.dependant, - dependency_overrides_provider=dependency_overrides_provider, - embed_body_fields=self._embed_body_fields, - ) - ) - - def matches(self, scope: Scope) -> Tuple[Match, Scope]: - match, child_scope = super().matches(scope) - if match != Match.NONE: - child_scope["route"] = self - return match, child_scope - - -class APIRoute(routing.Route): - def __init__( - self, - path: str, - endpoint: Callable[..., Any], - *, - response_model: Any = Default(None), - status_code: Optional[int] = None, - tags: Optional[List[Union[str, Enum]]] = None, - dependencies: Optional[Sequence[params.Depends]] = None, - summary: Optional[str] = None, - description: Optional[str] = None, - response_description: str = "Successful Response", - responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None, - deprecated: Optional[bool] = None, - name: Optional[str] = None, - methods: Optional[Union[Set[str], List[str]]] = None, - operation_id: Optional[str] = None, - response_model_include: Optional[IncEx] = None, - response_model_exclude: Optional[IncEx] = None, - response_model_by_alias: bool = True, - response_model_exclude_unset: bool = False, - response_model_exclude_defaults: bool = False, - response_model_exclude_none: bool = False, - include_in_schema: bool = True, - response_class: Union[Type[Response], DefaultPlaceholder] = Default( - JSONResponse - ), - dependency_overrides_provider: Optional[Any] = None, - callbacks: Optional[List[BaseRoute]] = None, - openapi_extra: Optional[Dict[str, Any]] = None, - generate_unique_id_function: Union[ - Callable[["APIRoute"], str], DefaultPlaceholder - ] = Default(generate_unique_id), - ) -> None: - self.path = path - self.endpoint = endpoint - if isinstance(response_model, DefaultPlaceholder): - return_annotation = get_typed_return_annotation(endpoint) - if lenient_issubclass(return_annotation, Response): - response_model = None - else: - response_model = return_annotation - self.response_model = response_model - self.summary = summary - self.response_description = response_description - self.deprecated = deprecated - self.operation_id = operation_id - self.response_model_include = response_model_include - self.response_model_exclude = response_model_exclude - self.response_model_by_alias = response_model_by_alias - self.response_model_exclude_unset = response_model_exclude_unset - self.response_model_exclude_defaults = response_model_exclude_defaults - self.response_model_exclude_none = response_model_exclude_none - self.include_in_schema = include_in_schema - self.response_class = response_class - self.dependency_overrides_provider = dependency_overrides_provider - self.callbacks = callbacks - self.openapi_extra = openapi_extra - self.generate_unique_id_function = generate_unique_id_function - self.tags = tags or [] - self.responses = responses or {} - self.name = get_name(endpoint) if name is None else name - self.path_regex, self.path_format, self.param_convertors = compile_path(path) - if methods is None: - methods = ["GET"] - self.methods: Set[str] = {method.upper() for method in methods} - if isinstance(generate_unique_id_function, DefaultPlaceholder): - current_generate_unique_id: Callable[[APIRoute], str] = ( - generate_unique_id_function.value - ) - else: - current_generate_unique_id = generate_unique_id_function - self.unique_id = self.operation_id or current_generate_unique_id(self) - # normalize enums e.g. http.HTTPStatus - if isinstance(status_code, IntEnum): - status_code = int(status_code) - self.status_code = status_code - if self.response_model: - assert is_body_allowed_for_status_code(status_code), ( - f"Status code {status_code} must not have a response body" - ) - response_name = "Response_" + self.unique_id - self.response_field = create_model_field( - name=response_name, - type_=self.response_model, - mode="serialization", - ) - # Create a clone of the field, so that a Pydantic submodel is not returned - # as is just because it's an instance of a subclass of a more limited class - # e.g. UserInDB (containing hashed_password) could be a subclass of User - # that doesn't have the hashed_password. But because it's a subclass, it - # would pass the validation and be returned as is. - # By being a new field, no inheritance will be passed as is. A new model - # will always be created. - # TODO: remove when deprecating Pydantic v1 - self.secure_cloned_response_field: Optional[ModelField] = ( - create_cloned_field(self.response_field) - ) - else: - self.response_field = None # type: ignore - self.secure_cloned_response_field = None - self.dependencies = list(dependencies or []) - self.description = description or inspect.cleandoc(self.endpoint.__doc__ or "") - # if a "form feed" character (page break) is found in the description text, - # truncate description text to the content preceding the first "form feed" - self.description = self.description.split("\f")[0].strip() - response_fields = {} - for additional_status_code, response in self.responses.items(): - assert isinstance(response, dict), "An additional response must be a dict" - model = response.get("model") - if model: - assert is_body_allowed_for_status_code(additional_status_code), ( - f"Status code {additional_status_code} must not have a response body" - ) - response_name = f"Response_{additional_status_code}_{self.unique_id}" - response_field = create_model_field( - name=response_name, type_=model, mode="serialization" - ) - response_fields[additional_status_code] = response_field - if response_fields: - self.response_fields: Dict[Union[int, str], ModelField] = response_fields - else: - self.response_fields = {} - - assert callable(endpoint), "An endpoint must be a callable" - self.dependant = get_dependant(path=self.path_format, call=self.endpoint) - for depends in self.dependencies[::-1]: - self.dependant.dependencies.insert( - 0, - get_parameterless_sub_dependant(depends=depends, path=self.path_format), - ) - self._flat_dependant = get_flat_dependant(self.dependant) - self._embed_body_fields = _should_embed_body_fields( - self._flat_dependant.body_params - ) - self.body_field = get_body_field( - flat_dependant=self._flat_dependant, - name=self.unique_id, - embed_body_fields=self._embed_body_fields, - ) - self.app = request_response(self.get_route_handler()) - - def get_route_handler(self) -> Callable[[Request], Coroutine[Any, Any, Response]]: - return get_request_handler( - dependant=self.dependant, - body_field=self.body_field, - status_code=self.status_code, - response_class=self.response_class, - response_field=self.secure_cloned_response_field, - response_model_include=self.response_model_include, - response_model_exclude=self.response_model_exclude, - response_model_by_alias=self.response_model_by_alias, - response_model_exclude_unset=self.response_model_exclude_unset, - response_model_exclude_defaults=self.response_model_exclude_defaults, - response_model_exclude_none=self.response_model_exclude_none, - dependency_overrides_provider=self.dependency_overrides_provider, - embed_body_fields=self._embed_body_fields, - ) - - def matches(self, scope: Scope) -> Tuple[Match, Scope]: - match, child_scope = super().matches(scope) - if match != Match.NONE: - child_scope["route"] = self - return match, child_scope - - -class APIRouter(routing.Router): - """ - `APIRouter` class, used to group *path operations*, for example to structure - an app in multiple files. It would then be included in the `FastAPI` app, or - in another `APIRouter` (ultimately included in the app). - - Read more about it in the - [FastAPI docs for Bigger Applications - Multiple Files](https://fastapi.tiangolo.com/tutorial/bigger-applications/). - - ## Example - - ```python - from fastapi import APIRouter, FastAPI - - app = FastAPI() - router = APIRouter() - - - @router.get("/users/", tags=["users"]) - async def read_users(): - return [{"username": "Rick"}, {"username": "Morty"}] - - - app.include_router(router) - ``` - """ - - def __init__( - self, - *, - prefix: Annotated[str, Doc("An optional path prefix for the router.")] = "", - tags: Annotated[ - Optional[List[Union[str, Enum]]], - Doc( - """ - A list of tags to be applied to all the *path operations* in this - router. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - dependencies: Annotated[ - Optional[Sequence[params.Depends]], - Doc( - """ - A list of dependencies (using `Depends()`) to be applied to all the - *path operations* in this router. - - Read more about it in the - [FastAPI docs for Bigger Applications - Multiple Files](https://fastapi.tiangolo.com/tutorial/bigger-applications/#include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies). - """ - ), - ] = None, - default_response_class: Annotated[ - Type[Response], - Doc( - """ - The default response class to be used. - - Read more in the - [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#default-response-class). - """ - ), - ] = Default(JSONResponse), - responses: Annotated[ - Optional[Dict[Union[int, str], Dict[str, Any]]], - Doc( - """ - Additional responses to be shown in OpenAPI. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Additional Responses in OpenAPI](https://fastapi.tiangolo.com/advanced/additional-responses/). - - And in the - [FastAPI docs for Bigger Applications](https://fastapi.tiangolo.com/tutorial/bigger-applications/#include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies). - """ - ), - ] = None, - callbacks: Annotated[ - Optional[List[BaseRoute]], - Doc( - """ - OpenAPI callbacks that should apply to all *path operations* in this - router. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). - """ - ), - ] = None, - routes: Annotated[ - Optional[List[BaseRoute]], - Doc( - """ - **Note**: you probably shouldn't use this parameter, it is inherited - from Starlette and supported for compatibility. - - --- - - A list of routes to serve incoming HTTP and WebSocket requests. - """ - ), - deprecated( - """ - You normally wouldn't use this parameter with FastAPI, it is inherited - from Starlette and supported for compatibility. - - In FastAPI, you normally would use the *path operation methods*, - like `router.get()`, `router.post()`, etc. - """ - ), - ] = None, - redirect_slashes: Annotated[ - bool, - Doc( - """ - Whether to detect and redirect slashes in URLs when the client doesn't - use the same format. - """ - ), - ] = True, - default: Annotated[ - Optional[ASGIApp], - Doc( - """ - Default function handler for this router. Used to handle - 404 Not Found errors. - """ - ), - ] = None, - dependency_overrides_provider: Annotated[ - Optional[Any], - Doc( - """ - Only used internally by FastAPI to handle dependency overrides. - - You shouldn't need to use it. It normally points to the `FastAPI` app - object. - """ - ), - ] = None, - route_class: Annotated[ - Type[APIRoute], - Doc( - """ - Custom route (*path operation*) class to be used by this router. - - Read more about it in the - [FastAPI docs for Custom Request and APIRoute class](https://fastapi.tiangolo.com/how-to/custom-request-and-route/#custom-apiroute-class-in-a-router). - """ - ), - ] = APIRoute, - on_startup: Annotated[ - Optional[Sequence[Callable[[], Any]]], - Doc( - """ - A list of startup event handler functions. - - You should instead use the `lifespan` handlers. - - Read more in the [FastAPI docs for `lifespan`](https://fastapi.tiangolo.com/advanced/events/). - """ - ), - ] = None, - on_shutdown: Annotated[ - Optional[Sequence[Callable[[], Any]]], - Doc( - """ - A list of shutdown event handler functions. - - You should instead use the `lifespan` handlers. - - Read more in the - [FastAPI docs for `lifespan`](https://fastapi.tiangolo.com/advanced/events/). - """ - ), - ] = None, - # the generic to Lifespan[AppType] is the type of the top level application - # which the router cannot know statically, so we use typing.Any - lifespan: Annotated[ - Optional[Lifespan[Any]], - Doc( - """ - A `Lifespan` context manager handler. This replaces `startup` and - `shutdown` functions with a single context manager. - - Read more in the - [FastAPI docs for `lifespan`](https://fastapi.tiangolo.com/advanced/events/). - """ - ), - ] = None, - deprecated: Annotated[ - Optional[bool], - Doc( - """ - Mark all *path operations* in this router as deprecated. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - include_in_schema: Annotated[ - bool, - Doc( - """ - To include (or not) all the *path operations* in this router in the - generated OpenAPI. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). - """ - ), - ] = True, - generate_unique_id_function: Annotated[ - Callable[[APIRoute], str], - Doc( - """ - Customize the function used to generate unique IDs for the *path - operations* shown in the generated OpenAPI. - - This is particularly useful when automatically generating clients or - SDKs for your API. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = Default(generate_unique_id), - ) -> None: - super().__init__( - routes=routes, - redirect_slashes=redirect_slashes, - default=default, - on_startup=on_startup, - on_shutdown=on_shutdown, - lifespan=lifespan, - ) - if prefix: - assert prefix.startswith("/"), "A path prefix must start with '/'" - assert not prefix.endswith("/"), ( - "A path prefix must not end with '/', as the routes will start with '/'" - ) - self.prefix = prefix - self.tags: List[Union[str, Enum]] = tags or [] - self.dependencies = list(dependencies or []) - self.deprecated = deprecated - self.include_in_schema = include_in_schema - self.responses = responses or {} - self.callbacks = callbacks or [] - self.dependency_overrides_provider = dependency_overrides_provider - self.route_class = route_class - self.default_response_class = default_response_class - self.generate_unique_id_function = generate_unique_id_function - - def route( - self, - path: str, - methods: Optional[List[str]] = None, - name: Optional[str] = None, - include_in_schema: bool = True, - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - def decorator(func: DecoratedCallable) -> DecoratedCallable: - self.add_route( - path, - func, - methods=methods, - name=name, - include_in_schema=include_in_schema, - ) - return func - - return decorator - - def add_api_route( - self, - path: str, - endpoint: Callable[..., Any], - *, - response_model: Any = Default(None), - status_code: Optional[int] = None, - tags: Optional[List[Union[str, Enum]]] = None, - dependencies: Optional[Sequence[params.Depends]] = None, - summary: Optional[str] = None, - description: Optional[str] = None, - response_description: str = "Successful Response", - responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None, - deprecated: Optional[bool] = None, - methods: Optional[Union[Set[str], List[str]]] = None, - operation_id: Optional[str] = None, - response_model_include: Optional[IncEx] = None, - response_model_exclude: Optional[IncEx] = None, - response_model_by_alias: bool = True, - response_model_exclude_unset: bool = False, - response_model_exclude_defaults: bool = False, - response_model_exclude_none: bool = False, - include_in_schema: bool = True, - response_class: Union[Type[Response], DefaultPlaceholder] = Default( - JSONResponse - ), - name: Optional[str] = None, - route_class_override: Optional[Type[APIRoute]] = None, - callbacks: Optional[List[BaseRoute]] = None, - openapi_extra: Optional[Dict[str, Any]] = None, - generate_unique_id_function: Union[ - Callable[[APIRoute], str], DefaultPlaceholder - ] = Default(generate_unique_id), - ) -> None: - route_class = route_class_override or self.route_class - responses = responses or {} - combined_responses = {**self.responses, **responses} - current_response_class = get_value_or_default( - response_class, self.default_response_class - ) - current_tags = self.tags.copy() - if tags: - current_tags.extend(tags) - current_dependencies = self.dependencies.copy() - if dependencies: - current_dependencies.extend(dependencies) - current_callbacks = self.callbacks.copy() - if callbacks: - current_callbacks.extend(callbacks) - current_generate_unique_id = get_value_or_default( - generate_unique_id_function, self.generate_unique_id_function - ) - route = route_class( - self.prefix + path, - endpoint=endpoint, - response_model=response_model, - status_code=status_code, - tags=current_tags, - dependencies=current_dependencies, - summary=summary, - description=description, - response_description=response_description, - responses=combined_responses, - deprecated=deprecated or self.deprecated, - methods=methods, - operation_id=operation_id, - response_model_include=response_model_include, - response_model_exclude=response_model_exclude, - response_model_by_alias=response_model_by_alias, - response_model_exclude_unset=response_model_exclude_unset, - response_model_exclude_defaults=response_model_exclude_defaults, - response_model_exclude_none=response_model_exclude_none, - include_in_schema=include_in_schema and self.include_in_schema, - response_class=current_response_class, - name=name, - dependency_overrides_provider=self.dependency_overrides_provider, - callbacks=current_callbacks, - openapi_extra=openapi_extra, - generate_unique_id_function=current_generate_unique_id, - ) - self.routes.append(route) - - def api_route( - self, - path: str, - *, - response_model: Any = Default(None), - status_code: Optional[int] = None, - tags: Optional[List[Union[str, Enum]]] = None, - dependencies: Optional[Sequence[params.Depends]] = None, - summary: Optional[str] = None, - description: Optional[str] = None, - response_description: str = "Successful Response", - responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None, - deprecated: Optional[bool] = None, - methods: Optional[List[str]] = None, - operation_id: Optional[str] = None, - response_model_include: Optional[IncEx] = None, - response_model_exclude: Optional[IncEx] = None, - response_model_by_alias: bool = True, - response_model_exclude_unset: bool = False, - response_model_exclude_defaults: bool = False, - response_model_exclude_none: bool = False, - include_in_schema: bool = True, - response_class: Type[Response] = Default(JSONResponse), - name: Optional[str] = None, - callbacks: Optional[List[BaseRoute]] = None, - openapi_extra: Optional[Dict[str, Any]] = None, - generate_unique_id_function: Callable[[APIRoute], str] = Default( - generate_unique_id - ), - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - def decorator(func: DecoratedCallable) -> DecoratedCallable: - self.add_api_route( - path, - func, - response_model=response_model, - status_code=status_code, - tags=tags, - dependencies=dependencies, - summary=summary, - description=description, - response_description=response_description, - responses=responses, - deprecated=deprecated, - methods=methods, - operation_id=operation_id, - response_model_include=response_model_include, - response_model_exclude=response_model_exclude, - response_model_by_alias=response_model_by_alias, - response_model_exclude_unset=response_model_exclude_unset, - response_model_exclude_defaults=response_model_exclude_defaults, - response_model_exclude_none=response_model_exclude_none, - include_in_schema=include_in_schema, - response_class=response_class, - name=name, - callbacks=callbacks, - openapi_extra=openapi_extra, - generate_unique_id_function=generate_unique_id_function, - ) - return func - - return decorator - - def add_api_websocket_route( - self, - path: str, - endpoint: Callable[..., Any], - name: Optional[str] = None, - *, - dependencies: Optional[Sequence[params.Depends]] = None, - ) -> None: - current_dependencies = self.dependencies.copy() - if dependencies: - current_dependencies.extend(dependencies) - - route = APIWebSocketRoute( - self.prefix + path, - endpoint=endpoint, - name=name, - dependencies=current_dependencies, - dependency_overrides_provider=self.dependency_overrides_provider, - ) - self.routes.append(route) - - def websocket( - self, - path: Annotated[ - str, - Doc( - """ - WebSocket path. - """ - ), - ], - name: Annotated[ - Optional[str], - Doc( - """ - A name for the WebSocket. Only used internally. - """ - ), - ] = None, - *, - dependencies: Annotated[ - Optional[Sequence[params.Depends]], - Doc( - """ - A list of dependencies (using `Depends()`) to be used for this - WebSocket. - - Read more about it in the - [FastAPI docs for WebSockets](https://fastapi.tiangolo.com/advanced/websockets/). - """ - ), - ] = None, - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - """ - Decorate a WebSocket function. - - Read more about it in the - [FastAPI docs for WebSockets](https://fastapi.tiangolo.com/advanced/websockets/). - - **Example** - - ## Example - - ```python - from fastapi import APIRouter, FastAPI, WebSocket - - app = FastAPI() - router = APIRouter() - - @router.websocket("/ws") - async def websocket_endpoint(websocket: WebSocket): - await websocket.accept() - while True: - data = await websocket.receive_text() - await websocket.send_text(f"Message text was: {data}") - - app.include_router(router) - ``` - """ - - def decorator(func: DecoratedCallable) -> DecoratedCallable: - self.add_api_websocket_route( - path, func, name=name, dependencies=dependencies - ) - return func - - return decorator - - def websocket_route( - self, path: str, name: Union[str, None] = None - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - def decorator(func: DecoratedCallable) -> DecoratedCallable: - self.add_websocket_route(path, func, name=name) - return func - - return decorator - - def include_router( - self, - router: Annotated["APIRouter", Doc("The `APIRouter` to include.")], - *, - prefix: Annotated[str, Doc("An optional path prefix for the router.")] = "", - tags: Annotated[ - Optional[List[Union[str, Enum]]], - Doc( - """ - A list of tags to be applied to all the *path operations* in this - router. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - dependencies: Annotated[ - Optional[Sequence[params.Depends]], - Doc( - """ - A list of dependencies (using `Depends()`) to be applied to all the - *path operations* in this router. - - Read more about it in the - [FastAPI docs for Bigger Applications - Multiple Files](https://fastapi.tiangolo.com/tutorial/bigger-applications/#include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies). - """ - ), - ] = None, - default_response_class: Annotated[ - Type[Response], - Doc( - """ - The default response class to be used. - - Read more in the - [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#default-response-class). - """ - ), - ] = Default(JSONResponse), - responses: Annotated[ - Optional[Dict[Union[int, str], Dict[str, Any]]], - Doc( - """ - Additional responses to be shown in OpenAPI. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Additional Responses in OpenAPI](https://fastapi.tiangolo.com/advanced/additional-responses/). - - And in the - [FastAPI docs for Bigger Applications](https://fastapi.tiangolo.com/tutorial/bigger-applications/#include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies). - """ - ), - ] = None, - callbacks: Annotated[ - Optional[List[BaseRoute]], - Doc( - """ - OpenAPI callbacks that should apply to all *path operations* in this - router. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). - """ - ), - ] = None, - deprecated: Annotated[ - Optional[bool], - Doc( - """ - Mark all *path operations* in this router as deprecated. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - include_in_schema: Annotated[ - bool, - Doc( - """ - Include (or not) all the *path operations* in this router in the - generated OpenAPI schema. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = True, - generate_unique_id_function: Annotated[ - Callable[[APIRoute], str], - Doc( - """ - Customize the function used to generate unique IDs for the *path - operations* shown in the generated OpenAPI. - - This is particularly useful when automatically generating clients or - SDKs for your API. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = Default(generate_unique_id), - ) -> None: - """ - Include another `APIRouter` in the same current `APIRouter`. - - Read more about it in the - [FastAPI docs for Bigger Applications](https://fastapi.tiangolo.com/tutorial/bigger-applications/). - - ## Example - - ```python - from fastapi import APIRouter, FastAPI - - app = FastAPI() - internal_router = APIRouter() - users_router = APIRouter() - - @users_router.get("/users/") - def read_users(): - return [{"name": "Rick"}, {"name": "Morty"}] - - internal_router.include_router(users_router) - app.include_router(internal_router) - ``` - """ - if prefix: - assert prefix.startswith("/"), "A path prefix must start with '/'" - assert not prefix.endswith("/"), ( - "A path prefix must not end with '/', as the routes will start with '/'" - ) - else: - for r in router.routes: - path = getattr(r, "path") # noqa: B009 - name = getattr(r, "name", "unknown") - if path is not None and not path: - raise FastAPIError( - f"Prefix and path cannot be both empty (path operation: {name})" - ) - if responses is None: - responses = {} - for route in router.routes: - if isinstance(route, APIRoute): - combined_responses = {**responses, **route.responses} - use_response_class = get_value_or_default( - route.response_class, - router.default_response_class, - default_response_class, - self.default_response_class, - ) - current_tags = [] - if tags: - current_tags.extend(tags) - if route.tags: - current_tags.extend(route.tags) - current_dependencies: List[params.Depends] = [] - if dependencies: - current_dependencies.extend(dependencies) - if route.dependencies: - current_dependencies.extend(route.dependencies) - current_callbacks = [] - if callbacks: - current_callbacks.extend(callbacks) - if route.callbacks: - current_callbacks.extend(route.callbacks) - current_generate_unique_id = get_value_or_default( - route.generate_unique_id_function, - router.generate_unique_id_function, - generate_unique_id_function, - self.generate_unique_id_function, - ) - self.add_api_route( - prefix + route.path, - route.endpoint, - response_model=route.response_model, - status_code=route.status_code, - tags=current_tags, - dependencies=current_dependencies, - summary=route.summary, - description=route.description, - response_description=route.response_description, - responses=combined_responses, - deprecated=route.deprecated or deprecated or self.deprecated, - methods=route.methods, - operation_id=route.operation_id, - response_model_include=route.response_model_include, - response_model_exclude=route.response_model_exclude, - response_model_by_alias=route.response_model_by_alias, - response_model_exclude_unset=route.response_model_exclude_unset, - response_model_exclude_defaults=route.response_model_exclude_defaults, - response_model_exclude_none=route.response_model_exclude_none, - include_in_schema=route.include_in_schema - and self.include_in_schema - and include_in_schema, - response_class=use_response_class, - name=route.name, - route_class_override=type(route), - callbacks=current_callbacks, - openapi_extra=route.openapi_extra, - generate_unique_id_function=current_generate_unique_id, - ) - elif isinstance(route, routing.Route): - methods = list(route.methods or []) - self.add_route( - prefix + route.path, - route.endpoint, - methods=methods, - include_in_schema=route.include_in_schema, - name=route.name, - ) - elif isinstance(route, APIWebSocketRoute): - current_dependencies = [] - if dependencies: - current_dependencies.extend(dependencies) - if route.dependencies: - current_dependencies.extend(route.dependencies) - self.add_api_websocket_route( - prefix + route.path, - route.endpoint, - dependencies=current_dependencies, - name=route.name, - ) - elif isinstance(route, routing.WebSocketRoute): - self.add_websocket_route( - prefix + route.path, route.endpoint, name=route.name - ) - for handler in router.on_startup: - self.add_event_handler("startup", handler) - for handler in router.on_shutdown: - self.add_event_handler("shutdown", handler) - self.lifespan_context = _merge_lifespan_context( - self.lifespan_context, - router.lifespan_context, - ) - - def get( - self, - path: Annotated[ - str, - Doc( - """ - The URL path to be used for this *path operation*. - - For example, in `http://example.com/items`, the path is `/items`. - """ - ), - ], - *, - response_model: Annotated[ - Any, - Doc( - """ - The type to use for the response. - - It could be any valid Pydantic *field* type. So, it doesn't have to - be a Pydantic model, it could be other things, like a `list`, `dict`, - etc. - - It will be used for: - - * Documentation: the generated OpenAPI (and the UI at `/docs`) will - show it as the response (JSON Schema). - * Serialization: you could return an arbitrary object and the - `response_model` would be used to serialize that object into the - corresponding JSON. - * Filtering: the JSON sent to the client will only contain the data - (fields) defined in the `response_model`. If you returned an object - that contains an attribute `password` but the `response_model` does - not include that field, the JSON sent to the client would not have - that `password`. - * Validation: whatever you return will be serialized with the - `response_model`, converting any data as necessary to generate the - corresponding JSON. But if the data in the object returned is not - valid, that would mean a violation of the contract with the client, - so it's an error from the API developer. So, FastAPI will raise an - error and return a 500 error code (Internal Server Error). - - Read more about it in the - [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). - """ - ), - ] = Default(None), - status_code: Annotated[ - Optional[int], - Doc( - """ - The default status code to be used for the response. - - You could override the status code by returning a response directly. - - Read more about it in the - [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). - """ - ), - ] = None, - tags: Annotated[ - Optional[List[Union[str, Enum]]], - Doc( - """ - A list of tags to be applied to the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). - """ - ), - ] = None, - dependencies: Annotated[ - Optional[Sequence[params.Depends]], - Doc( - """ - A list of dependencies (using `Depends()`) to be applied to the - *path operation*. - - Read more about it in the - [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). - """ - ), - ] = None, - summary: Annotated[ - Optional[str], - Doc( - """ - A summary for the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - A description for the *path operation*. - - If not provided, it will be extracted automatically from the docstring - of the *path operation function*. - - It can contain Markdown. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - response_description: Annotated[ - str, - Doc( - """ - The description for the default response. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = "Successful Response", - responses: Annotated[ - Optional[Dict[Union[int, str], Dict[str, Any]]], - Doc( - """ - Additional responses that could be returned by this *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - deprecated: Annotated[ - Optional[bool], - Doc( - """ - Mark this *path operation* as deprecated. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - operation_id: Annotated[ - Optional[str], - Doc( - """ - Custom operation ID to be used by this *path operation*. - - By default, it is generated automatically. - - If you provide a custom operation ID, you need to make sure it is - unique for the whole API. - - You can customize the - operation ID generation with the parameter - `generate_unique_id_function` in the `FastAPI` class. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = None, - response_model_include: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to include only certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_exclude: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to exclude certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_by_alias: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response model - should be serialized by alias when an alias is used. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = True, - response_model_exclude_unset: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that were not set and - have their default values. This is different from - `response_model_exclude_defaults` in that if the fields are set, - they will be included in the response, even if the value is the same - as the default. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_defaults: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that have the same value - as the default. This is different from `response_model_exclude_unset` - in that if the fields are set but contain the same default values, - they will be excluded from the response. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_none: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data should - exclude fields set to `None`. - - This is much simpler (less smart) than `response_model_exclude_unset` - and `response_model_exclude_defaults`. You probably want to use one of - those two instead of this one, as those allow returning `None` values - when it makes sense. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). - """ - ), - ] = False, - include_in_schema: Annotated[ - bool, - Doc( - """ - Include this *path operation* in the generated OpenAPI schema. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). - """ - ), - ] = True, - response_class: Annotated[ - Type[Response], - Doc( - """ - Response class to be used for this *path operation*. - - This will not be used if you return a response directly. - - Read more about it in the - [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). - """ - ), - ] = Default(JSONResponse), - name: Annotated[ - Optional[str], - Doc( - """ - Name for this *path operation*. Only used internally. - """ - ), - ] = None, - callbacks: Annotated[ - Optional[List[BaseRoute]], - Doc( - """ - List of *path operations* that will be used as OpenAPI callbacks. - - This is only for OpenAPI documentation, the callbacks won't be used - directly. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). - """ - ), - ] = None, - openapi_extra: Annotated[ - Optional[Dict[str, Any]], - Doc( - """ - Extra metadata to be included in the OpenAPI schema for this *path - operation*. - - Read more about it in the - [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). - """ - ), - ] = None, - generate_unique_id_function: Annotated[ - Callable[[APIRoute], str], - Doc( - """ - Customize the function used to generate unique IDs for the *path - operations* shown in the generated OpenAPI. - - This is particularly useful when automatically generating clients or - SDKs for your API. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = Default(generate_unique_id), - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - """ - Add a *path operation* using an HTTP GET operation. - - ## Example - - ```python - from fastapi import APIRouter, FastAPI - - app = FastAPI() - router = APIRouter() - - @router.get("/items/") - def read_items(): - return [{"name": "Empanada"}, {"name": "Arepa"}] - - app.include_router(router) - ``` - """ - return self.api_route( - path=path, - response_model=response_model, - status_code=status_code, - tags=tags, - dependencies=dependencies, - summary=summary, - description=description, - response_description=response_description, - responses=responses, - deprecated=deprecated, - methods=["GET"], - operation_id=operation_id, - response_model_include=response_model_include, - response_model_exclude=response_model_exclude, - response_model_by_alias=response_model_by_alias, - response_model_exclude_unset=response_model_exclude_unset, - response_model_exclude_defaults=response_model_exclude_defaults, - response_model_exclude_none=response_model_exclude_none, - include_in_schema=include_in_schema, - response_class=response_class, - name=name, - callbacks=callbacks, - openapi_extra=openapi_extra, - generate_unique_id_function=generate_unique_id_function, - ) - - def put( - self, - path: Annotated[ - str, - Doc( - """ - The URL path to be used for this *path operation*. - - For example, in `http://example.com/items`, the path is `/items`. - """ - ), - ], - *, - response_model: Annotated[ - Any, - Doc( - """ - The type to use for the response. - - It could be any valid Pydantic *field* type. So, it doesn't have to - be a Pydantic model, it could be other things, like a `list`, `dict`, - etc. - - It will be used for: - - * Documentation: the generated OpenAPI (and the UI at `/docs`) will - show it as the response (JSON Schema). - * Serialization: you could return an arbitrary object and the - `response_model` would be used to serialize that object into the - corresponding JSON. - * Filtering: the JSON sent to the client will only contain the data - (fields) defined in the `response_model`. If you returned an object - that contains an attribute `password` but the `response_model` does - not include that field, the JSON sent to the client would not have - that `password`. - * Validation: whatever you return will be serialized with the - `response_model`, converting any data as necessary to generate the - corresponding JSON. But if the data in the object returned is not - valid, that would mean a violation of the contract with the client, - so it's an error from the API developer. So, FastAPI will raise an - error and return a 500 error code (Internal Server Error). - - Read more about it in the - [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). - """ - ), - ] = Default(None), - status_code: Annotated[ - Optional[int], - Doc( - """ - The default status code to be used for the response. - - You could override the status code by returning a response directly. - - Read more about it in the - [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). - """ - ), - ] = None, - tags: Annotated[ - Optional[List[Union[str, Enum]]], - Doc( - """ - A list of tags to be applied to the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). - """ - ), - ] = None, - dependencies: Annotated[ - Optional[Sequence[params.Depends]], - Doc( - """ - A list of dependencies (using `Depends()`) to be applied to the - *path operation*. - - Read more about it in the - [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). - """ - ), - ] = None, - summary: Annotated[ - Optional[str], - Doc( - """ - A summary for the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - A description for the *path operation*. - - If not provided, it will be extracted automatically from the docstring - of the *path operation function*. - - It can contain Markdown. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - response_description: Annotated[ - str, - Doc( - """ - The description for the default response. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = "Successful Response", - responses: Annotated[ - Optional[Dict[Union[int, str], Dict[str, Any]]], - Doc( - """ - Additional responses that could be returned by this *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - deprecated: Annotated[ - Optional[bool], - Doc( - """ - Mark this *path operation* as deprecated. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - operation_id: Annotated[ - Optional[str], - Doc( - """ - Custom operation ID to be used by this *path operation*. - - By default, it is generated automatically. - - If you provide a custom operation ID, you need to make sure it is - unique for the whole API. - - You can customize the - operation ID generation with the parameter - `generate_unique_id_function` in the `FastAPI` class. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = None, - response_model_include: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to include only certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_exclude: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to exclude certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_by_alias: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response model - should be serialized by alias when an alias is used. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = True, - response_model_exclude_unset: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that were not set and - have their default values. This is different from - `response_model_exclude_defaults` in that if the fields are set, - they will be included in the response, even if the value is the same - as the default. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_defaults: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that have the same value - as the default. This is different from `response_model_exclude_unset` - in that if the fields are set but contain the same default values, - they will be excluded from the response. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_none: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data should - exclude fields set to `None`. - - This is much simpler (less smart) than `response_model_exclude_unset` - and `response_model_exclude_defaults`. You probably want to use one of - those two instead of this one, as those allow returning `None` values - when it makes sense. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). - """ - ), - ] = False, - include_in_schema: Annotated[ - bool, - Doc( - """ - Include this *path operation* in the generated OpenAPI schema. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). - """ - ), - ] = True, - response_class: Annotated[ - Type[Response], - Doc( - """ - Response class to be used for this *path operation*. - - This will not be used if you return a response directly. - - Read more about it in the - [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). - """ - ), - ] = Default(JSONResponse), - name: Annotated[ - Optional[str], - Doc( - """ - Name for this *path operation*. Only used internally. - """ - ), - ] = None, - callbacks: Annotated[ - Optional[List[BaseRoute]], - Doc( - """ - List of *path operations* that will be used as OpenAPI callbacks. - - This is only for OpenAPI documentation, the callbacks won't be used - directly. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). - """ - ), - ] = None, - openapi_extra: Annotated[ - Optional[Dict[str, Any]], - Doc( - """ - Extra metadata to be included in the OpenAPI schema for this *path - operation*. - - Read more about it in the - [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). - """ - ), - ] = None, - generate_unique_id_function: Annotated[ - Callable[[APIRoute], str], - Doc( - """ - Customize the function used to generate unique IDs for the *path - operations* shown in the generated OpenAPI. - - This is particularly useful when automatically generating clients or - SDKs for your API. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = Default(generate_unique_id), - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - """ - Add a *path operation* using an HTTP PUT operation. - - ## Example - - ```python - from fastapi import APIRouter, FastAPI - from pydantic import BaseModel - - class Item(BaseModel): - name: str - description: str | None = None - - app = FastAPI() - router = APIRouter() - - @router.put("/items/{item_id}") - def replace_item(item_id: str, item: Item): - return {"message": "Item replaced", "id": item_id} - - app.include_router(router) - ``` - """ - return self.api_route( - path=path, - response_model=response_model, - status_code=status_code, - tags=tags, - dependencies=dependencies, - summary=summary, - description=description, - response_description=response_description, - responses=responses, - deprecated=deprecated, - methods=["PUT"], - operation_id=operation_id, - response_model_include=response_model_include, - response_model_exclude=response_model_exclude, - response_model_by_alias=response_model_by_alias, - response_model_exclude_unset=response_model_exclude_unset, - response_model_exclude_defaults=response_model_exclude_defaults, - response_model_exclude_none=response_model_exclude_none, - include_in_schema=include_in_schema, - response_class=response_class, - name=name, - callbacks=callbacks, - openapi_extra=openapi_extra, - generate_unique_id_function=generate_unique_id_function, - ) - - def post( - self, - path: Annotated[ - str, - Doc( - """ - The URL path to be used for this *path operation*. - - For example, in `http://example.com/items`, the path is `/items`. - """ - ), - ], - *, - response_model: Annotated[ - Any, - Doc( - """ - The type to use for the response. - - It could be any valid Pydantic *field* type. So, it doesn't have to - be a Pydantic model, it could be other things, like a `list`, `dict`, - etc. - - It will be used for: - - * Documentation: the generated OpenAPI (and the UI at `/docs`) will - show it as the response (JSON Schema). - * Serialization: you could return an arbitrary object and the - `response_model` would be used to serialize that object into the - corresponding JSON. - * Filtering: the JSON sent to the client will only contain the data - (fields) defined in the `response_model`. If you returned an object - that contains an attribute `password` but the `response_model` does - not include that field, the JSON sent to the client would not have - that `password`. - * Validation: whatever you return will be serialized with the - `response_model`, converting any data as necessary to generate the - corresponding JSON. But if the data in the object returned is not - valid, that would mean a violation of the contract with the client, - so it's an error from the API developer. So, FastAPI will raise an - error and return a 500 error code (Internal Server Error). - - Read more about it in the - [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). - """ - ), - ] = Default(None), - status_code: Annotated[ - Optional[int], - Doc( - """ - The default status code to be used for the response. - - You could override the status code by returning a response directly. - - Read more about it in the - [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). - """ - ), - ] = None, - tags: Annotated[ - Optional[List[Union[str, Enum]]], - Doc( - """ - A list of tags to be applied to the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). - """ - ), - ] = None, - dependencies: Annotated[ - Optional[Sequence[params.Depends]], - Doc( - """ - A list of dependencies (using `Depends()`) to be applied to the - *path operation*. - - Read more about it in the - [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). - """ - ), - ] = None, - summary: Annotated[ - Optional[str], - Doc( - """ - A summary for the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - A description for the *path operation*. - - If not provided, it will be extracted automatically from the docstring - of the *path operation function*. - - It can contain Markdown. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - response_description: Annotated[ - str, - Doc( - """ - The description for the default response. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = "Successful Response", - responses: Annotated[ - Optional[Dict[Union[int, str], Dict[str, Any]]], - Doc( - """ - Additional responses that could be returned by this *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - deprecated: Annotated[ - Optional[bool], - Doc( - """ - Mark this *path operation* as deprecated. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - operation_id: Annotated[ - Optional[str], - Doc( - """ - Custom operation ID to be used by this *path operation*. - - By default, it is generated automatically. - - If you provide a custom operation ID, you need to make sure it is - unique for the whole API. - - You can customize the - operation ID generation with the parameter - `generate_unique_id_function` in the `FastAPI` class. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = None, - response_model_include: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to include only certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_exclude: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to exclude certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_by_alias: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response model - should be serialized by alias when an alias is used. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = True, - response_model_exclude_unset: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that were not set and - have their default values. This is different from - `response_model_exclude_defaults` in that if the fields are set, - they will be included in the response, even if the value is the same - as the default. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_defaults: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that have the same value - as the default. This is different from `response_model_exclude_unset` - in that if the fields are set but contain the same default values, - they will be excluded from the response. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_none: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data should - exclude fields set to `None`. - - This is much simpler (less smart) than `response_model_exclude_unset` - and `response_model_exclude_defaults`. You probably want to use one of - those two instead of this one, as those allow returning `None` values - when it makes sense. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). - """ - ), - ] = False, - include_in_schema: Annotated[ - bool, - Doc( - """ - Include this *path operation* in the generated OpenAPI schema. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). - """ - ), - ] = True, - response_class: Annotated[ - Type[Response], - Doc( - """ - Response class to be used for this *path operation*. - - This will not be used if you return a response directly. - - Read more about it in the - [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). - """ - ), - ] = Default(JSONResponse), - name: Annotated[ - Optional[str], - Doc( - """ - Name for this *path operation*. Only used internally. - """ - ), - ] = None, - callbacks: Annotated[ - Optional[List[BaseRoute]], - Doc( - """ - List of *path operations* that will be used as OpenAPI callbacks. - - This is only for OpenAPI documentation, the callbacks won't be used - directly. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). - """ - ), - ] = None, - openapi_extra: Annotated[ - Optional[Dict[str, Any]], - Doc( - """ - Extra metadata to be included in the OpenAPI schema for this *path - operation*. - - Read more about it in the - [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). - """ - ), - ] = None, - generate_unique_id_function: Annotated[ - Callable[[APIRoute], str], - Doc( - """ - Customize the function used to generate unique IDs for the *path - operations* shown in the generated OpenAPI. - - This is particularly useful when automatically generating clients or - SDKs for your API. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = Default(generate_unique_id), - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - """ - Add a *path operation* using an HTTP POST operation. - - ## Example - - ```python - from fastapi import APIRouter, FastAPI - from pydantic import BaseModel - - class Item(BaseModel): - name: str - description: str | None = None - - app = FastAPI() - router = APIRouter() - - @router.post("/items/") - def create_item(item: Item): - return {"message": "Item created"} - - app.include_router(router) - ``` - """ - return self.api_route( - path=path, - response_model=response_model, - status_code=status_code, - tags=tags, - dependencies=dependencies, - summary=summary, - description=description, - response_description=response_description, - responses=responses, - deprecated=deprecated, - methods=["POST"], - operation_id=operation_id, - response_model_include=response_model_include, - response_model_exclude=response_model_exclude, - response_model_by_alias=response_model_by_alias, - response_model_exclude_unset=response_model_exclude_unset, - response_model_exclude_defaults=response_model_exclude_defaults, - response_model_exclude_none=response_model_exclude_none, - include_in_schema=include_in_schema, - response_class=response_class, - name=name, - callbacks=callbacks, - openapi_extra=openapi_extra, - generate_unique_id_function=generate_unique_id_function, - ) - - def delete( - self, - path: Annotated[ - str, - Doc( - """ - The URL path to be used for this *path operation*. - - For example, in `http://example.com/items`, the path is `/items`. - """ - ), - ], - *, - response_model: Annotated[ - Any, - Doc( - """ - The type to use for the response. - - It could be any valid Pydantic *field* type. So, it doesn't have to - be a Pydantic model, it could be other things, like a `list`, `dict`, - etc. - - It will be used for: - - * Documentation: the generated OpenAPI (and the UI at `/docs`) will - show it as the response (JSON Schema). - * Serialization: you could return an arbitrary object and the - `response_model` would be used to serialize that object into the - corresponding JSON. - * Filtering: the JSON sent to the client will only contain the data - (fields) defined in the `response_model`. If you returned an object - that contains an attribute `password` but the `response_model` does - not include that field, the JSON sent to the client would not have - that `password`. - * Validation: whatever you return will be serialized with the - `response_model`, converting any data as necessary to generate the - corresponding JSON. But if the data in the object returned is not - valid, that would mean a violation of the contract with the client, - so it's an error from the API developer. So, FastAPI will raise an - error and return a 500 error code (Internal Server Error). - - Read more about it in the - [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). - """ - ), - ] = Default(None), - status_code: Annotated[ - Optional[int], - Doc( - """ - The default status code to be used for the response. - - You could override the status code by returning a response directly. - - Read more about it in the - [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). - """ - ), - ] = None, - tags: Annotated[ - Optional[List[Union[str, Enum]]], - Doc( - """ - A list of tags to be applied to the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). - """ - ), - ] = None, - dependencies: Annotated[ - Optional[Sequence[params.Depends]], - Doc( - """ - A list of dependencies (using `Depends()`) to be applied to the - *path operation*. - - Read more about it in the - [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). - """ - ), - ] = None, - summary: Annotated[ - Optional[str], - Doc( - """ - A summary for the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - A description for the *path operation*. - - If not provided, it will be extracted automatically from the docstring - of the *path operation function*. - - It can contain Markdown. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - response_description: Annotated[ - str, - Doc( - """ - The description for the default response. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = "Successful Response", - responses: Annotated[ - Optional[Dict[Union[int, str], Dict[str, Any]]], - Doc( - """ - Additional responses that could be returned by this *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - deprecated: Annotated[ - Optional[bool], - Doc( - """ - Mark this *path operation* as deprecated. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - operation_id: Annotated[ - Optional[str], - Doc( - """ - Custom operation ID to be used by this *path operation*. - - By default, it is generated automatically. - - If you provide a custom operation ID, you need to make sure it is - unique for the whole API. - - You can customize the - operation ID generation with the parameter - `generate_unique_id_function` in the `FastAPI` class. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = None, - response_model_include: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to include only certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_exclude: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to exclude certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_by_alias: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response model - should be serialized by alias when an alias is used. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = True, - response_model_exclude_unset: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that were not set and - have their default values. This is different from - `response_model_exclude_defaults` in that if the fields are set, - they will be included in the response, even if the value is the same - as the default. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_defaults: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that have the same value - as the default. This is different from `response_model_exclude_unset` - in that if the fields are set but contain the same default values, - they will be excluded from the response. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_none: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data should - exclude fields set to `None`. - - This is much simpler (less smart) than `response_model_exclude_unset` - and `response_model_exclude_defaults`. You probably want to use one of - those two instead of this one, as those allow returning `None` values - when it makes sense. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). - """ - ), - ] = False, - include_in_schema: Annotated[ - bool, - Doc( - """ - Include this *path operation* in the generated OpenAPI schema. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). - """ - ), - ] = True, - response_class: Annotated[ - Type[Response], - Doc( - """ - Response class to be used for this *path operation*. - - This will not be used if you return a response directly. - - Read more about it in the - [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). - """ - ), - ] = Default(JSONResponse), - name: Annotated[ - Optional[str], - Doc( - """ - Name for this *path operation*. Only used internally. - """ - ), - ] = None, - callbacks: Annotated[ - Optional[List[BaseRoute]], - Doc( - """ - List of *path operations* that will be used as OpenAPI callbacks. - - This is only for OpenAPI documentation, the callbacks won't be used - directly. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). - """ - ), - ] = None, - openapi_extra: Annotated[ - Optional[Dict[str, Any]], - Doc( - """ - Extra metadata to be included in the OpenAPI schema for this *path - operation*. - - Read more about it in the - [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). - """ - ), - ] = None, - generate_unique_id_function: Annotated[ - Callable[[APIRoute], str], - Doc( - """ - Customize the function used to generate unique IDs for the *path - operations* shown in the generated OpenAPI. - - This is particularly useful when automatically generating clients or - SDKs for your API. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = Default(generate_unique_id), - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - """ - Add a *path operation* using an HTTP DELETE operation. - - ## Example - - ```python - from fastapi import APIRouter, FastAPI - - app = FastAPI() - router = APIRouter() - - @router.delete("/items/{item_id}") - def delete_item(item_id: str): - return {"message": "Item deleted"} - - app.include_router(router) - ``` - """ - return self.api_route( - path=path, - response_model=response_model, - status_code=status_code, - tags=tags, - dependencies=dependencies, - summary=summary, - description=description, - response_description=response_description, - responses=responses, - deprecated=deprecated, - methods=["DELETE"], - operation_id=operation_id, - response_model_include=response_model_include, - response_model_exclude=response_model_exclude, - response_model_by_alias=response_model_by_alias, - response_model_exclude_unset=response_model_exclude_unset, - response_model_exclude_defaults=response_model_exclude_defaults, - response_model_exclude_none=response_model_exclude_none, - include_in_schema=include_in_schema, - response_class=response_class, - name=name, - callbacks=callbacks, - openapi_extra=openapi_extra, - generate_unique_id_function=generate_unique_id_function, - ) - - def options( - self, - path: Annotated[ - str, - Doc( - """ - The URL path to be used for this *path operation*. - - For example, in `http://example.com/items`, the path is `/items`. - """ - ), - ], - *, - response_model: Annotated[ - Any, - Doc( - """ - The type to use for the response. - - It could be any valid Pydantic *field* type. So, it doesn't have to - be a Pydantic model, it could be other things, like a `list`, `dict`, - etc. - - It will be used for: - - * Documentation: the generated OpenAPI (and the UI at `/docs`) will - show it as the response (JSON Schema). - * Serialization: you could return an arbitrary object and the - `response_model` would be used to serialize that object into the - corresponding JSON. - * Filtering: the JSON sent to the client will only contain the data - (fields) defined in the `response_model`. If you returned an object - that contains an attribute `password` but the `response_model` does - not include that field, the JSON sent to the client would not have - that `password`. - * Validation: whatever you return will be serialized with the - `response_model`, converting any data as necessary to generate the - corresponding JSON. But if the data in the object returned is not - valid, that would mean a violation of the contract with the client, - so it's an error from the API developer. So, FastAPI will raise an - error and return a 500 error code (Internal Server Error). - - Read more about it in the - [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). - """ - ), - ] = Default(None), - status_code: Annotated[ - Optional[int], - Doc( - """ - The default status code to be used for the response. - - You could override the status code by returning a response directly. - - Read more about it in the - [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). - """ - ), - ] = None, - tags: Annotated[ - Optional[List[Union[str, Enum]]], - Doc( - """ - A list of tags to be applied to the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). - """ - ), - ] = None, - dependencies: Annotated[ - Optional[Sequence[params.Depends]], - Doc( - """ - A list of dependencies (using `Depends()`) to be applied to the - *path operation*. - - Read more about it in the - [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). - """ - ), - ] = None, - summary: Annotated[ - Optional[str], - Doc( - """ - A summary for the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - A description for the *path operation*. - - If not provided, it will be extracted automatically from the docstring - of the *path operation function*. - - It can contain Markdown. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - response_description: Annotated[ - str, - Doc( - """ - The description for the default response. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = "Successful Response", - responses: Annotated[ - Optional[Dict[Union[int, str], Dict[str, Any]]], - Doc( - """ - Additional responses that could be returned by this *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - deprecated: Annotated[ - Optional[bool], - Doc( - """ - Mark this *path operation* as deprecated. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - operation_id: Annotated[ - Optional[str], - Doc( - """ - Custom operation ID to be used by this *path operation*. - - By default, it is generated automatically. - - If you provide a custom operation ID, you need to make sure it is - unique for the whole API. - - You can customize the - operation ID generation with the parameter - `generate_unique_id_function` in the `FastAPI` class. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = None, - response_model_include: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to include only certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_exclude: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to exclude certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_by_alias: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response model - should be serialized by alias when an alias is used. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = True, - response_model_exclude_unset: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that were not set and - have their default values. This is different from - `response_model_exclude_defaults` in that if the fields are set, - they will be included in the response, even if the value is the same - as the default. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_defaults: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that have the same value - as the default. This is different from `response_model_exclude_unset` - in that if the fields are set but contain the same default values, - they will be excluded from the response. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_none: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data should - exclude fields set to `None`. - - This is much simpler (less smart) than `response_model_exclude_unset` - and `response_model_exclude_defaults`. You probably want to use one of - those two instead of this one, as those allow returning `None` values - when it makes sense. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). - """ - ), - ] = False, - include_in_schema: Annotated[ - bool, - Doc( - """ - Include this *path operation* in the generated OpenAPI schema. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). - """ - ), - ] = True, - response_class: Annotated[ - Type[Response], - Doc( - """ - Response class to be used for this *path operation*. - - This will not be used if you return a response directly. - - Read more about it in the - [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). - """ - ), - ] = Default(JSONResponse), - name: Annotated[ - Optional[str], - Doc( - """ - Name for this *path operation*. Only used internally. - """ - ), - ] = None, - callbacks: Annotated[ - Optional[List[BaseRoute]], - Doc( - """ - List of *path operations* that will be used as OpenAPI callbacks. - - This is only for OpenAPI documentation, the callbacks won't be used - directly. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). - """ - ), - ] = None, - openapi_extra: Annotated[ - Optional[Dict[str, Any]], - Doc( - """ - Extra metadata to be included in the OpenAPI schema for this *path - operation*. - - Read more about it in the - [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). - """ - ), - ] = None, - generate_unique_id_function: Annotated[ - Callable[[APIRoute], str], - Doc( - """ - Customize the function used to generate unique IDs for the *path - operations* shown in the generated OpenAPI. - - This is particularly useful when automatically generating clients or - SDKs for your API. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = Default(generate_unique_id), - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - """ - Add a *path operation* using an HTTP OPTIONS operation. - - ## Example - - ```python - from fastapi import APIRouter, FastAPI - - app = FastAPI() - router = APIRouter() - - @router.options("/items/") - def get_item_options(): - return {"additions": ["Aji", "Guacamole"]} - - app.include_router(router) - ``` - """ - return self.api_route( - path=path, - response_model=response_model, - status_code=status_code, - tags=tags, - dependencies=dependencies, - summary=summary, - description=description, - response_description=response_description, - responses=responses, - deprecated=deprecated, - methods=["OPTIONS"], - operation_id=operation_id, - response_model_include=response_model_include, - response_model_exclude=response_model_exclude, - response_model_by_alias=response_model_by_alias, - response_model_exclude_unset=response_model_exclude_unset, - response_model_exclude_defaults=response_model_exclude_defaults, - response_model_exclude_none=response_model_exclude_none, - include_in_schema=include_in_schema, - response_class=response_class, - name=name, - callbacks=callbacks, - openapi_extra=openapi_extra, - generate_unique_id_function=generate_unique_id_function, - ) - - def head( - self, - path: Annotated[ - str, - Doc( - """ - The URL path to be used for this *path operation*. - - For example, in `http://example.com/items`, the path is `/items`. - """ - ), - ], - *, - response_model: Annotated[ - Any, - Doc( - """ - The type to use for the response. - - It could be any valid Pydantic *field* type. So, it doesn't have to - be a Pydantic model, it could be other things, like a `list`, `dict`, - etc. - - It will be used for: - - * Documentation: the generated OpenAPI (and the UI at `/docs`) will - show it as the response (JSON Schema). - * Serialization: you could return an arbitrary object and the - `response_model` would be used to serialize that object into the - corresponding JSON. - * Filtering: the JSON sent to the client will only contain the data - (fields) defined in the `response_model`. If you returned an object - that contains an attribute `password` but the `response_model` does - not include that field, the JSON sent to the client would not have - that `password`. - * Validation: whatever you return will be serialized with the - `response_model`, converting any data as necessary to generate the - corresponding JSON. But if the data in the object returned is not - valid, that would mean a violation of the contract with the client, - so it's an error from the API developer. So, FastAPI will raise an - error and return a 500 error code (Internal Server Error). - - Read more about it in the - [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). - """ - ), - ] = Default(None), - status_code: Annotated[ - Optional[int], - Doc( - """ - The default status code to be used for the response. - - You could override the status code by returning a response directly. - - Read more about it in the - [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). - """ - ), - ] = None, - tags: Annotated[ - Optional[List[Union[str, Enum]]], - Doc( - """ - A list of tags to be applied to the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). - """ - ), - ] = None, - dependencies: Annotated[ - Optional[Sequence[params.Depends]], - Doc( - """ - A list of dependencies (using `Depends()`) to be applied to the - *path operation*. - - Read more about it in the - [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). - """ - ), - ] = None, - summary: Annotated[ - Optional[str], - Doc( - """ - A summary for the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - A description for the *path operation*. - - If not provided, it will be extracted automatically from the docstring - of the *path operation function*. - - It can contain Markdown. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - response_description: Annotated[ - str, - Doc( - """ - The description for the default response. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = "Successful Response", - responses: Annotated[ - Optional[Dict[Union[int, str], Dict[str, Any]]], - Doc( - """ - Additional responses that could be returned by this *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - deprecated: Annotated[ - Optional[bool], - Doc( - """ - Mark this *path operation* as deprecated. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - operation_id: Annotated[ - Optional[str], - Doc( - """ - Custom operation ID to be used by this *path operation*. - - By default, it is generated automatically. - - If you provide a custom operation ID, you need to make sure it is - unique for the whole API. - - You can customize the - operation ID generation with the parameter - `generate_unique_id_function` in the `FastAPI` class. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = None, - response_model_include: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to include only certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_exclude: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to exclude certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_by_alias: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response model - should be serialized by alias when an alias is used. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = True, - response_model_exclude_unset: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that were not set and - have their default values. This is different from - `response_model_exclude_defaults` in that if the fields are set, - they will be included in the response, even if the value is the same - as the default. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_defaults: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that have the same value - as the default. This is different from `response_model_exclude_unset` - in that if the fields are set but contain the same default values, - they will be excluded from the response. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_none: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data should - exclude fields set to `None`. - - This is much simpler (less smart) than `response_model_exclude_unset` - and `response_model_exclude_defaults`. You probably want to use one of - those two instead of this one, as those allow returning `None` values - when it makes sense. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). - """ - ), - ] = False, - include_in_schema: Annotated[ - bool, - Doc( - """ - Include this *path operation* in the generated OpenAPI schema. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). - """ - ), - ] = True, - response_class: Annotated[ - Type[Response], - Doc( - """ - Response class to be used for this *path operation*. - - This will not be used if you return a response directly. - - Read more about it in the - [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). - """ - ), - ] = Default(JSONResponse), - name: Annotated[ - Optional[str], - Doc( - """ - Name for this *path operation*. Only used internally. - """ - ), - ] = None, - callbacks: Annotated[ - Optional[List[BaseRoute]], - Doc( - """ - List of *path operations* that will be used as OpenAPI callbacks. - - This is only for OpenAPI documentation, the callbacks won't be used - directly. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). - """ - ), - ] = None, - openapi_extra: Annotated[ - Optional[Dict[str, Any]], - Doc( - """ - Extra metadata to be included in the OpenAPI schema for this *path - operation*. - - Read more about it in the - [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). - """ - ), - ] = None, - generate_unique_id_function: Annotated[ - Callable[[APIRoute], str], - Doc( - """ - Customize the function used to generate unique IDs for the *path - operations* shown in the generated OpenAPI. - - This is particularly useful when automatically generating clients or - SDKs for your API. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = Default(generate_unique_id), - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - """ - Add a *path operation* using an HTTP HEAD operation. - - ## Example - - ```python - from fastapi import APIRouter, FastAPI - from pydantic import BaseModel - - class Item(BaseModel): - name: str - description: str | None = None - - app = FastAPI() - router = APIRouter() - - @router.head("/items/", status_code=204) - def get_items_headers(response: Response): - response.headers["X-Cat-Dog"] = "Alone in the world" - - app.include_router(router) - ``` - """ - return self.api_route( - path=path, - response_model=response_model, - status_code=status_code, - tags=tags, - dependencies=dependencies, - summary=summary, - description=description, - response_description=response_description, - responses=responses, - deprecated=deprecated, - methods=["HEAD"], - operation_id=operation_id, - response_model_include=response_model_include, - response_model_exclude=response_model_exclude, - response_model_by_alias=response_model_by_alias, - response_model_exclude_unset=response_model_exclude_unset, - response_model_exclude_defaults=response_model_exclude_defaults, - response_model_exclude_none=response_model_exclude_none, - include_in_schema=include_in_schema, - response_class=response_class, - name=name, - callbacks=callbacks, - openapi_extra=openapi_extra, - generate_unique_id_function=generate_unique_id_function, - ) - - def patch( - self, - path: Annotated[ - str, - Doc( - """ - The URL path to be used for this *path operation*. - - For example, in `http://example.com/items`, the path is `/items`. - """ - ), - ], - *, - response_model: Annotated[ - Any, - Doc( - """ - The type to use for the response. - - It could be any valid Pydantic *field* type. So, it doesn't have to - be a Pydantic model, it could be other things, like a `list`, `dict`, - etc. - - It will be used for: - - * Documentation: the generated OpenAPI (and the UI at `/docs`) will - show it as the response (JSON Schema). - * Serialization: you could return an arbitrary object and the - `response_model` would be used to serialize that object into the - corresponding JSON. - * Filtering: the JSON sent to the client will only contain the data - (fields) defined in the `response_model`. If you returned an object - that contains an attribute `password` but the `response_model` does - not include that field, the JSON sent to the client would not have - that `password`. - * Validation: whatever you return will be serialized with the - `response_model`, converting any data as necessary to generate the - corresponding JSON. But if the data in the object returned is not - valid, that would mean a violation of the contract with the client, - so it's an error from the API developer. So, FastAPI will raise an - error and return a 500 error code (Internal Server Error). - - Read more about it in the - [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). - """ - ), - ] = Default(None), - status_code: Annotated[ - Optional[int], - Doc( - """ - The default status code to be used for the response. - - You could override the status code by returning a response directly. - - Read more about it in the - [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). - """ - ), - ] = None, - tags: Annotated[ - Optional[List[Union[str, Enum]]], - Doc( - """ - A list of tags to be applied to the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). - """ - ), - ] = None, - dependencies: Annotated[ - Optional[Sequence[params.Depends]], - Doc( - """ - A list of dependencies (using `Depends()`) to be applied to the - *path operation*. - - Read more about it in the - [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). - """ - ), - ] = None, - summary: Annotated[ - Optional[str], - Doc( - """ - A summary for the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - A description for the *path operation*. - - If not provided, it will be extracted automatically from the docstring - of the *path operation function*. - - It can contain Markdown. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - response_description: Annotated[ - str, - Doc( - """ - The description for the default response. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = "Successful Response", - responses: Annotated[ - Optional[Dict[Union[int, str], Dict[str, Any]]], - Doc( - """ - Additional responses that could be returned by this *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - deprecated: Annotated[ - Optional[bool], - Doc( - """ - Mark this *path operation* as deprecated. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - operation_id: Annotated[ - Optional[str], - Doc( - """ - Custom operation ID to be used by this *path operation*. - - By default, it is generated automatically. - - If you provide a custom operation ID, you need to make sure it is - unique for the whole API. - - You can customize the - operation ID generation with the parameter - `generate_unique_id_function` in the `FastAPI` class. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = None, - response_model_include: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to include only certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_exclude: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to exclude certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_by_alias: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response model - should be serialized by alias when an alias is used. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = True, - response_model_exclude_unset: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that were not set and - have their default values. This is different from - `response_model_exclude_defaults` in that if the fields are set, - they will be included in the response, even if the value is the same - as the default. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_defaults: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that have the same value - as the default. This is different from `response_model_exclude_unset` - in that if the fields are set but contain the same default values, - they will be excluded from the response. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_none: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data should - exclude fields set to `None`. - - This is much simpler (less smart) than `response_model_exclude_unset` - and `response_model_exclude_defaults`. You probably want to use one of - those two instead of this one, as those allow returning `None` values - when it makes sense. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). - """ - ), - ] = False, - include_in_schema: Annotated[ - bool, - Doc( - """ - Include this *path operation* in the generated OpenAPI schema. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). - """ - ), - ] = True, - response_class: Annotated[ - Type[Response], - Doc( - """ - Response class to be used for this *path operation*. - - This will not be used if you return a response directly. - - Read more about it in the - [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). - """ - ), - ] = Default(JSONResponse), - name: Annotated[ - Optional[str], - Doc( - """ - Name for this *path operation*. Only used internally. - """ - ), - ] = None, - callbacks: Annotated[ - Optional[List[BaseRoute]], - Doc( - """ - List of *path operations* that will be used as OpenAPI callbacks. - - This is only for OpenAPI documentation, the callbacks won't be used - directly. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). - """ - ), - ] = None, - openapi_extra: Annotated[ - Optional[Dict[str, Any]], - Doc( - """ - Extra metadata to be included in the OpenAPI schema for this *path - operation*. - - Read more about it in the - [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). - """ - ), - ] = None, - generate_unique_id_function: Annotated[ - Callable[[APIRoute], str], - Doc( - """ - Customize the function used to generate unique IDs for the *path - operations* shown in the generated OpenAPI. - - This is particularly useful when automatically generating clients or - SDKs for your API. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = Default(generate_unique_id), - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - """ - Add a *path operation* using an HTTP PATCH operation. - - ## Example - - ```python - from fastapi import APIRouter, FastAPI - from pydantic import BaseModel - - class Item(BaseModel): - name: str - description: str | None = None - - app = FastAPI() - router = APIRouter() - - @router.patch("/items/") - def update_item(item: Item): - return {"message": "Item updated in place"} - - app.include_router(router) - ``` - """ - return self.api_route( - path=path, - response_model=response_model, - status_code=status_code, - tags=tags, - dependencies=dependencies, - summary=summary, - description=description, - response_description=response_description, - responses=responses, - deprecated=deprecated, - methods=["PATCH"], - operation_id=operation_id, - response_model_include=response_model_include, - response_model_exclude=response_model_exclude, - response_model_by_alias=response_model_by_alias, - response_model_exclude_unset=response_model_exclude_unset, - response_model_exclude_defaults=response_model_exclude_defaults, - response_model_exclude_none=response_model_exclude_none, - include_in_schema=include_in_schema, - response_class=response_class, - name=name, - callbacks=callbacks, - openapi_extra=openapi_extra, - generate_unique_id_function=generate_unique_id_function, - ) - - def trace( - self, - path: Annotated[ - str, - Doc( - """ - The URL path to be used for this *path operation*. - - For example, in `http://example.com/items`, the path is `/items`. - """ - ), - ], - *, - response_model: Annotated[ - Any, - Doc( - """ - The type to use for the response. - - It could be any valid Pydantic *field* type. So, it doesn't have to - be a Pydantic model, it could be other things, like a `list`, `dict`, - etc. - - It will be used for: - - * Documentation: the generated OpenAPI (and the UI at `/docs`) will - show it as the response (JSON Schema). - * Serialization: you could return an arbitrary object and the - `response_model` would be used to serialize that object into the - corresponding JSON. - * Filtering: the JSON sent to the client will only contain the data - (fields) defined in the `response_model`. If you returned an object - that contains an attribute `password` but the `response_model` does - not include that field, the JSON sent to the client would not have - that `password`. - * Validation: whatever you return will be serialized with the - `response_model`, converting any data as necessary to generate the - corresponding JSON. But if the data in the object returned is not - valid, that would mean a violation of the contract with the client, - so it's an error from the API developer. So, FastAPI will raise an - error and return a 500 error code (Internal Server Error). - - Read more about it in the - [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). - """ - ), - ] = Default(None), - status_code: Annotated[ - Optional[int], - Doc( - """ - The default status code to be used for the response. - - You could override the status code by returning a response directly. - - Read more about it in the - [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). - """ - ), - ] = None, - tags: Annotated[ - Optional[List[Union[str, Enum]]], - Doc( - """ - A list of tags to be applied to the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). - """ - ), - ] = None, - dependencies: Annotated[ - Optional[Sequence[params.Depends]], - Doc( - """ - A list of dependencies (using `Depends()`) to be applied to the - *path operation*. - - Read more about it in the - [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). - """ - ), - ] = None, - summary: Annotated[ - Optional[str], - Doc( - """ - A summary for the *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - A description for the *path operation*. - - If not provided, it will be extracted automatically from the docstring - of the *path operation function*. - - It can contain Markdown. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). - """ - ), - ] = None, - response_description: Annotated[ - str, - Doc( - """ - The description for the default response. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = "Successful Response", - responses: Annotated[ - Optional[Dict[Union[int, str], Dict[str, Any]]], - Doc( - """ - Additional responses that could be returned by this *path operation*. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - deprecated: Annotated[ - Optional[bool], - Doc( - """ - Mark this *path operation* as deprecated. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - operation_id: Annotated[ - Optional[str], - Doc( - """ - Custom operation ID to be used by this *path operation*. - - By default, it is generated automatically. - - If you provide a custom operation ID, you need to make sure it is - unique for the whole API. - - You can customize the - operation ID generation with the parameter - `generate_unique_id_function` in the `FastAPI` class. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = None, - response_model_include: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to include only certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_exclude: Annotated[ - Optional[IncEx], - Doc( - """ - Configuration passed to Pydantic to exclude certain fields in the - response data. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = None, - response_model_by_alias: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response model - should be serialized by alias when an alias is used. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). - """ - ), - ] = True, - response_model_exclude_unset: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that were not set and - have their default values. This is different from - `response_model_exclude_defaults` in that if the fields are set, - they will be included in the response, even if the value is the same - as the default. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_defaults: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data - should have all the fields, including the ones that have the same value - as the default. This is different from `response_model_exclude_unset` - in that if the fields are set but contain the same default values, - they will be excluded from the response. - - When `True`, default values are omitted from the response. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). - """ - ), - ] = False, - response_model_exclude_none: Annotated[ - bool, - Doc( - """ - Configuration passed to Pydantic to define if the response data should - exclude fields set to `None`. - - This is much simpler (less smart) than `response_model_exclude_unset` - and `response_model_exclude_defaults`. You probably want to use one of - those two instead of this one, as those allow returning `None` values - when it makes sense. - - Read more about it in the - [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). - """ - ), - ] = False, - include_in_schema: Annotated[ - bool, - Doc( - """ - Include this *path operation* in the generated OpenAPI schema. - - This affects the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-from-openapi). - """ - ), - ] = True, - response_class: Annotated[ - Type[Response], - Doc( - """ - Response class to be used for this *path operation*. - - This will not be used if you return a response directly. - - Read more about it in the - [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). - """ - ), - ] = Default(JSONResponse), - name: Annotated[ - Optional[str], - Doc( - """ - Name for this *path operation*. Only used internally. - """ - ), - ] = None, - callbacks: Annotated[ - Optional[List[BaseRoute]], - Doc( - """ - List of *path operations* that will be used as OpenAPI callbacks. - - This is only for OpenAPI documentation, the callbacks won't be used - directly. - - It will be added to the generated OpenAPI (e.g. visible at `/docs`). - - Read more about it in the - [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). - """ - ), - ] = None, - openapi_extra: Annotated[ - Optional[Dict[str, Any]], - Doc( - """ - Extra metadata to be included in the OpenAPI schema for this *path - operation*. - - Read more about it in the - [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). - """ - ), - ] = None, - generate_unique_id_function: Annotated[ - Callable[[APIRoute], str], - Doc( - """ - Customize the function used to generate unique IDs for the *path - operations* shown in the generated OpenAPI. - - This is particularly useful when automatically generating clients or - SDKs for your API. - - Read more about it in the - [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). - """ - ), - ] = Default(generate_unique_id), - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - """ - Add a *path operation* using an HTTP TRACE operation. - - ## Example - - ```python - from fastapi import APIRouter, FastAPI - from pydantic import BaseModel - - class Item(BaseModel): - name: str - description: str | None = None - - app = FastAPI() - router = APIRouter() - - @router.trace("/items/{item_id}") - def trace_item(item_id: str): - return None - - app.include_router(router) - ``` - """ - return self.api_route( - path=path, - response_model=response_model, - status_code=status_code, - tags=tags, - dependencies=dependencies, - summary=summary, - description=description, - response_description=response_description, - responses=responses, - deprecated=deprecated, - methods=["TRACE"], - operation_id=operation_id, - response_model_include=response_model_include, - response_model_exclude=response_model_exclude, - response_model_by_alias=response_model_by_alias, - response_model_exclude_unset=response_model_exclude_unset, - response_model_exclude_defaults=response_model_exclude_defaults, - response_model_exclude_none=response_model_exclude_none, - include_in_schema=include_in_schema, - response_class=response_class, - name=name, - callbacks=callbacks, - openapi_extra=openapi_extra, - generate_unique_id_function=generate_unique_id_function, - ) - - @deprecated( - """ - on_event is deprecated, use lifespan event handlers instead. - - Read more about it in the - [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). - """ - ) - def on_event( - self, - event_type: Annotated[ - str, - Doc( - """ - The type of event. `startup` or `shutdown`. - """ - ), - ], - ) -> Callable[[DecoratedCallable], DecoratedCallable]: - """ - Add an event handler for the router. - - `on_event` is deprecated, use `lifespan` event handlers instead. - - Read more about it in the - [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/#alternative-events-deprecated). - """ - - def decorator(func: DecoratedCallable) -> DecoratedCallable: - self.add_event_handler(event_type, func) - return func - - return decorator diff --git a/venv/lib/python3.11/site-packages/fastapi/security/__init__.py b/venv/lib/python3.11/site-packages/fastapi/security/__init__.py deleted file mode 100644 index 3aa6bf2..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/security/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -from .api_key import APIKeyCookie as APIKeyCookie -from .api_key import APIKeyHeader as APIKeyHeader -from .api_key import APIKeyQuery as APIKeyQuery -from .http import HTTPAuthorizationCredentials as HTTPAuthorizationCredentials -from .http import HTTPBasic as HTTPBasic -from .http import HTTPBasicCredentials as HTTPBasicCredentials -from .http import HTTPBearer as HTTPBearer -from .http import HTTPDigest as HTTPDigest -from .oauth2 import OAuth2 as OAuth2 -from .oauth2 import OAuth2AuthorizationCodeBearer as OAuth2AuthorizationCodeBearer -from .oauth2 import OAuth2PasswordBearer as OAuth2PasswordBearer -from .oauth2 import OAuth2PasswordRequestForm as OAuth2PasswordRequestForm -from .oauth2 import OAuth2PasswordRequestFormStrict as OAuth2PasswordRequestFormStrict -from .oauth2 import SecurityScopes as SecurityScopes -from .open_id_connect_url import OpenIdConnect as OpenIdConnect diff --git a/venv/lib/python3.11/site-packages/fastapi/security/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/security/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index c105c423480fb28ba387478f8527383ae47e1f19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1065 zcmZ{i%W4!s6o#wk(sS*(Bmo&v+_*4;X(qZ7i6$eGC}hS=a8aA4?5-rm^exrhGqf+_ zBZ#lyQ`EAVowyP=LUvhsswRmPjLpx_ch0Fgb?N$QSxp4riyyzwFUtu1l)>#+x`C_j z0AG-YJi|wUfek})3Altyip#)dTvlB1D?t@k6<2{xY$`T^Yq+Mk23*H=#dY8YZYXZ} z&7g%_ikrY~+*aHIwy>qR4cx&U#TIZEcNKSld$^~#>-U2VyaC*sqV4`K0}illEZh5& zqxUo)MbV7WfAJwD9_0|XR`m}VB(i+m_n_8L?k*DJ=nQ2S2q;;fqrS-s;o3L!?Fwb#U3pyG1 zc^@j@&=okk9@}%m?ZskYpZP2fv%sFyaBlnTlO5;qZ^CCg!=at9ls=7#J0ozn_8Cc1 z*tDJ89L{ze7P8cFcH;cH{xXQX%%^*N0R83DNCx14%7$SSXee~8%h&>GD$udeRiMX0 xSAq6~t^z#~y4GbL38bk&Cqh?&UJG3XdM9)h=%dh8pyxtYfnJGq;`iW+{sIm$Iq?7h diff --git a/venv/lib/python3.11/site-packages/fastapi/security/__pycache__/api_key.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/security/__pycache__/api_key.cpython-311.pyc deleted file mode 100644 index 9c4e1cf5bd5feee3dbae4480a7d85d97c1145e97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10297 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 BI57YK diff --git a/venv/lib/python3.11/site-packages/fastapi/security/__pycache__/base.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/security/__pycache__/base.cpython-311.pyc deleted file mode 100644 index ea5407abd7cce00ef22ba9269ba21fee36d80b46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 587 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 diff --git a/venv/lib/python3.11/site-packages/fastapi/security/__pycache__/oauth2.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/security/__pycache__/oauth2.cpython-311.pyc deleted file mode 100644 index f7af965758dc4d3ad2767118cbb2de391f86235a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20297 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 diff --git a/venv/lib/python3.11/site-packages/fastapi/security/__pycache__/open_id_connect_url.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/security/__pycache__/open_id_connect_url.cpython-311.pyc deleted file mode 100644 index 0fecc30b102ca294bdbc0a16a7a919aeaae4cf61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3538 zcmcf@O^@5gbx2Co_iD9SYq#~f9yD&Vift*5dng(s!8(rHMUr)3Z%{xNE|(mw=uo6G zL+x4%6*XEP_TYnWzT^<};HHQVIrNZ!(5qTFh(I7fi(V4sLSx-aPJM5v56hB`o;n;p z&hWi?^S)>PTqtA-v|s(}`@KKG=-)UQwd8Pcdqy>|Wb=9Me&Y*o}Sv*CGuUlu52W$og$OpS!ScqdWM*(!LT#1kO?p_Qf3 zq~Wj7q2;OB37X6c9Lq%CP|G!isL~COI-Uqj&tlYXP$!@Ve#f=xE~6d6Y-$Q>N^Uj- zKibT*x>Y&f+OB9}PFPLWVuok7SeUb!u(%`L7-nHR-(Z~kJY4jj4uKE3dw4;zKq0Yh zH`%koet7-8c$=7lQl3Y}?oF*j+$fl6ED1$Ps@WN`P0-76T~y2QEVpBWYK}+2B6N>= zjAJlK88$xHr0cA@SEc)oaCTir&4BLIY~K<)m1&W1dyesTcz9I9RLU z^BJx$3^~|n=mm_87HnaeuG^&+2A?Z^fy^QEXZV_)O$CIXB(huw;+UEqmEkqdo(;M) ziN76GK(K%YKHa%$x`OSTqX&=+lG}6Do)H4LK-r<@zUjCoL#Ny3251Q=RI;0#xY$ek_UV>@&7*lxm}&><5W9XFP_>v!mZ3HpOJO>-Zzc35kl zN$@%BAPImO7{GrqM=;&fl_F?D3V@R!d1j;^#RVo4D1nw}fvQd$5@#&ff!P&w9pZ(u zTV@MTV16fP4s(8n=cr%-J#aOt<@+BwY)yevd+|BX922{vbwq62eqoWoMRw%bBoJPC|SXl-tdbl)o*uC%D z%ng$*`NR@+^a%JH1QFb>O8T2x2>OCW}L3&3sipQb{}>w{D0zkDOo)N=MQ0q_LDQQ~ek z(#hH@{gWG?oq1S&^yVaa~5>CXN}DdSTy<{;XS?$ z;9a7CLwm|i7{~3?vFk>E@M|m6C+P3go+?g1?O0w8Qj--ydNQ`vhuU<2`~mI_H%Jdp z)x=g^m82n)z?TzmxvA^4n^5eLq}VmZ$_@&9*$O8geUxA5F1gVocY6u(|Q`;XPLpI!U= z>ZM1kmyQa9;#x%X%-W#%(%s)jBw1Mdru_0Z^!5H5Tj0f&CGg_P5_oZCDI#iVDN2*o zwR-`q>ZjNED)6r4`7%nAH4F&qj>{mJ^M>(p$8_=Bg;~ll;HZSi&LEv80?zT?%2Amx zvFrOTU%@%Lf&Uc1Ux?%^wUn0^337lDuYi|tkDo}@lIe&bc%2kV(K3Q{1Wfs5@@Ekl z1D%{aGsqXAAH5x^YH9JYmMAPdApjyRStvfyQYW)f3hB$Fe0q>yzIWs9`$O_XY5B3H zBRPObOCfotoQ+nH{MG-N{4A2cNlyG^kY5~fUO>)^$QeMSm5}pGC$iC7W5FjX1WG1( z>eIc5z~_tgFE9S}yc|9k#5TmN*{UptdeCjdQ4|}!Jk0+prajbwsw_t$wl$`7cw$5` zsu0y(xS4aTI^iyf^xD5oMaAKrWKvBW%i4qhtyUoHTVpa1{> diff --git a/venv/lib/python3.11/site-packages/fastapi/security/__pycache__/utils.cpython-311.pyc b/venv/lib/python3.11/site-packages/fastapi/security/__pycache__/utils.cpython-311.pyc deleted file mode 100644 index 606c1ef52e5c1fbfb1a14fe2c9128aa4c9b72fc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 667 zcmZ`#&ui2`6rRZ>VOw3RSdH}{i=dc88svSDVDWn~w7 z=po16di5awz<PP0wd*95P@6CH%ug@dE^)KJMS1>|f ztKl(WDFj2f8(@>3)yVfC)dNVal{Em`X+5hVG6*Agb2n9?(7- zA!!778~!gK{~Lkv3aZ~7-|z%#$9Qav$q0|2U+9f&L0?GJpm>TKF4l7i6^d8wxTdf` z*0yZ-Sj05;wFR3rk|xLv!1RHaQQ-{+1FsYEBu*nQV{zt%{Hd1=;brmaO0(%nuGn%y z+s|m1Nv}htq6zmTYo~&%p_eKi%9UiOFLjyn|D4EAYky`d7QnW$mTN#esI<|^t0ltL z`C{Q*o)u2>le6)`*?52V(AoUxY#y46JNNV3d0Lz}v$vMtJTNazpb%}jmbTR};c-_~ z!xYt>nn)#P4sVe-U8$#lrnMVUKS)D%ODsZK4N^V^DhbB8K$j2x^_8}bmx{) Optional[str]: - if not api_key: - if auto_error: - raise HTTPException( - status_code=HTTP_403_FORBIDDEN, detail="Not authenticated" - ) - return None - return api_key - - -class APIKeyQuery(APIKeyBase): - """ - API key authentication using a query parameter. - - This defines the name of the query parameter that should be provided in the request - with the API key and integrates that into the OpenAPI documentation. It extracts - the key value sent in the query parameter automatically and provides it as the - dependency result. But it doesn't define how to send that API key to the client. - - ## Usage - - Create an instance object and use that object as the dependency in `Depends()`. - - The dependency result will be a string containing the key value. - - ## Example - - ```python - from fastapi import Depends, FastAPI - from fastapi.security import APIKeyQuery - - app = FastAPI() - - query_scheme = APIKeyQuery(name="api_key") - - - @app.get("/items/") - async def read_items(api_key: str = Depends(query_scheme)): - return {"api_key": api_key} - ``` - """ - - def __init__( - self, - *, - name: Annotated[ - str, - Doc("Query parameter name."), - ], - scheme_name: Annotated[ - Optional[str], - Doc( - """ - Security scheme name. - - It will be included in the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - Security scheme description. - - It will be included in the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - auto_error: Annotated[ - bool, - Doc( - """ - By default, if the query parameter is not provided, `APIKeyQuery` will - automatically cancel the request and send the client an error. - - If `auto_error` is set to `False`, when the query parameter is not - available, instead of erroring out, the dependency result will be - `None`. - - This is useful when you want to have optional authentication. - - It is also useful when you want to have authentication that can be - provided in one of multiple optional ways (for example, in a query - parameter or in an HTTP Bearer token). - """ - ), - ] = True, - ): - self.model: APIKey = APIKey( - **{"in": APIKeyIn.query}, # type: ignore[arg-type] - name=name, - description=description, - ) - self.scheme_name = scheme_name or self.__class__.__name__ - self.auto_error = auto_error - - async def __call__(self, request: Request) -> Optional[str]: - api_key = request.query_params.get(self.model.name) - return self.check_api_key(api_key, self.auto_error) - - -class APIKeyHeader(APIKeyBase): - """ - API key authentication using a header. - - This defines the name of the header that should be provided in the request with - the API key and integrates that into the OpenAPI documentation. It extracts - the key value sent in the header automatically and provides it as the dependency - result. But it doesn't define how to send that key to the client. - - ## Usage - - Create an instance object and use that object as the dependency in `Depends()`. - - The dependency result will be a string containing the key value. - - ## Example - - ```python - from fastapi import Depends, FastAPI - from fastapi.security import APIKeyHeader - - app = FastAPI() - - header_scheme = APIKeyHeader(name="x-key") - - - @app.get("/items/") - async def read_items(key: str = Depends(header_scheme)): - return {"key": key} - ``` - """ - - def __init__( - self, - *, - name: Annotated[str, Doc("Header name.")], - scheme_name: Annotated[ - Optional[str], - Doc( - """ - Security scheme name. - - It will be included in the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - Security scheme description. - - It will be included in the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - auto_error: Annotated[ - bool, - Doc( - """ - By default, if the header is not provided, `APIKeyHeader` will - automatically cancel the request and send the client an error. - - If `auto_error` is set to `False`, when the header is not available, - instead of erroring out, the dependency result will be `None`. - - This is useful when you want to have optional authentication. - - It is also useful when you want to have authentication that can be - provided in one of multiple optional ways (for example, in a header or - in an HTTP Bearer token). - """ - ), - ] = True, - ): - self.model: APIKey = APIKey( - **{"in": APIKeyIn.header}, # type: ignore[arg-type] - name=name, - description=description, - ) - self.scheme_name = scheme_name or self.__class__.__name__ - self.auto_error = auto_error - - async def __call__(self, request: Request) -> Optional[str]: - api_key = request.headers.get(self.model.name) - return self.check_api_key(api_key, self.auto_error) - - -class APIKeyCookie(APIKeyBase): - """ - API key authentication using a cookie. - - This defines the name of the cookie that should be provided in the request with - the API key and integrates that into the OpenAPI documentation. It extracts - the key value sent in the cookie automatically and provides it as the dependency - result. But it doesn't define how to set that cookie. - - ## Usage - - Create an instance object and use that object as the dependency in `Depends()`. - - The dependency result will be a string containing the key value. - - ## Example - - ```python - from fastapi import Depends, FastAPI - from fastapi.security import APIKeyCookie - - app = FastAPI() - - cookie_scheme = APIKeyCookie(name="session") - - - @app.get("/items/") - async def read_items(session: str = Depends(cookie_scheme)): - return {"session": session} - ``` - """ - - def __init__( - self, - *, - name: Annotated[str, Doc("Cookie name.")], - scheme_name: Annotated[ - Optional[str], - Doc( - """ - Security scheme name. - - It will be included in the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - Security scheme description. - - It will be included in the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - auto_error: Annotated[ - bool, - Doc( - """ - By default, if the cookie is not provided, `APIKeyCookie` will - automatically cancel the request and send the client an error. - - If `auto_error` is set to `False`, when the cookie is not available, - instead of erroring out, the dependency result will be `None`. - - This is useful when you want to have optional authentication. - - It is also useful when you want to have authentication that can be - provided in one of multiple optional ways (for example, in a cookie or - in an HTTP Bearer token). - """ - ), - ] = True, - ): - self.model: APIKey = APIKey( - **{"in": APIKeyIn.cookie}, # type: ignore[arg-type] - name=name, - description=description, - ) - self.scheme_name = scheme_name or self.__class__.__name__ - self.auto_error = auto_error - - async def __call__(self, request: Request) -> Optional[str]: - api_key = request.cookies.get(self.model.name) - return self.check_api_key(api_key, self.auto_error) diff --git a/venv/lib/python3.11/site-packages/fastapi/security/base.py b/venv/lib/python3.11/site-packages/fastapi/security/base.py deleted file mode 100644 index c43555d..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/security/base.py +++ /dev/null @@ -1,6 +0,0 @@ -from fastapi.openapi.models import SecurityBase as SecurityBaseModel - - -class SecurityBase: - model: SecurityBaseModel - scheme_name: str diff --git a/venv/lib/python3.11/site-packages/fastapi/security/http.py b/venv/lib/python3.11/site-packages/fastapi/security/http.py deleted file mode 100644 index 9ab2df3..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/security/http.py +++ /dev/null @@ -1,423 +0,0 @@ -import binascii -from base64 import b64decode -from typing import Optional - -from fastapi.exceptions import HTTPException -from fastapi.openapi.models import HTTPBase as HTTPBaseModel -from fastapi.openapi.models import HTTPBearer as HTTPBearerModel -from fastapi.security.base import SecurityBase -from fastapi.security.utils import get_authorization_scheme_param -from pydantic import BaseModel -from starlette.requests import Request -from starlette.status import HTTP_401_UNAUTHORIZED, HTTP_403_FORBIDDEN -from typing_extensions import Annotated, Doc - - -class HTTPBasicCredentials(BaseModel): - """ - The HTTP Basic credentials given as the result of using `HTTPBasic` in a - dependency. - - Read more about it in the - [FastAPI docs for HTTP Basic Auth](https://fastapi.tiangolo.com/advanced/security/http-basic-auth/). - """ - - username: Annotated[str, Doc("The HTTP Basic username.")] - password: Annotated[str, Doc("The HTTP Basic password.")] - - -class HTTPAuthorizationCredentials(BaseModel): - """ - The HTTP authorization credentials in the result of using `HTTPBearer` or - `HTTPDigest` in a dependency. - - The HTTP authorization header value is split by the first space. - - The first part is the `scheme`, the second part is the `credentials`. - - For example, in an HTTP Bearer token scheme, the client will send a header - like: - - ``` - Authorization: Bearer deadbeef12346 - ``` - - In this case: - - * `scheme` will have the value `"Bearer"` - * `credentials` will have the value `"deadbeef12346"` - """ - - scheme: Annotated[ - str, - Doc( - """ - The HTTP authorization scheme extracted from the header value. - """ - ), - ] - credentials: Annotated[ - str, - Doc( - """ - The HTTP authorization credentials extracted from the header value. - """ - ), - ] - - -class HTTPBase(SecurityBase): - def __init__( - self, - *, - scheme: str, - scheme_name: Optional[str] = None, - description: Optional[str] = None, - auto_error: bool = True, - ): - self.model = HTTPBaseModel(scheme=scheme, description=description) - self.scheme_name = scheme_name or self.__class__.__name__ - self.auto_error = auto_error - - async def __call__( - self, request: Request - ) -> Optional[HTTPAuthorizationCredentials]: - authorization = request.headers.get("Authorization") - scheme, credentials = get_authorization_scheme_param(authorization) - if not (authorization and scheme and credentials): - if self.auto_error: - raise HTTPException( - status_code=HTTP_403_FORBIDDEN, detail="Not authenticated" - ) - else: - return None - return HTTPAuthorizationCredentials(scheme=scheme, credentials=credentials) - - -class HTTPBasic(HTTPBase): - """ - HTTP Basic authentication. - - ## Usage - - Create an instance object and use that object as the dependency in `Depends()`. - - The dependency result will be an `HTTPBasicCredentials` object containing the - `username` and the `password`. - - Read more about it in the - [FastAPI docs for HTTP Basic Auth](https://fastapi.tiangolo.com/advanced/security/http-basic-auth/). - - ## Example - - ```python - from typing import Annotated - - from fastapi import Depends, FastAPI - from fastapi.security import HTTPBasic, HTTPBasicCredentials - - app = FastAPI() - - security = HTTPBasic() - - - @app.get("/users/me") - def read_current_user(credentials: Annotated[HTTPBasicCredentials, Depends(security)]): - return {"username": credentials.username, "password": credentials.password} - ``` - """ - - def __init__( - self, - *, - scheme_name: Annotated[ - Optional[str], - Doc( - """ - Security scheme name. - - It will be included in the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - realm: Annotated[ - Optional[str], - Doc( - """ - HTTP Basic authentication realm. - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - Security scheme description. - - It will be included in the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - auto_error: Annotated[ - bool, - Doc( - """ - By default, if the HTTP Basic authentication is not provided (a - header), `HTTPBasic` will automatically cancel the request and send the - client an error. - - If `auto_error` is set to `False`, when the HTTP Basic authentication - is not available, instead of erroring out, the dependency result will - be `None`. - - This is useful when you want to have optional authentication. - - It is also useful when you want to have authentication that can be - provided in one of multiple optional ways (for example, in HTTP Basic - authentication or in an HTTP Bearer token). - """ - ), - ] = True, - ): - self.model = HTTPBaseModel(scheme="basic", description=description) - self.scheme_name = scheme_name or self.__class__.__name__ - self.realm = realm - self.auto_error = auto_error - - async def __call__( # type: ignore - self, request: Request - ) -> Optional[HTTPBasicCredentials]: - authorization = request.headers.get("Authorization") - scheme, param = get_authorization_scheme_param(authorization) - if self.realm: - unauthorized_headers = {"WWW-Authenticate": f'Basic realm="{self.realm}"'} - else: - unauthorized_headers = {"WWW-Authenticate": "Basic"} - if not authorization or scheme.lower() != "basic": - if self.auto_error: - raise HTTPException( - status_code=HTTP_401_UNAUTHORIZED, - detail="Not authenticated", - headers=unauthorized_headers, - ) - else: - return None - invalid_user_credentials_exc = HTTPException( - status_code=HTTP_401_UNAUTHORIZED, - detail="Invalid authentication credentials", - headers=unauthorized_headers, - ) - try: - data = b64decode(param).decode("ascii") - except (ValueError, UnicodeDecodeError, binascii.Error): - raise invalid_user_credentials_exc # noqa: B904 - username, separator, password = data.partition(":") - if not separator: - raise invalid_user_credentials_exc - return HTTPBasicCredentials(username=username, password=password) - - -class HTTPBearer(HTTPBase): - """ - HTTP Bearer token authentication. - - ## Usage - - Create an instance object and use that object as the dependency in `Depends()`. - - The dependency result will be an `HTTPAuthorizationCredentials` object containing - the `scheme` and the `credentials`. - - ## Example - - ```python - from typing import Annotated - - from fastapi import Depends, FastAPI - from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer - - app = FastAPI() - - security = HTTPBearer() - - - @app.get("/users/me") - def read_current_user( - credentials: Annotated[HTTPAuthorizationCredentials, Depends(security)] - ): - return {"scheme": credentials.scheme, "credentials": credentials.credentials} - ``` - """ - - def __init__( - self, - *, - bearerFormat: Annotated[Optional[str], Doc("Bearer token format.")] = None, - scheme_name: Annotated[ - Optional[str], - Doc( - """ - Security scheme name. - - It will be included in the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - Security scheme description. - - It will be included in the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - auto_error: Annotated[ - bool, - Doc( - """ - By default, if the HTTP Bearer token is not provided (in an - `Authorization` header), `HTTPBearer` will automatically cancel the - request and send the client an error. - - If `auto_error` is set to `False`, when the HTTP Bearer token - is not available, instead of erroring out, the dependency result will - be `None`. - - This is useful when you want to have optional authentication. - - It is also useful when you want to have authentication that can be - provided in one of multiple optional ways (for example, in an HTTP - Bearer token or in a cookie). - """ - ), - ] = True, - ): - self.model = HTTPBearerModel(bearerFormat=bearerFormat, description=description) - self.scheme_name = scheme_name or self.__class__.__name__ - self.auto_error = auto_error - - async def __call__( - self, request: Request - ) -> Optional[HTTPAuthorizationCredentials]: - authorization = request.headers.get("Authorization") - scheme, credentials = get_authorization_scheme_param(authorization) - if not (authorization and scheme and credentials): - if self.auto_error: - raise HTTPException( - status_code=HTTP_403_FORBIDDEN, detail="Not authenticated" - ) - else: - return None - if scheme.lower() != "bearer": - if self.auto_error: - raise HTTPException( - status_code=HTTP_403_FORBIDDEN, - detail="Invalid authentication credentials", - ) - else: - return None - return HTTPAuthorizationCredentials(scheme=scheme, credentials=credentials) - - -class HTTPDigest(HTTPBase): - """ - HTTP Digest authentication. - - ## Usage - - Create an instance object and use that object as the dependency in `Depends()`. - - The dependency result will be an `HTTPAuthorizationCredentials` object containing - the `scheme` and the `credentials`. - - ## Example - - ```python - from typing import Annotated - - from fastapi import Depends, FastAPI - from fastapi.security import HTTPAuthorizationCredentials, HTTPDigest - - app = FastAPI() - - security = HTTPDigest() - - - @app.get("/users/me") - def read_current_user( - credentials: Annotated[HTTPAuthorizationCredentials, Depends(security)] - ): - return {"scheme": credentials.scheme, "credentials": credentials.credentials} - ``` - """ - - def __init__( - self, - *, - scheme_name: Annotated[ - Optional[str], - Doc( - """ - Security scheme name. - - It will be included in the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - Security scheme description. - - It will be included in the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - auto_error: Annotated[ - bool, - Doc( - """ - By default, if the HTTP Digest is not provided, `HTTPDigest` will - automatically cancel the request and send the client an error. - - If `auto_error` is set to `False`, when the HTTP Digest is not - available, instead of erroring out, the dependency result will - be `None`. - - This is useful when you want to have optional authentication. - - It is also useful when you want to have authentication that can be - provided in one of multiple optional ways (for example, in HTTP - Digest or in a cookie). - """ - ), - ] = True, - ): - self.model = HTTPBaseModel(scheme="digest", description=description) - self.scheme_name = scheme_name or self.__class__.__name__ - self.auto_error = auto_error - - async def __call__( - self, request: Request - ) -> Optional[HTTPAuthorizationCredentials]: - authorization = request.headers.get("Authorization") - scheme, credentials = get_authorization_scheme_param(authorization) - if not (authorization and scheme and credentials): - if self.auto_error: - raise HTTPException( - status_code=HTTP_403_FORBIDDEN, detail="Not authenticated" - ) - else: - return None - if scheme.lower() != "digest": - if self.auto_error: - raise HTTPException( - status_code=HTTP_403_FORBIDDEN, - detail="Invalid authentication credentials", - ) - else: - return None - return HTTPAuthorizationCredentials(scheme=scheme, credentials=credentials) diff --git a/venv/lib/python3.11/site-packages/fastapi/security/oauth2.py b/venv/lib/python3.11/site-packages/fastapi/security/oauth2.py deleted file mode 100644 index 5ffad59..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/security/oauth2.py +++ /dev/null @@ -1,638 +0,0 @@ -from typing import Any, Dict, List, Optional, Union, cast - -from fastapi.exceptions import HTTPException -from fastapi.openapi.models import OAuth2 as OAuth2Model -from fastapi.openapi.models import OAuthFlows as OAuthFlowsModel -from fastapi.param_functions import Form -from fastapi.security.base import SecurityBase -from fastapi.security.utils import get_authorization_scheme_param -from starlette.requests import Request -from starlette.status import HTTP_401_UNAUTHORIZED, HTTP_403_FORBIDDEN - -# TODO: import from typing when deprecating Python 3.9 -from typing_extensions import Annotated, Doc - - -class OAuth2PasswordRequestForm: - """ - This is a dependency class to collect the `username` and `password` as form data - for an OAuth2 password flow. - - The OAuth2 specification dictates that for a password flow the data should be - collected using form data (instead of JSON) and that it should have the specific - fields `username` and `password`. - - All the initialization parameters are extracted from the request. - - Read more about it in the - [FastAPI docs for Simple OAuth2 with Password and Bearer](https://fastapi.tiangolo.com/tutorial/security/simple-oauth2/). - - ## Example - - ```python - from typing import Annotated - - from fastapi import Depends, FastAPI - from fastapi.security import OAuth2PasswordRequestForm - - app = FastAPI() - - - @app.post("/login") - def login(form_data: Annotated[OAuth2PasswordRequestForm, Depends()]): - data = {} - data["scopes"] = [] - for scope in form_data.scopes: - data["scopes"].append(scope) - if form_data.client_id: - data["client_id"] = form_data.client_id - if form_data.client_secret: - data["client_secret"] = form_data.client_secret - return data - ``` - - Note that for OAuth2 the scope `items:read` is a single scope in an opaque string. - You could have custom internal logic to separate it by colon characters (`:`) or - similar, and get the two parts `items` and `read`. Many applications do that to - group and organize permissions, you could do it as well in your application, just - know that that it is application specific, it's not part of the specification. - """ - - def __init__( - self, - *, - grant_type: Annotated[ - Union[str, None], - Form(pattern="^password$"), - Doc( - """ - The OAuth2 spec says it is required and MUST be the fixed string - "password". Nevertheless, this dependency class is permissive and - allows not passing it. If you want to enforce it, use instead the - `OAuth2PasswordRequestFormStrict` dependency. - """ - ), - ] = None, - username: Annotated[ - str, - Form(), - Doc( - """ - `username` string. The OAuth2 spec requires the exact field name - `username`. - """ - ), - ], - password: Annotated[ - str, - Form(), - Doc( - """ - `password` string. The OAuth2 spec requires the exact field name - `password". - """ - ), - ], - scope: Annotated[ - str, - Form(), - Doc( - """ - A single string with actually several scopes separated by spaces. Each - scope is also a string. - - For example, a single string with: - - ```python - "items:read items:write users:read profile openid" - ```` - - would represent the scopes: - - * `items:read` - * `items:write` - * `users:read` - * `profile` - * `openid` - """ - ), - ] = "", - client_id: Annotated[ - Union[str, None], - Form(), - Doc( - """ - If there's a `client_id`, it can be sent as part of the form fields. - But the OAuth2 specification recommends sending the `client_id` and - `client_secret` (if any) using HTTP Basic auth. - """ - ), - ] = None, - client_secret: Annotated[ - Union[str, None], - Form(), - Doc( - """ - If there's a `client_password` (and a `client_id`), they can be sent - as part of the form fields. But the OAuth2 specification recommends - sending the `client_id` and `client_secret` (if any) using HTTP Basic - auth. - """ - ), - ] = None, - ): - self.grant_type = grant_type - self.username = username - self.password = password - self.scopes = scope.split() - self.client_id = client_id - self.client_secret = client_secret - - -class OAuth2PasswordRequestFormStrict(OAuth2PasswordRequestForm): - """ - This is a dependency class to collect the `username` and `password` as form data - for an OAuth2 password flow. - - The OAuth2 specification dictates that for a password flow the data should be - collected using form data (instead of JSON) and that it should have the specific - fields `username` and `password`. - - All the initialization parameters are extracted from the request. - - The only difference between `OAuth2PasswordRequestFormStrict` and - `OAuth2PasswordRequestForm` is that `OAuth2PasswordRequestFormStrict` requires the - client to send the form field `grant_type` with the value `"password"`, which - is required in the OAuth2 specification (it seems that for no particular reason), - while for `OAuth2PasswordRequestForm` `grant_type` is optional. - - Read more about it in the - [FastAPI docs for Simple OAuth2 with Password and Bearer](https://fastapi.tiangolo.com/tutorial/security/simple-oauth2/). - - ## Example - - ```python - from typing import Annotated - - from fastapi import Depends, FastAPI - from fastapi.security import OAuth2PasswordRequestForm - - app = FastAPI() - - - @app.post("/login") - def login(form_data: Annotated[OAuth2PasswordRequestFormStrict, Depends()]): - data = {} - data["scopes"] = [] - for scope in form_data.scopes: - data["scopes"].append(scope) - if form_data.client_id: - data["client_id"] = form_data.client_id - if form_data.client_secret: - data["client_secret"] = form_data.client_secret - return data - ``` - - Note that for OAuth2 the scope `items:read` is a single scope in an opaque string. - You could have custom internal logic to separate it by colon characters (`:`) or - similar, and get the two parts `items` and `read`. Many applications do that to - group and organize permissions, you could do it as well in your application, just - know that that it is application specific, it's not part of the specification. - - - grant_type: the OAuth2 spec says it is required and MUST be the fixed string "password". - This dependency is strict about it. If you want to be permissive, use instead the - OAuth2PasswordRequestForm dependency class. - username: username string. The OAuth2 spec requires the exact field name "username". - password: password string. The OAuth2 spec requires the exact field name "password". - scope: Optional string. Several scopes (each one a string) separated by spaces. E.g. - "items:read items:write users:read profile openid" - client_id: optional string. OAuth2 recommends sending the client_id and client_secret (if any) - using HTTP Basic auth, as: client_id:client_secret - client_secret: optional string. OAuth2 recommends sending the client_id and client_secret (if any) - using HTTP Basic auth, as: client_id:client_secret - """ - - def __init__( - self, - grant_type: Annotated[ - str, - Form(pattern="^password$"), - Doc( - """ - The OAuth2 spec says it is required and MUST be the fixed string - "password". This dependency is strict about it. If you want to be - permissive, use instead the `OAuth2PasswordRequestForm` dependency - class. - """ - ), - ], - username: Annotated[ - str, - Form(), - Doc( - """ - `username` string. The OAuth2 spec requires the exact field name - `username`. - """ - ), - ], - password: Annotated[ - str, - Form(), - Doc( - """ - `password` string. The OAuth2 spec requires the exact field name - `password". - """ - ), - ], - scope: Annotated[ - str, - Form(), - Doc( - """ - A single string with actually several scopes separated by spaces. Each - scope is also a string. - - For example, a single string with: - - ```python - "items:read items:write users:read profile openid" - ```` - - would represent the scopes: - - * `items:read` - * `items:write` - * `users:read` - * `profile` - * `openid` - """ - ), - ] = "", - client_id: Annotated[ - Union[str, None], - Form(), - Doc( - """ - If there's a `client_id`, it can be sent as part of the form fields. - But the OAuth2 specification recommends sending the `client_id` and - `client_secret` (if any) using HTTP Basic auth. - """ - ), - ] = None, - client_secret: Annotated[ - Union[str, None], - Form(), - Doc( - """ - If there's a `client_password` (and a `client_id`), they can be sent - as part of the form fields. But the OAuth2 specification recommends - sending the `client_id` and `client_secret` (if any) using HTTP Basic - auth. - """ - ), - ] = None, - ): - super().__init__( - grant_type=grant_type, - username=username, - password=password, - scope=scope, - client_id=client_id, - client_secret=client_secret, - ) - - -class OAuth2(SecurityBase): - """ - This is the base class for OAuth2 authentication, an instance of it would be used - as a dependency. All other OAuth2 classes inherit from it and customize it for - each OAuth2 flow. - - You normally would not create a new class inheriting from it but use one of the - existing subclasses, and maybe compose them if you want to support multiple flows. - - Read more about it in the - [FastAPI docs for Security](https://fastapi.tiangolo.com/tutorial/security/). - """ - - def __init__( - self, - *, - flows: Annotated[ - Union[OAuthFlowsModel, Dict[str, Dict[str, Any]]], - Doc( - """ - The dictionary of OAuth2 flows. - """ - ), - ] = OAuthFlowsModel(), - scheme_name: Annotated[ - Optional[str], - Doc( - """ - Security scheme name. - - It will be included in the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - Security scheme description. - - It will be included in the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - auto_error: Annotated[ - bool, - Doc( - """ - By default, if no HTTP Authorization header is provided, required for - OAuth2 authentication, it will automatically cancel the request and - send the client an error. - - If `auto_error` is set to `False`, when the HTTP Authorization header - is not available, instead of erroring out, the dependency result will - be `None`. - - This is useful when you want to have optional authentication. - - It is also useful when you want to have authentication that can be - provided in one of multiple optional ways (for example, with OAuth2 - or in a cookie). - """ - ), - ] = True, - ): - self.model = OAuth2Model( - flows=cast(OAuthFlowsModel, flows), description=description - ) - self.scheme_name = scheme_name or self.__class__.__name__ - self.auto_error = auto_error - - async def __call__(self, request: Request) -> Optional[str]: - authorization = request.headers.get("Authorization") - if not authorization: - if self.auto_error: - raise HTTPException( - status_code=HTTP_403_FORBIDDEN, detail="Not authenticated" - ) - else: - return None - return authorization - - -class OAuth2PasswordBearer(OAuth2): - """ - OAuth2 flow for authentication using a bearer token obtained with a password. - An instance of it would be used as a dependency. - - Read more about it in the - [FastAPI docs for Simple OAuth2 with Password and Bearer](https://fastapi.tiangolo.com/tutorial/security/simple-oauth2/). - """ - - def __init__( - self, - tokenUrl: Annotated[ - str, - Doc( - """ - The URL to obtain the OAuth2 token. This would be the *path operation* - that has `OAuth2PasswordRequestForm` as a dependency. - """ - ), - ], - scheme_name: Annotated[ - Optional[str], - Doc( - """ - Security scheme name. - - It will be included in the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - scopes: Annotated[ - Optional[Dict[str, str]], - Doc( - """ - The OAuth2 scopes that would be required by the *path operations* that - use this dependency. - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - Security scheme description. - - It will be included in the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - auto_error: Annotated[ - bool, - Doc( - """ - By default, if no HTTP Authorization header is provided, required for - OAuth2 authentication, it will automatically cancel the request and - send the client an error. - - If `auto_error` is set to `False`, when the HTTP Authorization header - is not available, instead of erroring out, the dependency result will - be `None`. - - This is useful when you want to have optional authentication. - - It is also useful when you want to have authentication that can be - provided in one of multiple optional ways (for example, with OAuth2 - or in a cookie). - """ - ), - ] = True, - ): - if not scopes: - scopes = {} - flows = OAuthFlowsModel( - password=cast(Any, {"tokenUrl": tokenUrl, "scopes": scopes}) - ) - super().__init__( - flows=flows, - scheme_name=scheme_name, - description=description, - auto_error=auto_error, - ) - - async def __call__(self, request: Request) -> Optional[str]: - authorization = request.headers.get("Authorization") - scheme, param = get_authorization_scheme_param(authorization) - if not authorization or scheme.lower() != "bearer": - if self.auto_error: - raise HTTPException( - status_code=HTTP_401_UNAUTHORIZED, - detail="Not authenticated", - headers={"WWW-Authenticate": "Bearer"}, - ) - else: - return None - return param - - -class OAuth2AuthorizationCodeBearer(OAuth2): - """ - OAuth2 flow for authentication using a bearer token obtained with an OAuth2 code - flow. An instance of it would be used as a dependency. - """ - - def __init__( - self, - authorizationUrl: str, - tokenUrl: Annotated[ - str, - Doc( - """ - The URL to obtain the OAuth2 token. - """ - ), - ], - refreshUrl: Annotated[ - Optional[str], - Doc( - """ - The URL to refresh the token and obtain a new one. - """ - ), - ] = None, - scheme_name: Annotated[ - Optional[str], - Doc( - """ - Security scheme name. - - It will be included in the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - scopes: Annotated[ - Optional[Dict[str, str]], - Doc( - """ - The OAuth2 scopes that would be required by the *path operations* that - use this dependency. - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - Security scheme description. - - It will be included in the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - auto_error: Annotated[ - bool, - Doc( - """ - By default, if no HTTP Authorization header is provided, required for - OAuth2 authentication, it will automatically cancel the request and - send the client an error. - - If `auto_error` is set to `False`, when the HTTP Authorization header - is not available, instead of erroring out, the dependency result will - be `None`. - - This is useful when you want to have optional authentication. - - It is also useful when you want to have authentication that can be - provided in one of multiple optional ways (for example, with OAuth2 - or in a cookie). - """ - ), - ] = True, - ): - if not scopes: - scopes = {} - flows = OAuthFlowsModel( - authorizationCode=cast( - Any, - { - "authorizationUrl": authorizationUrl, - "tokenUrl": tokenUrl, - "refreshUrl": refreshUrl, - "scopes": scopes, - }, - ) - ) - super().__init__( - flows=flows, - scheme_name=scheme_name, - description=description, - auto_error=auto_error, - ) - - async def __call__(self, request: Request) -> Optional[str]: - authorization = request.headers.get("Authorization") - scheme, param = get_authorization_scheme_param(authorization) - if not authorization or scheme.lower() != "bearer": - if self.auto_error: - raise HTTPException( - status_code=HTTP_401_UNAUTHORIZED, - detail="Not authenticated", - headers={"WWW-Authenticate": "Bearer"}, - ) - else: - return None # pragma: nocover - return param - - -class SecurityScopes: - """ - This is a special class that you can define in a parameter in a dependency to - obtain the OAuth2 scopes required by all the dependencies in the same chain. - - This way, multiple dependencies can have different scopes, even when used in the - same *path operation*. And with this, you can access all the scopes required in - all those dependencies in a single place. - - Read more about it in the - [FastAPI docs for OAuth2 scopes](https://fastapi.tiangolo.com/advanced/security/oauth2-scopes/). - """ - - def __init__( - self, - scopes: Annotated[ - Optional[List[str]], - Doc( - """ - This will be filled by FastAPI. - """ - ), - ] = None, - ): - self.scopes: Annotated[ - List[str], - Doc( - """ - The list of all the scopes required by dependencies. - """ - ), - ] = scopes or [] - self.scope_str: Annotated[ - str, - Doc( - """ - All the scopes required by all the dependencies in a single string - separated by spaces, as defined in the OAuth2 specification. - """ - ), - ] = " ".join(self.scopes) diff --git a/venv/lib/python3.11/site-packages/fastapi/security/open_id_connect_url.py b/venv/lib/python3.11/site-packages/fastapi/security/open_id_connect_url.py deleted file mode 100644 index c8cceb9..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/security/open_id_connect_url.py +++ /dev/null @@ -1,84 +0,0 @@ -from typing import Optional - -from fastapi.openapi.models import OpenIdConnect as OpenIdConnectModel -from fastapi.security.base import SecurityBase -from starlette.exceptions import HTTPException -from starlette.requests import Request -from starlette.status import HTTP_403_FORBIDDEN -from typing_extensions import Annotated, Doc - - -class OpenIdConnect(SecurityBase): - """ - OpenID Connect authentication class. An instance of it would be used as a - dependency. - """ - - def __init__( - self, - *, - openIdConnectUrl: Annotated[ - str, - Doc( - """ - The OpenID Connect URL. - """ - ), - ], - scheme_name: Annotated[ - Optional[str], - Doc( - """ - Security scheme name. - - It will be included in the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - description: Annotated[ - Optional[str], - Doc( - """ - Security scheme description. - - It will be included in the generated OpenAPI (e.g. visible at `/docs`). - """ - ), - ] = None, - auto_error: Annotated[ - bool, - Doc( - """ - By default, if no HTTP Authorization header is provided, required for - OpenID Connect authentication, it will automatically cancel the request - and send the client an error. - - If `auto_error` is set to `False`, when the HTTP Authorization header - is not available, instead of erroring out, the dependency result will - be `None`. - - This is useful when you want to have optional authentication. - - It is also useful when you want to have authentication that can be - provided in one of multiple optional ways (for example, with OpenID - Connect or in a cookie). - """ - ), - ] = True, - ): - self.model = OpenIdConnectModel( - openIdConnectUrl=openIdConnectUrl, description=description - ) - self.scheme_name = scheme_name or self.__class__.__name__ - self.auto_error = auto_error - - async def __call__(self, request: Request) -> Optional[str]: - authorization = request.headers.get("Authorization") - if not authorization: - if self.auto_error: - raise HTTPException( - status_code=HTTP_403_FORBIDDEN, detail="Not authenticated" - ) - else: - return None - return authorization diff --git a/venv/lib/python3.11/site-packages/fastapi/security/utils.py b/venv/lib/python3.11/site-packages/fastapi/security/utils.py deleted file mode 100644 index fa7a450..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/security/utils.py +++ /dev/null @@ -1,10 +0,0 @@ -from typing import Optional, Tuple - - -def get_authorization_scheme_param( - authorization_header_value: Optional[str], -) -> Tuple[str, str]: - if not authorization_header_value: - return "", "" - scheme, _, param = authorization_header_value.partition(" ") - return scheme, param diff --git a/venv/lib/python3.11/site-packages/fastapi/staticfiles.py b/venv/lib/python3.11/site-packages/fastapi/staticfiles.py deleted file mode 100644 index 299015d..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/staticfiles.py +++ /dev/null @@ -1 +0,0 @@ -from starlette.staticfiles import StaticFiles as StaticFiles # noqa diff --git a/venv/lib/python3.11/site-packages/fastapi/templating.py b/venv/lib/python3.11/site-packages/fastapi/templating.py deleted file mode 100644 index 0cb8684..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/templating.py +++ /dev/null @@ -1 +0,0 @@ -from starlette.templating import Jinja2Templates as Jinja2Templates # noqa diff --git a/venv/lib/python3.11/site-packages/fastapi/testclient.py b/venv/lib/python3.11/site-packages/fastapi/testclient.py deleted file mode 100644 index 4012406..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/testclient.py +++ /dev/null @@ -1 +0,0 @@ -from starlette.testclient import TestClient as TestClient # noqa diff --git a/venv/lib/python3.11/site-packages/fastapi/types.py b/venv/lib/python3.11/site-packages/fastapi/types.py deleted file mode 100644 index 3205654..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/types.py +++ /dev/null @@ -1,10 +0,0 @@ -import types -from enum import Enum -from typing import Any, Callable, Dict, Set, Type, TypeVar, Union - -from pydantic import BaseModel - -DecoratedCallable = TypeVar("DecoratedCallable", bound=Callable[..., Any]) -UnionType = getattr(types, "UnionType", Union) -ModelNameMap = Dict[Union[Type[BaseModel], Type[Enum]], str] -IncEx = Union[Set[int], Set[str], Dict[int, Any], Dict[str, Any]] diff --git a/venv/lib/python3.11/site-packages/fastapi/utils.py b/venv/lib/python3.11/site-packages/fastapi/utils.py deleted file mode 100644 index 4c7350f..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/utils.py +++ /dev/null @@ -1,220 +0,0 @@ -import re -import warnings -from dataclasses import is_dataclass -from typing import ( - TYPE_CHECKING, - Any, - Dict, - MutableMapping, - Optional, - Set, - Type, - Union, - cast, -) -from weakref import WeakKeyDictionary - -import fastapi -from fastapi._compat import ( - PYDANTIC_V2, - BaseConfig, - ModelField, - PydanticSchemaGenerationError, - Undefined, - UndefinedType, - Validator, - lenient_issubclass, -) -from fastapi.datastructures import DefaultPlaceholder, DefaultType -from pydantic import BaseModel, create_model -from pydantic.fields import FieldInfo -from typing_extensions import Literal - -if TYPE_CHECKING: # pragma: nocover - from .routing import APIRoute - -# Cache for `create_cloned_field` -_CLONED_TYPES_CACHE: MutableMapping[Type[BaseModel], Type[BaseModel]] = ( - WeakKeyDictionary() -) - - -def is_body_allowed_for_status_code(status_code: Union[int, str, None]) -> bool: - if status_code is None: - return True - # Ref: https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#patterned-fields-1 - if status_code in { - "default", - "1XX", - "2XX", - "3XX", - "4XX", - "5XX", - }: - return True - current_status_code = int(status_code) - return not (current_status_code < 200 or current_status_code in {204, 205, 304}) - - -def get_path_param_names(path: str) -> Set[str]: - return set(re.findall("{(.*?)}", path)) - - -def create_model_field( - name: str, - type_: Any, - class_validators: Optional[Dict[str, Validator]] = None, - default: Optional[Any] = Undefined, - required: Union[bool, UndefinedType] = Undefined, - model_config: Type[BaseConfig] = BaseConfig, - field_info: Optional[FieldInfo] = None, - alias: Optional[str] = None, - mode: Literal["validation", "serialization"] = "validation", -) -> ModelField: - class_validators = class_validators or {} - if PYDANTIC_V2: - field_info = field_info or FieldInfo( - annotation=type_, default=default, alias=alias - ) - else: - field_info = field_info or FieldInfo() - kwargs = {"name": name, "field_info": field_info} - if PYDANTIC_V2: - kwargs.update({"mode": mode}) - else: - kwargs.update( - { - "type_": type_, - "class_validators": class_validators, - "default": default, - "required": required, - "model_config": model_config, - "alias": alias, - } - ) - try: - return ModelField(**kwargs) # type: ignore[arg-type] - except (RuntimeError, PydanticSchemaGenerationError): - raise fastapi.exceptions.FastAPIError( - "Invalid args for response field! Hint: " - f"check that {type_} is a valid Pydantic field type. " - "If you are using a return type annotation that is not a valid Pydantic " - "field (e.g. Union[Response, dict, None]) you can disable generating the " - "response model from the type annotation with the path operation decorator " - "parameter response_model=None. Read more: " - "https://fastapi.tiangolo.com/tutorial/response-model/" - ) from None - - -def create_cloned_field( - field: ModelField, - *, - cloned_types: Optional[MutableMapping[Type[BaseModel], Type[BaseModel]]] = None, -) -> ModelField: - if PYDANTIC_V2: - return field - # cloned_types caches already cloned types to support recursive models and improve - # performance by avoiding unnecessary cloning - if cloned_types is None: - cloned_types = _CLONED_TYPES_CACHE - - original_type = field.type_ - if is_dataclass(original_type) and hasattr(original_type, "__pydantic_model__"): - original_type = original_type.__pydantic_model__ - use_type = original_type - if lenient_issubclass(original_type, BaseModel): - original_type = cast(Type[BaseModel], original_type) - use_type = cloned_types.get(original_type) - if use_type is None: - use_type = create_model(original_type.__name__, __base__=original_type) - cloned_types[original_type] = use_type - for f in original_type.__fields__.values(): - use_type.__fields__[f.name] = create_cloned_field( - f, cloned_types=cloned_types - ) - new_field = create_model_field(name=field.name, type_=use_type) - new_field.has_alias = field.has_alias # type: ignore[attr-defined] - new_field.alias = field.alias # type: ignore[misc] - new_field.class_validators = field.class_validators # type: ignore[attr-defined] - new_field.default = field.default # type: ignore[misc] - new_field.required = field.required # type: ignore[misc] - new_field.model_config = field.model_config # type: ignore[attr-defined] - new_field.field_info = field.field_info - new_field.allow_none = field.allow_none # type: ignore[attr-defined] - new_field.validate_always = field.validate_always # type: ignore[attr-defined] - if field.sub_fields: # type: ignore[attr-defined] - new_field.sub_fields = [ # type: ignore[attr-defined] - create_cloned_field(sub_field, cloned_types=cloned_types) - for sub_field in field.sub_fields # type: ignore[attr-defined] - ] - if field.key_field: # type: ignore[attr-defined] - new_field.key_field = create_cloned_field( # type: ignore[attr-defined] - field.key_field, # type: ignore[attr-defined] - cloned_types=cloned_types, - ) - new_field.validators = field.validators # type: ignore[attr-defined] - new_field.pre_validators = field.pre_validators # type: ignore[attr-defined] - new_field.post_validators = field.post_validators # type: ignore[attr-defined] - new_field.parse_json = field.parse_json # type: ignore[attr-defined] - new_field.shape = field.shape # type: ignore[attr-defined] - new_field.populate_validators() # type: ignore[attr-defined] - return new_field - - -def generate_operation_id_for_path( - *, name: str, path: str, method: str -) -> str: # pragma: nocover - warnings.warn( - "fastapi.utils.generate_operation_id_for_path() was deprecated, " - "it is not used internally, and will be removed soon", - DeprecationWarning, - stacklevel=2, - ) - operation_id = f"{name}{path}" - operation_id = re.sub(r"\W", "_", operation_id) - operation_id = f"{operation_id}_{method.lower()}" - return operation_id - - -def generate_unique_id(route: "APIRoute") -> str: - operation_id = f"{route.name}{route.path_format}" - operation_id = re.sub(r"\W", "_", operation_id) - assert route.methods - operation_id = f"{operation_id}_{list(route.methods)[0].lower()}" - return operation_id - - -def deep_dict_update(main_dict: Dict[Any, Any], update_dict: Dict[Any, Any]) -> None: - for key, value in update_dict.items(): - if ( - key in main_dict - and isinstance(main_dict[key], dict) - and isinstance(value, dict) - ): - deep_dict_update(main_dict[key], value) - elif ( - key in main_dict - and isinstance(main_dict[key], list) - and isinstance(update_dict[key], list) - ): - main_dict[key] = main_dict[key] + update_dict[key] - else: - main_dict[key] = value - - -def get_value_or_default( - first_item: Union[DefaultPlaceholder, DefaultType], - *extra_items: Union[DefaultPlaceholder, DefaultType], -) -> Union[DefaultPlaceholder, DefaultType]: - """ - Pass items or `DefaultPlaceholder`s by descending priority. - - The first one to _not_ be a `DefaultPlaceholder` will be returned. - - Otherwise, the first item (a `DefaultPlaceholder`) will be returned. - """ - items = (first_item,) + extra_items - for item in items: - if not isinstance(item, DefaultPlaceholder): - return item - return first_item diff --git a/venv/lib/python3.11/site-packages/fastapi/websockets.py b/venv/lib/python3.11/site-packages/fastapi/websockets.py deleted file mode 100644 index 55a4ac4..0000000 --- a/venv/lib/python3.11/site-packages/fastapi/websockets.py +++ /dev/null @@ -1,3 +0,0 @@ -from starlette.websockets import WebSocket as WebSocket # noqa -from starlette.websockets import WebSocketDisconnect as WebSocketDisconnect # noqa -from starlette.websockets import WebSocketState as WebSocketState # noqa diff --git a/venv/lib/python3.11/site-packages/h11-0.14.0.dist-info/INSTALLER b/venv/lib/python3.11/site-packages/h11-0.14.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.11/site-packages/h11-0.14.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.11/site-packages/h11-0.14.0.dist-info/LICENSE.txt b/venv/lib/python3.11/site-packages/h11-0.14.0.dist-info/LICENSE.txt deleted file mode 100644 index 8f080ea..0000000 --- a/venv/lib/python3.11/site-packages/h11-0.14.0.dist-info/LICENSE.txt +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Nathaniel J. Smith and other contributors - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/h11-0.14.0.dist-info/METADATA b/venv/lib/python3.11/site-packages/h11-0.14.0.dist-info/METADATA deleted file mode 100644 index cf12a82..0000000 --- a/venv/lib/python3.11/site-packages/h11-0.14.0.dist-info/METADATA +++ /dev/null @@ -1,193 +0,0 @@ -Metadata-Version: 2.1 -Name: h11 -Version: 0.14.0 -Summary: A pure-Python, bring-your-own-I/O implementation of HTTP/1.1 -Home-page: https://github.com/python-hyper/h11 -Author: Nathaniel J. Smith -Author-email: njs@pobox.com -License: MIT -Classifier: Development Status :: 3 - Alpha -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Topic :: Internet :: WWW/HTTP -Classifier: Topic :: System :: Networking -Requires-Python: >=3.7 -License-File: LICENSE.txt -Requires-Dist: typing-extensions ; python_version < "3.8" - -h11 -=== - -.. image:: https://travis-ci.org/python-hyper/h11.svg?branch=master - :target: https://travis-ci.org/python-hyper/h11 - :alt: Automated test status - -.. image:: https://codecov.io/gh/python-hyper/h11/branch/master/graph/badge.svg - :target: https://codecov.io/gh/python-hyper/h11 - :alt: Test coverage - -.. image:: https://readthedocs.org/projects/h11/badge/?version=latest - :target: http://h11.readthedocs.io/en/latest/?badge=latest - :alt: Documentation Status - -This is a little HTTP/1.1 library written from scratch in Python, -heavily inspired by `hyper-h2 `_. - -It's a "bring-your-own-I/O" library; h11 contains no IO code -whatsoever. This means you can hook h11 up to your favorite network -API, and that could be anything you want: synchronous, threaded, -asynchronous, or your own implementation of `RFC 6214 -`_ -- h11 won't judge you. -(Compare this to the current state of the art, where every time a `new -network API `_ comes along then someone -gets to start over reimplementing the entire HTTP protocol from -scratch.) Cory Benfield made an `excellent blog post describing the -benefits of this approach -`_, or if you like video -then here's his `PyCon 2016 talk on the same theme -`_. - -This also means that h11 is not immediately useful out of the box: -it's a toolkit for building programs that speak HTTP, not something -that could directly replace ``requests`` or ``twisted.web`` or -whatever. But h11 makes it much easier to implement something like -``requests`` or ``twisted.web``. - -At a high level, working with h11 goes like this: - -1) First, create an ``h11.Connection`` object to track the state of a - single HTTP/1.1 connection. - -2) When you read data off the network, pass it to - ``conn.receive_data(...)``; you'll get back a list of objects - representing high-level HTTP "events". - -3) When you want to send a high-level HTTP event, create the - corresponding "event" object and pass it to ``conn.send(...)``; - this will give you back some bytes that you can then push out - through the network. - -For example, a client might instantiate and then send a -``h11.Request`` object, then zero or more ``h11.Data`` objects for the -request body (e.g., if this is a POST), and then a -``h11.EndOfMessage`` to indicate the end of the message. Then the -server would then send back a ``h11.Response``, some ``h11.Data``, and -its own ``h11.EndOfMessage``. If either side violates the protocol, -you'll get a ``h11.ProtocolError`` exception. - -h11 is suitable for implementing both servers and clients, and has a -pleasantly symmetric API: the events you send as a client are exactly -the ones that you receive as a server and vice-versa. - -`Here's an example of a tiny HTTP client -`_ - -It also has `a fine manual `_. - -FAQ ---- - -*Whyyyyy?* - -I wanted to play with HTTP in `Curio -`__ and `Trio -`__, which at the time didn't have any -HTTP libraries. So I thought, no big deal, Python has, like, a dozen -different implementations of HTTP, surely I can find one that's -reusable. I didn't find one, but I did find Cory's call-to-arms -blog-post. So I figured, well, fine, if I have to implement HTTP from -scratch, at least I can make sure no-one *else* has to ever again. - -*Should I use it?* - -Maybe. You should be aware that it's a very young project. But, it's -feature complete and has an exhaustive test-suite and complete docs, -so the next step is for people to try using it and see how it goes -:-). If you do then please let us know -- if nothing else we'll want -to talk to you before making any incompatible changes! - -*What are the features/limitations?* - -Roughly speaking, it's trying to be a robust, complete, and non-hacky -implementation of the first "chapter" of the HTTP/1.1 spec: `RFC 7230: -HTTP/1.1 Message Syntax and Routing -`_. That is, it mostly focuses on -implementing HTTP at the level of taking bytes on and off the wire, -and the headers related to that, and tries to be anal about spec -conformance. It doesn't know about higher-level concerns like URL -routing, conditional GETs, cross-origin cookie policies, or content -negotiation. But it does know how to take care of framing, -cross-version differences in keep-alive handling, and the "obsolete -line folding" rule, so you can focus your energies on the hard / -interesting parts for your application, and it tries to support the -full specification in the sense that any useful HTTP/1.1 conformant -application should be able to use h11. - -It's pure Python, and has no dependencies outside of the standard -library. - -It has a test suite with 100.0% coverage for both statements and -branches. - -Currently it supports Python 3 (testing on 3.7-3.10) and PyPy 3. -The last Python 2-compatible version was h11 0.11.x. -(Originally it had a Cython wrapper for `http-parser -`_ and a beautiful nested state -machine implemented with ``yield from`` to postprocess the output. But -I had to take these out -- the new *parser* needs fewer lines-of-code -than the old *parser wrapper*, is written in pure Python, uses no -exotic language syntax, and has more features. It's sad, really; that -old state machine was really slick. I just need a few sentences here -to mourn that.) - -I don't know how fast it is. I haven't benchmarked or profiled it yet, -so it's probably got a few pointless hot spots, and I've been trying -to err on the side of simplicity and robustness instead of -micro-optimization. But at the architectural level I tried hard to -avoid fundamentally bad decisions, e.g., I believe that all the -parsing algorithms remain linear-time even in the face of pathological -input like slowloris, and there are no byte-by-byte loops. (I also -believe that it maintains bounded memory usage in the face of -arbitrary/pathological input.) - -The whole library is ~800 lines-of-code. You can read and understand -the whole thing in less than an hour. Most of the energy invested in -this so far has been spent on trying to keep things simple by -minimizing special-cases and ad hoc state manipulation; even though it -is now quite small and simple, I'm still annoyed that I haven't -figured out how to make it even smaller and simpler. (Unfortunately, -HTTP does not lend itself to simplicity.) - -The API is ~feature complete and I don't expect the general outlines -to change much, but you can't judge an API's ergonomics until you -actually document and use it, so I'd expect some changes in the -details. - -*How do I try it?* - -.. code-block:: sh - - $ pip install h11 - $ git clone git@github.com:python-hyper/h11 - $ cd h11/examples - $ python basic-client.py - -and go from there. - -*License?* - -MIT - -*Code of conduct?* - -Contributors are requested to follow our `code of conduct -`_ in -all project spaces. diff --git a/venv/lib/python3.11/site-packages/h11-0.14.0.dist-info/RECORD b/venv/lib/python3.11/site-packages/h11-0.14.0.dist-info/RECORD deleted file mode 100644 index a055008..0000000 --- a/venv/lib/python3.11/site-packages/h11-0.14.0.dist-info/RECORD +++ /dev/null @@ -1,52 +0,0 @@ -h11-0.14.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -h11-0.14.0.dist-info/LICENSE.txt,sha256=N9tbuFkm2yikJ6JYZ_ELEjIAOuob5pzLhRE4rbjm82E,1124 -h11-0.14.0.dist-info/METADATA,sha256=B7pZ0m7WBXNs17vl6hUH9bJTL9s37DaGvY31w7jNxSg,8175 -h11-0.14.0.dist-info/RECORD,, -h11-0.14.0.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92 -h11-0.14.0.dist-info/top_level.txt,sha256=F7dC4jl3zeh8TGHEPaWJrMbeuoWbS379Gwdi-Yvdcis,4 -h11/__init__.py,sha256=iO1KzkSO42yZ6ffg-VMgbx_ZVTWGUY00nRYEWn-s3kY,1507 -h11/__pycache__/__init__.cpython-311.pyc,, -h11/__pycache__/_abnf.cpython-311.pyc,, -h11/__pycache__/_connection.cpython-311.pyc,, -h11/__pycache__/_events.cpython-311.pyc,, -h11/__pycache__/_headers.cpython-311.pyc,, -h11/__pycache__/_readers.cpython-311.pyc,, -h11/__pycache__/_receivebuffer.cpython-311.pyc,, -h11/__pycache__/_state.cpython-311.pyc,, -h11/__pycache__/_util.cpython-311.pyc,, -h11/__pycache__/_version.cpython-311.pyc,, -h11/__pycache__/_writers.cpython-311.pyc,, -h11/_abnf.py,sha256=ybixr0xsupnkA6GFAyMubuXF6Tc1lb_hF890NgCsfNc,4815 -h11/_connection.py,sha256=eS2sorMD0zKLCFiB9lW9W9F_Nzny2tjHa4e6s1ujr1c,26539 -h11/_events.py,sha256=LEfuvg1AbhHaVRwxCd0I-pFn9-ezUOaoL8o2Kvy1PBA,11816 -h11/_headers.py,sha256=RqB8cd8CN0blYPzcLe5qeCh-phv6D1U_CHj4hs67lgQ,10230 -h11/_readers.py,sha256=EbSed0jzwVUiD1nOPAeUcVE4Flf3wXkxfb8c06-OTBM,8383 -h11/_receivebuffer.py,sha256=xrspsdsNgWFxRfQcTXxR8RrdjRXXTK0Io5cQYWpJ1Ws,5252 -h11/_state.py,sha256=k1VL6SDbaPkSrZ-49ewCXDpuiUS69_46YhbWjuV1qEY,13300 -h11/_util.py,sha256=LWkkjXyJaFlAy6Lt39w73UStklFT5ovcvo0TkY7RYuk,4888 -h11/_version.py,sha256=LVyTdiZRzIIEv79UyOgbM5iUrJUllEzlCWaJEYBY1zc,686 -h11/_writers.py,sha256=oFKm6PtjeHfbj4RLX7VB7KDc1gIY53gXG3_HR9ltmTA,5081 -h11/py.typed,sha256=sow9soTwP9T_gEAQSVh7Gb8855h04Nwmhs2We-JRgZM,7 -h11/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -h11/tests/__pycache__/__init__.cpython-311.pyc,, -h11/tests/__pycache__/helpers.cpython-311.pyc,, -h11/tests/__pycache__/test_against_stdlib_http.cpython-311.pyc,, -h11/tests/__pycache__/test_connection.cpython-311.pyc,, -h11/tests/__pycache__/test_events.cpython-311.pyc,, -h11/tests/__pycache__/test_headers.cpython-311.pyc,, -h11/tests/__pycache__/test_helpers.cpython-311.pyc,, -h11/tests/__pycache__/test_io.cpython-311.pyc,, -h11/tests/__pycache__/test_receivebuffer.cpython-311.pyc,, -h11/tests/__pycache__/test_state.cpython-311.pyc,, -h11/tests/__pycache__/test_util.cpython-311.pyc,, -h11/tests/data/test-file,sha256=ZJ03Rqs98oJw29OHzJg7LlMzyGQaRAY0r3AqBeM2wVU,65 -h11/tests/helpers.py,sha256=a1EVG_p7xU4wRsa3tMPTRxuaKCmretok9sxXWvqfmQA,3355 -h11/tests/test_against_stdlib_http.py,sha256=cojCHgHXFQ8gWhNlEEwl3trmOpN-5uDukRoHnElqo3A,3995 -h11/tests/test_connection.py,sha256=ZbPLDPclKvjgjAhgk-WlCPBaf17c4XUIV2tpaW08jOI,38720 -h11/tests/test_events.py,sha256=LPVLbcV-NvPNK9fW3rraR6Bdpz1hAlsWubMtNaJ5gHg,4657 -h11/tests/test_headers.py,sha256=qd8T1Zenuz5GbD6wklSJ5G8VS7trrYgMV0jT-SMvqg8,5612 -h11/tests/test_helpers.py,sha256=kAo0CEM4LGqmyyP2ZFmhsyq3UFJqoFfAbzu3hbWreRM,794 -h11/tests/test_io.py,sha256=uCZVnjarkRBkudfC1ij-KSCQ71XWJhnkgkgWWkKgYPQ,16386 -h11/tests/test_receivebuffer.py,sha256=3jGbeJM36Akqg_pAhPb7XzIn2NS6RhPg-Ryg8Eu6ytk,3454 -h11/tests/test_state.py,sha256=rqll9WqFsJPE0zSrtCn9LH659mPKsDeXZ-DwXwleuBQ,8928 -h11/tests/test_util.py,sha256=VO5L4nSFe4pgtSwKuv6u_6l0H7UeizF5WKuHTWreg70,2970 diff --git a/venv/lib/python3.11/site-packages/h11-0.14.0.dist-info/WHEEL b/venv/lib/python3.11/site-packages/h11-0.14.0.dist-info/WHEEL deleted file mode 100644 index 5bad85f..0000000 --- a/venv/lib/python3.11/site-packages/h11-0.14.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.37.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv/lib/python3.11/site-packages/h11-0.14.0.dist-info/top_level.txt b/venv/lib/python3.11/site-packages/h11-0.14.0.dist-info/top_level.txt deleted file mode 100644 index 0d24def..0000000 --- a/venv/lib/python3.11/site-packages/h11-0.14.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -h11 diff --git a/venv/lib/python3.11/site-packages/h11/__init__.py b/venv/lib/python3.11/site-packages/h11/__init__.py deleted file mode 100644 index 989e92c..0000000 --- a/venv/lib/python3.11/site-packages/h11/__init__.py +++ /dev/null @@ -1,62 +0,0 @@ -# A highish-level implementation of the HTTP/1.1 wire protocol (RFC 7230), -# containing no networking code at all, loosely modelled on hyper-h2's generic -# implementation of HTTP/2 (and in particular the h2.connection.H2Connection -# class). There's still a bunch of subtle details you need to get right if you -# want to make this actually useful, because it doesn't implement all the -# semantics to check that what you're asking to write to the wire is sensible, -# but at least it gets you out of dealing with the wire itself. - -from h11._connection import Connection, NEED_DATA, PAUSED -from h11._events import ( - ConnectionClosed, - Data, - EndOfMessage, - Event, - InformationalResponse, - Request, - Response, -) -from h11._state import ( - CLIENT, - CLOSED, - DONE, - ERROR, - IDLE, - MIGHT_SWITCH_PROTOCOL, - MUST_CLOSE, - SEND_BODY, - SEND_RESPONSE, - SERVER, - SWITCHED_PROTOCOL, -) -from h11._util import LocalProtocolError, ProtocolError, RemoteProtocolError -from h11._version import __version__ - -PRODUCT_ID = "python-h11/" + __version__ - - -__all__ = ( - "Connection", - "NEED_DATA", - "PAUSED", - "ConnectionClosed", - "Data", - "EndOfMessage", - "Event", - "InformationalResponse", - "Request", - "Response", - "CLIENT", - "CLOSED", - "DONE", - "ERROR", - "IDLE", - "MUST_CLOSE", - "SEND_BODY", - "SEND_RESPONSE", - "SERVER", - "SWITCHED_PROTOCOL", - "ProtocolError", - "LocalProtocolError", - "RemoteProtocolError", -) diff --git a/venv/lib/python3.11/site-packages/h11/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/h11/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 140f82b7d13b723a36327f6653f49801d7d39111..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1308 zcmc(d&u`N(6vv(ZNZO=Xf354*G2k#Edf1|g(-1=1nut|un=0u*n1dBscdLk#lBAus z)BX!Mazp$#*t7lZ$H93TfOFot zc@o#g#Rq1*0|PJ+TtEaUkOWMSBuon2mvB=g4bwz~B9Wj(GB883FiT`869p>qoTQs0 zDpbh=Tp)RvCk0p_MOY*ySR!RuCW~;9RA7ZH!6j0K)p$+HT_!7Vh16h;tisjUmv--v zHMquX5wD#vRq*aWg7*d)8`QJkx!ih^$_?N1a6cOP9?fk=*e zp3rdp5D#cdcOr-83~yi#+c*rJ15DG#6nhb^G`*o85Qm3zTnmR|-wQF7Ec|wY!-!^X zTy=$tjaJj>^!VRoTd}Za$6$dh%d}{!skaPTX*Zwk^^pCd*=y{fu4VSjhS{QWd*AM% zcp1&wMn^}xrv8$uv1u80*X-B^6>YP7G}lXW@yK-rgH`U5*}3TZjUH<1R6@vcU4%Y? z3pNBUceSY#Xh%m!+Rz=1y$R7+8dJ?3z1FTu|7eqyJ{(1OW9;u0yySGD&3)o1nLsXP;xmBgvU-(a1U^e0t`NvHq- diff --git a/venv/lib/python3.11/site-packages/h11/__pycache__/_abnf.cpython-311.pyc b/venv/lib/python3.11/site-packages/h11/__pycache__/_abnf.cpython-311.pyc deleted file mode 100644 index 8494582be47083884ae73618b14a1b166ddc4917..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1813 zcma)+Pi)&%9LJv%+sz+4|5}!IWzf<=>XbC;DmJZjErpG)mr`ky%G_ketzQ$<)Csne zw$6-v1PP%bA;BaLLz-ACdH{*TKpcj|og8|od_!>KVre_=#LssBq_m%`Wu<-*!W%H zqkEqga#zKiF_+^@V@7nPxP56NSKPjWOGbF*ZgIO%C~74m(^{8tRT7$O6;U+qakU?wN|N*M%llHMyqDtUx8D;c6vR%bZV2zilOlcw?Vs8{YiKLeqr3bj>D(D63Zmo*m8p7ZX|bWv|; z!dgv&Vmb_y1MNIQ#i9mDLl*8V)GMl}fgYe&)V+5u_r920FS&x=yz$}ng?W&nHSy-9 zf@vDTx5u-7eQTA5vLR@)0k@p4-Ak6HeH(H--ty9&^~5ZyMP+dhap&wH$Zu16Z38QI zG`r=(1dPfX-BS;x7$xV9mdv6ioZM-W$)_3`@7 zi_r9DO=?u}j5-MM;4g`^-{9>834(AEs3&0sofHaZEXoO?Sg#dv-X%~tZBd7PLv55i zjJ;|_4-<3k#MFWNUWD;<{^|T53x6*7mc_!s_*gqOauCb5V^?78F7Gby-Pyn6TUOKw zkyM|9NQ!+9cl0@7k{Wi+VK|w7<$n1q`D?ku8AJr@Tttz$MIR z^joyUAdrH6?SSRl>}43c^SkqV3;PSc1sXGm?X|)V8KC+d6rhs-Cesc@QnZ^m?a(Ni X`YiJ~_XX$loH*UYEyiNh0qEiXN#hGP diff --git a/venv/lib/python3.11/site-packages/h11/__pycache__/_connection.cpython-311.pyc b/venv/lib/python3.11/site-packages/h11/__pycache__/_connection.cpython-311.pyc deleted file mode 100644 index 9eeb88b77a8a16c1c00ba1809141c5d78cfd0960..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24299 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 diff --git a/venv/lib/python3.11/site-packages/h11/__pycache__/_events.cpython-311.pyc b/venv/lib/python3.11/site-packages/h11/__pycache__/_events.cpython-311.pyc deleted file mode 100644 index 3b5a89fca41397ea4ccb87d5770942a5806a228e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15187 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 diff --git a/venv/lib/python3.11/site-packages/h11/__pycache__/_readers.cpython-311.pyc b/venv/lib/python3.11/site-packages/h11/__pycache__/_readers.cpython-311.pyc deleted file mode 100644 index a4a04cccd13fc7c11a3b6a443cc1d38cf15f9283..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10781 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 diff --git a/venv/lib/python3.11/site-packages/h11/__pycache__/_receivebuffer.cpython-311.pyc b/venv/lib/python3.11/site-packages/h11/__pycache__/_receivebuffer.cpython-311.pyc deleted file mode 100644 index 422a835902c2e8ee19d4956271a1053f4f563738..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5140 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 TB*VZ?cZUC@^ndL#OLhJ)KZ9>1 diff --git a/venv/lib/python3.11/site-packages/h11/__pycache__/_state.cpython-311.pyc b/venv/lib/python3.11/site-packages/h11/__pycache__/_state.cpython-311.pyc deleted file mode 100644 index 06f153330035ffa692f2b18e7e8d39e4883c7904..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9776 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 Cl-v9O diff --git a/venv/lib/python3.11/site-packages/h11/__pycache__/_util.cpython-311.pyc b/venv/lib/python3.11/site-packages/h11/__pycache__/_util.cpython-311.pyc deleted file mode 100644 index 3a37578804a77488a6efb3f1e9e52f079f8595c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5361 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 diff --git a/venv/lib/python3.11/site-packages/h11/__pycache__/_version.cpython-311.pyc b/venv/lib/python3.11/site-packages/h11/__pycache__/_version.cpython-311.pyc deleted file mode 100644 index c753d4ed170f7bed0e07e147ad3bd96ce99afe6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198 zcmZ3^%ge<81eOn9r>|pTV0aATzyKqZ@foCKIztLW6hjJQFoPyj6`O&cp^2V>pC;oi z?)dn!)S}|d{Ji-1l??m!;;F>E~o7=@(R%WaQ@= z>lqsA7iX5F>J}s>XD6no7VBpKMPMfB6;%G>u*uC&Da}c>D`Ep0335uY0Fd~=%*e?2 QL4ko^yn!18i&%hy0QZM8tN;K2 diff --git a/venv/lib/python3.11/site-packages/h11/__pycache__/_writers.cpython-311.pyc b/venv/lib/python3.11/site-packages/h11/__pycache__/_writers.cpython-311.pyc deleted file mode 100644 index e54831892ff77da3ee2327f47ce162f3cdb09d16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7298 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" - r":" - r"{OWS}" - r"(?P{field_value})" - r"{OWS}".format(**globals()) -) - -# https://svn.tools.ietf.org/svn/wg/httpbis/specs/rfc7230.html#request.line -# -# request-line = method SP request-target SP HTTP-version CRLF -# method = token -# HTTP-version = HTTP-name "/" DIGIT "." DIGIT -# HTTP-name = %x48.54.54.50 ; "HTTP", case-sensitive -# -# request-target is complicated (see RFC 7230 sec 5.3) -- could be path, full -# URL, host+port (for connect), or even "*", but in any case we are guaranteed -# that it contists of the visible printing characters. -method = token -request_target = r"{vchar}+".format(**globals()) -http_version = r"HTTP/(?P[0-9]\.[0-9])" -request_line = ( - r"(?P{method})" - r" " - r"(?P{request_target})" - r" " - r"{http_version}".format(**globals()) -) - -# https://svn.tools.ietf.org/svn/wg/httpbis/specs/rfc7230.html#status.line -# -# status-line = HTTP-version SP status-code SP reason-phrase CRLF -# status-code = 3DIGIT -# reason-phrase = *( HTAB / SP / VCHAR / obs-text ) -status_code = r"[0-9]{3}" -reason_phrase = r"([ \t]|{vchar_or_obs_text})*".format(**globals()) -status_line = ( - r"{http_version}" - r" " - r"(?P{status_code})" - # However, there are apparently a few too many servers out there that just - # leave out the reason phrase: - # https://github.com/scrapy/scrapy/issues/345#issuecomment-281756036 - # https://github.com/seanmonstar/httparse/issues/29 - # so make it optional. ?: is a non-capturing group. - r"(?: (?P{reason_phrase}))?".format(**globals()) -) - -HEXDIG = r"[0-9A-Fa-f]" -# Actually -# -# chunk-size = 1*HEXDIG -# -# but we impose an upper-limit to avoid ridiculosity. len(str(2**64)) == 20 -chunk_size = r"({HEXDIG}){{1,20}}".format(**globals()) -# Actually -# -# chunk-ext = *( ";" chunk-ext-name [ "=" chunk-ext-val ] ) -# -# but we aren't parsing the things so we don't really care. -chunk_ext = r";.*" -chunk_header = ( - r"(?P{chunk_size})" - r"(?P{chunk_ext})?" - r"{OWS}\r\n".format( - **globals() - ) # Even though the specification does not allow for extra whitespaces, - # we are lenient with trailing whitespaces because some servers on the wild use it. -) diff --git a/venv/lib/python3.11/site-packages/h11/_connection.py b/venv/lib/python3.11/site-packages/h11/_connection.py deleted file mode 100644 index d175270..0000000 --- a/venv/lib/python3.11/site-packages/h11/_connection.py +++ /dev/null @@ -1,633 +0,0 @@ -# This contains the main Connection class. Everything in h11 revolves around -# this. -from typing import Any, Callable, cast, Dict, List, Optional, Tuple, Type, Union - -from ._events import ( - ConnectionClosed, - Data, - EndOfMessage, - Event, - InformationalResponse, - Request, - Response, -) -from ._headers import get_comma_header, has_expect_100_continue, set_comma_header -from ._readers import READERS, ReadersType -from ._receivebuffer import ReceiveBuffer -from ._state import ( - _SWITCH_CONNECT, - _SWITCH_UPGRADE, - CLIENT, - ConnectionState, - DONE, - ERROR, - MIGHT_SWITCH_PROTOCOL, - SEND_BODY, - SERVER, - SWITCHED_PROTOCOL, -) -from ._util import ( # Import the internal things we need - LocalProtocolError, - RemoteProtocolError, - Sentinel, -) -from ._writers import WRITERS, WritersType - -# Everything in __all__ gets re-exported as part of the h11 public API. -__all__ = ["Connection", "NEED_DATA", "PAUSED"] - - -class NEED_DATA(Sentinel, metaclass=Sentinel): - pass - - -class PAUSED(Sentinel, metaclass=Sentinel): - pass - - -# If we ever have this much buffered without it making a complete parseable -# event, we error out. The only time we really buffer is when reading the -# request/response line + headers together, so this is effectively the limit on -# the size of that. -# -# Some precedents for defaults: -# - node.js: 80 * 1024 -# - tomcat: 8 * 1024 -# - IIS: 16 * 1024 -# - Apache: <8 KiB per line> -DEFAULT_MAX_INCOMPLETE_EVENT_SIZE = 16 * 1024 - -# RFC 7230's rules for connection lifecycles: -# - If either side says they want to close the connection, then the connection -# must close. -# - HTTP/1.1 defaults to keep-alive unless someone says Connection: close -# - HTTP/1.0 defaults to close unless both sides say Connection: keep-alive -# (and even this is a mess -- e.g. if you're implementing a proxy then -# sending Connection: keep-alive is forbidden). -# -# We simplify life by simply not supporting keep-alive with HTTP/1.0 peers. So -# our rule is: -# - If someone says Connection: close, we will close -# - If someone uses HTTP/1.0, we will close. -def _keep_alive(event: Union[Request, Response]) -> bool: - connection = get_comma_header(event.headers, b"connection") - if b"close" in connection: - return False - if getattr(event, "http_version", b"1.1") < b"1.1": - return False - return True - - -def _body_framing( - request_method: bytes, event: Union[Request, Response] -) -> Tuple[str, Union[Tuple[()], Tuple[int]]]: - # Called when we enter SEND_BODY to figure out framing information for - # this body. - # - # These are the only two events that can trigger a SEND_BODY state: - assert type(event) in (Request, Response) - # Returns one of: - # - # ("content-length", count) - # ("chunked", ()) - # ("http/1.0", ()) - # - # which are (lookup key, *args) for constructing body reader/writer - # objects. - # - # Reference: https://tools.ietf.org/html/rfc7230#section-3.3.3 - # - # Step 1: some responses always have an empty body, regardless of what the - # headers say. - if type(event) is Response: - if ( - event.status_code in (204, 304) - or request_method == b"HEAD" - or (request_method == b"CONNECT" and 200 <= event.status_code < 300) - ): - return ("content-length", (0,)) - # Section 3.3.3 also lists another case -- responses with status_code - # < 200. For us these are InformationalResponses, not Responses, so - # they can't get into this function in the first place. - assert event.status_code >= 200 - - # Step 2: check for Transfer-Encoding (T-E beats C-L): - transfer_encodings = get_comma_header(event.headers, b"transfer-encoding") - if transfer_encodings: - assert transfer_encodings == [b"chunked"] - return ("chunked", ()) - - # Step 3: check for Content-Length - content_lengths = get_comma_header(event.headers, b"content-length") - if content_lengths: - return ("content-length", (int(content_lengths[0]),)) - - # Step 4: no applicable headers; fallback/default depends on type - if type(event) is Request: - return ("content-length", (0,)) - else: - return ("http/1.0", ()) - - -################################################################ -# -# The main Connection class -# -################################################################ - - -class Connection: - """An object encapsulating the state of an HTTP connection. - - Args: - our_role: If you're implementing a client, pass :data:`h11.CLIENT`. If - you're implementing a server, pass :data:`h11.SERVER`. - - max_incomplete_event_size (int): - The maximum number of bytes we're willing to buffer of an - incomplete event. In practice this mostly sets a limit on the - maximum size of the request/response line + headers. If this is - exceeded, then :meth:`next_event` will raise - :exc:`RemoteProtocolError`. - - """ - - def __init__( - self, - our_role: Type[Sentinel], - max_incomplete_event_size: int = DEFAULT_MAX_INCOMPLETE_EVENT_SIZE, - ) -> None: - self._max_incomplete_event_size = max_incomplete_event_size - # State and role tracking - if our_role not in (CLIENT, SERVER): - raise ValueError("expected CLIENT or SERVER, not {!r}".format(our_role)) - self.our_role = our_role - self.their_role: Type[Sentinel] - if our_role is CLIENT: - self.their_role = SERVER - else: - self.their_role = CLIENT - self._cstate = ConnectionState() - - # Callables for converting data->events or vice-versa given the - # current state - self._writer = self._get_io_object(self.our_role, None, WRITERS) - self._reader = self._get_io_object(self.their_role, None, READERS) - - # Holds any unprocessed received data - self._receive_buffer = ReceiveBuffer() - # If this is true, then it indicates that the incoming connection was - # closed *after* the end of whatever's in self._receive_buffer: - self._receive_buffer_closed = False - - # Extra bits of state that don't fit into the state machine. - # - # These two are only used to interpret framing headers for figuring - # out how to read/write response bodies. their_http_version is also - # made available as a convenient public API. - self.their_http_version: Optional[bytes] = None - self._request_method: Optional[bytes] = None - # This is pure flow-control and doesn't at all affect the set of legal - # transitions, so no need to bother ConnectionState with it: - self.client_is_waiting_for_100_continue = False - - @property - def states(self) -> Dict[Type[Sentinel], Type[Sentinel]]: - """A dictionary like:: - - {CLIENT: , SERVER: } - - See :ref:`state-machine` for details. - - """ - return dict(self._cstate.states) - - @property - def our_state(self) -> Type[Sentinel]: - """The current state of whichever role we are playing. See - :ref:`state-machine` for details. - """ - return self._cstate.states[self.our_role] - - @property - def their_state(self) -> Type[Sentinel]: - """The current state of whichever role we are NOT playing. See - :ref:`state-machine` for details. - """ - return self._cstate.states[self.their_role] - - @property - def they_are_waiting_for_100_continue(self) -> bool: - return self.their_role is CLIENT and self.client_is_waiting_for_100_continue - - def start_next_cycle(self) -> None: - """Attempt to reset our connection state for a new request/response - cycle. - - If both client and server are in :data:`DONE` state, then resets them - both to :data:`IDLE` state in preparation for a new request/response - cycle on this same connection. Otherwise, raises a - :exc:`LocalProtocolError`. - - See :ref:`keepalive-and-pipelining`. - - """ - old_states = dict(self._cstate.states) - self._cstate.start_next_cycle() - self._request_method = None - # self.their_http_version gets left alone, since it presumably lasts - # beyond a single request/response cycle - assert not self.client_is_waiting_for_100_continue - self._respond_to_state_changes(old_states) - - def _process_error(self, role: Type[Sentinel]) -> None: - old_states = dict(self._cstate.states) - self._cstate.process_error(role) - self._respond_to_state_changes(old_states) - - def _server_switch_event(self, event: Event) -> Optional[Type[Sentinel]]: - if type(event) is InformationalResponse and event.status_code == 101: - return _SWITCH_UPGRADE - if type(event) is Response: - if ( - _SWITCH_CONNECT in self._cstate.pending_switch_proposals - and 200 <= event.status_code < 300 - ): - return _SWITCH_CONNECT - return None - - # All events go through here - def _process_event(self, role: Type[Sentinel], event: Event) -> None: - # First, pass the event through the state machine to make sure it - # succeeds. - old_states = dict(self._cstate.states) - if role is CLIENT and type(event) is Request: - if event.method == b"CONNECT": - self._cstate.process_client_switch_proposal(_SWITCH_CONNECT) - if get_comma_header(event.headers, b"upgrade"): - self._cstate.process_client_switch_proposal(_SWITCH_UPGRADE) - server_switch_event = None - if role is SERVER: - server_switch_event = self._server_switch_event(event) - self._cstate.process_event(role, type(event), server_switch_event) - - # Then perform the updates triggered by it. - - if type(event) is Request: - self._request_method = event.method - - if role is self.their_role and type(event) in ( - Request, - Response, - InformationalResponse, - ): - event = cast(Union[Request, Response, InformationalResponse], event) - self.their_http_version = event.http_version - - # Keep alive handling - # - # RFC 7230 doesn't really say what one should do if Connection: close - # shows up on a 1xx InformationalResponse. I think the idea is that - # this is not supposed to happen. In any case, if it does happen, we - # ignore it. - if type(event) in (Request, Response) and not _keep_alive( - cast(Union[Request, Response], event) - ): - self._cstate.process_keep_alive_disabled() - - # 100-continue - if type(event) is Request and has_expect_100_continue(event): - self.client_is_waiting_for_100_continue = True - if type(event) in (InformationalResponse, Response): - self.client_is_waiting_for_100_continue = False - if role is CLIENT and type(event) in (Data, EndOfMessage): - self.client_is_waiting_for_100_continue = False - - self._respond_to_state_changes(old_states, event) - - def _get_io_object( - self, - role: Type[Sentinel], - event: Optional[Event], - io_dict: Union[ReadersType, WritersType], - ) -> Optional[Callable[..., Any]]: - # event may be None; it's only used when entering SEND_BODY - state = self._cstate.states[role] - if state is SEND_BODY: - # Special case: the io_dict has a dict of reader/writer factories - # that depend on the request/response framing. - framing_type, args = _body_framing( - cast(bytes, self._request_method), cast(Union[Request, Response], event) - ) - return io_dict[SEND_BODY][framing_type](*args) # type: ignore[index] - else: - # General case: the io_dict just has the appropriate reader/writer - # for this state - return io_dict.get((role, state)) # type: ignore[return-value] - - # This must be called after any action that might have caused - # self._cstate.states to change. - def _respond_to_state_changes( - self, - old_states: Dict[Type[Sentinel], Type[Sentinel]], - event: Optional[Event] = None, - ) -> None: - # Update reader/writer - if self.our_state != old_states[self.our_role]: - self._writer = self._get_io_object(self.our_role, event, WRITERS) - if self.their_state != old_states[self.their_role]: - self._reader = self._get_io_object(self.their_role, event, READERS) - - @property - def trailing_data(self) -> Tuple[bytes, bool]: - """Data that has been received, but not yet processed, represented as - a tuple with two elements, where the first is a byte-string containing - the unprocessed data itself, and the second is a bool that is True if - the receive connection was closed. - - See :ref:`switching-protocols` for discussion of why you'd want this. - """ - return (bytes(self._receive_buffer), self._receive_buffer_closed) - - def receive_data(self, data: bytes) -> None: - """Add data to our internal receive buffer. - - This does not actually do any processing on the data, just stores - it. To trigger processing, you have to call :meth:`next_event`. - - Args: - data (:term:`bytes-like object`): - The new data that was just received. - - Special case: If *data* is an empty byte-string like ``b""``, - then this indicates that the remote side has closed the - connection (end of file). Normally this is convenient, because - standard Python APIs like :meth:`file.read` or - :meth:`socket.recv` use ``b""`` to indicate end-of-file, while - other failures to read are indicated using other mechanisms - like raising :exc:`TimeoutError`. When using such an API you - can just blindly pass through whatever you get from ``read`` - to :meth:`receive_data`, and everything will work. - - But, if you have an API where reading an empty string is a - valid non-EOF condition, then you need to be aware of this and - make sure to check for such strings and avoid passing them to - :meth:`receive_data`. - - Returns: - Nothing, but after calling this you should call :meth:`next_event` - to parse the newly received data. - - Raises: - RuntimeError: - Raised if you pass an empty *data*, indicating EOF, and then - pass a non-empty *data*, indicating more data that somehow - arrived after the EOF. - - (Calling ``receive_data(b"")`` multiple times is fine, - and equivalent to calling it once.) - - """ - if data: - if self._receive_buffer_closed: - raise RuntimeError("received close, then received more data?") - self._receive_buffer += data - else: - self._receive_buffer_closed = True - - def _extract_next_receive_event( - self, - ) -> Union[Event, Type[NEED_DATA], Type[PAUSED]]: - state = self.their_state - # We don't pause immediately when they enter DONE, because even in - # DONE state we can still process a ConnectionClosed() event. But - # if we have data in our buffer, then we definitely aren't getting - # a ConnectionClosed() immediately and we need to pause. - if state is DONE and self._receive_buffer: - return PAUSED - if state is MIGHT_SWITCH_PROTOCOL or state is SWITCHED_PROTOCOL: - return PAUSED - assert self._reader is not None - event = self._reader(self._receive_buffer) - if event is None: - if not self._receive_buffer and self._receive_buffer_closed: - # In some unusual cases (basically just HTTP/1.0 bodies), EOF - # triggers an actual protocol event; in that case, we want to - # return that event, and then the state will change and we'll - # get called again to generate the actual ConnectionClosed(). - if hasattr(self._reader, "read_eof"): - event = self._reader.read_eof() # type: ignore[attr-defined] - else: - event = ConnectionClosed() - if event is None: - event = NEED_DATA - return event # type: ignore[no-any-return] - - def next_event(self) -> Union[Event, Type[NEED_DATA], Type[PAUSED]]: - """Parse the next event out of our receive buffer, update our internal - state, and return it. - - This is a mutating operation -- think of it like calling :func:`next` - on an iterator. - - Returns: - : One of three things: - - 1) An event object -- see :ref:`events`. - - 2) The special constant :data:`NEED_DATA`, which indicates that - you need to read more data from your socket and pass it to - :meth:`receive_data` before this method will be able to return - any more events. - - 3) The special constant :data:`PAUSED`, which indicates that we - are not in a state where we can process incoming data (usually - because the peer has finished their part of the current - request/response cycle, and you have not yet called - :meth:`start_next_cycle`). See :ref:`flow-control` for details. - - Raises: - RemoteProtocolError: - The peer has misbehaved. You should close the connection - (possibly after sending some kind of 4xx response). - - Once this method returns :class:`ConnectionClosed` once, then all - subsequent calls will also return :class:`ConnectionClosed`. - - If this method raises any exception besides :exc:`RemoteProtocolError` - then that's a bug -- if it happens please file a bug report! - - If this method raises any exception then it also sets - :attr:`Connection.their_state` to :data:`ERROR` -- see - :ref:`error-handling` for discussion. - - """ - - if self.their_state is ERROR: - raise RemoteProtocolError("Can't receive data when peer state is ERROR") - try: - event = self._extract_next_receive_event() - if event not in [NEED_DATA, PAUSED]: - self._process_event(self.their_role, cast(Event, event)) - if event is NEED_DATA: - if len(self._receive_buffer) > self._max_incomplete_event_size: - # 431 is "Request header fields too large" which is pretty - # much the only situation where we can get here - raise RemoteProtocolError( - "Receive buffer too long", error_status_hint=431 - ) - if self._receive_buffer_closed: - # We're still trying to complete some event, but that's - # never going to happen because no more data is coming - raise RemoteProtocolError("peer unexpectedly closed connection") - return event - except BaseException as exc: - self._process_error(self.their_role) - if isinstance(exc, LocalProtocolError): - exc._reraise_as_remote_protocol_error() - else: - raise - - def send(self, event: Event) -> Optional[bytes]: - """Convert a high-level event into bytes that can be sent to the peer, - while updating our internal state machine. - - Args: - event: The :ref:`event ` to send. - - Returns: - If ``type(event) is ConnectionClosed``, then returns - ``None``. Otherwise, returns a :term:`bytes-like object`. - - Raises: - LocalProtocolError: - Sending this event at this time would violate our - understanding of the HTTP/1.1 protocol. - - If this method raises any exception then it also sets - :attr:`Connection.our_state` to :data:`ERROR` -- see - :ref:`error-handling` for discussion. - - """ - data_list = self.send_with_data_passthrough(event) - if data_list is None: - return None - else: - return b"".join(data_list) - - def send_with_data_passthrough(self, event: Event) -> Optional[List[bytes]]: - """Identical to :meth:`send`, except that in situations where - :meth:`send` returns a single :term:`bytes-like object`, this instead - returns a list of them -- and when sending a :class:`Data` event, this - list is guaranteed to contain the exact object you passed in as - :attr:`Data.data`. See :ref:`sendfile` for discussion. - - """ - if self.our_state is ERROR: - raise LocalProtocolError("Can't send data when our state is ERROR") - try: - if type(event) is Response: - event = self._clean_up_response_headers_for_sending(event) - # We want to call _process_event before calling the writer, - # because if someone tries to do something invalid then this will - # give a sensible error message, while our writers all just assume - # they will only receive valid events. But, _process_event might - # change self._writer. So we have to do a little dance: - writer = self._writer - self._process_event(self.our_role, event) - if type(event) is ConnectionClosed: - return None - else: - # In any situation where writer is None, process_event should - # have raised ProtocolError - assert writer is not None - data_list: List[bytes] = [] - writer(event, data_list.append) - return data_list - except: - self._process_error(self.our_role) - raise - - def send_failed(self) -> None: - """Notify the state machine that we failed to send the data it gave - us. - - This causes :attr:`Connection.our_state` to immediately become - :data:`ERROR` -- see :ref:`error-handling` for discussion. - - """ - self._process_error(self.our_role) - - # When sending a Response, we take responsibility for a few things: - # - # - Sometimes you MUST set Connection: close. We take care of those - # times. (You can also set it yourself if you want, and if you do then - # we'll respect that and close the connection at the right time. But you - # don't have to worry about that unless you want to.) - # - # - The user has to set Content-Length if they want it. Otherwise, for - # responses that have bodies (e.g. not HEAD), then we will automatically - # select the right mechanism for streaming a body of unknown length, - # which depends on depending on the peer's HTTP version. - # - # This function's *only* responsibility is making sure headers are set up - # right -- everything downstream just looks at the headers. There are no - # side channels. - def _clean_up_response_headers_for_sending(self, response: Response) -> Response: - assert type(response) is Response - - headers = response.headers - need_close = False - - # HEAD requests need some special handling: they always act like they - # have Content-Length: 0, and that's how _body_framing treats - # them. But their headers are supposed to match what we would send if - # the request was a GET. (Technically there is one deviation allowed: - # we're allowed to leave out the framing headers -- see - # https://tools.ietf.org/html/rfc7231#section-4.3.2 . But it's just as - # easy to get them right.) - method_for_choosing_headers = cast(bytes, self._request_method) - if method_for_choosing_headers == b"HEAD": - method_for_choosing_headers = b"GET" - framing_type, _ = _body_framing(method_for_choosing_headers, response) - if framing_type in ("chunked", "http/1.0"): - # This response has a body of unknown length. - # If our peer is HTTP/1.1, we use Transfer-Encoding: chunked - # If our peer is HTTP/1.0, we use no framing headers, and close the - # connection afterwards. - # - # Make sure to clear Content-Length (in principle user could have - # set both and then we ignored Content-Length b/c - # Transfer-Encoding overwrote it -- this would be naughty of them, - # but the HTTP spec says that if our peer does this then we have - # to fix it instead of erroring out, so we'll accord the user the - # same respect). - headers = set_comma_header(headers, b"content-length", []) - if self.their_http_version is None or self.their_http_version < b"1.1": - # Either we never got a valid request and are sending back an - # error (their_http_version is None), so we assume the worst; - # or else we did get a valid HTTP/1.0 request, so we know that - # they don't understand chunked encoding. - headers = set_comma_header(headers, b"transfer-encoding", []) - # This is actually redundant ATM, since currently we - # unconditionally disable keep-alive when talking to HTTP/1.0 - # peers. But let's be defensive just in case we add - # Connection: keep-alive support later: - if self._request_method != b"HEAD": - need_close = True - else: - headers = set_comma_header(headers, b"transfer-encoding", [b"chunked"]) - - if not self._cstate.keep_alive or need_close: - # Make sure Connection: close is set - connection = set(get_comma_header(headers, b"connection")) - connection.discard(b"keep-alive") - connection.add(b"close") - headers = set_comma_header(headers, b"connection", sorted(connection)) - - return Response( - headers=headers, - status_code=response.status_code, - http_version=response.http_version, - reason=response.reason, - ) diff --git a/venv/lib/python3.11/site-packages/h11/_events.py b/venv/lib/python3.11/site-packages/h11/_events.py deleted file mode 100644 index 075bf8a..0000000 --- a/venv/lib/python3.11/site-packages/h11/_events.py +++ /dev/null @@ -1,369 +0,0 @@ -# High level events that make up HTTP/1.1 conversations. Loosely inspired by -# the corresponding events in hyper-h2: -# -# http://python-hyper.org/h2/en/stable/api.html#events -# -# Don't subclass these. Stuff will break. - -import re -from abc import ABC -from dataclasses import dataclass, field -from typing import Any, cast, Dict, List, Tuple, Union - -from ._abnf import method, request_target -from ._headers import Headers, normalize_and_validate -from ._util import bytesify, LocalProtocolError, validate - -# Everything in __all__ gets re-exported as part of the h11 public API. -__all__ = [ - "Event", - "Request", - "InformationalResponse", - "Response", - "Data", - "EndOfMessage", - "ConnectionClosed", -] - -method_re = re.compile(method.encode("ascii")) -request_target_re = re.compile(request_target.encode("ascii")) - - -class Event(ABC): - """ - Base class for h11 events. - """ - - __slots__ = () - - -@dataclass(init=False, frozen=True) -class Request(Event): - """The beginning of an HTTP request. - - Fields: - - .. attribute:: method - - An HTTP method, e.g. ``b"GET"`` or ``b"POST"``. Always a byte - string. :term:`Bytes-like objects ` and native - strings containing only ascii characters will be automatically - converted to byte strings. - - .. attribute:: target - - The target of an HTTP request, e.g. ``b"/index.html"``, or one of the - more exotic formats described in `RFC 7320, section 5.3 - `_. Always a byte - string. :term:`Bytes-like objects ` and native - strings containing only ascii characters will be automatically - converted to byte strings. - - .. attribute:: headers - - Request headers, represented as a list of (name, value) pairs. See - :ref:`the header normalization rules ` for details. - - .. attribute:: http_version - - The HTTP protocol version, represented as a byte string like - ``b"1.1"``. See :ref:`the HTTP version normalization rules - ` for details. - - """ - - __slots__ = ("method", "headers", "target", "http_version") - - method: bytes - headers: Headers - target: bytes - http_version: bytes - - def __init__( - self, - *, - method: Union[bytes, str], - headers: Union[Headers, List[Tuple[bytes, bytes]], List[Tuple[str, str]]], - target: Union[bytes, str], - http_version: Union[bytes, str] = b"1.1", - _parsed: bool = False, - ) -> None: - super().__init__() - if isinstance(headers, Headers): - object.__setattr__(self, "headers", headers) - else: - object.__setattr__( - self, "headers", normalize_and_validate(headers, _parsed=_parsed) - ) - if not _parsed: - object.__setattr__(self, "method", bytesify(method)) - object.__setattr__(self, "target", bytesify(target)) - object.__setattr__(self, "http_version", bytesify(http_version)) - else: - object.__setattr__(self, "method", method) - object.__setattr__(self, "target", target) - object.__setattr__(self, "http_version", http_version) - - # "A server MUST respond with a 400 (Bad Request) status code to any - # HTTP/1.1 request message that lacks a Host header field and to any - # request message that contains more than one Host header field or a - # Host header field with an invalid field-value." - # -- https://tools.ietf.org/html/rfc7230#section-5.4 - host_count = 0 - for name, value in self.headers: - if name == b"host": - host_count += 1 - if self.http_version == b"1.1" and host_count == 0: - raise LocalProtocolError("Missing mandatory Host: header") - if host_count > 1: - raise LocalProtocolError("Found multiple Host: headers") - - validate(method_re, self.method, "Illegal method characters") - validate(request_target_re, self.target, "Illegal target characters") - - # This is an unhashable type. - __hash__ = None # type: ignore - - -@dataclass(init=False, frozen=True) -class _ResponseBase(Event): - __slots__ = ("headers", "http_version", "reason", "status_code") - - headers: Headers - http_version: bytes - reason: bytes - status_code: int - - def __init__( - self, - *, - headers: Union[Headers, List[Tuple[bytes, bytes]], List[Tuple[str, str]]], - status_code: int, - http_version: Union[bytes, str] = b"1.1", - reason: Union[bytes, str] = b"", - _parsed: bool = False, - ) -> None: - super().__init__() - if isinstance(headers, Headers): - object.__setattr__(self, "headers", headers) - else: - object.__setattr__( - self, "headers", normalize_and_validate(headers, _parsed=_parsed) - ) - if not _parsed: - object.__setattr__(self, "reason", bytesify(reason)) - object.__setattr__(self, "http_version", bytesify(http_version)) - if not isinstance(status_code, int): - raise LocalProtocolError("status code must be integer") - # Because IntEnum objects are instances of int, but aren't - # duck-compatible (sigh), see gh-72. - object.__setattr__(self, "status_code", int(status_code)) - else: - object.__setattr__(self, "reason", reason) - object.__setattr__(self, "http_version", http_version) - object.__setattr__(self, "status_code", status_code) - - self.__post_init__() - - def __post_init__(self) -> None: - pass - - # This is an unhashable type. - __hash__ = None # type: ignore - - -@dataclass(init=False, frozen=True) -class InformationalResponse(_ResponseBase): - """An HTTP informational response. - - Fields: - - .. attribute:: status_code - - The status code of this response, as an integer. For an - :class:`InformationalResponse`, this is always in the range [100, - 200). - - .. attribute:: headers - - Request headers, represented as a list of (name, value) pairs. See - :ref:`the header normalization rules ` for - details. - - .. attribute:: http_version - - The HTTP protocol version, represented as a byte string like - ``b"1.1"``. See :ref:`the HTTP version normalization rules - ` for details. - - .. attribute:: reason - - The reason phrase of this response, as a byte string. For example: - ``b"OK"``, or ``b"Not Found"``. - - """ - - def __post_init__(self) -> None: - if not (100 <= self.status_code < 200): - raise LocalProtocolError( - "InformationalResponse status_code should be in range " - "[100, 200), not {}".format(self.status_code) - ) - - # This is an unhashable type. - __hash__ = None # type: ignore - - -@dataclass(init=False, frozen=True) -class Response(_ResponseBase): - """The beginning of an HTTP response. - - Fields: - - .. attribute:: status_code - - The status code of this response, as an integer. For an - :class:`Response`, this is always in the range [200, - 1000). - - .. attribute:: headers - - Request headers, represented as a list of (name, value) pairs. See - :ref:`the header normalization rules ` for details. - - .. attribute:: http_version - - The HTTP protocol version, represented as a byte string like - ``b"1.1"``. See :ref:`the HTTP version normalization rules - ` for details. - - .. attribute:: reason - - The reason phrase of this response, as a byte string. For example: - ``b"OK"``, or ``b"Not Found"``. - - """ - - def __post_init__(self) -> None: - if not (200 <= self.status_code < 1000): - raise LocalProtocolError( - "Response status_code should be in range [200, 1000), not {}".format( - self.status_code - ) - ) - - # This is an unhashable type. - __hash__ = None # type: ignore - - -@dataclass(init=False, frozen=True) -class Data(Event): - """Part of an HTTP message body. - - Fields: - - .. attribute:: data - - A :term:`bytes-like object` containing part of a message body. Or, if - using the ``combine=False`` argument to :meth:`Connection.send`, then - any object that your socket writing code knows what to do with, and for - which calling :func:`len` returns the number of bytes that will be - written -- see :ref:`sendfile` for details. - - .. attribute:: chunk_start - - A marker that indicates whether this data object is from the start of a - chunked transfer encoding chunk. This field is ignored when when a Data - event is provided to :meth:`Connection.send`: it is only valid on - events emitted from :meth:`Connection.next_event`. You probably - shouldn't use this attribute at all; see - :ref:`chunk-delimiters-are-bad` for details. - - .. attribute:: chunk_end - - A marker that indicates whether this data object is the last for a - given chunked transfer encoding chunk. This field is ignored when when - a Data event is provided to :meth:`Connection.send`: it is only valid - on events emitted from :meth:`Connection.next_event`. You probably - shouldn't use this attribute at all; see - :ref:`chunk-delimiters-are-bad` for details. - - """ - - __slots__ = ("data", "chunk_start", "chunk_end") - - data: bytes - chunk_start: bool - chunk_end: bool - - def __init__( - self, data: bytes, chunk_start: bool = False, chunk_end: bool = False - ) -> None: - object.__setattr__(self, "data", data) - object.__setattr__(self, "chunk_start", chunk_start) - object.__setattr__(self, "chunk_end", chunk_end) - - # This is an unhashable type. - __hash__ = None # type: ignore - - -# XX FIXME: "A recipient MUST ignore (or consider as an error) any fields that -# are forbidden to be sent in a trailer, since processing them as if they were -# present in the header section might bypass external security filters." -# https://svn.tools.ietf.org/svn/wg/httpbis/specs/rfc7230.html#chunked.trailer.part -# Unfortunately, the list of forbidden fields is long and vague :-/ -@dataclass(init=False, frozen=True) -class EndOfMessage(Event): - """The end of an HTTP message. - - Fields: - - .. attribute:: headers - - Default value: ``[]`` - - Any trailing headers attached to this message, represented as a list of - (name, value) pairs. See :ref:`the header normalization rules - ` for details. - - Must be empty unless ``Transfer-Encoding: chunked`` is in use. - - """ - - __slots__ = ("headers",) - - headers: Headers - - def __init__( - self, - *, - headers: Union[ - Headers, List[Tuple[bytes, bytes]], List[Tuple[str, str]], None - ] = None, - _parsed: bool = False, - ) -> None: - super().__init__() - if headers is None: - headers = Headers([]) - elif not isinstance(headers, Headers): - headers = normalize_and_validate(headers, _parsed=_parsed) - - object.__setattr__(self, "headers", headers) - - # This is an unhashable type. - __hash__ = None # type: ignore - - -@dataclass(frozen=True) -class ConnectionClosed(Event): - """This event indicates that the sender has closed their outgoing - connection. - - Note that this does not necessarily mean that they can't *receive* further - data, because TCP connections are composed to two one-way channels which - can be closed independently. See :ref:`closing` for details. - - No fields. - """ - - pass diff --git a/venv/lib/python3.11/site-packages/h11/_headers.py b/venv/lib/python3.11/site-packages/h11/_headers.py deleted file mode 100644 index b97d020..0000000 --- a/venv/lib/python3.11/site-packages/h11/_headers.py +++ /dev/null @@ -1,278 +0,0 @@ -import re -from typing import AnyStr, cast, List, overload, Sequence, Tuple, TYPE_CHECKING, Union - -from ._abnf import field_name, field_value -from ._util import bytesify, LocalProtocolError, validate - -if TYPE_CHECKING: - from ._events import Request - -try: - from typing import Literal -except ImportError: - from typing_extensions import Literal # type: ignore - - -# Facts -# ----- -# -# Headers are: -# keys: case-insensitive ascii -# values: mixture of ascii and raw bytes -# -# "Historically, HTTP has allowed field content with text in the ISO-8859-1 -# charset [ISO-8859-1], supporting other charsets only through use of -# [RFC2047] encoding. In practice, most HTTP header field values use only a -# subset of the US-ASCII charset [USASCII]. Newly defined header fields SHOULD -# limit their field values to US-ASCII octets. A recipient SHOULD treat other -# octets in field content (obs-text) as opaque data." -# And it deprecates all non-ascii values -# -# Leading/trailing whitespace in header names is forbidden -# -# Values get leading/trailing whitespace stripped -# -# Content-Disposition actually needs to contain unicode semantically; to -# accomplish this it has a terrifically weird way of encoding the filename -# itself as ascii (and even this still has lots of cross-browser -# incompatibilities) -# -# Order is important: -# "a proxy MUST NOT change the order of these field values when forwarding a -# message" -# (and there are several headers where the order indicates a preference) -# -# Multiple occurences of the same header: -# "A sender MUST NOT generate multiple header fields with the same field name -# in a message unless either the entire field value for that header field is -# defined as a comma-separated list [or the header is Set-Cookie which gets a -# special exception]" - RFC 7230. (cookies are in RFC 6265) -# -# So every header aside from Set-Cookie can be merged by b", ".join if it -# occurs repeatedly. But, of course, they can't necessarily be split by -# .split(b","), because quoting. -# -# Given all this mess (case insensitive, duplicates allowed, order is -# important, ...), there doesn't appear to be any standard way to handle -# headers in Python -- they're almost like dicts, but... actually just -# aren't. For now we punt and just use a super simple representation: headers -# are a list of pairs -# -# [(name1, value1), (name2, value2), ...] -# -# where all entries are bytestrings, names are lowercase and have no -# leading/trailing whitespace, and values are bytestrings with no -# leading/trailing whitespace. Searching and updating are done via naive O(n) -# methods. -# -# Maybe a dict-of-lists would be better? - -_content_length_re = re.compile(rb"[0-9]+") -_field_name_re = re.compile(field_name.encode("ascii")) -_field_value_re = re.compile(field_value.encode("ascii")) - - -class Headers(Sequence[Tuple[bytes, bytes]]): - """ - A list-like interface that allows iterating over headers as byte-pairs - of (lowercased-name, value). - - Internally we actually store the representation as three-tuples, - including both the raw original casing, in order to preserve casing - over-the-wire, and the lowercased name, for case-insensitive comparisions. - - r = Request( - method="GET", - target="/", - headers=[("Host", "example.org"), ("Connection", "keep-alive")], - http_version="1.1", - ) - assert r.headers == [ - (b"host", b"example.org"), - (b"connection", b"keep-alive") - ] - assert r.headers.raw_items() == [ - (b"Host", b"example.org"), - (b"Connection", b"keep-alive") - ] - """ - - __slots__ = "_full_items" - - def __init__(self, full_items: List[Tuple[bytes, bytes, bytes]]) -> None: - self._full_items = full_items - - def __bool__(self) -> bool: - return bool(self._full_items) - - def __eq__(self, other: object) -> bool: - return list(self) == list(other) # type: ignore - - def __len__(self) -> int: - return len(self._full_items) - - def __repr__(self) -> str: - return "" % repr(list(self)) - - def __getitem__(self, idx: int) -> Tuple[bytes, bytes]: # type: ignore[override] - _, name, value = self._full_items[idx] - return (name, value) - - def raw_items(self) -> List[Tuple[bytes, bytes]]: - return [(raw_name, value) for raw_name, _, value in self._full_items] - - -HeaderTypes = Union[ - List[Tuple[bytes, bytes]], - List[Tuple[bytes, str]], - List[Tuple[str, bytes]], - List[Tuple[str, str]], -] - - -@overload -def normalize_and_validate(headers: Headers, _parsed: Literal[True]) -> Headers: - ... - - -@overload -def normalize_and_validate(headers: HeaderTypes, _parsed: Literal[False]) -> Headers: - ... - - -@overload -def normalize_and_validate( - headers: Union[Headers, HeaderTypes], _parsed: bool = False -) -> Headers: - ... - - -def normalize_and_validate( - headers: Union[Headers, HeaderTypes], _parsed: bool = False -) -> Headers: - new_headers = [] - seen_content_length = None - saw_transfer_encoding = False - for name, value in headers: - # For headers coming out of the parser, we can safely skip some steps, - # because it always returns bytes and has already run these regexes - # over the data: - if not _parsed: - name = bytesify(name) - value = bytesify(value) - validate(_field_name_re, name, "Illegal header name {!r}", name) - validate(_field_value_re, value, "Illegal header value {!r}", value) - assert isinstance(name, bytes) - assert isinstance(value, bytes) - - raw_name = name - name = name.lower() - if name == b"content-length": - lengths = {length.strip() for length in value.split(b",")} - if len(lengths) != 1: - raise LocalProtocolError("conflicting Content-Length headers") - value = lengths.pop() - validate(_content_length_re, value, "bad Content-Length") - if seen_content_length is None: - seen_content_length = value - new_headers.append((raw_name, name, value)) - elif seen_content_length != value: - raise LocalProtocolError("conflicting Content-Length headers") - elif name == b"transfer-encoding": - # "A server that receives a request message with a transfer coding - # it does not understand SHOULD respond with 501 (Not - # Implemented)." - # https://tools.ietf.org/html/rfc7230#section-3.3.1 - if saw_transfer_encoding: - raise LocalProtocolError( - "multiple Transfer-Encoding headers", error_status_hint=501 - ) - # "All transfer-coding names are case-insensitive" - # -- https://tools.ietf.org/html/rfc7230#section-4 - value = value.lower() - if value != b"chunked": - raise LocalProtocolError( - "Only Transfer-Encoding: chunked is supported", - error_status_hint=501, - ) - saw_transfer_encoding = True - new_headers.append((raw_name, name, value)) - else: - new_headers.append((raw_name, name, value)) - return Headers(new_headers) - - -def get_comma_header(headers: Headers, name: bytes) -> List[bytes]: - # Should only be used for headers whose value is a list of - # comma-separated, case-insensitive values. - # - # The header name `name` is expected to be lower-case bytes. - # - # Connection: meets these criteria (including cast insensitivity). - # - # Content-Length: technically is just a single value (1*DIGIT), but the - # standard makes reference to implementations that do multiple values, and - # using this doesn't hurt. Ditto, case insensitivity doesn't things either - # way. - # - # Transfer-Encoding: is more complex (allows for quoted strings), so - # splitting on , is actually wrong. For example, this is legal: - # - # Transfer-Encoding: foo; options="1,2", chunked - # - # and should be parsed as - # - # foo; options="1,2" - # chunked - # - # but this naive function will parse it as - # - # foo; options="1 - # 2" - # chunked - # - # However, this is okay because the only thing we are going to do with - # any Transfer-Encoding is reject ones that aren't just "chunked", so - # both of these will be treated the same anyway. - # - # Expect: the only legal value is the literal string - # "100-continue". Splitting on commas is harmless. Case insensitive. - # - out: List[bytes] = [] - for _, found_name, found_raw_value in headers._full_items: - if found_name == name: - found_raw_value = found_raw_value.lower() - for found_split_value in found_raw_value.split(b","): - found_split_value = found_split_value.strip() - if found_split_value: - out.append(found_split_value) - return out - - -def set_comma_header(headers: Headers, name: bytes, new_values: List[bytes]) -> Headers: - # The header name `name` is expected to be lower-case bytes. - # - # Note that when we store the header we use title casing for the header - # names, in order to match the conventional HTTP header style. - # - # Simply calling `.title()` is a blunt approach, but it's correct - # here given the cases where we're using `set_comma_header`... - # - # Connection, Content-Length, Transfer-Encoding. - new_headers: List[Tuple[bytes, bytes]] = [] - for found_raw_name, found_name, found_raw_value in headers._full_items: - if found_name != name: - new_headers.append((found_raw_name, found_raw_value)) - for new_value in new_values: - new_headers.append((name.title(), new_value)) - return normalize_and_validate(new_headers) - - -def has_expect_100_continue(request: "Request") -> bool: - # https://tools.ietf.org/html/rfc7231#section-5.1.1 - # "A server that receives a 100-continue expectation in an HTTP/1.0 request - # MUST ignore that expectation." - if request.http_version < b"1.1": - return False - expect = get_comma_header(request.headers, b"expect") - return b"100-continue" in expect diff --git a/venv/lib/python3.11/site-packages/h11/_readers.py b/venv/lib/python3.11/site-packages/h11/_readers.py deleted file mode 100644 index 08a9574..0000000 --- a/venv/lib/python3.11/site-packages/h11/_readers.py +++ /dev/null @@ -1,247 +0,0 @@ -# Code to read HTTP data -# -# Strategy: each reader is a callable which takes a ReceiveBuffer object, and -# either: -# 1) consumes some of it and returns an Event -# 2) raises a LocalProtocolError (for consistency -- e.g. we call validate() -# and it might raise a LocalProtocolError, so simpler just to always use -# this) -# 3) returns None, meaning "I need more data" -# -# If they have a .read_eof attribute, then this will be called if an EOF is -# received -- but this is optional. Either way, the actual ConnectionClosed -# event will be generated afterwards. -# -# READERS is a dict describing how to pick a reader. It maps states to either: -# - a reader -# - or, for body readers, a dict of per-framing reader factories - -import re -from typing import Any, Callable, Dict, Iterable, NoReturn, Optional, Tuple, Type, Union - -from ._abnf import chunk_header, header_field, request_line, status_line -from ._events import Data, EndOfMessage, InformationalResponse, Request, Response -from ._receivebuffer import ReceiveBuffer -from ._state import ( - CLIENT, - CLOSED, - DONE, - IDLE, - MUST_CLOSE, - SEND_BODY, - SEND_RESPONSE, - SERVER, -) -from ._util import LocalProtocolError, RemoteProtocolError, Sentinel, validate - -__all__ = ["READERS"] - -header_field_re = re.compile(header_field.encode("ascii")) -obs_fold_re = re.compile(rb"[ \t]+") - - -def _obsolete_line_fold(lines: Iterable[bytes]) -> Iterable[bytes]: - it = iter(lines) - last: Optional[bytes] = None - for line in it: - match = obs_fold_re.match(line) - if match: - if last is None: - raise LocalProtocolError("continuation line at start of headers") - if not isinstance(last, bytearray): - # Cast to a mutable type, avoiding copy on append to ensure O(n) time - last = bytearray(last) - last += b" " - last += line[match.end() :] - else: - if last is not None: - yield last - last = line - if last is not None: - yield last - - -def _decode_header_lines( - lines: Iterable[bytes], -) -> Iterable[Tuple[bytes, bytes]]: - for line in _obsolete_line_fold(lines): - matches = validate(header_field_re, line, "illegal header line: {!r}", line) - yield (matches["field_name"], matches["field_value"]) - - -request_line_re = re.compile(request_line.encode("ascii")) - - -def maybe_read_from_IDLE_client(buf: ReceiveBuffer) -> Optional[Request]: - lines = buf.maybe_extract_lines() - if lines is None: - if buf.is_next_line_obviously_invalid_request_line(): - raise LocalProtocolError("illegal request line") - return None - if not lines: - raise LocalProtocolError("no request line received") - matches = validate( - request_line_re, lines[0], "illegal request line: {!r}", lines[0] - ) - return Request( - headers=list(_decode_header_lines(lines[1:])), _parsed=True, **matches - ) - - -status_line_re = re.compile(status_line.encode("ascii")) - - -def maybe_read_from_SEND_RESPONSE_server( - buf: ReceiveBuffer, -) -> Union[InformationalResponse, Response, None]: - lines = buf.maybe_extract_lines() - if lines is None: - if buf.is_next_line_obviously_invalid_request_line(): - raise LocalProtocolError("illegal request line") - return None - if not lines: - raise LocalProtocolError("no response line received") - matches = validate(status_line_re, lines[0], "illegal status line: {!r}", lines[0]) - http_version = ( - b"1.1" if matches["http_version"] is None else matches["http_version"] - ) - reason = b"" if matches["reason"] is None else matches["reason"] - status_code = int(matches["status_code"]) - class_: Union[Type[InformationalResponse], Type[Response]] = ( - InformationalResponse if status_code < 200 else Response - ) - return class_( - headers=list(_decode_header_lines(lines[1:])), - _parsed=True, - status_code=status_code, - reason=reason, - http_version=http_version, - ) - - -class ContentLengthReader: - def __init__(self, length: int) -> None: - self._length = length - self._remaining = length - - def __call__(self, buf: ReceiveBuffer) -> Union[Data, EndOfMessage, None]: - if self._remaining == 0: - return EndOfMessage() - data = buf.maybe_extract_at_most(self._remaining) - if data is None: - return None - self._remaining -= len(data) - return Data(data=data) - - def read_eof(self) -> NoReturn: - raise RemoteProtocolError( - "peer closed connection without sending complete message body " - "(received {} bytes, expected {})".format( - self._length - self._remaining, self._length - ) - ) - - -chunk_header_re = re.compile(chunk_header.encode("ascii")) - - -class ChunkedReader: - def __init__(self) -> None: - self._bytes_in_chunk = 0 - # After reading a chunk, we have to throw away the trailing \r\n; if - # this is >0 then we discard that many bytes before resuming regular - # de-chunkification. - self._bytes_to_discard = 0 - self._reading_trailer = False - - def __call__(self, buf: ReceiveBuffer) -> Union[Data, EndOfMessage, None]: - if self._reading_trailer: - lines = buf.maybe_extract_lines() - if lines is None: - return None - return EndOfMessage(headers=list(_decode_header_lines(lines))) - if self._bytes_to_discard > 0: - data = buf.maybe_extract_at_most(self._bytes_to_discard) - if data is None: - return None - self._bytes_to_discard -= len(data) - if self._bytes_to_discard > 0: - return None - # else, fall through and read some more - assert self._bytes_to_discard == 0 - if self._bytes_in_chunk == 0: - # We need to refill our chunk count - chunk_header = buf.maybe_extract_next_line() - if chunk_header is None: - return None - matches = validate( - chunk_header_re, - chunk_header, - "illegal chunk header: {!r}", - chunk_header, - ) - # XX FIXME: we discard chunk extensions. Does anyone care? - self._bytes_in_chunk = int(matches["chunk_size"], base=16) - if self._bytes_in_chunk == 0: - self._reading_trailer = True - return self(buf) - chunk_start = True - else: - chunk_start = False - assert self._bytes_in_chunk > 0 - data = buf.maybe_extract_at_most(self._bytes_in_chunk) - if data is None: - return None - self._bytes_in_chunk -= len(data) - if self._bytes_in_chunk == 0: - self._bytes_to_discard = 2 - chunk_end = True - else: - chunk_end = False - return Data(data=data, chunk_start=chunk_start, chunk_end=chunk_end) - - def read_eof(self) -> NoReturn: - raise RemoteProtocolError( - "peer closed connection without sending complete message body " - "(incomplete chunked read)" - ) - - -class Http10Reader: - def __call__(self, buf: ReceiveBuffer) -> Optional[Data]: - data = buf.maybe_extract_at_most(999999999) - if data is None: - return None - return Data(data=data) - - def read_eof(self) -> EndOfMessage: - return EndOfMessage() - - -def expect_nothing(buf: ReceiveBuffer) -> None: - if buf: - raise LocalProtocolError("Got data when expecting EOF") - return None - - -ReadersType = Dict[ - Union[Type[Sentinel], Tuple[Type[Sentinel], Type[Sentinel]]], - Union[Callable[..., Any], Dict[str, Callable[..., Any]]], -] - -READERS: ReadersType = { - (CLIENT, IDLE): maybe_read_from_IDLE_client, - (SERVER, IDLE): maybe_read_from_SEND_RESPONSE_server, - (SERVER, SEND_RESPONSE): maybe_read_from_SEND_RESPONSE_server, - (CLIENT, DONE): expect_nothing, - (CLIENT, MUST_CLOSE): expect_nothing, - (CLIENT, CLOSED): expect_nothing, - (SERVER, DONE): expect_nothing, - (SERVER, MUST_CLOSE): expect_nothing, - (SERVER, CLOSED): expect_nothing, - SEND_BODY: { - "chunked": ChunkedReader, - "content-length": ContentLengthReader, - "http/1.0": Http10Reader, - }, -} diff --git a/venv/lib/python3.11/site-packages/h11/_receivebuffer.py b/venv/lib/python3.11/site-packages/h11/_receivebuffer.py deleted file mode 100644 index e5c4e08..0000000 --- a/venv/lib/python3.11/site-packages/h11/_receivebuffer.py +++ /dev/null @@ -1,153 +0,0 @@ -import re -import sys -from typing import List, Optional, Union - -__all__ = ["ReceiveBuffer"] - - -# Operations we want to support: -# - find next \r\n or \r\n\r\n (\n or \n\n are also acceptable), -# or wait until there is one -# - read at-most-N bytes -# Goals: -# - on average, do this fast -# - worst case, do this in O(n) where n is the number of bytes processed -# Plan: -# - store bytearray, offset, how far we've searched for a separator token -# - use the how-far-we've-searched data to avoid rescanning -# - while doing a stream of uninterrupted processing, advance offset instead -# of constantly copying -# WARNING: -# - I haven't benchmarked or profiled any of this yet. -# -# Note that starting in Python 3.4, deleting the initial n bytes from a -# bytearray is amortized O(n), thanks to some excellent work by Antoine -# Martin: -# -# https://bugs.python.org/issue19087 -# -# This means that if we only supported 3.4+, we could get rid of the code here -# involving self._start and self.compress, because it's doing exactly the same -# thing that bytearray now does internally. -# -# BUT unfortunately, we still support 2.7, and reading short segments out of a -# long buffer MUST be O(bytes read) to avoid DoS issues, so we can't actually -# delete this code. Yet: -# -# https://pythonclock.org/ -# -# (Two things to double-check first though: make sure PyPy also has the -# optimization, and benchmark to make sure it's a win, since we do have a -# slightly clever thing where we delay calling compress() until we've -# processed a whole event, which could in theory be slightly more efficient -# than the internal bytearray support.) -blank_line_regex = re.compile(b"\n\r?\n", re.MULTILINE) - - -class ReceiveBuffer: - def __init__(self) -> None: - self._data = bytearray() - self._next_line_search = 0 - self._multiple_lines_search = 0 - - def __iadd__(self, byteslike: Union[bytes, bytearray]) -> "ReceiveBuffer": - self._data += byteslike - return self - - def __bool__(self) -> bool: - return bool(len(self)) - - def __len__(self) -> int: - return len(self._data) - - # for @property unprocessed_data - def __bytes__(self) -> bytes: - return bytes(self._data) - - def _extract(self, count: int) -> bytearray: - # extracting an initial slice of the data buffer and return it - out = self._data[:count] - del self._data[:count] - - self._next_line_search = 0 - self._multiple_lines_search = 0 - - return out - - def maybe_extract_at_most(self, count: int) -> Optional[bytearray]: - """ - Extract a fixed number of bytes from the buffer. - """ - out = self._data[:count] - if not out: - return None - - return self._extract(count) - - def maybe_extract_next_line(self) -> Optional[bytearray]: - """ - Extract the first line, if it is completed in the buffer. - """ - # Only search in buffer space that we've not already looked at. - search_start_index = max(0, self._next_line_search - 1) - partial_idx = self._data.find(b"\r\n", search_start_index) - - if partial_idx == -1: - self._next_line_search = len(self._data) - return None - - # + 2 is to compensate len(b"\r\n") - idx = partial_idx + 2 - - return self._extract(idx) - - def maybe_extract_lines(self) -> Optional[List[bytearray]]: - """ - Extract everything up to the first blank line, and return a list of lines. - """ - # Handle the case where we have an immediate empty line. - if self._data[:1] == b"\n": - self._extract(1) - return [] - - if self._data[:2] == b"\r\n": - self._extract(2) - return [] - - # Only search in buffer space that we've not already looked at. - match = blank_line_regex.search(self._data, self._multiple_lines_search) - if match is None: - self._multiple_lines_search = max(0, len(self._data) - 2) - return None - - # Truncate the buffer and return it. - idx = match.span(0)[-1] - out = self._extract(idx) - lines = out.split(b"\n") - - for line in lines: - if line.endswith(b"\r"): - del line[-1] - - assert lines[-2] == lines[-1] == b"" - - del lines[-2:] - - return lines - - # In theory we should wait until `\r\n` before starting to validate - # incoming data. However it's interesting to detect (very) invalid data - # early given they might not even contain `\r\n` at all (hence only - # timeout will get rid of them). - # This is not a 100% effective detection but more of a cheap sanity check - # allowing for early abort in some useful cases. - # This is especially interesting when peer is messing up with HTTPS and - # sent us a TLS stream where we were expecting plain HTTP given all - # versions of TLS so far start handshake with a 0x16 message type code. - def is_next_line_obviously_invalid_request_line(self) -> bool: - try: - # HTTP header line must not contain non-printable characters - # and should not start with a space - return self._data[0] < 0x21 - except IndexError: - return False diff --git a/venv/lib/python3.11/site-packages/h11/_state.py b/venv/lib/python3.11/site-packages/h11/_state.py deleted file mode 100644 index 3593430..0000000 --- a/venv/lib/python3.11/site-packages/h11/_state.py +++ /dev/null @@ -1,367 +0,0 @@ -################################################################ -# The core state machine -################################################################ -# -# Rule 1: everything that affects the state machine and state transitions must -# live here in this file. As much as possible goes into the table-based -# representation, but for the bits that don't quite fit, the actual code and -# state must nonetheless live here. -# -# Rule 2: this file does not know about what role we're playing; it only knows -# about HTTP request/response cycles in the abstract. This ensures that we -# don't cheat and apply different rules to local and remote parties. -# -# -# Theory of operation -# =================== -# -# Possibly the simplest way to think about this is that we actually have 5 -# different state machines here. Yes, 5. These are: -# -# 1) The client state, with its complicated automaton (see the docs) -# 2) The server state, with its complicated automaton (see the docs) -# 3) The keep-alive state, with possible states {True, False} -# 4) The SWITCH_CONNECT state, with possible states {False, True} -# 5) The SWITCH_UPGRADE state, with possible states {False, True} -# -# For (3)-(5), the first state listed is the initial state. -# -# (1)-(3) are stored explicitly in member variables. The last -# two are stored implicitly in the pending_switch_proposals set as: -# (state of 4) == (_SWITCH_CONNECT in pending_switch_proposals) -# (state of 5) == (_SWITCH_UPGRADE in pending_switch_proposals) -# -# And each of these machines has two different kinds of transitions: -# -# a) Event-triggered -# b) State-triggered -# -# Event triggered is the obvious thing that you'd think it is: some event -# happens, and if it's the right event at the right time then a transition -# happens. But there are somewhat complicated rules for which machines can -# "see" which events. (As a rule of thumb, if a machine "sees" an event, this -# means two things: the event can affect the machine, and if the machine is -# not in a state where it expects that event then it's an error.) These rules -# are: -# -# 1) The client machine sees all h11.events objects emitted by the client. -# -# 2) The server machine sees all h11.events objects emitted by the server. -# -# It also sees the client's Request event. -# -# And sometimes, server events are annotated with a _SWITCH_* event. For -# example, we can have a (Response, _SWITCH_CONNECT) event, which is -# different from a regular Response event. -# -# 3) The keep-alive machine sees the process_keep_alive_disabled() event -# (which is derived from Request/Response events), and this event -# transitions it from True -> False, or from False -> False. There's no way -# to transition back. -# -# 4&5) The _SWITCH_* machines transition from False->True when we get a -# Request that proposes the relevant type of switch (via -# process_client_switch_proposals), and they go from True->False when we -# get a Response that has no _SWITCH_* annotation. -# -# So that's event-triggered transitions. -# -# State-triggered transitions are less standard. What they do here is couple -# the machines together. The way this works is, when certain *joint* -# configurations of states are achieved, then we automatically transition to a -# new *joint* state. So, for example, if we're ever in a joint state with -# -# client: DONE -# keep-alive: False -# -# then the client state immediately transitions to: -# -# client: MUST_CLOSE -# -# This is fundamentally different from an event-based transition, because it -# doesn't matter how we arrived at the {client: DONE, keep-alive: False} state -# -- maybe the client transitioned SEND_BODY -> DONE, or keep-alive -# transitioned True -> False. Either way, once this precondition is satisfied, -# this transition is immediately triggered. -# -# What if two conflicting state-based transitions get enabled at the same -# time? In practice there's only one case where this arises (client DONE -> -# MIGHT_SWITCH_PROTOCOL versus DONE -> MUST_CLOSE), and we resolve it by -# explicitly prioritizing the DONE -> MIGHT_SWITCH_PROTOCOL transition. -# -# Implementation -# -------------- -# -# The event-triggered transitions for the server and client machines are all -# stored explicitly in a table. Ditto for the state-triggered transitions that -# involve just the server and client state. -# -# The transitions for the other machines, and the state-triggered transitions -# that involve the other machines, are written out as explicit Python code. -# -# It'd be nice if there were some cleaner way to do all this. This isn't -# *too* terrible, but I feel like it could probably be better. -# -# WARNING -# ------- -# -# The script that generates the state machine diagrams for the docs knows how -# to read out the EVENT_TRIGGERED_TRANSITIONS and STATE_TRIGGERED_TRANSITIONS -# tables. But it can't automatically read the transitions that are written -# directly in Python code. So if you touch those, you need to also update the -# script to keep it in sync! -from typing import cast, Dict, Optional, Set, Tuple, Type, Union - -from ._events import * -from ._util import LocalProtocolError, Sentinel - -# Everything in __all__ gets re-exported as part of the h11 public API. -__all__ = [ - "CLIENT", - "SERVER", - "IDLE", - "SEND_RESPONSE", - "SEND_BODY", - "DONE", - "MUST_CLOSE", - "CLOSED", - "MIGHT_SWITCH_PROTOCOL", - "SWITCHED_PROTOCOL", - "ERROR", -] - - -class CLIENT(Sentinel, metaclass=Sentinel): - pass - - -class SERVER(Sentinel, metaclass=Sentinel): - pass - - -# States -class IDLE(Sentinel, metaclass=Sentinel): - pass - - -class SEND_RESPONSE(Sentinel, metaclass=Sentinel): - pass - - -class SEND_BODY(Sentinel, metaclass=Sentinel): - pass - - -class DONE(Sentinel, metaclass=Sentinel): - pass - - -class MUST_CLOSE(Sentinel, metaclass=Sentinel): - pass - - -class CLOSED(Sentinel, metaclass=Sentinel): - pass - - -class ERROR(Sentinel, metaclass=Sentinel): - pass - - -# Switch types -class MIGHT_SWITCH_PROTOCOL(Sentinel, metaclass=Sentinel): - pass - - -class SWITCHED_PROTOCOL(Sentinel, metaclass=Sentinel): - pass - - -class _SWITCH_UPGRADE(Sentinel, metaclass=Sentinel): - pass - - -class _SWITCH_CONNECT(Sentinel, metaclass=Sentinel): - pass - - -EventTransitionType = Dict[ - Type[Sentinel], - Dict[ - Type[Sentinel], - Dict[Union[Type[Event], Tuple[Type[Event], Type[Sentinel]]], Type[Sentinel]], - ], -] - -EVENT_TRIGGERED_TRANSITIONS: EventTransitionType = { - CLIENT: { - IDLE: {Request: SEND_BODY, ConnectionClosed: CLOSED}, - SEND_BODY: {Data: SEND_BODY, EndOfMessage: DONE}, - DONE: {ConnectionClosed: CLOSED}, - MUST_CLOSE: {ConnectionClosed: CLOSED}, - CLOSED: {ConnectionClosed: CLOSED}, - MIGHT_SWITCH_PROTOCOL: {}, - SWITCHED_PROTOCOL: {}, - ERROR: {}, - }, - SERVER: { - IDLE: { - ConnectionClosed: CLOSED, - Response: SEND_BODY, - # Special case: server sees client Request events, in this form - (Request, CLIENT): SEND_RESPONSE, - }, - SEND_RESPONSE: { - InformationalResponse: SEND_RESPONSE, - Response: SEND_BODY, - (InformationalResponse, _SWITCH_UPGRADE): SWITCHED_PROTOCOL, - (Response, _SWITCH_CONNECT): SWITCHED_PROTOCOL, - }, - SEND_BODY: {Data: SEND_BODY, EndOfMessage: DONE}, - DONE: {ConnectionClosed: CLOSED}, - MUST_CLOSE: {ConnectionClosed: CLOSED}, - CLOSED: {ConnectionClosed: CLOSED}, - SWITCHED_PROTOCOL: {}, - ERROR: {}, - }, -} - -StateTransitionType = Dict[ - Tuple[Type[Sentinel], Type[Sentinel]], Dict[Type[Sentinel], Type[Sentinel]] -] - -# NB: there are also some special-case state-triggered transitions hard-coded -# into _fire_state_triggered_transitions below. -STATE_TRIGGERED_TRANSITIONS: StateTransitionType = { - # (Client state, Server state) -> new states - # Protocol negotiation - (MIGHT_SWITCH_PROTOCOL, SWITCHED_PROTOCOL): {CLIENT: SWITCHED_PROTOCOL}, - # Socket shutdown - (CLOSED, DONE): {SERVER: MUST_CLOSE}, - (CLOSED, IDLE): {SERVER: MUST_CLOSE}, - (ERROR, DONE): {SERVER: MUST_CLOSE}, - (DONE, CLOSED): {CLIENT: MUST_CLOSE}, - (IDLE, CLOSED): {CLIENT: MUST_CLOSE}, - (DONE, ERROR): {CLIENT: MUST_CLOSE}, -} - - -class ConnectionState: - def __init__(self) -> None: - # Extra bits of state that don't quite fit into the state model. - - # If this is False then it enables the automatic DONE -> MUST_CLOSE - # transition. Don't set this directly; call .keep_alive_disabled() - self.keep_alive = True - - # This is a subset of {UPGRADE, CONNECT}, containing the proposals - # made by the client for switching protocols. - self.pending_switch_proposals: Set[Type[Sentinel]] = set() - - self.states: Dict[Type[Sentinel], Type[Sentinel]] = {CLIENT: IDLE, SERVER: IDLE} - - def process_error(self, role: Type[Sentinel]) -> None: - self.states[role] = ERROR - self._fire_state_triggered_transitions() - - def process_keep_alive_disabled(self) -> None: - self.keep_alive = False - self._fire_state_triggered_transitions() - - def process_client_switch_proposal(self, switch_event: Type[Sentinel]) -> None: - self.pending_switch_proposals.add(switch_event) - self._fire_state_triggered_transitions() - - def process_event( - self, - role: Type[Sentinel], - event_type: Type[Event], - server_switch_event: Optional[Type[Sentinel]] = None, - ) -> None: - _event_type: Union[Type[Event], Tuple[Type[Event], Type[Sentinel]]] = event_type - if server_switch_event is not None: - assert role is SERVER - if server_switch_event not in self.pending_switch_proposals: - raise LocalProtocolError( - "Received server {} event without a pending proposal".format( - server_switch_event - ) - ) - _event_type = (event_type, server_switch_event) - if server_switch_event is None and _event_type is Response: - self.pending_switch_proposals = set() - self._fire_event_triggered_transitions(role, _event_type) - # Special case: the server state does get to see Request - # events. - if _event_type is Request: - assert role is CLIENT - self._fire_event_triggered_transitions(SERVER, (Request, CLIENT)) - self._fire_state_triggered_transitions() - - def _fire_event_triggered_transitions( - self, - role: Type[Sentinel], - event_type: Union[Type[Event], Tuple[Type[Event], Type[Sentinel]]], - ) -> None: - state = self.states[role] - try: - new_state = EVENT_TRIGGERED_TRANSITIONS[role][state][event_type] - except KeyError: - event_type = cast(Type[Event], event_type) - raise LocalProtocolError( - "can't handle event type {} when role={} and state={}".format( - event_type.__name__, role, self.states[role] - ) - ) from None - self.states[role] = new_state - - def _fire_state_triggered_transitions(self) -> None: - # We apply these rules repeatedly until converging on a fixed point - while True: - start_states = dict(self.states) - - # It could happen that both these special-case transitions are - # enabled at the same time: - # - # DONE -> MIGHT_SWITCH_PROTOCOL - # DONE -> MUST_CLOSE - # - # For example, this will always be true of a HTTP/1.0 client - # requesting CONNECT. If this happens, the protocol switch takes - # priority. From there the client will either go to - # SWITCHED_PROTOCOL, in which case it's none of our business when - # they close the connection, or else the server will deny the - # request, in which case the client will go back to DONE and then - # from there to MUST_CLOSE. - if self.pending_switch_proposals: - if self.states[CLIENT] is DONE: - self.states[CLIENT] = MIGHT_SWITCH_PROTOCOL - - if not self.pending_switch_proposals: - if self.states[CLIENT] is MIGHT_SWITCH_PROTOCOL: - self.states[CLIENT] = DONE - - if not self.keep_alive: - for role in (CLIENT, SERVER): - if self.states[role] is DONE: - self.states[role] = MUST_CLOSE - - # Tabular state-triggered transitions - joint_state = (self.states[CLIENT], self.states[SERVER]) - changes = STATE_TRIGGERED_TRANSITIONS.get(joint_state, {}) - self.states.update(changes) - - if self.states == start_states: - # Fixed point reached - return - - def start_next_cycle(self) -> None: - if self.states != {CLIENT: DONE, SERVER: DONE}: - raise LocalProtocolError( - "not in a reusable state. self.states={}".format(self.states) - ) - # Can't reach DONE/DONE with any of these active, but still, let's be - # sure. - assert self.keep_alive - assert not self.pending_switch_proposals - self.states = {CLIENT: IDLE, SERVER: IDLE} diff --git a/venv/lib/python3.11/site-packages/h11/_util.py b/venv/lib/python3.11/site-packages/h11/_util.py deleted file mode 100644 index 6718445..0000000 --- a/venv/lib/python3.11/site-packages/h11/_util.py +++ /dev/null @@ -1,135 +0,0 @@ -from typing import Any, Dict, NoReturn, Pattern, Tuple, Type, TypeVar, Union - -__all__ = [ - "ProtocolError", - "LocalProtocolError", - "RemoteProtocolError", - "validate", - "bytesify", -] - - -class ProtocolError(Exception): - """Exception indicating a violation of the HTTP/1.1 protocol. - - This as an abstract base class, with two concrete base classes: - :exc:`LocalProtocolError`, which indicates that you tried to do something - that HTTP/1.1 says is illegal, and :exc:`RemoteProtocolError`, which - indicates that the remote peer tried to do something that HTTP/1.1 says is - illegal. See :ref:`error-handling` for details. - - In addition to the normal :exc:`Exception` features, it has one attribute: - - .. attribute:: error_status_hint - - This gives a suggestion as to what status code a server might use if - this error occurred as part of a request. - - For a :exc:`RemoteProtocolError`, this is useful as a suggestion for - how you might want to respond to a misbehaving peer, if you're - implementing a server. - - For a :exc:`LocalProtocolError`, this can be taken as a suggestion for - how your peer might have responded to *you* if h11 had allowed you to - continue. - - The default is 400 Bad Request, a generic catch-all for protocol - violations. - - """ - - def __init__(self, msg: str, error_status_hint: int = 400) -> None: - if type(self) is ProtocolError: - raise TypeError("tried to directly instantiate ProtocolError") - Exception.__init__(self, msg) - self.error_status_hint = error_status_hint - - -# Strategy: there are a number of public APIs where a LocalProtocolError can -# be raised (send(), all the different event constructors, ...), and only one -# public API where RemoteProtocolError can be raised -# (receive_data()). Therefore we always raise LocalProtocolError internally, -# and then receive_data will translate this into a RemoteProtocolError. -# -# Internally: -# LocalProtocolError is the generic "ProtocolError". -# Externally: -# LocalProtocolError is for local errors and RemoteProtocolError is for -# remote errors. -class LocalProtocolError(ProtocolError): - def _reraise_as_remote_protocol_error(self) -> NoReturn: - # After catching a LocalProtocolError, use this method to re-raise it - # as a RemoteProtocolError. This method must be called from inside an - # except: block. - # - # An easy way to get an equivalent RemoteProtocolError is just to - # modify 'self' in place. - self.__class__ = RemoteProtocolError # type: ignore - # But the re-raising is somewhat non-trivial -- you might think that - # now that we've modified the in-flight exception object, that just - # doing 'raise' to re-raise it would be enough. But it turns out that - # this doesn't work, because Python tracks the exception type - # (exc_info[0]) separately from the exception object (exc_info[1]), - # and we only modified the latter. So we really do need to re-raise - # the new type explicitly. - # On py3, the traceback is part of the exception object, so our - # in-place modification preserved it and we can just re-raise: - raise self - - -class RemoteProtocolError(ProtocolError): - pass - - -def validate( - regex: Pattern[bytes], data: bytes, msg: str = "malformed data", *format_args: Any -) -> Dict[str, bytes]: - match = regex.fullmatch(data) - if not match: - if format_args: - msg = msg.format(*format_args) - raise LocalProtocolError(msg) - return match.groupdict() - - -# Sentinel values -# -# - Inherit identity-based comparison and hashing from object -# - Have a nice repr -# - Have a *bonus property*: type(sentinel) is sentinel -# -# The bonus property is useful if you want to take the return value from -# next_event() and do some sort of dispatch based on type(event). - -_T_Sentinel = TypeVar("_T_Sentinel", bound="Sentinel") - - -class Sentinel(type): - def __new__( - cls: Type[_T_Sentinel], - name: str, - bases: Tuple[type, ...], - namespace: Dict[str, Any], - **kwds: Any - ) -> _T_Sentinel: - assert bases == (Sentinel,) - v = super().__new__(cls, name, bases, namespace, **kwds) - v.__class__ = v # type: ignore - return v - - def __repr__(self) -> str: - return self.__name__ - - -# Used for methods, request targets, HTTP versions, header names, and header -# values. Accepts ascii-strings, or bytes/bytearray/memoryview/..., and always -# returns bytes. -def bytesify(s: Union[bytes, bytearray, memoryview, int, str]) -> bytes: - # Fast-path: - if type(s) is bytes: - return s - if isinstance(s, str): - s = s.encode("ascii") - if isinstance(s, int): - raise TypeError("expected bytes-like object, not int") - return bytes(s) diff --git a/venv/lib/python3.11/site-packages/h11/_version.py b/venv/lib/python3.11/site-packages/h11/_version.py deleted file mode 100644 index 4c89113..0000000 --- a/venv/lib/python3.11/site-packages/h11/_version.py +++ /dev/null @@ -1,16 +0,0 @@ -# This file must be kept very simple, because it is consumed from several -# places -- it is imported by h11/__init__.py, execfile'd by setup.py, etc. - -# We use a simple scheme: -# 1.0.0 -> 1.0.0+dev -> 1.1.0 -> 1.1.0+dev -# where the +dev versions are never released into the wild, they're just what -# we stick into the VCS in between releases. -# -# This is compatible with PEP 440: -# http://legacy.python.org/dev/peps/pep-0440/ -# via the use of the "local suffix" "+dev", which is disallowed on index -# servers and causes 1.0.0+dev to sort after plain 1.0.0, which is what we -# want. (Contrast with the special suffix 1.0.0.dev, which sorts *before* -# 1.0.0.) - -__version__ = "0.14.0" diff --git a/venv/lib/python3.11/site-packages/h11/_writers.py b/venv/lib/python3.11/site-packages/h11/_writers.py deleted file mode 100644 index 939cdb9..0000000 --- a/venv/lib/python3.11/site-packages/h11/_writers.py +++ /dev/null @@ -1,145 +0,0 @@ -# Code to read HTTP data -# -# Strategy: each writer takes an event + a write-some-bytes function, which is -# calls. -# -# WRITERS is a dict describing how to pick a reader. It maps states to either: -# - a writer -# - or, for body writers, a dict of framin-dependent writer factories - -from typing import Any, Callable, Dict, List, Tuple, Type, Union - -from ._events import Data, EndOfMessage, Event, InformationalResponse, Request, Response -from ._headers import Headers -from ._state import CLIENT, IDLE, SEND_BODY, SEND_RESPONSE, SERVER -from ._util import LocalProtocolError, Sentinel - -__all__ = ["WRITERS"] - -Writer = Callable[[bytes], Any] - - -def write_headers(headers: Headers, write: Writer) -> None: - # "Since the Host field-value is critical information for handling a - # request, a user agent SHOULD generate Host as the first header field - # following the request-line." - RFC 7230 - raw_items = headers._full_items - for raw_name, name, value in raw_items: - if name == b"host": - write(b"%s: %s\r\n" % (raw_name, value)) - for raw_name, name, value in raw_items: - if name != b"host": - write(b"%s: %s\r\n" % (raw_name, value)) - write(b"\r\n") - - -def write_request(request: Request, write: Writer) -> None: - if request.http_version != b"1.1": - raise LocalProtocolError("I only send HTTP/1.1") - write(b"%s %s HTTP/1.1\r\n" % (request.method, request.target)) - write_headers(request.headers, write) - - -# Shared between InformationalResponse and Response -def write_any_response( - response: Union[InformationalResponse, Response], write: Writer -) -> None: - if response.http_version != b"1.1": - raise LocalProtocolError("I only send HTTP/1.1") - status_bytes = str(response.status_code).encode("ascii") - # We don't bother sending ascii status messages like "OK"; they're - # optional and ignored by the protocol. (But the space after the numeric - # status code is mandatory.) - # - # XX FIXME: could at least make an effort to pull out the status message - # from stdlib's http.HTTPStatus table. Or maybe just steal their enums - # (either by import or copy/paste). We already accept them as status codes - # since they're of type IntEnum < int. - write(b"HTTP/1.1 %s %s\r\n" % (status_bytes, response.reason)) - write_headers(response.headers, write) - - -class BodyWriter: - def __call__(self, event: Event, write: Writer) -> None: - if type(event) is Data: - self.send_data(event.data, write) - elif type(event) is EndOfMessage: - self.send_eom(event.headers, write) - else: # pragma: no cover - assert False - - def send_data(self, data: bytes, write: Writer) -> None: - pass - - def send_eom(self, headers: Headers, write: Writer) -> None: - pass - - -# -# These are all careful not to do anything to 'data' except call len(data) and -# write(data). This allows us to transparently pass-through funny objects, -# like placeholder objects referring to files on disk that will be sent via -# sendfile(2). -# -class ContentLengthWriter(BodyWriter): - def __init__(self, length: int) -> None: - self._length = length - - def send_data(self, data: bytes, write: Writer) -> None: - self._length -= len(data) - if self._length < 0: - raise LocalProtocolError("Too much data for declared Content-Length") - write(data) - - def send_eom(self, headers: Headers, write: Writer) -> None: - if self._length != 0: - raise LocalProtocolError("Too little data for declared Content-Length") - if headers: - raise LocalProtocolError("Content-Length and trailers don't mix") - - -class ChunkedWriter(BodyWriter): - def send_data(self, data: bytes, write: Writer) -> None: - # if we encoded 0-length data in the naive way, it would look like an - # end-of-message. - if not data: - return - write(b"%x\r\n" % len(data)) - write(data) - write(b"\r\n") - - def send_eom(self, headers: Headers, write: Writer) -> None: - write(b"0\r\n") - write_headers(headers, write) - - -class Http10Writer(BodyWriter): - def send_data(self, data: bytes, write: Writer) -> None: - write(data) - - def send_eom(self, headers: Headers, write: Writer) -> None: - if headers: - raise LocalProtocolError("can't send trailers to HTTP/1.0 client") - # no need to close the socket ourselves, that will be taken care of by - # Connection: close machinery - - -WritersType = Dict[ - Union[Tuple[Type[Sentinel], Type[Sentinel]], Type[Sentinel]], - Union[ - Dict[str, Type[BodyWriter]], - Callable[[Union[InformationalResponse, Response], Writer], None], - Callable[[Request, Writer], None], - ], -] - -WRITERS: WritersType = { - (CLIENT, IDLE): write_request, - (SERVER, IDLE): write_any_response, - (SERVER, SEND_RESPONSE): write_any_response, - SEND_BODY: { - "chunked": ChunkedWriter, - "content-length": ContentLengthWriter, - "http/1.0": Http10Writer, - }, -} diff --git a/venv/lib/python3.11/site-packages/h11/py.typed b/venv/lib/python3.11/site-packages/h11/py.typed deleted file mode 100644 index f5642f7..0000000 --- a/venv/lib/python3.11/site-packages/h11/py.typed +++ /dev/null @@ -1 +0,0 @@ -Marker diff --git a/venv/lib/python3.11/site-packages/h11/tests/__init__.py b/venv/lib/python3.11/site-packages/h11/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/h11/tests/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/h11/tests/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index e1b683c7da778f3271249dbb5b27e23969e3532d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181 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
FrouHC* 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 Ypf2U?{duVX^CV)8Oze!|x_y7O^ diff --git a/venv/lib/python3.11/site-packages/h11/tests/__pycache__/test_headers.cpython-311.pyc b/venv/lib/python3.11/site-packages/h11/tests/__pycache__/test_headers.cpython-311.pyc deleted file mode 100644 index 7b57700d3c75e42bbbbc154fe1a8e2fe6b85c4be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9594 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 Xa!d)HWqkx(Rt!hU%Sikgpym88QjL&R diff --git a/venv/lib/python3.11/site-packages/h11/tests/__pycache__/test_helpers.cpython-311.pyc b/venv/lib/python3.11/site-packages/h11/tests/__pycache__/test_helpers.cpython-311.pyc deleted file mode 100644 index fb2866f053f3460afd9b08196f8cebfec4d7bd34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1517 zcmcIk%WD%s7@ytjW0Gu2=mV0dPy_=}(j|Q&NH4VqMH6UmdkNd@Gzr~DoY}O*lZXck zJ+z?IV^6ix{vjR{$Y~)55s~U88ohXOW=(3+*rErAYlP}8@cs|h!DMqJaKsw*{(Nn&t7-1 zr88^YTtTGb*aUg<3VKvU#PwiLbjq>loHt=JbF=&yevt3?GXg_exi6AX1SjGlEy{7P%wWJ< z8uISDlOYdjgTG@RQu6qW9f%5t{Q9E?FV%+5Ym324vJaoPcK;=NWyt&Q@{64JD~cO_ zeF=XbJmm~PM{y+EVGYdCaS_;%_}ujATPjQOUYNMLTP68|W6(h>A>BZj_$D(x&iXj# zekkl zx^9*$cGXhp&~B<`c}=a<+>&F@Ol2}EDZ40L(F+^&c@VWkB`$pd#K(LInH74?sY=aD zFme8m&j4Se$FZp=A1OQmt?=XrCHk^_AnZ9WoVt>1D9NUhY$?%Q<9Tj7x07or;|F6$ zYjq{lP%=#=Gob3Tifw0ivKJ}O?Al|YVCYLgQKWBx!uJFSMs{!1VXOgTO&Dvz=&RME z>vfoJz;qL)TTmI$j&G0bj4)xc4&x0NZ^C#xEQO@6@li!;g9`v(p}D4btk5l+3VU+* zpMY7L{O0)0z!GEGh+@cqb&0j#uj{Wyvg+Xk0~QirrSJpZu^gjnqD4GOSvFQ=k3u`Z faa@~+9Nz~214aRNs}64Ve{E@uqgA*7{44(iQ2|61 diff --git a/venv/lib/python3.11/site-packages/h11/tests/__pycache__/test_io.cpython-311.pyc b/venv/lib/python3.11/site-packages/h11/tests/__pycache__/test_io.cpython-311.pyc deleted file mode 100644 index f211f9ea333923ca6279be89bf1f66a09c919615..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25530 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 Slqf4X;c(F)a5e<9%>Mx$)&#Zy diff --git a/venv/lib/python3.11/site-packages/h11/tests/__pycache__/test_util.cpython-311.pyc b/venv/lib/python3.11/site-packages/h11/tests/__pycache__/test_util.cpython-311.pyc deleted file mode 100644 index b362ab780d01f19e35259d716bf72f0dc585f4d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7804 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 diff --git a/venv/lib/python3.11/site-packages/h11/tests/data/test-file b/venv/lib/python3.11/site-packages/h11/tests/data/test-file deleted file mode 100644 index d0be0a6..0000000 --- a/venv/lib/python3.11/site-packages/h11/tests/data/test-file +++ /dev/null @@ -1 +0,0 @@ -92b12bc045050b55b848d37167a1a63947c364579889ce1d39788e45e9fac9e5 diff --git a/venv/lib/python3.11/site-packages/h11/tests/helpers.py b/venv/lib/python3.11/site-packages/h11/tests/helpers.py deleted file mode 100644 index 571be44..0000000 --- a/venv/lib/python3.11/site-packages/h11/tests/helpers.py +++ /dev/null @@ -1,101 +0,0 @@ -from typing import cast, List, Type, Union, ValuesView - -from .._connection import Connection, NEED_DATA, PAUSED -from .._events import ( - ConnectionClosed, - Data, - EndOfMessage, - Event, - InformationalResponse, - Request, - Response, -) -from .._state import CLIENT, CLOSED, DONE, MUST_CLOSE, SERVER -from .._util import Sentinel - -try: - from typing import Literal -except ImportError: - from typing_extensions import Literal # type: ignore - - -def get_all_events(conn: Connection) -> List[Event]: - got_events = [] - while True: - event = conn.next_event() - if event in (NEED_DATA, PAUSED): - break - event = cast(Event, event) - got_events.append(event) - if type(event) is ConnectionClosed: - break - return got_events - - -def receive_and_get(conn: Connection, data: bytes) -> List[Event]: - conn.receive_data(data) - return get_all_events(conn) - - -# Merges adjacent Data events, converts payloads to bytestrings, and removes -# chunk boundaries. -def normalize_data_events(in_events: List[Event]) -> List[Event]: - out_events: List[Event] = [] - for event in in_events: - if type(event) is Data: - event = Data(data=bytes(event.data), chunk_start=False, chunk_end=False) - if out_events and type(out_events[-1]) is type(event) is Data: - out_events[-1] = Data( - data=out_events[-1].data + event.data, - chunk_start=out_events[-1].chunk_start, - chunk_end=out_events[-1].chunk_end, - ) - else: - out_events.append(event) - return out_events - - -# Given that we want to write tests that push some events through a Connection -# and check that its state updates appropriately... we might as make a habit -# of pushing them through two Connections with a fake network link in -# between. -class ConnectionPair: - def __init__(self) -> None: - self.conn = {CLIENT: Connection(CLIENT), SERVER: Connection(SERVER)} - self.other = {CLIENT: SERVER, SERVER: CLIENT} - - @property - def conns(self) -> ValuesView[Connection]: - return self.conn.values() - - # expect="match" if expect=send_events; expect=[...] to say what expected - def send( - self, - role: Type[Sentinel], - send_events: Union[List[Event], Event], - expect: Union[List[Event], Event, Literal["match"]] = "match", - ) -> bytes: - if not isinstance(send_events, list): - send_events = [send_events] - data = b"" - closed = False - for send_event in send_events: - new_data = self.conn[role].send(send_event) - if new_data is None: - closed = True - else: - data += new_data - # send uses b"" to mean b"", and None to mean closed - # receive uses b"" to mean closed, and None to mean "try again" - # so we have to translate between the two conventions - if data: - self.conn[self.other[role]].receive_data(data) - if closed: - self.conn[self.other[role]].receive_data(b"") - got_events = get_all_events(self.conn[self.other[role]]) - if expect == "match": - expect = send_events - if not isinstance(expect, list): - expect = [expect] - assert got_events == expect - return data diff --git a/venv/lib/python3.11/site-packages/h11/tests/test_against_stdlib_http.py b/venv/lib/python3.11/site-packages/h11/tests/test_against_stdlib_http.py deleted file mode 100644 index d2ee131..0000000 --- a/venv/lib/python3.11/site-packages/h11/tests/test_against_stdlib_http.py +++ /dev/null @@ -1,115 +0,0 @@ -import json -import os.path -import socket -import socketserver -import threading -from contextlib import closing, contextmanager -from http.server import SimpleHTTPRequestHandler -from typing import Callable, Generator -from urllib.request import urlopen - -import h11 - - -@contextmanager -def socket_server( - handler: Callable[..., socketserver.BaseRequestHandler] -) -> Generator[socketserver.TCPServer, None, None]: - httpd = socketserver.TCPServer(("127.0.0.1", 0), handler) - thread = threading.Thread( - target=httpd.serve_forever, kwargs={"poll_interval": 0.01} - ) - thread.daemon = True - try: - thread.start() - yield httpd - finally: - httpd.shutdown() - - -test_file_path = os.path.join(os.path.dirname(__file__), "data/test-file") -with open(test_file_path, "rb") as f: - test_file_data = f.read() - - -class SingleMindedRequestHandler(SimpleHTTPRequestHandler): - def translate_path(self, path: str) -> str: - return test_file_path - - -def test_h11_as_client() -> None: - with socket_server(SingleMindedRequestHandler) as httpd: - with closing(socket.create_connection(httpd.server_address)) as s: - c = h11.Connection(h11.CLIENT) - - s.sendall( - c.send( # type: ignore[arg-type] - h11.Request( - method="GET", target="/foo", headers=[("Host", "localhost")] - ) - ) - ) - s.sendall(c.send(h11.EndOfMessage())) # type: ignore[arg-type] - - data = bytearray() - while True: - event = c.next_event() - print(event) - if event is h11.NEED_DATA: - # Use a small read buffer to make things more challenging - # and exercise more paths :-) - c.receive_data(s.recv(10)) - continue - if type(event) is h11.Response: - assert event.status_code == 200 - if type(event) is h11.Data: - data += event.data - if type(event) is h11.EndOfMessage: - break - assert bytes(data) == test_file_data - - -class H11RequestHandler(socketserver.BaseRequestHandler): - def handle(self) -> None: - with closing(self.request) as s: - c = h11.Connection(h11.SERVER) - request = None - while True: - event = c.next_event() - if event is h11.NEED_DATA: - # Use a small read buffer to make things more challenging - # and exercise more paths :-) - c.receive_data(s.recv(10)) - continue - if type(event) is h11.Request: - request = event - if type(event) is h11.EndOfMessage: - break - assert request is not None - info = json.dumps( - { - "method": request.method.decode("ascii"), - "target": request.target.decode("ascii"), - "headers": { - name.decode("ascii"): value.decode("ascii") - for (name, value) in request.headers - }, - } - ) - s.sendall(c.send(h11.Response(status_code=200, headers=[]))) # type: ignore[arg-type] - s.sendall(c.send(h11.Data(data=info.encode("ascii")))) - s.sendall(c.send(h11.EndOfMessage())) - - -def test_h11_as_server() -> None: - with socket_server(H11RequestHandler) as httpd: - host, port = httpd.server_address - url = "http://{}:{}/some-path".format(host, port) - with closing(urlopen(url)) as f: - assert f.getcode() == 200 - data = f.read() - info = json.loads(data.decode("ascii")) - print(info) - assert info["method"] == "GET" - assert info["target"] == "/some-path" - assert "urllib" in info["headers"]["user-agent"] diff --git a/venv/lib/python3.11/site-packages/h11/tests/test_connection.py b/venv/lib/python3.11/site-packages/h11/tests/test_connection.py deleted file mode 100644 index 73a27b9..0000000 --- a/venv/lib/python3.11/site-packages/h11/tests/test_connection.py +++ /dev/null @@ -1,1122 +0,0 @@ -from typing import Any, cast, Dict, List, Optional, Tuple, Type - -import pytest - -from .._connection import _body_framing, _keep_alive, Connection, NEED_DATA, PAUSED -from .._events import ( - ConnectionClosed, - Data, - EndOfMessage, - Event, - InformationalResponse, - Request, - Response, -) -from .._state import ( - CLIENT, - CLOSED, - DONE, - ERROR, - IDLE, - MIGHT_SWITCH_PROTOCOL, - MUST_CLOSE, - SEND_BODY, - SEND_RESPONSE, - SERVER, - SWITCHED_PROTOCOL, -) -from .._util import LocalProtocolError, RemoteProtocolError, Sentinel -from .helpers import ConnectionPair, get_all_events, receive_and_get - - -def test__keep_alive() -> None: - assert _keep_alive( - Request(method="GET", target="/", headers=[("Host", "Example.com")]) - ) - assert not _keep_alive( - Request( - method="GET", - target="/", - headers=[("Host", "Example.com"), ("Connection", "close")], - ) - ) - assert not _keep_alive( - Request( - method="GET", - target="/", - headers=[("Host", "Example.com"), ("Connection", "a, b, cLOse, foo")], - ) - ) - assert not _keep_alive( - Request(method="GET", target="/", headers=[], http_version="1.0") # type: ignore[arg-type] - ) - - assert _keep_alive(Response(status_code=200, headers=[])) # type: ignore[arg-type] - assert not _keep_alive(Response(status_code=200, headers=[("Connection", "close")])) - assert not _keep_alive( - Response(status_code=200, headers=[("Connection", "a, b, cLOse, foo")]) - ) - assert not _keep_alive(Response(status_code=200, headers=[], http_version="1.0")) # type: ignore[arg-type] - - -def test__body_framing() -> None: - def headers(cl: Optional[int], te: bool) -> List[Tuple[str, str]]: - headers = [] - if cl is not None: - headers.append(("Content-Length", str(cl))) - if te: - headers.append(("Transfer-Encoding", "chunked")) - return headers - - def resp( - status_code: int = 200, cl: Optional[int] = None, te: bool = False - ) -> Response: - return Response(status_code=status_code, headers=headers(cl, te)) - - def req(cl: Optional[int] = None, te: bool = False) -> Request: - h = headers(cl, te) - h += [("Host", "example.com")] - return Request(method="GET", target="/", headers=h) - - # Special cases where the headers are ignored: - for kwargs in [{}, {"cl": 100}, {"te": True}, {"cl": 100, "te": True}]: - kwargs = cast(Dict[str, Any], kwargs) - for meth, r in [ - (b"HEAD", resp(**kwargs)), - (b"GET", resp(status_code=204, **kwargs)), - (b"GET", resp(status_code=304, **kwargs)), - ]: - assert _body_framing(meth, r) == ("content-length", (0,)) - - # Transfer-encoding - for kwargs in [{"te": True}, {"cl": 100, "te": True}]: - kwargs = cast(Dict[str, Any], kwargs) - for meth, r in [(None, req(**kwargs)), (b"GET", resp(**kwargs))]: # type: ignore - assert _body_framing(meth, r) == ("chunked", ()) - - # Content-Length - for meth, r in [(None, req(cl=100)), (b"GET", resp(cl=100))]: # type: ignore - assert _body_framing(meth, r) == ("content-length", (100,)) - - # No headers - assert _body_framing(None, req()) == ("content-length", (0,)) # type: ignore - assert _body_framing(b"GET", resp()) == ("http/1.0", ()) - - -def test_Connection_basics_and_content_length() -> None: - with pytest.raises(ValueError): - Connection("CLIENT") # type: ignore - - p = ConnectionPair() - assert p.conn[CLIENT].our_role is CLIENT - assert p.conn[CLIENT].their_role is SERVER - assert p.conn[SERVER].our_role is SERVER - assert p.conn[SERVER].their_role is CLIENT - - data = p.send( - CLIENT, - Request( - method="GET", - target="/", - headers=[("Host", "example.com"), ("Content-Length", "10")], - ), - ) - assert data == ( - b"GET / HTTP/1.1\r\n" b"Host: example.com\r\n" b"Content-Length: 10\r\n\r\n" - ) - - for conn in p.conns: - assert conn.states == {CLIENT: SEND_BODY, SERVER: SEND_RESPONSE} - assert p.conn[CLIENT].our_state is SEND_BODY - assert p.conn[CLIENT].their_state is SEND_RESPONSE - assert p.conn[SERVER].our_state is SEND_RESPONSE - assert p.conn[SERVER].their_state is SEND_BODY - - assert p.conn[CLIENT].their_http_version is None - assert p.conn[SERVER].their_http_version == b"1.1" - - data = p.send(SERVER, InformationalResponse(status_code=100, headers=[])) # type: ignore[arg-type] - assert data == b"HTTP/1.1 100 \r\n\r\n" - - data = p.send(SERVER, Response(status_code=200, headers=[("Content-Length", "11")])) - assert data == b"HTTP/1.1 200 \r\nContent-Length: 11\r\n\r\n" - - for conn in p.conns: - assert conn.states == {CLIENT: SEND_BODY, SERVER: SEND_BODY} - - assert p.conn[CLIENT].their_http_version == b"1.1" - assert p.conn[SERVER].their_http_version == b"1.1" - - data = p.send(CLIENT, Data(data=b"12345")) - assert data == b"12345" - data = p.send( - CLIENT, Data(data=b"67890"), expect=[Data(data=b"67890"), EndOfMessage()] - ) - assert data == b"67890" - data = p.send(CLIENT, EndOfMessage(), expect=[]) - assert data == b"" - - for conn in p.conns: - assert conn.states == {CLIENT: DONE, SERVER: SEND_BODY} - - data = p.send(SERVER, Data(data=b"1234567890")) - assert data == b"1234567890" - data = p.send(SERVER, Data(data=b"1"), expect=[Data(data=b"1"), EndOfMessage()]) - assert data == b"1" - data = p.send(SERVER, EndOfMessage(), expect=[]) - assert data == b"" - - for conn in p.conns: - assert conn.states == {CLIENT: DONE, SERVER: DONE} - - -def test_chunked() -> None: - p = ConnectionPair() - - p.send( - CLIENT, - Request( - method="GET", - target="/", - headers=[("Host", "example.com"), ("Transfer-Encoding", "chunked")], - ), - ) - data = p.send(CLIENT, Data(data=b"1234567890", chunk_start=True, chunk_end=True)) - assert data == b"a\r\n1234567890\r\n" - data = p.send(CLIENT, Data(data=b"abcde", chunk_start=True, chunk_end=True)) - assert data == b"5\r\nabcde\r\n" - data = p.send(CLIENT, Data(data=b""), expect=[]) - assert data == b"" - data = p.send(CLIENT, EndOfMessage(headers=[("hello", "there")])) - assert data == b"0\r\nhello: there\r\n\r\n" - - p.send( - SERVER, Response(status_code=200, headers=[("Transfer-Encoding", "chunked")]) - ) - p.send(SERVER, Data(data=b"54321", chunk_start=True, chunk_end=True)) - p.send(SERVER, Data(data=b"12345", chunk_start=True, chunk_end=True)) - p.send(SERVER, EndOfMessage()) - - for conn in p.conns: - assert conn.states == {CLIENT: DONE, SERVER: DONE} - - -def test_chunk_boundaries() -> None: - conn = Connection(our_role=SERVER) - - request = ( - b"POST / HTTP/1.1\r\n" - b"Host: example.com\r\n" - b"Transfer-Encoding: chunked\r\n" - b"\r\n" - ) - conn.receive_data(request) - assert conn.next_event() == Request( - method="POST", - target="/", - headers=[("Host", "example.com"), ("Transfer-Encoding", "chunked")], - ) - assert conn.next_event() is NEED_DATA - - conn.receive_data(b"5\r\nhello\r\n") - assert conn.next_event() == Data(data=b"hello", chunk_start=True, chunk_end=True) - - conn.receive_data(b"5\r\nhel") - assert conn.next_event() == Data(data=b"hel", chunk_start=True, chunk_end=False) - - conn.receive_data(b"l") - assert conn.next_event() == Data(data=b"l", chunk_start=False, chunk_end=False) - - conn.receive_data(b"o\r\n") - assert conn.next_event() == Data(data=b"o", chunk_start=False, chunk_end=True) - - conn.receive_data(b"5\r\nhello") - assert conn.next_event() == Data(data=b"hello", chunk_start=True, chunk_end=True) - - conn.receive_data(b"\r\n") - assert conn.next_event() == NEED_DATA - - conn.receive_data(b"0\r\n\r\n") - assert conn.next_event() == EndOfMessage() - - -def test_client_talking_to_http10_server() -> None: - c = Connection(CLIENT) - c.send(Request(method="GET", target="/", headers=[("Host", "example.com")])) - c.send(EndOfMessage()) - assert c.our_state is DONE - # No content-length, so Http10 framing for body - assert receive_and_get(c, b"HTTP/1.0 200 OK\r\n\r\n") == [ - Response(status_code=200, headers=[], http_version="1.0", reason=b"OK") # type: ignore[arg-type] - ] - assert c.our_state is MUST_CLOSE - assert receive_and_get(c, b"12345") == [Data(data=b"12345")] - assert receive_and_get(c, b"67890") == [Data(data=b"67890")] - assert receive_and_get(c, b"") == [EndOfMessage(), ConnectionClosed()] - assert c.their_state is CLOSED - - -def test_server_talking_to_http10_client() -> None: - c = Connection(SERVER) - # No content-length, so no body - # NB: no host header - assert receive_and_get(c, b"GET / HTTP/1.0\r\n\r\n") == [ - Request(method="GET", target="/", headers=[], http_version="1.0"), # type: ignore[arg-type] - EndOfMessage(), - ] - assert c.their_state is MUST_CLOSE - - # We automatically Connection: close back at them - assert ( - c.send(Response(status_code=200, headers=[])) # type: ignore[arg-type] - == b"HTTP/1.1 200 \r\nConnection: close\r\n\r\n" - ) - - assert c.send(Data(data=b"12345")) == b"12345" - assert c.send(EndOfMessage()) == b"" - assert c.our_state is MUST_CLOSE - - # Check that it works if they do send Content-Length - c = Connection(SERVER) - # NB: no host header - assert receive_and_get(c, b"POST / HTTP/1.0\r\nContent-Length: 10\r\n\r\n1") == [ - Request( - method="POST", - target="/", - headers=[("Content-Length", "10")], - http_version="1.0", - ), - Data(data=b"1"), - ] - assert receive_and_get(c, b"234567890") == [Data(data=b"234567890"), EndOfMessage()] - assert c.their_state is MUST_CLOSE - assert receive_and_get(c, b"") == [ConnectionClosed()] - - -def test_automatic_transfer_encoding_in_response() -> None: - # Check that in responses, the user can specify either Transfer-Encoding: - # chunked or no framing at all, and in both cases we automatically select - # the right option depending on whether the peer speaks HTTP/1.0 or - # HTTP/1.1 - for user_headers in [ - [("Transfer-Encoding", "chunked")], - [], - # In fact, this even works if Content-Length is set, - # because if both are set then Transfer-Encoding wins - [("Transfer-Encoding", "chunked"), ("Content-Length", "100")], - ]: - user_headers = cast(List[Tuple[str, str]], user_headers) - p = ConnectionPair() - p.send( - CLIENT, - [ - Request(method="GET", target="/", headers=[("Host", "example.com")]), - EndOfMessage(), - ], - ) - # When speaking to HTTP/1.1 client, all of the above cases get - # normalized to Transfer-Encoding: chunked - p.send( - SERVER, - Response(status_code=200, headers=user_headers), - expect=Response( - status_code=200, headers=[("Transfer-Encoding", "chunked")] - ), - ) - - # When speaking to HTTP/1.0 client, all of the above cases get - # normalized to no-framing-headers - c = Connection(SERVER) - receive_and_get(c, b"GET / HTTP/1.0\r\n\r\n") - assert ( - c.send(Response(status_code=200, headers=user_headers)) - == b"HTTP/1.1 200 \r\nConnection: close\r\n\r\n" - ) - assert c.send(Data(data=b"12345")) == b"12345" - - -def test_automagic_connection_close_handling() -> None: - p = ConnectionPair() - # If the user explicitly sets Connection: close, then we notice and - # respect it - p.send( - CLIENT, - [ - Request( - method="GET", - target="/", - headers=[("Host", "example.com"), ("Connection", "close")], - ), - EndOfMessage(), - ], - ) - for conn in p.conns: - assert conn.states[CLIENT] is MUST_CLOSE - # And if the client sets it, the server automatically echoes it back - p.send( - SERVER, - # no header here... - [Response(status_code=204, headers=[]), EndOfMessage()], # type: ignore[arg-type] - # ...but oh look, it arrived anyway - expect=[ - Response(status_code=204, headers=[("connection", "close")]), - EndOfMessage(), - ], - ) - for conn in p.conns: - assert conn.states == {CLIENT: MUST_CLOSE, SERVER: MUST_CLOSE} - - -def test_100_continue() -> None: - def setup() -> ConnectionPair: - p = ConnectionPair() - p.send( - CLIENT, - Request( - method="GET", - target="/", - headers=[ - ("Host", "example.com"), - ("Content-Length", "100"), - ("Expect", "100-continue"), - ], - ), - ) - for conn in p.conns: - assert conn.client_is_waiting_for_100_continue - assert not p.conn[CLIENT].they_are_waiting_for_100_continue - assert p.conn[SERVER].they_are_waiting_for_100_continue - return p - - # Disabled by 100 Continue - p = setup() - p.send(SERVER, InformationalResponse(status_code=100, headers=[])) # type: ignore[arg-type] - for conn in p.conns: - assert not conn.client_is_waiting_for_100_continue - assert not conn.they_are_waiting_for_100_continue - - # Disabled by a real response - p = setup() - p.send( - SERVER, Response(status_code=200, headers=[("Transfer-Encoding", "chunked")]) - ) - for conn in p.conns: - assert not conn.client_is_waiting_for_100_continue - assert not conn.they_are_waiting_for_100_continue - - # Disabled by the client going ahead and sending stuff anyway - p = setup() - p.send(CLIENT, Data(data=b"12345")) - for conn in p.conns: - assert not conn.client_is_waiting_for_100_continue - assert not conn.they_are_waiting_for_100_continue - - -def test_max_incomplete_event_size_countermeasure() -> None: - # Infinitely long headers are definitely not okay - c = Connection(SERVER) - c.receive_data(b"GET / HTTP/1.0\r\nEndless: ") - assert c.next_event() is NEED_DATA - with pytest.raises(RemoteProtocolError): - while True: - c.receive_data(b"a" * 1024) - c.next_event() - - # Checking that the same header is accepted / rejected depending on the - # max_incomplete_event_size setting: - c = Connection(SERVER, max_incomplete_event_size=5000) - c.receive_data(b"GET / HTTP/1.0\r\nBig: ") - c.receive_data(b"a" * 4000) - c.receive_data(b"\r\n\r\n") - assert get_all_events(c) == [ - Request( - method="GET", target="/", http_version="1.0", headers=[("big", "a" * 4000)] - ), - EndOfMessage(), - ] - - c = Connection(SERVER, max_incomplete_event_size=4000) - c.receive_data(b"GET / HTTP/1.0\r\nBig: ") - c.receive_data(b"a" * 4000) - with pytest.raises(RemoteProtocolError): - c.next_event() - - # Temporarily exceeding the size limit is fine, as long as its done with - # complete events: - c = Connection(SERVER, max_incomplete_event_size=5000) - c.receive_data(b"GET / HTTP/1.0\r\nContent-Length: 10000") - c.receive_data(b"\r\n\r\n" + b"a" * 10000) - assert get_all_events(c) == [ - Request( - method="GET", - target="/", - http_version="1.0", - headers=[("Content-Length", "10000")], - ), - Data(data=b"a" * 10000), - EndOfMessage(), - ] - - c = Connection(SERVER, max_incomplete_event_size=100) - # Two pipelined requests to create a way-too-big receive buffer... but - # it's fine because we're not checking - c.receive_data( - b"GET /1 HTTP/1.1\r\nHost: a\r\n\r\n" - b"GET /2 HTTP/1.1\r\nHost: b\r\n\r\n" + b"X" * 1000 - ) - assert get_all_events(c) == [ - Request(method="GET", target="/1", headers=[("host", "a")]), - EndOfMessage(), - ] - # Even more data comes in, still no problem - c.receive_data(b"X" * 1000) - # We can respond and reuse to get the second pipelined request - c.send(Response(status_code=200, headers=[])) # type: ignore[arg-type] - c.send(EndOfMessage()) - c.start_next_cycle() - assert get_all_events(c) == [ - Request(method="GET", target="/2", headers=[("host", "b")]), - EndOfMessage(), - ] - # But once we unpause and try to read the next message, and find that it's - # incomplete and the buffer is *still* way too large, then *that's* a - # problem: - c.send(Response(status_code=200, headers=[])) # type: ignore[arg-type] - c.send(EndOfMessage()) - c.start_next_cycle() - with pytest.raises(RemoteProtocolError): - c.next_event() - - -def test_reuse_simple() -> None: - p = ConnectionPair() - p.send( - CLIENT, - [Request(method="GET", target="/", headers=[("Host", "a")]), EndOfMessage()], - ) - p.send( - SERVER, - [ - Response(status_code=200, headers=[(b"transfer-encoding", b"chunked")]), - EndOfMessage(), - ], - ) - for conn in p.conns: - assert conn.states == {CLIENT: DONE, SERVER: DONE} - conn.start_next_cycle() - - p.send( - CLIENT, - [ - Request(method="DELETE", target="/foo", headers=[("Host", "a")]), - EndOfMessage(), - ], - ) - p.send( - SERVER, - [ - Response(status_code=404, headers=[(b"transfer-encoding", b"chunked")]), - EndOfMessage(), - ], - ) - - -def test_pipelining() -> None: - # Client doesn't support pipelining, so we have to do this by hand - c = Connection(SERVER) - assert c.next_event() is NEED_DATA - # 3 requests all bunched up - c.receive_data( - b"GET /1 HTTP/1.1\r\nHost: a.com\r\nContent-Length: 5\r\n\r\n" - b"12345" - b"GET /2 HTTP/1.1\r\nHost: a.com\r\nContent-Length: 5\r\n\r\n" - b"67890" - b"GET /3 HTTP/1.1\r\nHost: a.com\r\n\r\n" - ) - assert get_all_events(c) == [ - Request( - method="GET", - target="/1", - headers=[("Host", "a.com"), ("Content-Length", "5")], - ), - Data(data=b"12345"), - EndOfMessage(), - ] - assert c.their_state is DONE - assert c.our_state is SEND_RESPONSE - - assert c.next_event() is PAUSED - - c.send(Response(status_code=200, headers=[])) # type: ignore[arg-type] - c.send(EndOfMessage()) - assert c.their_state is DONE - assert c.our_state is DONE - - c.start_next_cycle() - - assert get_all_events(c) == [ - Request( - method="GET", - target="/2", - headers=[("Host", "a.com"), ("Content-Length", "5")], - ), - Data(data=b"67890"), - EndOfMessage(), - ] - assert c.next_event() is PAUSED - c.send(Response(status_code=200, headers=[])) # type: ignore[arg-type] - c.send(EndOfMessage()) - c.start_next_cycle() - - assert get_all_events(c) == [ - Request(method="GET", target="/3", headers=[("Host", "a.com")]), - EndOfMessage(), - ] - # Doesn't pause this time, no trailing data - assert c.next_event() is NEED_DATA - c.send(Response(status_code=200, headers=[])) # type: ignore[arg-type] - c.send(EndOfMessage()) - - # Arrival of more data triggers pause - assert c.next_event() is NEED_DATA - c.receive_data(b"SADF") - assert c.next_event() is PAUSED - assert c.trailing_data == (b"SADF", False) - # If EOF arrives while paused, we don't see that either: - c.receive_data(b"") - assert c.trailing_data == (b"SADF", True) - assert c.next_event() is PAUSED - c.receive_data(b"") - assert c.next_event() is PAUSED - # Can't call receive_data with non-empty buf after closing it - with pytest.raises(RuntimeError): - c.receive_data(b"FDSA") - - -def test_protocol_switch() -> None: - for (req, deny, accept) in [ - ( - Request( - method="CONNECT", - target="example.com:443", - headers=[("Host", "foo"), ("Content-Length", "1")], - ), - Response(status_code=404, headers=[(b"transfer-encoding", b"chunked")]), - Response(status_code=200, headers=[(b"transfer-encoding", b"chunked")]), - ), - ( - Request( - method="GET", - target="/", - headers=[("Host", "foo"), ("Content-Length", "1"), ("Upgrade", "a, b")], - ), - Response(status_code=200, headers=[(b"transfer-encoding", b"chunked")]), - InformationalResponse(status_code=101, headers=[("Upgrade", "a")]), - ), - ( - Request( - method="CONNECT", - target="example.com:443", - headers=[("Host", "foo"), ("Content-Length", "1"), ("Upgrade", "a, b")], - ), - Response(status_code=404, headers=[(b"transfer-encoding", b"chunked")]), - # Accept CONNECT, not upgrade - Response(status_code=200, headers=[(b"transfer-encoding", b"chunked")]), - ), - ( - Request( - method="CONNECT", - target="example.com:443", - headers=[("Host", "foo"), ("Content-Length", "1"), ("Upgrade", "a, b")], - ), - Response(status_code=404, headers=[(b"transfer-encoding", b"chunked")]), - # Accept Upgrade, not CONNECT - InformationalResponse(status_code=101, headers=[("Upgrade", "b")]), - ), - ]: - - def setup() -> ConnectionPair: - p = ConnectionPair() - p.send(CLIENT, req) - # No switch-related state change stuff yet; the client has to - # finish the request before that kicks in - for conn in p.conns: - assert conn.states[CLIENT] is SEND_BODY - p.send(CLIENT, [Data(data=b"1"), EndOfMessage()]) - for conn in p.conns: - assert conn.states[CLIENT] is MIGHT_SWITCH_PROTOCOL - assert p.conn[SERVER].next_event() is PAUSED - return p - - # Test deny case - p = setup() - p.send(SERVER, deny) - for conn in p.conns: - assert conn.states == {CLIENT: DONE, SERVER: SEND_BODY} - p.send(SERVER, EndOfMessage()) - # Check that re-use is still allowed after a denial - for conn in p.conns: - conn.start_next_cycle() - - # Test accept case - p = setup() - p.send(SERVER, accept) - for conn in p.conns: - assert conn.states == {CLIENT: SWITCHED_PROTOCOL, SERVER: SWITCHED_PROTOCOL} - conn.receive_data(b"123") - assert conn.next_event() is PAUSED - conn.receive_data(b"456") - assert conn.next_event() is PAUSED - assert conn.trailing_data == (b"123456", False) - - # Pausing in might-switch, then recovery - # (weird artificial case where the trailing data actually is valid - # HTTP for some reason, because this makes it easier to test the state - # logic) - p = setup() - sc = p.conn[SERVER] - sc.receive_data(b"GET / HTTP/1.0\r\n\r\n") - assert sc.next_event() is PAUSED - assert sc.trailing_data == (b"GET / HTTP/1.0\r\n\r\n", False) - sc.send(deny) - assert sc.next_event() is PAUSED - sc.send(EndOfMessage()) - sc.start_next_cycle() - assert get_all_events(sc) == [ - Request(method="GET", target="/", headers=[], http_version="1.0"), # type: ignore[arg-type] - EndOfMessage(), - ] - - # When we're DONE, have no trailing data, and the connection gets - # closed, we report ConnectionClosed(). When we're in might-switch or - # switched, we don't. - p = setup() - sc = p.conn[SERVER] - sc.receive_data(b"") - assert sc.next_event() is PAUSED - assert sc.trailing_data == (b"", True) - p.send(SERVER, accept) - assert sc.next_event() is PAUSED - - p = setup() - sc = p.conn[SERVER] - sc.receive_data(b"") - assert sc.next_event() is PAUSED - sc.send(deny) - assert sc.next_event() == ConnectionClosed() - - # You can't send after switching protocols, or while waiting for a - # protocol switch - p = setup() - with pytest.raises(LocalProtocolError): - p.conn[CLIENT].send( - Request(method="GET", target="/", headers=[("Host", "a")]) - ) - p = setup() - p.send(SERVER, accept) - with pytest.raises(LocalProtocolError): - p.conn[SERVER].send(Data(data=b"123")) - - -def test_close_simple() -> None: - # Just immediately closing a new connection without anything having - # happened yet. - for (who_shot_first, who_shot_second) in [(CLIENT, SERVER), (SERVER, CLIENT)]: - - def setup() -> ConnectionPair: - p = ConnectionPair() - p.send(who_shot_first, ConnectionClosed()) - for conn in p.conns: - assert conn.states == { - who_shot_first: CLOSED, - who_shot_second: MUST_CLOSE, - } - return p - - # You can keep putting b"" into a closed connection, and you keep - # getting ConnectionClosed() out: - p = setup() - assert p.conn[who_shot_second].next_event() == ConnectionClosed() - assert p.conn[who_shot_second].next_event() == ConnectionClosed() - p.conn[who_shot_second].receive_data(b"") - assert p.conn[who_shot_second].next_event() == ConnectionClosed() - # Second party can close... - p = setup() - p.send(who_shot_second, ConnectionClosed()) - for conn in p.conns: - assert conn.our_state is CLOSED - assert conn.their_state is CLOSED - # But trying to receive new data on a closed connection is a - # RuntimeError (not ProtocolError, because the problem here isn't - # violation of HTTP, it's violation of physics) - p = setup() - with pytest.raises(RuntimeError): - p.conn[who_shot_second].receive_data(b"123") - # And receiving new data on a MUST_CLOSE connection is a ProtocolError - p = setup() - p.conn[who_shot_first].receive_data(b"GET") - with pytest.raises(RemoteProtocolError): - p.conn[who_shot_first].next_event() - - -def test_close_different_states() -> None: - req = [ - Request(method="GET", target="/foo", headers=[("Host", "a")]), - EndOfMessage(), - ] - resp = [ - Response(status_code=200, headers=[(b"transfer-encoding", b"chunked")]), - EndOfMessage(), - ] - - # Client before request - p = ConnectionPair() - p.send(CLIENT, ConnectionClosed()) - for conn in p.conns: - assert conn.states == {CLIENT: CLOSED, SERVER: MUST_CLOSE} - - # Client after request - p = ConnectionPair() - p.send(CLIENT, req) - p.send(CLIENT, ConnectionClosed()) - for conn in p.conns: - assert conn.states == {CLIENT: CLOSED, SERVER: SEND_RESPONSE} - - # Server after request -> not allowed - p = ConnectionPair() - p.send(CLIENT, req) - with pytest.raises(LocalProtocolError): - p.conn[SERVER].send(ConnectionClosed()) - p.conn[CLIENT].receive_data(b"") - with pytest.raises(RemoteProtocolError): - p.conn[CLIENT].next_event() - - # Server after response - p = ConnectionPair() - p.send(CLIENT, req) - p.send(SERVER, resp) - p.send(SERVER, ConnectionClosed()) - for conn in p.conns: - assert conn.states == {CLIENT: MUST_CLOSE, SERVER: CLOSED} - - # Both after closing (ConnectionClosed() is idempotent) - p = ConnectionPair() - p.send(CLIENT, req) - p.send(SERVER, resp) - p.send(CLIENT, ConnectionClosed()) - p.send(SERVER, ConnectionClosed()) - p.send(CLIENT, ConnectionClosed()) - p.send(SERVER, ConnectionClosed()) - - # In the middle of sending -> not allowed - p = ConnectionPair() - p.send( - CLIENT, - Request( - method="GET", target="/", headers=[("Host", "a"), ("Content-Length", "10")] - ), - ) - with pytest.raises(LocalProtocolError): - p.conn[CLIENT].send(ConnectionClosed()) - p.conn[SERVER].receive_data(b"") - with pytest.raises(RemoteProtocolError): - p.conn[SERVER].next_event() - - -# Receive several requests and then client shuts down their side of the -# connection; we can respond to each -def test_pipelined_close() -> None: - c = Connection(SERVER) - # 2 requests then a close - c.receive_data( - b"GET /1 HTTP/1.1\r\nHost: a.com\r\nContent-Length: 5\r\n\r\n" - b"12345" - b"GET /2 HTTP/1.1\r\nHost: a.com\r\nContent-Length: 5\r\n\r\n" - b"67890" - ) - c.receive_data(b"") - assert get_all_events(c) == [ - Request( - method="GET", - target="/1", - headers=[("host", "a.com"), ("content-length", "5")], - ), - Data(data=b"12345"), - EndOfMessage(), - ] - assert c.states[CLIENT] is DONE - c.send(Response(status_code=200, headers=[])) # type: ignore[arg-type] - c.send(EndOfMessage()) - assert c.states[SERVER] is DONE - c.start_next_cycle() - assert get_all_events(c) == [ - Request( - method="GET", - target="/2", - headers=[("host", "a.com"), ("content-length", "5")], - ), - Data(data=b"67890"), - EndOfMessage(), - ConnectionClosed(), - ] - assert c.states == {CLIENT: CLOSED, SERVER: SEND_RESPONSE} - c.send(Response(status_code=200, headers=[])) # type: ignore[arg-type] - c.send(EndOfMessage()) - assert c.states == {CLIENT: CLOSED, SERVER: MUST_CLOSE} - c.send(ConnectionClosed()) - assert c.states == {CLIENT: CLOSED, SERVER: CLOSED} - - -def test_sendfile() -> None: - class SendfilePlaceholder: - def __len__(self) -> int: - return 10 - - placeholder = SendfilePlaceholder() - - def setup( - header: Tuple[str, str], http_version: str - ) -> Tuple[Connection, Optional[List[bytes]]]: - c = Connection(SERVER) - receive_and_get( - c, "GET / HTTP/{}\r\nHost: a\r\n\r\n".format(http_version).encode("ascii") - ) - headers = [] - if header: - headers.append(header) - c.send(Response(status_code=200, headers=headers)) - return c, c.send_with_data_passthrough(Data(data=placeholder)) # type: ignore - - c, data = setup(("Content-Length", "10"), "1.1") - assert data == [placeholder] # type: ignore - # Raises an error if the connection object doesn't think we've sent - # exactly 10 bytes - c.send(EndOfMessage()) - - _, data = setup(("Transfer-Encoding", "chunked"), "1.1") - assert placeholder in data # type: ignore - data[data.index(placeholder)] = b"x" * 10 # type: ignore - assert b"".join(data) == b"a\r\nxxxxxxxxxx\r\n" # type: ignore - - c, data = setup(None, "1.0") # type: ignore - assert data == [placeholder] # type: ignore - assert c.our_state is SEND_BODY - - -def test_errors() -> None: - # After a receive error, you can't receive - for role in [CLIENT, SERVER]: - c = Connection(our_role=role) - c.receive_data(b"gibberish\r\n\r\n") - with pytest.raises(RemoteProtocolError): - c.next_event() - # Now any attempt to receive continues to raise - assert c.their_state is ERROR - assert c.our_state is not ERROR - print(c._cstate.states) - with pytest.raises(RemoteProtocolError): - c.next_event() - # But we can still yell at the client for sending us gibberish - if role is SERVER: - assert ( - c.send(Response(status_code=400, headers=[])) # type: ignore[arg-type] - == b"HTTP/1.1 400 \r\nConnection: close\r\n\r\n" - ) - - # After an error sending, you can no longer send - # (This is especially important for things like content-length errors, - # where there's complex internal state being modified) - def conn(role: Type[Sentinel]) -> Connection: - c = Connection(our_role=role) - if role is SERVER: - # Put it into the state where it *could* send a response... - receive_and_get(c, b"GET / HTTP/1.0\r\n\r\n") - assert c.our_state is SEND_RESPONSE - return c - - for role in [CLIENT, SERVER]: - if role is CLIENT: - # This HTTP/1.0 request won't be detected as bad until after we go - # through the state machine and hit the writing code - good = Request(method="GET", target="/", headers=[("Host", "example.com")]) - bad = Request( - method="GET", - target="/", - headers=[("Host", "example.com")], - http_version="1.0", - ) - elif role is SERVER: - good = Response(status_code=200, headers=[]) # type: ignore[arg-type,assignment] - bad = Response(status_code=200, headers=[], http_version="1.0") # type: ignore[arg-type,assignment] - # Make sure 'good' actually is good - c = conn(role) - c.send(good) - assert c.our_state is not ERROR - # Do that again, but this time sending 'bad' first - c = conn(role) - with pytest.raises(LocalProtocolError): - c.send(bad) - assert c.our_state is ERROR - assert c.their_state is not ERROR - # Now 'good' is not so good - with pytest.raises(LocalProtocolError): - c.send(good) - - # And check send_failed() too - c = conn(role) - c.send_failed() - assert c.our_state is ERROR - assert c.their_state is not ERROR - # This is idempotent - c.send_failed() - assert c.our_state is ERROR - assert c.their_state is not ERROR - - -def test_idle_receive_nothing() -> None: - # At one point this incorrectly raised an error - for role in [CLIENT, SERVER]: - c = Connection(role) - assert c.next_event() is NEED_DATA - - -def test_connection_drop() -> None: - c = Connection(SERVER) - c.receive_data(b"GET /") - assert c.next_event() is NEED_DATA - c.receive_data(b"") - with pytest.raises(RemoteProtocolError): - c.next_event() - - -def test_408_request_timeout() -> None: - # Should be able to send this spontaneously as a server without seeing - # anything from client - p = ConnectionPair() - p.send(SERVER, Response(status_code=408, headers=[(b"connection", b"close")])) - - -# This used to raise IndexError -def test_empty_request() -> None: - c = Connection(SERVER) - c.receive_data(b"\r\n") - with pytest.raises(RemoteProtocolError): - c.next_event() - - -# This used to raise IndexError -def test_empty_response() -> None: - c = Connection(CLIENT) - c.send(Request(method="GET", target="/", headers=[("Host", "a")])) - c.receive_data(b"\r\n") - with pytest.raises(RemoteProtocolError): - c.next_event() - - -@pytest.mark.parametrize( - "data", - [ - b"\x00", - b"\x20", - b"\x16\x03\x01\x00\xa5", # Typical start of a TLS Client Hello - ], -) -def test_early_detection_of_invalid_request(data: bytes) -> None: - c = Connection(SERVER) - # Early detection should occur before even receiving a `\r\n` - c.receive_data(data) - with pytest.raises(RemoteProtocolError): - c.next_event() - - -@pytest.mark.parametrize( - "data", - [ - b"\x00", - b"\x20", - b"\x16\x03\x03\x00\x31", # Typical start of a TLS Server Hello - ], -) -def test_early_detection_of_invalid_response(data: bytes) -> None: - c = Connection(CLIENT) - # Early detection should occur before even receiving a `\r\n` - c.receive_data(data) - with pytest.raises(RemoteProtocolError): - c.next_event() - - -# This used to give different headers for HEAD and GET. -# The correct way to handle HEAD is to put whatever headers we *would* have -# put if it were a GET -- even though we know that for HEAD, those headers -# will be ignored. -def test_HEAD_framing_headers() -> None: - def setup(method: bytes, http_version: bytes) -> Connection: - c = Connection(SERVER) - c.receive_data( - method + b" / HTTP/" + http_version + b"\r\n" + b"Host: example.com\r\n\r\n" - ) - assert type(c.next_event()) is Request - assert type(c.next_event()) is EndOfMessage - return c - - for method in [b"GET", b"HEAD"]: - # No Content-Length, HTTP/1.1 peer, should use chunked - c = setup(method, b"1.1") - assert ( - c.send(Response(status_code=200, headers=[])) == b"HTTP/1.1 200 \r\n" # type: ignore[arg-type] - b"Transfer-Encoding: chunked\r\n\r\n" - ) - - # No Content-Length, HTTP/1.0 peer, frame with connection: close - c = setup(method, b"1.0") - assert ( - c.send(Response(status_code=200, headers=[])) == b"HTTP/1.1 200 \r\n" # type: ignore[arg-type] - b"Connection: close\r\n\r\n" - ) - - # Content-Length + Transfer-Encoding, TE wins - c = setup(method, b"1.1") - assert ( - c.send( - Response( - status_code=200, - headers=[ - ("Content-Length", "100"), - ("Transfer-Encoding", "chunked"), - ], - ) - ) - == b"HTTP/1.1 200 \r\n" - b"Transfer-Encoding: chunked\r\n\r\n" - ) - - -def test_special_exceptions_for_lost_connection_in_message_body() -> None: - c = Connection(SERVER) - c.receive_data( - b"POST / HTTP/1.1\r\n" b"Host: example.com\r\n" b"Content-Length: 100\r\n\r\n" - ) - assert type(c.next_event()) is Request - assert c.next_event() is NEED_DATA - c.receive_data(b"12345") - assert c.next_event() == Data(data=b"12345") - c.receive_data(b"") - with pytest.raises(RemoteProtocolError) as excinfo: - c.next_event() - assert "received 5 bytes" in str(excinfo.value) - assert "expected 100" in str(excinfo.value) - - c = Connection(SERVER) - c.receive_data( - b"POST / HTTP/1.1\r\n" - b"Host: example.com\r\n" - b"Transfer-Encoding: chunked\r\n\r\n" - ) - assert type(c.next_event()) is Request - assert c.next_event() is NEED_DATA - c.receive_data(b"8\r\n012345") - assert c.next_event().data == b"012345" # type: ignore - c.receive_data(b"") - with pytest.raises(RemoteProtocolError) as excinfo: - c.next_event() - assert "incomplete chunked read" in str(excinfo.value) diff --git a/venv/lib/python3.11/site-packages/h11/tests/test_events.py b/venv/lib/python3.11/site-packages/h11/tests/test_events.py deleted file mode 100644 index bc6c313..0000000 --- a/venv/lib/python3.11/site-packages/h11/tests/test_events.py +++ /dev/null @@ -1,150 +0,0 @@ -from http import HTTPStatus - -import pytest - -from .. import _events -from .._events import ( - ConnectionClosed, - Data, - EndOfMessage, - Event, - InformationalResponse, - Request, - Response, -) -from .._util import LocalProtocolError - - -def test_events() -> None: - with pytest.raises(LocalProtocolError): - # Missing Host: - req = Request( - method="GET", target="/", headers=[("a", "b")], http_version="1.1" - ) - # But this is okay (HTTP/1.0) - req = Request(method="GET", target="/", headers=[("a", "b")], http_version="1.0") - # fields are normalized - assert req.method == b"GET" - assert req.target == b"/" - assert req.headers == [(b"a", b"b")] - assert req.http_version == b"1.0" - - # This is also okay -- has a Host (with weird capitalization, which is ok) - req = Request( - method="GET", - target="/", - headers=[("a", "b"), ("hOSt", "example.com")], - http_version="1.1", - ) - # we normalize header capitalization - assert req.headers == [(b"a", b"b"), (b"host", b"example.com")] - - # Multiple host is bad too - with pytest.raises(LocalProtocolError): - req = Request( - method="GET", - target="/", - headers=[("Host", "a"), ("Host", "a")], - http_version="1.1", - ) - # Even for HTTP/1.0 - with pytest.raises(LocalProtocolError): - req = Request( - method="GET", - target="/", - headers=[("Host", "a"), ("Host", "a")], - http_version="1.0", - ) - - # Header values are validated - for bad_char in "\x00\r\n\f\v": - with pytest.raises(LocalProtocolError): - req = Request( - method="GET", - target="/", - headers=[("Host", "a"), ("Foo", "asd" + bad_char)], - http_version="1.0", - ) - - # But for compatibility we allow non-whitespace control characters, even - # though they're forbidden by the spec. - Request( - method="GET", - target="/", - headers=[("Host", "a"), ("Foo", "asd\x01\x02\x7f")], - http_version="1.0", - ) - - # Request target is validated - for bad_byte in b"\x00\x20\x7f\xee": - target = bytearray(b"/") - target.append(bad_byte) - with pytest.raises(LocalProtocolError): - Request( - method="GET", target=target, headers=[("Host", "a")], http_version="1.1" - ) - - # Request method is validated - with pytest.raises(LocalProtocolError): - Request( - method="GET / HTTP/1.1", - target=target, - headers=[("Host", "a")], - http_version="1.1", - ) - - ir = InformationalResponse(status_code=100, headers=[("Host", "a")]) - assert ir.status_code == 100 - assert ir.headers == [(b"host", b"a")] - assert ir.http_version == b"1.1" - - with pytest.raises(LocalProtocolError): - InformationalResponse(status_code=200, headers=[("Host", "a")]) - - resp = Response(status_code=204, headers=[], http_version="1.0") # type: ignore[arg-type] - assert resp.status_code == 204 - assert resp.headers == [] - assert resp.http_version == b"1.0" - - with pytest.raises(LocalProtocolError): - resp = Response(status_code=100, headers=[], http_version="1.0") # type: ignore[arg-type] - - with pytest.raises(LocalProtocolError): - Response(status_code="100", headers=[], http_version="1.0") # type: ignore[arg-type] - - with pytest.raises(LocalProtocolError): - InformationalResponse(status_code=b"100", headers=[], http_version="1.0") # type: ignore[arg-type] - - d = Data(data=b"asdf") - assert d.data == b"asdf" - - eom = EndOfMessage() - assert eom.headers == [] - - cc = ConnectionClosed() - assert repr(cc) == "ConnectionClosed()" - - -def test_intenum_status_code() -> None: - # https://github.com/python-hyper/h11/issues/72 - - r = Response(status_code=HTTPStatus.OK, headers=[], http_version="1.0") # type: ignore[arg-type] - assert r.status_code == HTTPStatus.OK - assert type(r.status_code) is not type(HTTPStatus.OK) - assert type(r.status_code) is int - - -def test_header_casing() -> None: - r = Request( - method="GET", - target="/", - headers=[("Host", "example.org"), ("Connection", "keep-alive")], - http_version="1.1", - ) - assert len(r.headers) == 2 - assert r.headers[0] == (b"host", b"example.org") - assert r.headers == [(b"host", b"example.org"), (b"connection", b"keep-alive")] - assert r.headers.raw_items() == [ - (b"Host", b"example.org"), - (b"Connection", b"keep-alive"), - ] diff --git a/venv/lib/python3.11/site-packages/h11/tests/test_headers.py b/venv/lib/python3.11/site-packages/h11/tests/test_headers.py deleted file mode 100644 index ba53d08..0000000 --- a/venv/lib/python3.11/site-packages/h11/tests/test_headers.py +++ /dev/null @@ -1,157 +0,0 @@ -import pytest - -from .._events import Request -from .._headers import ( - get_comma_header, - has_expect_100_continue, - Headers, - normalize_and_validate, - set_comma_header, -) -from .._util import LocalProtocolError - - -def test_normalize_and_validate() -> None: - assert normalize_and_validate([("foo", "bar")]) == [(b"foo", b"bar")] - assert normalize_and_validate([(b"foo", b"bar")]) == [(b"foo", b"bar")] - - # no leading/trailing whitespace in names - with pytest.raises(LocalProtocolError): - normalize_and_validate([(b"foo ", "bar")]) - with pytest.raises(LocalProtocolError): - normalize_and_validate([(b" foo", "bar")]) - - # no weird characters in names - with pytest.raises(LocalProtocolError) as excinfo: - normalize_and_validate([(b"foo bar", b"baz")]) - assert "foo bar" in str(excinfo.value) - with pytest.raises(LocalProtocolError): - normalize_and_validate([(b"foo\x00bar", b"baz")]) - # Not even 8-bit characters: - with pytest.raises(LocalProtocolError): - normalize_and_validate([(b"foo\xffbar", b"baz")]) - # And not even the control characters we allow in values: - with pytest.raises(LocalProtocolError): - normalize_and_validate([(b"foo\x01bar", b"baz")]) - - # no return or NUL characters in values - with pytest.raises(LocalProtocolError) as excinfo: - normalize_and_validate([("foo", "bar\rbaz")]) - assert "bar\\rbaz" in str(excinfo.value) - with pytest.raises(LocalProtocolError): - normalize_and_validate([("foo", "bar\nbaz")]) - with pytest.raises(LocalProtocolError): - normalize_and_validate([("foo", "bar\x00baz")]) - # no leading/trailing whitespace - with pytest.raises(LocalProtocolError): - normalize_and_validate([("foo", "barbaz ")]) - with pytest.raises(LocalProtocolError): - normalize_and_validate([("foo", " barbaz")]) - with pytest.raises(LocalProtocolError): - normalize_and_validate([("foo", "barbaz\t")]) - with pytest.raises(LocalProtocolError): - normalize_and_validate([("foo", "\tbarbaz")]) - - # content-length - assert normalize_and_validate([("Content-Length", "1")]) == [ - (b"content-length", b"1") - ] - with pytest.raises(LocalProtocolError): - normalize_and_validate([("Content-Length", "asdf")]) - with pytest.raises(LocalProtocolError): - normalize_and_validate([("Content-Length", "1x")]) - with pytest.raises(LocalProtocolError): - normalize_and_validate([("Content-Length", "1"), ("Content-Length", "2")]) - assert normalize_and_validate( - [("Content-Length", "0"), ("Content-Length", "0")] - ) == [(b"content-length", b"0")] - assert normalize_and_validate([("Content-Length", "0 , 0")]) == [ - (b"content-length", b"0") - ] - with pytest.raises(LocalProtocolError): - normalize_and_validate( - [("Content-Length", "1"), ("Content-Length", "1"), ("Content-Length", "2")] - ) - with pytest.raises(LocalProtocolError): - normalize_and_validate([("Content-Length", "1 , 1,2")]) - - # transfer-encoding - assert normalize_and_validate([("Transfer-Encoding", "chunked")]) == [ - (b"transfer-encoding", b"chunked") - ] - assert normalize_and_validate([("Transfer-Encoding", "cHuNkEd")]) == [ - (b"transfer-encoding", b"chunked") - ] - with pytest.raises(LocalProtocolError) as excinfo: - normalize_and_validate([("Transfer-Encoding", "gzip")]) - assert excinfo.value.error_status_hint == 501 # Not Implemented - with pytest.raises(LocalProtocolError) as excinfo: - normalize_and_validate( - [("Transfer-Encoding", "chunked"), ("Transfer-Encoding", "gzip")] - ) - assert excinfo.value.error_status_hint == 501 # Not Implemented - - -def test_get_set_comma_header() -> None: - headers = normalize_and_validate( - [ - ("Connection", "close"), - ("whatever", "something"), - ("connectiON", "fOo,, , BAR"), - ] - ) - - assert get_comma_header(headers, b"connection") == [b"close", b"foo", b"bar"] - - headers = set_comma_header(headers, b"newthing", ["a", "b"]) # type: ignore - - with pytest.raises(LocalProtocolError): - set_comma_header(headers, b"newthing", [" a", "b"]) # type: ignore - - assert headers == [ - (b"connection", b"close"), - (b"whatever", b"something"), - (b"connection", b"fOo,, , BAR"), - (b"newthing", b"a"), - (b"newthing", b"b"), - ] - - headers = set_comma_header(headers, b"whatever", ["different thing"]) # type: ignore - - assert headers == [ - (b"connection", b"close"), - (b"connection", b"fOo,, , BAR"), - (b"newthing", b"a"), - (b"newthing", b"b"), - (b"whatever", b"different thing"), - ] - - -def test_has_100_continue() -> None: - assert has_expect_100_continue( - Request( - method="GET", - target="/", - headers=[("Host", "example.com"), ("Expect", "100-continue")], - ) - ) - assert not has_expect_100_continue( - Request(method="GET", target="/", headers=[("Host", "example.com")]) - ) - # Case insensitive - assert has_expect_100_continue( - Request( - method="GET", - target="/", - headers=[("Host", "example.com"), ("Expect", "100-Continue")], - ) - ) - # Doesn't work in HTTP/1.0 - assert not has_expect_100_continue( - Request( - method="GET", - target="/", - headers=[("Host", "example.com"), ("Expect", "100-continue")], - http_version="1.0", - ) - ) diff --git a/venv/lib/python3.11/site-packages/h11/tests/test_helpers.py b/venv/lib/python3.11/site-packages/h11/tests/test_helpers.py deleted file mode 100644 index c329c76..0000000 --- a/venv/lib/python3.11/site-packages/h11/tests/test_helpers.py +++ /dev/null @@ -1,32 +0,0 @@ -from .._events import ( - ConnectionClosed, - Data, - EndOfMessage, - Event, - InformationalResponse, - Request, - Response, -) -from .helpers import normalize_data_events - - -def test_normalize_data_events() -> None: - assert normalize_data_events( - [ - Data(data=bytearray(b"1")), - Data(data=b"2"), - Response(status_code=200, headers=[]), # type: ignore[arg-type] - Data(data=b"3"), - Data(data=b"4"), - EndOfMessage(), - Data(data=b"5"), - Data(data=b"6"), - Data(data=b"7"), - ] - ) == [ - Data(data=b"12"), - Response(status_code=200, headers=[]), # type: ignore[arg-type] - Data(data=b"34"), - EndOfMessage(), - Data(data=b"567"), - ] diff --git a/venv/lib/python3.11/site-packages/h11/tests/test_io.py b/venv/lib/python3.11/site-packages/h11/tests/test_io.py deleted file mode 100644 index 2b47c0e..0000000 --- a/venv/lib/python3.11/site-packages/h11/tests/test_io.py +++ /dev/null @@ -1,572 +0,0 @@ -from typing import Any, Callable, Generator, List - -import pytest - -from .._events import ( - ConnectionClosed, - Data, - EndOfMessage, - Event, - InformationalResponse, - Request, - Response, -) -from .._headers import Headers, normalize_and_validate -from .._readers import ( - _obsolete_line_fold, - ChunkedReader, - ContentLengthReader, - Http10Reader, - READERS, -) -from .._receivebuffer import ReceiveBuffer -from .._state import ( - CLIENT, - CLOSED, - DONE, - IDLE, - MIGHT_SWITCH_PROTOCOL, - MUST_CLOSE, - SEND_BODY, - SEND_RESPONSE, - SERVER, - SWITCHED_PROTOCOL, -) -from .._util import LocalProtocolError -from .._writers import ( - ChunkedWriter, - ContentLengthWriter, - Http10Writer, - write_any_response, - write_headers, - write_request, - WRITERS, -) -from .helpers import normalize_data_events - -SIMPLE_CASES = [ - ( - (CLIENT, IDLE), - Request( - method="GET", - target="/a", - headers=[("Host", "foo"), ("Connection", "close")], - ), - b"GET /a HTTP/1.1\r\nHost: foo\r\nConnection: close\r\n\r\n", - ), - ( - (SERVER, SEND_RESPONSE), - Response(status_code=200, headers=[("Connection", "close")], reason=b"OK"), - b"HTTP/1.1 200 OK\r\nConnection: close\r\n\r\n", - ), - ( - (SERVER, SEND_RESPONSE), - Response(status_code=200, headers=[], reason=b"OK"), # type: ignore[arg-type] - b"HTTP/1.1 200 OK\r\n\r\n", - ), - ( - (SERVER, SEND_RESPONSE), - InformationalResponse( - status_code=101, headers=[("Upgrade", "websocket")], reason=b"Upgrade" - ), - b"HTTP/1.1 101 Upgrade\r\nUpgrade: websocket\r\n\r\n", - ), - ( - (SERVER, SEND_RESPONSE), - InformationalResponse(status_code=101, headers=[], reason=b"Upgrade"), # type: ignore[arg-type] - b"HTTP/1.1 101 Upgrade\r\n\r\n", - ), -] - - -def dowrite(writer: Callable[..., None], obj: Any) -> bytes: - got_list: List[bytes] = [] - writer(obj, got_list.append) - return b"".join(got_list) - - -def tw(writer: Any, obj: Any, expected: Any) -> None: - got = dowrite(writer, obj) - assert got == expected - - -def makebuf(data: bytes) -> ReceiveBuffer: - buf = ReceiveBuffer() - buf += data - return buf - - -def tr(reader: Any, data: bytes, expected: Any) -> None: - def check(got: Any) -> None: - assert got == expected - # Headers should always be returned as bytes, not e.g. bytearray - # https://github.com/python-hyper/wsproto/pull/54#issuecomment-377709478 - for name, value in getattr(got, "headers", []): - assert type(name) is bytes - assert type(value) is bytes - - # Simple: consume whole thing - buf = makebuf(data) - check(reader(buf)) - assert not buf - - # Incrementally growing buffer - buf = ReceiveBuffer() - for i in range(len(data)): - assert reader(buf) is None - buf += data[i : i + 1] - check(reader(buf)) - - # Trailing data - buf = makebuf(data) - buf += b"trailing" - check(reader(buf)) - assert bytes(buf) == b"trailing" - - -def test_writers_simple() -> None: - for ((role, state), event, binary) in SIMPLE_CASES: - tw(WRITERS[role, state], event, binary) - - -def test_readers_simple() -> None: - for ((role, state), event, binary) in SIMPLE_CASES: - tr(READERS[role, state], binary, event) - - -def test_writers_unusual() -> None: - # Simple test of the write_headers utility routine - tw( - write_headers, - normalize_and_validate([("foo", "bar"), ("baz", "quux")]), - b"foo: bar\r\nbaz: quux\r\n\r\n", - ) - tw(write_headers, Headers([]), b"\r\n") - - # We understand HTTP/1.0, but we don't speak it - with pytest.raises(LocalProtocolError): - tw( - write_request, - Request( - method="GET", - target="/", - headers=[("Host", "foo"), ("Connection", "close")], - http_version="1.0", - ), - None, - ) - with pytest.raises(LocalProtocolError): - tw( - write_any_response, - Response( - status_code=200, headers=[("Connection", "close")], http_version="1.0" - ), - None, - ) - - -def test_readers_unusual() -> None: - # Reading HTTP/1.0 - tr( - READERS[CLIENT, IDLE], - b"HEAD /foo HTTP/1.0\r\nSome: header\r\n\r\n", - Request( - method="HEAD", - target="/foo", - headers=[("Some", "header")], - http_version="1.0", - ), - ) - - # check no-headers, since it's only legal with HTTP/1.0 - tr( - READERS[CLIENT, IDLE], - b"HEAD /foo HTTP/1.0\r\n\r\n", - Request(method="HEAD", target="/foo", headers=[], http_version="1.0"), # type: ignore[arg-type] - ) - - tr( - READERS[SERVER, SEND_RESPONSE], - b"HTTP/1.0 200 OK\r\nSome: header\r\n\r\n", - Response( - status_code=200, - headers=[("Some", "header")], - http_version="1.0", - reason=b"OK", - ), - ) - - # single-character header values (actually disallowed by the ABNF in RFC - # 7230 -- this is a bug in the standard that we originally copied...) - tr( - READERS[SERVER, SEND_RESPONSE], - b"HTTP/1.0 200 OK\r\n" b"Foo: a a a a a \r\n\r\n", - Response( - status_code=200, - headers=[("Foo", "a a a a a")], - http_version="1.0", - reason=b"OK", - ), - ) - - # Empty headers -- also legal - tr( - READERS[SERVER, SEND_RESPONSE], - b"HTTP/1.0 200 OK\r\n" b"Foo:\r\n\r\n", - Response( - status_code=200, headers=[("Foo", "")], http_version="1.0", reason=b"OK" - ), - ) - - tr( - READERS[SERVER, SEND_RESPONSE], - b"HTTP/1.0 200 OK\r\n" b"Foo: \t \t \r\n\r\n", - Response( - status_code=200, headers=[("Foo", "")], http_version="1.0", reason=b"OK" - ), - ) - - # Tolerate broken servers that leave off the response code - tr( - READERS[SERVER, SEND_RESPONSE], - b"HTTP/1.0 200\r\n" b"Foo: bar\r\n\r\n", - Response( - status_code=200, headers=[("Foo", "bar")], http_version="1.0", reason=b"" - ), - ) - - # Tolerate headers line endings (\r\n and \n) - # \n\r\b between headers and body - tr( - READERS[SERVER, SEND_RESPONSE], - b"HTTP/1.1 200 OK\r\nSomeHeader: val\n\r\n", - Response( - status_code=200, - headers=[("SomeHeader", "val")], - http_version="1.1", - reason="OK", - ), - ) - - # delimited only with \n - tr( - READERS[SERVER, SEND_RESPONSE], - b"HTTP/1.1 200 OK\nSomeHeader1: val1\nSomeHeader2: val2\n\n", - Response( - status_code=200, - headers=[("SomeHeader1", "val1"), ("SomeHeader2", "val2")], - http_version="1.1", - reason="OK", - ), - ) - - # mixed \r\n and \n - tr( - READERS[SERVER, SEND_RESPONSE], - b"HTTP/1.1 200 OK\r\nSomeHeader1: val1\nSomeHeader2: val2\n\r\n", - Response( - status_code=200, - headers=[("SomeHeader1", "val1"), ("SomeHeader2", "val2")], - http_version="1.1", - reason="OK", - ), - ) - - # obsolete line folding - tr( - READERS[CLIENT, IDLE], - b"HEAD /foo HTTP/1.1\r\n" - b"Host: example.com\r\n" - b"Some: multi-line\r\n" - b" header\r\n" - b"\tnonsense\r\n" - b" \t \t\tI guess\r\n" - b"Connection: close\r\n" - b"More-nonsense: in the\r\n" - b" last header \r\n\r\n", - Request( - method="HEAD", - target="/foo", - headers=[ - ("Host", "example.com"), - ("Some", "multi-line header nonsense I guess"), - ("Connection", "close"), - ("More-nonsense", "in the last header"), - ], - ), - ) - - with pytest.raises(LocalProtocolError): - tr( - READERS[CLIENT, IDLE], - b"HEAD /foo HTTP/1.1\r\n" b" folded: line\r\n\r\n", - None, - ) - - with pytest.raises(LocalProtocolError): - tr( - READERS[CLIENT, IDLE], - b"HEAD /foo HTTP/1.1\r\n" b"foo : line\r\n\r\n", - None, - ) - with pytest.raises(LocalProtocolError): - tr( - READERS[CLIENT, IDLE], - b"HEAD /foo HTTP/1.1\r\n" b"foo\t: line\r\n\r\n", - None, - ) - with pytest.raises(LocalProtocolError): - tr( - READERS[CLIENT, IDLE], - b"HEAD /foo HTTP/1.1\r\n" b"foo\t: line\r\n\r\n", - None, - ) - with pytest.raises(LocalProtocolError): - tr(READERS[CLIENT, IDLE], b"HEAD /foo HTTP/1.1\r\n" b": line\r\n\r\n", None) - - -def test__obsolete_line_fold_bytes() -> None: - # _obsolete_line_fold has a defensive cast to bytearray, which is - # necessary to protect against O(n^2) behavior in case anyone ever passes - # in regular bytestrings... but right now we never pass in regular - # bytestrings. so this test just exists to get some coverage on that - # defensive cast. - assert list(_obsolete_line_fold([b"aaa", b"bbb", b" ccc", b"ddd"])) == [ - b"aaa", - bytearray(b"bbb ccc"), - b"ddd", - ] - - -def _run_reader_iter( - reader: Any, buf: bytes, do_eof: bool -) -> Generator[Any, None, None]: - while True: - event = reader(buf) - if event is None: - break - yield event - # body readers have undefined behavior after returning EndOfMessage, - # because this changes the state so they don't get called again - if type(event) is EndOfMessage: - break - if do_eof: - assert not buf - yield reader.read_eof() - - -def _run_reader(*args: Any) -> List[Event]: - events = list(_run_reader_iter(*args)) - return normalize_data_events(events) - - -def t_body_reader(thunk: Any, data: bytes, expected: Any, do_eof: bool = False) -> None: - # Simple: consume whole thing - print("Test 1") - buf = makebuf(data) - assert _run_reader(thunk(), buf, do_eof) == expected - - # Incrementally growing buffer - print("Test 2") - reader = thunk() - buf = ReceiveBuffer() - events = [] - for i in range(len(data)): - events += _run_reader(reader, buf, False) - buf += data[i : i + 1] - events += _run_reader(reader, buf, do_eof) - assert normalize_data_events(events) == expected - - is_complete = any(type(event) is EndOfMessage for event in expected) - if is_complete and not do_eof: - buf = makebuf(data + b"trailing") - assert _run_reader(thunk(), buf, False) == expected - - -def test_ContentLengthReader() -> None: - t_body_reader(lambda: ContentLengthReader(0), b"", [EndOfMessage()]) - - t_body_reader( - lambda: ContentLengthReader(10), - b"0123456789", - [Data(data=b"0123456789"), EndOfMessage()], - ) - - -def test_Http10Reader() -> None: - t_body_reader(Http10Reader, b"", [EndOfMessage()], do_eof=True) - t_body_reader(Http10Reader, b"asdf", [Data(data=b"asdf")], do_eof=False) - t_body_reader( - Http10Reader, b"asdf", [Data(data=b"asdf"), EndOfMessage()], do_eof=True - ) - - -def test_ChunkedReader() -> None: - t_body_reader(ChunkedReader, b"0\r\n\r\n", [EndOfMessage()]) - - t_body_reader( - ChunkedReader, - b"0\r\nSome: header\r\n\r\n", - [EndOfMessage(headers=[("Some", "header")])], - ) - - t_body_reader( - ChunkedReader, - b"5\r\n01234\r\n" - + b"10\r\n0123456789abcdef\r\n" - + b"0\r\n" - + b"Some: header\r\n\r\n", - [ - Data(data=b"012340123456789abcdef"), - EndOfMessage(headers=[("Some", "header")]), - ], - ) - - t_body_reader( - ChunkedReader, - b"5\r\n01234\r\n" + b"10\r\n0123456789abcdef\r\n" + b"0\r\n\r\n", - [Data(data=b"012340123456789abcdef"), EndOfMessage()], - ) - - # handles upper and lowercase hex - t_body_reader( - ChunkedReader, - b"aA\r\n" + b"x" * 0xAA + b"\r\n" + b"0\r\n\r\n", - [Data(data=b"x" * 0xAA), EndOfMessage()], - ) - - # refuses arbitrarily long chunk integers - with pytest.raises(LocalProtocolError): - # Technically this is legal HTTP/1.1, but we refuse to process chunk - # sizes that don't fit into 20 characters of hex - t_body_reader(ChunkedReader, b"9" * 100 + b"\r\nxxx", [Data(data=b"xxx")]) - - # refuses garbage in the chunk count - with pytest.raises(LocalProtocolError): - t_body_reader(ChunkedReader, b"10\x00\r\nxxx", None) - - # handles (and discards) "chunk extensions" omg wtf - t_body_reader( - ChunkedReader, - b"5; hello=there\r\n" - + b"xxxxx" - + b"\r\n" - + b'0; random="junk"; some=more; canbe=lonnnnngg\r\n\r\n', - [Data(data=b"xxxxx"), EndOfMessage()], - ) - - t_body_reader( - ChunkedReader, - b"5 \r\n01234\r\n" + b"0\r\n\r\n", - [Data(data=b"01234"), EndOfMessage()], - ) - - -def test_ContentLengthWriter() -> None: - w = ContentLengthWriter(5) - assert dowrite(w, Data(data=b"123")) == b"123" - assert dowrite(w, Data(data=b"45")) == b"45" - assert dowrite(w, EndOfMessage()) == b"" - - w = ContentLengthWriter(5) - with pytest.raises(LocalProtocolError): - dowrite(w, Data(data=b"123456")) - - w = ContentLengthWriter(5) - dowrite(w, Data(data=b"123")) - with pytest.raises(LocalProtocolError): - dowrite(w, Data(data=b"456")) - - w = ContentLengthWriter(5) - dowrite(w, Data(data=b"123")) - with pytest.raises(LocalProtocolError): - dowrite(w, EndOfMessage()) - - w = ContentLengthWriter(5) - dowrite(w, Data(data=b"123")) == b"123" - dowrite(w, Data(data=b"45")) == b"45" - with pytest.raises(LocalProtocolError): - dowrite(w, EndOfMessage(headers=[("Etag", "asdf")])) - - -def test_ChunkedWriter() -> None: - w = ChunkedWriter() - assert dowrite(w, Data(data=b"aaa")) == b"3\r\naaa\r\n" - assert dowrite(w, Data(data=b"a" * 20)) == b"14\r\n" + b"a" * 20 + b"\r\n" - - assert dowrite(w, Data(data=b"")) == b"" - - assert dowrite(w, EndOfMessage()) == b"0\r\n\r\n" - - assert ( - dowrite(w, EndOfMessage(headers=[("Etag", "asdf"), ("a", "b")])) - == b"0\r\nEtag: asdf\r\na: b\r\n\r\n" - ) - - -def test_Http10Writer() -> None: - w = Http10Writer() - assert dowrite(w, Data(data=b"1234")) == b"1234" - assert dowrite(w, EndOfMessage()) == b"" - - with pytest.raises(LocalProtocolError): - dowrite(w, EndOfMessage(headers=[("Etag", "asdf")])) - - -def test_reject_garbage_after_request_line() -> None: - with pytest.raises(LocalProtocolError): - tr(READERS[SERVER, SEND_RESPONSE], b"HTTP/1.0 200 OK\x00xxxx\r\n\r\n", None) - - -def test_reject_garbage_after_response_line() -> None: - with pytest.raises(LocalProtocolError): - tr( - READERS[CLIENT, IDLE], - b"HEAD /foo HTTP/1.1 xxxxxx\r\n" b"Host: a\r\n\r\n", - None, - ) - - -def test_reject_garbage_in_header_line() -> None: - with pytest.raises(LocalProtocolError): - tr( - READERS[CLIENT, IDLE], - b"HEAD /foo HTTP/1.1\r\n" b"Host: foo\x00bar\r\n\r\n", - None, - ) - - -def test_reject_non_vchar_in_path() -> None: - for bad_char in b"\x00\x20\x7f\xee": - message = bytearray(b"HEAD /") - message.append(bad_char) - message.extend(b" HTTP/1.1\r\nHost: foobar\r\n\r\n") - with pytest.raises(LocalProtocolError): - tr(READERS[CLIENT, IDLE], message, None) - - -# https://github.com/python-hyper/h11/issues/57 -def test_allow_some_garbage_in_cookies() -> None: - tr( - READERS[CLIENT, IDLE], - b"HEAD /foo HTTP/1.1\r\n" - b"Host: foo\r\n" - b"Set-Cookie: ___utmvafIumyLc=kUd\x01UpAt; path=/; Max-Age=900\r\n" - b"\r\n", - Request( - method="HEAD", - target="/foo", - headers=[ - ("Host", "foo"), - ("Set-Cookie", "___utmvafIumyLc=kUd\x01UpAt; path=/; Max-Age=900"), - ], - ), - ) - - -def test_host_comes_first() -> None: - tw( - write_headers, - normalize_and_validate([("foo", "bar"), ("Host", "example.com")]), - b"Host: example.com\r\nfoo: bar\r\n\r\n", - ) diff --git a/venv/lib/python3.11/site-packages/h11/tests/test_receivebuffer.py b/venv/lib/python3.11/site-packages/h11/tests/test_receivebuffer.py deleted file mode 100644 index 21a3870..0000000 --- a/venv/lib/python3.11/site-packages/h11/tests/test_receivebuffer.py +++ /dev/null @@ -1,135 +0,0 @@ -import re -from typing import Tuple - -import pytest - -from .._receivebuffer import ReceiveBuffer - - -def test_receivebuffer() -> None: - b = ReceiveBuffer() - assert not b - assert len(b) == 0 - assert bytes(b) == b"" - - b += b"123" - assert b - assert len(b) == 3 - assert bytes(b) == b"123" - - assert bytes(b) == b"123" - - assert b.maybe_extract_at_most(2) == b"12" - assert b - assert len(b) == 1 - assert bytes(b) == b"3" - - assert bytes(b) == b"3" - - assert b.maybe_extract_at_most(10) == b"3" - assert bytes(b) == b"" - - assert b.maybe_extract_at_most(10) is None - assert not b - - ################################################################ - # maybe_extract_until_next - ################################################################ - - b += b"123\n456\r\n789\r\n" - - assert b.maybe_extract_next_line() == b"123\n456\r\n" - assert bytes(b) == b"789\r\n" - - assert b.maybe_extract_next_line() == b"789\r\n" - assert bytes(b) == b"" - - b += b"12\r" - assert b.maybe_extract_next_line() is None - assert bytes(b) == b"12\r" - - b += b"345\n\r" - assert b.maybe_extract_next_line() is None - assert bytes(b) == b"12\r345\n\r" - - # here we stopped at the middle of b"\r\n" delimiter - - b += b"\n6789aaa123\r\n" - assert b.maybe_extract_next_line() == b"12\r345\n\r\n" - assert b.maybe_extract_next_line() == b"6789aaa123\r\n" - assert b.maybe_extract_next_line() is None - assert bytes(b) == b"" - - ################################################################ - # maybe_extract_lines - ################################################################ - - b += b"123\r\na: b\r\nfoo:bar\r\n\r\ntrailing" - lines = b.maybe_extract_lines() - assert lines == [b"123", b"a: b", b"foo:bar"] - assert bytes(b) == b"trailing" - - assert b.maybe_extract_lines() is None - - b += b"\r\n\r" - assert b.maybe_extract_lines() is None - - assert b.maybe_extract_at_most(100) == b"trailing\r\n\r" - assert not b - - # Empty body case (as happens at the end of chunked encoding if there are - # no trailing headers, e.g.) - b += b"\r\ntrailing" - assert b.maybe_extract_lines() == [] - assert bytes(b) == b"trailing" - - -@pytest.mark.parametrize( - "data", - [ - pytest.param( - ( - b"HTTP/1.1 200 OK\r\n", - b"Content-type: text/plain\r\n", - b"Connection: close\r\n", - b"\r\n", - b"Some body", - ), - id="with_crlf_delimiter", - ), - pytest.param( - ( - b"HTTP/1.1 200 OK\n", - b"Content-type: text/plain\n", - b"Connection: close\n", - b"\n", - b"Some body", - ), - id="with_lf_only_delimiter", - ), - pytest.param( - ( - b"HTTP/1.1 200 OK\n", - b"Content-type: text/plain\r\n", - b"Connection: close\n", - b"\n", - b"Some body", - ), - id="with_mixed_crlf_and_lf", - ), - ], -) -def test_receivebuffer_for_invalid_delimiter(data: Tuple[bytes]) -> None: - b = ReceiveBuffer() - - for line in data: - b += line - - lines = b.maybe_extract_lines() - - assert lines == [ - b"HTTP/1.1 200 OK", - b"Content-type: text/plain", - b"Connection: close", - ] - assert bytes(b) == b"Some body" diff --git a/venv/lib/python3.11/site-packages/h11/tests/test_state.py b/venv/lib/python3.11/site-packages/h11/tests/test_state.py deleted file mode 100644 index bc974e6..0000000 --- a/venv/lib/python3.11/site-packages/h11/tests/test_state.py +++ /dev/null @@ -1,271 +0,0 @@ -import pytest - -from .._events import ( - ConnectionClosed, - Data, - EndOfMessage, - Event, - InformationalResponse, - Request, - Response, -) -from .._state import ( - _SWITCH_CONNECT, - _SWITCH_UPGRADE, - CLIENT, - CLOSED, - ConnectionState, - DONE, - IDLE, - MIGHT_SWITCH_PROTOCOL, - MUST_CLOSE, - SEND_BODY, - SEND_RESPONSE, - SERVER, - SWITCHED_PROTOCOL, -) -from .._util import LocalProtocolError - - -def test_ConnectionState() -> None: - cs = ConnectionState() - - # Basic event-triggered transitions - - assert cs.states == {CLIENT: IDLE, SERVER: IDLE} - - cs.process_event(CLIENT, Request) - # The SERVER-Request special case: - assert cs.states == {CLIENT: SEND_BODY, SERVER: SEND_RESPONSE} - - # Illegal transitions raise an error and nothing happens - with pytest.raises(LocalProtocolError): - cs.process_event(CLIENT, Request) - assert cs.states == {CLIENT: SEND_BODY, SERVER: SEND_RESPONSE} - - cs.process_event(SERVER, InformationalResponse) - assert cs.states == {CLIENT: SEND_BODY, SERVER: SEND_RESPONSE} - - cs.process_event(SERVER, Response) - assert cs.states == {CLIENT: SEND_BODY, SERVER: SEND_BODY} - - cs.process_event(CLIENT, EndOfMessage) - cs.process_event(SERVER, EndOfMessage) - assert cs.states == {CLIENT: DONE, SERVER: DONE} - - # State-triggered transition - - cs.process_event(SERVER, ConnectionClosed) - assert cs.states == {CLIENT: MUST_CLOSE, SERVER: CLOSED} - - -def test_ConnectionState_keep_alive() -> None: - # keep_alive = False - cs = ConnectionState() - cs.process_event(CLIENT, Request) - cs.process_keep_alive_disabled() - cs.process_event(CLIENT, EndOfMessage) - assert cs.states == {CLIENT: MUST_CLOSE, SERVER: SEND_RESPONSE} - - cs.process_event(SERVER, Response) - cs.process_event(SERVER, EndOfMessage) - assert cs.states == {CLIENT: MUST_CLOSE, SERVER: MUST_CLOSE} - - -def test_ConnectionState_keep_alive_in_DONE() -> None: - # Check that if keep_alive is disabled when the CLIENT is already in DONE, - # then this is sufficient to immediately trigger the DONE -> MUST_CLOSE - # transition - cs = ConnectionState() - cs.process_event(CLIENT, Request) - cs.process_event(CLIENT, EndOfMessage) - assert cs.states[CLIENT] is DONE - cs.process_keep_alive_disabled() - assert cs.states[CLIENT] is MUST_CLOSE - - -def test_ConnectionState_switch_denied() -> None: - for switch_type in (_SWITCH_CONNECT, _SWITCH_UPGRADE): - for deny_early in (True, False): - cs = ConnectionState() - cs.process_client_switch_proposal(switch_type) - cs.process_event(CLIENT, Request) - cs.process_event(CLIENT, Data) - assert cs.states == {CLIENT: SEND_BODY, SERVER: SEND_RESPONSE} - - assert switch_type in cs.pending_switch_proposals - - if deny_early: - # before client reaches DONE - cs.process_event(SERVER, Response) - assert not cs.pending_switch_proposals - - cs.process_event(CLIENT, EndOfMessage) - - if deny_early: - assert cs.states == {CLIENT: DONE, SERVER: SEND_BODY} - else: - assert cs.states == { - CLIENT: MIGHT_SWITCH_PROTOCOL, - SERVER: SEND_RESPONSE, - } - - cs.process_event(SERVER, InformationalResponse) - assert cs.states == { - CLIENT: MIGHT_SWITCH_PROTOCOL, - SERVER: SEND_RESPONSE, - } - - cs.process_event(SERVER, Response) - assert cs.states == {CLIENT: DONE, SERVER: SEND_BODY} - assert not cs.pending_switch_proposals - - -_response_type_for_switch = { - _SWITCH_UPGRADE: InformationalResponse, - _SWITCH_CONNECT: Response, - None: Response, -} - - -def test_ConnectionState_protocol_switch_accepted() -> None: - for switch_event in [_SWITCH_UPGRADE, _SWITCH_CONNECT]: - cs = ConnectionState() - cs.process_client_switch_proposal(switch_event) - cs.process_event(CLIENT, Request) - cs.process_event(CLIENT, Data) - assert cs.states == {CLIENT: SEND_BODY, SERVER: SEND_RESPONSE} - - cs.process_event(CLIENT, EndOfMessage) - assert cs.states == {CLIENT: MIGHT_SWITCH_PROTOCOL, SERVER: SEND_RESPONSE} - - cs.process_event(SERVER, InformationalResponse) - assert cs.states == {CLIENT: MIGHT_SWITCH_PROTOCOL, SERVER: SEND_RESPONSE} - - cs.process_event(SERVER, _response_type_for_switch[switch_event], switch_event) - assert cs.states == {CLIENT: SWITCHED_PROTOCOL, SERVER: SWITCHED_PROTOCOL} - - -def test_ConnectionState_double_protocol_switch() -> None: - # CONNECT + Upgrade is legal! Very silly, but legal. So we support - # it. Because sometimes doing the silly thing is easier than not. - for server_switch in [None, _SWITCH_UPGRADE, _SWITCH_CONNECT]: - cs = ConnectionState() - cs.process_client_switch_proposal(_SWITCH_UPGRADE) - cs.process_client_switch_proposal(_SWITCH_CONNECT) - cs.process_event(CLIENT, Request) - cs.process_event(CLIENT, EndOfMessage) - assert cs.states == {CLIENT: MIGHT_SWITCH_PROTOCOL, SERVER: SEND_RESPONSE} - cs.process_event( - SERVER, _response_type_for_switch[server_switch], server_switch - ) - if server_switch is None: - assert cs.states == {CLIENT: DONE, SERVER: SEND_BODY} - else: - assert cs.states == {CLIENT: SWITCHED_PROTOCOL, SERVER: SWITCHED_PROTOCOL} - - -def test_ConnectionState_inconsistent_protocol_switch() -> None: - for client_switches, server_switch in [ - ([], _SWITCH_CONNECT), - ([], _SWITCH_UPGRADE), - ([_SWITCH_UPGRADE], _SWITCH_CONNECT), - ([_SWITCH_CONNECT], _SWITCH_UPGRADE), - ]: - cs = ConnectionState() - for client_switch in client_switches: # type: ignore[attr-defined] - cs.process_client_switch_proposal(client_switch) - cs.process_event(CLIENT, Request) - with pytest.raises(LocalProtocolError): - cs.process_event(SERVER, Response, server_switch) - - -def test_ConnectionState_keepalive_protocol_switch_interaction() -> None: - # keep_alive=False + pending_switch_proposals - cs = ConnectionState() - cs.process_client_switch_proposal(_SWITCH_UPGRADE) - cs.process_event(CLIENT, Request) - cs.process_keep_alive_disabled() - cs.process_event(CLIENT, Data) - assert cs.states == {CLIENT: SEND_BODY, SERVER: SEND_RESPONSE} - - # the protocol switch "wins" - cs.process_event(CLIENT, EndOfMessage) - assert cs.states == {CLIENT: MIGHT_SWITCH_PROTOCOL, SERVER: SEND_RESPONSE} - - # but when the server denies the request, keep_alive comes back into play - cs.process_event(SERVER, Response) - assert cs.states == {CLIENT: MUST_CLOSE, SERVER: SEND_BODY} - - -def test_ConnectionState_reuse() -> None: - cs = ConnectionState() - - with pytest.raises(LocalProtocolError): - cs.start_next_cycle() - - cs.process_event(CLIENT, Request) - cs.process_event(CLIENT, EndOfMessage) - - with pytest.raises(LocalProtocolError): - cs.start_next_cycle() - - cs.process_event(SERVER, Response) - cs.process_event(SERVER, EndOfMessage) - - cs.start_next_cycle() - assert cs.states == {CLIENT: IDLE, SERVER: IDLE} - - # No keepalive - - cs.process_event(CLIENT, Request) - cs.process_keep_alive_disabled() - cs.process_event(CLIENT, EndOfMessage) - cs.process_event(SERVER, Response) - cs.process_event(SERVER, EndOfMessage) - - with pytest.raises(LocalProtocolError): - cs.start_next_cycle() - - # One side closed - - cs = ConnectionState() - cs.process_event(CLIENT, Request) - cs.process_event(CLIENT, EndOfMessage) - cs.process_event(CLIENT, ConnectionClosed) - cs.process_event(SERVER, Response) - cs.process_event(SERVER, EndOfMessage) - - with pytest.raises(LocalProtocolError): - cs.start_next_cycle() - - # Succesful protocol switch - - cs = ConnectionState() - cs.process_client_switch_proposal(_SWITCH_UPGRADE) - cs.process_event(CLIENT, Request) - cs.process_event(CLIENT, EndOfMessage) - cs.process_event(SERVER, InformationalResponse, _SWITCH_UPGRADE) - - with pytest.raises(LocalProtocolError): - cs.start_next_cycle() - - # Failed protocol switch - - cs = ConnectionState() - cs.process_client_switch_proposal(_SWITCH_UPGRADE) - cs.process_event(CLIENT, Request) - cs.process_event(CLIENT, EndOfMessage) - cs.process_event(SERVER, Response) - cs.process_event(SERVER, EndOfMessage) - - cs.start_next_cycle() - assert cs.states == {CLIENT: IDLE, SERVER: IDLE} - - -def test_server_request_is_illegal() -> None: - # There used to be a bug in how we handled the Request special case that - # made this allowed... - cs = ConnectionState() - with pytest.raises(LocalProtocolError): - cs.process_event(SERVER, Request) diff --git a/venv/lib/python3.11/site-packages/h11/tests/test_util.py b/venv/lib/python3.11/site-packages/h11/tests/test_util.py deleted file mode 100644 index 79bc095..0000000 --- a/venv/lib/python3.11/site-packages/h11/tests/test_util.py +++ /dev/null @@ -1,112 +0,0 @@ -import re -import sys -import traceback -from typing import NoReturn - -import pytest - -from .._util import ( - bytesify, - LocalProtocolError, - ProtocolError, - RemoteProtocolError, - Sentinel, - validate, -) - - -def test_ProtocolError() -> None: - with pytest.raises(TypeError): - ProtocolError("abstract base class") - - -def test_LocalProtocolError() -> None: - try: - raise LocalProtocolError("foo") - except LocalProtocolError as e: - assert str(e) == "foo" - assert e.error_status_hint == 400 - - try: - raise LocalProtocolError("foo", error_status_hint=418) - except LocalProtocolError as e: - assert str(e) == "foo" - assert e.error_status_hint == 418 - - def thunk() -> NoReturn: - raise LocalProtocolError("a", error_status_hint=420) - - try: - try: - thunk() - except LocalProtocolError as exc1: - orig_traceback = "".join(traceback.format_tb(sys.exc_info()[2])) - exc1._reraise_as_remote_protocol_error() - except RemoteProtocolError as exc2: - assert type(exc2) is RemoteProtocolError - assert exc2.args == ("a",) - assert exc2.error_status_hint == 420 - new_traceback = "".join(traceback.format_tb(sys.exc_info()[2])) - assert new_traceback.endswith(orig_traceback) - - -def test_validate() -> None: - my_re = re.compile(rb"(?P[0-9]+)\.(?P[0-9]+)") - with pytest.raises(LocalProtocolError): - validate(my_re, b"0.") - - groups = validate(my_re, b"0.1") - assert groups == {"group1": b"0", "group2": b"1"} - - # successful partial matches are an error - must match whole string - with pytest.raises(LocalProtocolError): - validate(my_re, b"0.1xx") - with pytest.raises(LocalProtocolError): - validate(my_re, b"0.1\n") - - -def test_validate_formatting() -> None: - my_re = re.compile(rb"foo") - - with pytest.raises(LocalProtocolError) as excinfo: - validate(my_re, b"", "oops") - assert "oops" in str(excinfo.value) - - with pytest.raises(LocalProtocolError) as excinfo: - validate(my_re, b"", "oops {}") - assert "oops {}" in str(excinfo.value) - - with pytest.raises(LocalProtocolError) as excinfo: - validate(my_re, b"", "oops {} xx", 10) - assert "oops 10 xx" in str(excinfo.value) - - -def test_make_sentinel() -> None: - class S(Sentinel, metaclass=Sentinel): - pass - - assert repr(S) == "S" - assert S == S - assert type(S).__name__ == "S" - assert S in {S} - assert type(S) is S - - class S2(Sentinel, metaclass=Sentinel): - pass - - assert repr(S2) == "S2" - assert S != S2 - assert S not in {S2} - assert type(S) is not type(S2) - - -def test_bytesify() -> None: - assert bytesify(b"123") == b"123" - assert bytesify(bytearray(b"123")) == b"123" - assert bytesify("123") == b"123" - - with pytest.raises(UnicodeEncodeError): - bytesify("\u1234") - - with pytest.raises(TypeError): - bytesify(10) diff --git a/venv/lib/python3.11/site-packages/idna-3.10.dist-info/INSTALLER b/venv/lib/python3.11/site-packages/idna-3.10.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.11/site-packages/idna-3.10.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.11/site-packages/idna-3.10.dist-info/LICENSE.md b/venv/lib/python3.11/site-packages/idna-3.10.dist-info/LICENSE.md deleted file mode 100644 index 19b6b45..0000000 --- a/venv/lib/python3.11/site-packages/idna-3.10.dist-info/LICENSE.md +++ /dev/null @@ -1,31 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2013-2024, Kim Davies and contributors. -All rights reserved. - -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/venv/lib/python3.11/site-packages/idna-3.10.dist-info/METADATA b/venv/lib/python3.11/site-packages/idna-3.10.dist-info/METADATA deleted file mode 100644 index c42623e..0000000 --- a/venv/lib/python3.11/site-packages/idna-3.10.dist-info/METADATA +++ /dev/null @@ -1,250 +0,0 @@ -Metadata-Version: 2.1 -Name: idna -Version: 3.10 -Summary: Internationalized Domain Names in Applications (IDNA) -Author-email: Kim Davies -Requires-Python: >=3.6 -Description-Content-Type: text/x-rst -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Intended Audience :: System Administrators -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Internet :: Name Service (DNS) -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Utilities -Requires-Dist: ruff >= 0.6.2 ; extra == "all" -Requires-Dist: mypy >= 1.11.2 ; extra == "all" -Requires-Dist: pytest >= 8.3.2 ; extra == "all" -Requires-Dist: flake8 >= 7.1.1 ; extra == "all" -Project-URL: Changelog, https://github.com/kjd/idna/blob/master/HISTORY.rst -Project-URL: Issue tracker, https://github.com/kjd/idna/issues -Project-URL: Source, https://github.com/kjd/idna -Provides-Extra: all - -Internationalized Domain Names in Applications (IDNA) -===================================================== - -Support for the Internationalized Domain Names in -Applications (IDNA) protocol as specified in `RFC 5891 -`_. This is the latest version of -the protocol and is sometimes referred to as “IDNA 2008”. - -This library also provides support for Unicode Technical -Standard 46, `Unicode IDNA Compatibility Processing -`_. - -This acts as a suitable replacement for the “encodings.idna” -module that comes with the Python standard library, but which -only supports the older superseded IDNA specification (`RFC 3490 -`_). - -Basic functions are simply executed: - -.. code-block:: pycon - - >>> import idna - >>> idna.encode('ドメイン.テスト') - b'xn--eckwd4c7c.xn--zckzah' - >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) - ドメイン.テスト - - -Installation ------------- - -This package is available for installation from PyPI: - -.. code-block:: bash - - $ python3 -m pip install idna - - -Usage ------ - -For typical usage, the ``encode`` and ``decode`` functions will take a -domain name argument and perform a conversion to A-labels or U-labels -respectively. - -.. code-block:: pycon - - >>> import idna - >>> idna.encode('ドメイン.テスト') - b'xn--eckwd4c7c.xn--zckzah' - >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) - ドメイン.テスト - -You may use the codec encoding and decoding methods using the -``idna.codec`` module: - -.. code-block:: pycon - - >>> import idna.codec - >>> print('домен.испытание'.encode('idna2008')) - b'xn--d1acufc.xn--80akhbyknj4f' - >>> print(b'xn--d1acufc.xn--80akhbyknj4f'.decode('idna2008')) - домен.испытание - -Conversions can be applied at a per-label basis using the ``ulabel`` or -``alabel`` functions if necessary: - -.. code-block:: pycon - - >>> idna.alabel('测试') - b'xn--0zwm56d' - -Compatibility Mapping (UTS #46) -+++++++++++++++++++++++++++++++ - -As described in `RFC 5895 `_, the -IDNA specification does not normalize input from different potential -ways a user may input a domain name. This functionality, known as -a “mapping”, is considered by the specification to be a local -user-interface issue distinct from IDNA conversion functionality. - -This library provides one such mapping that was developed by the -Unicode Consortium. Known as `Unicode IDNA Compatibility Processing -`_, it provides for both a regular -mapping for typical applications, as well as a transitional mapping to -help migrate from older IDNA 2003 applications. Strings are -preprocessed according to Section 4.4 “Preprocessing for IDNA2008” -prior to the IDNA operations. - -For example, “Königsgäßchen” is not a permissible label as *LATIN -CAPITAL LETTER K* is not allowed (nor are capital letters in general). -UTS 46 will convert this into lower case prior to applying the IDNA -conversion. - -.. code-block:: pycon - - >>> import idna - >>> idna.encode('Königsgäßchen') - ... - idna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed - >>> idna.encode('Königsgäßchen', uts46=True) - b'xn--knigsgchen-b4a3dun' - >>> print(idna.decode('xn--knigsgchen-b4a3dun')) - königsgäßchen - -Transitional processing provides conversions to help transition from -the older 2003 standard to the current standard. For example, in the -original IDNA specification, the *LATIN SMALL LETTER SHARP S* (ß) was -converted into two *LATIN SMALL LETTER S* (ss), whereas in the current -IDNA specification this conversion is not performed. - -.. code-block:: pycon - - >>> idna.encode('Königsgäßchen', uts46=True, transitional=True) - 'xn--knigsgsschen-lcb0w' - -Implementers should use transitional processing with caution, only in -rare cases where conversion from legacy labels to current labels must be -performed (i.e. IDNA implementations that pre-date 2008). For typical -applications that just need to convert labels, transitional processing -is unlikely to be beneficial and could produce unexpected incompatible -results. - -``encodings.idna`` Compatibility -++++++++++++++++++++++++++++++++ - -Function calls from the Python built-in ``encodings.idna`` module are -mapped to their IDNA 2008 equivalents using the ``idna.compat`` module. -Simply substitute the ``import`` clause in your code to refer to the new -module name. - -Exceptions ----------- - -All errors raised during the conversion following the specification -should raise an exception derived from the ``idna.IDNAError`` base -class. - -More specific exceptions that may be generated as ``idna.IDNABidiError`` -when the error reflects an illegal combination of left-to-right and -right-to-left characters in a label; ``idna.InvalidCodepoint`` when -a specific codepoint is an illegal character in an IDN label (i.e. -INVALID); and ``idna.InvalidCodepointContext`` when the codepoint is -illegal based on its positional context (i.e. it is CONTEXTO or CONTEXTJ -but the contextual requirements are not satisfied.) - -Building and Diagnostics ------------------------- - -The IDNA and UTS 46 functionality relies upon pre-calculated lookup -tables for performance. These tables are derived from computing against -eligibility criteria in the respective standards. These tables are -computed using the command-line script ``tools/idna-data``. - -This tool will fetch relevant codepoint data from the Unicode repository -and perform the required calculations to identify eligibility. There are -three main modes: - -* ``idna-data make-libdata``. Generates ``idnadata.py`` and - ``uts46data.py``, the pre-calculated lookup tables used for IDNA and - UTS 46 conversions. Implementers who wish to track this library against - a different Unicode version may use this tool to manually generate a - different version of the ``idnadata.py`` and ``uts46data.py`` files. - -* ``idna-data make-table``. Generate a table of the IDNA disposition - (e.g. PVALID, CONTEXTJ, CONTEXTO) in the format found in Appendix - B.1 of RFC 5892 and the pre-computed tables published by `IANA - `_. - -* ``idna-data U+0061``. Prints debugging output on the various - properties associated with an individual Unicode codepoint (in this - case, U+0061), that are used to assess the IDNA and UTS 46 status of a - codepoint. This is helpful in debugging or analysis. - -The tool accepts a number of arguments, described using ``idna-data --h``. Most notably, the ``--version`` argument allows the specification -of the version of Unicode to be used in computing the table data. For -example, ``idna-data --version 9.0.0 make-libdata`` will generate -library data against Unicode 9.0.0. - - -Additional Notes ----------------- - -* **Packages**. The latest tagged release version is published in the - `Python Package Index `_. - -* **Version support**. This library supports Python 3.6 and higher. - As this library serves as a low-level toolkit for a variety of - applications, many of which strive for broad compatibility with older - Python versions, there is no rush to remove older interpreter support. - Removing support for older versions should be well justified in that the - maintenance burden has become too high. - -* **Python 2**. Python 2 is supported by version 2.x of this library. - Use "idna<3" in your requirements file if you need this library for - a Python 2 application. Be advised that these versions are no longer - actively developed. - -* **Testing**. The library has a test suite based on each rule of the - IDNA specification, as well as tests that are provided as part of the - Unicode Technical Standard 46, `Unicode IDNA Compatibility Processing - `_. - -* **Emoji**. It is an occasional request to support emoji domains in - this library. Encoding of symbols like emoji is expressly prohibited by - the technical standard IDNA 2008 and emoji domains are broadly phased - out across the domain industry due to associated security risks. For - now, applications that need to support these non-compliant labels - may wish to consider trying the encode/decode operation in this library - first, and then falling back to using `encodings.idna`. See `the Github - project `_ for more discussion. - diff --git a/venv/lib/python3.11/site-packages/idna-3.10.dist-info/RECORD b/venv/lib/python3.11/site-packages/idna-3.10.dist-info/RECORD deleted file mode 100644 index 4a47b68..0000000 --- a/venv/lib/python3.11/site-packages/idna-3.10.dist-info/RECORD +++ /dev/null @@ -1,22 +0,0 @@ -idna-3.10.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -idna-3.10.dist-info/LICENSE.md,sha256=pZ8LDvNjWHQQmkRhykT_enDVBpboFHZ7-vch1Mmw2w8,1541 -idna-3.10.dist-info/METADATA,sha256=URR5ZyDfQ1PCEGhkYoojqfi2Ra0tau2--lhwG4XSfjI,10158 -idna-3.10.dist-info/RECORD,, -idna-3.10.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 -idna/__init__.py,sha256=MPqNDLZbXqGaNdXxAFhiqFPKEQXju2jNQhCey6-5eJM,868 -idna/__pycache__/__init__.cpython-311.pyc,, -idna/__pycache__/codec.cpython-311.pyc,, -idna/__pycache__/compat.cpython-311.pyc,, -idna/__pycache__/core.cpython-311.pyc,, -idna/__pycache__/idnadata.cpython-311.pyc,, -idna/__pycache__/intranges.cpython-311.pyc,, -idna/__pycache__/package_data.cpython-311.pyc,, -idna/__pycache__/uts46data.cpython-311.pyc,, -idna/codec.py,sha256=PEew3ItwzjW4hymbasnty2N2OXvNcgHB-JjrBuxHPYY,3422 -idna/compat.py,sha256=RzLy6QQCdl9784aFhb2EX9EKGCJjg0P3PilGdeXXcx8,316 -idna/core.py,sha256=YJYyAMnwiQEPjVC4-Fqu_p4CJ6yKKuDGmppBNQNQpFs,13239 -idna/idnadata.py,sha256=W30GcIGvtOWYwAjZj4ZjuouUutC6ffgNuyjJy7fZ-lo,78306 -idna/intranges.py,sha256=amUtkdhYcQG8Zr-CoMM_kVRacxkivC1WgxN1b63KKdU,1898 -idna/package_data.py,sha256=q59S3OXsc5VI8j6vSD0sGBMyk6zZ4vWFREE88yCJYKs,21 -idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -idna/uts46data.py,sha256=rt90K9J40gUSwppDPCrhjgi5AA6pWM65dEGRSf6rIhM,239289 diff --git a/venv/lib/python3.11/site-packages/idna-3.10.dist-info/WHEEL b/venv/lib/python3.11/site-packages/idna-3.10.dist-info/WHEEL deleted file mode 100644 index 3b5e64b..0000000 --- a/venv/lib/python3.11/site-packages/idna-3.10.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.9.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv/lib/python3.11/site-packages/idna/__init__.py b/venv/lib/python3.11/site-packages/idna/__init__.py deleted file mode 100644 index cfdc030..0000000 --- a/venv/lib/python3.11/site-packages/idna/__init__.py +++ /dev/null @@ -1,45 +0,0 @@ -from .core import ( - IDNABidiError, - IDNAError, - InvalidCodepoint, - InvalidCodepointContext, - alabel, - check_bidi, - check_hyphen_ok, - check_initial_combiner, - check_label, - check_nfc, - decode, - encode, - ulabel, - uts46_remap, - valid_contextj, - valid_contexto, - valid_label_length, - valid_string_length, -) -from .intranges import intranges_contain -from .package_data import __version__ - -__all__ = [ - "__version__", - "IDNABidiError", - "IDNAError", - "InvalidCodepoint", - "InvalidCodepointContext", - "alabel", - "check_bidi", - "check_hyphen_ok", - "check_initial_combiner", - "check_label", - "check_nfc", - "decode", - "encode", - "intranges_contain", - "ulabel", - "uts46_remap", - "valid_contextj", - "valid_contexto", - "valid_label_length", - "valid_string_length", -] diff --git a/venv/lib/python3.11/site-packages/idna/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/idna/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 463d1abc969995405fef356e920b869d16d2b01b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1083 zcmdUtzmL-}6vyp0O`E3a@AeoF8`5>)qSGNHB!mQo;g(z2yjX7HYfWt@a?+G;{1@yj zi2vqB$ll}eQM ztXrA=b6F71;&~F&G+{E=M|UIhMCSBeu3f^(f^yxCRy11Ug^|;}%3kf#6_q$y>uD8W zlI4tW93^7GBvsn4;+29|Ir1{nZcHPSTDw$M_f7SRzsa-5Pq3nbq`F&{XvE4w-rn&O zJ*=LWUt&(>GGFOY70YtP0H;9_=9J5i$OKjryr3hn)BwJbUoET}9(&K6<1%U6j!J2^cK zGnUgw2eB+M$`U*S<7%=hY;>-BUsym{~yNy&aS}m a@B0gQc=hMrI}_h@dyDr?d#U^8M1BH9p&6F| diff --git a/venv/lib/python3.11/site-packages/idna/__pycache__/codec.cpython-311.pyc b/venv/lib/python3.11/site-packages/idna/__pycache__/codec.cpython-311.pyc deleted file mode 100644 index 1621a8df8cc5dee8d3400adde0565bcb1e356d1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5765 zcmdT|OKcm*8J;C~mrIE-xAKJ?%tX%GmpfB_YO4@M86E1!I6|9_Ut zmn^|C;6sPI|IXu^=Rfn!|MM?xZ7l@CPyY4qtG{X^vYIkBbRM$dQmjQoCR#!*iPlgnM{GplW?fd}vakxR z-hr_Tw}4G@ER{Ky>WKs>3y+bca z$wK>7v3)ABahwwto%vlX6DNaD;-~aaOZ=(dnhjrQ9m^K|Efre zRB+d3G-!(AnWlJBXeSCh!j@)ew^e2>u6YWPDqd}IyGp)Y*@^8IcRIkaT?dCs3WwE5 zLJ5bBmT)+cl+$sHyTajLrz7!7i5*TH#Z7JqSLSs^GwdiS$^%vT*jCDP1Ei!kR! zA;Z(o3@-~c!q!At#C%yeNmOUXt~ty&AZ=K3l`M*~V-a$L$}#gj+{{m z8L5#g8&e#~IH-_;D`Eju2Q52vRN)qNP0YASqO+;hCd;DI zGoTn(J58=;N1WpMWIOB0e<5t(4Kl{qnWAz75~FB#@C{Emt;Uc?!*WvB!c;K?EftUH zaPg*6iYikH+d^hA_}OGk4YW{P`Px3B!&oM=+gLMPI*r8eV!-C`;?vS`xDK`00yJ#i zfzA7PtP#=&t!O)8p0CRG-hpqu!w1!)Wfxo>Wg7wr!-;w>Rr5b#&(rWzT2Nm;Bvj!ncjA zn;8IvJH$Iu+B=+`T=)8*9k*whFZp`_Q1`PklMG;{Rgw&S=3kQgn^v zT_YuS1GRORJRLdiQ)iYhxjdi0ofAGif9rg~wP!iF94w1uSMTll&*oQl7CJ|Yog-@} z3Y~AlNF~?j_UvTAGf?yl6r=&@)7_JMFYg}6O9N~#Ob48F52_9qi}s@!0AcV~lF2xu zP&$a2dr?fF*oOiyJd-|$FoptKsnEYgpk>=0VQ>YQ6Fz?f=7i7JLH4^To`1gWE~f>J-iJQ{^#{FVS|mP;}NZdRj{b; zp;g6#=4rIpWWKR{k<;<8R>DeMt5)7-I}bQjsB)^ru=@aT;E23WUY3OQdY; zH~AGl$gl80euWS4>*4$_E<8B;PcSthy`?be729v1S5P?%8|doQo0?!k+6>nPohp&U z`xKlnI(^sPe1kMi;WV^CQONLa;MuQDp~Oo|L30p@_~C#(!cc&5RnUWJ?2NJ|l5tX2$pIixlwXK5rc&}OMFT|JVOE2njkXO2fFAav~JkI zq!sn~6xgH`^+QnsrpL%flTb*km|?2On=Mkd z3@-#!2)Aj8Oj^LXvz0I;s$7j}aLSst_H*fk>H40cmjH|_s@(xuwsRa;B5h0TS0c_O z_A8O${MOGpIi7#HXWh3ud+64&{GMY4-|?aks(H$ymjl;zvsnJ=&B>>j|EyLx(#HW6 zZ5Fwm#jaydvEW&)G{_Agdb6mYq2O7q^k*<}CtNX`M0O%KRO}voibcF1Eh; diff --git a/venv/lib/python3.11/site-packages/idna/__pycache__/compat.cpython-311.pyc b/venv/lib/python3.11/site-packages/idna/__pycache__/compat.cpython-311.pyc deleted file mode 100644 index f785fb094743e861643af61643d6b70ba55bf42d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1005 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

hmA!T43@;myb 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 Tzy09LY0f^r$%p?*cs~9OQexNO diff --git a/venv/lib/python3.11/site-packages/idna/__pycache__/package_data.cpython-311.pyc b/venv/lib/python3.11/site-packages/idna/__pycache__/package_data.cpython-311.pyc deleted file mode 100644 index c9b427402ea5334283cb882282faed3d38ccad1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199 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

T7VZ66r9iev+-;C0?{e z(UIt*mwIfQ9+)nqIcv1kWnM39YH0M7g}4AI>9#vu?vt=AQt0Z1t#*ai?b*aKztSuA z$WSpkXPs(VQ#~k8E09X(pYEo@RjOdBEOi0uQ`8I4Dpz~mHZ$pT;&jR|sn>YXo=+x} zWOTS|l|omUE&xpUb^lfro(P3R)M*=St_RU*mJwZE2jUXq#aL&KfP7qQMTf@DNJ1jBcZ&)qmQS+ zAyx3$)HG$h?>iNhGQnITIMmy{Vw%R9ykvWhIFm|Vw|QEVh$HXtifOcziKaPexT3`? zd(mb)6^4(jk?ZVLyl%54J-k*`yC$SMt{5$;)l#wY+XCInCsZ+SK-nJ#r?hpS;`TjMJ~#@yn zwlPSUBh*vMOsc{06f|>vrO+|dF)>W;{I@~_Xd5YaDPGEbO3Jm3|3{pOiQrD0E39#whJ>$WQMP4^_*1+l3YZDY*0 zF0Yx#Hc#N=;i$lgH}|?dY@u~h4|!~h0=AZ$j(PZBBAPLD7%jYLn}m!miD>;tid9gF zmP(0~OJ}qDk z3)=};)52#2tYu+)0c%_Mtblba>>yxW3p)x}&%#a~+BL1Eoh1#=DN)k!q`F8No>f;# z!_(>}X?R}UB@It3DrtCTJtPfJt*4~nx%CpXdU&~dOB$YAA4$V=>nmw^Zv7+;&+R!! za}&Dv>qy-!@F0?ic>h?u<3NfJ@bQFB9RmUbJ&5$h;(t&q-mf#o2gl-xy(vD##}g8J zS0^x(gBk>ec|bn{P4VYl+^k6QwrAz1PbB<;!1*)R+J(xC0_QDRPWynTn&s69YSJuk z+G)@7UJ~Wy&m5n>5lj1*J;o5H4d1-%2`92=+a28`C+0>>qYsb8`=HU2UEHkS4rYU; zIF=jfjrfRIyeHzREZ&LYBV+O2h^NKk-4IXr@r2GDdl4ArL8+dWjP@kbuPdb(6N~pj ze5{Ly)dU--81{$8J4RJUd_pYV6Y+_$c=urxpXB2SJq?%~1HBEH5(C`~m>L5E44CFX zST~&EbjPS3h|h?{6A_;oi}yr)RxI8XU3YdY-UsnHE*_QvHrFvK1M!SlyffnSV)34c z&-d|!-ex!~h=I-qEc75^;){Gdp{D_hW1x3$44@@3(Aj{c9z;xhnU7NzIAXa2<_mVc zkEKuRPjrQ+@I;1Uz^-&Ss7)h>z$yoF6MCBdygCMY8?Yt@x*4!G27-=>l*c*;2GWn) z#SshZu-KxOkWc z*jC3V55%{{;yn@H?&3j5+d4ZOpo$Kr1UqB#K8R<#cvuM7F2|@4#B*Zto`~;u@t}(> zfp7W|;y@^GluYrZnx4iE3+(@VADE%9;cxPDdH(4B)Xpf5KZ+lS#iM;F{!T33vnRz5x_I!2J?}#f z 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 diff --git a/venv/lib/python3.11/site-packages/idna/codec.py b/venv/lib/python3.11/site-packages/idna/codec.py deleted file mode 100644 index 913abfd..0000000 --- a/venv/lib/python3.11/site-packages/idna/codec.py +++ /dev/null @@ -1,122 +0,0 @@ -import codecs -import re -from typing import Any, Optional, Tuple - -from .core import IDNAError, alabel, decode, encode, ulabel - -_unicode_dots_re = re.compile("[\u002e\u3002\uff0e\uff61]") - - -class Codec(codecs.Codec): - def encode(self, data: str, errors: str = "strict") -> Tuple[bytes, int]: - if errors != "strict": - raise IDNAError('Unsupported error handling "{}"'.format(errors)) - - if not data: - return b"", 0 - - return encode(data), len(data) - - def decode(self, data: bytes, errors: str = "strict") -> Tuple[str, int]: - if errors != "strict": - raise IDNAError('Unsupported error handling "{}"'.format(errors)) - - if not data: - return "", 0 - - return decode(data), len(data) - - -class IncrementalEncoder(codecs.BufferedIncrementalEncoder): - def _buffer_encode(self, data: str, errors: str, final: bool) -> Tuple[bytes, int]: - if errors != "strict": - raise IDNAError('Unsupported error handling "{}"'.format(errors)) - - if not data: - return b"", 0 - - labels = _unicode_dots_re.split(data) - trailing_dot = b"" - if labels: - if not labels[-1]: - trailing_dot = b"." - del labels[-1] - elif not final: - # Keep potentially unfinished label until the next call - del labels[-1] - if labels: - trailing_dot = b"." - - result = [] - size = 0 - for label in labels: - result.append(alabel(label)) - if size: - size += 1 - size += len(label) - - # Join with U+002E - result_bytes = b".".join(result) + trailing_dot - size += len(trailing_dot) - return result_bytes, size - - -class IncrementalDecoder(codecs.BufferedIncrementalDecoder): - def _buffer_decode(self, data: Any, errors: str, final: bool) -> Tuple[str, int]: - if errors != "strict": - raise IDNAError('Unsupported error handling "{}"'.format(errors)) - - if not data: - return ("", 0) - - if not isinstance(data, str): - data = str(data, "ascii") - - labels = _unicode_dots_re.split(data) - trailing_dot = "" - if labels: - if not labels[-1]: - trailing_dot = "." - del labels[-1] - elif not final: - # Keep potentially unfinished label until the next call - del labels[-1] - if labels: - trailing_dot = "." - - result = [] - size = 0 - for label in labels: - result.append(ulabel(label)) - if size: - size += 1 - size += len(label) - - result_str = ".".join(result) + trailing_dot - size += len(trailing_dot) - return (result_str, size) - - -class StreamWriter(Codec, codecs.StreamWriter): - pass - - -class StreamReader(Codec, codecs.StreamReader): - pass - - -def search_function(name: str) -> Optional[codecs.CodecInfo]: - if name != "idna2008": - return None - return codecs.CodecInfo( - name=name, - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamwriter=StreamWriter, - streamreader=StreamReader, - ) - - -codecs.register(search_function) diff --git a/venv/lib/python3.11/site-packages/idna/compat.py b/venv/lib/python3.11/site-packages/idna/compat.py deleted file mode 100644 index 1df9f2a..0000000 --- a/venv/lib/python3.11/site-packages/idna/compat.py +++ /dev/null @@ -1,15 +0,0 @@ -from typing import Any, Union - -from .core import decode, encode - - -def ToASCII(label: str) -> bytes: - return encode(label) - - -def ToUnicode(label: Union[bytes, bytearray]) -> str: - return decode(label) - - -def nameprep(s: Any) -> None: - raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol") diff --git a/venv/lib/python3.11/site-packages/idna/core.py b/venv/lib/python3.11/site-packages/idna/core.py deleted file mode 100644 index 9115f12..0000000 --- a/venv/lib/python3.11/site-packages/idna/core.py +++ /dev/null @@ -1,437 +0,0 @@ -import bisect -import re -import unicodedata -from typing import Optional, Union - -from . import idnadata -from .intranges import intranges_contain - -_virama_combining_class = 9 -_alabel_prefix = b"xn--" -_unicode_dots_re = re.compile("[\u002e\u3002\uff0e\uff61]") - - -class IDNAError(UnicodeError): - """Base exception for all IDNA-encoding related problems""" - - pass - - -class IDNABidiError(IDNAError): - """Exception when bidirectional requirements are not satisfied""" - - pass - - -class InvalidCodepoint(IDNAError): - """Exception when a disallowed or unallocated codepoint is used""" - - pass - - -class InvalidCodepointContext(IDNAError): - """Exception when the codepoint is not valid in the context it is used""" - - pass - - -def _combining_class(cp: int) -> int: - v = unicodedata.combining(chr(cp)) - if v == 0: - if not unicodedata.name(chr(cp)): - raise ValueError("Unknown character in unicodedata") - return v - - -def _is_script(cp: str, script: str) -> bool: - return intranges_contain(ord(cp), idnadata.scripts[script]) - - -def _punycode(s: str) -> bytes: - return s.encode("punycode") - - -def _unot(s: int) -> str: - return "U+{:04X}".format(s) - - -def valid_label_length(label: Union[bytes, str]) -> bool: - if len(label) > 63: - return False - return True - - -def valid_string_length(label: Union[bytes, str], trailing_dot: bool) -> bool: - if len(label) > (254 if trailing_dot else 253): - return False - return True - - -def check_bidi(label: str, check_ltr: bool = False) -> bool: - # Bidi rules should only be applied if string contains RTL characters - bidi_label = False - for idx, cp in enumerate(label, 1): - direction = unicodedata.bidirectional(cp) - if direction == "": - # String likely comes from a newer version of Unicode - raise IDNABidiError("Unknown directionality in label {} at position {}".format(repr(label), idx)) - if direction in ["R", "AL", "AN"]: - bidi_label = True - if not bidi_label and not check_ltr: - return True - - # Bidi rule 1 - direction = unicodedata.bidirectional(label[0]) - if direction in ["R", "AL"]: - rtl = True - elif direction == "L": - rtl = False - else: - raise IDNABidiError("First codepoint in label {} must be directionality L, R or AL".format(repr(label))) - - valid_ending = False - number_type: Optional[str] = None - for idx, cp in enumerate(label, 1): - direction = unicodedata.bidirectional(cp) - - if rtl: - # Bidi rule 2 - if direction not in [ - "R", - "AL", - "AN", - "EN", - "ES", - "CS", - "ET", - "ON", - "BN", - "NSM", - ]: - raise IDNABidiError("Invalid direction for codepoint at position {} in a right-to-left label".format(idx)) - # Bidi rule 3 - if direction in ["R", "AL", "EN", "AN"]: - valid_ending = True - elif direction != "NSM": - valid_ending = False - # Bidi rule 4 - if direction in ["AN", "EN"]: - if not number_type: - number_type = direction - else: - if number_type != direction: - raise IDNABidiError("Can not mix numeral types in a right-to-left label") - else: - # Bidi rule 5 - if direction not in ["L", "EN", "ES", "CS", "ET", "ON", "BN", "NSM"]: - raise IDNABidiError("Invalid direction for codepoint at position {} in a left-to-right label".format(idx)) - # Bidi rule 6 - if direction in ["L", "EN"]: - valid_ending = True - elif direction != "NSM": - valid_ending = False - - if not valid_ending: - raise IDNABidiError("Label ends with illegal codepoint directionality") - - return True - - -def check_initial_combiner(label: str) -> bool: - if unicodedata.category(label[0])[0] == "M": - raise IDNAError("Label begins with an illegal combining character") - return True - - -def check_hyphen_ok(label: str) -> bool: - if label[2:4] == "--": - raise IDNAError("Label has disallowed hyphens in 3rd and 4th position") - if label[0] == "-" or label[-1] == "-": - raise IDNAError("Label must not start or end with a hyphen") - return True - - -def check_nfc(label: str) -> None: - if unicodedata.normalize("NFC", label) != label: - raise IDNAError("Label must be in Normalization Form C") - - -def valid_contextj(label: str, pos: int) -> bool: - cp_value = ord(label[pos]) - - if cp_value == 0x200C: - if pos > 0: - if _combining_class(ord(label[pos - 1])) == _virama_combining_class: - return True - - ok = False - for i in range(pos - 1, -1, -1): - joining_type = idnadata.joining_types.get(ord(label[i])) - if joining_type == ord("T"): - continue - elif joining_type in [ord("L"), ord("D")]: - ok = True - break - else: - break - - if not ok: - return False - - ok = False - for i in range(pos + 1, len(label)): - joining_type = idnadata.joining_types.get(ord(label[i])) - if joining_type == ord("T"): - continue - elif joining_type in [ord("R"), ord("D")]: - ok = True - break - else: - break - return ok - - if cp_value == 0x200D: - if pos > 0: - if _combining_class(ord(label[pos - 1])) == _virama_combining_class: - return True - return False - - else: - return False - - -def valid_contexto(label: str, pos: int, exception: bool = False) -> bool: - cp_value = ord(label[pos]) - - if cp_value == 0x00B7: - if 0 < pos < len(label) - 1: - if ord(label[pos - 1]) == 0x006C and ord(label[pos + 1]) == 0x006C: - return True - return False - - elif cp_value == 0x0375: - if pos < len(label) - 1 and len(label) > 1: - return _is_script(label[pos + 1], "Greek") - return False - - elif cp_value == 0x05F3 or cp_value == 0x05F4: - if pos > 0: - return _is_script(label[pos - 1], "Hebrew") - return False - - elif cp_value == 0x30FB: - for cp in label: - if cp == "\u30fb": - continue - if _is_script(cp, "Hiragana") or _is_script(cp, "Katakana") or _is_script(cp, "Han"): - return True - return False - - elif 0x660 <= cp_value <= 0x669: - for cp in label: - if 0x6F0 <= ord(cp) <= 0x06F9: - return False - return True - - elif 0x6F0 <= cp_value <= 0x6F9: - for cp in label: - if 0x660 <= ord(cp) <= 0x0669: - return False - return True - - return False - - -def check_label(label: Union[str, bytes, bytearray]) -> None: - if isinstance(label, (bytes, bytearray)): - label = label.decode("utf-8") - if len(label) == 0: - raise IDNAError("Empty Label") - - check_nfc(label) - check_hyphen_ok(label) - check_initial_combiner(label) - - for pos, cp in enumerate(label): - cp_value = ord(cp) - if intranges_contain(cp_value, idnadata.codepoint_classes["PVALID"]): - continue - elif intranges_contain(cp_value, idnadata.codepoint_classes["CONTEXTJ"]): - try: - if not valid_contextj(label, pos): - raise InvalidCodepointContext( - "Joiner {} not allowed at position {} in {}".format(_unot(cp_value), pos + 1, repr(label)) - ) - except ValueError: - raise IDNAError( - "Unknown codepoint adjacent to joiner {} at position {} in {}".format( - _unot(cp_value), pos + 1, repr(label) - ) - ) - elif intranges_contain(cp_value, idnadata.codepoint_classes["CONTEXTO"]): - if not valid_contexto(label, pos): - raise InvalidCodepointContext( - "Codepoint {} not allowed at position {} in {}".format(_unot(cp_value), pos + 1, repr(label)) - ) - else: - raise InvalidCodepoint( - "Codepoint {} at position {} of {} not allowed".format(_unot(cp_value), pos + 1, repr(label)) - ) - - check_bidi(label) - - -def alabel(label: str) -> bytes: - try: - label_bytes = label.encode("ascii") - ulabel(label_bytes) - if not valid_label_length(label_bytes): - raise IDNAError("Label too long") - return label_bytes - except UnicodeEncodeError: - pass - - check_label(label) - label_bytes = _alabel_prefix + _punycode(label) - - if not valid_label_length(label_bytes): - raise IDNAError("Label too long") - - return label_bytes - - -def ulabel(label: Union[str, bytes, bytearray]) -> str: - if not isinstance(label, (bytes, bytearray)): - try: - label_bytes = label.encode("ascii") - except UnicodeEncodeError: - check_label(label) - return label - else: - label_bytes = label - - label_bytes = label_bytes.lower() - if label_bytes.startswith(_alabel_prefix): - label_bytes = label_bytes[len(_alabel_prefix) :] - if not label_bytes: - raise IDNAError("Malformed A-label, no Punycode eligible content found") - if label_bytes.decode("ascii")[-1] == "-": - raise IDNAError("A-label must not end with a hyphen") - else: - check_label(label_bytes) - return label_bytes.decode("ascii") - - try: - label = label_bytes.decode("punycode") - except UnicodeError: - raise IDNAError("Invalid A-label") - check_label(label) - return label - - -def uts46_remap(domain: str, std3_rules: bool = True, transitional: bool = False) -> str: - """Re-map the characters in the string according to UTS46 processing.""" - from .uts46data import uts46data - - output = "" - - for pos, char in enumerate(domain): - code_point = ord(char) - try: - uts46row = uts46data[code_point if code_point < 256 else bisect.bisect_left(uts46data, (code_point, "Z")) - 1] - status = uts46row[1] - replacement: Optional[str] = None - if len(uts46row) == 3: - replacement = uts46row[2] - if ( - status == "V" - or (status == "D" and not transitional) - or (status == "3" and not std3_rules and replacement is None) - ): - output += char - elif replacement is not None and ( - status == "M" or (status == "3" and not std3_rules) or (status == "D" and transitional) - ): - output += replacement - elif status != "I": - raise IndexError() - except IndexError: - raise InvalidCodepoint( - "Codepoint {} not allowed at position {} in {}".format(_unot(code_point), pos + 1, repr(domain)) - ) - - return unicodedata.normalize("NFC", output) - - -def encode( - s: Union[str, bytes, bytearray], - strict: bool = False, - uts46: bool = False, - std3_rules: bool = False, - transitional: bool = False, -) -> bytes: - if not isinstance(s, str): - try: - s = str(s, "ascii") - except UnicodeDecodeError: - raise IDNAError("should pass a unicode string to the function rather than a byte string.") - if uts46: - s = uts46_remap(s, std3_rules, transitional) - trailing_dot = False - result = [] - if strict: - labels = s.split(".") - else: - labels = _unicode_dots_re.split(s) - if not labels or labels == [""]: - raise IDNAError("Empty domain") - if labels[-1] == "": - del labels[-1] - trailing_dot = True - for label in labels: - s = alabel(label) - if s: - result.append(s) - else: - raise IDNAError("Empty label") - if trailing_dot: - result.append(b"") - s = b".".join(result) - if not valid_string_length(s, trailing_dot): - raise IDNAError("Domain too long") - return s - - -def decode( - s: Union[str, bytes, bytearray], - strict: bool = False, - uts46: bool = False, - std3_rules: bool = False, -) -> str: - try: - if not isinstance(s, str): - s = str(s, "ascii") - except UnicodeDecodeError: - raise IDNAError("Invalid ASCII in A-label") - if uts46: - s = uts46_remap(s, std3_rules, False) - trailing_dot = False - result = [] - if not strict: - labels = _unicode_dots_re.split(s) - else: - labels = s.split(".") - if not labels or labels == [""]: - raise IDNAError("Empty domain") - if not labels[-1]: - del labels[-1] - trailing_dot = True - for label in labels: - s = ulabel(label) - if s: - result.append(s) - else: - raise IDNAError("Empty label") - if trailing_dot: - result.append("") - return ".".join(result) diff --git a/venv/lib/python3.11/site-packages/idna/idnadata.py b/venv/lib/python3.11/site-packages/idna/idnadata.py deleted file mode 100644 index 4be6004..0000000 --- a/venv/lib/python3.11/site-packages/idna/idnadata.py +++ /dev/null @@ -1,4243 +0,0 @@ -# This file is automatically generated by tools/idna-data - -__version__ = "15.1.0" -scripts = { - "Greek": ( - 0x37000000374, - 0x37500000378, - 0x37A0000037E, - 0x37F00000380, - 0x38400000385, - 0x38600000387, - 0x3880000038B, - 0x38C0000038D, - 0x38E000003A2, - 0x3A3000003E2, - 0x3F000000400, - 0x1D2600001D2B, - 0x1D5D00001D62, - 0x1D6600001D6B, - 0x1DBF00001DC0, - 0x1F0000001F16, - 0x1F1800001F1E, - 0x1F2000001F46, - 0x1F4800001F4E, - 0x1F5000001F58, - 0x1F5900001F5A, - 0x1F5B00001F5C, - 0x1F5D00001F5E, - 0x1F5F00001F7E, - 0x1F8000001FB5, - 0x1FB600001FC5, - 0x1FC600001FD4, - 0x1FD600001FDC, - 0x1FDD00001FF0, - 0x1FF200001FF5, - 0x1FF600001FFF, - 0x212600002127, - 0xAB650000AB66, - 0x101400001018F, - 0x101A0000101A1, - 0x1D2000001D246, - ), - "Han": ( - 0x2E8000002E9A, - 0x2E9B00002EF4, - 0x2F0000002FD6, - 0x300500003006, - 0x300700003008, - 0x30210000302A, - 0x30380000303C, - 0x340000004DC0, - 0x4E000000A000, - 0xF9000000FA6E, - 0xFA700000FADA, - 0x16FE200016FE4, - 0x16FF000016FF2, - 0x200000002A6E0, - 0x2A7000002B73A, - 0x2B7400002B81E, - 0x2B8200002CEA2, - 0x2CEB00002EBE1, - 0x2EBF00002EE5E, - 0x2F8000002FA1E, - 0x300000003134B, - 0x31350000323B0, - ), - "Hebrew": ( - 0x591000005C8, - 0x5D0000005EB, - 0x5EF000005F5, - 0xFB1D0000FB37, - 0xFB380000FB3D, - 0xFB3E0000FB3F, - 0xFB400000FB42, - 0xFB430000FB45, - 0xFB460000FB50, - ), - "Hiragana": ( - 0x304100003097, - 0x309D000030A0, - 0x1B0010001B120, - 0x1B1320001B133, - 0x1B1500001B153, - 0x1F2000001F201, - ), - "Katakana": ( - 0x30A1000030FB, - 0x30FD00003100, - 0x31F000003200, - 0x32D0000032FF, - 0x330000003358, - 0xFF660000FF70, - 0xFF710000FF9E, - 0x1AFF00001AFF4, - 0x1AFF50001AFFC, - 0x1AFFD0001AFFF, - 0x1B0000001B001, - 0x1B1200001B123, - 0x1B1550001B156, - 0x1B1640001B168, - ), -} -joining_types = { - 0xAD: 84, - 0x300: 84, - 0x301: 84, - 0x302: 84, - 0x303: 84, - 0x304: 84, - 0x305: 84, - 0x306: 84, - 0x307: 84, - 0x308: 84, - 0x309: 84, - 0x30A: 84, - 0x30B: 84, - 0x30C: 84, - 0x30D: 84, - 0x30E: 84, - 0x30F: 84, - 0x310: 84, - 0x311: 84, - 0x312: 84, - 0x313: 84, - 0x314: 84, - 0x315: 84, - 0x316: 84, - 0x317: 84, - 0x318: 84, - 0x319: 84, - 0x31A: 84, - 0x31B: 84, - 0x31C: 84, - 0x31D: 84, - 0x31E: 84, - 0x31F: 84, - 0x320: 84, - 0x321: 84, - 0x322: 84, - 0x323: 84, - 0x324: 84, - 0x325: 84, - 0x326: 84, - 0x327: 84, - 0x328: 84, - 0x329: 84, - 0x32A: 84, - 0x32B: 84, - 0x32C: 84, - 0x32D: 84, - 0x32E: 84, - 0x32F: 84, - 0x330: 84, - 0x331: 84, - 0x332: 84, - 0x333: 84, - 0x334: 84, - 0x335: 84, - 0x336: 84, - 0x337: 84, - 0x338: 84, - 0x339: 84, - 0x33A: 84, - 0x33B: 84, - 0x33C: 84, - 0x33D: 84, - 0x33E: 84, - 0x33F: 84, - 0x340: 84, - 0x341: 84, - 0x342: 84, - 0x343: 84, - 0x344: 84, - 0x345: 84, - 0x346: 84, - 0x347: 84, - 0x348: 84, - 0x349: 84, - 0x34A: 84, - 0x34B: 84, - 0x34C: 84, - 0x34D: 84, - 0x34E: 84, - 0x34F: 84, - 0x350: 84, - 0x351: 84, - 0x352: 84, - 0x353: 84, - 0x354: 84, - 0x355: 84, - 0x356: 84, - 0x357: 84, - 0x358: 84, - 0x359: 84, - 0x35A: 84, - 0x35B: 84, - 0x35C: 84, - 0x35D: 84, - 0x35E: 84, - 0x35F: 84, - 0x360: 84, - 0x361: 84, - 0x362: 84, - 0x363: 84, - 0x364: 84, - 0x365: 84, - 0x366: 84, - 0x367: 84, - 0x368: 84, - 0x369: 84, - 0x36A: 84, - 0x36B: 84, - 0x36C: 84, - 0x36D: 84, - 0x36E: 84, - 0x36F: 84, - 0x483: 84, - 0x484: 84, - 0x485: 84, - 0x486: 84, - 0x487: 84, - 0x488: 84, - 0x489: 84, - 0x591: 84, - 0x592: 84, - 0x593: 84, - 0x594: 84, - 0x595: 84, - 0x596: 84, - 0x597: 84, - 0x598: 84, - 0x599: 84, - 0x59A: 84, - 0x59B: 84, - 0x59C: 84, - 0x59D: 84, - 0x59E: 84, - 0x59F: 84, - 0x5A0: 84, - 0x5A1: 84, - 0x5A2: 84, - 0x5A3: 84, - 0x5A4: 84, - 0x5A5: 84, - 0x5A6: 84, - 0x5A7: 84, - 0x5A8: 84, - 0x5A9: 84, - 0x5AA: 84, - 0x5AB: 84, - 0x5AC: 84, - 0x5AD: 84, - 0x5AE: 84, - 0x5AF: 84, - 0x5B0: 84, - 0x5B1: 84, - 0x5B2: 84, - 0x5B3: 84, - 0x5B4: 84, - 0x5B5: 84, - 0x5B6: 84, - 0x5B7: 84, - 0x5B8: 84, - 0x5B9: 84, - 0x5BA: 84, - 0x5BB: 84, - 0x5BC: 84, - 0x5BD: 84, - 0x5BF: 84, - 0x5C1: 84, - 0x5C2: 84, - 0x5C4: 84, - 0x5C5: 84, - 0x5C7: 84, - 0x610: 84, - 0x611: 84, - 0x612: 84, - 0x613: 84, - 0x614: 84, - 0x615: 84, - 0x616: 84, - 0x617: 84, - 0x618: 84, - 0x619: 84, - 0x61A: 84, - 0x61C: 84, - 0x620: 68, - 0x622: 82, - 0x623: 82, - 0x624: 82, - 0x625: 82, - 0x626: 68, - 0x627: 82, - 0x628: 68, - 0x629: 82, - 0x62A: 68, - 0x62B: 68, - 0x62C: 68, - 0x62D: 68, - 0x62E: 68, - 0x62F: 82, - 0x630: 82, - 0x631: 82, - 0x632: 82, - 0x633: 68, - 0x634: 68, - 0x635: 68, - 0x636: 68, - 0x637: 68, - 0x638: 68, - 0x639: 68, - 0x63A: 68, - 0x63B: 68, - 0x63C: 68, - 0x63D: 68, - 0x63E: 68, - 0x63F: 68, - 0x640: 67, - 0x641: 68, - 0x642: 68, - 0x643: 68, - 0x644: 68, - 0x645: 68, - 0x646: 68, - 0x647: 68, - 0x648: 82, - 0x649: 68, - 0x64A: 68, - 0x64B: 84, - 0x64C: 84, - 0x64D: 84, - 0x64E: 84, - 0x64F: 84, - 0x650: 84, - 0x651: 84, - 0x652: 84, - 0x653: 84, - 0x654: 84, - 0x655: 84, - 0x656: 84, - 0x657: 84, - 0x658: 84, - 0x659: 84, - 0x65A: 84, - 0x65B: 84, - 0x65C: 84, - 0x65D: 84, - 0x65E: 84, - 0x65F: 84, - 0x66E: 68, - 0x66F: 68, - 0x670: 84, - 0x671: 82, - 0x672: 82, - 0x673: 82, - 0x675: 82, - 0x676: 82, - 0x677: 82, - 0x678: 68, - 0x679: 68, - 0x67A: 68, - 0x67B: 68, - 0x67C: 68, - 0x67D: 68, - 0x67E: 68, - 0x67F: 68, - 0x680: 68, - 0x681: 68, - 0x682: 68, - 0x683: 68, - 0x684: 68, - 0x685: 68, - 0x686: 68, - 0x687: 68, - 0x688: 82, - 0x689: 82, - 0x68A: 82, - 0x68B: 82, - 0x68C: 82, - 0x68D: 82, - 0x68E: 82, - 0x68F: 82, - 0x690: 82, - 0x691: 82, - 0x692: 82, - 0x693: 82, - 0x694: 82, - 0x695: 82, - 0x696: 82, - 0x697: 82, - 0x698: 82, - 0x699: 82, - 0x69A: 68, - 0x69B: 68, - 0x69C: 68, - 0x69D: 68, - 0x69E: 68, - 0x69F: 68, - 0x6A0: 68, - 0x6A1: 68, - 0x6A2: 68, - 0x6A3: 68, - 0x6A4: 68, - 0x6A5: 68, - 0x6A6: 68, - 0x6A7: 68, - 0x6A8: 68, - 0x6A9: 68, - 0x6AA: 68, - 0x6AB: 68, - 0x6AC: 68, - 0x6AD: 68, - 0x6AE: 68, - 0x6AF: 68, - 0x6B0: 68, - 0x6B1: 68, - 0x6B2: 68, - 0x6B3: 68, - 0x6B4: 68, - 0x6B5: 68, - 0x6B6: 68, - 0x6B7: 68, - 0x6B8: 68, - 0x6B9: 68, - 0x6BA: 68, - 0x6BB: 68, - 0x6BC: 68, - 0x6BD: 68, - 0x6BE: 68, - 0x6BF: 68, - 0x6C0: 82, - 0x6C1: 68, - 0x6C2: 68, - 0x6C3: 82, - 0x6C4: 82, - 0x6C5: 82, - 0x6C6: 82, - 0x6C7: 82, - 0x6C8: 82, - 0x6C9: 82, - 0x6CA: 82, - 0x6CB: 82, - 0x6CC: 68, - 0x6CD: 82, - 0x6CE: 68, - 0x6CF: 82, - 0x6D0: 68, - 0x6D1: 68, - 0x6D2: 82, - 0x6D3: 82, - 0x6D5: 82, - 0x6D6: 84, - 0x6D7: 84, - 0x6D8: 84, - 0x6D9: 84, - 0x6DA: 84, - 0x6DB: 84, - 0x6DC: 84, - 0x6DF: 84, - 0x6E0: 84, - 0x6E1: 84, - 0x6E2: 84, - 0x6E3: 84, - 0x6E4: 84, - 0x6E7: 84, - 0x6E8: 84, - 0x6EA: 84, - 0x6EB: 84, - 0x6EC: 84, - 0x6ED: 84, - 0x6EE: 82, - 0x6EF: 82, - 0x6FA: 68, - 0x6FB: 68, - 0x6FC: 68, - 0x6FF: 68, - 0x70F: 84, - 0x710: 82, - 0x711: 84, - 0x712: 68, - 0x713: 68, - 0x714: 68, - 0x715: 82, - 0x716: 82, - 0x717: 82, - 0x718: 82, - 0x719: 82, - 0x71A: 68, - 0x71B: 68, - 0x71C: 68, - 0x71D: 68, - 0x71E: 82, - 0x71F: 68, - 0x720: 68, - 0x721: 68, - 0x722: 68, - 0x723: 68, - 0x724: 68, - 0x725: 68, - 0x726: 68, - 0x727: 68, - 0x728: 82, - 0x729: 68, - 0x72A: 82, - 0x72B: 68, - 0x72C: 82, - 0x72D: 68, - 0x72E: 68, - 0x72F: 82, - 0x730: 84, - 0x731: 84, - 0x732: 84, - 0x733: 84, - 0x734: 84, - 0x735: 84, - 0x736: 84, - 0x737: 84, - 0x738: 84, - 0x739: 84, - 0x73A: 84, - 0x73B: 84, - 0x73C: 84, - 0x73D: 84, - 0x73E: 84, - 0x73F: 84, - 0x740: 84, - 0x741: 84, - 0x742: 84, - 0x743: 84, - 0x744: 84, - 0x745: 84, - 0x746: 84, - 0x747: 84, - 0x748: 84, - 0x749: 84, - 0x74A: 84, - 0x74D: 82, - 0x74E: 68, - 0x74F: 68, - 0x750: 68, - 0x751: 68, - 0x752: 68, - 0x753: 68, - 0x754: 68, - 0x755: 68, - 0x756: 68, - 0x757: 68, - 0x758: 68, - 0x759: 82, - 0x75A: 82, - 0x75B: 82, - 0x75C: 68, - 0x75D: 68, - 0x75E: 68, - 0x75F: 68, - 0x760: 68, - 0x761: 68, - 0x762: 68, - 0x763: 68, - 0x764: 68, - 0x765: 68, - 0x766: 68, - 0x767: 68, - 0x768: 68, - 0x769: 68, - 0x76A: 68, - 0x76B: 82, - 0x76C: 82, - 0x76D: 68, - 0x76E: 68, - 0x76F: 68, - 0x770: 68, - 0x771: 82, - 0x772: 68, - 0x773: 82, - 0x774: 82, - 0x775: 68, - 0x776: 68, - 0x777: 68, - 0x778: 82, - 0x779: 82, - 0x77A: 68, - 0x77B: 68, - 0x77C: 68, - 0x77D: 68, - 0x77E: 68, - 0x77F: 68, - 0x7A6: 84, - 0x7A7: 84, - 0x7A8: 84, - 0x7A9: 84, - 0x7AA: 84, - 0x7AB: 84, - 0x7AC: 84, - 0x7AD: 84, - 0x7AE: 84, - 0x7AF: 84, - 0x7B0: 84, - 0x7CA: 68, - 0x7CB: 68, - 0x7CC: 68, - 0x7CD: 68, - 0x7CE: 68, - 0x7CF: 68, - 0x7D0: 68, - 0x7D1: 68, - 0x7D2: 68, - 0x7D3: 68, - 0x7D4: 68, - 0x7D5: 68, - 0x7D6: 68, - 0x7D7: 68, - 0x7D8: 68, - 0x7D9: 68, - 0x7DA: 68, - 0x7DB: 68, - 0x7DC: 68, - 0x7DD: 68, - 0x7DE: 68, - 0x7DF: 68, - 0x7E0: 68, - 0x7E1: 68, - 0x7E2: 68, - 0x7E3: 68, - 0x7E4: 68, - 0x7E5: 68, - 0x7E6: 68, - 0x7E7: 68, - 0x7E8: 68, - 0x7E9: 68, - 0x7EA: 68, - 0x7EB: 84, - 0x7EC: 84, - 0x7ED: 84, - 0x7EE: 84, - 0x7EF: 84, - 0x7F0: 84, - 0x7F1: 84, - 0x7F2: 84, - 0x7F3: 84, - 0x7FA: 67, - 0x7FD: 84, - 0x816: 84, - 0x817: 84, - 0x818: 84, - 0x819: 84, - 0x81B: 84, - 0x81C: 84, - 0x81D: 84, - 0x81E: 84, - 0x81F: 84, - 0x820: 84, - 0x821: 84, - 0x822: 84, - 0x823: 84, - 0x825: 84, - 0x826: 84, - 0x827: 84, - 0x829: 84, - 0x82A: 84, - 0x82B: 84, - 0x82C: 84, - 0x82D: 84, - 0x840: 82, - 0x841: 68, - 0x842: 68, - 0x843: 68, - 0x844: 68, - 0x845: 68, - 0x846: 82, - 0x847: 82, - 0x848: 68, - 0x849: 82, - 0x84A: 68, - 0x84B: 68, - 0x84C: 68, - 0x84D: 68, - 0x84E: 68, - 0x84F: 68, - 0x850: 68, - 0x851: 68, - 0x852: 68, - 0x853: 68, - 0x854: 82, - 0x855: 68, - 0x856: 82, - 0x857: 82, - 0x858: 82, - 0x859: 84, - 0x85A: 84, - 0x85B: 84, - 0x860: 68, - 0x862: 68, - 0x863: 68, - 0x864: 68, - 0x865: 68, - 0x867: 82, - 0x868: 68, - 0x869: 82, - 0x86A: 82, - 0x870: 82, - 0x871: 82, - 0x872: 82, - 0x873: 82, - 0x874: 82, - 0x875: 82, - 0x876: 82, - 0x877: 82, - 0x878: 82, - 0x879: 82, - 0x87A: 82, - 0x87B: 82, - 0x87C: 82, - 0x87D: 82, - 0x87E: 82, - 0x87F: 82, - 0x880: 82, - 0x881: 82, - 0x882: 82, - 0x883: 67, - 0x884: 67, - 0x885: 67, - 0x886: 68, - 0x889: 68, - 0x88A: 68, - 0x88B: 68, - 0x88C: 68, - 0x88D: 68, - 0x88E: 82, - 0x898: 84, - 0x899: 84, - 0x89A: 84, - 0x89B: 84, - 0x89C: 84, - 0x89D: 84, - 0x89E: 84, - 0x89F: 84, - 0x8A0: 68, - 0x8A1: 68, - 0x8A2: 68, - 0x8A3: 68, - 0x8A4: 68, - 0x8A5: 68, - 0x8A6: 68, - 0x8A7: 68, - 0x8A8: 68, - 0x8A9: 68, - 0x8AA: 82, - 0x8AB: 82, - 0x8AC: 82, - 0x8AE: 82, - 0x8AF: 68, - 0x8B0: 68, - 0x8B1: 82, - 0x8B2: 82, - 0x8B3: 68, - 0x8B4: 68, - 0x8B5: 68, - 0x8B6: 68, - 0x8B7: 68, - 0x8B8: 68, - 0x8B9: 82, - 0x8BA: 68, - 0x8BB: 68, - 0x8BC: 68, - 0x8BD: 68, - 0x8BE: 68, - 0x8BF: 68, - 0x8C0: 68, - 0x8C1: 68, - 0x8C2: 68, - 0x8C3: 68, - 0x8C4: 68, - 0x8C5: 68, - 0x8C6: 68, - 0x8C7: 68, - 0x8C8: 68, - 0x8CA: 84, - 0x8CB: 84, - 0x8CC: 84, - 0x8CD: 84, - 0x8CE: 84, - 0x8CF: 84, - 0x8D0: 84, - 0x8D1: 84, - 0x8D2: 84, - 0x8D3: 84, - 0x8D4: 84, - 0x8D5: 84, - 0x8D6: 84, - 0x8D7: 84, - 0x8D8: 84, - 0x8D9: 84, - 0x8DA: 84, - 0x8DB: 84, - 0x8DC: 84, - 0x8DD: 84, - 0x8DE: 84, - 0x8DF: 84, - 0x8E0: 84, - 0x8E1: 84, - 0x8E3: 84, - 0x8E4: 84, - 0x8E5: 84, - 0x8E6: 84, - 0x8E7: 84, - 0x8E8: 84, - 0x8E9: 84, - 0x8EA: 84, - 0x8EB: 84, - 0x8EC: 84, - 0x8ED: 84, - 0x8EE: 84, - 0x8EF: 84, - 0x8F0: 84, - 0x8F1: 84, - 0x8F2: 84, - 0x8F3: 84, - 0x8F4: 84, - 0x8F5: 84, - 0x8F6: 84, - 0x8F7: 84, - 0x8F8: 84, - 0x8F9: 84, - 0x8FA: 84, - 0x8FB: 84, - 0x8FC: 84, - 0x8FD: 84, - 0x8FE: 84, - 0x8FF: 84, - 0x900: 84, - 0x901: 84, - 0x902: 84, - 0x93A: 84, - 0x93C: 84, - 0x941: 84, - 0x942: 84, - 0x943: 84, - 0x944: 84, - 0x945: 84, - 0x946: 84, - 0x947: 84, - 0x948: 84, - 0x94D: 84, - 0x951: 84, - 0x952: 84, - 0x953: 84, - 0x954: 84, - 0x955: 84, - 0x956: 84, - 0x957: 84, - 0x962: 84, - 0x963: 84, - 0x981: 84, - 0x9BC: 84, - 0x9C1: 84, - 0x9C2: 84, - 0x9C3: 84, - 0x9C4: 84, - 0x9CD: 84, - 0x9E2: 84, - 0x9E3: 84, - 0x9FE: 84, - 0xA01: 84, - 0xA02: 84, - 0xA3C: 84, - 0xA41: 84, - 0xA42: 84, - 0xA47: 84, - 0xA48: 84, - 0xA4B: 84, - 0xA4C: 84, - 0xA4D: 84, - 0xA51: 84, - 0xA70: 84, - 0xA71: 84, - 0xA75: 84, - 0xA81: 84, - 0xA82: 84, - 0xABC: 84, - 0xAC1: 84, - 0xAC2: 84, - 0xAC3: 84, - 0xAC4: 84, - 0xAC5: 84, - 0xAC7: 84, - 0xAC8: 84, - 0xACD: 84, - 0xAE2: 84, - 0xAE3: 84, - 0xAFA: 84, - 0xAFB: 84, - 0xAFC: 84, - 0xAFD: 84, - 0xAFE: 84, - 0xAFF: 84, - 0xB01: 84, - 0xB3C: 84, - 0xB3F: 84, - 0xB41: 84, - 0xB42: 84, - 0xB43: 84, - 0xB44: 84, - 0xB4D: 84, - 0xB55: 84, - 0xB56: 84, - 0xB62: 84, - 0xB63: 84, - 0xB82: 84, - 0xBC0: 84, - 0xBCD: 84, - 0xC00: 84, - 0xC04: 84, - 0xC3C: 84, - 0xC3E: 84, - 0xC3F: 84, - 0xC40: 84, - 0xC46: 84, - 0xC47: 84, - 0xC48: 84, - 0xC4A: 84, - 0xC4B: 84, - 0xC4C: 84, - 0xC4D: 84, - 0xC55: 84, - 0xC56: 84, - 0xC62: 84, - 0xC63: 84, - 0xC81: 84, - 0xCBC: 84, - 0xCBF: 84, - 0xCC6: 84, - 0xCCC: 84, - 0xCCD: 84, - 0xCE2: 84, - 0xCE3: 84, - 0xD00: 84, - 0xD01: 84, - 0xD3B: 84, - 0xD3C: 84, - 0xD41: 84, - 0xD42: 84, - 0xD43: 84, - 0xD44: 84, - 0xD4D: 84, - 0xD62: 84, - 0xD63: 84, - 0xD81: 84, - 0xDCA: 84, - 0xDD2: 84, - 0xDD3: 84, - 0xDD4: 84, - 0xDD6: 84, - 0xE31: 84, - 0xE34: 84, - 0xE35: 84, - 0xE36: 84, - 0xE37: 84, - 0xE38: 84, - 0xE39: 84, - 0xE3A: 84, - 0xE47: 84, - 0xE48: 84, - 0xE49: 84, - 0xE4A: 84, - 0xE4B: 84, - 0xE4C: 84, - 0xE4D: 84, - 0xE4E: 84, - 0xEB1: 84, - 0xEB4: 84, - 0xEB5: 84, - 0xEB6: 84, - 0xEB7: 84, - 0xEB8: 84, - 0xEB9: 84, - 0xEBA: 84, - 0xEBB: 84, - 0xEBC: 84, - 0xEC8: 84, - 0xEC9: 84, - 0xECA: 84, - 0xECB: 84, - 0xECC: 84, - 0xECD: 84, - 0xECE: 84, - 0xF18: 84, - 0xF19: 84, - 0xF35: 84, - 0xF37: 84, - 0xF39: 84, - 0xF71: 84, - 0xF72: 84, - 0xF73: 84, - 0xF74: 84, - 0xF75: 84, - 0xF76: 84, - 0xF77: 84, - 0xF78: 84, - 0xF79: 84, - 0xF7A: 84, - 0xF7B: 84, - 0xF7C: 84, - 0xF7D: 84, - 0xF7E: 84, - 0xF80: 84, - 0xF81: 84, - 0xF82: 84, - 0xF83: 84, - 0xF84: 84, - 0xF86: 84, - 0xF87: 84, - 0xF8D: 84, - 0xF8E: 84, - 0xF8F: 84, - 0xF90: 84, - 0xF91: 84, - 0xF92: 84, - 0xF93: 84, - 0xF94: 84, - 0xF95: 84, - 0xF96: 84, - 0xF97: 84, - 0xF99: 84, - 0xF9A: 84, - 0xF9B: 84, - 0xF9C: 84, - 0xF9D: 84, - 0xF9E: 84, - 0xF9F: 84, - 0xFA0: 84, - 0xFA1: 84, - 0xFA2: 84, - 0xFA3: 84, - 0xFA4: 84, - 0xFA5: 84, - 0xFA6: 84, - 0xFA7: 84, - 0xFA8: 84, - 0xFA9: 84, - 0xFAA: 84, - 0xFAB: 84, - 0xFAC: 84, - 0xFAD: 84, - 0xFAE: 84, - 0xFAF: 84, - 0xFB0: 84, - 0xFB1: 84, - 0xFB2: 84, - 0xFB3: 84, - 0xFB4: 84, - 0xFB5: 84, - 0xFB6: 84, - 0xFB7: 84, - 0xFB8: 84, - 0xFB9: 84, - 0xFBA: 84, - 0xFBB: 84, - 0xFBC: 84, - 0xFC6: 84, - 0x102D: 84, - 0x102E: 84, - 0x102F: 84, - 0x1030: 84, - 0x1032: 84, - 0x1033: 84, - 0x1034: 84, - 0x1035: 84, - 0x1036: 84, - 0x1037: 84, - 0x1039: 84, - 0x103A: 84, - 0x103D: 84, - 0x103E: 84, - 0x1058: 84, - 0x1059: 84, - 0x105E: 84, - 0x105F: 84, - 0x1060: 84, - 0x1071: 84, - 0x1072: 84, - 0x1073: 84, - 0x1074: 84, - 0x1082: 84, - 0x1085: 84, - 0x1086: 84, - 0x108D: 84, - 0x109D: 84, - 0x135D: 84, - 0x135E: 84, - 0x135F: 84, - 0x1712: 84, - 0x1713: 84, - 0x1714: 84, - 0x1732: 84, - 0x1733: 84, - 0x1752: 84, - 0x1753: 84, - 0x1772: 84, - 0x1773: 84, - 0x17B4: 84, - 0x17B5: 84, - 0x17B7: 84, - 0x17B8: 84, - 0x17B9: 84, - 0x17BA: 84, - 0x17BB: 84, - 0x17BC: 84, - 0x17BD: 84, - 0x17C6: 84, - 0x17C9: 84, - 0x17CA: 84, - 0x17CB: 84, - 0x17CC: 84, - 0x17CD: 84, - 0x17CE: 84, - 0x17CF: 84, - 0x17D0: 84, - 0x17D1: 84, - 0x17D2: 84, - 0x17D3: 84, - 0x17DD: 84, - 0x1807: 68, - 0x180A: 67, - 0x180B: 84, - 0x180C: 84, - 0x180D: 84, - 0x180F: 84, - 0x1820: 68, - 0x1821: 68, - 0x1822: 68, - 0x1823: 68, - 0x1824: 68, - 0x1825: 68, - 0x1826: 68, - 0x1827: 68, - 0x1828: 68, - 0x1829: 68, - 0x182A: 68, - 0x182B: 68, - 0x182C: 68, - 0x182D: 68, - 0x182E: 68, - 0x182F: 68, - 0x1830: 68, - 0x1831: 68, - 0x1832: 68, - 0x1833: 68, - 0x1834: 68, - 0x1835: 68, - 0x1836: 68, - 0x1837: 68, - 0x1838: 68, - 0x1839: 68, - 0x183A: 68, - 0x183B: 68, - 0x183C: 68, - 0x183D: 68, - 0x183E: 68, - 0x183F: 68, - 0x1840: 68, - 0x1841: 68, - 0x1842: 68, - 0x1843: 68, - 0x1844: 68, - 0x1845: 68, - 0x1846: 68, - 0x1847: 68, - 0x1848: 68, - 0x1849: 68, - 0x184A: 68, - 0x184B: 68, - 0x184C: 68, - 0x184D: 68, - 0x184E: 68, - 0x184F: 68, - 0x1850: 68, - 0x1851: 68, - 0x1852: 68, - 0x1853: 68, - 0x1854: 68, - 0x1855: 68, - 0x1856: 68, - 0x1857: 68, - 0x1858: 68, - 0x1859: 68, - 0x185A: 68, - 0x185B: 68, - 0x185C: 68, - 0x185D: 68, - 0x185E: 68, - 0x185F: 68, - 0x1860: 68, - 0x1861: 68, - 0x1862: 68, - 0x1863: 68, - 0x1864: 68, - 0x1865: 68, - 0x1866: 68, - 0x1867: 68, - 0x1868: 68, - 0x1869: 68, - 0x186A: 68, - 0x186B: 68, - 0x186C: 68, - 0x186D: 68, - 0x186E: 68, - 0x186F: 68, - 0x1870: 68, - 0x1871: 68, - 0x1872: 68, - 0x1873: 68, - 0x1874: 68, - 0x1875: 68, - 0x1876: 68, - 0x1877: 68, - 0x1878: 68, - 0x1885: 84, - 0x1886: 84, - 0x1887: 68, - 0x1888: 68, - 0x1889: 68, - 0x188A: 68, - 0x188B: 68, - 0x188C: 68, - 0x188D: 68, - 0x188E: 68, - 0x188F: 68, - 0x1890: 68, - 0x1891: 68, - 0x1892: 68, - 0x1893: 68, - 0x1894: 68, - 0x1895: 68, - 0x1896: 68, - 0x1897: 68, - 0x1898: 68, - 0x1899: 68, - 0x189A: 68, - 0x189B: 68, - 0x189C: 68, - 0x189D: 68, - 0x189E: 68, - 0x189F: 68, - 0x18A0: 68, - 0x18A1: 68, - 0x18A2: 68, - 0x18A3: 68, - 0x18A4: 68, - 0x18A5: 68, - 0x18A6: 68, - 0x18A7: 68, - 0x18A8: 68, - 0x18A9: 84, - 0x18AA: 68, - 0x1920: 84, - 0x1921: 84, - 0x1922: 84, - 0x1927: 84, - 0x1928: 84, - 0x1932: 84, - 0x1939: 84, - 0x193A: 84, - 0x193B: 84, - 0x1A17: 84, - 0x1A18: 84, - 0x1A1B: 84, - 0x1A56: 84, - 0x1A58: 84, - 0x1A59: 84, - 0x1A5A: 84, - 0x1A5B: 84, - 0x1A5C: 84, - 0x1A5D: 84, - 0x1A5E: 84, - 0x1A60: 84, - 0x1A62: 84, - 0x1A65: 84, - 0x1A66: 84, - 0x1A67: 84, - 0x1A68: 84, - 0x1A69: 84, - 0x1A6A: 84, - 0x1A6B: 84, - 0x1A6C: 84, - 0x1A73: 84, - 0x1A74: 84, - 0x1A75: 84, - 0x1A76: 84, - 0x1A77: 84, - 0x1A78: 84, - 0x1A79: 84, - 0x1A7A: 84, - 0x1A7B: 84, - 0x1A7C: 84, - 0x1A7F: 84, - 0x1AB0: 84, - 0x1AB1: 84, - 0x1AB2: 84, - 0x1AB3: 84, - 0x1AB4: 84, - 0x1AB5: 84, - 0x1AB6: 84, - 0x1AB7: 84, - 0x1AB8: 84, - 0x1AB9: 84, - 0x1ABA: 84, - 0x1ABB: 84, - 0x1ABC: 84, - 0x1ABD: 84, - 0x1ABE: 84, - 0x1ABF: 84, - 0x1AC0: 84, - 0x1AC1: 84, - 0x1AC2: 84, - 0x1AC3: 84, - 0x1AC4: 84, - 0x1AC5: 84, - 0x1AC6: 84, - 0x1AC7: 84, - 0x1AC8: 84, - 0x1AC9: 84, - 0x1ACA: 84, - 0x1ACB: 84, - 0x1ACC: 84, - 0x1ACD: 84, - 0x1ACE: 84, - 0x1B00: 84, - 0x1B01: 84, - 0x1B02: 84, - 0x1B03: 84, - 0x1B34: 84, - 0x1B36: 84, - 0x1B37: 84, - 0x1B38: 84, - 0x1B39: 84, - 0x1B3A: 84, - 0x1B3C: 84, - 0x1B42: 84, - 0x1B6B: 84, - 0x1B6C: 84, - 0x1B6D: 84, - 0x1B6E: 84, - 0x1B6F: 84, - 0x1B70: 84, - 0x1B71: 84, - 0x1B72: 84, - 0x1B73: 84, - 0x1B80: 84, - 0x1B81: 84, - 0x1BA2: 84, - 0x1BA3: 84, - 0x1BA4: 84, - 0x1BA5: 84, - 0x1BA8: 84, - 0x1BA9: 84, - 0x1BAB: 84, - 0x1BAC: 84, - 0x1BAD: 84, - 0x1BE6: 84, - 0x1BE8: 84, - 0x1BE9: 84, - 0x1BED: 84, - 0x1BEF: 84, - 0x1BF0: 84, - 0x1BF1: 84, - 0x1C2C: 84, - 0x1C2D: 84, - 0x1C2E: 84, - 0x1C2F: 84, - 0x1C30: 84, - 0x1C31: 84, - 0x1C32: 84, - 0x1C33: 84, - 0x1C36: 84, - 0x1C37: 84, - 0x1CD0: 84, - 0x1CD1: 84, - 0x1CD2: 84, - 0x1CD4: 84, - 0x1CD5: 84, - 0x1CD6: 84, - 0x1CD7: 84, - 0x1CD8: 84, - 0x1CD9: 84, - 0x1CDA: 84, - 0x1CDB: 84, - 0x1CDC: 84, - 0x1CDD: 84, - 0x1CDE: 84, - 0x1CDF: 84, - 0x1CE0: 84, - 0x1CE2: 84, - 0x1CE3: 84, - 0x1CE4: 84, - 0x1CE5: 84, - 0x1CE6: 84, - 0x1CE7: 84, - 0x1CE8: 84, - 0x1CED: 84, - 0x1CF4: 84, - 0x1CF8: 84, - 0x1CF9: 84, - 0x1DC0: 84, - 0x1DC1: 84, - 0x1DC2: 84, - 0x1DC3: 84, - 0x1DC4: 84, - 0x1DC5: 84, - 0x1DC6: 84, - 0x1DC7: 84, - 0x1DC8: 84, - 0x1DC9: 84, - 0x1DCA: 84, - 0x1DCB: 84, - 0x1DCC: 84, - 0x1DCD: 84, - 0x1DCE: 84, - 0x1DCF: 84, - 0x1DD0: 84, - 0x1DD1: 84, - 0x1DD2: 84, - 0x1DD3: 84, - 0x1DD4: 84, - 0x1DD5: 84, - 0x1DD6: 84, - 0x1DD7: 84, - 0x1DD8: 84, - 0x1DD9: 84, - 0x1DDA: 84, - 0x1DDB: 84, - 0x1DDC: 84, - 0x1DDD: 84, - 0x1DDE: 84, - 0x1DDF: 84, - 0x1DE0: 84, - 0x1DE1: 84, - 0x1DE2: 84, - 0x1DE3: 84, - 0x1DE4: 84, - 0x1DE5: 84, - 0x1DE6: 84, - 0x1DE7: 84, - 0x1DE8: 84, - 0x1DE9: 84, - 0x1DEA: 84, - 0x1DEB: 84, - 0x1DEC: 84, - 0x1DED: 84, - 0x1DEE: 84, - 0x1DEF: 84, - 0x1DF0: 84, - 0x1DF1: 84, - 0x1DF2: 84, - 0x1DF3: 84, - 0x1DF4: 84, - 0x1DF5: 84, - 0x1DF6: 84, - 0x1DF7: 84, - 0x1DF8: 84, - 0x1DF9: 84, - 0x1DFA: 84, - 0x1DFB: 84, - 0x1DFC: 84, - 0x1DFD: 84, - 0x1DFE: 84, - 0x1DFF: 84, - 0x200B: 84, - 0x200D: 67, - 0x200E: 84, - 0x200F: 84, - 0x202A: 84, - 0x202B: 84, - 0x202C: 84, - 0x202D: 84, - 0x202E: 84, - 0x2060: 84, - 0x2061: 84, - 0x2062: 84, - 0x2063: 84, - 0x2064: 84, - 0x206A: 84, - 0x206B: 84, - 0x206C: 84, - 0x206D: 84, - 0x206E: 84, - 0x206F: 84, - 0x20D0: 84, - 0x20D1: 84, - 0x20D2: 84, - 0x20D3: 84, - 0x20D4: 84, - 0x20D5: 84, - 0x20D6: 84, - 0x20D7: 84, - 0x20D8: 84, - 0x20D9: 84, - 0x20DA: 84, - 0x20DB: 84, - 0x20DC: 84, - 0x20DD: 84, - 0x20DE: 84, - 0x20DF: 84, - 0x20E0: 84, - 0x20E1: 84, - 0x20E2: 84, - 0x20E3: 84, - 0x20E4: 84, - 0x20E5: 84, - 0x20E6: 84, - 0x20E7: 84, - 0x20E8: 84, - 0x20E9: 84, - 0x20EA: 84, - 0x20EB: 84, - 0x20EC: 84, - 0x20ED: 84, - 0x20EE: 84, - 0x20EF: 84, - 0x20F0: 84, - 0x2CEF: 84, - 0x2CF0: 84, - 0x2CF1: 84, - 0x2D7F: 84, - 0x2DE0: 84, - 0x2DE1: 84, - 0x2DE2: 84, - 0x2DE3: 84, - 0x2DE4: 84, - 0x2DE5: 84, - 0x2DE6: 84, - 0x2DE7: 84, - 0x2DE8: 84, - 0x2DE9: 84, - 0x2DEA: 84, - 0x2DEB: 84, - 0x2DEC: 84, - 0x2DED: 84, - 0x2DEE: 84, - 0x2DEF: 84, - 0x2DF0: 84, - 0x2DF1: 84, - 0x2DF2: 84, - 0x2DF3: 84, - 0x2DF4: 84, - 0x2DF5: 84, - 0x2DF6: 84, - 0x2DF7: 84, - 0x2DF8: 84, - 0x2DF9: 84, - 0x2DFA: 84, - 0x2DFB: 84, - 0x2DFC: 84, - 0x2DFD: 84, - 0x2DFE: 84, - 0x2DFF: 84, - 0x302A: 84, - 0x302B: 84, - 0x302C: 84, - 0x302D: 84, - 0x3099: 84, - 0x309A: 84, - 0xA66F: 84, - 0xA670: 84, - 0xA671: 84, - 0xA672: 84, - 0xA674: 84, - 0xA675: 84, - 0xA676: 84, - 0xA677: 84, - 0xA678: 84, - 0xA679: 84, - 0xA67A: 84, - 0xA67B: 84, - 0xA67C: 84, - 0xA67D: 84, - 0xA69E: 84, - 0xA69F: 84, - 0xA6F0: 84, - 0xA6F1: 84, - 0xA802: 84, - 0xA806: 84, - 0xA80B: 84, - 0xA825: 84, - 0xA826: 84, - 0xA82C: 84, - 0xA840: 68, - 0xA841: 68, - 0xA842: 68, - 0xA843: 68, - 0xA844: 68, - 0xA845: 68, - 0xA846: 68, - 0xA847: 68, - 0xA848: 68, - 0xA849: 68, - 0xA84A: 68, - 0xA84B: 68, - 0xA84C: 68, - 0xA84D: 68, - 0xA84E: 68, - 0xA84F: 68, - 0xA850: 68, - 0xA851: 68, - 0xA852: 68, - 0xA853: 68, - 0xA854: 68, - 0xA855: 68, - 0xA856: 68, - 0xA857: 68, - 0xA858: 68, - 0xA859: 68, - 0xA85A: 68, - 0xA85B: 68, - 0xA85C: 68, - 0xA85D: 68, - 0xA85E: 68, - 0xA85F: 68, - 0xA860: 68, - 0xA861: 68, - 0xA862: 68, - 0xA863: 68, - 0xA864: 68, - 0xA865: 68, - 0xA866: 68, - 0xA867: 68, - 0xA868: 68, - 0xA869: 68, - 0xA86A: 68, - 0xA86B: 68, - 0xA86C: 68, - 0xA86D: 68, - 0xA86E: 68, - 0xA86F: 68, - 0xA870: 68, - 0xA871: 68, - 0xA872: 76, - 0xA8C4: 84, - 0xA8C5: 84, - 0xA8E0: 84, - 0xA8E1: 84, - 0xA8E2: 84, - 0xA8E3: 84, - 0xA8E4: 84, - 0xA8E5: 84, - 0xA8E6: 84, - 0xA8E7: 84, - 0xA8E8: 84, - 0xA8E9: 84, - 0xA8EA: 84, - 0xA8EB: 84, - 0xA8EC: 84, - 0xA8ED: 84, - 0xA8EE: 84, - 0xA8EF: 84, - 0xA8F0: 84, - 0xA8F1: 84, - 0xA8FF: 84, - 0xA926: 84, - 0xA927: 84, - 0xA928: 84, - 0xA929: 84, - 0xA92A: 84, - 0xA92B: 84, - 0xA92C: 84, - 0xA92D: 84, - 0xA947: 84, - 0xA948: 84, - 0xA949: 84, - 0xA94A: 84, - 0xA94B: 84, - 0xA94C: 84, - 0xA94D: 84, - 0xA94E: 84, - 0xA94F: 84, - 0xA950: 84, - 0xA951: 84, - 0xA980: 84, - 0xA981: 84, - 0xA982: 84, - 0xA9B3: 84, - 0xA9B6: 84, - 0xA9B7: 84, - 0xA9B8: 84, - 0xA9B9: 84, - 0xA9BC: 84, - 0xA9BD: 84, - 0xA9E5: 84, - 0xAA29: 84, - 0xAA2A: 84, - 0xAA2B: 84, - 0xAA2C: 84, - 0xAA2D: 84, - 0xAA2E: 84, - 0xAA31: 84, - 0xAA32: 84, - 0xAA35: 84, - 0xAA36: 84, - 0xAA43: 84, - 0xAA4C: 84, - 0xAA7C: 84, - 0xAAB0: 84, - 0xAAB2: 84, - 0xAAB3: 84, - 0xAAB4: 84, - 0xAAB7: 84, - 0xAAB8: 84, - 0xAABE: 84, - 0xAABF: 84, - 0xAAC1: 84, - 0xAAEC: 84, - 0xAAED: 84, - 0xAAF6: 84, - 0xABE5: 84, - 0xABE8: 84, - 0xABED: 84, - 0xFB1E: 84, - 0xFE00: 84, - 0xFE01: 84, - 0xFE02: 84, - 0xFE03: 84, - 0xFE04: 84, - 0xFE05: 84, - 0xFE06: 84, - 0xFE07: 84, - 0xFE08: 84, - 0xFE09: 84, - 0xFE0A: 84, - 0xFE0B: 84, - 0xFE0C: 84, - 0xFE0D: 84, - 0xFE0E: 84, - 0xFE0F: 84, - 0xFE20: 84, - 0xFE21: 84, - 0xFE22: 84, - 0xFE23: 84, - 0xFE24: 84, - 0xFE25: 84, - 0xFE26: 84, - 0xFE27: 84, - 0xFE28: 84, - 0xFE29: 84, - 0xFE2A: 84, - 0xFE2B: 84, - 0xFE2C: 84, - 0xFE2D: 84, - 0xFE2E: 84, - 0xFE2F: 84, - 0xFEFF: 84, - 0xFFF9: 84, - 0xFFFA: 84, - 0xFFFB: 84, - 0x101FD: 84, - 0x102E0: 84, - 0x10376: 84, - 0x10377: 84, - 0x10378: 84, - 0x10379: 84, - 0x1037A: 84, - 0x10A01: 84, - 0x10A02: 84, - 0x10A03: 84, - 0x10A05: 84, - 0x10A06: 84, - 0x10A0C: 84, - 0x10A0D: 84, - 0x10A0E: 84, - 0x10A0F: 84, - 0x10A38: 84, - 0x10A39: 84, - 0x10A3A: 84, - 0x10A3F: 84, - 0x10AC0: 68, - 0x10AC1: 68, - 0x10AC2: 68, - 0x10AC3: 68, - 0x10AC4: 68, - 0x10AC5: 82, - 0x10AC7: 82, - 0x10AC9: 82, - 0x10ACA: 82, - 0x10ACD: 76, - 0x10ACE: 82, - 0x10ACF: 82, - 0x10AD0: 82, - 0x10AD1: 82, - 0x10AD2: 82, - 0x10AD3: 68, - 0x10AD4: 68, - 0x10AD5: 68, - 0x10AD6: 68, - 0x10AD7: 76, - 0x10AD8: 68, - 0x10AD9: 68, - 0x10ADA: 68, - 0x10ADB: 68, - 0x10ADC: 68, - 0x10ADD: 82, - 0x10ADE: 68, - 0x10ADF: 68, - 0x10AE0: 68, - 0x10AE1: 82, - 0x10AE4: 82, - 0x10AE5: 84, - 0x10AE6: 84, - 0x10AEB: 68, - 0x10AEC: 68, - 0x10AED: 68, - 0x10AEE: 68, - 0x10AEF: 82, - 0x10B80: 68, - 0x10B81: 82, - 0x10B82: 68, - 0x10B83: 82, - 0x10B84: 82, - 0x10B85: 82, - 0x10B86: 68, - 0x10B87: 68, - 0x10B88: 68, - 0x10B89: 82, - 0x10B8A: 68, - 0x10B8B: 68, - 0x10B8C: 82, - 0x10B8D: 68, - 0x10B8E: 82, - 0x10B8F: 82, - 0x10B90: 68, - 0x10B91: 82, - 0x10BA9: 82, - 0x10BAA: 82, - 0x10BAB: 82, - 0x10BAC: 82, - 0x10BAD: 68, - 0x10BAE: 68, - 0x10D00: 76, - 0x10D01: 68, - 0x10D02: 68, - 0x10D03: 68, - 0x10D04: 68, - 0x10D05: 68, - 0x10D06: 68, - 0x10D07: 68, - 0x10D08: 68, - 0x10D09: 68, - 0x10D0A: 68, - 0x10D0B: 68, - 0x10D0C: 68, - 0x10D0D: 68, - 0x10D0E: 68, - 0x10D0F: 68, - 0x10D10: 68, - 0x10D11: 68, - 0x10D12: 68, - 0x10D13: 68, - 0x10D14: 68, - 0x10D15: 68, - 0x10D16: 68, - 0x10D17: 68, - 0x10D18: 68, - 0x10D19: 68, - 0x10D1A: 68, - 0x10D1B: 68, - 0x10D1C: 68, - 0x10D1D: 68, - 0x10D1E: 68, - 0x10D1F: 68, - 0x10D20: 68, - 0x10D21: 68, - 0x10D22: 82, - 0x10D23: 68, - 0x10D24: 84, - 0x10D25: 84, - 0x10D26: 84, - 0x10D27: 84, - 0x10EAB: 84, - 0x10EAC: 84, - 0x10EFD: 84, - 0x10EFE: 84, - 0x10EFF: 84, - 0x10F30: 68, - 0x10F31: 68, - 0x10F32: 68, - 0x10F33: 82, - 0x10F34: 68, - 0x10F35: 68, - 0x10F36: 68, - 0x10F37: 68, - 0x10F38: 68, - 0x10F39: 68, - 0x10F3A: 68, - 0x10F3B: 68, - 0x10F3C: 68, - 0x10F3D: 68, - 0x10F3E: 68, - 0x10F3F: 68, - 0x10F40: 68, - 0x10F41: 68, - 0x10F42: 68, - 0x10F43: 68, - 0x10F44: 68, - 0x10F46: 84, - 0x10F47: 84, - 0x10F48: 84, - 0x10F49: 84, - 0x10F4A: 84, - 0x10F4B: 84, - 0x10F4C: 84, - 0x10F4D: 84, - 0x10F4E: 84, - 0x10F4F: 84, - 0x10F50: 84, - 0x10F51: 68, - 0x10F52: 68, - 0x10F53: 68, - 0x10F54: 82, - 0x10F70: 68, - 0x10F71: 68, - 0x10F72: 68, - 0x10F73: 68, - 0x10F74: 82, - 0x10F75: 82, - 0x10F76: 68, - 0x10F77: 68, - 0x10F78: 68, - 0x10F79: 68, - 0x10F7A: 68, - 0x10F7B: 68, - 0x10F7C: 68, - 0x10F7D: 68, - 0x10F7E: 68, - 0x10F7F: 68, - 0x10F80: 68, - 0x10F81: 68, - 0x10F82: 84, - 0x10F83: 84, - 0x10F84: 84, - 0x10F85: 84, - 0x10FB0: 68, - 0x10FB2: 68, - 0x10FB3: 68, - 0x10FB4: 82, - 0x10FB5: 82, - 0x10FB6: 82, - 0x10FB8: 68, - 0x10FB9: 82, - 0x10FBA: 82, - 0x10FBB: 68, - 0x10FBC: 68, - 0x10FBD: 82, - 0x10FBE: 68, - 0x10FBF: 68, - 0x10FC1: 68, - 0x10FC2: 82, - 0x10FC3: 82, - 0x10FC4: 68, - 0x10FC9: 82, - 0x10FCA: 68, - 0x10FCB: 76, - 0x11001: 84, - 0x11038: 84, - 0x11039: 84, - 0x1103A: 84, - 0x1103B: 84, - 0x1103C: 84, - 0x1103D: 84, - 0x1103E: 84, - 0x1103F: 84, - 0x11040: 84, - 0x11041: 84, - 0x11042: 84, - 0x11043: 84, - 0x11044: 84, - 0x11045: 84, - 0x11046: 84, - 0x11070: 84, - 0x11073: 84, - 0x11074: 84, - 0x1107F: 84, - 0x11080: 84, - 0x11081: 84, - 0x110B3: 84, - 0x110B4: 84, - 0x110B5: 84, - 0x110B6: 84, - 0x110B9: 84, - 0x110BA: 84, - 0x110C2: 84, - 0x11100: 84, - 0x11101: 84, - 0x11102: 84, - 0x11127: 84, - 0x11128: 84, - 0x11129: 84, - 0x1112A: 84, - 0x1112B: 84, - 0x1112D: 84, - 0x1112E: 84, - 0x1112F: 84, - 0x11130: 84, - 0x11131: 84, - 0x11132: 84, - 0x11133: 84, - 0x11134: 84, - 0x11173: 84, - 0x11180: 84, - 0x11181: 84, - 0x111B6: 84, - 0x111B7: 84, - 0x111B8: 84, - 0x111B9: 84, - 0x111BA: 84, - 0x111BB: 84, - 0x111BC: 84, - 0x111BD: 84, - 0x111BE: 84, - 0x111C9: 84, - 0x111CA: 84, - 0x111CB: 84, - 0x111CC: 84, - 0x111CF: 84, - 0x1122F: 84, - 0x11230: 84, - 0x11231: 84, - 0x11234: 84, - 0x11236: 84, - 0x11237: 84, - 0x1123E: 84, - 0x11241: 84, - 0x112DF: 84, - 0x112E3: 84, - 0x112E4: 84, - 0x112E5: 84, - 0x112E6: 84, - 0x112E7: 84, - 0x112E8: 84, - 0x112E9: 84, - 0x112EA: 84, - 0x11300: 84, - 0x11301: 84, - 0x1133B: 84, - 0x1133C: 84, - 0x11340: 84, - 0x11366: 84, - 0x11367: 84, - 0x11368: 84, - 0x11369: 84, - 0x1136A: 84, - 0x1136B: 84, - 0x1136C: 84, - 0x11370: 84, - 0x11371: 84, - 0x11372: 84, - 0x11373: 84, - 0x11374: 84, - 0x11438: 84, - 0x11439: 84, - 0x1143A: 84, - 0x1143B: 84, - 0x1143C: 84, - 0x1143D: 84, - 0x1143E: 84, - 0x1143F: 84, - 0x11442: 84, - 0x11443: 84, - 0x11444: 84, - 0x11446: 84, - 0x1145E: 84, - 0x114B3: 84, - 0x114B4: 84, - 0x114B5: 84, - 0x114B6: 84, - 0x114B7: 84, - 0x114B8: 84, - 0x114BA: 84, - 0x114BF: 84, - 0x114C0: 84, - 0x114C2: 84, - 0x114C3: 84, - 0x115B2: 84, - 0x115B3: 84, - 0x115B4: 84, - 0x115B5: 84, - 0x115BC: 84, - 0x115BD: 84, - 0x115BF: 84, - 0x115C0: 84, - 0x115DC: 84, - 0x115DD: 84, - 0x11633: 84, - 0x11634: 84, - 0x11635: 84, - 0x11636: 84, - 0x11637: 84, - 0x11638: 84, - 0x11639: 84, - 0x1163A: 84, - 0x1163D: 84, - 0x1163F: 84, - 0x11640: 84, - 0x116AB: 84, - 0x116AD: 84, - 0x116B0: 84, - 0x116B1: 84, - 0x116B2: 84, - 0x116B3: 84, - 0x116B4: 84, - 0x116B5: 84, - 0x116B7: 84, - 0x1171D: 84, - 0x1171E: 84, - 0x1171F: 84, - 0x11722: 84, - 0x11723: 84, - 0x11724: 84, - 0x11725: 84, - 0x11727: 84, - 0x11728: 84, - 0x11729: 84, - 0x1172A: 84, - 0x1172B: 84, - 0x1182F: 84, - 0x11830: 84, - 0x11831: 84, - 0x11832: 84, - 0x11833: 84, - 0x11834: 84, - 0x11835: 84, - 0x11836: 84, - 0x11837: 84, - 0x11839: 84, - 0x1183A: 84, - 0x1193B: 84, - 0x1193C: 84, - 0x1193E: 84, - 0x11943: 84, - 0x119D4: 84, - 0x119D5: 84, - 0x119D6: 84, - 0x119D7: 84, - 0x119DA: 84, - 0x119DB: 84, - 0x119E0: 84, - 0x11A01: 84, - 0x11A02: 84, - 0x11A03: 84, - 0x11A04: 84, - 0x11A05: 84, - 0x11A06: 84, - 0x11A07: 84, - 0x11A08: 84, - 0x11A09: 84, - 0x11A0A: 84, - 0x11A33: 84, - 0x11A34: 84, - 0x11A35: 84, - 0x11A36: 84, - 0x11A37: 84, - 0x11A38: 84, - 0x11A3B: 84, - 0x11A3C: 84, - 0x11A3D: 84, - 0x11A3E: 84, - 0x11A47: 84, - 0x11A51: 84, - 0x11A52: 84, - 0x11A53: 84, - 0x11A54: 84, - 0x11A55: 84, - 0x11A56: 84, - 0x11A59: 84, - 0x11A5A: 84, - 0x11A5B: 84, - 0x11A8A: 84, - 0x11A8B: 84, - 0x11A8C: 84, - 0x11A8D: 84, - 0x11A8E: 84, - 0x11A8F: 84, - 0x11A90: 84, - 0x11A91: 84, - 0x11A92: 84, - 0x11A93: 84, - 0x11A94: 84, - 0x11A95: 84, - 0x11A96: 84, - 0x11A98: 84, - 0x11A99: 84, - 0x11C30: 84, - 0x11C31: 84, - 0x11C32: 84, - 0x11C33: 84, - 0x11C34: 84, - 0x11C35: 84, - 0x11C36: 84, - 0x11C38: 84, - 0x11C39: 84, - 0x11C3A: 84, - 0x11C3B: 84, - 0x11C3C: 84, - 0x11C3D: 84, - 0x11C3F: 84, - 0x11C92: 84, - 0x11C93: 84, - 0x11C94: 84, - 0x11C95: 84, - 0x11C96: 84, - 0x11C97: 84, - 0x11C98: 84, - 0x11C99: 84, - 0x11C9A: 84, - 0x11C9B: 84, - 0x11C9C: 84, - 0x11C9D: 84, - 0x11C9E: 84, - 0x11C9F: 84, - 0x11CA0: 84, - 0x11CA1: 84, - 0x11CA2: 84, - 0x11CA3: 84, - 0x11CA4: 84, - 0x11CA5: 84, - 0x11CA6: 84, - 0x11CA7: 84, - 0x11CAA: 84, - 0x11CAB: 84, - 0x11CAC: 84, - 0x11CAD: 84, - 0x11CAE: 84, - 0x11CAF: 84, - 0x11CB0: 84, - 0x11CB2: 84, - 0x11CB3: 84, - 0x11CB5: 84, - 0x11CB6: 84, - 0x11D31: 84, - 0x11D32: 84, - 0x11D33: 84, - 0x11D34: 84, - 0x11D35: 84, - 0x11D36: 84, - 0x11D3A: 84, - 0x11D3C: 84, - 0x11D3D: 84, - 0x11D3F: 84, - 0x11D40: 84, - 0x11D41: 84, - 0x11D42: 84, - 0x11D43: 84, - 0x11D44: 84, - 0x11D45: 84, - 0x11D47: 84, - 0x11D90: 84, - 0x11D91: 84, - 0x11D95: 84, - 0x11D97: 84, - 0x11EF3: 84, - 0x11EF4: 84, - 0x11F00: 84, - 0x11F01: 84, - 0x11F36: 84, - 0x11F37: 84, - 0x11F38: 84, - 0x11F39: 84, - 0x11F3A: 84, - 0x11F40: 84, - 0x11F42: 84, - 0x13430: 84, - 0x13431: 84, - 0x13432: 84, - 0x13433: 84, - 0x13434: 84, - 0x13435: 84, - 0x13436: 84, - 0x13437: 84, - 0x13438: 84, - 0x13439: 84, - 0x1343A: 84, - 0x1343B: 84, - 0x1343C: 84, - 0x1343D: 84, - 0x1343E: 84, - 0x1343F: 84, - 0x13440: 84, - 0x13447: 84, - 0x13448: 84, - 0x13449: 84, - 0x1344A: 84, - 0x1344B: 84, - 0x1344C: 84, - 0x1344D: 84, - 0x1344E: 84, - 0x1344F: 84, - 0x13450: 84, - 0x13451: 84, - 0x13452: 84, - 0x13453: 84, - 0x13454: 84, - 0x13455: 84, - 0x16AF0: 84, - 0x16AF1: 84, - 0x16AF2: 84, - 0x16AF3: 84, - 0x16AF4: 84, - 0x16B30: 84, - 0x16B31: 84, - 0x16B32: 84, - 0x16B33: 84, - 0x16B34: 84, - 0x16B35: 84, - 0x16B36: 84, - 0x16F4F: 84, - 0x16F8F: 84, - 0x16F90: 84, - 0x16F91: 84, - 0x16F92: 84, - 0x16FE4: 84, - 0x1BC9D: 84, - 0x1BC9E: 84, - 0x1BCA0: 84, - 0x1BCA1: 84, - 0x1BCA2: 84, - 0x1BCA3: 84, - 0x1CF00: 84, - 0x1CF01: 84, - 0x1CF02: 84, - 0x1CF03: 84, - 0x1CF04: 84, - 0x1CF05: 84, - 0x1CF06: 84, - 0x1CF07: 84, - 0x1CF08: 84, - 0x1CF09: 84, - 0x1CF0A: 84, - 0x1CF0B: 84, - 0x1CF0C: 84, - 0x1CF0D: 84, - 0x1CF0E: 84, - 0x1CF0F: 84, - 0x1CF10: 84, - 0x1CF11: 84, - 0x1CF12: 84, - 0x1CF13: 84, - 0x1CF14: 84, - 0x1CF15: 84, - 0x1CF16: 84, - 0x1CF17: 84, - 0x1CF18: 84, - 0x1CF19: 84, - 0x1CF1A: 84, - 0x1CF1B: 84, - 0x1CF1C: 84, - 0x1CF1D: 84, - 0x1CF1E: 84, - 0x1CF1F: 84, - 0x1CF20: 84, - 0x1CF21: 84, - 0x1CF22: 84, - 0x1CF23: 84, - 0x1CF24: 84, - 0x1CF25: 84, - 0x1CF26: 84, - 0x1CF27: 84, - 0x1CF28: 84, - 0x1CF29: 84, - 0x1CF2A: 84, - 0x1CF2B: 84, - 0x1CF2C: 84, - 0x1CF2D: 84, - 0x1CF30: 84, - 0x1CF31: 84, - 0x1CF32: 84, - 0x1CF33: 84, - 0x1CF34: 84, - 0x1CF35: 84, - 0x1CF36: 84, - 0x1CF37: 84, - 0x1CF38: 84, - 0x1CF39: 84, - 0x1CF3A: 84, - 0x1CF3B: 84, - 0x1CF3C: 84, - 0x1CF3D: 84, - 0x1CF3E: 84, - 0x1CF3F: 84, - 0x1CF40: 84, - 0x1CF41: 84, - 0x1CF42: 84, - 0x1CF43: 84, - 0x1CF44: 84, - 0x1CF45: 84, - 0x1CF46: 84, - 0x1D167: 84, - 0x1D168: 84, - 0x1D169: 84, - 0x1D173: 84, - 0x1D174: 84, - 0x1D175: 84, - 0x1D176: 84, - 0x1D177: 84, - 0x1D178: 84, - 0x1D179: 84, - 0x1D17A: 84, - 0x1D17B: 84, - 0x1D17C: 84, - 0x1D17D: 84, - 0x1D17E: 84, - 0x1D17F: 84, - 0x1D180: 84, - 0x1D181: 84, - 0x1D182: 84, - 0x1D185: 84, - 0x1D186: 84, - 0x1D187: 84, - 0x1D188: 84, - 0x1D189: 84, - 0x1D18A: 84, - 0x1D18B: 84, - 0x1D1AA: 84, - 0x1D1AB: 84, - 0x1D1AC: 84, - 0x1D1AD: 84, - 0x1D242: 84, - 0x1D243: 84, - 0x1D244: 84, - 0x1DA00: 84, - 0x1DA01: 84, - 0x1DA02: 84, - 0x1DA03: 84, - 0x1DA04: 84, - 0x1DA05: 84, - 0x1DA06: 84, - 0x1DA07: 84, - 0x1DA08: 84, - 0x1DA09: 84, - 0x1DA0A: 84, - 0x1DA0B: 84, - 0x1DA0C: 84, - 0x1DA0D: 84, - 0x1DA0E: 84, - 0x1DA0F: 84, - 0x1DA10: 84, - 0x1DA11: 84, - 0x1DA12: 84, - 0x1DA13: 84, - 0x1DA14: 84, - 0x1DA15: 84, - 0x1DA16: 84, - 0x1DA17: 84, - 0x1DA18: 84, - 0x1DA19: 84, - 0x1DA1A: 84, - 0x1DA1B: 84, - 0x1DA1C: 84, - 0x1DA1D: 84, - 0x1DA1E: 84, - 0x1DA1F: 84, - 0x1DA20: 84, - 0x1DA21: 84, - 0x1DA22: 84, - 0x1DA23: 84, - 0x1DA24: 84, - 0x1DA25: 84, - 0x1DA26: 84, - 0x1DA27: 84, - 0x1DA28: 84, - 0x1DA29: 84, - 0x1DA2A: 84, - 0x1DA2B: 84, - 0x1DA2C: 84, - 0x1DA2D: 84, - 0x1DA2E: 84, - 0x1DA2F: 84, - 0x1DA30: 84, - 0x1DA31: 84, - 0x1DA32: 84, - 0x1DA33: 84, - 0x1DA34: 84, - 0x1DA35: 84, - 0x1DA36: 84, - 0x1DA3B: 84, - 0x1DA3C: 84, - 0x1DA3D: 84, - 0x1DA3E: 84, - 0x1DA3F: 84, - 0x1DA40: 84, - 0x1DA41: 84, - 0x1DA42: 84, - 0x1DA43: 84, - 0x1DA44: 84, - 0x1DA45: 84, - 0x1DA46: 84, - 0x1DA47: 84, - 0x1DA48: 84, - 0x1DA49: 84, - 0x1DA4A: 84, - 0x1DA4B: 84, - 0x1DA4C: 84, - 0x1DA4D: 84, - 0x1DA4E: 84, - 0x1DA4F: 84, - 0x1DA50: 84, - 0x1DA51: 84, - 0x1DA52: 84, - 0x1DA53: 84, - 0x1DA54: 84, - 0x1DA55: 84, - 0x1DA56: 84, - 0x1DA57: 84, - 0x1DA58: 84, - 0x1DA59: 84, - 0x1DA5A: 84, - 0x1DA5B: 84, - 0x1DA5C: 84, - 0x1DA5D: 84, - 0x1DA5E: 84, - 0x1DA5F: 84, - 0x1DA60: 84, - 0x1DA61: 84, - 0x1DA62: 84, - 0x1DA63: 84, - 0x1DA64: 84, - 0x1DA65: 84, - 0x1DA66: 84, - 0x1DA67: 84, - 0x1DA68: 84, - 0x1DA69: 84, - 0x1DA6A: 84, - 0x1DA6B: 84, - 0x1DA6C: 84, - 0x1DA75: 84, - 0x1DA84: 84, - 0x1DA9B: 84, - 0x1DA9C: 84, - 0x1DA9D: 84, - 0x1DA9E: 84, - 0x1DA9F: 84, - 0x1DAA1: 84, - 0x1DAA2: 84, - 0x1DAA3: 84, - 0x1DAA4: 84, - 0x1DAA5: 84, - 0x1DAA6: 84, - 0x1DAA7: 84, - 0x1DAA8: 84, - 0x1DAA9: 84, - 0x1DAAA: 84, - 0x1DAAB: 84, - 0x1DAAC: 84, - 0x1DAAD: 84, - 0x1DAAE: 84, - 0x1DAAF: 84, - 0x1E000: 84, - 0x1E001: 84, - 0x1E002: 84, - 0x1E003: 84, - 0x1E004: 84, - 0x1E005: 84, - 0x1E006: 84, - 0x1E008: 84, - 0x1E009: 84, - 0x1E00A: 84, - 0x1E00B: 84, - 0x1E00C: 84, - 0x1E00D: 84, - 0x1E00E: 84, - 0x1E00F: 84, - 0x1E010: 84, - 0x1E011: 84, - 0x1E012: 84, - 0x1E013: 84, - 0x1E014: 84, - 0x1E015: 84, - 0x1E016: 84, - 0x1E017: 84, - 0x1E018: 84, - 0x1E01B: 84, - 0x1E01C: 84, - 0x1E01D: 84, - 0x1E01E: 84, - 0x1E01F: 84, - 0x1E020: 84, - 0x1E021: 84, - 0x1E023: 84, - 0x1E024: 84, - 0x1E026: 84, - 0x1E027: 84, - 0x1E028: 84, - 0x1E029: 84, - 0x1E02A: 84, - 0x1E08F: 84, - 0x1E130: 84, - 0x1E131: 84, - 0x1E132: 84, - 0x1E133: 84, - 0x1E134: 84, - 0x1E135: 84, - 0x1E136: 84, - 0x1E2AE: 84, - 0x1E2EC: 84, - 0x1E2ED: 84, - 0x1E2EE: 84, - 0x1E2EF: 84, - 0x1E4EC: 84, - 0x1E4ED: 84, - 0x1E4EE: 84, - 0x1E4EF: 84, - 0x1E8D0: 84, - 0x1E8D1: 84, - 0x1E8D2: 84, - 0x1E8D3: 84, - 0x1E8D4: 84, - 0x1E8D5: 84, - 0x1E8D6: 84, - 0x1E900: 68, - 0x1E901: 68, - 0x1E902: 68, - 0x1E903: 68, - 0x1E904: 68, - 0x1E905: 68, - 0x1E906: 68, - 0x1E907: 68, - 0x1E908: 68, - 0x1E909: 68, - 0x1E90A: 68, - 0x1E90B: 68, - 0x1E90C: 68, - 0x1E90D: 68, - 0x1E90E: 68, - 0x1E90F: 68, - 0x1E910: 68, - 0x1E911: 68, - 0x1E912: 68, - 0x1E913: 68, - 0x1E914: 68, - 0x1E915: 68, - 0x1E916: 68, - 0x1E917: 68, - 0x1E918: 68, - 0x1E919: 68, - 0x1E91A: 68, - 0x1E91B: 68, - 0x1E91C: 68, - 0x1E91D: 68, - 0x1E91E: 68, - 0x1E91F: 68, - 0x1E920: 68, - 0x1E921: 68, - 0x1E922: 68, - 0x1E923: 68, - 0x1E924: 68, - 0x1E925: 68, - 0x1E926: 68, - 0x1E927: 68, - 0x1E928: 68, - 0x1E929: 68, - 0x1E92A: 68, - 0x1E92B: 68, - 0x1E92C: 68, - 0x1E92D: 68, - 0x1E92E: 68, - 0x1E92F: 68, - 0x1E930: 68, - 0x1E931: 68, - 0x1E932: 68, - 0x1E933: 68, - 0x1E934: 68, - 0x1E935: 68, - 0x1E936: 68, - 0x1E937: 68, - 0x1E938: 68, - 0x1E939: 68, - 0x1E93A: 68, - 0x1E93B: 68, - 0x1E93C: 68, - 0x1E93D: 68, - 0x1E93E: 68, - 0x1E93F: 68, - 0x1E940: 68, - 0x1E941: 68, - 0x1E942: 68, - 0x1E943: 68, - 0x1E944: 84, - 0x1E945: 84, - 0x1E946: 84, - 0x1E947: 84, - 0x1E948: 84, - 0x1E949: 84, - 0x1E94A: 84, - 0x1E94B: 84, - 0xE0001: 84, - 0xE0020: 84, - 0xE0021: 84, - 0xE0022: 84, - 0xE0023: 84, - 0xE0024: 84, - 0xE0025: 84, - 0xE0026: 84, - 0xE0027: 84, - 0xE0028: 84, - 0xE0029: 84, - 0xE002A: 84, - 0xE002B: 84, - 0xE002C: 84, - 0xE002D: 84, - 0xE002E: 84, - 0xE002F: 84, - 0xE0030: 84, - 0xE0031: 84, - 0xE0032: 84, - 0xE0033: 84, - 0xE0034: 84, - 0xE0035: 84, - 0xE0036: 84, - 0xE0037: 84, - 0xE0038: 84, - 0xE0039: 84, - 0xE003A: 84, - 0xE003B: 84, - 0xE003C: 84, - 0xE003D: 84, - 0xE003E: 84, - 0xE003F: 84, - 0xE0040: 84, - 0xE0041: 84, - 0xE0042: 84, - 0xE0043: 84, - 0xE0044: 84, - 0xE0045: 84, - 0xE0046: 84, - 0xE0047: 84, - 0xE0048: 84, - 0xE0049: 84, - 0xE004A: 84, - 0xE004B: 84, - 0xE004C: 84, - 0xE004D: 84, - 0xE004E: 84, - 0xE004F: 84, - 0xE0050: 84, - 0xE0051: 84, - 0xE0052: 84, - 0xE0053: 84, - 0xE0054: 84, - 0xE0055: 84, - 0xE0056: 84, - 0xE0057: 84, - 0xE0058: 84, - 0xE0059: 84, - 0xE005A: 84, - 0xE005B: 84, - 0xE005C: 84, - 0xE005D: 84, - 0xE005E: 84, - 0xE005F: 84, - 0xE0060: 84, - 0xE0061: 84, - 0xE0062: 84, - 0xE0063: 84, - 0xE0064: 84, - 0xE0065: 84, - 0xE0066: 84, - 0xE0067: 84, - 0xE0068: 84, - 0xE0069: 84, - 0xE006A: 84, - 0xE006B: 84, - 0xE006C: 84, - 0xE006D: 84, - 0xE006E: 84, - 0xE006F: 84, - 0xE0070: 84, - 0xE0071: 84, - 0xE0072: 84, - 0xE0073: 84, - 0xE0074: 84, - 0xE0075: 84, - 0xE0076: 84, - 0xE0077: 84, - 0xE0078: 84, - 0xE0079: 84, - 0xE007A: 84, - 0xE007B: 84, - 0xE007C: 84, - 0xE007D: 84, - 0xE007E: 84, - 0xE007F: 84, - 0xE0100: 84, - 0xE0101: 84, - 0xE0102: 84, - 0xE0103: 84, - 0xE0104: 84, - 0xE0105: 84, - 0xE0106: 84, - 0xE0107: 84, - 0xE0108: 84, - 0xE0109: 84, - 0xE010A: 84, - 0xE010B: 84, - 0xE010C: 84, - 0xE010D: 84, - 0xE010E: 84, - 0xE010F: 84, - 0xE0110: 84, - 0xE0111: 84, - 0xE0112: 84, - 0xE0113: 84, - 0xE0114: 84, - 0xE0115: 84, - 0xE0116: 84, - 0xE0117: 84, - 0xE0118: 84, - 0xE0119: 84, - 0xE011A: 84, - 0xE011B: 84, - 0xE011C: 84, - 0xE011D: 84, - 0xE011E: 84, - 0xE011F: 84, - 0xE0120: 84, - 0xE0121: 84, - 0xE0122: 84, - 0xE0123: 84, - 0xE0124: 84, - 0xE0125: 84, - 0xE0126: 84, - 0xE0127: 84, - 0xE0128: 84, - 0xE0129: 84, - 0xE012A: 84, - 0xE012B: 84, - 0xE012C: 84, - 0xE012D: 84, - 0xE012E: 84, - 0xE012F: 84, - 0xE0130: 84, - 0xE0131: 84, - 0xE0132: 84, - 0xE0133: 84, - 0xE0134: 84, - 0xE0135: 84, - 0xE0136: 84, - 0xE0137: 84, - 0xE0138: 84, - 0xE0139: 84, - 0xE013A: 84, - 0xE013B: 84, - 0xE013C: 84, - 0xE013D: 84, - 0xE013E: 84, - 0xE013F: 84, - 0xE0140: 84, - 0xE0141: 84, - 0xE0142: 84, - 0xE0143: 84, - 0xE0144: 84, - 0xE0145: 84, - 0xE0146: 84, - 0xE0147: 84, - 0xE0148: 84, - 0xE0149: 84, - 0xE014A: 84, - 0xE014B: 84, - 0xE014C: 84, - 0xE014D: 84, - 0xE014E: 84, - 0xE014F: 84, - 0xE0150: 84, - 0xE0151: 84, - 0xE0152: 84, - 0xE0153: 84, - 0xE0154: 84, - 0xE0155: 84, - 0xE0156: 84, - 0xE0157: 84, - 0xE0158: 84, - 0xE0159: 84, - 0xE015A: 84, - 0xE015B: 84, - 0xE015C: 84, - 0xE015D: 84, - 0xE015E: 84, - 0xE015F: 84, - 0xE0160: 84, - 0xE0161: 84, - 0xE0162: 84, - 0xE0163: 84, - 0xE0164: 84, - 0xE0165: 84, - 0xE0166: 84, - 0xE0167: 84, - 0xE0168: 84, - 0xE0169: 84, - 0xE016A: 84, - 0xE016B: 84, - 0xE016C: 84, - 0xE016D: 84, - 0xE016E: 84, - 0xE016F: 84, - 0xE0170: 84, - 0xE0171: 84, - 0xE0172: 84, - 0xE0173: 84, - 0xE0174: 84, - 0xE0175: 84, - 0xE0176: 84, - 0xE0177: 84, - 0xE0178: 84, - 0xE0179: 84, - 0xE017A: 84, - 0xE017B: 84, - 0xE017C: 84, - 0xE017D: 84, - 0xE017E: 84, - 0xE017F: 84, - 0xE0180: 84, - 0xE0181: 84, - 0xE0182: 84, - 0xE0183: 84, - 0xE0184: 84, - 0xE0185: 84, - 0xE0186: 84, - 0xE0187: 84, - 0xE0188: 84, - 0xE0189: 84, - 0xE018A: 84, - 0xE018B: 84, - 0xE018C: 84, - 0xE018D: 84, - 0xE018E: 84, - 0xE018F: 84, - 0xE0190: 84, - 0xE0191: 84, - 0xE0192: 84, - 0xE0193: 84, - 0xE0194: 84, - 0xE0195: 84, - 0xE0196: 84, - 0xE0197: 84, - 0xE0198: 84, - 0xE0199: 84, - 0xE019A: 84, - 0xE019B: 84, - 0xE019C: 84, - 0xE019D: 84, - 0xE019E: 84, - 0xE019F: 84, - 0xE01A0: 84, - 0xE01A1: 84, - 0xE01A2: 84, - 0xE01A3: 84, - 0xE01A4: 84, - 0xE01A5: 84, - 0xE01A6: 84, - 0xE01A7: 84, - 0xE01A8: 84, - 0xE01A9: 84, - 0xE01AA: 84, - 0xE01AB: 84, - 0xE01AC: 84, - 0xE01AD: 84, - 0xE01AE: 84, - 0xE01AF: 84, - 0xE01B0: 84, - 0xE01B1: 84, - 0xE01B2: 84, - 0xE01B3: 84, - 0xE01B4: 84, - 0xE01B5: 84, - 0xE01B6: 84, - 0xE01B7: 84, - 0xE01B8: 84, - 0xE01B9: 84, - 0xE01BA: 84, - 0xE01BB: 84, - 0xE01BC: 84, - 0xE01BD: 84, - 0xE01BE: 84, - 0xE01BF: 84, - 0xE01C0: 84, - 0xE01C1: 84, - 0xE01C2: 84, - 0xE01C3: 84, - 0xE01C4: 84, - 0xE01C5: 84, - 0xE01C6: 84, - 0xE01C7: 84, - 0xE01C8: 84, - 0xE01C9: 84, - 0xE01CA: 84, - 0xE01CB: 84, - 0xE01CC: 84, - 0xE01CD: 84, - 0xE01CE: 84, - 0xE01CF: 84, - 0xE01D0: 84, - 0xE01D1: 84, - 0xE01D2: 84, - 0xE01D3: 84, - 0xE01D4: 84, - 0xE01D5: 84, - 0xE01D6: 84, - 0xE01D7: 84, - 0xE01D8: 84, - 0xE01D9: 84, - 0xE01DA: 84, - 0xE01DB: 84, - 0xE01DC: 84, - 0xE01DD: 84, - 0xE01DE: 84, - 0xE01DF: 84, - 0xE01E0: 84, - 0xE01E1: 84, - 0xE01E2: 84, - 0xE01E3: 84, - 0xE01E4: 84, - 0xE01E5: 84, - 0xE01E6: 84, - 0xE01E7: 84, - 0xE01E8: 84, - 0xE01E9: 84, - 0xE01EA: 84, - 0xE01EB: 84, - 0xE01EC: 84, - 0xE01ED: 84, - 0xE01EE: 84, - 0xE01EF: 84, -} -codepoint_classes = { - "PVALID": ( - 0x2D0000002E, - 0x300000003A, - 0x610000007B, - 0xDF000000F7, - 0xF800000100, - 0x10100000102, - 0x10300000104, - 0x10500000106, - 0x10700000108, - 0x1090000010A, - 0x10B0000010C, - 0x10D0000010E, - 0x10F00000110, - 0x11100000112, - 0x11300000114, - 0x11500000116, - 0x11700000118, - 0x1190000011A, - 0x11B0000011C, - 0x11D0000011E, - 0x11F00000120, - 0x12100000122, - 0x12300000124, - 0x12500000126, - 0x12700000128, - 0x1290000012A, - 0x12B0000012C, - 0x12D0000012E, - 0x12F00000130, - 0x13100000132, - 0x13500000136, - 0x13700000139, - 0x13A0000013B, - 0x13C0000013D, - 0x13E0000013F, - 0x14200000143, - 0x14400000145, - 0x14600000147, - 0x14800000149, - 0x14B0000014C, - 0x14D0000014E, - 0x14F00000150, - 0x15100000152, - 0x15300000154, - 0x15500000156, - 0x15700000158, - 0x1590000015A, - 0x15B0000015C, - 0x15D0000015E, - 0x15F00000160, - 0x16100000162, - 0x16300000164, - 0x16500000166, - 0x16700000168, - 0x1690000016A, - 0x16B0000016C, - 0x16D0000016E, - 0x16F00000170, - 0x17100000172, - 0x17300000174, - 0x17500000176, - 0x17700000178, - 0x17A0000017B, - 0x17C0000017D, - 0x17E0000017F, - 0x18000000181, - 0x18300000184, - 0x18500000186, - 0x18800000189, - 0x18C0000018E, - 0x19200000193, - 0x19500000196, - 0x1990000019C, - 0x19E0000019F, - 0x1A1000001A2, - 0x1A3000001A4, - 0x1A5000001A6, - 0x1A8000001A9, - 0x1AA000001AC, - 0x1AD000001AE, - 0x1B0000001B1, - 0x1B4000001B5, - 0x1B6000001B7, - 0x1B9000001BC, - 0x1BD000001C4, - 0x1CE000001CF, - 0x1D0000001D1, - 0x1D2000001D3, - 0x1D4000001D5, - 0x1D6000001D7, - 0x1D8000001D9, - 0x1DA000001DB, - 0x1DC000001DE, - 0x1DF000001E0, - 0x1E1000001E2, - 0x1E3000001E4, - 0x1E5000001E6, - 0x1E7000001E8, - 0x1E9000001EA, - 0x1EB000001EC, - 0x1ED000001EE, - 0x1EF000001F1, - 0x1F5000001F6, - 0x1F9000001FA, - 0x1FB000001FC, - 0x1FD000001FE, - 0x1FF00000200, - 0x20100000202, - 0x20300000204, - 0x20500000206, - 0x20700000208, - 0x2090000020A, - 0x20B0000020C, - 0x20D0000020E, - 0x20F00000210, - 0x21100000212, - 0x21300000214, - 0x21500000216, - 0x21700000218, - 0x2190000021A, - 0x21B0000021C, - 0x21D0000021E, - 0x21F00000220, - 0x22100000222, - 0x22300000224, - 0x22500000226, - 0x22700000228, - 0x2290000022A, - 0x22B0000022C, - 0x22D0000022E, - 0x22F00000230, - 0x23100000232, - 0x2330000023A, - 0x23C0000023D, - 0x23F00000241, - 0x24200000243, - 0x24700000248, - 0x2490000024A, - 0x24B0000024C, - 0x24D0000024E, - 0x24F000002B0, - 0x2B9000002C2, - 0x2C6000002D2, - 0x2EC000002ED, - 0x2EE000002EF, - 0x30000000340, - 0x34200000343, - 0x3460000034F, - 0x35000000370, - 0x37100000372, - 0x37300000374, - 0x37700000378, - 0x37B0000037E, - 0x39000000391, - 0x3AC000003CF, - 0x3D7000003D8, - 0x3D9000003DA, - 0x3DB000003DC, - 0x3DD000003DE, - 0x3DF000003E0, - 0x3E1000003E2, - 0x3E3000003E4, - 0x3E5000003E6, - 0x3E7000003E8, - 0x3E9000003EA, - 0x3EB000003EC, - 0x3ED000003EE, - 0x3EF000003F0, - 0x3F3000003F4, - 0x3F8000003F9, - 0x3FB000003FD, - 0x43000000460, - 0x46100000462, - 0x46300000464, - 0x46500000466, - 0x46700000468, - 0x4690000046A, - 0x46B0000046C, - 0x46D0000046E, - 0x46F00000470, - 0x47100000472, - 0x47300000474, - 0x47500000476, - 0x47700000478, - 0x4790000047A, - 0x47B0000047C, - 0x47D0000047E, - 0x47F00000480, - 0x48100000482, - 0x48300000488, - 0x48B0000048C, - 0x48D0000048E, - 0x48F00000490, - 0x49100000492, - 0x49300000494, - 0x49500000496, - 0x49700000498, - 0x4990000049A, - 0x49B0000049C, - 0x49D0000049E, - 0x49F000004A0, - 0x4A1000004A2, - 0x4A3000004A4, - 0x4A5000004A6, - 0x4A7000004A8, - 0x4A9000004AA, - 0x4AB000004AC, - 0x4AD000004AE, - 0x4AF000004B0, - 0x4B1000004B2, - 0x4B3000004B4, - 0x4B5000004B6, - 0x4B7000004B8, - 0x4B9000004BA, - 0x4BB000004BC, - 0x4BD000004BE, - 0x4BF000004C0, - 0x4C2000004C3, - 0x4C4000004C5, - 0x4C6000004C7, - 0x4C8000004C9, - 0x4CA000004CB, - 0x4CC000004CD, - 0x4CE000004D0, - 0x4D1000004D2, - 0x4D3000004D4, - 0x4D5000004D6, - 0x4D7000004D8, - 0x4D9000004DA, - 0x4DB000004DC, - 0x4DD000004DE, - 0x4DF000004E0, - 0x4E1000004E2, - 0x4E3000004E4, - 0x4E5000004E6, - 0x4E7000004E8, - 0x4E9000004EA, - 0x4EB000004EC, - 0x4ED000004EE, - 0x4EF000004F0, - 0x4F1000004F2, - 0x4F3000004F4, - 0x4F5000004F6, - 0x4F7000004F8, - 0x4F9000004FA, - 0x4FB000004FC, - 0x4FD000004FE, - 0x4FF00000500, - 0x50100000502, - 0x50300000504, - 0x50500000506, - 0x50700000508, - 0x5090000050A, - 0x50B0000050C, - 0x50D0000050E, - 0x50F00000510, - 0x51100000512, - 0x51300000514, - 0x51500000516, - 0x51700000518, - 0x5190000051A, - 0x51B0000051C, - 0x51D0000051E, - 0x51F00000520, - 0x52100000522, - 0x52300000524, - 0x52500000526, - 0x52700000528, - 0x5290000052A, - 0x52B0000052C, - 0x52D0000052E, - 0x52F00000530, - 0x5590000055A, - 0x56000000587, - 0x58800000589, - 0x591000005BE, - 0x5BF000005C0, - 0x5C1000005C3, - 0x5C4000005C6, - 0x5C7000005C8, - 0x5D0000005EB, - 0x5EF000005F3, - 0x6100000061B, - 0x62000000640, - 0x64100000660, - 0x66E00000675, - 0x679000006D4, - 0x6D5000006DD, - 0x6DF000006E9, - 0x6EA000006F0, - 0x6FA00000700, - 0x7100000074B, - 0x74D000007B2, - 0x7C0000007F6, - 0x7FD000007FE, - 0x8000000082E, - 0x8400000085C, - 0x8600000086B, - 0x87000000888, - 0x8890000088F, - 0x898000008E2, - 0x8E300000958, - 0x96000000964, - 0x96600000970, - 0x97100000984, - 0x9850000098D, - 0x98F00000991, - 0x993000009A9, - 0x9AA000009B1, - 0x9B2000009B3, - 0x9B6000009BA, - 0x9BC000009C5, - 0x9C7000009C9, - 0x9CB000009CF, - 0x9D7000009D8, - 0x9E0000009E4, - 0x9E6000009F2, - 0x9FC000009FD, - 0x9FE000009FF, - 0xA0100000A04, - 0xA0500000A0B, - 0xA0F00000A11, - 0xA1300000A29, - 0xA2A00000A31, - 0xA3200000A33, - 0xA3500000A36, - 0xA3800000A3A, - 0xA3C00000A3D, - 0xA3E00000A43, - 0xA4700000A49, - 0xA4B00000A4E, - 0xA5100000A52, - 0xA5C00000A5D, - 0xA6600000A76, - 0xA8100000A84, - 0xA8500000A8E, - 0xA8F00000A92, - 0xA9300000AA9, - 0xAAA00000AB1, - 0xAB200000AB4, - 0xAB500000ABA, - 0xABC00000AC6, - 0xAC700000ACA, - 0xACB00000ACE, - 0xAD000000AD1, - 0xAE000000AE4, - 0xAE600000AF0, - 0xAF900000B00, - 0xB0100000B04, - 0xB0500000B0D, - 0xB0F00000B11, - 0xB1300000B29, - 0xB2A00000B31, - 0xB3200000B34, - 0xB3500000B3A, - 0xB3C00000B45, - 0xB4700000B49, - 0xB4B00000B4E, - 0xB5500000B58, - 0xB5F00000B64, - 0xB6600000B70, - 0xB7100000B72, - 0xB8200000B84, - 0xB8500000B8B, - 0xB8E00000B91, - 0xB9200000B96, - 0xB9900000B9B, - 0xB9C00000B9D, - 0xB9E00000BA0, - 0xBA300000BA5, - 0xBA800000BAB, - 0xBAE00000BBA, - 0xBBE00000BC3, - 0xBC600000BC9, - 0xBCA00000BCE, - 0xBD000000BD1, - 0xBD700000BD8, - 0xBE600000BF0, - 0xC0000000C0D, - 0xC0E00000C11, - 0xC1200000C29, - 0xC2A00000C3A, - 0xC3C00000C45, - 0xC4600000C49, - 0xC4A00000C4E, - 0xC5500000C57, - 0xC5800000C5B, - 0xC5D00000C5E, - 0xC6000000C64, - 0xC6600000C70, - 0xC8000000C84, - 0xC8500000C8D, - 0xC8E00000C91, - 0xC9200000CA9, - 0xCAA00000CB4, - 0xCB500000CBA, - 0xCBC00000CC5, - 0xCC600000CC9, - 0xCCA00000CCE, - 0xCD500000CD7, - 0xCDD00000CDF, - 0xCE000000CE4, - 0xCE600000CF0, - 0xCF100000CF4, - 0xD0000000D0D, - 0xD0E00000D11, - 0xD1200000D45, - 0xD4600000D49, - 0xD4A00000D4F, - 0xD5400000D58, - 0xD5F00000D64, - 0xD6600000D70, - 0xD7A00000D80, - 0xD8100000D84, - 0xD8500000D97, - 0xD9A00000DB2, - 0xDB300000DBC, - 0xDBD00000DBE, - 0xDC000000DC7, - 0xDCA00000DCB, - 0xDCF00000DD5, - 0xDD600000DD7, - 0xDD800000DE0, - 0xDE600000DF0, - 0xDF200000DF4, - 0xE0100000E33, - 0xE3400000E3B, - 0xE4000000E4F, - 0xE5000000E5A, - 0xE8100000E83, - 0xE8400000E85, - 0xE8600000E8B, - 0xE8C00000EA4, - 0xEA500000EA6, - 0xEA700000EB3, - 0xEB400000EBE, - 0xEC000000EC5, - 0xEC600000EC7, - 0xEC800000ECF, - 0xED000000EDA, - 0xEDE00000EE0, - 0xF0000000F01, - 0xF0B00000F0C, - 0xF1800000F1A, - 0xF2000000F2A, - 0xF3500000F36, - 0xF3700000F38, - 0xF3900000F3A, - 0xF3E00000F43, - 0xF4400000F48, - 0xF4900000F4D, - 0xF4E00000F52, - 0xF5300000F57, - 0xF5800000F5C, - 0xF5D00000F69, - 0xF6A00000F6D, - 0xF7100000F73, - 0xF7400000F75, - 0xF7A00000F81, - 0xF8200000F85, - 0xF8600000F93, - 0xF9400000F98, - 0xF9900000F9D, - 0xF9E00000FA2, - 0xFA300000FA7, - 0xFA800000FAC, - 0xFAD00000FB9, - 0xFBA00000FBD, - 0xFC600000FC7, - 0x10000000104A, - 0x10500000109E, - 0x10D0000010FB, - 0x10FD00001100, - 0x120000001249, - 0x124A0000124E, - 0x125000001257, - 0x125800001259, - 0x125A0000125E, - 0x126000001289, - 0x128A0000128E, - 0x1290000012B1, - 0x12B2000012B6, - 0x12B8000012BF, - 0x12C0000012C1, - 0x12C2000012C6, - 0x12C8000012D7, - 0x12D800001311, - 0x131200001316, - 0x13180000135B, - 0x135D00001360, - 0x138000001390, - 0x13A0000013F6, - 0x14010000166D, - 0x166F00001680, - 0x16810000169B, - 0x16A0000016EB, - 0x16F1000016F9, - 0x170000001716, - 0x171F00001735, - 0x174000001754, - 0x17600000176D, - 0x176E00001771, - 0x177200001774, - 0x1780000017B4, - 0x17B6000017D4, - 0x17D7000017D8, - 0x17DC000017DE, - 0x17E0000017EA, - 0x18100000181A, - 0x182000001879, - 0x1880000018AB, - 0x18B0000018F6, - 0x19000000191F, - 0x19200000192C, - 0x19300000193C, - 0x19460000196E, - 0x197000001975, - 0x1980000019AC, - 0x19B0000019CA, - 0x19D0000019DA, - 0x1A0000001A1C, - 0x1A2000001A5F, - 0x1A6000001A7D, - 0x1A7F00001A8A, - 0x1A9000001A9A, - 0x1AA700001AA8, - 0x1AB000001ABE, - 0x1ABF00001ACF, - 0x1B0000001B4D, - 0x1B5000001B5A, - 0x1B6B00001B74, - 0x1B8000001BF4, - 0x1C0000001C38, - 0x1C4000001C4A, - 0x1C4D00001C7E, - 0x1CD000001CD3, - 0x1CD400001CFB, - 0x1D0000001D2C, - 0x1D2F00001D30, - 0x1D3B00001D3C, - 0x1D4E00001D4F, - 0x1D6B00001D78, - 0x1D7900001D9B, - 0x1DC000001E00, - 0x1E0100001E02, - 0x1E0300001E04, - 0x1E0500001E06, - 0x1E0700001E08, - 0x1E0900001E0A, - 0x1E0B00001E0C, - 0x1E0D00001E0E, - 0x1E0F00001E10, - 0x1E1100001E12, - 0x1E1300001E14, - 0x1E1500001E16, - 0x1E1700001E18, - 0x1E1900001E1A, - 0x1E1B00001E1C, - 0x1E1D00001E1E, - 0x1E1F00001E20, - 0x1E2100001E22, - 0x1E2300001E24, - 0x1E2500001E26, - 0x1E2700001E28, - 0x1E2900001E2A, - 0x1E2B00001E2C, - 0x1E2D00001E2E, - 0x1E2F00001E30, - 0x1E3100001E32, - 0x1E3300001E34, - 0x1E3500001E36, - 0x1E3700001E38, - 0x1E3900001E3A, - 0x1E3B00001E3C, - 0x1E3D00001E3E, - 0x1E3F00001E40, - 0x1E4100001E42, - 0x1E4300001E44, - 0x1E4500001E46, - 0x1E4700001E48, - 0x1E4900001E4A, - 0x1E4B00001E4C, - 0x1E4D00001E4E, - 0x1E4F00001E50, - 0x1E5100001E52, - 0x1E5300001E54, - 0x1E5500001E56, - 0x1E5700001E58, - 0x1E5900001E5A, - 0x1E5B00001E5C, - 0x1E5D00001E5E, - 0x1E5F00001E60, - 0x1E6100001E62, - 0x1E6300001E64, - 0x1E6500001E66, - 0x1E6700001E68, - 0x1E6900001E6A, - 0x1E6B00001E6C, - 0x1E6D00001E6E, - 0x1E6F00001E70, - 0x1E7100001E72, - 0x1E7300001E74, - 0x1E7500001E76, - 0x1E7700001E78, - 0x1E7900001E7A, - 0x1E7B00001E7C, - 0x1E7D00001E7E, - 0x1E7F00001E80, - 0x1E8100001E82, - 0x1E8300001E84, - 0x1E8500001E86, - 0x1E8700001E88, - 0x1E8900001E8A, - 0x1E8B00001E8C, - 0x1E8D00001E8E, - 0x1E8F00001E90, - 0x1E9100001E92, - 0x1E9300001E94, - 0x1E9500001E9A, - 0x1E9C00001E9E, - 0x1E9F00001EA0, - 0x1EA100001EA2, - 0x1EA300001EA4, - 0x1EA500001EA6, - 0x1EA700001EA8, - 0x1EA900001EAA, - 0x1EAB00001EAC, - 0x1EAD00001EAE, - 0x1EAF00001EB0, - 0x1EB100001EB2, - 0x1EB300001EB4, - 0x1EB500001EB6, - 0x1EB700001EB8, - 0x1EB900001EBA, - 0x1EBB00001EBC, - 0x1EBD00001EBE, - 0x1EBF00001EC0, - 0x1EC100001EC2, - 0x1EC300001EC4, - 0x1EC500001EC6, - 0x1EC700001EC8, - 0x1EC900001ECA, - 0x1ECB00001ECC, - 0x1ECD00001ECE, - 0x1ECF00001ED0, - 0x1ED100001ED2, - 0x1ED300001ED4, - 0x1ED500001ED6, - 0x1ED700001ED8, - 0x1ED900001EDA, - 0x1EDB00001EDC, - 0x1EDD00001EDE, - 0x1EDF00001EE0, - 0x1EE100001EE2, - 0x1EE300001EE4, - 0x1EE500001EE6, - 0x1EE700001EE8, - 0x1EE900001EEA, - 0x1EEB00001EEC, - 0x1EED00001EEE, - 0x1EEF00001EF0, - 0x1EF100001EF2, - 0x1EF300001EF4, - 0x1EF500001EF6, - 0x1EF700001EF8, - 0x1EF900001EFA, - 0x1EFB00001EFC, - 0x1EFD00001EFE, - 0x1EFF00001F08, - 0x1F1000001F16, - 0x1F2000001F28, - 0x1F3000001F38, - 0x1F4000001F46, - 0x1F5000001F58, - 0x1F6000001F68, - 0x1F7000001F71, - 0x1F7200001F73, - 0x1F7400001F75, - 0x1F7600001F77, - 0x1F7800001F79, - 0x1F7A00001F7B, - 0x1F7C00001F7D, - 0x1FB000001FB2, - 0x1FB600001FB7, - 0x1FC600001FC7, - 0x1FD000001FD3, - 0x1FD600001FD8, - 0x1FE000001FE3, - 0x1FE400001FE8, - 0x1FF600001FF7, - 0x214E0000214F, - 0x218400002185, - 0x2C3000002C60, - 0x2C6100002C62, - 0x2C6500002C67, - 0x2C6800002C69, - 0x2C6A00002C6B, - 0x2C6C00002C6D, - 0x2C7100002C72, - 0x2C7300002C75, - 0x2C7600002C7C, - 0x2C8100002C82, - 0x2C8300002C84, - 0x2C8500002C86, - 0x2C8700002C88, - 0x2C8900002C8A, - 0x2C8B00002C8C, - 0x2C8D00002C8E, - 0x2C8F00002C90, - 0x2C9100002C92, - 0x2C9300002C94, - 0x2C9500002C96, - 0x2C9700002C98, - 0x2C9900002C9A, - 0x2C9B00002C9C, - 0x2C9D00002C9E, - 0x2C9F00002CA0, - 0x2CA100002CA2, - 0x2CA300002CA4, - 0x2CA500002CA6, - 0x2CA700002CA8, - 0x2CA900002CAA, - 0x2CAB00002CAC, - 0x2CAD00002CAE, - 0x2CAF00002CB0, - 0x2CB100002CB2, - 0x2CB300002CB4, - 0x2CB500002CB6, - 0x2CB700002CB8, - 0x2CB900002CBA, - 0x2CBB00002CBC, - 0x2CBD00002CBE, - 0x2CBF00002CC0, - 0x2CC100002CC2, - 0x2CC300002CC4, - 0x2CC500002CC6, - 0x2CC700002CC8, - 0x2CC900002CCA, - 0x2CCB00002CCC, - 0x2CCD00002CCE, - 0x2CCF00002CD0, - 0x2CD100002CD2, - 0x2CD300002CD4, - 0x2CD500002CD6, - 0x2CD700002CD8, - 0x2CD900002CDA, - 0x2CDB00002CDC, - 0x2CDD00002CDE, - 0x2CDF00002CE0, - 0x2CE100002CE2, - 0x2CE300002CE5, - 0x2CEC00002CED, - 0x2CEE00002CF2, - 0x2CF300002CF4, - 0x2D0000002D26, - 0x2D2700002D28, - 0x2D2D00002D2E, - 0x2D3000002D68, - 0x2D7F00002D97, - 0x2DA000002DA7, - 0x2DA800002DAF, - 0x2DB000002DB7, - 0x2DB800002DBF, - 0x2DC000002DC7, - 0x2DC800002DCF, - 0x2DD000002DD7, - 0x2DD800002DDF, - 0x2DE000002E00, - 0x2E2F00002E30, - 0x300500003008, - 0x302A0000302E, - 0x303C0000303D, - 0x304100003097, - 0x30990000309B, - 0x309D0000309F, - 0x30A1000030FB, - 0x30FC000030FF, - 0x310500003130, - 0x31A0000031C0, - 0x31F000003200, - 0x340000004DC0, - 0x4E000000A48D, - 0xA4D00000A4FE, - 0xA5000000A60D, - 0xA6100000A62C, - 0xA6410000A642, - 0xA6430000A644, - 0xA6450000A646, - 0xA6470000A648, - 0xA6490000A64A, - 0xA64B0000A64C, - 0xA64D0000A64E, - 0xA64F0000A650, - 0xA6510000A652, - 0xA6530000A654, - 0xA6550000A656, - 0xA6570000A658, - 0xA6590000A65A, - 0xA65B0000A65C, - 0xA65D0000A65E, - 0xA65F0000A660, - 0xA6610000A662, - 0xA6630000A664, - 0xA6650000A666, - 0xA6670000A668, - 0xA6690000A66A, - 0xA66B0000A66C, - 0xA66D0000A670, - 0xA6740000A67E, - 0xA67F0000A680, - 0xA6810000A682, - 0xA6830000A684, - 0xA6850000A686, - 0xA6870000A688, - 0xA6890000A68A, - 0xA68B0000A68C, - 0xA68D0000A68E, - 0xA68F0000A690, - 0xA6910000A692, - 0xA6930000A694, - 0xA6950000A696, - 0xA6970000A698, - 0xA6990000A69A, - 0xA69B0000A69C, - 0xA69E0000A6E6, - 0xA6F00000A6F2, - 0xA7170000A720, - 0xA7230000A724, - 0xA7250000A726, - 0xA7270000A728, - 0xA7290000A72A, - 0xA72B0000A72C, - 0xA72D0000A72E, - 0xA72F0000A732, - 0xA7330000A734, - 0xA7350000A736, - 0xA7370000A738, - 0xA7390000A73A, - 0xA73B0000A73C, - 0xA73D0000A73E, - 0xA73F0000A740, - 0xA7410000A742, - 0xA7430000A744, - 0xA7450000A746, - 0xA7470000A748, - 0xA7490000A74A, - 0xA74B0000A74C, - 0xA74D0000A74E, - 0xA74F0000A750, - 0xA7510000A752, - 0xA7530000A754, - 0xA7550000A756, - 0xA7570000A758, - 0xA7590000A75A, - 0xA75B0000A75C, - 0xA75D0000A75E, - 0xA75F0000A760, - 0xA7610000A762, - 0xA7630000A764, - 0xA7650000A766, - 0xA7670000A768, - 0xA7690000A76A, - 0xA76B0000A76C, - 0xA76D0000A76E, - 0xA76F0000A770, - 0xA7710000A779, - 0xA77A0000A77B, - 0xA77C0000A77D, - 0xA77F0000A780, - 0xA7810000A782, - 0xA7830000A784, - 0xA7850000A786, - 0xA7870000A789, - 0xA78C0000A78D, - 0xA78E0000A790, - 0xA7910000A792, - 0xA7930000A796, - 0xA7970000A798, - 0xA7990000A79A, - 0xA79B0000A79C, - 0xA79D0000A79E, - 0xA79F0000A7A0, - 0xA7A10000A7A2, - 0xA7A30000A7A4, - 0xA7A50000A7A6, - 0xA7A70000A7A8, - 0xA7A90000A7AA, - 0xA7AF0000A7B0, - 0xA7B50000A7B6, - 0xA7B70000A7B8, - 0xA7B90000A7BA, - 0xA7BB0000A7BC, - 0xA7BD0000A7BE, - 0xA7BF0000A7C0, - 0xA7C10000A7C2, - 0xA7C30000A7C4, - 0xA7C80000A7C9, - 0xA7CA0000A7CB, - 0xA7D10000A7D2, - 0xA7D30000A7D4, - 0xA7D50000A7D6, - 0xA7D70000A7D8, - 0xA7D90000A7DA, - 0xA7F60000A7F8, - 0xA7FA0000A828, - 0xA82C0000A82D, - 0xA8400000A874, - 0xA8800000A8C6, - 0xA8D00000A8DA, - 0xA8E00000A8F8, - 0xA8FB0000A8FC, - 0xA8FD0000A92E, - 0xA9300000A954, - 0xA9800000A9C1, - 0xA9CF0000A9DA, - 0xA9E00000A9FF, - 0xAA000000AA37, - 0xAA400000AA4E, - 0xAA500000AA5A, - 0xAA600000AA77, - 0xAA7A0000AAC3, - 0xAADB0000AADE, - 0xAAE00000AAF0, - 0xAAF20000AAF7, - 0xAB010000AB07, - 0xAB090000AB0F, - 0xAB110000AB17, - 0xAB200000AB27, - 0xAB280000AB2F, - 0xAB300000AB5B, - 0xAB600000AB69, - 0xABC00000ABEB, - 0xABEC0000ABEE, - 0xABF00000ABFA, - 0xAC000000D7A4, - 0xFA0E0000FA10, - 0xFA110000FA12, - 0xFA130000FA15, - 0xFA1F0000FA20, - 0xFA210000FA22, - 0xFA230000FA25, - 0xFA270000FA2A, - 0xFB1E0000FB1F, - 0xFE200000FE30, - 0xFE730000FE74, - 0x100000001000C, - 0x1000D00010027, - 0x100280001003B, - 0x1003C0001003E, - 0x1003F0001004E, - 0x100500001005E, - 0x10080000100FB, - 0x101FD000101FE, - 0x102800001029D, - 0x102A0000102D1, - 0x102E0000102E1, - 0x1030000010320, - 0x1032D00010341, - 0x103420001034A, - 0x103500001037B, - 0x103800001039E, - 0x103A0000103C4, - 0x103C8000103D0, - 0x104280001049E, - 0x104A0000104AA, - 0x104D8000104FC, - 0x1050000010528, - 0x1053000010564, - 0x10597000105A2, - 0x105A3000105B2, - 0x105B3000105BA, - 0x105BB000105BD, - 0x1060000010737, - 0x1074000010756, - 0x1076000010768, - 0x1078000010781, - 0x1080000010806, - 0x1080800010809, - 0x1080A00010836, - 0x1083700010839, - 0x1083C0001083D, - 0x1083F00010856, - 0x1086000010877, - 0x108800001089F, - 0x108E0000108F3, - 0x108F4000108F6, - 0x1090000010916, - 0x109200001093A, - 0x10980000109B8, - 0x109BE000109C0, - 0x10A0000010A04, - 0x10A0500010A07, - 0x10A0C00010A14, - 0x10A1500010A18, - 0x10A1900010A36, - 0x10A3800010A3B, - 0x10A3F00010A40, - 0x10A6000010A7D, - 0x10A8000010A9D, - 0x10AC000010AC8, - 0x10AC900010AE7, - 0x10B0000010B36, - 0x10B4000010B56, - 0x10B6000010B73, - 0x10B8000010B92, - 0x10C0000010C49, - 0x10CC000010CF3, - 0x10D0000010D28, - 0x10D3000010D3A, - 0x10E8000010EAA, - 0x10EAB00010EAD, - 0x10EB000010EB2, - 0x10EFD00010F1D, - 0x10F2700010F28, - 0x10F3000010F51, - 0x10F7000010F86, - 0x10FB000010FC5, - 0x10FE000010FF7, - 0x1100000011047, - 0x1106600011076, - 0x1107F000110BB, - 0x110C2000110C3, - 0x110D0000110E9, - 0x110F0000110FA, - 0x1110000011135, - 0x1113600011140, - 0x1114400011148, - 0x1115000011174, - 0x1117600011177, - 0x11180000111C5, - 0x111C9000111CD, - 0x111CE000111DB, - 0x111DC000111DD, - 0x1120000011212, - 0x1121300011238, - 0x1123E00011242, - 0x1128000011287, - 0x1128800011289, - 0x1128A0001128E, - 0x1128F0001129E, - 0x1129F000112A9, - 0x112B0000112EB, - 0x112F0000112FA, - 0x1130000011304, - 0x113050001130D, - 0x1130F00011311, - 0x1131300011329, - 0x1132A00011331, - 0x1133200011334, - 0x113350001133A, - 0x1133B00011345, - 0x1134700011349, - 0x1134B0001134E, - 0x1135000011351, - 0x1135700011358, - 0x1135D00011364, - 0x113660001136D, - 0x1137000011375, - 0x114000001144B, - 0x114500001145A, - 0x1145E00011462, - 0x11480000114C6, - 0x114C7000114C8, - 0x114D0000114DA, - 0x11580000115B6, - 0x115B8000115C1, - 0x115D8000115DE, - 0x1160000011641, - 0x1164400011645, - 0x116500001165A, - 0x11680000116B9, - 0x116C0000116CA, - 0x117000001171B, - 0x1171D0001172C, - 0x117300001173A, - 0x1174000011747, - 0x118000001183B, - 0x118C0000118EA, - 0x118FF00011907, - 0x119090001190A, - 0x1190C00011914, - 0x1191500011917, - 0x1191800011936, - 0x1193700011939, - 0x1193B00011944, - 0x119500001195A, - 0x119A0000119A8, - 0x119AA000119D8, - 0x119DA000119E2, - 0x119E3000119E5, - 0x11A0000011A3F, - 0x11A4700011A48, - 0x11A5000011A9A, - 0x11A9D00011A9E, - 0x11AB000011AF9, - 0x11C0000011C09, - 0x11C0A00011C37, - 0x11C3800011C41, - 0x11C5000011C5A, - 0x11C7200011C90, - 0x11C9200011CA8, - 0x11CA900011CB7, - 0x11D0000011D07, - 0x11D0800011D0A, - 0x11D0B00011D37, - 0x11D3A00011D3B, - 0x11D3C00011D3E, - 0x11D3F00011D48, - 0x11D5000011D5A, - 0x11D6000011D66, - 0x11D6700011D69, - 0x11D6A00011D8F, - 0x11D9000011D92, - 0x11D9300011D99, - 0x11DA000011DAA, - 0x11EE000011EF7, - 0x11F0000011F11, - 0x11F1200011F3B, - 0x11F3E00011F43, - 0x11F5000011F5A, - 0x11FB000011FB1, - 0x120000001239A, - 0x1248000012544, - 0x12F9000012FF1, - 0x1300000013430, - 0x1344000013456, - 0x1440000014647, - 0x1680000016A39, - 0x16A4000016A5F, - 0x16A6000016A6A, - 0x16A7000016ABF, - 0x16AC000016ACA, - 0x16AD000016AEE, - 0x16AF000016AF5, - 0x16B0000016B37, - 0x16B4000016B44, - 0x16B5000016B5A, - 0x16B6300016B78, - 0x16B7D00016B90, - 0x16E6000016E80, - 0x16F0000016F4B, - 0x16F4F00016F88, - 0x16F8F00016FA0, - 0x16FE000016FE2, - 0x16FE300016FE5, - 0x16FF000016FF2, - 0x17000000187F8, - 0x1880000018CD6, - 0x18D0000018D09, - 0x1AFF00001AFF4, - 0x1AFF50001AFFC, - 0x1AFFD0001AFFF, - 0x1B0000001B123, - 0x1B1320001B133, - 0x1B1500001B153, - 0x1B1550001B156, - 0x1B1640001B168, - 0x1B1700001B2FC, - 0x1BC000001BC6B, - 0x1BC700001BC7D, - 0x1BC800001BC89, - 0x1BC900001BC9A, - 0x1BC9D0001BC9F, - 0x1CF000001CF2E, - 0x1CF300001CF47, - 0x1DA000001DA37, - 0x1DA3B0001DA6D, - 0x1DA750001DA76, - 0x1DA840001DA85, - 0x1DA9B0001DAA0, - 0x1DAA10001DAB0, - 0x1DF000001DF1F, - 0x1DF250001DF2B, - 0x1E0000001E007, - 0x1E0080001E019, - 0x1E01B0001E022, - 0x1E0230001E025, - 0x1E0260001E02B, - 0x1E08F0001E090, - 0x1E1000001E12D, - 0x1E1300001E13E, - 0x1E1400001E14A, - 0x1E14E0001E14F, - 0x1E2900001E2AF, - 0x1E2C00001E2FA, - 0x1E4D00001E4FA, - 0x1E7E00001E7E7, - 0x1E7E80001E7EC, - 0x1E7ED0001E7EF, - 0x1E7F00001E7FF, - 0x1E8000001E8C5, - 0x1E8D00001E8D7, - 0x1E9220001E94C, - 0x1E9500001E95A, - 0x200000002A6E0, - 0x2A7000002B73A, - 0x2B7400002B81E, - 0x2B8200002CEA2, - 0x2CEB00002EBE1, - 0x2EBF00002EE5E, - 0x300000003134B, - 0x31350000323B0, - ), - "CONTEXTJ": (0x200C0000200E,), - "CONTEXTO": ( - 0xB7000000B8, - 0x37500000376, - 0x5F3000005F5, - 0x6600000066A, - 0x6F0000006FA, - 0x30FB000030FC, - ), -} diff --git a/venv/lib/python3.11/site-packages/idna/intranges.py b/venv/lib/python3.11/site-packages/idna/intranges.py deleted file mode 100644 index 7bfaa8d..0000000 --- a/venv/lib/python3.11/site-packages/idna/intranges.py +++ /dev/null @@ -1,57 +0,0 @@ -""" -Given a list of integers, made up of (hopefully) a small number of long runs -of consecutive integers, compute a representation of the form -((start1, end1), (start2, end2) ...). Then answer the question "was x present -in the original list?" in time O(log(# runs)). -""" - -import bisect -from typing import List, Tuple - - -def intranges_from_list(list_: List[int]) -> Tuple[int, ...]: - """Represent a list of integers as a sequence of ranges: - ((start_0, end_0), (start_1, end_1), ...), such that the original - integers are exactly those x such that start_i <= x < end_i for some i. - - Ranges are encoded as single integers (start << 32 | end), not as tuples. - """ - - sorted_list = sorted(list_) - ranges = [] - last_write = -1 - for i in range(len(sorted_list)): - if i + 1 < len(sorted_list): - if sorted_list[i] == sorted_list[i + 1] - 1: - continue - current_range = sorted_list[last_write + 1 : i + 1] - ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) - last_write = i - - return tuple(ranges) - - -def _encode_range(start: int, end: int) -> int: - return (start << 32) | end - - -def _decode_range(r: int) -> Tuple[int, int]: - return (r >> 32), (r & ((1 << 32) - 1)) - - -def intranges_contain(int_: int, ranges: Tuple[int, ...]) -> bool: - """Determine if `int_` falls into one of the ranges in `ranges`.""" - tuple_ = _encode_range(int_, 0) - pos = bisect.bisect_left(ranges, tuple_) - # we could be immediately ahead of a tuple (start, end) - # with start < int_ <= end - if pos > 0: - left, right = _decode_range(ranges[pos - 1]) - if left <= int_ < right: - return True - # or we could be immediately behind a tuple (int_, end) - if pos < len(ranges): - left, _ = _decode_range(ranges[pos]) - if left == int_: - return True - return False diff --git a/venv/lib/python3.11/site-packages/idna/package_data.py b/venv/lib/python3.11/site-packages/idna/package_data.py deleted file mode 100644 index 514ff7e..0000000 --- a/venv/lib/python3.11/site-packages/idna/package_data.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "3.10" diff --git a/venv/lib/python3.11/site-packages/idna/py.typed b/venv/lib/python3.11/site-packages/idna/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/idna/uts46data.py b/venv/lib/python3.11/site-packages/idna/uts46data.py deleted file mode 100644 index eb89432..0000000 --- a/venv/lib/python3.11/site-packages/idna/uts46data.py +++ /dev/null @@ -1,8681 +0,0 @@ -# This file is automatically generated by tools/idna-data -# vim: set fileencoding=utf-8 : - -from typing import List, Tuple, Union - -"""IDNA Mapping Table from UTS46.""" - - -__version__ = "15.1.0" - - -def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x0, "3"), - (0x1, "3"), - (0x2, "3"), - (0x3, "3"), - (0x4, "3"), - (0x5, "3"), - (0x6, "3"), - (0x7, "3"), - (0x8, "3"), - (0x9, "3"), - (0xA, "3"), - (0xB, "3"), - (0xC, "3"), - (0xD, "3"), - (0xE, "3"), - (0xF, "3"), - (0x10, "3"), - (0x11, "3"), - (0x12, "3"), - (0x13, "3"), - (0x14, "3"), - (0x15, "3"), - (0x16, "3"), - (0x17, "3"), - (0x18, "3"), - (0x19, "3"), - (0x1A, "3"), - (0x1B, "3"), - (0x1C, "3"), - (0x1D, "3"), - (0x1E, "3"), - (0x1F, "3"), - (0x20, "3"), - (0x21, "3"), - (0x22, "3"), - (0x23, "3"), - (0x24, "3"), - (0x25, "3"), - (0x26, "3"), - (0x27, "3"), - (0x28, "3"), - (0x29, "3"), - (0x2A, "3"), - (0x2B, "3"), - (0x2C, "3"), - (0x2D, "V"), - (0x2E, "V"), - (0x2F, "3"), - (0x30, "V"), - (0x31, "V"), - (0x32, "V"), - (0x33, "V"), - (0x34, "V"), - (0x35, "V"), - (0x36, "V"), - (0x37, "V"), - (0x38, "V"), - (0x39, "V"), - (0x3A, "3"), - (0x3B, "3"), - (0x3C, "3"), - (0x3D, "3"), - (0x3E, "3"), - (0x3F, "3"), - (0x40, "3"), - (0x41, "M", "a"), - (0x42, "M", "b"), - (0x43, "M", "c"), - (0x44, "M", "d"), - (0x45, "M", "e"), - (0x46, "M", "f"), - (0x47, "M", "g"), - (0x48, "M", "h"), - (0x49, "M", "i"), - (0x4A, "M", "j"), - (0x4B, "M", "k"), - (0x4C, "M", "l"), - (0x4D, "M", "m"), - (0x4E, "M", "n"), - (0x4F, "M", "o"), - (0x50, "M", "p"), - (0x51, "M", "q"), - (0x52, "M", "r"), - (0x53, "M", "s"), - (0x54, "M", "t"), - (0x55, "M", "u"), - (0x56, "M", "v"), - (0x57, "M", "w"), - (0x58, "M", "x"), - (0x59, "M", "y"), - (0x5A, "M", "z"), - (0x5B, "3"), - (0x5C, "3"), - (0x5D, "3"), - (0x5E, "3"), - (0x5F, "3"), - (0x60, "3"), - (0x61, "V"), - (0x62, "V"), - (0x63, "V"), - ] - - -def _seg_1() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x64, "V"), - (0x65, "V"), - (0x66, "V"), - (0x67, "V"), - (0x68, "V"), - (0x69, "V"), - (0x6A, "V"), - (0x6B, "V"), - (0x6C, "V"), - (0x6D, "V"), - (0x6E, "V"), - (0x6F, "V"), - (0x70, "V"), - (0x71, "V"), - (0x72, "V"), - (0x73, "V"), - (0x74, "V"), - (0x75, "V"), - (0x76, "V"), - (0x77, "V"), - (0x78, "V"), - (0x79, "V"), - (0x7A, "V"), - (0x7B, "3"), - (0x7C, "3"), - (0x7D, "3"), - (0x7E, "3"), - (0x7F, "3"), - (0x80, "X"), - (0x81, "X"), - (0x82, "X"), - (0x83, "X"), - (0x84, "X"), - (0x85, "X"), - (0x86, "X"), - (0x87, "X"), - (0x88, "X"), - (0x89, "X"), - (0x8A, "X"), - (0x8B, "X"), - (0x8C, "X"), - (0x8D, "X"), - (0x8E, "X"), - (0x8F, "X"), - (0x90, "X"), - (0x91, "X"), - (0x92, "X"), - (0x93, "X"), - (0x94, "X"), - (0x95, "X"), - (0x96, "X"), - (0x97, "X"), - (0x98, "X"), - (0x99, "X"), - (0x9A, "X"), - (0x9B, "X"), - (0x9C, "X"), - (0x9D, "X"), - (0x9E, "X"), - (0x9F, "X"), - (0xA0, "3", " "), - (0xA1, "V"), - (0xA2, "V"), - (0xA3, "V"), - (0xA4, "V"), - (0xA5, "V"), - (0xA6, "V"), - (0xA7, "V"), - (0xA8, "3", " ̈"), - (0xA9, "V"), - (0xAA, "M", "a"), - (0xAB, "V"), - (0xAC, "V"), - (0xAD, "I"), - (0xAE, "V"), - (0xAF, "3", " ̄"), - (0xB0, "V"), - (0xB1, "V"), - (0xB2, "M", "2"), - (0xB3, "M", "3"), - (0xB4, "3", " ́"), - (0xB5, "M", "μ"), - (0xB6, "V"), - (0xB7, "V"), - (0xB8, "3", " ̧"), - (0xB9, "M", "1"), - (0xBA, "M", "o"), - (0xBB, "V"), - (0xBC, "M", "1⁄4"), - (0xBD, "M", "1⁄2"), - (0xBE, "M", "3⁄4"), - (0xBF, "V"), - (0xC0, "M", "à"), - (0xC1, "M", "á"), - (0xC2, "M", "â"), - (0xC3, "M", "ã"), - (0xC4, "M", "ä"), - (0xC5, "M", "å"), - (0xC6, "M", "æ"), - (0xC7, "M", "ç"), - ] - - -def _seg_2() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xC8, "M", "è"), - (0xC9, "M", "é"), - (0xCA, "M", "ê"), - (0xCB, "M", "ë"), - (0xCC, "M", "ì"), - (0xCD, "M", "í"), - (0xCE, "M", "î"), - (0xCF, "M", "ï"), - (0xD0, "M", "ð"), - (0xD1, "M", "ñ"), - (0xD2, "M", "ò"), - (0xD3, "M", "ó"), - (0xD4, "M", "ô"), - (0xD5, "M", "õ"), - (0xD6, "M", "ö"), - (0xD7, "V"), - (0xD8, "M", "ø"), - (0xD9, "M", "ù"), - (0xDA, "M", "ú"), - (0xDB, "M", "û"), - (0xDC, "M", "ü"), - (0xDD, "M", "ý"), - (0xDE, "M", "þ"), - (0xDF, "D", "ss"), - (0xE0, "V"), - (0xE1, "V"), - (0xE2, "V"), - (0xE3, "V"), - (0xE4, "V"), - (0xE5, "V"), - (0xE6, "V"), - (0xE7, "V"), - (0xE8, "V"), - (0xE9, "V"), - (0xEA, "V"), - (0xEB, "V"), - (0xEC, "V"), - (0xED, "V"), - (0xEE, "V"), - (0xEF, "V"), - (0xF0, "V"), - (0xF1, "V"), - (0xF2, "V"), - (0xF3, "V"), - (0xF4, "V"), - (0xF5, "V"), - (0xF6, "V"), - (0xF7, "V"), - (0xF8, "V"), - (0xF9, "V"), - (0xFA, "V"), - (0xFB, "V"), - (0xFC, "V"), - (0xFD, "V"), - (0xFE, "V"), - (0xFF, "V"), - (0x100, "M", "ā"), - (0x101, "V"), - (0x102, "M", "ă"), - (0x103, "V"), - (0x104, "M", "ą"), - (0x105, "V"), - (0x106, "M", "ć"), - (0x107, "V"), - (0x108, "M", "ĉ"), - (0x109, "V"), - (0x10A, "M", "ċ"), - (0x10B, "V"), - (0x10C, "M", "č"), - (0x10D, "V"), - (0x10E, "M", "ď"), - (0x10F, "V"), - (0x110, "M", "đ"), - (0x111, "V"), - (0x112, "M", "ē"), - (0x113, "V"), - (0x114, "M", "ĕ"), - (0x115, "V"), - (0x116, "M", "ė"), - (0x117, "V"), - (0x118, "M", "ę"), - (0x119, "V"), - (0x11A, "M", "ě"), - (0x11B, "V"), - (0x11C, "M", "ĝ"), - (0x11D, "V"), - (0x11E, "M", "ğ"), - (0x11F, "V"), - (0x120, "M", "ġ"), - (0x121, "V"), - (0x122, "M", "ģ"), - (0x123, "V"), - (0x124, "M", "ĥ"), - (0x125, "V"), - (0x126, "M", "ħ"), - (0x127, "V"), - (0x128, "M", "ĩ"), - (0x129, "V"), - (0x12A, "M", "ī"), - (0x12B, "V"), - ] - - -def _seg_3() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x12C, "M", "ĭ"), - (0x12D, "V"), - (0x12E, "M", "į"), - (0x12F, "V"), - (0x130, "M", "i̇"), - (0x131, "V"), - (0x132, "M", "ij"), - (0x134, "M", "ĵ"), - (0x135, "V"), - (0x136, "M", "ķ"), - (0x137, "V"), - (0x139, "M", "ĺ"), - (0x13A, "V"), - (0x13B, "M", "ļ"), - (0x13C, "V"), - (0x13D, "M", "ľ"), - (0x13E, "V"), - (0x13F, "M", "l·"), - (0x141, "M", "ł"), - (0x142, "V"), - (0x143, "M", "ń"), - (0x144, "V"), - (0x145, "M", "ņ"), - (0x146, "V"), - (0x147, "M", "ň"), - (0x148, "V"), - (0x149, "M", "ʼn"), - (0x14A, "M", "ŋ"), - (0x14B, "V"), - (0x14C, "M", "ō"), - (0x14D, "V"), - (0x14E, "M", "ŏ"), - (0x14F, "V"), - (0x150, "M", "ő"), - (0x151, "V"), - (0x152, "M", "œ"), - (0x153, "V"), - (0x154, "M", "ŕ"), - (0x155, "V"), - (0x156, "M", "ŗ"), - (0x157, "V"), - (0x158, "M", "ř"), - (0x159, "V"), - (0x15A, "M", "ś"), - (0x15B, "V"), - (0x15C, "M", "ŝ"), - (0x15D, "V"), - (0x15E, "M", "ş"), - (0x15F, "V"), - (0x160, "M", "š"), - (0x161, "V"), - (0x162, "M", "ţ"), - (0x163, "V"), - (0x164, "M", "ť"), - (0x165, "V"), - (0x166, "M", "ŧ"), - (0x167, "V"), - (0x168, "M", "ũ"), - (0x169, "V"), - (0x16A, "M", "ū"), - (0x16B, "V"), - (0x16C, "M", "ŭ"), - (0x16D, "V"), - (0x16E, "M", "ů"), - (0x16F, "V"), - (0x170, "M", "ű"), - (0x171, "V"), - (0x172, "M", "ų"), - (0x173, "V"), - (0x174, "M", "ŵ"), - (0x175, "V"), - (0x176, "M", "ŷ"), - (0x177, "V"), - (0x178, "M", "ÿ"), - (0x179, "M", "ź"), - (0x17A, "V"), - (0x17B, "M", "ż"), - (0x17C, "V"), - (0x17D, "M", "ž"), - (0x17E, "V"), - (0x17F, "M", "s"), - (0x180, "V"), - (0x181, "M", "ɓ"), - (0x182, "M", "ƃ"), - (0x183, "V"), - (0x184, "M", "ƅ"), - (0x185, "V"), - (0x186, "M", "ɔ"), - (0x187, "M", "ƈ"), - (0x188, "V"), - (0x189, "M", "ɖ"), - (0x18A, "M", "ɗ"), - (0x18B, "M", "ƌ"), - (0x18C, "V"), - (0x18E, "M", "ǝ"), - (0x18F, "M", "ə"), - (0x190, "M", "ɛ"), - (0x191, "M", "ƒ"), - (0x192, "V"), - (0x193, "M", "ɠ"), - ] - - -def _seg_4() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x194, "M", "ɣ"), - (0x195, "V"), - (0x196, "M", "ɩ"), - (0x197, "M", "ɨ"), - (0x198, "M", "ƙ"), - (0x199, "V"), - (0x19C, "M", "ɯ"), - (0x19D, "M", "ɲ"), - (0x19E, "V"), - (0x19F, "M", "ɵ"), - (0x1A0, "M", "ơ"), - (0x1A1, "V"), - (0x1A2, "M", "ƣ"), - (0x1A3, "V"), - (0x1A4, "M", "ƥ"), - (0x1A5, "V"), - (0x1A6, "M", "ʀ"), - (0x1A7, "M", "ƨ"), - (0x1A8, "V"), - (0x1A9, "M", "ʃ"), - (0x1AA, "V"), - (0x1AC, "M", "ƭ"), - (0x1AD, "V"), - (0x1AE, "M", "ʈ"), - (0x1AF, "M", "ư"), - (0x1B0, "V"), - (0x1B1, "M", "ʊ"), - (0x1B2, "M", "ʋ"), - (0x1B3, "M", "ƴ"), - (0x1B4, "V"), - (0x1B5, "M", "ƶ"), - (0x1B6, "V"), - (0x1B7, "M", "ʒ"), - (0x1B8, "M", "ƹ"), - (0x1B9, "V"), - (0x1BC, "M", "ƽ"), - (0x1BD, "V"), - (0x1C4, "M", "dž"), - (0x1C7, "M", "lj"), - (0x1CA, "M", "nj"), - (0x1CD, "M", "ǎ"), - (0x1CE, "V"), - (0x1CF, "M", "ǐ"), - (0x1D0, "V"), - (0x1D1, "M", "ǒ"), - (0x1D2, "V"), - (0x1D3, "M", "ǔ"), - (0x1D4, "V"), - (0x1D5, "M", "ǖ"), - (0x1D6, "V"), - (0x1D7, "M", "ǘ"), - (0x1D8, "V"), - (0x1D9, "M", "ǚ"), - (0x1DA, "V"), - (0x1DB, "M", "ǜ"), - (0x1DC, "V"), - (0x1DE, "M", "ǟ"), - (0x1DF, "V"), - (0x1E0, "M", "ǡ"), - (0x1E1, "V"), - (0x1E2, "M", "ǣ"), - (0x1E3, "V"), - (0x1E4, "M", "ǥ"), - (0x1E5, "V"), - (0x1E6, "M", "ǧ"), - (0x1E7, "V"), - (0x1E8, "M", "ǩ"), - (0x1E9, "V"), - (0x1EA, "M", "ǫ"), - (0x1EB, "V"), - (0x1EC, "M", "ǭ"), - (0x1ED, "V"), - (0x1EE, "M", "ǯ"), - (0x1EF, "V"), - (0x1F1, "M", "dz"), - (0x1F4, "M", "ǵ"), - (0x1F5, "V"), - (0x1F6, "M", "ƕ"), - (0x1F7, "M", "ƿ"), - (0x1F8, "M", "ǹ"), - (0x1F9, "V"), - (0x1FA, "M", "ǻ"), - (0x1FB, "V"), - (0x1FC, "M", "ǽ"), - (0x1FD, "V"), - (0x1FE, "M", "ǿ"), - (0x1FF, "V"), - (0x200, "M", "ȁ"), - (0x201, "V"), - (0x202, "M", "ȃ"), - (0x203, "V"), - (0x204, "M", "ȅ"), - (0x205, "V"), - (0x206, "M", "ȇ"), - (0x207, "V"), - (0x208, "M", "ȉ"), - (0x209, "V"), - (0x20A, "M", "ȋ"), - (0x20B, "V"), - (0x20C, "M", "ȍ"), - ] - - -def _seg_5() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x20D, "V"), - (0x20E, "M", "ȏ"), - (0x20F, "V"), - (0x210, "M", "ȑ"), - (0x211, "V"), - (0x212, "M", "ȓ"), - (0x213, "V"), - (0x214, "M", "ȕ"), - (0x215, "V"), - (0x216, "M", "ȗ"), - (0x217, "V"), - (0x218, "M", "ș"), - (0x219, "V"), - (0x21A, "M", "ț"), - (0x21B, "V"), - (0x21C, "M", "ȝ"), - (0x21D, "V"), - (0x21E, "M", "ȟ"), - (0x21F, "V"), - (0x220, "M", "ƞ"), - (0x221, "V"), - (0x222, "M", "ȣ"), - (0x223, "V"), - (0x224, "M", "ȥ"), - (0x225, "V"), - (0x226, "M", "ȧ"), - (0x227, "V"), - (0x228, "M", "ȩ"), - (0x229, "V"), - (0x22A, "M", "ȫ"), - (0x22B, "V"), - (0x22C, "M", "ȭ"), - (0x22D, "V"), - (0x22E, "M", "ȯ"), - (0x22F, "V"), - (0x230, "M", "ȱ"), - (0x231, "V"), - (0x232, "M", "ȳ"), - (0x233, "V"), - (0x23A, "M", "ⱥ"), - (0x23B, "M", "ȼ"), - (0x23C, "V"), - (0x23D, "M", "ƚ"), - (0x23E, "M", "ⱦ"), - (0x23F, "V"), - (0x241, "M", "ɂ"), - (0x242, "V"), - (0x243, "M", "ƀ"), - (0x244, "M", "ʉ"), - (0x245, "M", "ʌ"), - (0x246, "M", "ɇ"), - (0x247, "V"), - (0x248, "M", "ɉ"), - (0x249, "V"), - (0x24A, "M", "ɋ"), - (0x24B, "V"), - (0x24C, "M", "ɍ"), - (0x24D, "V"), - (0x24E, "M", "ɏ"), - (0x24F, "V"), - (0x2B0, "M", "h"), - (0x2B1, "M", "ɦ"), - (0x2B2, "M", "j"), - (0x2B3, "M", "r"), - (0x2B4, "M", "ɹ"), - (0x2B5, "M", "ɻ"), - (0x2B6, "M", "ʁ"), - (0x2B7, "M", "w"), - (0x2B8, "M", "y"), - (0x2B9, "V"), - (0x2D8, "3", " ̆"), - (0x2D9, "3", " ̇"), - (0x2DA, "3", " ̊"), - (0x2DB, "3", " ̨"), - (0x2DC, "3", " ̃"), - (0x2DD, "3", " ̋"), - (0x2DE, "V"), - (0x2E0, "M", "ɣ"), - (0x2E1, "M", "l"), - (0x2E2, "M", "s"), - (0x2E3, "M", "x"), - (0x2E4, "M", "ʕ"), - (0x2E5, "V"), - (0x340, "M", "̀"), - (0x341, "M", "́"), - (0x342, "V"), - (0x343, "M", "̓"), - (0x344, "M", "̈́"), - (0x345, "M", "ι"), - (0x346, "V"), - (0x34F, "I"), - (0x350, "V"), - (0x370, "M", "ͱ"), - (0x371, "V"), - (0x372, "M", "ͳ"), - (0x373, "V"), - (0x374, "M", "ʹ"), - (0x375, "V"), - (0x376, "M", "ͷ"), - (0x377, "V"), - ] - - -def _seg_6() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x378, "X"), - (0x37A, "3", " ι"), - (0x37B, "V"), - (0x37E, "3", ";"), - (0x37F, "M", "ϳ"), - (0x380, "X"), - (0x384, "3", " ́"), - (0x385, "3", " ̈́"), - (0x386, "M", "ά"), - (0x387, "M", "·"), - (0x388, "M", "έ"), - (0x389, "M", "ή"), - (0x38A, "M", "ί"), - (0x38B, "X"), - (0x38C, "M", "ό"), - (0x38D, "X"), - (0x38E, "M", "ύ"), - (0x38F, "M", "ώ"), - (0x390, "V"), - (0x391, "M", "α"), - (0x392, "M", "β"), - (0x393, "M", "γ"), - (0x394, "M", "δ"), - (0x395, "M", "ε"), - (0x396, "M", "ζ"), - (0x397, "M", "η"), - (0x398, "M", "θ"), - (0x399, "M", "ι"), - (0x39A, "M", "κ"), - (0x39B, "M", "λ"), - (0x39C, "M", "μ"), - (0x39D, "M", "ν"), - (0x39E, "M", "ξ"), - (0x39F, "M", "ο"), - (0x3A0, "M", "π"), - (0x3A1, "M", "ρ"), - (0x3A2, "X"), - (0x3A3, "M", "σ"), - (0x3A4, "M", "τ"), - (0x3A5, "M", "υ"), - (0x3A6, "M", "φ"), - (0x3A7, "M", "χ"), - (0x3A8, "M", "ψ"), - (0x3A9, "M", "ω"), - (0x3AA, "M", "ϊ"), - (0x3AB, "M", "ϋ"), - (0x3AC, "V"), - (0x3C2, "D", "σ"), - (0x3C3, "V"), - (0x3CF, "M", "ϗ"), - (0x3D0, "M", "β"), - (0x3D1, "M", "θ"), - (0x3D2, "M", "υ"), - (0x3D3, "M", "ύ"), - (0x3D4, "M", "ϋ"), - (0x3D5, "M", "φ"), - (0x3D6, "M", "π"), - (0x3D7, "V"), - (0x3D8, "M", "ϙ"), - (0x3D9, "V"), - (0x3DA, "M", "ϛ"), - (0x3DB, "V"), - (0x3DC, "M", "ϝ"), - (0x3DD, "V"), - (0x3DE, "M", "ϟ"), - (0x3DF, "V"), - (0x3E0, "M", "ϡ"), - (0x3E1, "V"), - (0x3E2, "M", "ϣ"), - (0x3E3, "V"), - (0x3E4, "M", "ϥ"), - (0x3E5, "V"), - (0x3E6, "M", "ϧ"), - (0x3E7, "V"), - (0x3E8, "M", "ϩ"), - (0x3E9, "V"), - (0x3EA, "M", "ϫ"), - (0x3EB, "V"), - (0x3EC, "M", "ϭ"), - (0x3ED, "V"), - (0x3EE, "M", "ϯ"), - (0x3EF, "V"), - (0x3F0, "M", "κ"), - (0x3F1, "M", "ρ"), - (0x3F2, "M", "σ"), - (0x3F3, "V"), - (0x3F4, "M", "θ"), - (0x3F5, "M", "ε"), - (0x3F6, "V"), - (0x3F7, "M", "ϸ"), - (0x3F8, "V"), - (0x3F9, "M", "σ"), - (0x3FA, "M", "ϻ"), - (0x3FB, "V"), - (0x3FD, "M", "ͻ"), - (0x3FE, "M", "ͼ"), - (0x3FF, "M", "ͽ"), - (0x400, "M", "ѐ"), - (0x401, "M", "ё"), - (0x402, "M", "ђ"), - ] - - -def _seg_7() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x403, "M", "ѓ"), - (0x404, "M", "є"), - (0x405, "M", "ѕ"), - (0x406, "M", "і"), - (0x407, "M", "ї"), - (0x408, "M", "ј"), - (0x409, "M", "љ"), - (0x40A, "M", "њ"), - (0x40B, "M", "ћ"), - (0x40C, "M", "ќ"), - (0x40D, "M", "ѝ"), - (0x40E, "M", "ў"), - (0x40F, "M", "џ"), - (0x410, "M", "а"), - (0x411, "M", "б"), - (0x412, "M", "в"), - (0x413, "M", "г"), - (0x414, "M", "д"), - (0x415, "M", "е"), - (0x416, "M", "ж"), - (0x417, "M", "з"), - (0x418, "M", "и"), - (0x419, "M", "й"), - (0x41A, "M", "к"), - (0x41B, "M", "л"), - (0x41C, "M", "м"), - (0x41D, "M", "н"), - (0x41E, "M", "о"), - (0x41F, "M", "п"), - (0x420, "M", "р"), - (0x421, "M", "с"), - (0x422, "M", "т"), - (0x423, "M", "у"), - (0x424, "M", "ф"), - (0x425, "M", "х"), - (0x426, "M", "ц"), - (0x427, "M", "ч"), - (0x428, "M", "ш"), - (0x429, "M", "щ"), - (0x42A, "M", "ъ"), - (0x42B, "M", "ы"), - (0x42C, "M", "ь"), - (0x42D, "M", "э"), - (0x42E, "M", "ю"), - (0x42F, "M", "я"), - (0x430, "V"), - (0x460, "M", "ѡ"), - (0x461, "V"), - (0x462, "M", "ѣ"), - (0x463, "V"), - (0x464, "M", "ѥ"), - (0x465, "V"), - (0x466, "M", "ѧ"), - (0x467, "V"), - (0x468, "M", "ѩ"), - (0x469, "V"), - (0x46A, "M", "ѫ"), - (0x46B, "V"), - (0x46C, "M", "ѭ"), - (0x46D, "V"), - (0x46E, "M", "ѯ"), - (0x46F, "V"), - (0x470, "M", "ѱ"), - (0x471, "V"), - (0x472, "M", "ѳ"), - (0x473, "V"), - (0x474, "M", "ѵ"), - (0x475, "V"), - (0x476, "M", "ѷ"), - (0x477, "V"), - (0x478, "M", "ѹ"), - (0x479, "V"), - (0x47A, "M", "ѻ"), - (0x47B, "V"), - (0x47C, "M", "ѽ"), - (0x47D, "V"), - (0x47E, "M", "ѿ"), - (0x47F, "V"), - (0x480, "M", "ҁ"), - (0x481, "V"), - (0x48A, "M", "ҋ"), - (0x48B, "V"), - (0x48C, "M", "ҍ"), - (0x48D, "V"), - (0x48E, "M", "ҏ"), - (0x48F, "V"), - (0x490, "M", "ґ"), - (0x491, "V"), - (0x492, "M", "ғ"), - (0x493, "V"), - (0x494, "M", "ҕ"), - (0x495, "V"), - (0x496, "M", "җ"), - (0x497, "V"), - (0x498, "M", "ҙ"), - (0x499, "V"), - (0x49A, "M", "қ"), - (0x49B, "V"), - (0x49C, "M", "ҝ"), - (0x49D, "V"), - ] - - -def _seg_8() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x49E, "M", "ҟ"), - (0x49F, "V"), - (0x4A0, "M", "ҡ"), - (0x4A1, "V"), - (0x4A2, "M", "ң"), - (0x4A3, "V"), - (0x4A4, "M", "ҥ"), - (0x4A5, "V"), - (0x4A6, "M", "ҧ"), - (0x4A7, "V"), - (0x4A8, "M", "ҩ"), - (0x4A9, "V"), - (0x4AA, "M", "ҫ"), - (0x4AB, "V"), - (0x4AC, "M", "ҭ"), - (0x4AD, "V"), - (0x4AE, "M", "ү"), - (0x4AF, "V"), - (0x4B0, "M", "ұ"), - (0x4B1, "V"), - (0x4B2, "M", "ҳ"), - (0x4B3, "V"), - (0x4B4, "M", "ҵ"), - (0x4B5, "V"), - (0x4B6, "M", "ҷ"), - (0x4B7, "V"), - (0x4B8, "M", "ҹ"), - (0x4B9, "V"), - (0x4BA, "M", "һ"), - (0x4BB, "V"), - (0x4BC, "M", "ҽ"), - (0x4BD, "V"), - (0x4BE, "M", "ҿ"), - (0x4BF, "V"), - (0x4C0, "X"), - (0x4C1, "M", "ӂ"), - (0x4C2, "V"), - (0x4C3, "M", "ӄ"), - (0x4C4, "V"), - (0x4C5, "M", "ӆ"), - (0x4C6, "V"), - (0x4C7, "M", "ӈ"), - (0x4C8, "V"), - (0x4C9, "M", "ӊ"), - (0x4CA, "V"), - (0x4CB, "M", "ӌ"), - (0x4CC, "V"), - (0x4CD, "M", "ӎ"), - (0x4CE, "V"), - (0x4D0, "M", "ӑ"), - (0x4D1, "V"), - (0x4D2, "M", "ӓ"), - (0x4D3, "V"), - (0x4D4, "M", "ӕ"), - (0x4D5, "V"), - (0x4D6, "M", "ӗ"), - (0x4D7, "V"), - (0x4D8, "M", "ә"), - (0x4D9, "V"), - (0x4DA, "M", "ӛ"), - (0x4DB, "V"), - (0x4DC, "M", "ӝ"), - (0x4DD, "V"), - (0x4DE, "M", "ӟ"), - (0x4DF, "V"), - (0x4E0, "M", "ӡ"), - (0x4E1, "V"), - (0x4E2, "M", "ӣ"), - (0x4E3, "V"), - (0x4E4, "M", "ӥ"), - (0x4E5, "V"), - (0x4E6, "M", "ӧ"), - (0x4E7, "V"), - (0x4E8, "M", "ө"), - (0x4E9, "V"), - (0x4EA, "M", "ӫ"), - (0x4EB, "V"), - (0x4EC, "M", "ӭ"), - (0x4ED, "V"), - (0x4EE, "M", "ӯ"), - (0x4EF, "V"), - (0x4F0, "M", "ӱ"), - (0x4F1, "V"), - (0x4F2, "M", "ӳ"), - (0x4F3, "V"), - (0x4F4, "M", "ӵ"), - (0x4F5, "V"), - (0x4F6, "M", "ӷ"), - (0x4F7, "V"), - (0x4F8, "M", "ӹ"), - (0x4F9, "V"), - (0x4FA, "M", "ӻ"), - (0x4FB, "V"), - (0x4FC, "M", "ӽ"), - (0x4FD, "V"), - (0x4FE, "M", "ӿ"), - (0x4FF, "V"), - (0x500, "M", "ԁ"), - (0x501, "V"), - (0x502, "M", "ԃ"), - ] - - -def _seg_9() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x503, "V"), - (0x504, "M", "ԅ"), - (0x505, "V"), - (0x506, "M", "ԇ"), - (0x507, "V"), - (0x508, "M", "ԉ"), - (0x509, "V"), - (0x50A, "M", "ԋ"), - (0x50B, "V"), - (0x50C, "M", "ԍ"), - (0x50D, "V"), - (0x50E, "M", "ԏ"), - (0x50F, "V"), - (0x510, "M", "ԑ"), - (0x511, "V"), - (0x512, "M", "ԓ"), - (0x513, "V"), - (0x514, "M", "ԕ"), - (0x515, "V"), - (0x516, "M", "ԗ"), - (0x517, "V"), - (0x518, "M", "ԙ"), - (0x519, "V"), - (0x51A, "M", "ԛ"), - (0x51B, "V"), - (0x51C, "M", "ԝ"), - (0x51D, "V"), - (0x51E, "M", "ԟ"), - (0x51F, "V"), - (0x520, "M", "ԡ"), - (0x521, "V"), - (0x522, "M", "ԣ"), - (0x523, "V"), - (0x524, "M", "ԥ"), - (0x525, "V"), - (0x526, "M", "ԧ"), - (0x527, "V"), - (0x528, "M", "ԩ"), - (0x529, "V"), - (0x52A, "M", "ԫ"), - (0x52B, "V"), - (0x52C, "M", "ԭ"), - (0x52D, "V"), - (0x52E, "M", "ԯ"), - (0x52F, "V"), - (0x530, "X"), - (0x531, "M", "ա"), - (0x532, "M", "բ"), - (0x533, "M", "գ"), - (0x534, "M", "դ"), - (0x535, "M", "ե"), - (0x536, "M", "զ"), - (0x537, "M", "է"), - (0x538, "M", "ը"), - (0x539, "M", "թ"), - (0x53A, "M", "ժ"), - (0x53B, "M", "ի"), - (0x53C, "M", "լ"), - (0x53D, "M", "խ"), - (0x53E, "M", "ծ"), - (0x53F, "M", "կ"), - (0x540, "M", "հ"), - (0x541, "M", "ձ"), - (0x542, "M", "ղ"), - (0x543, "M", "ճ"), - (0x544, "M", "մ"), - (0x545, "M", "յ"), - (0x546, "M", "ն"), - (0x547, "M", "շ"), - (0x548, "M", "ո"), - (0x549, "M", "չ"), - (0x54A, "M", "պ"), - (0x54B, "M", "ջ"), - (0x54C, "M", "ռ"), - (0x54D, "M", "ս"), - (0x54E, "M", "վ"), - (0x54F, "M", "տ"), - (0x550, "M", "ր"), - (0x551, "M", "ց"), - (0x552, "M", "ւ"), - (0x553, "M", "փ"), - (0x554, "M", "ք"), - (0x555, "M", "օ"), - (0x556, "M", "ֆ"), - (0x557, "X"), - (0x559, "V"), - (0x587, "M", "եւ"), - (0x588, "V"), - (0x58B, "X"), - (0x58D, "V"), - (0x590, "X"), - (0x591, "V"), - (0x5C8, "X"), - (0x5D0, "V"), - (0x5EB, "X"), - (0x5EF, "V"), - (0x5F5, "X"), - (0x606, "V"), - (0x61C, "X"), - (0x61D, "V"), - ] - - -def _seg_10() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x675, "M", "اٴ"), - (0x676, "M", "وٴ"), - (0x677, "M", "ۇٴ"), - (0x678, "M", "يٴ"), - (0x679, "V"), - (0x6DD, "X"), - (0x6DE, "V"), - (0x70E, "X"), - (0x710, "V"), - (0x74B, "X"), - (0x74D, "V"), - (0x7B2, "X"), - (0x7C0, "V"), - (0x7FB, "X"), - (0x7FD, "V"), - (0x82E, "X"), - (0x830, "V"), - (0x83F, "X"), - (0x840, "V"), - (0x85C, "X"), - (0x85E, "V"), - (0x85F, "X"), - (0x860, "V"), - (0x86B, "X"), - (0x870, "V"), - (0x88F, "X"), - (0x898, "V"), - (0x8E2, "X"), - (0x8E3, "V"), - (0x958, "M", "क़"), - (0x959, "M", "ख़"), - (0x95A, "M", "ग़"), - (0x95B, "M", "ज़"), - (0x95C, "M", "ड़"), - (0x95D, "M", "ढ़"), - (0x95E, "M", "फ़"), - (0x95F, "M", "य़"), - (0x960, "V"), - (0x984, "X"), - (0x985, "V"), - (0x98D, "X"), - (0x98F, "V"), - (0x991, "X"), - (0x993, "V"), - (0x9A9, "X"), - (0x9AA, "V"), - (0x9B1, "X"), - (0x9B2, "V"), - (0x9B3, "X"), - (0x9B6, "V"), - (0x9BA, "X"), - (0x9BC, "V"), - (0x9C5, "X"), - (0x9C7, "V"), - (0x9C9, "X"), - (0x9CB, "V"), - (0x9CF, "X"), - (0x9D7, "V"), - (0x9D8, "X"), - (0x9DC, "M", "ড়"), - (0x9DD, "M", "ঢ়"), - (0x9DE, "X"), - (0x9DF, "M", "য়"), - (0x9E0, "V"), - (0x9E4, "X"), - (0x9E6, "V"), - (0x9FF, "X"), - (0xA01, "V"), - (0xA04, "X"), - (0xA05, "V"), - (0xA0B, "X"), - (0xA0F, "V"), - (0xA11, "X"), - (0xA13, "V"), - (0xA29, "X"), - (0xA2A, "V"), - (0xA31, "X"), - (0xA32, "V"), - (0xA33, "M", "ਲ਼"), - (0xA34, "X"), - (0xA35, "V"), - (0xA36, "M", "ਸ਼"), - (0xA37, "X"), - (0xA38, "V"), - (0xA3A, "X"), - (0xA3C, "V"), - (0xA3D, "X"), - (0xA3E, "V"), - (0xA43, "X"), - (0xA47, "V"), - (0xA49, "X"), - (0xA4B, "V"), - (0xA4E, "X"), - (0xA51, "V"), - (0xA52, "X"), - (0xA59, "M", "ਖ਼"), - (0xA5A, "M", "ਗ਼"), - (0xA5B, "M", "ਜ਼"), - (0xA5C, "V"), - (0xA5D, "X"), - ] - - -def _seg_11() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xA5E, "M", "ਫ਼"), - (0xA5F, "X"), - (0xA66, "V"), - (0xA77, "X"), - (0xA81, "V"), - (0xA84, "X"), - (0xA85, "V"), - (0xA8E, "X"), - (0xA8F, "V"), - (0xA92, "X"), - (0xA93, "V"), - (0xAA9, "X"), - (0xAAA, "V"), - (0xAB1, "X"), - (0xAB2, "V"), - (0xAB4, "X"), - (0xAB5, "V"), - (0xABA, "X"), - (0xABC, "V"), - (0xAC6, "X"), - (0xAC7, "V"), - (0xACA, "X"), - (0xACB, "V"), - (0xACE, "X"), - (0xAD0, "V"), - (0xAD1, "X"), - (0xAE0, "V"), - (0xAE4, "X"), - (0xAE6, "V"), - (0xAF2, "X"), - (0xAF9, "V"), - (0xB00, "X"), - (0xB01, "V"), - (0xB04, "X"), - (0xB05, "V"), - (0xB0D, "X"), - (0xB0F, "V"), - (0xB11, "X"), - (0xB13, "V"), - (0xB29, "X"), - (0xB2A, "V"), - (0xB31, "X"), - (0xB32, "V"), - (0xB34, "X"), - (0xB35, "V"), - (0xB3A, "X"), - (0xB3C, "V"), - (0xB45, "X"), - (0xB47, "V"), - (0xB49, "X"), - (0xB4B, "V"), - (0xB4E, "X"), - (0xB55, "V"), - (0xB58, "X"), - (0xB5C, "M", "ଡ଼"), - (0xB5D, "M", "ଢ଼"), - (0xB5E, "X"), - (0xB5F, "V"), - (0xB64, "X"), - (0xB66, "V"), - (0xB78, "X"), - (0xB82, "V"), - (0xB84, "X"), - (0xB85, "V"), - (0xB8B, "X"), - (0xB8E, "V"), - (0xB91, "X"), - (0xB92, "V"), - (0xB96, "X"), - (0xB99, "V"), - (0xB9B, "X"), - (0xB9C, "V"), - (0xB9D, "X"), - (0xB9E, "V"), - (0xBA0, "X"), - (0xBA3, "V"), - (0xBA5, "X"), - (0xBA8, "V"), - (0xBAB, "X"), - (0xBAE, "V"), - (0xBBA, "X"), - (0xBBE, "V"), - (0xBC3, "X"), - (0xBC6, "V"), - (0xBC9, "X"), - (0xBCA, "V"), - (0xBCE, "X"), - (0xBD0, "V"), - (0xBD1, "X"), - (0xBD7, "V"), - (0xBD8, "X"), - (0xBE6, "V"), - (0xBFB, "X"), - (0xC00, "V"), - (0xC0D, "X"), - (0xC0E, "V"), - (0xC11, "X"), - (0xC12, "V"), - (0xC29, "X"), - (0xC2A, "V"), - ] - - -def _seg_12() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xC3A, "X"), - (0xC3C, "V"), - (0xC45, "X"), - (0xC46, "V"), - (0xC49, "X"), - (0xC4A, "V"), - (0xC4E, "X"), - (0xC55, "V"), - (0xC57, "X"), - (0xC58, "V"), - (0xC5B, "X"), - (0xC5D, "V"), - (0xC5E, "X"), - (0xC60, "V"), - (0xC64, "X"), - (0xC66, "V"), - (0xC70, "X"), - (0xC77, "V"), - (0xC8D, "X"), - (0xC8E, "V"), - (0xC91, "X"), - (0xC92, "V"), - (0xCA9, "X"), - (0xCAA, "V"), - (0xCB4, "X"), - (0xCB5, "V"), - (0xCBA, "X"), - (0xCBC, "V"), - (0xCC5, "X"), - (0xCC6, "V"), - (0xCC9, "X"), - (0xCCA, "V"), - (0xCCE, "X"), - (0xCD5, "V"), - (0xCD7, "X"), - (0xCDD, "V"), - (0xCDF, "X"), - (0xCE0, "V"), - (0xCE4, "X"), - (0xCE6, "V"), - (0xCF0, "X"), - (0xCF1, "V"), - (0xCF4, "X"), - (0xD00, "V"), - (0xD0D, "X"), - (0xD0E, "V"), - (0xD11, "X"), - (0xD12, "V"), - (0xD45, "X"), - (0xD46, "V"), - (0xD49, "X"), - (0xD4A, "V"), - (0xD50, "X"), - (0xD54, "V"), - (0xD64, "X"), - (0xD66, "V"), - (0xD80, "X"), - (0xD81, "V"), - (0xD84, "X"), - (0xD85, "V"), - (0xD97, "X"), - (0xD9A, "V"), - (0xDB2, "X"), - (0xDB3, "V"), - (0xDBC, "X"), - (0xDBD, "V"), - (0xDBE, "X"), - (0xDC0, "V"), - (0xDC7, "X"), - (0xDCA, "V"), - (0xDCB, "X"), - (0xDCF, "V"), - (0xDD5, "X"), - (0xDD6, "V"), - (0xDD7, "X"), - (0xDD8, "V"), - (0xDE0, "X"), - (0xDE6, "V"), - (0xDF0, "X"), - (0xDF2, "V"), - (0xDF5, "X"), - (0xE01, "V"), - (0xE33, "M", "ํา"), - (0xE34, "V"), - (0xE3B, "X"), - (0xE3F, "V"), - (0xE5C, "X"), - (0xE81, "V"), - (0xE83, "X"), - (0xE84, "V"), - (0xE85, "X"), - (0xE86, "V"), - (0xE8B, "X"), - (0xE8C, "V"), - (0xEA4, "X"), - (0xEA5, "V"), - (0xEA6, "X"), - (0xEA7, "V"), - (0xEB3, "M", "ໍາ"), - (0xEB4, "V"), - ] - - -def _seg_13() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xEBE, "X"), - (0xEC0, "V"), - (0xEC5, "X"), - (0xEC6, "V"), - (0xEC7, "X"), - (0xEC8, "V"), - (0xECF, "X"), - (0xED0, "V"), - (0xEDA, "X"), - (0xEDC, "M", "ຫນ"), - (0xEDD, "M", "ຫມ"), - (0xEDE, "V"), - (0xEE0, "X"), - (0xF00, "V"), - (0xF0C, "M", "་"), - (0xF0D, "V"), - (0xF43, "M", "གྷ"), - (0xF44, "V"), - (0xF48, "X"), - (0xF49, "V"), - (0xF4D, "M", "ཌྷ"), - (0xF4E, "V"), - (0xF52, "M", "དྷ"), - (0xF53, "V"), - (0xF57, "M", "བྷ"), - (0xF58, "V"), - (0xF5C, "M", "ཛྷ"), - (0xF5D, "V"), - (0xF69, "M", "ཀྵ"), - (0xF6A, "V"), - (0xF6D, "X"), - (0xF71, "V"), - (0xF73, "M", "ཱི"), - (0xF74, "V"), - (0xF75, "M", "ཱུ"), - (0xF76, "M", "ྲྀ"), - (0xF77, "M", "ྲཱྀ"), - (0xF78, "M", "ླྀ"), - (0xF79, "M", "ླཱྀ"), - (0xF7A, "V"), - (0xF81, "M", "ཱྀ"), - (0xF82, "V"), - (0xF93, "M", "ྒྷ"), - (0xF94, "V"), - (0xF98, "X"), - (0xF99, "V"), - (0xF9D, "M", "ྜྷ"), - (0xF9E, "V"), - (0xFA2, "M", "ྡྷ"), - (0xFA3, "V"), - (0xFA7, "M", "ྦྷ"), - (0xFA8, "V"), - (0xFAC, "M", "ྫྷ"), - (0xFAD, "V"), - (0xFB9, "M", "ྐྵ"), - (0xFBA, "V"), - (0xFBD, "X"), - (0xFBE, "V"), - (0xFCD, "X"), - (0xFCE, "V"), - (0xFDB, "X"), - (0x1000, "V"), - (0x10A0, "X"), - (0x10C7, "M", "ⴧ"), - (0x10C8, "X"), - (0x10CD, "M", "ⴭ"), - (0x10CE, "X"), - (0x10D0, "V"), - (0x10FC, "M", "ნ"), - (0x10FD, "V"), - (0x115F, "X"), - (0x1161, "V"), - (0x1249, "X"), - (0x124A, "V"), - (0x124E, "X"), - (0x1250, "V"), - (0x1257, "X"), - (0x1258, "V"), - (0x1259, "X"), - (0x125A, "V"), - (0x125E, "X"), - (0x1260, "V"), - (0x1289, "X"), - (0x128A, "V"), - (0x128E, "X"), - (0x1290, "V"), - (0x12B1, "X"), - (0x12B2, "V"), - (0x12B6, "X"), - (0x12B8, "V"), - (0x12BF, "X"), - (0x12C0, "V"), - (0x12C1, "X"), - (0x12C2, "V"), - (0x12C6, "X"), - (0x12C8, "V"), - (0x12D7, "X"), - (0x12D8, "V"), - (0x1311, "X"), - (0x1312, "V"), - ] - - -def _seg_14() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1316, "X"), - (0x1318, "V"), - (0x135B, "X"), - (0x135D, "V"), - (0x137D, "X"), - (0x1380, "V"), - (0x139A, "X"), - (0x13A0, "V"), - (0x13F6, "X"), - (0x13F8, "M", "Ᏸ"), - (0x13F9, "M", "Ᏹ"), - (0x13FA, "M", "Ᏺ"), - (0x13FB, "M", "Ᏻ"), - (0x13FC, "M", "Ᏼ"), - (0x13FD, "M", "Ᏽ"), - (0x13FE, "X"), - (0x1400, "V"), - (0x1680, "X"), - (0x1681, "V"), - (0x169D, "X"), - (0x16A0, "V"), - (0x16F9, "X"), - (0x1700, "V"), - (0x1716, "X"), - (0x171F, "V"), - (0x1737, "X"), - (0x1740, "V"), - (0x1754, "X"), - (0x1760, "V"), - (0x176D, "X"), - (0x176E, "V"), - (0x1771, "X"), - (0x1772, "V"), - (0x1774, "X"), - (0x1780, "V"), - (0x17B4, "X"), - (0x17B6, "V"), - (0x17DE, "X"), - (0x17E0, "V"), - (0x17EA, "X"), - (0x17F0, "V"), - (0x17FA, "X"), - (0x1800, "V"), - (0x1806, "X"), - (0x1807, "V"), - (0x180B, "I"), - (0x180E, "X"), - (0x180F, "I"), - (0x1810, "V"), - (0x181A, "X"), - (0x1820, "V"), - (0x1879, "X"), - (0x1880, "V"), - (0x18AB, "X"), - (0x18B0, "V"), - (0x18F6, "X"), - (0x1900, "V"), - (0x191F, "X"), - (0x1920, "V"), - (0x192C, "X"), - (0x1930, "V"), - (0x193C, "X"), - (0x1940, "V"), - (0x1941, "X"), - (0x1944, "V"), - (0x196E, "X"), - (0x1970, "V"), - (0x1975, "X"), - (0x1980, "V"), - (0x19AC, "X"), - (0x19B0, "V"), - (0x19CA, "X"), - (0x19D0, "V"), - (0x19DB, "X"), - (0x19DE, "V"), - (0x1A1C, "X"), - (0x1A1E, "V"), - (0x1A5F, "X"), - (0x1A60, "V"), - (0x1A7D, "X"), - (0x1A7F, "V"), - (0x1A8A, "X"), - (0x1A90, "V"), - (0x1A9A, "X"), - (0x1AA0, "V"), - (0x1AAE, "X"), - (0x1AB0, "V"), - (0x1ACF, "X"), - (0x1B00, "V"), - (0x1B4D, "X"), - (0x1B50, "V"), - (0x1B7F, "X"), - (0x1B80, "V"), - (0x1BF4, "X"), - (0x1BFC, "V"), - (0x1C38, "X"), - (0x1C3B, "V"), - (0x1C4A, "X"), - (0x1C4D, "V"), - (0x1C80, "M", "в"), - ] - - -def _seg_15() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1C81, "M", "д"), - (0x1C82, "M", "о"), - (0x1C83, "M", "с"), - (0x1C84, "M", "т"), - (0x1C86, "M", "ъ"), - (0x1C87, "M", "ѣ"), - (0x1C88, "M", "ꙋ"), - (0x1C89, "X"), - (0x1C90, "M", "ა"), - (0x1C91, "M", "ბ"), - (0x1C92, "M", "გ"), - (0x1C93, "M", "დ"), - (0x1C94, "M", "ე"), - (0x1C95, "M", "ვ"), - (0x1C96, "M", "ზ"), - (0x1C97, "M", "თ"), - (0x1C98, "M", "ი"), - (0x1C99, "M", "კ"), - (0x1C9A, "M", "ლ"), - (0x1C9B, "M", "მ"), - (0x1C9C, "M", "ნ"), - (0x1C9D, "M", "ო"), - (0x1C9E, "M", "პ"), - (0x1C9F, "M", "ჟ"), - (0x1CA0, "M", "რ"), - (0x1CA1, "M", "ს"), - (0x1CA2, "M", "ტ"), - (0x1CA3, "M", "უ"), - (0x1CA4, "M", "ფ"), - (0x1CA5, "M", "ქ"), - (0x1CA6, "M", "ღ"), - (0x1CA7, "M", "ყ"), - (0x1CA8, "M", "შ"), - (0x1CA9, "M", "ჩ"), - (0x1CAA, "M", "ც"), - (0x1CAB, "M", "ძ"), - (0x1CAC, "M", "წ"), - (0x1CAD, "M", "ჭ"), - (0x1CAE, "M", "ხ"), - (0x1CAF, "M", "ჯ"), - (0x1CB0, "M", "ჰ"), - (0x1CB1, "M", "ჱ"), - (0x1CB2, "M", "ჲ"), - (0x1CB3, "M", "ჳ"), - (0x1CB4, "M", "ჴ"), - (0x1CB5, "M", "ჵ"), - (0x1CB6, "M", "ჶ"), - (0x1CB7, "M", "ჷ"), - (0x1CB8, "M", "ჸ"), - (0x1CB9, "M", "ჹ"), - (0x1CBA, "M", "ჺ"), - (0x1CBB, "X"), - (0x1CBD, "M", "ჽ"), - (0x1CBE, "M", "ჾ"), - (0x1CBF, "M", "ჿ"), - (0x1CC0, "V"), - (0x1CC8, "X"), - (0x1CD0, "V"), - (0x1CFB, "X"), - (0x1D00, "V"), - (0x1D2C, "M", "a"), - (0x1D2D, "M", "æ"), - (0x1D2E, "M", "b"), - (0x1D2F, "V"), - (0x1D30, "M", "d"), - (0x1D31, "M", "e"), - (0x1D32, "M", "ǝ"), - (0x1D33, "M", "g"), - (0x1D34, "M", "h"), - (0x1D35, "M", "i"), - (0x1D36, "M", "j"), - (0x1D37, "M", "k"), - (0x1D38, "M", "l"), - (0x1D39, "M", "m"), - (0x1D3A, "M", "n"), - (0x1D3B, "V"), - (0x1D3C, "M", "o"), - (0x1D3D, "M", "ȣ"), - (0x1D3E, "M", "p"), - (0x1D3F, "M", "r"), - (0x1D40, "M", "t"), - (0x1D41, "M", "u"), - (0x1D42, "M", "w"), - (0x1D43, "M", "a"), - (0x1D44, "M", "ɐ"), - (0x1D45, "M", "ɑ"), - (0x1D46, "M", "ᴂ"), - (0x1D47, "M", "b"), - (0x1D48, "M", "d"), - (0x1D49, "M", "e"), - (0x1D4A, "M", "ə"), - (0x1D4B, "M", "ɛ"), - (0x1D4C, "M", "ɜ"), - (0x1D4D, "M", "g"), - (0x1D4E, "V"), - (0x1D4F, "M", "k"), - (0x1D50, "M", "m"), - (0x1D51, "M", "ŋ"), - (0x1D52, "M", "o"), - (0x1D53, "M", "ɔ"), - ] - - -def _seg_16() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D54, "M", "ᴖ"), - (0x1D55, "M", "ᴗ"), - (0x1D56, "M", "p"), - (0x1D57, "M", "t"), - (0x1D58, "M", "u"), - (0x1D59, "M", "ᴝ"), - (0x1D5A, "M", "ɯ"), - (0x1D5B, "M", "v"), - (0x1D5C, "M", "ᴥ"), - (0x1D5D, "M", "β"), - (0x1D5E, "M", "γ"), - (0x1D5F, "M", "δ"), - (0x1D60, "M", "φ"), - (0x1D61, "M", "χ"), - (0x1D62, "M", "i"), - (0x1D63, "M", "r"), - (0x1D64, "M", "u"), - (0x1D65, "M", "v"), - (0x1D66, "M", "β"), - (0x1D67, "M", "γ"), - (0x1D68, "M", "ρ"), - (0x1D69, "M", "φ"), - (0x1D6A, "M", "χ"), - (0x1D6B, "V"), - (0x1D78, "M", "н"), - (0x1D79, "V"), - (0x1D9B, "M", "ɒ"), - (0x1D9C, "M", "c"), - (0x1D9D, "M", "ɕ"), - (0x1D9E, "M", "ð"), - (0x1D9F, "M", "ɜ"), - (0x1DA0, "M", "f"), - (0x1DA1, "M", "ɟ"), - (0x1DA2, "M", "ɡ"), - (0x1DA3, "M", "ɥ"), - (0x1DA4, "M", "ɨ"), - (0x1DA5, "M", "ɩ"), - (0x1DA6, "M", "ɪ"), - (0x1DA7, "M", "ᵻ"), - (0x1DA8, "M", "ʝ"), - (0x1DA9, "M", "ɭ"), - (0x1DAA, "M", "ᶅ"), - (0x1DAB, "M", "ʟ"), - (0x1DAC, "M", "ɱ"), - (0x1DAD, "M", "ɰ"), - (0x1DAE, "M", "ɲ"), - (0x1DAF, "M", "ɳ"), - (0x1DB0, "M", "ɴ"), - (0x1DB1, "M", "ɵ"), - (0x1DB2, "M", "ɸ"), - (0x1DB3, "M", "ʂ"), - (0x1DB4, "M", "ʃ"), - (0x1DB5, "M", "ƫ"), - (0x1DB6, "M", "ʉ"), - (0x1DB7, "M", "ʊ"), - (0x1DB8, "M", "ᴜ"), - (0x1DB9, "M", "ʋ"), - (0x1DBA, "M", "ʌ"), - (0x1DBB, "M", "z"), - (0x1DBC, "M", "ʐ"), - (0x1DBD, "M", "ʑ"), - (0x1DBE, "M", "ʒ"), - (0x1DBF, "M", "θ"), - (0x1DC0, "V"), - (0x1E00, "M", "ḁ"), - (0x1E01, "V"), - (0x1E02, "M", "ḃ"), - (0x1E03, "V"), - (0x1E04, "M", "ḅ"), - (0x1E05, "V"), - (0x1E06, "M", "ḇ"), - (0x1E07, "V"), - (0x1E08, "M", "ḉ"), - (0x1E09, "V"), - (0x1E0A, "M", "ḋ"), - (0x1E0B, "V"), - (0x1E0C, "M", "ḍ"), - (0x1E0D, "V"), - (0x1E0E, "M", "ḏ"), - (0x1E0F, "V"), - (0x1E10, "M", "ḑ"), - (0x1E11, "V"), - (0x1E12, "M", "ḓ"), - (0x1E13, "V"), - (0x1E14, "M", "ḕ"), - (0x1E15, "V"), - (0x1E16, "M", "ḗ"), - (0x1E17, "V"), - (0x1E18, "M", "ḙ"), - (0x1E19, "V"), - (0x1E1A, "M", "ḛ"), - (0x1E1B, "V"), - (0x1E1C, "M", "ḝ"), - (0x1E1D, "V"), - (0x1E1E, "M", "ḟ"), - (0x1E1F, "V"), - (0x1E20, "M", "ḡ"), - (0x1E21, "V"), - (0x1E22, "M", "ḣ"), - (0x1E23, "V"), - ] - - -def _seg_17() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1E24, "M", "ḥ"), - (0x1E25, "V"), - (0x1E26, "M", "ḧ"), - (0x1E27, "V"), - (0x1E28, "M", "ḩ"), - (0x1E29, "V"), - (0x1E2A, "M", "ḫ"), - (0x1E2B, "V"), - (0x1E2C, "M", "ḭ"), - (0x1E2D, "V"), - (0x1E2E, "M", "ḯ"), - (0x1E2F, "V"), - (0x1E30, "M", "ḱ"), - (0x1E31, "V"), - (0x1E32, "M", "ḳ"), - (0x1E33, "V"), - (0x1E34, "M", "ḵ"), - (0x1E35, "V"), - (0x1E36, "M", "ḷ"), - (0x1E37, "V"), - (0x1E38, "M", "ḹ"), - (0x1E39, "V"), - (0x1E3A, "M", "ḻ"), - (0x1E3B, "V"), - (0x1E3C, "M", "ḽ"), - (0x1E3D, "V"), - (0x1E3E, "M", "ḿ"), - (0x1E3F, "V"), - (0x1E40, "M", "ṁ"), - (0x1E41, "V"), - (0x1E42, "M", "ṃ"), - (0x1E43, "V"), - (0x1E44, "M", "ṅ"), - (0x1E45, "V"), - (0x1E46, "M", "ṇ"), - (0x1E47, "V"), - (0x1E48, "M", "ṉ"), - (0x1E49, "V"), - (0x1E4A, "M", "ṋ"), - (0x1E4B, "V"), - (0x1E4C, "M", "ṍ"), - (0x1E4D, "V"), - (0x1E4E, "M", "ṏ"), - (0x1E4F, "V"), - (0x1E50, "M", "ṑ"), - (0x1E51, "V"), - (0x1E52, "M", "ṓ"), - (0x1E53, "V"), - (0x1E54, "M", "ṕ"), - (0x1E55, "V"), - (0x1E56, "M", "ṗ"), - (0x1E57, "V"), - (0x1E58, "M", "ṙ"), - (0x1E59, "V"), - (0x1E5A, "M", "ṛ"), - (0x1E5B, "V"), - (0x1E5C, "M", "ṝ"), - (0x1E5D, "V"), - (0x1E5E, "M", "ṟ"), - (0x1E5F, "V"), - (0x1E60, "M", "ṡ"), - (0x1E61, "V"), - (0x1E62, "M", "ṣ"), - (0x1E63, "V"), - (0x1E64, "M", "ṥ"), - (0x1E65, "V"), - (0x1E66, "M", "ṧ"), - (0x1E67, "V"), - (0x1E68, "M", "ṩ"), - (0x1E69, "V"), - (0x1E6A, "M", "ṫ"), - (0x1E6B, "V"), - (0x1E6C, "M", "ṭ"), - (0x1E6D, "V"), - (0x1E6E, "M", "ṯ"), - (0x1E6F, "V"), - (0x1E70, "M", "ṱ"), - (0x1E71, "V"), - (0x1E72, "M", "ṳ"), - (0x1E73, "V"), - (0x1E74, "M", "ṵ"), - (0x1E75, "V"), - (0x1E76, "M", "ṷ"), - (0x1E77, "V"), - (0x1E78, "M", "ṹ"), - (0x1E79, "V"), - (0x1E7A, "M", "ṻ"), - (0x1E7B, "V"), - (0x1E7C, "M", "ṽ"), - (0x1E7D, "V"), - (0x1E7E, "M", "ṿ"), - (0x1E7F, "V"), - (0x1E80, "M", "ẁ"), - (0x1E81, "V"), - (0x1E82, "M", "ẃ"), - (0x1E83, "V"), - (0x1E84, "M", "ẅ"), - (0x1E85, "V"), - (0x1E86, "M", "ẇ"), - (0x1E87, "V"), - ] - - -def _seg_18() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1E88, "M", "ẉ"), - (0x1E89, "V"), - (0x1E8A, "M", "ẋ"), - (0x1E8B, "V"), - (0x1E8C, "M", "ẍ"), - (0x1E8D, "V"), - (0x1E8E, "M", "ẏ"), - (0x1E8F, "V"), - (0x1E90, "M", "ẑ"), - (0x1E91, "V"), - (0x1E92, "M", "ẓ"), - (0x1E93, "V"), - (0x1E94, "M", "ẕ"), - (0x1E95, "V"), - (0x1E9A, "M", "aʾ"), - (0x1E9B, "M", "ṡ"), - (0x1E9C, "V"), - (0x1E9E, "M", "ß"), - (0x1E9F, "V"), - (0x1EA0, "M", "ạ"), - (0x1EA1, "V"), - (0x1EA2, "M", "ả"), - (0x1EA3, "V"), - (0x1EA4, "M", "ấ"), - (0x1EA5, "V"), - (0x1EA6, "M", "ầ"), - (0x1EA7, "V"), - (0x1EA8, "M", "ẩ"), - (0x1EA9, "V"), - (0x1EAA, "M", "ẫ"), - (0x1EAB, "V"), - (0x1EAC, "M", "ậ"), - (0x1EAD, "V"), - (0x1EAE, "M", "ắ"), - (0x1EAF, "V"), - (0x1EB0, "M", "ằ"), - (0x1EB1, "V"), - (0x1EB2, "M", "ẳ"), - (0x1EB3, "V"), - (0x1EB4, "M", "ẵ"), - (0x1EB5, "V"), - (0x1EB6, "M", "ặ"), - (0x1EB7, "V"), - (0x1EB8, "M", "ẹ"), - (0x1EB9, "V"), - (0x1EBA, "M", "ẻ"), - (0x1EBB, "V"), - (0x1EBC, "M", "ẽ"), - (0x1EBD, "V"), - (0x1EBE, "M", "ế"), - (0x1EBF, "V"), - (0x1EC0, "M", "ề"), - (0x1EC1, "V"), - (0x1EC2, "M", "ể"), - (0x1EC3, "V"), - (0x1EC4, "M", "ễ"), - (0x1EC5, "V"), - (0x1EC6, "M", "ệ"), - (0x1EC7, "V"), - (0x1EC8, "M", "ỉ"), - (0x1EC9, "V"), - (0x1ECA, "M", "ị"), - (0x1ECB, "V"), - (0x1ECC, "M", "ọ"), - (0x1ECD, "V"), - (0x1ECE, "M", "ỏ"), - (0x1ECF, "V"), - (0x1ED0, "M", "ố"), - (0x1ED1, "V"), - (0x1ED2, "M", "ồ"), - (0x1ED3, "V"), - (0x1ED4, "M", "ổ"), - (0x1ED5, "V"), - (0x1ED6, "M", "ỗ"), - (0x1ED7, "V"), - (0x1ED8, "M", "ộ"), - (0x1ED9, "V"), - (0x1EDA, "M", "ớ"), - (0x1EDB, "V"), - (0x1EDC, "M", "ờ"), - (0x1EDD, "V"), - (0x1EDE, "M", "ở"), - (0x1EDF, "V"), - (0x1EE0, "M", "ỡ"), - (0x1EE1, "V"), - (0x1EE2, "M", "ợ"), - (0x1EE3, "V"), - (0x1EE4, "M", "ụ"), - (0x1EE5, "V"), - (0x1EE6, "M", "ủ"), - (0x1EE7, "V"), - (0x1EE8, "M", "ứ"), - (0x1EE9, "V"), - (0x1EEA, "M", "ừ"), - (0x1EEB, "V"), - (0x1EEC, "M", "ử"), - (0x1EED, "V"), - (0x1EEE, "M", "ữ"), - (0x1EEF, "V"), - (0x1EF0, "M", "ự"), - ] - - -def _seg_19() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1EF1, "V"), - (0x1EF2, "M", "ỳ"), - (0x1EF3, "V"), - (0x1EF4, "M", "ỵ"), - (0x1EF5, "V"), - (0x1EF6, "M", "ỷ"), - (0x1EF7, "V"), - (0x1EF8, "M", "ỹ"), - (0x1EF9, "V"), - (0x1EFA, "M", "ỻ"), - (0x1EFB, "V"), - (0x1EFC, "M", "ỽ"), - (0x1EFD, "V"), - (0x1EFE, "M", "ỿ"), - (0x1EFF, "V"), - (0x1F08, "M", "ἀ"), - (0x1F09, "M", "ἁ"), - (0x1F0A, "M", "ἂ"), - (0x1F0B, "M", "ἃ"), - (0x1F0C, "M", "ἄ"), - (0x1F0D, "M", "ἅ"), - (0x1F0E, "M", "ἆ"), - (0x1F0F, "M", "ἇ"), - (0x1F10, "V"), - (0x1F16, "X"), - (0x1F18, "M", "ἐ"), - (0x1F19, "M", "ἑ"), - (0x1F1A, "M", "ἒ"), - (0x1F1B, "M", "ἓ"), - (0x1F1C, "M", "ἔ"), - (0x1F1D, "M", "ἕ"), - (0x1F1E, "X"), - (0x1F20, "V"), - (0x1F28, "M", "ἠ"), - (0x1F29, "M", "ἡ"), - (0x1F2A, "M", "ἢ"), - (0x1F2B, "M", "ἣ"), - (0x1F2C, "M", "ἤ"), - (0x1F2D, "M", "ἥ"), - (0x1F2E, "M", "ἦ"), - (0x1F2F, "M", "ἧ"), - (0x1F30, "V"), - (0x1F38, "M", "ἰ"), - (0x1F39, "M", "ἱ"), - (0x1F3A, "M", "ἲ"), - (0x1F3B, "M", "ἳ"), - (0x1F3C, "M", "ἴ"), - (0x1F3D, "M", "ἵ"), - (0x1F3E, "M", "ἶ"), - (0x1F3F, "M", "ἷ"), - (0x1F40, "V"), - (0x1F46, "X"), - (0x1F48, "M", "ὀ"), - (0x1F49, "M", "ὁ"), - (0x1F4A, "M", "ὂ"), - (0x1F4B, "M", "ὃ"), - (0x1F4C, "M", "ὄ"), - (0x1F4D, "M", "ὅ"), - (0x1F4E, "X"), - (0x1F50, "V"), - (0x1F58, "X"), - (0x1F59, "M", "ὑ"), - (0x1F5A, "X"), - (0x1F5B, "M", "ὓ"), - (0x1F5C, "X"), - (0x1F5D, "M", "ὕ"), - (0x1F5E, "X"), - (0x1F5F, "M", "ὗ"), - (0x1F60, "V"), - (0x1F68, "M", "ὠ"), - (0x1F69, "M", "ὡ"), - (0x1F6A, "M", "ὢ"), - (0x1F6B, "M", "ὣ"), - (0x1F6C, "M", "ὤ"), - (0x1F6D, "M", "ὥ"), - (0x1F6E, "M", "ὦ"), - (0x1F6F, "M", "ὧ"), - (0x1F70, "V"), - (0x1F71, "M", "ά"), - (0x1F72, "V"), - (0x1F73, "M", "έ"), - (0x1F74, "V"), - (0x1F75, "M", "ή"), - (0x1F76, "V"), - (0x1F77, "M", "ί"), - (0x1F78, "V"), - (0x1F79, "M", "ό"), - (0x1F7A, "V"), - (0x1F7B, "M", "ύ"), - (0x1F7C, "V"), - (0x1F7D, "M", "ώ"), - (0x1F7E, "X"), - (0x1F80, "M", "ἀι"), - (0x1F81, "M", "ἁι"), - (0x1F82, "M", "ἂι"), - (0x1F83, "M", "ἃι"), - (0x1F84, "M", "ἄι"), - (0x1F85, "M", "ἅι"), - (0x1F86, "M", "ἆι"), - (0x1F87, "M", "ἇι"), - ] - - -def _seg_20() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1F88, "M", "ἀι"), - (0x1F89, "M", "ἁι"), - (0x1F8A, "M", "ἂι"), - (0x1F8B, "M", "ἃι"), - (0x1F8C, "M", "ἄι"), - (0x1F8D, "M", "ἅι"), - (0x1F8E, "M", "ἆι"), - (0x1F8F, "M", "ἇι"), - (0x1F90, "M", "ἠι"), - (0x1F91, "M", "ἡι"), - (0x1F92, "M", "ἢι"), - (0x1F93, "M", "ἣι"), - (0x1F94, "M", "ἤι"), - (0x1F95, "M", "ἥι"), - (0x1F96, "M", "ἦι"), - (0x1F97, "M", "ἧι"), - (0x1F98, "M", "ἠι"), - (0x1F99, "M", "ἡι"), - (0x1F9A, "M", "ἢι"), - (0x1F9B, "M", "ἣι"), - (0x1F9C, "M", "ἤι"), - (0x1F9D, "M", "ἥι"), - (0x1F9E, "M", "ἦι"), - (0x1F9F, "M", "ἧι"), - (0x1FA0, "M", "ὠι"), - (0x1FA1, "M", "ὡι"), - (0x1FA2, "M", "ὢι"), - (0x1FA3, "M", "ὣι"), - (0x1FA4, "M", "ὤι"), - (0x1FA5, "M", "ὥι"), - (0x1FA6, "M", "ὦι"), - (0x1FA7, "M", "ὧι"), - (0x1FA8, "M", "ὠι"), - (0x1FA9, "M", "ὡι"), - (0x1FAA, "M", "ὢι"), - (0x1FAB, "M", "ὣι"), - (0x1FAC, "M", "ὤι"), - (0x1FAD, "M", "ὥι"), - (0x1FAE, "M", "ὦι"), - (0x1FAF, "M", "ὧι"), - (0x1FB0, "V"), - (0x1FB2, "M", "ὰι"), - (0x1FB3, "M", "αι"), - (0x1FB4, "M", "άι"), - (0x1FB5, "X"), - (0x1FB6, "V"), - (0x1FB7, "M", "ᾶι"), - (0x1FB8, "M", "ᾰ"), - (0x1FB9, "M", "ᾱ"), - (0x1FBA, "M", "ὰ"), - (0x1FBB, "M", "ά"), - (0x1FBC, "M", "αι"), - (0x1FBD, "3", " ̓"), - (0x1FBE, "M", "ι"), - (0x1FBF, "3", " ̓"), - (0x1FC0, "3", " ͂"), - (0x1FC1, "3", " ̈͂"), - (0x1FC2, "M", "ὴι"), - (0x1FC3, "M", "ηι"), - (0x1FC4, "M", "ήι"), - (0x1FC5, "X"), - (0x1FC6, "V"), - (0x1FC7, "M", "ῆι"), - (0x1FC8, "M", "ὲ"), - (0x1FC9, "M", "έ"), - (0x1FCA, "M", "ὴ"), - (0x1FCB, "M", "ή"), - (0x1FCC, "M", "ηι"), - (0x1FCD, "3", " ̓̀"), - (0x1FCE, "3", " ̓́"), - (0x1FCF, "3", " ̓͂"), - (0x1FD0, "V"), - (0x1FD3, "M", "ΐ"), - (0x1FD4, "X"), - (0x1FD6, "V"), - (0x1FD8, "M", "ῐ"), - (0x1FD9, "M", "ῑ"), - (0x1FDA, "M", "ὶ"), - (0x1FDB, "M", "ί"), - (0x1FDC, "X"), - (0x1FDD, "3", " ̔̀"), - (0x1FDE, "3", " ̔́"), - (0x1FDF, "3", " ̔͂"), - (0x1FE0, "V"), - (0x1FE3, "M", "ΰ"), - (0x1FE4, "V"), - (0x1FE8, "M", "ῠ"), - (0x1FE9, "M", "ῡ"), - (0x1FEA, "M", "ὺ"), - (0x1FEB, "M", "ύ"), - (0x1FEC, "M", "ῥ"), - (0x1FED, "3", " ̈̀"), - (0x1FEE, "3", " ̈́"), - (0x1FEF, "3", "`"), - (0x1FF0, "X"), - (0x1FF2, "M", "ὼι"), - (0x1FF3, "M", "ωι"), - (0x1FF4, "M", "ώι"), - (0x1FF5, "X"), - (0x1FF6, "V"), - ] - - -def _seg_21() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1FF7, "M", "ῶι"), - (0x1FF8, "M", "ὸ"), - (0x1FF9, "M", "ό"), - (0x1FFA, "M", "ὼ"), - (0x1FFB, "M", "ώ"), - (0x1FFC, "M", "ωι"), - (0x1FFD, "3", " ́"), - (0x1FFE, "3", " ̔"), - (0x1FFF, "X"), - (0x2000, "3", " "), - (0x200B, "I"), - (0x200C, "D", ""), - (0x200E, "X"), - (0x2010, "V"), - (0x2011, "M", "‐"), - (0x2012, "V"), - (0x2017, "3", " ̳"), - (0x2018, "V"), - (0x2024, "X"), - (0x2027, "V"), - (0x2028, "X"), - (0x202F, "3", " "), - (0x2030, "V"), - (0x2033, "M", "′′"), - (0x2034, "M", "′′′"), - (0x2035, "V"), - (0x2036, "M", "‵‵"), - (0x2037, "M", "‵‵‵"), - (0x2038, "V"), - (0x203C, "3", "!!"), - (0x203D, "V"), - (0x203E, "3", " ̅"), - (0x203F, "V"), - (0x2047, "3", "??"), - (0x2048, "3", "?!"), - (0x2049, "3", "!?"), - (0x204A, "V"), - (0x2057, "M", "′′′′"), - (0x2058, "V"), - (0x205F, "3", " "), - (0x2060, "I"), - (0x2061, "X"), - (0x2064, "I"), - (0x2065, "X"), - (0x2070, "M", "0"), - (0x2071, "M", "i"), - (0x2072, "X"), - (0x2074, "M", "4"), - (0x2075, "M", "5"), - (0x2076, "M", "6"), - (0x2077, "M", "7"), - (0x2078, "M", "8"), - (0x2079, "M", "9"), - (0x207A, "3", "+"), - (0x207B, "M", "−"), - (0x207C, "3", "="), - (0x207D, "3", "("), - (0x207E, "3", ")"), - (0x207F, "M", "n"), - (0x2080, "M", "0"), - (0x2081, "M", "1"), - (0x2082, "M", "2"), - (0x2083, "M", "3"), - (0x2084, "M", "4"), - (0x2085, "M", "5"), - (0x2086, "M", "6"), - (0x2087, "M", "7"), - (0x2088, "M", "8"), - (0x2089, "M", "9"), - (0x208A, "3", "+"), - (0x208B, "M", "−"), - (0x208C, "3", "="), - (0x208D, "3", "("), - (0x208E, "3", ")"), - (0x208F, "X"), - (0x2090, "M", "a"), - (0x2091, "M", "e"), - (0x2092, "M", "o"), - (0x2093, "M", "x"), - (0x2094, "M", "ə"), - (0x2095, "M", "h"), - (0x2096, "M", "k"), - (0x2097, "M", "l"), - (0x2098, "M", "m"), - (0x2099, "M", "n"), - (0x209A, "M", "p"), - (0x209B, "M", "s"), - (0x209C, "M", "t"), - (0x209D, "X"), - (0x20A0, "V"), - (0x20A8, "M", "rs"), - (0x20A9, "V"), - (0x20C1, "X"), - (0x20D0, "V"), - (0x20F1, "X"), - (0x2100, "3", "a/c"), - (0x2101, "3", "a/s"), - (0x2102, "M", "c"), - (0x2103, "M", "°c"), - (0x2104, "V"), - ] - - -def _seg_22() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2105, "3", "c/o"), - (0x2106, "3", "c/u"), - (0x2107, "M", "ɛ"), - (0x2108, "V"), - (0x2109, "M", "°f"), - (0x210A, "M", "g"), - (0x210B, "M", "h"), - (0x210F, "M", "ħ"), - (0x2110, "M", "i"), - (0x2112, "M", "l"), - (0x2114, "V"), - (0x2115, "M", "n"), - (0x2116, "M", "no"), - (0x2117, "V"), - (0x2119, "M", "p"), - (0x211A, "M", "q"), - (0x211B, "M", "r"), - (0x211E, "V"), - (0x2120, "M", "sm"), - (0x2121, "M", "tel"), - (0x2122, "M", "tm"), - (0x2123, "V"), - (0x2124, "M", "z"), - (0x2125, "V"), - (0x2126, "M", "ω"), - (0x2127, "V"), - (0x2128, "M", "z"), - (0x2129, "V"), - (0x212A, "M", "k"), - (0x212B, "M", "å"), - (0x212C, "M", "b"), - (0x212D, "M", "c"), - (0x212E, "V"), - (0x212F, "M", "e"), - (0x2131, "M", "f"), - (0x2132, "X"), - (0x2133, "M", "m"), - (0x2134, "M", "o"), - (0x2135, "M", "א"), - (0x2136, "M", "ב"), - (0x2137, "M", "ג"), - (0x2138, "M", "ד"), - (0x2139, "M", "i"), - (0x213A, "V"), - (0x213B, "M", "fax"), - (0x213C, "M", "π"), - (0x213D, "M", "γ"), - (0x213F, "M", "π"), - (0x2140, "M", "∑"), - (0x2141, "V"), - (0x2145, "M", "d"), - (0x2147, "M", "e"), - (0x2148, "M", "i"), - (0x2149, "M", "j"), - (0x214A, "V"), - (0x2150, "M", "1⁄7"), - (0x2151, "M", "1⁄9"), - (0x2152, "M", "1⁄10"), - (0x2153, "M", "1⁄3"), - (0x2154, "M", "2⁄3"), - (0x2155, "M", "1⁄5"), - (0x2156, "M", "2⁄5"), - (0x2157, "M", "3⁄5"), - (0x2158, "M", "4⁄5"), - (0x2159, "M", "1⁄6"), - (0x215A, "M", "5⁄6"), - (0x215B, "M", "1⁄8"), - (0x215C, "M", "3⁄8"), - (0x215D, "M", "5⁄8"), - (0x215E, "M", "7⁄8"), - (0x215F, "M", "1⁄"), - (0x2160, "M", "i"), - (0x2161, "M", "ii"), - (0x2162, "M", "iii"), - (0x2163, "M", "iv"), - (0x2164, "M", "v"), - (0x2165, "M", "vi"), - (0x2166, "M", "vii"), - (0x2167, "M", "viii"), - (0x2168, "M", "ix"), - (0x2169, "M", "x"), - (0x216A, "M", "xi"), - (0x216B, "M", "xii"), - (0x216C, "M", "l"), - (0x216D, "M", "c"), - (0x216E, "M", "d"), - (0x216F, "M", "m"), - (0x2170, "M", "i"), - (0x2171, "M", "ii"), - (0x2172, "M", "iii"), - (0x2173, "M", "iv"), - (0x2174, "M", "v"), - (0x2175, "M", "vi"), - (0x2176, "M", "vii"), - (0x2177, "M", "viii"), - (0x2178, "M", "ix"), - (0x2179, "M", "x"), - (0x217A, "M", "xi"), - (0x217B, "M", "xii"), - (0x217C, "M", "l"), - ] - - -def _seg_23() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x217D, "M", "c"), - (0x217E, "M", "d"), - (0x217F, "M", "m"), - (0x2180, "V"), - (0x2183, "X"), - (0x2184, "V"), - (0x2189, "M", "0⁄3"), - (0x218A, "V"), - (0x218C, "X"), - (0x2190, "V"), - (0x222C, "M", "∫∫"), - (0x222D, "M", "∫∫∫"), - (0x222E, "V"), - (0x222F, "M", "∮∮"), - (0x2230, "M", "∮∮∮"), - (0x2231, "V"), - (0x2329, "M", "〈"), - (0x232A, "M", "〉"), - (0x232B, "V"), - (0x2427, "X"), - (0x2440, "V"), - (0x244B, "X"), - (0x2460, "M", "1"), - (0x2461, "M", "2"), - (0x2462, "M", "3"), - (0x2463, "M", "4"), - (0x2464, "M", "5"), - (0x2465, "M", "6"), - (0x2466, "M", "7"), - (0x2467, "M", "8"), - (0x2468, "M", "9"), - (0x2469, "M", "10"), - (0x246A, "M", "11"), - (0x246B, "M", "12"), - (0x246C, "M", "13"), - (0x246D, "M", "14"), - (0x246E, "M", "15"), - (0x246F, "M", "16"), - (0x2470, "M", "17"), - (0x2471, "M", "18"), - (0x2472, "M", "19"), - (0x2473, "M", "20"), - (0x2474, "3", "(1)"), - (0x2475, "3", "(2)"), - (0x2476, "3", "(3)"), - (0x2477, "3", "(4)"), - (0x2478, "3", "(5)"), - (0x2479, "3", "(6)"), - (0x247A, "3", "(7)"), - (0x247B, "3", "(8)"), - (0x247C, "3", "(9)"), - (0x247D, "3", "(10)"), - (0x247E, "3", "(11)"), - (0x247F, "3", "(12)"), - (0x2480, "3", "(13)"), - (0x2481, "3", "(14)"), - (0x2482, "3", "(15)"), - (0x2483, "3", "(16)"), - (0x2484, "3", "(17)"), - (0x2485, "3", "(18)"), - (0x2486, "3", "(19)"), - (0x2487, "3", "(20)"), - (0x2488, "X"), - (0x249C, "3", "(a)"), - (0x249D, "3", "(b)"), - (0x249E, "3", "(c)"), - (0x249F, "3", "(d)"), - (0x24A0, "3", "(e)"), - (0x24A1, "3", "(f)"), - (0x24A2, "3", "(g)"), - (0x24A3, "3", "(h)"), - (0x24A4, "3", "(i)"), - (0x24A5, "3", "(j)"), - (0x24A6, "3", "(k)"), - (0x24A7, "3", "(l)"), - (0x24A8, "3", "(m)"), - (0x24A9, "3", "(n)"), - (0x24AA, "3", "(o)"), - (0x24AB, "3", "(p)"), - (0x24AC, "3", "(q)"), - (0x24AD, "3", "(r)"), - (0x24AE, "3", "(s)"), - (0x24AF, "3", "(t)"), - (0x24B0, "3", "(u)"), - (0x24B1, "3", "(v)"), - (0x24B2, "3", "(w)"), - (0x24B3, "3", "(x)"), - (0x24B4, "3", "(y)"), - (0x24B5, "3", "(z)"), - (0x24B6, "M", "a"), - (0x24B7, "M", "b"), - (0x24B8, "M", "c"), - (0x24B9, "M", "d"), - (0x24BA, "M", "e"), - (0x24BB, "M", "f"), - (0x24BC, "M", "g"), - (0x24BD, "M", "h"), - (0x24BE, "M", "i"), - (0x24BF, "M", "j"), - (0x24C0, "M", "k"), - ] - - -def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x24C1, "M", "l"), - (0x24C2, "M", "m"), - (0x24C3, "M", "n"), - (0x24C4, "M", "o"), - (0x24C5, "M", "p"), - (0x24C6, "M", "q"), - (0x24C7, "M", "r"), - (0x24C8, "M", "s"), - (0x24C9, "M", "t"), - (0x24CA, "M", "u"), - (0x24CB, "M", "v"), - (0x24CC, "M", "w"), - (0x24CD, "M", "x"), - (0x24CE, "M", "y"), - (0x24CF, "M", "z"), - (0x24D0, "M", "a"), - (0x24D1, "M", "b"), - (0x24D2, "M", "c"), - (0x24D3, "M", "d"), - (0x24D4, "M", "e"), - (0x24D5, "M", "f"), - (0x24D6, "M", "g"), - (0x24D7, "M", "h"), - (0x24D8, "M", "i"), - (0x24D9, "M", "j"), - (0x24DA, "M", "k"), - (0x24DB, "M", "l"), - (0x24DC, "M", "m"), - (0x24DD, "M", "n"), - (0x24DE, "M", "o"), - (0x24DF, "M", "p"), - (0x24E0, "M", "q"), - (0x24E1, "M", "r"), - (0x24E2, "M", "s"), - (0x24E3, "M", "t"), - (0x24E4, "M", "u"), - (0x24E5, "M", "v"), - (0x24E6, "M", "w"), - (0x24E7, "M", "x"), - (0x24E8, "M", "y"), - (0x24E9, "M", "z"), - (0x24EA, "M", "0"), - (0x24EB, "V"), - (0x2A0C, "M", "∫∫∫∫"), - (0x2A0D, "V"), - (0x2A74, "3", "::="), - (0x2A75, "3", "=="), - (0x2A76, "3", "==="), - (0x2A77, "V"), - (0x2ADC, "M", "⫝̸"), - (0x2ADD, "V"), - (0x2B74, "X"), - (0x2B76, "V"), - (0x2B96, "X"), - (0x2B97, "V"), - (0x2C00, "M", "ⰰ"), - (0x2C01, "M", "ⰱ"), - (0x2C02, "M", "ⰲ"), - (0x2C03, "M", "ⰳ"), - (0x2C04, "M", "ⰴ"), - (0x2C05, "M", "ⰵ"), - (0x2C06, "M", "ⰶ"), - (0x2C07, "M", "ⰷ"), - (0x2C08, "M", "ⰸ"), - (0x2C09, "M", "ⰹ"), - (0x2C0A, "M", "ⰺ"), - (0x2C0B, "M", "ⰻ"), - (0x2C0C, "M", "ⰼ"), - (0x2C0D, "M", "ⰽ"), - (0x2C0E, "M", "ⰾ"), - (0x2C0F, "M", "ⰿ"), - (0x2C10, "M", "ⱀ"), - (0x2C11, "M", "ⱁ"), - (0x2C12, "M", "ⱂ"), - (0x2C13, "M", "ⱃ"), - (0x2C14, "M", "ⱄ"), - (0x2C15, "M", "ⱅ"), - (0x2C16, "M", "ⱆ"), - (0x2C17, "M", "ⱇ"), - (0x2C18, "M", "ⱈ"), - (0x2C19, "M", "ⱉ"), - (0x2C1A, "M", "ⱊ"), - (0x2C1B, "M", "ⱋ"), - (0x2C1C, "M", "ⱌ"), - (0x2C1D, "M", "ⱍ"), - (0x2C1E, "M", "ⱎ"), - (0x2C1F, "M", "ⱏ"), - (0x2C20, "M", "ⱐ"), - (0x2C21, "M", "ⱑ"), - (0x2C22, "M", "ⱒ"), - (0x2C23, "M", "ⱓ"), - (0x2C24, "M", "ⱔ"), - (0x2C25, "M", "ⱕ"), - (0x2C26, "M", "ⱖ"), - (0x2C27, "M", "ⱗ"), - (0x2C28, "M", "ⱘ"), - (0x2C29, "M", "ⱙ"), - (0x2C2A, "M", "ⱚ"), - (0x2C2B, "M", "ⱛ"), - (0x2C2C, "M", "ⱜ"), - ] - - -def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2C2D, "M", "ⱝ"), - (0x2C2E, "M", "ⱞ"), - (0x2C2F, "M", "ⱟ"), - (0x2C30, "V"), - (0x2C60, "M", "ⱡ"), - (0x2C61, "V"), - (0x2C62, "M", "ɫ"), - (0x2C63, "M", "ᵽ"), - (0x2C64, "M", "ɽ"), - (0x2C65, "V"), - (0x2C67, "M", "ⱨ"), - (0x2C68, "V"), - (0x2C69, "M", "ⱪ"), - (0x2C6A, "V"), - (0x2C6B, "M", "ⱬ"), - (0x2C6C, "V"), - (0x2C6D, "M", "ɑ"), - (0x2C6E, "M", "ɱ"), - (0x2C6F, "M", "ɐ"), - (0x2C70, "M", "ɒ"), - (0x2C71, "V"), - (0x2C72, "M", "ⱳ"), - (0x2C73, "V"), - (0x2C75, "M", "ⱶ"), - (0x2C76, "V"), - (0x2C7C, "M", "j"), - (0x2C7D, "M", "v"), - (0x2C7E, "M", "ȿ"), - (0x2C7F, "M", "ɀ"), - (0x2C80, "M", "ⲁ"), - (0x2C81, "V"), - (0x2C82, "M", "ⲃ"), - (0x2C83, "V"), - (0x2C84, "M", "ⲅ"), - (0x2C85, "V"), - (0x2C86, "M", "ⲇ"), - (0x2C87, "V"), - (0x2C88, "M", "ⲉ"), - (0x2C89, "V"), - (0x2C8A, "M", "ⲋ"), - (0x2C8B, "V"), - (0x2C8C, "M", "ⲍ"), - (0x2C8D, "V"), - (0x2C8E, "M", "ⲏ"), - (0x2C8F, "V"), - (0x2C90, "M", "ⲑ"), - (0x2C91, "V"), - (0x2C92, "M", "ⲓ"), - (0x2C93, "V"), - (0x2C94, "M", "ⲕ"), - (0x2C95, "V"), - (0x2C96, "M", "ⲗ"), - (0x2C97, "V"), - (0x2C98, "M", "ⲙ"), - (0x2C99, "V"), - (0x2C9A, "M", "ⲛ"), - (0x2C9B, "V"), - (0x2C9C, "M", "ⲝ"), - (0x2C9D, "V"), - (0x2C9E, "M", "ⲟ"), - (0x2C9F, "V"), - (0x2CA0, "M", "ⲡ"), - (0x2CA1, "V"), - (0x2CA2, "M", "ⲣ"), - (0x2CA3, "V"), - (0x2CA4, "M", "ⲥ"), - (0x2CA5, "V"), - (0x2CA6, "M", "ⲧ"), - (0x2CA7, "V"), - (0x2CA8, "M", "ⲩ"), - (0x2CA9, "V"), - (0x2CAA, "M", "ⲫ"), - (0x2CAB, "V"), - (0x2CAC, "M", "ⲭ"), - (0x2CAD, "V"), - (0x2CAE, "M", "ⲯ"), - (0x2CAF, "V"), - (0x2CB0, "M", "ⲱ"), - (0x2CB1, "V"), - (0x2CB2, "M", "ⲳ"), - (0x2CB3, "V"), - (0x2CB4, "M", "ⲵ"), - (0x2CB5, "V"), - (0x2CB6, "M", "ⲷ"), - (0x2CB7, "V"), - (0x2CB8, "M", "ⲹ"), - (0x2CB9, "V"), - (0x2CBA, "M", "ⲻ"), - (0x2CBB, "V"), - (0x2CBC, "M", "ⲽ"), - (0x2CBD, "V"), - (0x2CBE, "M", "ⲿ"), - (0x2CBF, "V"), - (0x2CC0, "M", "ⳁ"), - (0x2CC1, "V"), - (0x2CC2, "M", "ⳃ"), - (0x2CC3, "V"), - (0x2CC4, "M", "ⳅ"), - (0x2CC5, "V"), - (0x2CC6, "M", "ⳇ"), - ] - - -def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2CC7, "V"), - (0x2CC8, "M", "ⳉ"), - (0x2CC9, "V"), - (0x2CCA, "M", "ⳋ"), - (0x2CCB, "V"), - (0x2CCC, "M", "ⳍ"), - (0x2CCD, "V"), - (0x2CCE, "M", "ⳏ"), - (0x2CCF, "V"), - (0x2CD0, "M", "ⳑ"), - (0x2CD1, "V"), - (0x2CD2, "M", "ⳓ"), - (0x2CD3, "V"), - (0x2CD4, "M", "ⳕ"), - (0x2CD5, "V"), - (0x2CD6, "M", "ⳗ"), - (0x2CD7, "V"), - (0x2CD8, "M", "ⳙ"), - (0x2CD9, "V"), - (0x2CDA, "M", "ⳛ"), - (0x2CDB, "V"), - (0x2CDC, "M", "ⳝ"), - (0x2CDD, "V"), - (0x2CDE, "M", "ⳟ"), - (0x2CDF, "V"), - (0x2CE0, "M", "ⳡ"), - (0x2CE1, "V"), - (0x2CE2, "M", "ⳣ"), - (0x2CE3, "V"), - (0x2CEB, "M", "ⳬ"), - (0x2CEC, "V"), - (0x2CED, "M", "ⳮ"), - (0x2CEE, "V"), - (0x2CF2, "M", "ⳳ"), - (0x2CF3, "V"), - (0x2CF4, "X"), - (0x2CF9, "V"), - (0x2D26, "X"), - (0x2D27, "V"), - (0x2D28, "X"), - (0x2D2D, "V"), - (0x2D2E, "X"), - (0x2D30, "V"), - (0x2D68, "X"), - (0x2D6F, "M", "ⵡ"), - (0x2D70, "V"), - (0x2D71, "X"), - (0x2D7F, "V"), - (0x2D97, "X"), - (0x2DA0, "V"), - (0x2DA7, "X"), - (0x2DA8, "V"), - (0x2DAF, "X"), - (0x2DB0, "V"), - (0x2DB7, "X"), - (0x2DB8, "V"), - (0x2DBF, "X"), - (0x2DC0, "V"), - (0x2DC7, "X"), - (0x2DC8, "V"), - (0x2DCF, "X"), - (0x2DD0, "V"), - (0x2DD7, "X"), - (0x2DD8, "V"), - (0x2DDF, "X"), - (0x2DE0, "V"), - (0x2E5E, "X"), - (0x2E80, "V"), - (0x2E9A, "X"), - (0x2E9B, "V"), - (0x2E9F, "M", "母"), - (0x2EA0, "V"), - (0x2EF3, "M", "龟"), - (0x2EF4, "X"), - (0x2F00, "M", "一"), - (0x2F01, "M", "丨"), - (0x2F02, "M", "丶"), - (0x2F03, "M", "丿"), - (0x2F04, "M", "乙"), - (0x2F05, "M", "亅"), - (0x2F06, "M", "二"), - (0x2F07, "M", "亠"), - (0x2F08, "M", "人"), - (0x2F09, "M", "儿"), - (0x2F0A, "M", "入"), - (0x2F0B, "M", "八"), - (0x2F0C, "M", "冂"), - (0x2F0D, "M", "冖"), - (0x2F0E, "M", "冫"), - (0x2F0F, "M", "几"), - (0x2F10, "M", "凵"), - (0x2F11, "M", "刀"), - (0x2F12, "M", "力"), - (0x2F13, "M", "勹"), - (0x2F14, "M", "匕"), - (0x2F15, "M", "匚"), - (0x2F16, "M", "匸"), - (0x2F17, "M", "十"), - (0x2F18, "M", "卜"), - (0x2F19, "M", "卩"), - ] - - -def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F1A, "M", "厂"), - (0x2F1B, "M", "厶"), - (0x2F1C, "M", "又"), - (0x2F1D, "M", "口"), - (0x2F1E, "M", "囗"), - (0x2F1F, "M", "土"), - (0x2F20, "M", "士"), - (0x2F21, "M", "夂"), - (0x2F22, "M", "夊"), - (0x2F23, "M", "夕"), - (0x2F24, "M", "大"), - (0x2F25, "M", "女"), - (0x2F26, "M", "子"), - (0x2F27, "M", "宀"), - (0x2F28, "M", "寸"), - (0x2F29, "M", "小"), - (0x2F2A, "M", "尢"), - (0x2F2B, "M", "尸"), - (0x2F2C, "M", "屮"), - (0x2F2D, "M", "山"), - (0x2F2E, "M", "巛"), - (0x2F2F, "M", "工"), - (0x2F30, "M", "己"), - (0x2F31, "M", "巾"), - (0x2F32, "M", "干"), - (0x2F33, "M", "幺"), - (0x2F34, "M", "广"), - (0x2F35, "M", "廴"), - (0x2F36, "M", "廾"), - (0x2F37, "M", "弋"), - (0x2F38, "M", "弓"), - (0x2F39, "M", "彐"), - (0x2F3A, "M", "彡"), - (0x2F3B, "M", "彳"), - (0x2F3C, "M", "心"), - (0x2F3D, "M", "戈"), - (0x2F3E, "M", "戶"), - (0x2F3F, "M", "手"), - (0x2F40, "M", "支"), - (0x2F41, "M", "攴"), - (0x2F42, "M", "文"), - (0x2F43, "M", "斗"), - (0x2F44, "M", "斤"), - (0x2F45, "M", "方"), - (0x2F46, "M", "无"), - (0x2F47, "M", "日"), - (0x2F48, "M", "曰"), - (0x2F49, "M", "月"), - (0x2F4A, "M", "木"), - (0x2F4B, "M", "欠"), - (0x2F4C, "M", "止"), - (0x2F4D, "M", "歹"), - (0x2F4E, "M", "殳"), - (0x2F4F, "M", "毋"), - (0x2F50, "M", "比"), - (0x2F51, "M", "毛"), - (0x2F52, "M", "氏"), - (0x2F53, "M", "气"), - (0x2F54, "M", "水"), - (0x2F55, "M", "火"), - (0x2F56, "M", "爪"), - (0x2F57, "M", "父"), - (0x2F58, "M", "爻"), - (0x2F59, "M", "爿"), - (0x2F5A, "M", "片"), - (0x2F5B, "M", "牙"), - (0x2F5C, "M", "牛"), - (0x2F5D, "M", "犬"), - (0x2F5E, "M", "玄"), - (0x2F5F, "M", "玉"), - (0x2F60, "M", "瓜"), - (0x2F61, "M", "瓦"), - (0x2F62, "M", "甘"), - (0x2F63, "M", "生"), - (0x2F64, "M", "用"), - (0x2F65, "M", "田"), - (0x2F66, "M", "疋"), - (0x2F67, "M", "疒"), - (0x2F68, "M", "癶"), - (0x2F69, "M", "白"), - (0x2F6A, "M", "皮"), - (0x2F6B, "M", "皿"), - (0x2F6C, "M", "目"), - (0x2F6D, "M", "矛"), - (0x2F6E, "M", "矢"), - (0x2F6F, "M", "石"), - (0x2F70, "M", "示"), - (0x2F71, "M", "禸"), - (0x2F72, "M", "禾"), - (0x2F73, "M", "穴"), - (0x2F74, "M", "立"), - (0x2F75, "M", "竹"), - (0x2F76, "M", "米"), - (0x2F77, "M", "糸"), - (0x2F78, "M", "缶"), - (0x2F79, "M", "网"), - (0x2F7A, "M", "羊"), - (0x2F7B, "M", "羽"), - (0x2F7C, "M", "老"), - (0x2F7D, "M", "而"), - ] - - -def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F7E, "M", "耒"), - (0x2F7F, "M", "耳"), - (0x2F80, "M", "聿"), - (0x2F81, "M", "肉"), - (0x2F82, "M", "臣"), - (0x2F83, "M", "自"), - (0x2F84, "M", "至"), - (0x2F85, "M", "臼"), - (0x2F86, "M", "舌"), - (0x2F87, "M", "舛"), - (0x2F88, "M", "舟"), - (0x2F89, "M", "艮"), - (0x2F8A, "M", "色"), - (0x2F8B, "M", "艸"), - (0x2F8C, "M", "虍"), - (0x2F8D, "M", "虫"), - (0x2F8E, "M", "血"), - (0x2F8F, "M", "行"), - (0x2F90, "M", "衣"), - (0x2F91, "M", "襾"), - (0x2F92, "M", "見"), - (0x2F93, "M", "角"), - (0x2F94, "M", "言"), - (0x2F95, "M", "谷"), - (0x2F96, "M", "豆"), - (0x2F97, "M", "豕"), - (0x2F98, "M", "豸"), - (0x2F99, "M", "貝"), - (0x2F9A, "M", "赤"), - (0x2F9B, "M", "走"), - (0x2F9C, "M", "足"), - (0x2F9D, "M", "身"), - (0x2F9E, "M", "車"), - (0x2F9F, "M", "辛"), - (0x2FA0, "M", "辰"), - (0x2FA1, "M", "辵"), - (0x2FA2, "M", "邑"), - (0x2FA3, "M", "酉"), - (0x2FA4, "M", "釆"), - (0x2FA5, "M", "里"), - (0x2FA6, "M", "金"), - (0x2FA7, "M", "長"), - (0x2FA8, "M", "門"), - (0x2FA9, "M", "阜"), - (0x2FAA, "M", "隶"), - (0x2FAB, "M", "隹"), - (0x2FAC, "M", "雨"), - (0x2FAD, "M", "靑"), - (0x2FAE, "M", "非"), - (0x2FAF, "M", "面"), - (0x2FB0, "M", "革"), - (0x2FB1, "M", "韋"), - (0x2FB2, "M", "韭"), - (0x2FB3, "M", "音"), - (0x2FB4, "M", "頁"), - (0x2FB5, "M", "風"), - (0x2FB6, "M", "飛"), - (0x2FB7, "M", "食"), - (0x2FB8, "M", "首"), - (0x2FB9, "M", "香"), - (0x2FBA, "M", "馬"), - (0x2FBB, "M", "骨"), - (0x2FBC, "M", "高"), - (0x2FBD, "M", "髟"), - (0x2FBE, "M", "鬥"), - (0x2FBF, "M", "鬯"), - (0x2FC0, "M", "鬲"), - (0x2FC1, "M", "鬼"), - (0x2FC2, "M", "魚"), - (0x2FC3, "M", "鳥"), - (0x2FC4, "M", "鹵"), - (0x2FC5, "M", "鹿"), - (0x2FC6, "M", "麥"), - (0x2FC7, "M", "麻"), - (0x2FC8, "M", "黃"), - (0x2FC9, "M", "黍"), - (0x2FCA, "M", "黑"), - (0x2FCB, "M", "黹"), - (0x2FCC, "M", "黽"), - (0x2FCD, "M", "鼎"), - (0x2FCE, "M", "鼓"), - (0x2FCF, "M", "鼠"), - (0x2FD0, "M", "鼻"), - (0x2FD1, "M", "齊"), - (0x2FD2, "M", "齒"), - (0x2FD3, "M", "龍"), - (0x2FD4, "M", "龜"), - (0x2FD5, "M", "龠"), - (0x2FD6, "X"), - (0x3000, "3", " "), - (0x3001, "V"), - (0x3002, "M", "."), - (0x3003, "V"), - (0x3036, "M", "〒"), - (0x3037, "V"), - (0x3038, "M", "十"), - (0x3039, "M", "卄"), - (0x303A, "M", "卅"), - (0x303B, "V"), - (0x3040, "X"), - ] - - -def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x3041, "V"), - (0x3097, "X"), - (0x3099, "V"), - (0x309B, "3", " ゙"), - (0x309C, "3", " ゚"), - (0x309D, "V"), - (0x309F, "M", "より"), - (0x30A0, "V"), - (0x30FF, "M", "コト"), - (0x3100, "X"), - (0x3105, "V"), - (0x3130, "X"), - (0x3131, "M", "ᄀ"), - (0x3132, "M", "ᄁ"), - (0x3133, "M", "ᆪ"), - (0x3134, "M", "ᄂ"), - (0x3135, "M", "ᆬ"), - (0x3136, "M", "ᆭ"), - (0x3137, "M", "ᄃ"), - (0x3138, "M", "ᄄ"), - (0x3139, "M", "ᄅ"), - (0x313A, "M", "ᆰ"), - (0x313B, "M", "ᆱ"), - (0x313C, "M", "ᆲ"), - (0x313D, "M", "ᆳ"), - (0x313E, "M", "ᆴ"), - (0x313F, "M", "ᆵ"), - (0x3140, "M", "ᄚ"), - (0x3141, "M", "ᄆ"), - (0x3142, "M", "ᄇ"), - (0x3143, "M", "ᄈ"), - (0x3144, "M", "ᄡ"), - (0x3145, "M", "ᄉ"), - (0x3146, "M", "ᄊ"), - (0x3147, "M", "ᄋ"), - (0x3148, "M", "ᄌ"), - (0x3149, "M", "ᄍ"), - (0x314A, "M", "ᄎ"), - (0x314B, "M", "ᄏ"), - (0x314C, "M", "ᄐ"), - (0x314D, "M", "ᄑ"), - (0x314E, "M", "ᄒ"), - (0x314F, "M", "ᅡ"), - (0x3150, "M", "ᅢ"), - (0x3151, "M", "ᅣ"), - (0x3152, "M", "ᅤ"), - (0x3153, "M", "ᅥ"), - (0x3154, "M", "ᅦ"), - (0x3155, "M", "ᅧ"), - (0x3156, "M", "ᅨ"), - (0x3157, "M", "ᅩ"), - (0x3158, "M", "ᅪ"), - (0x3159, "M", "ᅫ"), - (0x315A, "M", "ᅬ"), - (0x315B, "M", "ᅭ"), - (0x315C, "M", "ᅮ"), - (0x315D, "M", "ᅯ"), - (0x315E, "M", "ᅰ"), - (0x315F, "M", "ᅱ"), - (0x3160, "M", "ᅲ"), - (0x3161, "M", "ᅳ"), - (0x3162, "M", "ᅴ"), - (0x3163, "M", "ᅵ"), - (0x3164, "X"), - (0x3165, "M", "ᄔ"), - (0x3166, "M", "ᄕ"), - (0x3167, "M", "ᇇ"), - (0x3168, "M", "ᇈ"), - (0x3169, "M", "ᇌ"), - (0x316A, "M", "ᇎ"), - (0x316B, "M", "ᇓ"), - (0x316C, "M", "ᇗ"), - (0x316D, "M", "ᇙ"), - (0x316E, "M", "ᄜ"), - (0x316F, "M", "ᇝ"), - (0x3170, "M", "ᇟ"), - (0x3171, "M", "ᄝ"), - (0x3172, "M", "ᄞ"), - (0x3173, "M", "ᄠ"), - (0x3174, "M", "ᄢ"), - (0x3175, "M", "ᄣ"), - (0x3176, "M", "ᄧ"), - (0x3177, "M", "ᄩ"), - (0x3178, "M", "ᄫ"), - (0x3179, "M", "ᄬ"), - (0x317A, "M", "ᄭ"), - (0x317B, "M", "ᄮ"), - (0x317C, "M", "ᄯ"), - (0x317D, "M", "ᄲ"), - (0x317E, "M", "ᄶ"), - (0x317F, "M", "ᅀ"), - (0x3180, "M", "ᅇ"), - (0x3181, "M", "ᅌ"), - (0x3182, "M", "ᇱ"), - (0x3183, "M", "ᇲ"), - (0x3184, "M", "ᅗ"), - (0x3185, "M", "ᅘ"), - (0x3186, "M", "ᅙ"), - (0x3187, "M", "ᆄ"), - (0x3188, "M", "ᆅ"), - ] - - -def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x3189, "M", "ᆈ"), - (0x318A, "M", "ᆑ"), - (0x318B, "M", "ᆒ"), - (0x318C, "M", "ᆔ"), - (0x318D, "M", "ᆞ"), - (0x318E, "M", "ᆡ"), - (0x318F, "X"), - (0x3190, "V"), - (0x3192, "M", "一"), - (0x3193, "M", "二"), - (0x3194, "M", "三"), - (0x3195, "M", "四"), - (0x3196, "M", "上"), - (0x3197, "M", "中"), - (0x3198, "M", "下"), - (0x3199, "M", "甲"), - (0x319A, "M", "乙"), - (0x319B, "M", "丙"), - (0x319C, "M", "丁"), - (0x319D, "M", "天"), - (0x319E, "M", "地"), - (0x319F, "M", "人"), - (0x31A0, "V"), - (0x31E4, "X"), - (0x31F0, "V"), - (0x3200, "3", "(ᄀ)"), - (0x3201, "3", "(ᄂ)"), - (0x3202, "3", "(ᄃ)"), - (0x3203, "3", "(ᄅ)"), - (0x3204, "3", "(ᄆ)"), - (0x3205, "3", "(ᄇ)"), - (0x3206, "3", "(ᄉ)"), - (0x3207, "3", "(ᄋ)"), - (0x3208, "3", "(ᄌ)"), - (0x3209, "3", "(ᄎ)"), - (0x320A, "3", "(ᄏ)"), - (0x320B, "3", "(ᄐ)"), - (0x320C, "3", "(ᄑ)"), - (0x320D, "3", "(ᄒ)"), - (0x320E, "3", "(가)"), - (0x320F, "3", "(나)"), - (0x3210, "3", "(다)"), - (0x3211, "3", "(라)"), - (0x3212, "3", "(마)"), - (0x3213, "3", "(바)"), - (0x3214, "3", "(사)"), - (0x3215, "3", "(아)"), - (0x3216, "3", "(자)"), - (0x3217, "3", "(차)"), - (0x3218, "3", "(카)"), - (0x3219, "3", "(타)"), - (0x321A, "3", "(파)"), - (0x321B, "3", "(하)"), - (0x321C, "3", "(주)"), - (0x321D, "3", "(오전)"), - (0x321E, "3", "(오후)"), - (0x321F, "X"), - (0x3220, "3", "(一)"), - (0x3221, "3", "(二)"), - (0x3222, "3", "(三)"), - (0x3223, "3", "(四)"), - (0x3224, "3", "(五)"), - (0x3225, "3", "(六)"), - (0x3226, "3", "(七)"), - (0x3227, "3", "(八)"), - (0x3228, "3", "(九)"), - (0x3229, "3", "(十)"), - (0x322A, "3", "(月)"), - (0x322B, "3", "(火)"), - (0x322C, "3", "(水)"), - (0x322D, "3", "(木)"), - (0x322E, "3", "(金)"), - (0x322F, "3", "(土)"), - (0x3230, "3", "(日)"), - (0x3231, "3", "(株)"), - (0x3232, "3", "(有)"), - (0x3233, "3", "(社)"), - (0x3234, "3", "(名)"), - (0x3235, "3", "(特)"), - (0x3236, "3", "(財)"), - (0x3237, "3", "(祝)"), - (0x3238, "3", "(労)"), - (0x3239, "3", "(代)"), - (0x323A, "3", "(呼)"), - (0x323B, "3", "(学)"), - (0x323C, "3", "(監)"), - (0x323D, "3", "(企)"), - (0x323E, "3", "(資)"), - (0x323F, "3", "(協)"), - (0x3240, "3", "(祭)"), - (0x3241, "3", "(休)"), - (0x3242, "3", "(自)"), - (0x3243, "3", "(至)"), - (0x3244, "M", "問"), - (0x3245, "M", "幼"), - (0x3246, "M", "文"), - (0x3247, "M", "箏"), - (0x3248, "V"), - (0x3250, "M", "pte"), - (0x3251, "M", "21"), - ] - - -def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x3252, "M", "22"), - (0x3253, "M", "23"), - (0x3254, "M", "24"), - (0x3255, "M", "25"), - (0x3256, "M", "26"), - (0x3257, "M", "27"), - (0x3258, "M", "28"), - (0x3259, "M", "29"), - (0x325A, "M", "30"), - (0x325B, "M", "31"), - (0x325C, "M", "32"), - (0x325D, "M", "33"), - (0x325E, "M", "34"), - (0x325F, "M", "35"), - (0x3260, "M", "ᄀ"), - (0x3261, "M", "ᄂ"), - (0x3262, "M", "ᄃ"), - (0x3263, "M", "ᄅ"), - (0x3264, "M", "ᄆ"), - (0x3265, "M", "ᄇ"), - (0x3266, "M", "ᄉ"), - (0x3267, "M", "ᄋ"), - (0x3268, "M", "ᄌ"), - (0x3269, "M", "ᄎ"), - (0x326A, "M", "ᄏ"), - (0x326B, "M", "ᄐ"), - (0x326C, "M", "ᄑ"), - (0x326D, "M", "ᄒ"), - (0x326E, "M", "가"), - (0x326F, "M", "나"), - (0x3270, "M", "다"), - (0x3271, "M", "라"), - (0x3272, "M", "마"), - (0x3273, "M", "바"), - (0x3274, "M", "사"), - (0x3275, "M", "아"), - (0x3276, "M", "자"), - (0x3277, "M", "차"), - (0x3278, "M", "카"), - (0x3279, "M", "타"), - (0x327A, "M", "파"), - (0x327B, "M", "하"), - (0x327C, "M", "참고"), - (0x327D, "M", "주의"), - (0x327E, "M", "우"), - (0x327F, "V"), - (0x3280, "M", "一"), - (0x3281, "M", "二"), - (0x3282, "M", "三"), - (0x3283, "M", "四"), - (0x3284, "M", "五"), - (0x3285, "M", "六"), - (0x3286, "M", "七"), - (0x3287, "M", "八"), - (0x3288, "M", "九"), - (0x3289, "M", "十"), - (0x328A, "M", "月"), - (0x328B, "M", "火"), - (0x328C, "M", "水"), - (0x328D, "M", "木"), - (0x328E, "M", "金"), - (0x328F, "M", "土"), - (0x3290, "M", "日"), - (0x3291, "M", "株"), - (0x3292, "M", "有"), - (0x3293, "M", "社"), - (0x3294, "M", "名"), - (0x3295, "M", "特"), - (0x3296, "M", "財"), - (0x3297, "M", "祝"), - (0x3298, "M", "労"), - (0x3299, "M", "秘"), - (0x329A, "M", "男"), - (0x329B, "M", "女"), - (0x329C, "M", "適"), - (0x329D, "M", "優"), - (0x329E, "M", "印"), - (0x329F, "M", "注"), - (0x32A0, "M", "項"), - (0x32A1, "M", "休"), - (0x32A2, "M", "写"), - (0x32A3, "M", "正"), - (0x32A4, "M", "上"), - (0x32A5, "M", "中"), - (0x32A6, "M", "下"), - (0x32A7, "M", "左"), - (0x32A8, "M", "右"), - (0x32A9, "M", "医"), - (0x32AA, "M", "宗"), - (0x32AB, "M", "学"), - (0x32AC, "M", "監"), - (0x32AD, "M", "企"), - (0x32AE, "M", "資"), - (0x32AF, "M", "協"), - (0x32B0, "M", "夜"), - (0x32B1, "M", "36"), - (0x32B2, "M", "37"), - (0x32B3, "M", "38"), - (0x32B4, "M", "39"), - (0x32B5, "M", "40"), - ] - - -def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x32B6, "M", "41"), - (0x32B7, "M", "42"), - (0x32B8, "M", "43"), - (0x32B9, "M", "44"), - (0x32BA, "M", "45"), - (0x32BB, "M", "46"), - (0x32BC, "M", "47"), - (0x32BD, "M", "48"), - (0x32BE, "M", "49"), - (0x32BF, "M", "50"), - (0x32C0, "M", "1月"), - (0x32C1, "M", "2月"), - (0x32C2, "M", "3月"), - (0x32C3, "M", "4月"), - (0x32C4, "M", "5月"), - (0x32C5, "M", "6月"), - (0x32C6, "M", "7月"), - (0x32C7, "M", "8月"), - (0x32C8, "M", "9月"), - (0x32C9, "M", "10月"), - (0x32CA, "M", "11月"), - (0x32CB, "M", "12月"), - (0x32CC, "M", "hg"), - (0x32CD, "M", "erg"), - (0x32CE, "M", "ev"), - (0x32CF, "M", "ltd"), - (0x32D0, "M", "ア"), - (0x32D1, "M", "イ"), - (0x32D2, "M", "ウ"), - (0x32D3, "M", "エ"), - (0x32D4, "M", "オ"), - (0x32D5, "M", "カ"), - (0x32D6, "M", "キ"), - (0x32D7, "M", "ク"), - (0x32D8, "M", "ケ"), - (0x32D9, "M", "コ"), - (0x32DA, "M", "サ"), - (0x32DB, "M", "シ"), - (0x32DC, "M", "ス"), - (0x32DD, "M", "セ"), - (0x32DE, "M", "ソ"), - (0x32DF, "M", "タ"), - (0x32E0, "M", "チ"), - (0x32E1, "M", "ツ"), - (0x32E2, "M", "テ"), - (0x32E3, "M", "ト"), - (0x32E4, "M", "ナ"), - (0x32E5, "M", "ニ"), - (0x32E6, "M", "ヌ"), - (0x32E7, "M", "ネ"), - (0x32E8, "M", "ノ"), - (0x32E9, "M", "ハ"), - (0x32EA, "M", "ヒ"), - (0x32EB, "M", "フ"), - (0x32EC, "M", "ヘ"), - (0x32ED, "M", "ホ"), - (0x32EE, "M", "マ"), - (0x32EF, "M", "ミ"), - (0x32F0, "M", "ム"), - (0x32F1, "M", "メ"), - (0x32F2, "M", "モ"), - (0x32F3, "M", "ヤ"), - (0x32F4, "M", "ユ"), - (0x32F5, "M", "ヨ"), - (0x32F6, "M", "ラ"), - (0x32F7, "M", "リ"), - (0x32F8, "M", "ル"), - (0x32F9, "M", "レ"), - (0x32FA, "M", "ロ"), - (0x32FB, "M", "ワ"), - (0x32FC, "M", "ヰ"), - (0x32FD, "M", "ヱ"), - (0x32FE, "M", "ヲ"), - (0x32FF, "M", "令和"), - (0x3300, "M", "アパート"), - (0x3301, "M", "アルファ"), - (0x3302, "M", "アンペア"), - (0x3303, "M", "アール"), - (0x3304, "M", "イニング"), - (0x3305, "M", "インチ"), - (0x3306, "M", "ウォン"), - (0x3307, "M", "エスクード"), - (0x3308, "M", "エーカー"), - (0x3309, "M", "オンス"), - (0x330A, "M", "オーム"), - (0x330B, "M", "カイリ"), - (0x330C, "M", "カラット"), - (0x330D, "M", "カロリー"), - (0x330E, "M", "ガロン"), - (0x330F, "M", "ガンマ"), - (0x3310, "M", "ギガ"), - (0x3311, "M", "ギニー"), - (0x3312, "M", "キュリー"), - (0x3313, "M", "ギルダー"), - (0x3314, "M", "キロ"), - (0x3315, "M", "キログラム"), - (0x3316, "M", "キロメートル"), - (0x3317, "M", "キロワット"), - (0x3318, "M", "グラム"), - (0x3319, "M", "グラムトン"), - ] - - -def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x331A, "M", "クルゼイロ"), - (0x331B, "M", "クローネ"), - (0x331C, "M", "ケース"), - (0x331D, "M", "コルナ"), - (0x331E, "M", "コーポ"), - (0x331F, "M", "サイクル"), - (0x3320, "M", "サンチーム"), - (0x3321, "M", "シリング"), - (0x3322, "M", "センチ"), - (0x3323, "M", "セント"), - (0x3324, "M", "ダース"), - (0x3325, "M", "デシ"), - (0x3326, "M", "ドル"), - (0x3327, "M", "トン"), - (0x3328, "M", "ナノ"), - (0x3329, "M", "ノット"), - (0x332A, "M", "ハイツ"), - (0x332B, "M", "パーセント"), - (0x332C, "M", "パーツ"), - (0x332D, "M", "バーレル"), - (0x332E, "M", "ピアストル"), - (0x332F, "M", "ピクル"), - (0x3330, "M", "ピコ"), - (0x3331, "M", "ビル"), - (0x3332, "M", "ファラッド"), - (0x3333, "M", "フィート"), - (0x3334, "M", "ブッシェル"), - (0x3335, "M", "フラン"), - (0x3336, "M", "ヘクタール"), - (0x3337, "M", "ペソ"), - (0x3338, "M", "ペニヒ"), - (0x3339, "M", "ヘルツ"), - (0x333A, "M", "ペンス"), - (0x333B, "M", "ページ"), - (0x333C, "M", "ベータ"), - (0x333D, "M", "ポイント"), - (0x333E, "M", "ボルト"), - (0x333F, "M", "ホン"), - (0x3340, "M", "ポンド"), - (0x3341, "M", "ホール"), - (0x3342, "M", "ホーン"), - (0x3343, "M", "マイクロ"), - (0x3344, "M", "マイル"), - (0x3345, "M", "マッハ"), - (0x3346, "M", "マルク"), - (0x3347, "M", "マンション"), - (0x3348, "M", "ミクロン"), - (0x3349, "M", "ミリ"), - (0x334A, "M", "ミリバール"), - (0x334B, "M", "メガ"), - (0x334C, "M", "メガトン"), - (0x334D, "M", "メートル"), - (0x334E, "M", "ヤード"), - (0x334F, "M", "ヤール"), - (0x3350, "M", "ユアン"), - (0x3351, "M", "リットル"), - (0x3352, "M", "リラ"), - (0x3353, "M", "ルピー"), - (0x3354, "M", "ルーブル"), - (0x3355, "M", "レム"), - (0x3356, "M", "レントゲン"), - (0x3357, "M", "ワット"), - (0x3358, "M", "0点"), - (0x3359, "M", "1点"), - (0x335A, "M", "2点"), - (0x335B, "M", "3点"), - (0x335C, "M", "4点"), - (0x335D, "M", "5点"), - (0x335E, "M", "6点"), - (0x335F, "M", "7点"), - (0x3360, "M", "8点"), - (0x3361, "M", "9点"), - (0x3362, "M", "10点"), - (0x3363, "M", "11点"), - (0x3364, "M", "12点"), - (0x3365, "M", "13点"), - (0x3366, "M", "14点"), - (0x3367, "M", "15点"), - (0x3368, "M", "16点"), - (0x3369, "M", "17点"), - (0x336A, "M", "18点"), - (0x336B, "M", "19点"), - (0x336C, "M", "20点"), - (0x336D, "M", "21点"), - (0x336E, "M", "22点"), - (0x336F, "M", "23点"), - (0x3370, "M", "24点"), - (0x3371, "M", "hpa"), - (0x3372, "M", "da"), - (0x3373, "M", "au"), - (0x3374, "M", "bar"), - (0x3375, "M", "ov"), - (0x3376, "M", "pc"), - (0x3377, "M", "dm"), - (0x3378, "M", "dm2"), - (0x3379, "M", "dm3"), - (0x337A, "M", "iu"), - (0x337B, "M", "平成"), - (0x337C, "M", "昭和"), - (0x337D, "M", "大正"), - ] - - -def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x337E, "M", "明治"), - (0x337F, "M", "株式会社"), - (0x3380, "M", "pa"), - (0x3381, "M", "na"), - (0x3382, "M", "μa"), - (0x3383, "M", "ma"), - (0x3384, "M", "ka"), - (0x3385, "M", "kb"), - (0x3386, "M", "mb"), - (0x3387, "M", "gb"), - (0x3388, "M", "cal"), - (0x3389, "M", "kcal"), - (0x338A, "M", "pf"), - (0x338B, "M", "nf"), - (0x338C, "M", "μf"), - (0x338D, "M", "μg"), - (0x338E, "M", "mg"), - (0x338F, "M", "kg"), - (0x3390, "M", "hz"), - (0x3391, "M", "khz"), - (0x3392, "M", "mhz"), - (0x3393, "M", "ghz"), - (0x3394, "M", "thz"), - (0x3395, "M", "μl"), - (0x3396, "M", "ml"), - (0x3397, "M", "dl"), - (0x3398, "M", "kl"), - (0x3399, "M", "fm"), - (0x339A, "M", "nm"), - (0x339B, "M", "μm"), - (0x339C, "M", "mm"), - (0x339D, "M", "cm"), - (0x339E, "M", "km"), - (0x339F, "M", "mm2"), - (0x33A0, "M", "cm2"), - (0x33A1, "M", "m2"), - (0x33A2, "M", "km2"), - (0x33A3, "M", "mm3"), - (0x33A4, "M", "cm3"), - (0x33A5, "M", "m3"), - (0x33A6, "M", "km3"), - (0x33A7, "M", "m∕s"), - (0x33A8, "M", "m∕s2"), - (0x33A9, "M", "pa"), - (0x33AA, "M", "kpa"), - (0x33AB, "M", "mpa"), - (0x33AC, "M", "gpa"), - (0x33AD, "M", "rad"), - (0x33AE, "M", "rad∕s"), - (0x33AF, "M", "rad∕s2"), - (0x33B0, "M", "ps"), - (0x33B1, "M", "ns"), - (0x33B2, "M", "μs"), - (0x33B3, "M", "ms"), - (0x33B4, "M", "pv"), - (0x33B5, "M", "nv"), - (0x33B6, "M", "μv"), - (0x33B7, "M", "mv"), - (0x33B8, "M", "kv"), - (0x33B9, "M", "mv"), - (0x33BA, "M", "pw"), - (0x33BB, "M", "nw"), - (0x33BC, "M", "μw"), - (0x33BD, "M", "mw"), - (0x33BE, "M", "kw"), - (0x33BF, "M", "mw"), - (0x33C0, "M", "kω"), - (0x33C1, "M", "mω"), - (0x33C2, "X"), - (0x33C3, "M", "bq"), - (0x33C4, "M", "cc"), - (0x33C5, "M", "cd"), - (0x33C6, "M", "c∕kg"), - (0x33C7, "X"), - (0x33C8, "M", "db"), - (0x33C9, "M", "gy"), - (0x33CA, "M", "ha"), - (0x33CB, "M", "hp"), - (0x33CC, "M", "in"), - (0x33CD, "M", "kk"), - (0x33CE, "M", "km"), - (0x33CF, "M", "kt"), - (0x33D0, "M", "lm"), - (0x33D1, "M", "ln"), - (0x33D2, "M", "log"), - (0x33D3, "M", "lx"), - (0x33D4, "M", "mb"), - (0x33D5, "M", "mil"), - (0x33D6, "M", "mol"), - (0x33D7, "M", "ph"), - (0x33D8, "X"), - (0x33D9, "M", "ppm"), - (0x33DA, "M", "pr"), - (0x33DB, "M", "sr"), - (0x33DC, "M", "sv"), - (0x33DD, "M", "wb"), - (0x33DE, "M", "v∕m"), - (0x33DF, "M", "a∕m"), - (0x33E0, "M", "1日"), - (0x33E1, "M", "2日"), - ] - - -def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x33E2, "M", "3日"), - (0x33E3, "M", "4日"), - (0x33E4, "M", "5日"), - (0x33E5, "M", "6日"), - (0x33E6, "M", "7日"), - (0x33E7, "M", "8日"), - (0x33E8, "M", "9日"), - (0x33E9, "M", "10日"), - (0x33EA, "M", "11日"), - (0x33EB, "M", "12日"), - (0x33EC, "M", "13日"), - (0x33ED, "M", "14日"), - (0x33EE, "M", "15日"), - (0x33EF, "M", "16日"), - (0x33F0, "M", "17日"), - (0x33F1, "M", "18日"), - (0x33F2, "M", "19日"), - (0x33F3, "M", "20日"), - (0x33F4, "M", "21日"), - (0x33F5, "M", "22日"), - (0x33F6, "M", "23日"), - (0x33F7, "M", "24日"), - (0x33F8, "M", "25日"), - (0x33F9, "M", "26日"), - (0x33FA, "M", "27日"), - (0x33FB, "M", "28日"), - (0x33FC, "M", "29日"), - (0x33FD, "M", "30日"), - (0x33FE, "M", "31日"), - (0x33FF, "M", "gal"), - (0x3400, "V"), - (0xA48D, "X"), - (0xA490, "V"), - (0xA4C7, "X"), - (0xA4D0, "V"), - (0xA62C, "X"), - (0xA640, "M", "ꙁ"), - (0xA641, "V"), - (0xA642, "M", "ꙃ"), - (0xA643, "V"), - (0xA644, "M", "ꙅ"), - (0xA645, "V"), - (0xA646, "M", "ꙇ"), - (0xA647, "V"), - (0xA648, "M", "ꙉ"), - (0xA649, "V"), - (0xA64A, "M", "ꙋ"), - (0xA64B, "V"), - (0xA64C, "M", "ꙍ"), - (0xA64D, "V"), - (0xA64E, "M", "ꙏ"), - (0xA64F, "V"), - (0xA650, "M", "ꙑ"), - (0xA651, "V"), - (0xA652, "M", "ꙓ"), - (0xA653, "V"), - (0xA654, "M", "ꙕ"), - (0xA655, "V"), - (0xA656, "M", "ꙗ"), - (0xA657, "V"), - (0xA658, "M", "ꙙ"), - (0xA659, "V"), - (0xA65A, "M", "ꙛ"), - (0xA65B, "V"), - (0xA65C, "M", "ꙝ"), - (0xA65D, "V"), - (0xA65E, "M", "ꙟ"), - (0xA65F, "V"), - (0xA660, "M", "ꙡ"), - (0xA661, "V"), - (0xA662, "M", "ꙣ"), - (0xA663, "V"), - (0xA664, "M", "ꙥ"), - (0xA665, "V"), - (0xA666, "M", "ꙧ"), - (0xA667, "V"), - (0xA668, "M", "ꙩ"), - (0xA669, "V"), - (0xA66A, "M", "ꙫ"), - (0xA66B, "V"), - (0xA66C, "M", "ꙭ"), - (0xA66D, "V"), - (0xA680, "M", "ꚁ"), - (0xA681, "V"), - (0xA682, "M", "ꚃ"), - (0xA683, "V"), - (0xA684, "M", "ꚅ"), - (0xA685, "V"), - (0xA686, "M", "ꚇ"), - (0xA687, "V"), - (0xA688, "M", "ꚉ"), - (0xA689, "V"), - (0xA68A, "M", "ꚋ"), - (0xA68B, "V"), - (0xA68C, "M", "ꚍ"), - (0xA68D, "V"), - (0xA68E, "M", "ꚏ"), - (0xA68F, "V"), - (0xA690, "M", "ꚑ"), - (0xA691, "V"), - ] - - -def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xA692, "M", "ꚓ"), - (0xA693, "V"), - (0xA694, "M", "ꚕ"), - (0xA695, "V"), - (0xA696, "M", "ꚗ"), - (0xA697, "V"), - (0xA698, "M", "ꚙ"), - (0xA699, "V"), - (0xA69A, "M", "ꚛ"), - (0xA69B, "V"), - (0xA69C, "M", "ъ"), - (0xA69D, "M", "ь"), - (0xA69E, "V"), - (0xA6F8, "X"), - (0xA700, "V"), - (0xA722, "M", "ꜣ"), - (0xA723, "V"), - (0xA724, "M", "ꜥ"), - (0xA725, "V"), - (0xA726, "M", "ꜧ"), - (0xA727, "V"), - (0xA728, "M", "ꜩ"), - (0xA729, "V"), - (0xA72A, "M", "ꜫ"), - (0xA72B, "V"), - (0xA72C, "M", "ꜭ"), - (0xA72D, "V"), - (0xA72E, "M", "ꜯ"), - (0xA72F, "V"), - (0xA732, "M", "ꜳ"), - (0xA733, "V"), - (0xA734, "M", "ꜵ"), - (0xA735, "V"), - (0xA736, "M", "ꜷ"), - (0xA737, "V"), - (0xA738, "M", "ꜹ"), - (0xA739, "V"), - (0xA73A, "M", "ꜻ"), - (0xA73B, "V"), - (0xA73C, "M", "ꜽ"), - (0xA73D, "V"), - (0xA73E, "M", "ꜿ"), - (0xA73F, "V"), - (0xA740, "M", "ꝁ"), - (0xA741, "V"), - (0xA742, "M", "ꝃ"), - (0xA743, "V"), - (0xA744, "M", "ꝅ"), - (0xA745, "V"), - (0xA746, "M", "ꝇ"), - (0xA747, "V"), - (0xA748, "M", "ꝉ"), - (0xA749, "V"), - (0xA74A, "M", "ꝋ"), - (0xA74B, "V"), - (0xA74C, "M", "ꝍ"), - (0xA74D, "V"), - (0xA74E, "M", "ꝏ"), - (0xA74F, "V"), - (0xA750, "M", "ꝑ"), - (0xA751, "V"), - (0xA752, "M", "ꝓ"), - (0xA753, "V"), - (0xA754, "M", "ꝕ"), - (0xA755, "V"), - (0xA756, "M", "ꝗ"), - (0xA757, "V"), - (0xA758, "M", "ꝙ"), - (0xA759, "V"), - (0xA75A, "M", "ꝛ"), - (0xA75B, "V"), - (0xA75C, "M", "ꝝ"), - (0xA75D, "V"), - (0xA75E, "M", "ꝟ"), - (0xA75F, "V"), - (0xA760, "M", "ꝡ"), - (0xA761, "V"), - (0xA762, "M", "ꝣ"), - (0xA763, "V"), - (0xA764, "M", "ꝥ"), - (0xA765, "V"), - (0xA766, "M", "ꝧ"), - (0xA767, "V"), - (0xA768, "M", "ꝩ"), - (0xA769, "V"), - (0xA76A, "M", "ꝫ"), - (0xA76B, "V"), - (0xA76C, "M", "ꝭ"), - (0xA76D, "V"), - (0xA76E, "M", "ꝯ"), - (0xA76F, "V"), - (0xA770, "M", "ꝯ"), - (0xA771, "V"), - (0xA779, "M", "ꝺ"), - (0xA77A, "V"), - (0xA77B, "M", "ꝼ"), - (0xA77C, "V"), - (0xA77D, "M", "ᵹ"), - (0xA77E, "M", "ꝿ"), - (0xA77F, "V"), - ] - - -def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xA780, "M", "ꞁ"), - (0xA781, "V"), - (0xA782, "M", "ꞃ"), - (0xA783, "V"), - (0xA784, "M", "ꞅ"), - (0xA785, "V"), - (0xA786, "M", "ꞇ"), - (0xA787, "V"), - (0xA78B, "M", "ꞌ"), - (0xA78C, "V"), - (0xA78D, "M", "ɥ"), - (0xA78E, "V"), - (0xA790, "M", "ꞑ"), - (0xA791, "V"), - (0xA792, "M", "ꞓ"), - (0xA793, "V"), - (0xA796, "M", "ꞗ"), - (0xA797, "V"), - (0xA798, "M", "ꞙ"), - (0xA799, "V"), - (0xA79A, "M", "ꞛ"), - (0xA79B, "V"), - (0xA79C, "M", "ꞝ"), - (0xA79D, "V"), - (0xA79E, "M", "ꞟ"), - (0xA79F, "V"), - (0xA7A0, "M", "ꞡ"), - (0xA7A1, "V"), - (0xA7A2, "M", "ꞣ"), - (0xA7A3, "V"), - (0xA7A4, "M", "ꞥ"), - (0xA7A5, "V"), - (0xA7A6, "M", "ꞧ"), - (0xA7A7, "V"), - (0xA7A8, "M", "ꞩ"), - (0xA7A9, "V"), - (0xA7AA, "M", "ɦ"), - (0xA7AB, "M", "ɜ"), - (0xA7AC, "M", "ɡ"), - (0xA7AD, "M", "ɬ"), - (0xA7AE, "M", "ɪ"), - (0xA7AF, "V"), - (0xA7B0, "M", "ʞ"), - (0xA7B1, "M", "ʇ"), - (0xA7B2, "M", "ʝ"), - (0xA7B3, "M", "ꭓ"), - (0xA7B4, "M", "ꞵ"), - (0xA7B5, "V"), - (0xA7B6, "M", "ꞷ"), - (0xA7B7, "V"), - (0xA7B8, "M", "ꞹ"), - (0xA7B9, "V"), - (0xA7BA, "M", "ꞻ"), - (0xA7BB, "V"), - (0xA7BC, "M", "ꞽ"), - (0xA7BD, "V"), - (0xA7BE, "M", "ꞿ"), - (0xA7BF, "V"), - (0xA7C0, "M", "ꟁ"), - (0xA7C1, "V"), - (0xA7C2, "M", "ꟃ"), - (0xA7C3, "V"), - (0xA7C4, "M", "ꞔ"), - (0xA7C5, "M", "ʂ"), - (0xA7C6, "M", "ᶎ"), - (0xA7C7, "M", "ꟈ"), - (0xA7C8, "V"), - (0xA7C9, "M", "ꟊ"), - (0xA7CA, "V"), - (0xA7CB, "X"), - (0xA7D0, "M", "ꟑ"), - (0xA7D1, "V"), - (0xA7D2, "X"), - (0xA7D3, "V"), - (0xA7D4, "X"), - (0xA7D5, "V"), - (0xA7D6, "M", "ꟗ"), - (0xA7D7, "V"), - (0xA7D8, "M", "ꟙ"), - (0xA7D9, "V"), - (0xA7DA, "X"), - (0xA7F2, "M", "c"), - (0xA7F3, "M", "f"), - (0xA7F4, "M", "q"), - (0xA7F5, "M", "ꟶ"), - (0xA7F6, "V"), - (0xA7F8, "M", "ħ"), - (0xA7F9, "M", "œ"), - (0xA7FA, "V"), - (0xA82D, "X"), - (0xA830, "V"), - (0xA83A, "X"), - (0xA840, "V"), - (0xA878, "X"), - (0xA880, "V"), - (0xA8C6, "X"), - (0xA8CE, "V"), - (0xA8DA, "X"), - (0xA8E0, "V"), - (0xA954, "X"), - ] - - -def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xA95F, "V"), - (0xA97D, "X"), - (0xA980, "V"), - (0xA9CE, "X"), - (0xA9CF, "V"), - (0xA9DA, "X"), - (0xA9DE, "V"), - (0xA9FF, "X"), - (0xAA00, "V"), - (0xAA37, "X"), - (0xAA40, "V"), - (0xAA4E, "X"), - (0xAA50, "V"), - (0xAA5A, "X"), - (0xAA5C, "V"), - (0xAAC3, "X"), - (0xAADB, "V"), - (0xAAF7, "X"), - (0xAB01, "V"), - (0xAB07, "X"), - (0xAB09, "V"), - (0xAB0F, "X"), - (0xAB11, "V"), - (0xAB17, "X"), - (0xAB20, "V"), - (0xAB27, "X"), - (0xAB28, "V"), - (0xAB2F, "X"), - (0xAB30, "V"), - (0xAB5C, "M", "ꜧ"), - (0xAB5D, "M", "ꬷ"), - (0xAB5E, "M", "ɫ"), - (0xAB5F, "M", "ꭒ"), - (0xAB60, "V"), - (0xAB69, "M", "ʍ"), - (0xAB6A, "V"), - (0xAB6C, "X"), - (0xAB70, "M", "Ꭰ"), - (0xAB71, "M", "Ꭱ"), - (0xAB72, "M", "Ꭲ"), - (0xAB73, "M", "Ꭳ"), - (0xAB74, "M", "Ꭴ"), - (0xAB75, "M", "Ꭵ"), - (0xAB76, "M", "Ꭶ"), - (0xAB77, "M", "Ꭷ"), - (0xAB78, "M", "Ꭸ"), - (0xAB79, "M", "Ꭹ"), - (0xAB7A, "M", "Ꭺ"), - (0xAB7B, "M", "Ꭻ"), - (0xAB7C, "M", "Ꭼ"), - (0xAB7D, "M", "Ꭽ"), - (0xAB7E, "M", "Ꭾ"), - (0xAB7F, "M", "Ꭿ"), - (0xAB80, "M", "Ꮀ"), - (0xAB81, "M", "Ꮁ"), - (0xAB82, "M", "Ꮂ"), - (0xAB83, "M", "Ꮃ"), - (0xAB84, "M", "Ꮄ"), - (0xAB85, "M", "Ꮅ"), - (0xAB86, "M", "Ꮆ"), - (0xAB87, "M", "Ꮇ"), - (0xAB88, "M", "Ꮈ"), - (0xAB89, "M", "Ꮉ"), - (0xAB8A, "M", "Ꮊ"), - (0xAB8B, "M", "Ꮋ"), - (0xAB8C, "M", "Ꮌ"), - (0xAB8D, "M", "Ꮍ"), - (0xAB8E, "M", "Ꮎ"), - (0xAB8F, "M", "Ꮏ"), - (0xAB90, "M", "Ꮐ"), - (0xAB91, "M", "Ꮑ"), - (0xAB92, "M", "Ꮒ"), - (0xAB93, "M", "Ꮓ"), - (0xAB94, "M", "Ꮔ"), - (0xAB95, "M", "Ꮕ"), - (0xAB96, "M", "Ꮖ"), - (0xAB97, "M", "Ꮗ"), - (0xAB98, "M", "Ꮘ"), - (0xAB99, "M", "Ꮙ"), - (0xAB9A, "M", "Ꮚ"), - (0xAB9B, "M", "Ꮛ"), - (0xAB9C, "M", "Ꮜ"), - (0xAB9D, "M", "Ꮝ"), - (0xAB9E, "M", "Ꮞ"), - (0xAB9F, "M", "Ꮟ"), - (0xABA0, "M", "Ꮠ"), - (0xABA1, "M", "Ꮡ"), - (0xABA2, "M", "Ꮢ"), - (0xABA3, "M", "Ꮣ"), - (0xABA4, "M", "Ꮤ"), - (0xABA5, "M", "Ꮥ"), - (0xABA6, "M", "Ꮦ"), - (0xABA7, "M", "Ꮧ"), - (0xABA8, "M", "Ꮨ"), - (0xABA9, "M", "Ꮩ"), - (0xABAA, "M", "Ꮪ"), - (0xABAB, "M", "Ꮫ"), - (0xABAC, "M", "Ꮬ"), - (0xABAD, "M", "Ꮭ"), - (0xABAE, "M", "Ꮮ"), - ] - - -def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xABAF, "M", "Ꮯ"), - (0xABB0, "M", "Ꮰ"), - (0xABB1, "M", "Ꮱ"), - (0xABB2, "M", "Ꮲ"), - (0xABB3, "M", "Ꮳ"), - (0xABB4, "M", "Ꮴ"), - (0xABB5, "M", "Ꮵ"), - (0xABB6, "M", "Ꮶ"), - (0xABB7, "M", "Ꮷ"), - (0xABB8, "M", "Ꮸ"), - (0xABB9, "M", "Ꮹ"), - (0xABBA, "M", "Ꮺ"), - (0xABBB, "M", "Ꮻ"), - (0xABBC, "M", "Ꮼ"), - (0xABBD, "M", "Ꮽ"), - (0xABBE, "M", "Ꮾ"), - (0xABBF, "M", "Ꮿ"), - (0xABC0, "V"), - (0xABEE, "X"), - (0xABF0, "V"), - (0xABFA, "X"), - (0xAC00, "V"), - (0xD7A4, "X"), - (0xD7B0, "V"), - (0xD7C7, "X"), - (0xD7CB, "V"), - (0xD7FC, "X"), - (0xF900, "M", "豈"), - (0xF901, "M", "更"), - (0xF902, "M", "車"), - (0xF903, "M", "賈"), - (0xF904, "M", "滑"), - (0xF905, "M", "串"), - (0xF906, "M", "句"), - (0xF907, "M", "龜"), - (0xF909, "M", "契"), - (0xF90A, "M", "金"), - (0xF90B, "M", "喇"), - (0xF90C, "M", "奈"), - (0xF90D, "M", "懶"), - (0xF90E, "M", "癩"), - (0xF90F, "M", "羅"), - (0xF910, "M", "蘿"), - (0xF911, "M", "螺"), - (0xF912, "M", "裸"), - (0xF913, "M", "邏"), - (0xF914, "M", "樂"), - (0xF915, "M", "洛"), - (0xF916, "M", "烙"), - (0xF917, "M", "珞"), - (0xF918, "M", "落"), - (0xF919, "M", "酪"), - (0xF91A, "M", "駱"), - (0xF91B, "M", "亂"), - (0xF91C, "M", "卵"), - (0xF91D, "M", "欄"), - (0xF91E, "M", "爛"), - (0xF91F, "M", "蘭"), - (0xF920, "M", "鸞"), - (0xF921, "M", "嵐"), - (0xF922, "M", "濫"), - (0xF923, "M", "藍"), - (0xF924, "M", "襤"), - (0xF925, "M", "拉"), - (0xF926, "M", "臘"), - (0xF927, "M", "蠟"), - (0xF928, "M", "廊"), - (0xF929, "M", "朗"), - (0xF92A, "M", "浪"), - (0xF92B, "M", "狼"), - (0xF92C, "M", "郎"), - (0xF92D, "M", "來"), - (0xF92E, "M", "冷"), - (0xF92F, "M", "勞"), - (0xF930, "M", "擄"), - (0xF931, "M", "櫓"), - (0xF932, "M", "爐"), - (0xF933, "M", "盧"), - (0xF934, "M", "老"), - (0xF935, "M", "蘆"), - (0xF936, "M", "虜"), - (0xF937, "M", "路"), - (0xF938, "M", "露"), - (0xF939, "M", "魯"), - (0xF93A, "M", "鷺"), - (0xF93B, "M", "碌"), - (0xF93C, "M", "祿"), - (0xF93D, "M", "綠"), - (0xF93E, "M", "菉"), - (0xF93F, "M", "錄"), - (0xF940, "M", "鹿"), - (0xF941, "M", "論"), - (0xF942, "M", "壟"), - (0xF943, "M", "弄"), - (0xF944, "M", "籠"), - (0xF945, "M", "聾"), - (0xF946, "M", "牢"), - (0xF947, "M", "磊"), - (0xF948, "M", "賂"), - (0xF949, "M", "雷"), - ] - - -def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xF94A, "M", "壘"), - (0xF94B, "M", "屢"), - (0xF94C, "M", "樓"), - (0xF94D, "M", "淚"), - (0xF94E, "M", "漏"), - (0xF94F, "M", "累"), - (0xF950, "M", "縷"), - (0xF951, "M", "陋"), - (0xF952, "M", "勒"), - (0xF953, "M", "肋"), - (0xF954, "M", "凜"), - (0xF955, "M", "凌"), - (0xF956, "M", "稜"), - (0xF957, "M", "綾"), - (0xF958, "M", "菱"), - (0xF959, "M", "陵"), - (0xF95A, "M", "讀"), - (0xF95B, "M", "拏"), - (0xF95C, "M", "樂"), - (0xF95D, "M", "諾"), - (0xF95E, "M", "丹"), - (0xF95F, "M", "寧"), - (0xF960, "M", "怒"), - (0xF961, "M", "率"), - (0xF962, "M", "異"), - (0xF963, "M", "北"), - (0xF964, "M", "磻"), - (0xF965, "M", "便"), - (0xF966, "M", "復"), - (0xF967, "M", "不"), - (0xF968, "M", "泌"), - (0xF969, "M", "數"), - (0xF96A, "M", "索"), - (0xF96B, "M", "參"), - (0xF96C, "M", "塞"), - (0xF96D, "M", "省"), - (0xF96E, "M", "葉"), - (0xF96F, "M", "說"), - (0xF970, "M", "殺"), - (0xF971, "M", "辰"), - (0xF972, "M", "沈"), - (0xF973, "M", "拾"), - (0xF974, "M", "若"), - (0xF975, "M", "掠"), - (0xF976, "M", "略"), - (0xF977, "M", "亮"), - (0xF978, "M", "兩"), - (0xF979, "M", "凉"), - (0xF97A, "M", "梁"), - (0xF97B, "M", "糧"), - (0xF97C, "M", "良"), - (0xF97D, "M", "諒"), - (0xF97E, "M", "量"), - (0xF97F, "M", "勵"), - (0xF980, "M", "呂"), - (0xF981, "M", "女"), - (0xF982, "M", "廬"), - (0xF983, "M", "旅"), - (0xF984, "M", "濾"), - (0xF985, "M", "礪"), - (0xF986, "M", "閭"), - (0xF987, "M", "驪"), - (0xF988, "M", "麗"), - (0xF989, "M", "黎"), - (0xF98A, "M", "力"), - (0xF98B, "M", "曆"), - (0xF98C, "M", "歷"), - (0xF98D, "M", "轢"), - (0xF98E, "M", "年"), - (0xF98F, "M", "憐"), - (0xF990, "M", "戀"), - (0xF991, "M", "撚"), - (0xF992, "M", "漣"), - (0xF993, "M", "煉"), - (0xF994, "M", "璉"), - (0xF995, "M", "秊"), - (0xF996, "M", "練"), - (0xF997, "M", "聯"), - (0xF998, "M", "輦"), - (0xF999, "M", "蓮"), - (0xF99A, "M", "連"), - (0xF99B, "M", "鍊"), - (0xF99C, "M", "列"), - (0xF99D, "M", "劣"), - (0xF99E, "M", "咽"), - (0xF99F, "M", "烈"), - (0xF9A0, "M", "裂"), - (0xF9A1, "M", "說"), - (0xF9A2, "M", "廉"), - (0xF9A3, "M", "念"), - (0xF9A4, "M", "捻"), - (0xF9A5, "M", "殮"), - (0xF9A6, "M", "簾"), - (0xF9A7, "M", "獵"), - (0xF9A8, "M", "令"), - (0xF9A9, "M", "囹"), - (0xF9AA, "M", "寧"), - (0xF9AB, "M", "嶺"), - (0xF9AC, "M", "怜"), - (0xF9AD, "M", "玲"), - ] - - -def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xF9AE, "M", "瑩"), - (0xF9AF, "M", "羚"), - (0xF9B0, "M", "聆"), - (0xF9B1, "M", "鈴"), - (0xF9B2, "M", "零"), - (0xF9B3, "M", "靈"), - (0xF9B4, "M", "領"), - (0xF9B5, "M", "例"), - (0xF9B6, "M", "禮"), - (0xF9B7, "M", "醴"), - (0xF9B8, "M", "隸"), - (0xF9B9, "M", "惡"), - (0xF9BA, "M", "了"), - (0xF9BB, "M", "僚"), - (0xF9BC, "M", "寮"), - (0xF9BD, "M", "尿"), - (0xF9BE, "M", "料"), - (0xF9BF, "M", "樂"), - (0xF9C0, "M", "燎"), - (0xF9C1, "M", "療"), - (0xF9C2, "M", "蓼"), - (0xF9C3, "M", "遼"), - (0xF9C4, "M", "龍"), - (0xF9C5, "M", "暈"), - (0xF9C6, "M", "阮"), - (0xF9C7, "M", "劉"), - (0xF9C8, "M", "杻"), - (0xF9C9, "M", "柳"), - (0xF9CA, "M", "流"), - (0xF9CB, "M", "溜"), - (0xF9CC, "M", "琉"), - (0xF9CD, "M", "留"), - (0xF9CE, "M", "硫"), - (0xF9CF, "M", "紐"), - (0xF9D0, "M", "類"), - (0xF9D1, "M", "六"), - (0xF9D2, "M", "戮"), - (0xF9D3, "M", "陸"), - (0xF9D4, "M", "倫"), - (0xF9D5, "M", "崙"), - (0xF9D6, "M", "淪"), - (0xF9D7, "M", "輪"), - (0xF9D8, "M", "律"), - (0xF9D9, "M", "慄"), - (0xF9DA, "M", "栗"), - (0xF9DB, "M", "率"), - (0xF9DC, "M", "隆"), - (0xF9DD, "M", "利"), - (0xF9DE, "M", "吏"), - (0xF9DF, "M", "履"), - (0xF9E0, "M", "易"), - (0xF9E1, "M", "李"), - (0xF9E2, "M", "梨"), - (0xF9E3, "M", "泥"), - (0xF9E4, "M", "理"), - (0xF9E5, "M", "痢"), - (0xF9E6, "M", "罹"), - (0xF9E7, "M", "裏"), - (0xF9E8, "M", "裡"), - (0xF9E9, "M", "里"), - (0xF9EA, "M", "離"), - (0xF9EB, "M", "匿"), - (0xF9EC, "M", "溺"), - (0xF9ED, "M", "吝"), - (0xF9EE, "M", "燐"), - (0xF9EF, "M", "璘"), - (0xF9F0, "M", "藺"), - (0xF9F1, "M", "隣"), - (0xF9F2, "M", "鱗"), - (0xF9F3, "M", "麟"), - (0xF9F4, "M", "林"), - (0xF9F5, "M", "淋"), - (0xF9F6, "M", "臨"), - (0xF9F7, "M", "立"), - (0xF9F8, "M", "笠"), - (0xF9F9, "M", "粒"), - (0xF9FA, "M", "狀"), - (0xF9FB, "M", "炙"), - (0xF9FC, "M", "識"), - (0xF9FD, "M", "什"), - (0xF9FE, "M", "茶"), - (0xF9FF, "M", "刺"), - (0xFA00, "M", "切"), - (0xFA01, "M", "度"), - (0xFA02, "M", "拓"), - (0xFA03, "M", "糖"), - (0xFA04, "M", "宅"), - (0xFA05, "M", "洞"), - (0xFA06, "M", "暴"), - (0xFA07, "M", "輻"), - (0xFA08, "M", "行"), - (0xFA09, "M", "降"), - (0xFA0A, "M", "見"), - (0xFA0B, "M", "廓"), - (0xFA0C, "M", "兀"), - (0xFA0D, "M", "嗀"), - (0xFA0E, "V"), - (0xFA10, "M", "塚"), - (0xFA11, "V"), - (0xFA12, "M", "晴"), - ] - - -def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFA13, "V"), - (0xFA15, "M", "凞"), - (0xFA16, "M", "猪"), - (0xFA17, "M", "益"), - (0xFA18, "M", "礼"), - (0xFA19, "M", "神"), - (0xFA1A, "M", "祥"), - (0xFA1B, "M", "福"), - (0xFA1C, "M", "靖"), - (0xFA1D, "M", "精"), - (0xFA1E, "M", "羽"), - (0xFA1F, "V"), - (0xFA20, "M", "蘒"), - (0xFA21, "V"), - (0xFA22, "M", "諸"), - (0xFA23, "V"), - (0xFA25, "M", "逸"), - (0xFA26, "M", "都"), - (0xFA27, "V"), - (0xFA2A, "M", "飯"), - (0xFA2B, "M", "飼"), - (0xFA2C, "M", "館"), - (0xFA2D, "M", "鶴"), - (0xFA2E, "M", "郞"), - (0xFA2F, "M", "隷"), - (0xFA30, "M", "侮"), - (0xFA31, "M", "僧"), - (0xFA32, "M", "免"), - (0xFA33, "M", "勉"), - (0xFA34, "M", "勤"), - (0xFA35, "M", "卑"), - (0xFA36, "M", "喝"), - (0xFA37, "M", "嘆"), - (0xFA38, "M", "器"), - (0xFA39, "M", "塀"), - (0xFA3A, "M", "墨"), - (0xFA3B, "M", "層"), - (0xFA3C, "M", "屮"), - (0xFA3D, "M", "悔"), - (0xFA3E, "M", "慨"), - (0xFA3F, "M", "憎"), - (0xFA40, "M", "懲"), - (0xFA41, "M", "敏"), - (0xFA42, "M", "既"), - (0xFA43, "M", "暑"), - (0xFA44, "M", "梅"), - (0xFA45, "M", "海"), - (0xFA46, "M", "渚"), - (0xFA47, "M", "漢"), - (0xFA48, "M", "煮"), - (0xFA49, "M", "爫"), - (0xFA4A, "M", "琢"), - (0xFA4B, "M", "碑"), - (0xFA4C, "M", "社"), - (0xFA4D, "M", "祉"), - (0xFA4E, "M", "祈"), - (0xFA4F, "M", "祐"), - (0xFA50, "M", "祖"), - (0xFA51, "M", "祝"), - (0xFA52, "M", "禍"), - (0xFA53, "M", "禎"), - (0xFA54, "M", "穀"), - (0xFA55, "M", "突"), - (0xFA56, "M", "節"), - (0xFA57, "M", "練"), - (0xFA58, "M", "縉"), - (0xFA59, "M", "繁"), - (0xFA5A, "M", "署"), - (0xFA5B, "M", "者"), - (0xFA5C, "M", "臭"), - (0xFA5D, "M", "艹"), - (0xFA5F, "M", "著"), - (0xFA60, "M", "褐"), - (0xFA61, "M", "視"), - (0xFA62, "M", "謁"), - (0xFA63, "M", "謹"), - (0xFA64, "M", "賓"), - (0xFA65, "M", "贈"), - (0xFA66, "M", "辶"), - (0xFA67, "M", "逸"), - (0xFA68, "M", "難"), - (0xFA69, "M", "響"), - (0xFA6A, "M", "頻"), - (0xFA6B, "M", "恵"), - (0xFA6C, "M", "𤋮"), - (0xFA6D, "M", "舘"), - (0xFA6E, "X"), - (0xFA70, "M", "並"), - (0xFA71, "M", "况"), - (0xFA72, "M", "全"), - (0xFA73, "M", "侀"), - (0xFA74, "M", "充"), - (0xFA75, "M", "冀"), - (0xFA76, "M", "勇"), - (0xFA77, "M", "勺"), - (0xFA78, "M", "喝"), - (0xFA79, "M", "啕"), - (0xFA7A, "M", "喙"), - (0xFA7B, "M", "嗢"), - (0xFA7C, "M", "塚"), - ] - - -def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFA7D, "M", "墳"), - (0xFA7E, "M", "奄"), - (0xFA7F, "M", "奔"), - (0xFA80, "M", "婢"), - (0xFA81, "M", "嬨"), - (0xFA82, "M", "廒"), - (0xFA83, "M", "廙"), - (0xFA84, "M", "彩"), - (0xFA85, "M", "徭"), - (0xFA86, "M", "惘"), - (0xFA87, "M", "慎"), - (0xFA88, "M", "愈"), - (0xFA89, "M", "憎"), - (0xFA8A, "M", "慠"), - (0xFA8B, "M", "懲"), - (0xFA8C, "M", "戴"), - (0xFA8D, "M", "揄"), - (0xFA8E, "M", "搜"), - (0xFA8F, "M", "摒"), - (0xFA90, "M", "敖"), - (0xFA91, "M", "晴"), - (0xFA92, "M", "朗"), - (0xFA93, "M", "望"), - (0xFA94, "M", "杖"), - (0xFA95, "M", "歹"), - (0xFA96, "M", "殺"), - (0xFA97, "M", "流"), - (0xFA98, "M", "滛"), - (0xFA99, "M", "滋"), - (0xFA9A, "M", "漢"), - (0xFA9B, "M", "瀞"), - (0xFA9C, "M", "煮"), - (0xFA9D, "M", "瞧"), - (0xFA9E, "M", "爵"), - (0xFA9F, "M", "犯"), - (0xFAA0, "M", "猪"), - (0xFAA1, "M", "瑱"), - (0xFAA2, "M", "甆"), - (0xFAA3, "M", "画"), - (0xFAA4, "M", "瘝"), - (0xFAA5, "M", "瘟"), - (0xFAA6, "M", "益"), - (0xFAA7, "M", "盛"), - (0xFAA8, "M", "直"), - (0xFAA9, "M", "睊"), - (0xFAAA, "M", "着"), - (0xFAAB, "M", "磌"), - (0xFAAC, "M", "窱"), - (0xFAAD, "M", "節"), - (0xFAAE, "M", "类"), - (0xFAAF, "M", "絛"), - (0xFAB0, "M", "練"), - (0xFAB1, "M", "缾"), - (0xFAB2, "M", "者"), - (0xFAB3, "M", "荒"), - (0xFAB4, "M", "華"), - (0xFAB5, "M", "蝹"), - (0xFAB6, "M", "襁"), - (0xFAB7, "M", "覆"), - (0xFAB8, "M", "視"), - (0xFAB9, "M", "調"), - (0xFABA, "M", "諸"), - (0xFABB, "M", "請"), - (0xFABC, "M", "謁"), - (0xFABD, "M", "諾"), - (0xFABE, "M", "諭"), - (0xFABF, "M", "謹"), - (0xFAC0, "M", "變"), - (0xFAC1, "M", "贈"), - (0xFAC2, "M", "輸"), - (0xFAC3, "M", "遲"), - (0xFAC4, "M", "醙"), - (0xFAC5, "M", "鉶"), - (0xFAC6, "M", "陼"), - (0xFAC7, "M", "難"), - (0xFAC8, "M", "靖"), - (0xFAC9, "M", "韛"), - (0xFACA, "M", "響"), - (0xFACB, "M", "頋"), - (0xFACC, "M", "頻"), - (0xFACD, "M", "鬒"), - (0xFACE, "M", "龜"), - (0xFACF, "M", "𢡊"), - (0xFAD0, "M", "𢡄"), - (0xFAD1, "M", "𣏕"), - (0xFAD2, "M", "㮝"), - (0xFAD3, "M", "䀘"), - (0xFAD4, "M", "䀹"), - (0xFAD5, "M", "𥉉"), - (0xFAD6, "M", "𥳐"), - (0xFAD7, "M", "𧻓"), - (0xFAD8, "M", "齃"), - (0xFAD9, "M", "龎"), - (0xFADA, "X"), - (0xFB00, "M", "ff"), - (0xFB01, "M", "fi"), - (0xFB02, "M", "fl"), - (0xFB03, "M", "ffi"), - (0xFB04, "M", "ffl"), - (0xFB05, "M", "st"), - ] - - -def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFB07, "X"), - (0xFB13, "M", "մն"), - (0xFB14, "M", "մե"), - (0xFB15, "M", "մի"), - (0xFB16, "M", "վն"), - (0xFB17, "M", "մխ"), - (0xFB18, "X"), - (0xFB1D, "M", "יִ"), - (0xFB1E, "V"), - (0xFB1F, "M", "ײַ"), - (0xFB20, "M", "ע"), - (0xFB21, "M", "א"), - (0xFB22, "M", "ד"), - (0xFB23, "M", "ה"), - (0xFB24, "M", "כ"), - (0xFB25, "M", "ל"), - (0xFB26, "M", "ם"), - (0xFB27, "M", "ר"), - (0xFB28, "M", "ת"), - (0xFB29, "3", "+"), - (0xFB2A, "M", "שׁ"), - (0xFB2B, "M", "שׂ"), - (0xFB2C, "M", "שּׁ"), - (0xFB2D, "M", "שּׂ"), - (0xFB2E, "M", "אַ"), - (0xFB2F, "M", "אָ"), - (0xFB30, "M", "אּ"), - (0xFB31, "M", "בּ"), - (0xFB32, "M", "גּ"), - (0xFB33, "M", "דּ"), - (0xFB34, "M", "הּ"), - (0xFB35, "M", "וּ"), - (0xFB36, "M", "זּ"), - (0xFB37, "X"), - (0xFB38, "M", "טּ"), - (0xFB39, "M", "יּ"), - (0xFB3A, "M", "ךּ"), - (0xFB3B, "M", "כּ"), - (0xFB3C, "M", "לּ"), - (0xFB3D, "X"), - (0xFB3E, "M", "מּ"), - (0xFB3F, "X"), - (0xFB40, "M", "נּ"), - (0xFB41, "M", "סּ"), - (0xFB42, "X"), - (0xFB43, "M", "ףּ"), - (0xFB44, "M", "פּ"), - (0xFB45, "X"), - (0xFB46, "M", "צּ"), - (0xFB47, "M", "קּ"), - (0xFB48, "M", "רּ"), - (0xFB49, "M", "שּ"), - (0xFB4A, "M", "תּ"), - (0xFB4B, "M", "וֹ"), - (0xFB4C, "M", "בֿ"), - (0xFB4D, "M", "כֿ"), - (0xFB4E, "M", "פֿ"), - (0xFB4F, "M", "אל"), - (0xFB50, "M", "ٱ"), - (0xFB52, "M", "ٻ"), - (0xFB56, "M", "پ"), - (0xFB5A, "M", "ڀ"), - (0xFB5E, "M", "ٺ"), - (0xFB62, "M", "ٿ"), - (0xFB66, "M", "ٹ"), - (0xFB6A, "M", "ڤ"), - (0xFB6E, "M", "ڦ"), - (0xFB72, "M", "ڄ"), - (0xFB76, "M", "ڃ"), - (0xFB7A, "M", "چ"), - (0xFB7E, "M", "ڇ"), - (0xFB82, "M", "ڍ"), - (0xFB84, "M", "ڌ"), - (0xFB86, "M", "ڎ"), - (0xFB88, "M", "ڈ"), - (0xFB8A, "M", "ژ"), - (0xFB8C, "M", "ڑ"), - (0xFB8E, "M", "ک"), - (0xFB92, "M", "گ"), - (0xFB96, "M", "ڳ"), - (0xFB9A, "M", "ڱ"), - (0xFB9E, "M", "ں"), - (0xFBA0, "M", "ڻ"), - (0xFBA4, "M", "ۀ"), - (0xFBA6, "M", "ہ"), - (0xFBAA, "M", "ھ"), - (0xFBAE, "M", "ے"), - (0xFBB0, "M", "ۓ"), - (0xFBB2, "V"), - (0xFBC3, "X"), - (0xFBD3, "M", "ڭ"), - (0xFBD7, "M", "ۇ"), - (0xFBD9, "M", "ۆ"), - (0xFBDB, "M", "ۈ"), - (0xFBDD, "M", "ۇٴ"), - (0xFBDE, "M", "ۋ"), - (0xFBE0, "M", "ۅ"), - (0xFBE2, "M", "ۉ"), - (0xFBE4, "M", "ې"), - (0xFBE8, "M", "ى"), - ] - - -def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFBEA, "M", "ئا"), - (0xFBEC, "M", "ئە"), - (0xFBEE, "M", "ئو"), - (0xFBF0, "M", "ئۇ"), - (0xFBF2, "M", "ئۆ"), - (0xFBF4, "M", "ئۈ"), - (0xFBF6, "M", "ئې"), - (0xFBF9, "M", "ئى"), - (0xFBFC, "M", "ی"), - (0xFC00, "M", "ئج"), - (0xFC01, "M", "ئح"), - (0xFC02, "M", "ئم"), - (0xFC03, "M", "ئى"), - (0xFC04, "M", "ئي"), - (0xFC05, "M", "بج"), - (0xFC06, "M", "بح"), - (0xFC07, "M", "بخ"), - (0xFC08, "M", "بم"), - (0xFC09, "M", "بى"), - (0xFC0A, "M", "بي"), - (0xFC0B, "M", "تج"), - (0xFC0C, "M", "تح"), - (0xFC0D, "M", "تخ"), - (0xFC0E, "M", "تم"), - (0xFC0F, "M", "تى"), - (0xFC10, "M", "تي"), - (0xFC11, "M", "ثج"), - (0xFC12, "M", "ثم"), - (0xFC13, "M", "ثى"), - (0xFC14, "M", "ثي"), - (0xFC15, "M", "جح"), - (0xFC16, "M", "جم"), - (0xFC17, "M", "حج"), - (0xFC18, "M", "حم"), - (0xFC19, "M", "خج"), - (0xFC1A, "M", "خح"), - (0xFC1B, "M", "خم"), - (0xFC1C, "M", "سج"), - (0xFC1D, "M", "سح"), - (0xFC1E, "M", "سخ"), - (0xFC1F, "M", "سم"), - (0xFC20, "M", "صح"), - (0xFC21, "M", "صم"), - (0xFC22, "M", "ضج"), - (0xFC23, "M", "ضح"), - (0xFC24, "M", "ضخ"), - (0xFC25, "M", "ضم"), - (0xFC26, "M", "طح"), - (0xFC27, "M", "طم"), - (0xFC28, "M", "ظم"), - (0xFC29, "M", "عج"), - (0xFC2A, "M", "عم"), - (0xFC2B, "M", "غج"), - (0xFC2C, "M", "غم"), - (0xFC2D, "M", "فج"), - (0xFC2E, "M", "فح"), - (0xFC2F, "M", "فخ"), - (0xFC30, "M", "فم"), - (0xFC31, "M", "فى"), - (0xFC32, "M", "في"), - (0xFC33, "M", "قح"), - (0xFC34, "M", "قم"), - (0xFC35, "M", "قى"), - (0xFC36, "M", "قي"), - (0xFC37, "M", "كا"), - (0xFC38, "M", "كج"), - (0xFC39, "M", "كح"), - (0xFC3A, "M", "كخ"), - (0xFC3B, "M", "كل"), - (0xFC3C, "M", "كم"), - (0xFC3D, "M", "كى"), - (0xFC3E, "M", "كي"), - (0xFC3F, "M", "لج"), - (0xFC40, "M", "لح"), - (0xFC41, "M", "لخ"), - (0xFC42, "M", "لم"), - (0xFC43, "M", "لى"), - (0xFC44, "M", "لي"), - (0xFC45, "M", "مج"), - (0xFC46, "M", "مح"), - (0xFC47, "M", "مخ"), - (0xFC48, "M", "مم"), - (0xFC49, "M", "مى"), - (0xFC4A, "M", "مي"), - (0xFC4B, "M", "نج"), - (0xFC4C, "M", "نح"), - (0xFC4D, "M", "نخ"), - (0xFC4E, "M", "نم"), - (0xFC4F, "M", "نى"), - (0xFC50, "M", "ني"), - (0xFC51, "M", "هج"), - (0xFC52, "M", "هم"), - (0xFC53, "M", "هى"), - (0xFC54, "M", "هي"), - (0xFC55, "M", "يج"), - (0xFC56, "M", "يح"), - (0xFC57, "M", "يخ"), - (0xFC58, "M", "يم"), - (0xFC59, "M", "يى"), - (0xFC5A, "M", "يي"), - ] - - -def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFC5B, "M", "ذٰ"), - (0xFC5C, "M", "رٰ"), - (0xFC5D, "M", "ىٰ"), - (0xFC5E, "3", " ٌّ"), - (0xFC5F, "3", " ٍّ"), - (0xFC60, "3", " َّ"), - (0xFC61, "3", " ُّ"), - (0xFC62, "3", " ِّ"), - (0xFC63, "3", " ّٰ"), - (0xFC64, "M", "ئر"), - (0xFC65, "M", "ئز"), - (0xFC66, "M", "ئم"), - (0xFC67, "M", "ئن"), - (0xFC68, "M", "ئى"), - (0xFC69, "M", "ئي"), - (0xFC6A, "M", "بر"), - (0xFC6B, "M", "بز"), - (0xFC6C, "M", "بم"), - (0xFC6D, "M", "بن"), - (0xFC6E, "M", "بى"), - (0xFC6F, "M", "بي"), - (0xFC70, "M", "تر"), - (0xFC71, "M", "تز"), - (0xFC72, "M", "تم"), - (0xFC73, "M", "تن"), - (0xFC74, "M", "تى"), - (0xFC75, "M", "تي"), - (0xFC76, "M", "ثر"), - (0xFC77, "M", "ثز"), - (0xFC78, "M", "ثم"), - (0xFC79, "M", "ثن"), - (0xFC7A, "M", "ثى"), - (0xFC7B, "M", "ثي"), - (0xFC7C, "M", "فى"), - (0xFC7D, "M", "في"), - (0xFC7E, "M", "قى"), - (0xFC7F, "M", "قي"), - (0xFC80, "M", "كا"), - (0xFC81, "M", "كل"), - (0xFC82, "M", "كم"), - (0xFC83, "M", "كى"), - (0xFC84, "M", "كي"), - (0xFC85, "M", "لم"), - (0xFC86, "M", "لى"), - (0xFC87, "M", "لي"), - (0xFC88, "M", "ما"), - (0xFC89, "M", "مم"), - (0xFC8A, "M", "نر"), - (0xFC8B, "M", "نز"), - (0xFC8C, "M", "نم"), - (0xFC8D, "M", "نن"), - (0xFC8E, "M", "نى"), - (0xFC8F, "M", "ني"), - (0xFC90, "M", "ىٰ"), - (0xFC91, "M", "ير"), - (0xFC92, "M", "يز"), - (0xFC93, "M", "يم"), - (0xFC94, "M", "ين"), - (0xFC95, "M", "يى"), - (0xFC96, "M", "يي"), - (0xFC97, "M", "ئج"), - (0xFC98, "M", "ئح"), - (0xFC99, "M", "ئخ"), - (0xFC9A, "M", "ئم"), - (0xFC9B, "M", "ئه"), - (0xFC9C, "M", "بج"), - (0xFC9D, "M", "بح"), - (0xFC9E, "M", "بخ"), - (0xFC9F, "M", "بم"), - (0xFCA0, "M", "به"), - (0xFCA1, "M", "تج"), - (0xFCA2, "M", "تح"), - (0xFCA3, "M", "تخ"), - (0xFCA4, "M", "تم"), - (0xFCA5, "M", "ته"), - (0xFCA6, "M", "ثم"), - (0xFCA7, "M", "جح"), - (0xFCA8, "M", "جم"), - (0xFCA9, "M", "حج"), - (0xFCAA, "M", "حم"), - (0xFCAB, "M", "خج"), - (0xFCAC, "M", "خم"), - (0xFCAD, "M", "سج"), - (0xFCAE, "M", "سح"), - (0xFCAF, "M", "سخ"), - (0xFCB0, "M", "سم"), - (0xFCB1, "M", "صح"), - (0xFCB2, "M", "صخ"), - (0xFCB3, "M", "صم"), - (0xFCB4, "M", "ضج"), - (0xFCB5, "M", "ضح"), - (0xFCB6, "M", "ضخ"), - (0xFCB7, "M", "ضم"), - (0xFCB8, "M", "طح"), - (0xFCB9, "M", "ظم"), - (0xFCBA, "M", "عج"), - (0xFCBB, "M", "عم"), - (0xFCBC, "M", "غج"), - (0xFCBD, "M", "غم"), - (0xFCBE, "M", "فج"), - ] - - -def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFCBF, "M", "فح"), - (0xFCC0, "M", "فخ"), - (0xFCC1, "M", "فم"), - (0xFCC2, "M", "قح"), - (0xFCC3, "M", "قم"), - (0xFCC4, "M", "كج"), - (0xFCC5, "M", "كح"), - (0xFCC6, "M", "كخ"), - (0xFCC7, "M", "كل"), - (0xFCC8, "M", "كم"), - (0xFCC9, "M", "لج"), - (0xFCCA, "M", "لح"), - (0xFCCB, "M", "لخ"), - (0xFCCC, "M", "لم"), - (0xFCCD, "M", "له"), - (0xFCCE, "M", "مج"), - (0xFCCF, "M", "مح"), - (0xFCD0, "M", "مخ"), - (0xFCD1, "M", "مم"), - (0xFCD2, "M", "نج"), - (0xFCD3, "M", "نح"), - (0xFCD4, "M", "نخ"), - (0xFCD5, "M", "نم"), - (0xFCD6, "M", "نه"), - (0xFCD7, "M", "هج"), - (0xFCD8, "M", "هم"), - (0xFCD9, "M", "هٰ"), - (0xFCDA, "M", "يج"), - (0xFCDB, "M", "يح"), - (0xFCDC, "M", "يخ"), - (0xFCDD, "M", "يم"), - (0xFCDE, "M", "يه"), - (0xFCDF, "M", "ئم"), - (0xFCE0, "M", "ئه"), - (0xFCE1, "M", "بم"), - (0xFCE2, "M", "به"), - (0xFCE3, "M", "تم"), - (0xFCE4, "M", "ته"), - (0xFCE5, "M", "ثم"), - (0xFCE6, "M", "ثه"), - (0xFCE7, "M", "سم"), - (0xFCE8, "M", "سه"), - (0xFCE9, "M", "شم"), - (0xFCEA, "M", "شه"), - (0xFCEB, "M", "كل"), - (0xFCEC, "M", "كم"), - (0xFCED, "M", "لم"), - (0xFCEE, "M", "نم"), - (0xFCEF, "M", "نه"), - (0xFCF0, "M", "يم"), - (0xFCF1, "M", "يه"), - (0xFCF2, "M", "ـَّ"), - (0xFCF3, "M", "ـُّ"), - (0xFCF4, "M", "ـِّ"), - (0xFCF5, "M", "طى"), - (0xFCF6, "M", "طي"), - (0xFCF7, "M", "عى"), - (0xFCF8, "M", "عي"), - (0xFCF9, "M", "غى"), - (0xFCFA, "M", "غي"), - (0xFCFB, "M", "سى"), - (0xFCFC, "M", "سي"), - (0xFCFD, "M", "شى"), - (0xFCFE, "M", "شي"), - (0xFCFF, "M", "حى"), - (0xFD00, "M", "حي"), - (0xFD01, "M", "جى"), - (0xFD02, "M", "جي"), - (0xFD03, "M", "خى"), - (0xFD04, "M", "خي"), - (0xFD05, "M", "صى"), - (0xFD06, "M", "صي"), - (0xFD07, "M", "ضى"), - (0xFD08, "M", "ضي"), - (0xFD09, "M", "شج"), - (0xFD0A, "M", "شح"), - (0xFD0B, "M", "شخ"), - (0xFD0C, "M", "شم"), - (0xFD0D, "M", "شر"), - (0xFD0E, "M", "سر"), - (0xFD0F, "M", "صر"), - (0xFD10, "M", "ضر"), - (0xFD11, "M", "طى"), - (0xFD12, "M", "طي"), - (0xFD13, "M", "عى"), - (0xFD14, "M", "عي"), - (0xFD15, "M", "غى"), - (0xFD16, "M", "غي"), - (0xFD17, "M", "سى"), - (0xFD18, "M", "سي"), - (0xFD19, "M", "شى"), - (0xFD1A, "M", "شي"), - (0xFD1B, "M", "حى"), - (0xFD1C, "M", "حي"), - (0xFD1D, "M", "جى"), - (0xFD1E, "M", "جي"), - (0xFD1F, "M", "خى"), - (0xFD20, "M", "خي"), - (0xFD21, "M", "صى"), - (0xFD22, "M", "صي"), - ] - - -def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFD23, "M", "ضى"), - (0xFD24, "M", "ضي"), - (0xFD25, "M", "شج"), - (0xFD26, "M", "شح"), - (0xFD27, "M", "شخ"), - (0xFD28, "M", "شم"), - (0xFD29, "M", "شر"), - (0xFD2A, "M", "سر"), - (0xFD2B, "M", "صر"), - (0xFD2C, "M", "ضر"), - (0xFD2D, "M", "شج"), - (0xFD2E, "M", "شح"), - (0xFD2F, "M", "شخ"), - (0xFD30, "M", "شم"), - (0xFD31, "M", "سه"), - (0xFD32, "M", "شه"), - (0xFD33, "M", "طم"), - (0xFD34, "M", "سج"), - (0xFD35, "M", "سح"), - (0xFD36, "M", "سخ"), - (0xFD37, "M", "شج"), - (0xFD38, "M", "شح"), - (0xFD39, "M", "شخ"), - (0xFD3A, "M", "طم"), - (0xFD3B, "M", "ظم"), - (0xFD3C, "M", "اً"), - (0xFD3E, "V"), - (0xFD50, "M", "تجم"), - (0xFD51, "M", "تحج"), - (0xFD53, "M", "تحم"), - (0xFD54, "M", "تخم"), - (0xFD55, "M", "تمج"), - (0xFD56, "M", "تمح"), - (0xFD57, "M", "تمخ"), - (0xFD58, "M", "جمح"), - (0xFD5A, "M", "حمي"), - (0xFD5B, "M", "حمى"), - (0xFD5C, "M", "سحج"), - (0xFD5D, "M", "سجح"), - (0xFD5E, "M", "سجى"), - (0xFD5F, "M", "سمح"), - (0xFD61, "M", "سمج"), - (0xFD62, "M", "سمم"), - (0xFD64, "M", "صحح"), - (0xFD66, "M", "صمم"), - (0xFD67, "M", "شحم"), - (0xFD69, "M", "شجي"), - (0xFD6A, "M", "شمخ"), - (0xFD6C, "M", "شمم"), - (0xFD6E, "M", "ضحى"), - (0xFD6F, "M", "ضخم"), - (0xFD71, "M", "طمح"), - (0xFD73, "M", "طمم"), - (0xFD74, "M", "طمي"), - (0xFD75, "M", "عجم"), - (0xFD76, "M", "عمم"), - (0xFD78, "M", "عمى"), - (0xFD79, "M", "غمم"), - (0xFD7A, "M", "غمي"), - (0xFD7B, "M", "غمى"), - (0xFD7C, "M", "فخم"), - (0xFD7E, "M", "قمح"), - (0xFD7F, "M", "قمم"), - (0xFD80, "M", "لحم"), - (0xFD81, "M", "لحي"), - (0xFD82, "M", "لحى"), - (0xFD83, "M", "لجج"), - (0xFD85, "M", "لخم"), - (0xFD87, "M", "لمح"), - (0xFD89, "M", "محج"), - (0xFD8A, "M", "محم"), - (0xFD8B, "M", "محي"), - (0xFD8C, "M", "مجح"), - (0xFD8D, "M", "مجم"), - (0xFD8E, "M", "مخج"), - (0xFD8F, "M", "مخم"), - (0xFD90, "X"), - (0xFD92, "M", "مجخ"), - (0xFD93, "M", "همج"), - (0xFD94, "M", "همم"), - (0xFD95, "M", "نحم"), - (0xFD96, "M", "نحى"), - (0xFD97, "M", "نجم"), - (0xFD99, "M", "نجى"), - (0xFD9A, "M", "نمي"), - (0xFD9B, "M", "نمى"), - (0xFD9C, "M", "يمم"), - (0xFD9E, "M", "بخي"), - (0xFD9F, "M", "تجي"), - (0xFDA0, "M", "تجى"), - (0xFDA1, "M", "تخي"), - (0xFDA2, "M", "تخى"), - (0xFDA3, "M", "تمي"), - (0xFDA4, "M", "تمى"), - (0xFDA5, "M", "جمي"), - (0xFDA6, "M", "جحى"), - (0xFDA7, "M", "جمى"), - (0xFDA8, "M", "سخى"), - (0xFDA9, "M", "صحي"), - (0xFDAA, "M", "شحي"), - ] - - -def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFDAB, "M", "ضحي"), - (0xFDAC, "M", "لجي"), - (0xFDAD, "M", "لمي"), - (0xFDAE, "M", "يحي"), - (0xFDAF, "M", "يجي"), - (0xFDB0, "M", "يمي"), - (0xFDB1, "M", "ممي"), - (0xFDB2, "M", "قمي"), - (0xFDB3, "M", "نحي"), - (0xFDB4, "M", "قمح"), - (0xFDB5, "M", "لحم"), - (0xFDB6, "M", "عمي"), - (0xFDB7, "M", "كمي"), - (0xFDB8, "M", "نجح"), - (0xFDB9, "M", "مخي"), - (0xFDBA, "M", "لجم"), - (0xFDBB, "M", "كمم"), - (0xFDBC, "M", "لجم"), - (0xFDBD, "M", "نجح"), - (0xFDBE, "M", "جحي"), - (0xFDBF, "M", "حجي"), - (0xFDC0, "M", "مجي"), - (0xFDC1, "M", "فمي"), - (0xFDC2, "M", "بحي"), - (0xFDC3, "M", "كمم"), - (0xFDC4, "M", "عجم"), - (0xFDC5, "M", "صمم"), - (0xFDC6, "M", "سخي"), - (0xFDC7, "M", "نجي"), - (0xFDC8, "X"), - (0xFDCF, "V"), - (0xFDD0, "X"), - (0xFDF0, "M", "صلے"), - (0xFDF1, "M", "قلے"), - (0xFDF2, "M", "الله"), - (0xFDF3, "M", "اكبر"), - (0xFDF4, "M", "محمد"), - (0xFDF5, "M", "صلعم"), - (0xFDF6, "M", "رسول"), - (0xFDF7, "M", "عليه"), - (0xFDF8, "M", "وسلم"), - (0xFDF9, "M", "صلى"), - (0xFDFA, "3", "صلى الله عليه وسلم"), - (0xFDFB, "3", "جل جلاله"), - (0xFDFC, "M", "ریال"), - (0xFDFD, "V"), - (0xFE00, "I"), - (0xFE10, "3", ","), - (0xFE11, "M", "、"), - (0xFE12, "X"), - (0xFE13, "3", ":"), - (0xFE14, "3", ";"), - (0xFE15, "3", "!"), - (0xFE16, "3", "?"), - (0xFE17, "M", "〖"), - (0xFE18, "M", "〗"), - (0xFE19, "X"), - (0xFE20, "V"), - (0xFE30, "X"), - (0xFE31, "M", "—"), - (0xFE32, "M", "–"), - (0xFE33, "3", "_"), - (0xFE35, "3", "("), - (0xFE36, "3", ")"), - (0xFE37, "3", "{"), - (0xFE38, "3", "}"), - (0xFE39, "M", "〔"), - (0xFE3A, "M", "〕"), - (0xFE3B, "M", "【"), - (0xFE3C, "M", "】"), - (0xFE3D, "M", "《"), - (0xFE3E, "M", "》"), - (0xFE3F, "M", "〈"), - (0xFE40, "M", "〉"), - (0xFE41, "M", "「"), - (0xFE42, "M", "」"), - (0xFE43, "M", "『"), - (0xFE44, "M", "』"), - (0xFE45, "V"), - (0xFE47, "3", "["), - (0xFE48, "3", "]"), - (0xFE49, "3", " ̅"), - (0xFE4D, "3", "_"), - (0xFE50, "3", ","), - (0xFE51, "M", "、"), - (0xFE52, "X"), - (0xFE54, "3", ";"), - (0xFE55, "3", ":"), - (0xFE56, "3", "?"), - (0xFE57, "3", "!"), - (0xFE58, "M", "—"), - (0xFE59, "3", "("), - (0xFE5A, "3", ")"), - (0xFE5B, "3", "{"), - (0xFE5C, "3", "}"), - (0xFE5D, "M", "〔"), - (0xFE5E, "M", "〕"), - (0xFE5F, "3", "#"), - (0xFE60, "3", "&"), - (0xFE61, "3", "*"), - ] - - -def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFE62, "3", "+"), - (0xFE63, "M", "-"), - (0xFE64, "3", "<"), - (0xFE65, "3", ">"), - (0xFE66, "3", "="), - (0xFE67, "X"), - (0xFE68, "3", "\\"), - (0xFE69, "3", "$"), - (0xFE6A, "3", "%"), - (0xFE6B, "3", "@"), - (0xFE6C, "X"), - (0xFE70, "3", " ً"), - (0xFE71, "M", "ـً"), - (0xFE72, "3", " ٌ"), - (0xFE73, "V"), - (0xFE74, "3", " ٍ"), - (0xFE75, "X"), - (0xFE76, "3", " َ"), - (0xFE77, "M", "ـَ"), - (0xFE78, "3", " ُ"), - (0xFE79, "M", "ـُ"), - (0xFE7A, "3", " ِ"), - (0xFE7B, "M", "ـِ"), - (0xFE7C, "3", " ّ"), - (0xFE7D, "M", "ـّ"), - (0xFE7E, "3", " ْ"), - (0xFE7F, "M", "ـْ"), - (0xFE80, "M", "ء"), - (0xFE81, "M", "آ"), - (0xFE83, "M", "أ"), - (0xFE85, "M", "ؤ"), - (0xFE87, "M", "إ"), - (0xFE89, "M", "ئ"), - (0xFE8D, "M", "ا"), - (0xFE8F, "M", "ب"), - (0xFE93, "M", "ة"), - (0xFE95, "M", "ت"), - (0xFE99, "M", "ث"), - (0xFE9D, "M", "ج"), - (0xFEA1, "M", "ح"), - (0xFEA5, "M", "خ"), - (0xFEA9, "M", "د"), - (0xFEAB, "M", "ذ"), - (0xFEAD, "M", "ر"), - (0xFEAF, "M", "ز"), - (0xFEB1, "M", "س"), - (0xFEB5, "M", "ش"), - (0xFEB9, "M", "ص"), - (0xFEBD, "M", "ض"), - (0xFEC1, "M", "ط"), - (0xFEC5, "M", "ظ"), - (0xFEC9, "M", "ع"), - (0xFECD, "M", "غ"), - (0xFED1, "M", "ف"), - (0xFED5, "M", "ق"), - (0xFED9, "M", "ك"), - (0xFEDD, "M", "ل"), - (0xFEE1, "M", "م"), - (0xFEE5, "M", "ن"), - (0xFEE9, "M", "ه"), - (0xFEED, "M", "و"), - (0xFEEF, "M", "ى"), - (0xFEF1, "M", "ي"), - (0xFEF5, "M", "لآ"), - (0xFEF7, "M", "لأ"), - (0xFEF9, "M", "لإ"), - (0xFEFB, "M", "لا"), - (0xFEFD, "X"), - (0xFEFF, "I"), - (0xFF00, "X"), - (0xFF01, "3", "!"), - (0xFF02, "3", '"'), - (0xFF03, "3", "#"), - (0xFF04, "3", "$"), - (0xFF05, "3", "%"), - (0xFF06, "3", "&"), - (0xFF07, "3", "'"), - (0xFF08, "3", "("), - (0xFF09, "3", ")"), - (0xFF0A, "3", "*"), - (0xFF0B, "3", "+"), - (0xFF0C, "3", ","), - (0xFF0D, "M", "-"), - (0xFF0E, "M", "."), - (0xFF0F, "3", "/"), - (0xFF10, "M", "0"), - (0xFF11, "M", "1"), - (0xFF12, "M", "2"), - (0xFF13, "M", "3"), - (0xFF14, "M", "4"), - (0xFF15, "M", "5"), - (0xFF16, "M", "6"), - (0xFF17, "M", "7"), - (0xFF18, "M", "8"), - (0xFF19, "M", "9"), - (0xFF1A, "3", ":"), - (0xFF1B, "3", ";"), - (0xFF1C, "3", "<"), - (0xFF1D, "3", "="), - (0xFF1E, "3", ">"), - ] - - -def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFF1F, "3", "?"), - (0xFF20, "3", "@"), - (0xFF21, "M", "a"), - (0xFF22, "M", "b"), - (0xFF23, "M", "c"), - (0xFF24, "M", "d"), - (0xFF25, "M", "e"), - (0xFF26, "M", "f"), - (0xFF27, "M", "g"), - (0xFF28, "M", "h"), - (0xFF29, "M", "i"), - (0xFF2A, "M", "j"), - (0xFF2B, "M", "k"), - (0xFF2C, "M", "l"), - (0xFF2D, "M", "m"), - (0xFF2E, "M", "n"), - (0xFF2F, "M", "o"), - (0xFF30, "M", "p"), - (0xFF31, "M", "q"), - (0xFF32, "M", "r"), - (0xFF33, "M", "s"), - (0xFF34, "M", "t"), - (0xFF35, "M", "u"), - (0xFF36, "M", "v"), - (0xFF37, "M", "w"), - (0xFF38, "M", "x"), - (0xFF39, "M", "y"), - (0xFF3A, "M", "z"), - (0xFF3B, "3", "["), - (0xFF3C, "3", "\\"), - (0xFF3D, "3", "]"), - (0xFF3E, "3", "^"), - (0xFF3F, "3", "_"), - (0xFF40, "3", "`"), - (0xFF41, "M", "a"), - (0xFF42, "M", "b"), - (0xFF43, "M", "c"), - (0xFF44, "M", "d"), - (0xFF45, "M", "e"), - (0xFF46, "M", "f"), - (0xFF47, "M", "g"), - (0xFF48, "M", "h"), - (0xFF49, "M", "i"), - (0xFF4A, "M", "j"), - (0xFF4B, "M", "k"), - (0xFF4C, "M", "l"), - (0xFF4D, "M", "m"), - (0xFF4E, "M", "n"), - (0xFF4F, "M", "o"), - (0xFF50, "M", "p"), - (0xFF51, "M", "q"), - (0xFF52, "M", "r"), - (0xFF53, "M", "s"), - (0xFF54, "M", "t"), - (0xFF55, "M", "u"), - (0xFF56, "M", "v"), - (0xFF57, "M", "w"), - (0xFF58, "M", "x"), - (0xFF59, "M", "y"), - (0xFF5A, "M", "z"), - (0xFF5B, "3", "{"), - (0xFF5C, "3", "|"), - (0xFF5D, "3", "}"), - (0xFF5E, "3", "~"), - (0xFF5F, "M", "⦅"), - (0xFF60, "M", "⦆"), - (0xFF61, "M", "."), - (0xFF62, "M", "「"), - (0xFF63, "M", "」"), - (0xFF64, "M", "、"), - (0xFF65, "M", "・"), - (0xFF66, "M", "ヲ"), - (0xFF67, "M", "ァ"), - (0xFF68, "M", "ィ"), - (0xFF69, "M", "ゥ"), - (0xFF6A, "M", "ェ"), - (0xFF6B, "M", "ォ"), - (0xFF6C, "M", "ャ"), - (0xFF6D, "M", "ュ"), - (0xFF6E, "M", "ョ"), - (0xFF6F, "M", "ッ"), - (0xFF70, "M", "ー"), - (0xFF71, "M", "ア"), - (0xFF72, "M", "イ"), - (0xFF73, "M", "ウ"), - (0xFF74, "M", "エ"), - (0xFF75, "M", "オ"), - (0xFF76, "M", "カ"), - (0xFF77, "M", "キ"), - (0xFF78, "M", "ク"), - (0xFF79, "M", "ケ"), - (0xFF7A, "M", "コ"), - (0xFF7B, "M", "サ"), - (0xFF7C, "M", "シ"), - (0xFF7D, "M", "ス"), - (0xFF7E, "M", "セ"), - (0xFF7F, "M", "ソ"), - (0xFF80, "M", "タ"), - (0xFF81, "M", "チ"), - (0xFF82, "M", "ツ"), - ] - - -def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFF83, "M", "テ"), - (0xFF84, "M", "ト"), - (0xFF85, "M", "ナ"), - (0xFF86, "M", "ニ"), - (0xFF87, "M", "ヌ"), - (0xFF88, "M", "ネ"), - (0xFF89, "M", "ノ"), - (0xFF8A, "M", "ハ"), - (0xFF8B, "M", "ヒ"), - (0xFF8C, "M", "フ"), - (0xFF8D, "M", "ヘ"), - (0xFF8E, "M", "ホ"), - (0xFF8F, "M", "マ"), - (0xFF90, "M", "ミ"), - (0xFF91, "M", "ム"), - (0xFF92, "M", "メ"), - (0xFF93, "M", "モ"), - (0xFF94, "M", "ヤ"), - (0xFF95, "M", "ユ"), - (0xFF96, "M", "ヨ"), - (0xFF97, "M", "ラ"), - (0xFF98, "M", "リ"), - (0xFF99, "M", "ル"), - (0xFF9A, "M", "レ"), - (0xFF9B, "M", "ロ"), - (0xFF9C, "M", "ワ"), - (0xFF9D, "M", "ン"), - (0xFF9E, "M", "゙"), - (0xFF9F, "M", "゚"), - (0xFFA0, "X"), - (0xFFA1, "M", "ᄀ"), - (0xFFA2, "M", "ᄁ"), - (0xFFA3, "M", "ᆪ"), - (0xFFA4, "M", "ᄂ"), - (0xFFA5, "M", "ᆬ"), - (0xFFA6, "M", "ᆭ"), - (0xFFA7, "M", "ᄃ"), - (0xFFA8, "M", "ᄄ"), - (0xFFA9, "M", "ᄅ"), - (0xFFAA, "M", "ᆰ"), - (0xFFAB, "M", "ᆱ"), - (0xFFAC, "M", "ᆲ"), - (0xFFAD, "M", "ᆳ"), - (0xFFAE, "M", "ᆴ"), - (0xFFAF, "M", "ᆵ"), - (0xFFB0, "M", "ᄚ"), - (0xFFB1, "M", "ᄆ"), - (0xFFB2, "M", "ᄇ"), - (0xFFB3, "M", "ᄈ"), - (0xFFB4, "M", "ᄡ"), - (0xFFB5, "M", "ᄉ"), - (0xFFB6, "M", "ᄊ"), - (0xFFB7, "M", "ᄋ"), - (0xFFB8, "M", "ᄌ"), - (0xFFB9, "M", "ᄍ"), - (0xFFBA, "M", "ᄎ"), - (0xFFBB, "M", "ᄏ"), - (0xFFBC, "M", "ᄐ"), - (0xFFBD, "M", "ᄑ"), - (0xFFBE, "M", "ᄒ"), - (0xFFBF, "X"), - (0xFFC2, "M", "ᅡ"), - (0xFFC3, "M", "ᅢ"), - (0xFFC4, "M", "ᅣ"), - (0xFFC5, "M", "ᅤ"), - (0xFFC6, "M", "ᅥ"), - (0xFFC7, "M", "ᅦ"), - (0xFFC8, "X"), - (0xFFCA, "M", "ᅧ"), - (0xFFCB, "M", "ᅨ"), - (0xFFCC, "M", "ᅩ"), - (0xFFCD, "M", "ᅪ"), - (0xFFCE, "M", "ᅫ"), - (0xFFCF, "M", "ᅬ"), - (0xFFD0, "X"), - (0xFFD2, "M", "ᅭ"), - (0xFFD3, "M", "ᅮ"), - (0xFFD4, "M", "ᅯ"), - (0xFFD5, "M", "ᅰ"), - (0xFFD6, "M", "ᅱ"), - (0xFFD7, "M", "ᅲ"), - (0xFFD8, "X"), - (0xFFDA, "M", "ᅳ"), - (0xFFDB, "M", "ᅴ"), - (0xFFDC, "M", "ᅵ"), - (0xFFDD, "X"), - (0xFFE0, "M", "¢"), - (0xFFE1, "M", "£"), - (0xFFE2, "M", "¬"), - (0xFFE3, "3", " ̄"), - (0xFFE4, "M", "¦"), - (0xFFE5, "M", "¥"), - (0xFFE6, "M", "₩"), - (0xFFE7, "X"), - (0xFFE8, "M", "│"), - (0xFFE9, "M", "←"), - (0xFFEA, "M", "↑"), - (0xFFEB, "M", "→"), - (0xFFEC, "M", "↓"), - (0xFFED, "M", "■"), - ] - - -def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFFEE, "M", "○"), - (0xFFEF, "X"), - (0x10000, "V"), - (0x1000C, "X"), - (0x1000D, "V"), - (0x10027, "X"), - (0x10028, "V"), - (0x1003B, "X"), - (0x1003C, "V"), - (0x1003E, "X"), - (0x1003F, "V"), - (0x1004E, "X"), - (0x10050, "V"), - (0x1005E, "X"), - (0x10080, "V"), - (0x100FB, "X"), - (0x10100, "V"), - (0x10103, "X"), - (0x10107, "V"), - (0x10134, "X"), - (0x10137, "V"), - (0x1018F, "X"), - (0x10190, "V"), - (0x1019D, "X"), - (0x101A0, "V"), - (0x101A1, "X"), - (0x101D0, "V"), - (0x101FE, "X"), - (0x10280, "V"), - (0x1029D, "X"), - (0x102A0, "V"), - (0x102D1, "X"), - (0x102E0, "V"), - (0x102FC, "X"), - (0x10300, "V"), - (0x10324, "X"), - (0x1032D, "V"), - (0x1034B, "X"), - (0x10350, "V"), - (0x1037B, "X"), - (0x10380, "V"), - (0x1039E, "X"), - (0x1039F, "V"), - (0x103C4, "X"), - (0x103C8, "V"), - (0x103D6, "X"), - (0x10400, "M", "𐐨"), - (0x10401, "M", "𐐩"), - (0x10402, "M", "𐐪"), - (0x10403, "M", "𐐫"), - (0x10404, "M", "𐐬"), - (0x10405, "M", "𐐭"), - (0x10406, "M", "𐐮"), - (0x10407, "M", "𐐯"), - (0x10408, "M", "𐐰"), - (0x10409, "M", "𐐱"), - (0x1040A, "M", "𐐲"), - (0x1040B, "M", "𐐳"), - (0x1040C, "M", "𐐴"), - (0x1040D, "M", "𐐵"), - (0x1040E, "M", "𐐶"), - (0x1040F, "M", "𐐷"), - (0x10410, "M", "𐐸"), - (0x10411, "M", "𐐹"), - (0x10412, "M", "𐐺"), - (0x10413, "M", "𐐻"), - (0x10414, "M", "𐐼"), - (0x10415, "M", "𐐽"), - (0x10416, "M", "𐐾"), - (0x10417, "M", "𐐿"), - (0x10418, "M", "𐑀"), - (0x10419, "M", "𐑁"), - (0x1041A, "M", "𐑂"), - (0x1041B, "M", "𐑃"), - (0x1041C, "M", "𐑄"), - (0x1041D, "M", "𐑅"), - (0x1041E, "M", "𐑆"), - (0x1041F, "M", "𐑇"), - (0x10420, "M", "𐑈"), - (0x10421, "M", "𐑉"), - (0x10422, "M", "𐑊"), - (0x10423, "M", "𐑋"), - (0x10424, "M", "𐑌"), - (0x10425, "M", "𐑍"), - (0x10426, "M", "𐑎"), - (0x10427, "M", "𐑏"), - (0x10428, "V"), - (0x1049E, "X"), - (0x104A0, "V"), - (0x104AA, "X"), - (0x104B0, "M", "𐓘"), - (0x104B1, "M", "𐓙"), - (0x104B2, "M", "𐓚"), - (0x104B3, "M", "𐓛"), - (0x104B4, "M", "𐓜"), - (0x104B5, "M", "𐓝"), - (0x104B6, "M", "𐓞"), - (0x104B7, "M", "𐓟"), - (0x104B8, "M", "𐓠"), - (0x104B9, "M", "𐓡"), - ] - - -def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x104BA, "M", "𐓢"), - (0x104BB, "M", "𐓣"), - (0x104BC, "M", "𐓤"), - (0x104BD, "M", "𐓥"), - (0x104BE, "M", "𐓦"), - (0x104BF, "M", "𐓧"), - (0x104C0, "M", "𐓨"), - (0x104C1, "M", "𐓩"), - (0x104C2, "M", "𐓪"), - (0x104C3, "M", "𐓫"), - (0x104C4, "M", "𐓬"), - (0x104C5, "M", "𐓭"), - (0x104C6, "M", "𐓮"), - (0x104C7, "M", "𐓯"), - (0x104C8, "M", "𐓰"), - (0x104C9, "M", "𐓱"), - (0x104CA, "M", "𐓲"), - (0x104CB, "M", "𐓳"), - (0x104CC, "M", "𐓴"), - (0x104CD, "M", "𐓵"), - (0x104CE, "M", "𐓶"), - (0x104CF, "M", "𐓷"), - (0x104D0, "M", "𐓸"), - (0x104D1, "M", "𐓹"), - (0x104D2, "M", "𐓺"), - (0x104D3, "M", "𐓻"), - (0x104D4, "X"), - (0x104D8, "V"), - (0x104FC, "X"), - (0x10500, "V"), - (0x10528, "X"), - (0x10530, "V"), - (0x10564, "X"), - (0x1056F, "V"), - (0x10570, "M", "𐖗"), - (0x10571, "M", "𐖘"), - (0x10572, "M", "𐖙"), - (0x10573, "M", "𐖚"), - (0x10574, "M", "𐖛"), - (0x10575, "M", "𐖜"), - (0x10576, "M", "𐖝"), - (0x10577, "M", "𐖞"), - (0x10578, "M", "𐖟"), - (0x10579, "M", "𐖠"), - (0x1057A, "M", "𐖡"), - (0x1057B, "X"), - (0x1057C, "M", "𐖣"), - (0x1057D, "M", "𐖤"), - (0x1057E, "M", "𐖥"), - (0x1057F, "M", "𐖦"), - (0x10580, "M", "𐖧"), - (0x10581, "M", "𐖨"), - (0x10582, "M", "𐖩"), - (0x10583, "M", "𐖪"), - (0x10584, "M", "𐖫"), - (0x10585, "M", "𐖬"), - (0x10586, "M", "𐖭"), - (0x10587, "M", "𐖮"), - (0x10588, "M", "𐖯"), - (0x10589, "M", "𐖰"), - (0x1058A, "M", "𐖱"), - (0x1058B, "X"), - (0x1058C, "M", "𐖳"), - (0x1058D, "M", "𐖴"), - (0x1058E, "M", "𐖵"), - (0x1058F, "M", "𐖶"), - (0x10590, "M", "𐖷"), - (0x10591, "M", "𐖸"), - (0x10592, "M", "𐖹"), - (0x10593, "X"), - (0x10594, "M", "𐖻"), - (0x10595, "M", "𐖼"), - (0x10596, "X"), - (0x10597, "V"), - (0x105A2, "X"), - (0x105A3, "V"), - (0x105B2, "X"), - (0x105B3, "V"), - (0x105BA, "X"), - (0x105BB, "V"), - (0x105BD, "X"), - (0x10600, "V"), - (0x10737, "X"), - (0x10740, "V"), - (0x10756, "X"), - (0x10760, "V"), - (0x10768, "X"), - (0x10780, "V"), - (0x10781, "M", "ː"), - (0x10782, "M", "ˑ"), - (0x10783, "M", "æ"), - (0x10784, "M", "ʙ"), - (0x10785, "M", "ɓ"), - (0x10786, "X"), - (0x10787, "M", "ʣ"), - (0x10788, "M", "ꭦ"), - (0x10789, "M", "ʥ"), - (0x1078A, "M", "ʤ"), - (0x1078B, "M", "ɖ"), - (0x1078C, "M", "ɗ"), - ] - - -def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1078D, "M", "ᶑ"), - (0x1078E, "M", "ɘ"), - (0x1078F, "M", "ɞ"), - (0x10790, "M", "ʩ"), - (0x10791, "M", "ɤ"), - (0x10792, "M", "ɢ"), - (0x10793, "M", "ɠ"), - (0x10794, "M", "ʛ"), - (0x10795, "M", "ħ"), - (0x10796, "M", "ʜ"), - (0x10797, "M", "ɧ"), - (0x10798, "M", "ʄ"), - (0x10799, "M", "ʪ"), - (0x1079A, "M", "ʫ"), - (0x1079B, "M", "ɬ"), - (0x1079C, "M", "𝼄"), - (0x1079D, "M", "ꞎ"), - (0x1079E, "M", "ɮ"), - (0x1079F, "M", "𝼅"), - (0x107A0, "M", "ʎ"), - (0x107A1, "M", "𝼆"), - (0x107A2, "M", "ø"), - (0x107A3, "M", "ɶ"), - (0x107A4, "M", "ɷ"), - (0x107A5, "M", "q"), - (0x107A6, "M", "ɺ"), - (0x107A7, "M", "𝼈"), - (0x107A8, "M", "ɽ"), - (0x107A9, "M", "ɾ"), - (0x107AA, "M", "ʀ"), - (0x107AB, "M", "ʨ"), - (0x107AC, "M", "ʦ"), - (0x107AD, "M", "ꭧ"), - (0x107AE, "M", "ʧ"), - (0x107AF, "M", "ʈ"), - (0x107B0, "M", "ⱱ"), - (0x107B1, "X"), - (0x107B2, "M", "ʏ"), - (0x107B3, "M", "ʡ"), - (0x107B4, "M", "ʢ"), - (0x107B5, "M", "ʘ"), - (0x107B6, "M", "ǀ"), - (0x107B7, "M", "ǁ"), - (0x107B8, "M", "ǂ"), - (0x107B9, "M", "𝼊"), - (0x107BA, "M", "𝼞"), - (0x107BB, "X"), - (0x10800, "V"), - (0x10806, "X"), - (0x10808, "V"), - (0x10809, "X"), - (0x1080A, "V"), - (0x10836, "X"), - (0x10837, "V"), - (0x10839, "X"), - (0x1083C, "V"), - (0x1083D, "X"), - (0x1083F, "V"), - (0x10856, "X"), - (0x10857, "V"), - (0x1089F, "X"), - (0x108A7, "V"), - (0x108B0, "X"), - (0x108E0, "V"), - (0x108F3, "X"), - (0x108F4, "V"), - (0x108F6, "X"), - (0x108FB, "V"), - (0x1091C, "X"), - (0x1091F, "V"), - (0x1093A, "X"), - (0x1093F, "V"), - (0x10940, "X"), - (0x10980, "V"), - (0x109B8, "X"), - (0x109BC, "V"), - (0x109D0, "X"), - (0x109D2, "V"), - (0x10A04, "X"), - (0x10A05, "V"), - (0x10A07, "X"), - (0x10A0C, "V"), - (0x10A14, "X"), - (0x10A15, "V"), - (0x10A18, "X"), - (0x10A19, "V"), - (0x10A36, "X"), - (0x10A38, "V"), - (0x10A3B, "X"), - (0x10A3F, "V"), - (0x10A49, "X"), - (0x10A50, "V"), - (0x10A59, "X"), - (0x10A60, "V"), - (0x10AA0, "X"), - (0x10AC0, "V"), - (0x10AE7, "X"), - (0x10AEB, "V"), - (0x10AF7, "X"), - (0x10B00, "V"), - ] - - -def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x10B36, "X"), - (0x10B39, "V"), - (0x10B56, "X"), - (0x10B58, "V"), - (0x10B73, "X"), - (0x10B78, "V"), - (0x10B92, "X"), - (0x10B99, "V"), - (0x10B9D, "X"), - (0x10BA9, "V"), - (0x10BB0, "X"), - (0x10C00, "V"), - (0x10C49, "X"), - (0x10C80, "M", "𐳀"), - (0x10C81, "M", "𐳁"), - (0x10C82, "M", "𐳂"), - (0x10C83, "M", "𐳃"), - (0x10C84, "M", "𐳄"), - (0x10C85, "M", "𐳅"), - (0x10C86, "M", "𐳆"), - (0x10C87, "M", "𐳇"), - (0x10C88, "M", "𐳈"), - (0x10C89, "M", "𐳉"), - (0x10C8A, "M", "𐳊"), - (0x10C8B, "M", "𐳋"), - (0x10C8C, "M", "𐳌"), - (0x10C8D, "M", "𐳍"), - (0x10C8E, "M", "𐳎"), - (0x10C8F, "M", "𐳏"), - (0x10C90, "M", "𐳐"), - (0x10C91, "M", "𐳑"), - (0x10C92, "M", "𐳒"), - (0x10C93, "M", "𐳓"), - (0x10C94, "M", "𐳔"), - (0x10C95, "M", "𐳕"), - (0x10C96, "M", "𐳖"), - (0x10C97, "M", "𐳗"), - (0x10C98, "M", "𐳘"), - (0x10C99, "M", "𐳙"), - (0x10C9A, "M", "𐳚"), - (0x10C9B, "M", "𐳛"), - (0x10C9C, "M", "𐳜"), - (0x10C9D, "M", "𐳝"), - (0x10C9E, "M", "𐳞"), - (0x10C9F, "M", "𐳟"), - (0x10CA0, "M", "𐳠"), - (0x10CA1, "M", "𐳡"), - (0x10CA2, "M", "𐳢"), - (0x10CA3, "M", "𐳣"), - (0x10CA4, "M", "𐳤"), - (0x10CA5, "M", "𐳥"), - (0x10CA6, "M", "𐳦"), - (0x10CA7, "M", "𐳧"), - (0x10CA8, "M", "𐳨"), - (0x10CA9, "M", "𐳩"), - (0x10CAA, "M", "𐳪"), - (0x10CAB, "M", "𐳫"), - (0x10CAC, "M", "𐳬"), - (0x10CAD, "M", "𐳭"), - (0x10CAE, "M", "𐳮"), - (0x10CAF, "M", "𐳯"), - (0x10CB0, "M", "𐳰"), - (0x10CB1, "M", "𐳱"), - (0x10CB2, "M", "𐳲"), - (0x10CB3, "X"), - (0x10CC0, "V"), - (0x10CF3, "X"), - (0x10CFA, "V"), - (0x10D28, "X"), - (0x10D30, "V"), - (0x10D3A, "X"), - (0x10E60, "V"), - (0x10E7F, "X"), - (0x10E80, "V"), - (0x10EAA, "X"), - (0x10EAB, "V"), - (0x10EAE, "X"), - (0x10EB0, "V"), - (0x10EB2, "X"), - (0x10EFD, "V"), - (0x10F28, "X"), - (0x10F30, "V"), - (0x10F5A, "X"), - (0x10F70, "V"), - (0x10F8A, "X"), - (0x10FB0, "V"), - (0x10FCC, "X"), - (0x10FE0, "V"), - (0x10FF7, "X"), - (0x11000, "V"), - (0x1104E, "X"), - (0x11052, "V"), - (0x11076, "X"), - (0x1107F, "V"), - (0x110BD, "X"), - (0x110BE, "V"), - (0x110C3, "X"), - (0x110D0, "V"), - (0x110E9, "X"), - (0x110F0, "V"), - ] - - -def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x110FA, "X"), - (0x11100, "V"), - (0x11135, "X"), - (0x11136, "V"), - (0x11148, "X"), - (0x11150, "V"), - (0x11177, "X"), - (0x11180, "V"), - (0x111E0, "X"), - (0x111E1, "V"), - (0x111F5, "X"), - (0x11200, "V"), - (0x11212, "X"), - (0x11213, "V"), - (0x11242, "X"), - (0x11280, "V"), - (0x11287, "X"), - (0x11288, "V"), - (0x11289, "X"), - (0x1128A, "V"), - (0x1128E, "X"), - (0x1128F, "V"), - (0x1129E, "X"), - (0x1129F, "V"), - (0x112AA, "X"), - (0x112B0, "V"), - (0x112EB, "X"), - (0x112F0, "V"), - (0x112FA, "X"), - (0x11300, "V"), - (0x11304, "X"), - (0x11305, "V"), - (0x1130D, "X"), - (0x1130F, "V"), - (0x11311, "X"), - (0x11313, "V"), - (0x11329, "X"), - (0x1132A, "V"), - (0x11331, "X"), - (0x11332, "V"), - (0x11334, "X"), - (0x11335, "V"), - (0x1133A, "X"), - (0x1133B, "V"), - (0x11345, "X"), - (0x11347, "V"), - (0x11349, "X"), - (0x1134B, "V"), - (0x1134E, "X"), - (0x11350, "V"), - (0x11351, "X"), - (0x11357, "V"), - (0x11358, "X"), - (0x1135D, "V"), - (0x11364, "X"), - (0x11366, "V"), - (0x1136D, "X"), - (0x11370, "V"), - (0x11375, "X"), - (0x11400, "V"), - (0x1145C, "X"), - (0x1145D, "V"), - (0x11462, "X"), - (0x11480, "V"), - (0x114C8, "X"), - (0x114D0, "V"), - (0x114DA, "X"), - (0x11580, "V"), - (0x115B6, "X"), - (0x115B8, "V"), - (0x115DE, "X"), - (0x11600, "V"), - (0x11645, "X"), - (0x11650, "V"), - (0x1165A, "X"), - (0x11660, "V"), - (0x1166D, "X"), - (0x11680, "V"), - (0x116BA, "X"), - (0x116C0, "V"), - (0x116CA, "X"), - (0x11700, "V"), - (0x1171B, "X"), - (0x1171D, "V"), - (0x1172C, "X"), - (0x11730, "V"), - (0x11747, "X"), - (0x11800, "V"), - (0x1183C, "X"), - (0x118A0, "M", "𑣀"), - (0x118A1, "M", "𑣁"), - (0x118A2, "M", "𑣂"), - (0x118A3, "M", "𑣃"), - (0x118A4, "M", "𑣄"), - (0x118A5, "M", "𑣅"), - (0x118A6, "M", "𑣆"), - (0x118A7, "M", "𑣇"), - (0x118A8, "M", "𑣈"), - (0x118A9, "M", "𑣉"), - (0x118AA, "M", "𑣊"), - ] - - -def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x118AB, "M", "𑣋"), - (0x118AC, "M", "𑣌"), - (0x118AD, "M", "𑣍"), - (0x118AE, "M", "𑣎"), - (0x118AF, "M", "𑣏"), - (0x118B0, "M", "𑣐"), - (0x118B1, "M", "𑣑"), - (0x118B2, "M", "𑣒"), - (0x118B3, "M", "𑣓"), - (0x118B4, "M", "𑣔"), - (0x118B5, "M", "𑣕"), - (0x118B6, "M", "𑣖"), - (0x118B7, "M", "𑣗"), - (0x118B8, "M", "𑣘"), - (0x118B9, "M", "𑣙"), - (0x118BA, "M", "𑣚"), - (0x118BB, "M", "𑣛"), - (0x118BC, "M", "𑣜"), - (0x118BD, "M", "𑣝"), - (0x118BE, "M", "𑣞"), - (0x118BF, "M", "𑣟"), - (0x118C0, "V"), - (0x118F3, "X"), - (0x118FF, "V"), - (0x11907, "X"), - (0x11909, "V"), - (0x1190A, "X"), - (0x1190C, "V"), - (0x11914, "X"), - (0x11915, "V"), - (0x11917, "X"), - (0x11918, "V"), - (0x11936, "X"), - (0x11937, "V"), - (0x11939, "X"), - (0x1193B, "V"), - (0x11947, "X"), - (0x11950, "V"), - (0x1195A, "X"), - (0x119A0, "V"), - (0x119A8, "X"), - (0x119AA, "V"), - (0x119D8, "X"), - (0x119DA, "V"), - (0x119E5, "X"), - (0x11A00, "V"), - (0x11A48, "X"), - (0x11A50, "V"), - (0x11AA3, "X"), - (0x11AB0, "V"), - (0x11AF9, "X"), - (0x11B00, "V"), - (0x11B0A, "X"), - (0x11C00, "V"), - (0x11C09, "X"), - (0x11C0A, "V"), - (0x11C37, "X"), - (0x11C38, "V"), - (0x11C46, "X"), - (0x11C50, "V"), - (0x11C6D, "X"), - (0x11C70, "V"), - (0x11C90, "X"), - (0x11C92, "V"), - (0x11CA8, "X"), - (0x11CA9, "V"), - (0x11CB7, "X"), - (0x11D00, "V"), - (0x11D07, "X"), - (0x11D08, "V"), - (0x11D0A, "X"), - (0x11D0B, "V"), - (0x11D37, "X"), - (0x11D3A, "V"), - (0x11D3B, "X"), - (0x11D3C, "V"), - (0x11D3E, "X"), - (0x11D3F, "V"), - (0x11D48, "X"), - (0x11D50, "V"), - (0x11D5A, "X"), - (0x11D60, "V"), - (0x11D66, "X"), - (0x11D67, "V"), - (0x11D69, "X"), - (0x11D6A, "V"), - (0x11D8F, "X"), - (0x11D90, "V"), - (0x11D92, "X"), - (0x11D93, "V"), - (0x11D99, "X"), - (0x11DA0, "V"), - (0x11DAA, "X"), - (0x11EE0, "V"), - (0x11EF9, "X"), - (0x11F00, "V"), - (0x11F11, "X"), - (0x11F12, "V"), - (0x11F3B, "X"), - (0x11F3E, "V"), - ] - - -def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x11F5A, "X"), - (0x11FB0, "V"), - (0x11FB1, "X"), - (0x11FC0, "V"), - (0x11FF2, "X"), - (0x11FFF, "V"), - (0x1239A, "X"), - (0x12400, "V"), - (0x1246F, "X"), - (0x12470, "V"), - (0x12475, "X"), - (0x12480, "V"), - (0x12544, "X"), - (0x12F90, "V"), - (0x12FF3, "X"), - (0x13000, "V"), - (0x13430, "X"), - (0x13440, "V"), - (0x13456, "X"), - (0x14400, "V"), - (0x14647, "X"), - (0x16800, "V"), - (0x16A39, "X"), - (0x16A40, "V"), - (0x16A5F, "X"), - (0x16A60, "V"), - (0x16A6A, "X"), - (0x16A6E, "V"), - (0x16ABF, "X"), - (0x16AC0, "V"), - (0x16ACA, "X"), - (0x16AD0, "V"), - (0x16AEE, "X"), - (0x16AF0, "V"), - (0x16AF6, "X"), - (0x16B00, "V"), - (0x16B46, "X"), - (0x16B50, "V"), - (0x16B5A, "X"), - (0x16B5B, "V"), - (0x16B62, "X"), - (0x16B63, "V"), - (0x16B78, "X"), - (0x16B7D, "V"), - (0x16B90, "X"), - (0x16E40, "M", "𖹠"), - (0x16E41, "M", "𖹡"), - (0x16E42, "M", "𖹢"), - (0x16E43, "M", "𖹣"), - (0x16E44, "M", "𖹤"), - (0x16E45, "M", "𖹥"), - (0x16E46, "M", "𖹦"), - (0x16E47, "M", "𖹧"), - (0x16E48, "M", "𖹨"), - (0x16E49, "M", "𖹩"), - (0x16E4A, "M", "𖹪"), - (0x16E4B, "M", "𖹫"), - (0x16E4C, "M", "𖹬"), - (0x16E4D, "M", "𖹭"), - (0x16E4E, "M", "𖹮"), - (0x16E4F, "M", "𖹯"), - (0x16E50, "M", "𖹰"), - (0x16E51, "M", "𖹱"), - (0x16E52, "M", "𖹲"), - (0x16E53, "M", "𖹳"), - (0x16E54, "M", "𖹴"), - (0x16E55, "M", "𖹵"), - (0x16E56, "M", "𖹶"), - (0x16E57, "M", "𖹷"), - (0x16E58, "M", "𖹸"), - (0x16E59, "M", "𖹹"), - (0x16E5A, "M", "𖹺"), - (0x16E5B, "M", "𖹻"), - (0x16E5C, "M", "𖹼"), - (0x16E5D, "M", "𖹽"), - (0x16E5E, "M", "𖹾"), - (0x16E5F, "M", "𖹿"), - (0x16E60, "V"), - (0x16E9B, "X"), - (0x16F00, "V"), - (0x16F4B, "X"), - (0x16F4F, "V"), - (0x16F88, "X"), - (0x16F8F, "V"), - (0x16FA0, "X"), - (0x16FE0, "V"), - (0x16FE5, "X"), - (0x16FF0, "V"), - (0x16FF2, "X"), - (0x17000, "V"), - (0x187F8, "X"), - (0x18800, "V"), - (0x18CD6, "X"), - (0x18D00, "V"), - (0x18D09, "X"), - (0x1AFF0, "V"), - (0x1AFF4, "X"), - (0x1AFF5, "V"), - (0x1AFFC, "X"), - (0x1AFFD, "V"), - ] - - -def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1AFFF, "X"), - (0x1B000, "V"), - (0x1B123, "X"), - (0x1B132, "V"), - (0x1B133, "X"), - (0x1B150, "V"), - (0x1B153, "X"), - (0x1B155, "V"), - (0x1B156, "X"), - (0x1B164, "V"), - (0x1B168, "X"), - (0x1B170, "V"), - (0x1B2FC, "X"), - (0x1BC00, "V"), - (0x1BC6B, "X"), - (0x1BC70, "V"), - (0x1BC7D, "X"), - (0x1BC80, "V"), - (0x1BC89, "X"), - (0x1BC90, "V"), - (0x1BC9A, "X"), - (0x1BC9C, "V"), - (0x1BCA0, "I"), - (0x1BCA4, "X"), - (0x1CF00, "V"), - (0x1CF2E, "X"), - (0x1CF30, "V"), - (0x1CF47, "X"), - (0x1CF50, "V"), - (0x1CFC4, "X"), - (0x1D000, "V"), - (0x1D0F6, "X"), - (0x1D100, "V"), - (0x1D127, "X"), - (0x1D129, "V"), - (0x1D15E, "M", "𝅗𝅥"), - (0x1D15F, "M", "𝅘𝅥"), - (0x1D160, "M", "𝅘𝅥𝅮"), - (0x1D161, "M", "𝅘𝅥𝅯"), - (0x1D162, "M", "𝅘𝅥𝅰"), - (0x1D163, "M", "𝅘𝅥𝅱"), - (0x1D164, "M", "𝅘𝅥𝅲"), - (0x1D165, "V"), - (0x1D173, "X"), - (0x1D17B, "V"), - (0x1D1BB, "M", "𝆹𝅥"), - (0x1D1BC, "M", "𝆺𝅥"), - (0x1D1BD, "M", "𝆹𝅥𝅮"), - (0x1D1BE, "M", "𝆺𝅥𝅮"), - (0x1D1BF, "M", "𝆹𝅥𝅯"), - (0x1D1C0, "M", "𝆺𝅥𝅯"), - (0x1D1C1, "V"), - (0x1D1EB, "X"), - (0x1D200, "V"), - (0x1D246, "X"), - (0x1D2C0, "V"), - (0x1D2D4, "X"), - (0x1D2E0, "V"), - (0x1D2F4, "X"), - (0x1D300, "V"), - (0x1D357, "X"), - (0x1D360, "V"), - (0x1D379, "X"), - (0x1D400, "M", "a"), - (0x1D401, "M", "b"), - (0x1D402, "M", "c"), - (0x1D403, "M", "d"), - (0x1D404, "M", "e"), - (0x1D405, "M", "f"), - (0x1D406, "M", "g"), - (0x1D407, "M", "h"), - (0x1D408, "M", "i"), - (0x1D409, "M", "j"), - (0x1D40A, "M", "k"), - (0x1D40B, "M", "l"), - (0x1D40C, "M", "m"), - (0x1D40D, "M", "n"), - (0x1D40E, "M", "o"), - (0x1D40F, "M", "p"), - (0x1D410, "M", "q"), - (0x1D411, "M", "r"), - (0x1D412, "M", "s"), - (0x1D413, "M", "t"), - (0x1D414, "M", "u"), - (0x1D415, "M", "v"), - (0x1D416, "M", "w"), - (0x1D417, "M", "x"), - (0x1D418, "M", "y"), - (0x1D419, "M", "z"), - (0x1D41A, "M", "a"), - (0x1D41B, "M", "b"), - (0x1D41C, "M", "c"), - (0x1D41D, "M", "d"), - (0x1D41E, "M", "e"), - (0x1D41F, "M", "f"), - (0x1D420, "M", "g"), - (0x1D421, "M", "h"), - (0x1D422, "M", "i"), - (0x1D423, "M", "j"), - (0x1D424, "M", "k"), - ] - - -def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D425, "M", "l"), - (0x1D426, "M", "m"), - (0x1D427, "M", "n"), - (0x1D428, "M", "o"), - (0x1D429, "M", "p"), - (0x1D42A, "M", "q"), - (0x1D42B, "M", "r"), - (0x1D42C, "M", "s"), - (0x1D42D, "M", "t"), - (0x1D42E, "M", "u"), - (0x1D42F, "M", "v"), - (0x1D430, "M", "w"), - (0x1D431, "M", "x"), - (0x1D432, "M", "y"), - (0x1D433, "M", "z"), - (0x1D434, "M", "a"), - (0x1D435, "M", "b"), - (0x1D436, "M", "c"), - (0x1D437, "M", "d"), - (0x1D438, "M", "e"), - (0x1D439, "M", "f"), - (0x1D43A, "M", "g"), - (0x1D43B, "M", "h"), - (0x1D43C, "M", "i"), - (0x1D43D, "M", "j"), - (0x1D43E, "M", "k"), - (0x1D43F, "M", "l"), - (0x1D440, "M", "m"), - (0x1D441, "M", "n"), - (0x1D442, "M", "o"), - (0x1D443, "M", "p"), - (0x1D444, "M", "q"), - (0x1D445, "M", "r"), - (0x1D446, "M", "s"), - (0x1D447, "M", "t"), - (0x1D448, "M", "u"), - (0x1D449, "M", "v"), - (0x1D44A, "M", "w"), - (0x1D44B, "M", "x"), - (0x1D44C, "M", "y"), - (0x1D44D, "M", "z"), - (0x1D44E, "M", "a"), - (0x1D44F, "M", "b"), - (0x1D450, "M", "c"), - (0x1D451, "M", "d"), - (0x1D452, "M", "e"), - (0x1D453, "M", "f"), - (0x1D454, "M", "g"), - (0x1D455, "X"), - (0x1D456, "M", "i"), - (0x1D457, "M", "j"), - (0x1D458, "M", "k"), - (0x1D459, "M", "l"), - (0x1D45A, "M", "m"), - (0x1D45B, "M", "n"), - (0x1D45C, "M", "o"), - (0x1D45D, "M", "p"), - (0x1D45E, "M", "q"), - (0x1D45F, "M", "r"), - (0x1D460, "M", "s"), - (0x1D461, "M", "t"), - (0x1D462, "M", "u"), - (0x1D463, "M", "v"), - (0x1D464, "M", "w"), - (0x1D465, "M", "x"), - (0x1D466, "M", "y"), - (0x1D467, "M", "z"), - (0x1D468, "M", "a"), - (0x1D469, "M", "b"), - (0x1D46A, "M", "c"), - (0x1D46B, "M", "d"), - (0x1D46C, "M", "e"), - (0x1D46D, "M", "f"), - (0x1D46E, "M", "g"), - (0x1D46F, "M", "h"), - (0x1D470, "M", "i"), - (0x1D471, "M", "j"), - (0x1D472, "M", "k"), - (0x1D473, "M", "l"), - (0x1D474, "M", "m"), - (0x1D475, "M", "n"), - (0x1D476, "M", "o"), - (0x1D477, "M", "p"), - (0x1D478, "M", "q"), - (0x1D479, "M", "r"), - (0x1D47A, "M", "s"), - (0x1D47B, "M", "t"), - (0x1D47C, "M", "u"), - (0x1D47D, "M", "v"), - (0x1D47E, "M", "w"), - (0x1D47F, "M", "x"), - (0x1D480, "M", "y"), - (0x1D481, "M", "z"), - (0x1D482, "M", "a"), - (0x1D483, "M", "b"), - (0x1D484, "M", "c"), - (0x1D485, "M", "d"), - (0x1D486, "M", "e"), - (0x1D487, "M", "f"), - (0x1D488, "M", "g"), - ] - - -def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D489, "M", "h"), - (0x1D48A, "M", "i"), - (0x1D48B, "M", "j"), - (0x1D48C, "M", "k"), - (0x1D48D, "M", "l"), - (0x1D48E, "M", "m"), - (0x1D48F, "M", "n"), - (0x1D490, "M", "o"), - (0x1D491, "M", "p"), - (0x1D492, "M", "q"), - (0x1D493, "M", "r"), - (0x1D494, "M", "s"), - (0x1D495, "M", "t"), - (0x1D496, "M", "u"), - (0x1D497, "M", "v"), - (0x1D498, "M", "w"), - (0x1D499, "M", "x"), - (0x1D49A, "M", "y"), - (0x1D49B, "M", "z"), - (0x1D49C, "M", "a"), - (0x1D49D, "X"), - (0x1D49E, "M", "c"), - (0x1D49F, "M", "d"), - (0x1D4A0, "X"), - (0x1D4A2, "M", "g"), - (0x1D4A3, "X"), - (0x1D4A5, "M", "j"), - (0x1D4A6, "M", "k"), - (0x1D4A7, "X"), - (0x1D4A9, "M", "n"), - (0x1D4AA, "M", "o"), - (0x1D4AB, "M", "p"), - (0x1D4AC, "M", "q"), - (0x1D4AD, "X"), - (0x1D4AE, "M", "s"), - (0x1D4AF, "M", "t"), - (0x1D4B0, "M", "u"), - (0x1D4B1, "M", "v"), - (0x1D4B2, "M", "w"), - (0x1D4B3, "M", "x"), - (0x1D4B4, "M", "y"), - (0x1D4B5, "M", "z"), - (0x1D4B6, "M", "a"), - (0x1D4B7, "M", "b"), - (0x1D4B8, "M", "c"), - (0x1D4B9, "M", "d"), - (0x1D4BA, "X"), - (0x1D4BB, "M", "f"), - (0x1D4BC, "X"), - (0x1D4BD, "M", "h"), - (0x1D4BE, "M", "i"), - (0x1D4BF, "M", "j"), - (0x1D4C0, "M", "k"), - (0x1D4C1, "M", "l"), - (0x1D4C2, "M", "m"), - (0x1D4C3, "M", "n"), - (0x1D4C4, "X"), - (0x1D4C5, "M", "p"), - (0x1D4C6, "M", "q"), - (0x1D4C7, "M", "r"), - (0x1D4C8, "M", "s"), - (0x1D4C9, "M", "t"), - (0x1D4CA, "M", "u"), - (0x1D4CB, "M", "v"), - (0x1D4CC, "M", "w"), - (0x1D4CD, "M", "x"), - (0x1D4CE, "M", "y"), - (0x1D4CF, "M", "z"), - (0x1D4D0, "M", "a"), - (0x1D4D1, "M", "b"), - (0x1D4D2, "M", "c"), - (0x1D4D3, "M", "d"), - (0x1D4D4, "M", "e"), - (0x1D4D5, "M", "f"), - (0x1D4D6, "M", "g"), - (0x1D4D7, "M", "h"), - (0x1D4D8, "M", "i"), - (0x1D4D9, "M", "j"), - (0x1D4DA, "M", "k"), - (0x1D4DB, "M", "l"), - (0x1D4DC, "M", "m"), - (0x1D4DD, "M", "n"), - (0x1D4DE, "M", "o"), - (0x1D4DF, "M", "p"), - (0x1D4E0, "M", "q"), - (0x1D4E1, "M", "r"), - (0x1D4E2, "M", "s"), - (0x1D4E3, "M", "t"), - (0x1D4E4, "M", "u"), - (0x1D4E5, "M", "v"), - (0x1D4E6, "M", "w"), - (0x1D4E7, "M", "x"), - (0x1D4E8, "M", "y"), - (0x1D4E9, "M", "z"), - (0x1D4EA, "M", "a"), - (0x1D4EB, "M", "b"), - (0x1D4EC, "M", "c"), - (0x1D4ED, "M", "d"), - (0x1D4EE, "M", "e"), - (0x1D4EF, "M", "f"), - ] - - -def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D4F0, "M", "g"), - (0x1D4F1, "M", "h"), - (0x1D4F2, "M", "i"), - (0x1D4F3, "M", "j"), - (0x1D4F4, "M", "k"), - (0x1D4F5, "M", "l"), - (0x1D4F6, "M", "m"), - (0x1D4F7, "M", "n"), - (0x1D4F8, "M", "o"), - (0x1D4F9, "M", "p"), - (0x1D4FA, "M", "q"), - (0x1D4FB, "M", "r"), - (0x1D4FC, "M", "s"), - (0x1D4FD, "M", "t"), - (0x1D4FE, "M", "u"), - (0x1D4FF, "M", "v"), - (0x1D500, "M", "w"), - (0x1D501, "M", "x"), - (0x1D502, "M", "y"), - (0x1D503, "M", "z"), - (0x1D504, "M", "a"), - (0x1D505, "M", "b"), - (0x1D506, "X"), - (0x1D507, "M", "d"), - (0x1D508, "M", "e"), - (0x1D509, "M", "f"), - (0x1D50A, "M", "g"), - (0x1D50B, "X"), - (0x1D50D, "M", "j"), - (0x1D50E, "M", "k"), - (0x1D50F, "M", "l"), - (0x1D510, "M", "m"), - (0x1D511, "M", "n"), - (0x1D512, "M", "o"), - (0x1D513, "M", "p"), - (0x1D514, "M", "q"), - (0x1D515, "X"), - (0x1D516, "M", "s"), - (0x1D517, "M", "t"), - (0x1D518, "M", "u"), - (0x1D519, "M", "v"), - (0x1D51A, "M", "w"), - (0x1D51B, "M", "x"), - (0x1D51C, "M", "y"), - (0x1D51D, "X"), - (0x1D51E, "M", "a"), - (0x1D51F, "M", "b"), - (0x1D520, "M", "c"), - (0x1D521, "M", "d"), - (0x1D522, "M", "e"), - (0x1D523, "M", "f"), - (0x1D524, "M", "g"), - (0x1D525, "M", "h"), - (0x1D526, "M", "i"), - (0x1D527, "M", "j"), - (0x1D528, "M", "k"), - (0x1D529, "M", "l"), - (0x1D52A, "M", "m"), - (0x1D52B, "M", "n"), - (0x1D52C, "M", "o"), - (0x1D52D, "M", "p"), - (0x1D52E, "M", "q"), - (0x1D52F, "M", "r"), - (0x1D530, "M", "s"), - (0x1D531, "M", "t"), - (0x1D532, "M", "u"), - (0x1D533, "M", "v"), - (0x1D534, "M", "w"), - (0x1D535, "M", "x"), - (0x1D536, "M", "y"), - (0x1D537, "M", "z"), - (0x1D538, "M", "a"), - (0x1D539, "M", "b"), - (0x1D53A, "X"), - (0x1D53B, "M", "d"), - (0x1D53C, "M", "e"), - (0x1D53D, "M", "f"), - (0x1D53E, "M", "g"), - (0x1D53F, "X"), - (0x1D540, "M", "i"), - (0x1D541, "M", "j"), - (0x1D542, "M", "k"), - (0x1D543, "M", "l"), - (0x1D544, "M", "m"), - (0x1D545, "X"), - (0x1D546, "M", "o"), - (0x1D547, "X"), - (0x1D54A, "M", "s"), - (0x1D54B, "M", "t"), - (0x1D54C, "M", "u"), - (0x1D54D, "M", "v"), - (0x1D54E, "M", "w"), - (0x1D54F, "M", "x"), - (0x1D550, "M", "y"), - (0x1D551, "X"), - (0x1D552, "M", "a"), - (0x1D553, "M", "b"), - (0x1D554, "M", "c"), - (0x1D555, "M", "d"), - (0x1D556, "M", "e"), - ] - - -def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D557, "M", "f"), - (0x1D558, "M", "g"), - (0x1D559, "M", "h"), - (0x1D55A, "M", "i"), - (0x1D55B, "M", "j"), - (0x1D55C, "M", "k"), - (0x1D55D, "M", "l"), - (0x1D55E, "M", "m"), - (0x1D55F, "M", "n"), - (0x1D560, "M", "o"), - (0x1D561, "M", "p"), - (0x1D562, "M", "q"), - (0x1D563, "M", "r"), - (0x1D564, "M", "s"), - (0x1D565, "M", "t"), - (0x1D566, "M", "u"), - (0x1D567, "M", "v"), - (0x1D568, "M", "w"), - (0x1D569, "M", "x"), - (0x1D56A, "M", "y"), - (0x1D56B, "M", "z"), - (0x1D56C, "M", "a"), - (0x1D56D, "M", "b"), - (0x1D56E, "M", "c"), - (0x1D56F, "M", "d"), - (0x1D570, "M", "e"), - (0x1D571, "M", "f"), - (0x1D572, "M", "g"), - (0x1D573, "M", "h"), - (0x1D574, "M", "i"), - (0x1D575, "M", "j"), - (0x1D576, "M", "k"), - (0x1D577, "M", "l"), - (0x1D578, "M", "m"), - (0x1D579, "M", "n"), - (0x1D57A, "M", "o"), - (0x1D57B, "M", "p"), - (0x1D57C, "M", "q"), - (0x1D57D, "M", "r"), - (0x1D57E, "M", "s"), - (0x1D57F, "M", "t"), - (0x1D580, "M", "u"), - (0x1D581, "M", "v"), - (0x1D582, "M", "w"), - (0x1D583, "M", "x"), - (0x1D584, "M", "y"), - (0x1D585, "M", "z"), - (0x1D586, "M", "a"), - (0x1D587, "M", "b"), - (0x1D588, "M", "c"), - (0x1D589, "M", "d"), - (0x1D58A, "M", "e"), - (0x1D58B, "M", "f"), - (0x1D58C, "M", "g"), - (0x1D58D, "M", "h"), - (0x1D58E, "M", "i"), - (0x1D58F, "M", "j"), - (0x1D590, "M", "k"), - (0x1D591, "M", "l"), - (0x1D592, "M", "m"), - (0x1D593, "M", "n"), - (0x1D594, "M", "o"), - (0x1D595, "M", "p"), - (0x1D596, "M", "q"), - (0x1D597, "M", "r"), - (0x1D598, "M", "s"), - (0x1D599, "M", "t"), - (0x1D59A, "M", "u"), - (0x1D59B, "M", "v"), - (0x1D59C, "M", "w"), - (0x1D59D, "M", "x"), - (0x1D59E, "M", "y"), - (0x1D59F, "M", "z"), - (0x1D5A0, "M", "a"), - (0x1D5A1, "M", "b"), - (0x1D5A2, "M", "c"), - (0x1D5A3, "M", "d"), - (0x1D5A4, "M", "e"), - (0x1D5A5, "M", "f"), - (0x1D5A6, "M", "g"), - (0x1D5A7, "M", "h"), - (0x1D5A8, "M", "i"), - (0x1D5A9, "M", "j"), - (0x1D5AA, "M", "k"), - (0x1D5AB, "M", "l"), - (0x1D5AC, "M", "m"), - (0x1D5AD, "M", "n"), - (0x1D5AE, "M", "o"), - (0x1D5AF, "M", "p"), - (0x1D5B0, "M", "q"), - (0x1D5B1, "M", "r"), - (0x1D5B2, "M", "s"), - (0x1D5B3, "M", "t"), - (0x1D5B4, "M", "u"), - (0x1D5B5, "M", "v"), - (0x1D5B6, "M", "w"), - (0x1D5B7, "M", "x"), - (0x1D5B8, "M", "y"), - (0x1D5B9, "M", "z"), - (0x1D5BA, "M", "a"), - ] - - -def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D5BB, "M", "b"), - (0x1D5BC, "M", "c"), - (0x1D5BD, "M", "d"), - (0x1D5BE, "M", "e"), - (0x1D5BF, "M", "f"), - (0x1D5C0, "M", "g"), - (0x1D5C1, "M", "h"), - (0x1D5C2, "M", "i"), - (0x1D5C3, "M", "j"), - (0x1D5C4, "M", "k"), - (0x1D5C5, "M", "l"), - (0x1D5C6, "M", "m"), - (0x1D5C7, "M", "n"), - (0x1D5C8, "M", "o"), - (0x1D5C9, "M", "p"), - (0x1D5CA, "M", "q"), - (0x1D5CB, "M", "r"), - (0x1D5CC, "M", "s"), - (0x1D5CD, "M", "t"), - (0x1D5CE, "M", "u"), - (0x1D5CF, "M", "v"), - (0x1D5D0, "M", "w"), - (0x1D5D1, "M", "x"), - (0x1D5D2, "M", "y"), - (0x1D5D3, "M", "z"), - (0x1D5D4, "M", "a"), - (0x1D5D5, "M", "b"), - (0x1D5D6, "M", "c"), - (0x1D5D7, "M", "d"), - (0x1D5D8, "M", "e"), - (0x1D5D9, "M", "f"), - (0x1D5DA, "M", "g"), - (0x1D5DB, "M", "h"), - (0x1D5DC, "M", "i"), - (0x1D5DD, "M", "j"), - (0x1D5DE, "M", "k"), - (0x1D5DF, "M", "l"), - (0x1D5E0, "M", "m"), - (0x1D5E1, "M", "n"), - (0x1D5E2, "M", "o"), - (0x1D5E3, "M", "p"), - (0x1D5E4, "M", "q"), - (0x1D5E5, "M", "r"), - (0x1D5E6, "M", "s"), - (0x1D5E7, "M", "t"), - (0x1D5E8, "M", "u"), - (0x1D5E9, "M", "v"), - (0x1D5EA, "M", "w"), - (0x1D5EB, "M", "x"), - (0x1D5EC, "M", "y"), - (0x1D5ED, "M", "z"), - (0x1D5EE, "M", "a"), - (0x1D5EF, "M", "b"), - (0x1D5F0, "M", "c"), - (0x1D5F1, "M", "d"), - (0x1D5F2, "M", "e"), - (0x1D5F3, "M", "f"), - (0x1D5F4, "M", "g"), - (0x1D5F5, "M", "h"), - (0x1D5F6, "M", "i"), - (0x1D5F7, "M", "j"), - (0x1D5F8, "M", "k"), - (0x1D5F9, "M", "l"), - (0x1D5FA, "M", "m"), - (0x1D5FB, "M", "n"), - (0x1D5FC, "M", "o"), - (0x1D5FD, "M", "p"), - (0x1D5FE, "M", "q"), - (0x1D5FF, "M", "r"), - (0x1D600, "M", "s"), - (0x1D601, "M", "t"), - (0x1D602, "M", "u"), - (0x1D603, "M", "v"), - (0x1D604, "M", "w"), - (0x1D605, "M", "x"), - (0x1D606, "M", "y"), - (0x1D607, "M", "z"), - (0x1D608, "M", "a"), - (0x1D609, "M", "b"), - (0x1D60A, "M", "c"), - (0x1D60B, "M", "d"), - (0x1D60C, "M", "e"), - (0x1D60D, "M", "f"), - (0x1D60E, "M", "g"), - (0x1D60F, "M", "h"), - (0x1D610, "M", "i"), - (0x1D611, "M", "j"), - (0x1D612, "M", "k"), - (0x1D613, "M", "l"), - (0x1D614, "M", "m"), - (0x1D615, "M", "n"), - (0x1D616, "M", "o"), - (0x1D617, "M", "p"), - (0x1D618, "M", "q"), - (0x1D619, "M", "r"), - (0x1D61A, "M", "s"), - (0x1D61B, "M", "t"), - (0x1D61C, "M", "u"), - (0x1D61D, "M", "v"), - (0x1D61E, "M", "w"), - ] - - -def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D61F, "M", "x"), - (0x1D620, "M", "y"), - (0x1D621, "M", "z"), - (0x1D622, "M", "a"), - (0x1D623, "M", "b"), - (0x1D624, "M", "c"), - (0x1D625, "M", "d"), - (0x1D626, "M", "e"), - (0x1D627, "M", "f"), - (0x1D628, "M", "g"), - (0x1D629, "M", "h"), - (0x1D62A, "M", "i"), - (0x1D62B, "M", "j"), - (0x1D62C, "M", "k"), - (0x1D62D, "M", "l"), - (0x1D62E, "M", "m"), - (0x1D62F, "M", "n"), - (0x1D630, "M", "o"), - (0x1D631, "M", "p"), - (0x1D632, "M", "q"), - (0x1D633, "M", "r"), - (0x1D634, "M", "s"), - (0x1D635, "M", "t"), - (0x1D636, "M", "u"), - (0x1D637, "M", "v"), - (0x1D638, "M", "w"), - (0x1D639, "M", "x"), - (0x1D63A, "M", "y"), - (0x1D63B, "M", "z"), - (0x1D63C, "M", "a"), - (0x1D63D, "M", "b"), - (0x1D63E, "M", "c"), - (0x1D63F, "M", "d"), - (0x1D640, "M", "e"), - (0x1D641, "M", "f"), - (0x1D642, "M", "g"), - (0x1D643, "M", "h"), - (0x1D644, "M", "i"), - (0x1D645, "M", "j"), - (0x1D646, "M", "k"), - (0x1D647, "M", "l"), - (0x1D648, "M", "m"), - (0x1D649, "M", "n"), - (0x1D64A, "M", "o"), - (0x1D64B, "M", "p"), - (0x1D64C, "M", "q"), - (0x1D64D, "M", "r"), - (0x1D64E, "M", "s"), - (0x1D64F, "M", "t"), - (0x1D650, "M", "u"), - (0x1D651, "M", "v"), - (0x1D652, "M", "w"), - (0x1D653, "M", "x"), - (0x1D654, "M", "y"), - (0x1D655, "M", "z"), - (0x1D656, "M", "a"), - (0x1D657, "M", "b"), - (0x1D658, "M", "c"), - (0x1D659, "M", "d"), - (0x1D65A, "M", "e"), - (0x1D65B, "M", "f"), - (0x1D65C, "M", "g"), - (0x1D65D, "M", "h"), - (0x1D65E, "M", "i"), - (0x1D65F, "M", "j"), - (0x1D660, "M", "k"), - (0x1D661, "M", "l"), - (0x1D662, "M", "m"), - (0x1D663, "M", "n"), - (0x1D664, "M", "o"), - (0x1D665, "M", "p"), - (0x1D666, "M", "q"), - (0x1D667, "M", "r"), - (0x1D668, "M", "s"), - (0x1D669, "M", "t"), - (0x1D66A, "M", "u"), - (0x1D66B, "M", "v"), - (0x1D66C, "M", "w"), - (0x1D66D, "M", "x"), - (0x1D66E, "M", "y"), - (0x1D66F, "M", "z"), - (0x1D670, "M", "a"), - (0x1D671, "M", "b"), - (0x1D672, "M", "c"), - (0x1D673, "M", "d"), - (0x1D674, "M", "e"), - (0x1D675, "M", "f"), - (0x1D676, "M", "g"), - (0x1D677, "M", "h"), - (0x1D678, "M", "i"), - (0x1D679, "M", "j"), - (0x1D67A, "M", "k"), - (0x1D67B, "M", "l"), - (0x1D67C, "M", "m"), - (0x1D67D, "M", "n"), - (0x1D67E, "M", "o"), - (0x1D67F, "M", "p"), - (0x1D680, "M", "q"), - (0x1D681, "M", "r"), - (0x1D682, "M", "s"), - ] - - -def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D683, "M", "t"), - (0x1D684, "M", "u"), - (0x1D685, "M", "v"), - (0x1D686, "M", "w"), - (0x1D687, "M", "x"), - (0x1D688, "M", "y"), - (0x1D689, "M", "z"), - (0x1D68A, "M", "a"), - (0x1D68B, "M", "b"), - (0x1D68C, "M", "c"), - (0x1D68D, "M", "d"), - (0x1D68E, "M", "e"), - (0x1D68F, "M", "f"), - (0x1D690, "M", "g"), - (0x1D691, "M", "h"), - (0x1D692, "M", "i"), - (0x1D693, "M", "j"), - (0x1D694, "M", "k"), - (0x1D695, "M", "l"), - (0x1D696, "M", "m"), - (0x1D697, "M", "n"), - (0x1D698, "M", "o"), - (0x1D699, "M", "p"), - (0x1D69A, "M", "q"), - (0x1D69B, "M", "r"), - (0x1D69C, "M", "s"), - (0x1D69D, "M", "t"), - (0x1D69E, "M", "u"), - (0x1D69F, "M", "v"), - (0x1D6A0, "M", "w"), - (0x1D6A1, "M", "x"), - (0x1D6A2, "M", "y"), - (0x1D6A3, "M", "z"), - (0x1D6A4, "M", "ı"), - (0x1D6A5, "M", "ȷ"), - (0x1D6A6, "X"), - (0x1D6A8, "M", "α"), - (0x1D6A9, "M", "β"), - (0x1D6AA, "M", "γ"), - (0x1D6AB, "M", "δ"), - (0x1D6AC, "M", "ε"), - (0x1D6AD, "M", "ζ"), - (0x1D6AE, "M", "η"), - (0x1D6AF, "M", "θ"), - (0x1D6B0, "M", "ι"), - (0x1D6B1, "M", "κ"), - (0x1D6B2, "M", "λ"), - (0x1D6B3, "M", "μ"), - (0x1D6B4, "M", "ν"), - (0x1D6B5, "M", "ξ"), - (0x1D6B6, "M", "ο"), - (0x1D6B7, "M", "π"), - (0x1D6B8, "M", "ρ"), - (0x1D6B9, "M", "θ"), - (0x1D6BA, "M", "σ"), - (0x1D6BB, "M", "τ"), - (0x1D6BC, "M", "υ"), - (0x1D6BD, "M", "φ"), - (0x1D6BE, "M", "χ"), - (0x1D6BF, "M", "ψ"), - (0x1D6C0, "M", "ω"), - (0x1D6C1, "M", "∇"), - (0x1D6C2, "M", "α"), - (0x1D6C3, "M", "β"), - (0x1D6C4, "M", "γ"), - (0x1D6C5, "M", "δ"), - (0x1D6C6, "M", "ε"), - (0x1D6C7, "M", "ζ"), - (0x1D6C8, "M", "η"), - (0x1D6C9, "M", "θ"), - (0x1D6CA, "M", "ι"), - (0x1D6CB, "M", "κ"), - (0x1D6CC, "M", "λ"), - (0x1D6CD, "M", "μ"), - (0x1D6CE, "M", "ν"), - (0x1D6CF, "M", "ξ"), - (0x1D6D0, "M", "ο"), - (0x1D6D1, "M", "π"), - (0x1D6D2, "M", "ρ"), - (0x1D6D3, "M", "σ"), - (0x1D6D5, "M", "τ"), - (0x1D6D6, "M", "υ"), - (0x1D6D7, "M", "φ"), - (0x1D6D8, "M", "χ"), - (0x1D6D9, "M", "ψ"), - (0x1D6DA, "M", "ω"), - (0x1D6DB, "M", "∂"), - (0x1D6DC, "M", "ε"), - (0x1D6DD, "M", "θ"), - (0x1D6DE, "M", "κ"), - (0x1D6DF, "M", "φ"), - (0x1D6E0, "M", "ρ"), - (0x1D6E1, "M", "π"), - (0x1D6E2, "M", "α"), - (0x1D6E3, "M", "β"), - (0x1D6E4, "M", "γ"), - (0x1D6E5, "M", "δ"), - (0x1D6E6, "M", "ε"), - (0x1D6E7, "M", "ζ"), - (0x1D6E8, "M", "η"), - ] - - -def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D6E9, "M", "θ"), - (0x1D6EA, "M", "ι"), - (0x1D6EB, "M", "κ"), - (0x1D6EC, "M", "λ"), - (0x1D6ED, "M", "μ"), - (0x1D6EE, "M", "ν"), - (0x1D6EF, "M", "ξ"), - (0x1D6F0, "M", "ο"), - (0x1D6F1, "M", "π"), - (0x1D6F2, "M", "ρ"), - (0x1D6F3, "M", "θ"), - (0x1D6F4, "M", "σ"), - (0x1D6F5, "M", "τ"), - (0x1D6F6, "M", "υ"), - (0x1D6F7, "M", "φ"), - (0x1D6F8, "M", "χ"), - (0x1D6F9, "M", "ψ"), - (0x1D6FA, "M", "ω"), - (0x1D6FB, "M", "∇"), - (0x1D6FC, "M", "α"), - (0x1D6FD, "M", "β"), - (0x1D6FE, "M", "γ"), - (0x1D6FF, "M", "δ"), - (0x1D700, "M", "ε"), - (0x1D701, "M", "ζ"), - (0x1D702, "M", "η"), - (0x1D703, "M", "θ"), - (0x1D704, "M", "ι"), - (0x1D705, "M", "κ"), - (0x1D706, "M", "λ"), - (0x1D707, "M", "μ"), - (0x1D708, "M", "ν"), - (0x1D709, "M", "ξ"), - (0x1D70A, "M", "ο"), - (0x1D70B, "M", "π"), - (0x1D70C, "M", "ρ"), - (0x1D70D, "M", "σ"), - (0x1D70F, "M", "τ"), - (0x1D710, "M", "υ"), - (0x1D711, "M", "φ"), - (0x1D712, "M", "χ"), - (0x1D713, "M", "ψ"), - (0x1D714, "M", "ω"), - (0x1D715, "M", "∂"), - (0x1D716, "M", "ε"), - (0x1D717, "M", "θ"), - (0x1D718, "M", "κ"), - (0x1D719, "M", "φ"), - (0x1D71A, "M", "ρ"), - (0x1D71B, "M", "π"), - (0x1D71C, "M", "α"), - (0x1D71D, "M", "β"), - (0x1D71E, "M", "γ"), - (0x1D71F, "M", "δ"), - (0x1D720, "M", "ε"), - (0x1D721, "M", "ζ"), - (0x1D722, "M", "η"), - (0x1D723, "M", "θ"), - (0x1D724, "M", "ι"), - (0x1D725, "M", "κ"), - (0x1D726, "M", "λ"), - (0x1D727, "M", "μ"), - (0x1D728, "M", "ν"), - (0x1D729, "M", "ξ"), - (0x1D72A, "M", "ο"), - (0x1D72B, "M", "π"), - (0x1D72C, "M", "ρ"), - (0x1D72D, "M", "θ"), - (0x1D72E, "M", "σ"), - (0x1D72F, "M", "τ"), - (0x1D730, "M", "υ"), - (0x1D731, "M", "φ"), - (0x1D732, "M", "χ"), - (0x1D733, "M", "ψ"), - (0x1D734, "M", "ω"), - (0x1D735, "M", "∇"), - (0x1D736, "M", "α"), - (0x1D737, "M", "β"), - (0x1D738, "M", "γ"), - (0x1D739, "M", "δ"), - (0x1D73A, "M", "ε"), - (0x1D73B, "M", "ζ"), - (0x1D73C, "M", "η"), - (0x1D73D, "M", "θ"), - (0x1D73E, "M", "ι"), - (0x1D73F, "M", "κ"), - (0x1D740, "M", "λ"), - (0x1D741, "M", "μ"), - (0x1D742, "M", "ν"), - (0x1D743, "M", "ξ"), - (0x1D744, "M", "ο"), - (0x1D745, "M", "π"), - (0x1D746, "M", "ρ"), - (0x1D747, "M", "σ"), - (0x1D749, "M", "τ"), - (0x1D74A, "M", "υ"), - (0x1D74B, "M", "φ"), - (0x1D74C, "M", "χ"), - (0x1D74D, "M", "ψ"), - (0x1D74E, "M", "ω"), - ] - - -def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D74F, "M", "∂"), - (0x1D750, "M", "ε"), - (0x1D751, "M", "θ"), - (0x1D752, "M", "κ"), - (0x1D753, "M", "φ"), - (0x1D754, "M", "ρ"), - (0x1D755, "M", "π"), - (0x1D756, "M", "α"), - (0x1D757, "M", "β"), - (0x1D758, "M", "γ"), - (0x1D759, "M", "δ"), - (0x1D75A, "M", "ε"), - (0x1D75B, "M", "ζ"), - (0x1D75C, "M", "η"), - (0x1D75D, "M", "θ"), - (0x1D75E, "M", "ι"), - (0x1D75F, "M", "κ"), - (0x1D760, "M", "λ"), - (0x1D761, "M", "μ"), - (0x1D762, "M", "ν"), - (0x1D763, "M", "ξ"), - (0x1D764, "M", "ο"), - (0x1D765, "M", "π"), - (0x1D766, "M", "ρ"), - (0x1D767, "M", "θ"), - (0x1D768, "M", "σ"), - (0x1D769, "M", "τ"), - (0x1D76A, "M", "υ"), - (0x1D76B, "M", "φ"), - (0x1D76C, "M", "χ"), - (0x1D76D, "M", "ψ"), - (0x1D76E, "M", "ω"), - (0x1D76F, "M", "∇"), - (0x1D770, "M", "α"), - (0x1D771, "M", "β"), - (0x1D772, "M", "γ"), - (0x1D773, "M", "δ"), - (0x1D774, "M", "ε"), - (0x1D775, "M", "ζ"), - (0x1D776, "M", "η"), - (0x1D777, "M", "θ"), - (0x1D778, "M", "ι"), - (0x1D779, "M", "κ"), - (0x1D77A, "M", "λ"), - (0x1D77B, "M", "μ"), - (0x1D77C, "M", "ν"), - (0x1D77D, "M", "ξ"), - (0x1D77E, "M", "ο"), - (0x1D77F, "M", "π"), - (0x1D780, "M", "ρ"), - (0x1D781, "M", "σ"), - (0x1D783, "M", "τ"), - (0x1D784, "M", "υ"), - (0x1D785, "M", "φ"), - (0x1D786, "M", "χ"), - (0x1D787, "M", "ψ"), - (0x1D788, "M", "ω"), - (0x1D789, "M", "∂"), - (0x1D78A, "M", "ε"), - (0x1D78B, "M", "θ"), - (0x1D78C, "M", "κ"), - (0x1D78D, "M", "φ"), - (0x1D78E, "M", "ρ"), - (0x1D78F, "M", "π"), - (0x1D790, "M", "α"), - (0x1D791, "M", "β"), - (0x1D792, "M", "γ"), - (0x1D793, "M", "δ"), - (0x1D794, "M", "ε"), - (0x1D795, "M", "ζ"), - (0x1D796, "M", "η"), - (0x1D797, "M", "θ"), - (0x1D798, "M", "ι"), - (0x1D799, "M", "κ"), - (0x1D79A, "M", "λ"), - (0x1D79B, "M", "μ"), - (0x1D79C, "M", "ν"), - (0x1D79D, "M", "ξ"), - (0x1D79E, "M", "ο"), - (0x1D79F, "M", "π"), - (0x1D7A0, "M", "ρ"), - (0x1D7A1, "M", "θ"), - (0x1D7A2, "M", "σ"), - (0x1D7A3, "M", "τ"), - (0x1D7A4, "M", "υ"), - (0x1D7A5, "M", "φ"), - (0x1D7A6, "M", "χ"), - (0x1D7A7, "M", "ψ"), - (0x1D7A8, "M", "ω"), - (0x1D7A9, "M", "∇"), - (0x1D7AA, "M", "α"), - (0x1D7AB, "M", "β"), - (0x1D7AC, "M", "γ"), - (0x1D7AD, "M", "δ"), - (0x1D7AE, "M", "ε"), - (0x1D7AF, "M", "ζ"), - (0x1D7B0, "M", "η"), - (0x1D7B1, "M", "θ"), - (0x1D7B2, "M", "ι"), - (0x1D7B3, "M", "κ"), - ] - - -def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D7B4, "M", "λ"), - (0x1D7B5, "M", "μ"), - (0x1D7B6, "M", "ν"), - (0x1D7B7, "M", "ξ"), - (0x1D7B8, "M", "ο"), - (0x1D7B9, "M", "π"), - (0x1D7BA, "M", "ρ"), - (0x1D7BB, "M", "σ"), - (0x1D7BD, "M", "τ"), - (0x1D7BE, "M", "υ"), - (0x1D7BF, "M", "φ"), - (0x1D7C0, "M", "χ"), - (0x1D7C1, "M", "ψ"), - (0x1D7C2, "M", "ω"), - (0x1D7C3, "M", "∂"), - (0x1D7C4, "M", "ε"), - (0x1D7C5, "M", "θ"), - (0x1D7C6, "M", "κ"), - (0x1D7C7, "M", "φ"), - (0x1D7C8, "M", "ρ"), - (0x1D7C9, "M", "π"), - (0x1D7CA, "M", "ϝ"), - (0x1D7CC, "X"), - (0x1D7CE, "M", "0"), - (0x1D7CF, "M", "1"), - (0x1D7D0, "M", "2"), - (0x1D7D1, "M", "3"), - (0x1D7D2, "M", "4"), - (0x1D7D3, "M", "5"), - (0x1D7D4, "M", "6"), - (0x1D7D5, "M", "7"), - (0x1D7D6, "M", "8"), - (0x1D7D7, "M", "9"), - (0x1D7D8, "M", "0"), - (0x1D7D9, "M", "1"), - (0x1D7DA, "M", "2"), - (0x1D7DB, "M", "3"), - (0x1D7DC, "M", "4"), - (0x1D7DD, "M", "5"), - (0x1D7DE, "M", "6"), - (0x1D7DF, "M", "7"), - (0x1D7E0, "M", "8"), - (0x1D7E1, "M", "9"), - (0x1D7E2, "M", "0"), - (0x1D7E3, "M", "1"), - (0x1D7E4, "M", "2"), - (0x1D7E5, "M", "3"), - (0x1D7E6, "M", "4"), - (0x1D7E7, "M", "5"), - (0x1D7E8, "M", "6"), - (0x1D7E9, "M", "7"), - (0x1D7EA, "M", "8"), - (0x1D7EB, "M", "9"), - (0x1D7EC, "M", "0"), - (0x1D7ED, "M", "1"), - (0x1D7EE, "M", "2"), - (0x1D7EF, "M", "3"), - (0x1D7F0, "M", "4"), - (0x1D7F1, "M", "5"), - (0x1D7F2, "M", "6"), - (0x1D7F3, "M", "7"), - (0x1D7F4, "M", "8"), - (0x1D7F5, "M", "9"), - (0x1D7F6, "M", "0"), - (0x1D7F7, "M", "1"), - (0x1D7F8, "M", "2"), - (0x1D7F9, "M", "3"), - (0x1D7FA, "M", "4"), - (0x1D7FB, "M", "5"), - (0x1D7FC, "M", "6"), - (0x1D7FD, "M", "7"), - (0x1D7FE, "M", "8"), - (0x1D7FF, "M", "9"), - (0x1D800, "V"), - (0x1DA8C, "X"), - (0x1DA9B, "V"), - (0x1DAA0, "X"), - (0x1DAA1, "V"), - (0x1DAB0, "X"), - (0x1DF00, "V"), - (0x1DF1F, "X"), - (0x1DF25, "V"), - (0x1DF2B, "X"), - (0x1E000, "V"), - (0x1E007, "X"), - (0x1E008, "V"), - (0x1E019, "X"), - (0x1E01B, "V"), - (0x1E022, "X"), - (0x1E023, "V"), - (0x1E025, "X"), - (0x1E026, "V"), - (0x1E02B, "X"), - (0x1E030, "M", "а"), - (0x1E031, "M", "б"), - (0x1E032, "M", "в"), - (0x1E033, "M", "г"), - (0x1E034, "M", "д"), - (0x1E035, "M", "е"), - (0x1E036, "M", "ж"), - ] - - -def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1E037, "M", "з"), - (0x1E038, "M", "и"), - (0x1E039, "M", "к"), - (0x1E03A, "M", "л"), - (0x1E03B, "M", "м"), - (0x1E03C, "M", "о"), - (0x1E03D, "M", "п"), - (0x1E03E, "M", "р"), - (0x1E03F, "M", "с"), - (0x1E040, "M", "т"), - (0x1E041, "M", "у"), - (0x1E042, "M", "ф"), - (0x1E043, "M", "х"), - (0x1E044, "M", "ц"), - (0x1E045, "M", "ч"), - (0x1E046, "M", "ш"), - (0x1E047, "M", "ы"), - (0x1E048, "M", "э"), - (0x1E049, "M", "ю"), - (0x1E04A, "M", "ꚉ"), - (0x1E04B, "M", "ә"), - (0x1E04C, "M", "і"), - (0x1E04D, "M", "ј"), - (0x1E04E, "M", "ө"), - (0x1E04F, "M", "ү"), - (0x1E050, "M", "ӏ"), - (0x1E051, "M", "а"), - (0x1E052, "M", "б"), - (0x1E053, "M", "в"), - (0x1E054, "M", "г"), - (0x1E055, "M", "д"), - (0x1E056, "M", "е"), - (0x1E057, "M", "ж"), - (0x1E058, "M", "з"), - (0x1E059, "M", "и"), - (0x1E05A, "M", "к"), - (0x1E05B, "M", "л"), - (0x1E05C, "M", "о"), - (0x1E05D, "M", "п"), - (0x1E05E, "M", "с"), - (0x1E05F, "M", "у"), - (0x1E060, "M", "ф"), - (0x1E061, "M", "х"), - (0x1E062, "M", "ц"), - (0x1E063, "M", "ч"), - (0x1E064, "M", "ш"), - (0x1E065, "M", "ъ"), - (0x1E066, "M", "ы"), - (0x1E067, "M", "ґ"), - (0x1E068, "M", "і"), - (0x1E069, "M", "ѕ"), - (0x1E06A, "M", "џ"), - (0x1E06B, "M", "ҫ"), - (0x1E06C, "M", "ꙑ"), - (0x1E06D, "M", "ұ"), - (0x1E06E, "X"), - (0x1E08F, "V"), - (0x1E090, "X"), - (0x1E100, "V"), - (0x1E12D, "X"), - (0x1E130, "V"), - (0x1E13E, "X"), - (0x1E140, "V"), - (0x1E14A, "X"), - (0x1E14E, "V"), - (0x1E150, "X"), - (0x1E290, "V"), - (0x1E2AF, "X"), - (0x1E2C0, "V"), - (0x1E2FA, "X"), - (0x1E2FF, "V"), - (0x1E300, "X"), - (0x1E4D0, "V"), - (0x1E4FA, "X"), - (0x1E7E0, "V"), - (0x1E7E7, "X"), - (0x1E7E8, "V"), - (0x1E7EC, "X"), - (0x1E7ED, "V"), - (0x1E7EF, "X"), - (0x1E7F0, "V"), - (0x1E7FF, "X"), - (0x1E800, "V"), - (0x1E8C5, "X"), - (0x1E8C7, "V"), - (0x1E8D7, "X"), - (0x1E900, "M", "𞤢"), - (0x1E901, "M", "𞤣"), - (0x1E902, "M", "𞤤"), - (0x1E903, "M", "𞤥"), - (0x1E904, "M", "𞤦"), - (0x1E905, "M", "𞤧"), - (0x1E906, "M", "𞤨"), - (0x1E907, "M", "𞤩"), - (0x1E908, "M", "𞤪"), - (0x1E909, "M", "𞤫"), - (0x1E90A, "M", "𞤬"), - (0x1E90B, "M", "𞤭"), - (0x1E90C, "M", "𞤮"), - (0x1E90D, "M", "𞤯"), - ] - - -def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1E90E, "M", "𞤰"), - (0x1E90F, "M", "𞤱"), - (0x1E910, "M", "𞤲"), - (0x1E911, "M", "𞤳"), - (0x1E912, "M", "𞤴"), - (0x1E913, "M", "𞤵"), - (0x1E914, "M", "𞤶"), - (0x1E915, "M", "𞤷"), - (0x1E916, "M", "𞤸"), - (0x1E917, "M", "𞤹"), - (0x1E918, "M", "𞤺"), - (0x1E919, "M", "𞤻"), - (0x1E91A, "M", "𞤼"), - (0x1E91B, "M", "𞤽"), - (0x1E91C, "M", "𞤾"), - (0x1E91D, "M", "𞤿"), - (0x1E91E, "M", "𞥀"), - (0x1E91F, "M", "𞥁"), - (0x1E920, "M", "𞥂"), - (0x1E921, "M", "𞥃"), - (0x1E922, "V"), - (0x1E94C, "X"), - (0x1E950, "V"), - (0x1E95A, "X"), - (0x1E95E, "V"), - (0x1E960, "X"), - (0x1EC71, "V"), - (0x1ECB5, "X"), - (0x1ED01, "V"), - (0x1ED3E, "X"), - (0x1EE00, "M", "ا"), - (0x1EE01, "M", "ب"), - (0x1EE02, "M", "ج"), - (0x1EE03, "M", "د"), - (0x1EE04, "X"), - (0x1EE05, "M", "و"), - (0x1EE06, "M", "ز"), - (0x1EE07, "M", "ح"), - (0x1EE08, "M", "ط"), - (0x1EE09, "M", "ي"), - (0x1EE0A, "M", "ك"), - (0x1EE0B, "M", "ل"), - (0x1EE0C, "M", "م"), - (0x1EE0D, "M", "ن"), - (0x1EE0E, "M", "س"), - (0x1EE0F, "M", "ع"), - (0x1EE10, "M", "ف"), - (0x1EE11, "M", "ص"), - (0x1EE12, "M", "ق"), - (0x1EE13, "M", "ر"), - (0x1EE14, "M", "ش"), - (0x1EE15, "M", "ت"), - (0x1EE16, "M", "ث"), - (0x1EE17, "M", "خ"), - (0x1EE18, "M", "ذ"), - (0x1EE19, "M", "ض"), - (0x1EE1A, "M", "ظ"), - (0x1EE1B, "M", "غ"), - (0x1EE1C, "M", "ٮ"), - (0x1EE1D, "M", "ں"), - (0x1EE1E, "M", "ڡ"), - (0x1EE1F, "M", "ٯ"), - (0x1EE20, "X"), - (0x1EE21, "M", "ب"), - (0x1EE22, "M", "ج"), - (0x1EE23, "X"), - (0x1EE24, "M", "ه"), - (0x1EE25, "X"), - (0x1EE27, "M", "ح"), - (0x1EE28, "X"), - (0x1EE29, "M", "ي"), - (0x1EE2A, "M", "ك"), - (0x1EE2B, "M", "ل"), - (0x1EE2C, "M", "م"), - (0x1EE2D, "M", "ن"), - (0x1EE2E, "M", "س"), - (0x1EE2F, "M", "ع"), - (0x1EE30, "M", "ف"), - (0x1EE31, "M", "ص"), - (0x1EE32, "M", "ق"), - (0x1EE33, "X"), - (0x1EE34, "M", "ش"), - (0x1EE35, "M", "ت"), - (0x1EE36, "M", "ث"), - (0x1EE37, "M", "خ"), - (0x1EE38, "X"), - (0x1EE39, "M", "ض"), - (0x1EE3A, "X"), - (0x1EE3B, "M", "غ"), - (0x1EE3C, "X"), - (0x1EE42, "M", "ج"), - (0x1EE43, "X"), - (0x1EE47, "M", "ح"), - (0x1EE48, "X"), - (0x1EE49, "M", "ي"), - (0x1EE4A, "X"), - (0x1EE4B, "M", "ل"), - (0x1EE4C, "X"), - (0x1EE4D, "M", "ن"), - (0x1EE4E, "M", "س"), - ] - - -def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1EE4F, "M", "ع"), - (0x1EE50, "X"), - (0x1EE51, "M", "ص"), - (0x1EE52, "M", "ق"), - (0x1EE53, "X"), - (0x1EE54, "M", "ش"), - (0x1EE55, "X"), - (0x1EE57, "M", "خ"), - (0x1EE58, "X"), - (0x1EE59, "M", "ض"), - (0x1EE5A, "X"), - (0x1EE5B, "M", "غ"), - (0x1EE5C, "X"), - (0x1EE5D, "M", "ں"), - (0x1EE5E, "X"), - (0x1EE5F, "M", "ٯ"), - (0x1EE60, "X"), - (0x1EE61, "M", "ب"), - (0x1EE62, "M", "ج"), - (0x1EE63, "X"), - (0x1EE64, "M", "ه"), - (0x1EE65, "X"), - (0x1EE67, "M", "ح"), - (0x1EE68, "M", "ط"), - (0x1EE69, "M", "ي"), - (0x1EE6A, "M", "ك"), - (0x1EE6B, "X"), - (0x1EE6C, "M", "م"), - (0x1EE6D, "M", "ن"), - (0x1EE6E, "M", "س"), - (0x1EE6F, "M", "ع"), - (0x1EE70, "M", "ف"), - (0x1EE71, "M", "ص"), - (0x1EE72, "M", "ق"), - (0x1EE73, "X"), - (0x1EE74, "M", "ش"), - (0x1EE75, "M", "ت"), - (0x1EE76, "M", "ث"), - (0x1EE77, "M", "خ"), - (0x1EE78, "X"), - (0x1EE79, "M", "ض"), - (0x1EE7A, "M", "ظ"), - (0x1EE7B, "M", "غ"), - (0x1EE7C, "M", "ٮ"), - (0x1EE7D, "X"), - (0x1EE7E, "M", "ڡ"), - (0x1EE7F, "X"), - (0x1EE80, "M", "ا"), - (0x1EE81, "M", "ب"), - (0x1EE82, "M", "ج"), - (0x1EE83, "M", "د"), - (0x1EE84, "M", "ه"), - (0x1EE85, "M", "و"), - (0x1EE86, "M", "ز"), - (0x1EE87, "M", "ح"), - (0x1EE88, "M", "ط"), - (0x1EE89, "M", "ي"), - (0x1EE8A, "X"), - (0x1EE8B, "M", "ل"), - (0x1EE8C, "M", "م"), - (0x1EE8D, "M", "ن"), - (0x1EE8E, "M", "س"), - (0x1EE8F, "M", "ع"), - (0x1EE90, "M", "ف"), - (0x1EE91, "M", "ص"), - (0x1EE92, "M", "ق"), - (0x1EE93, "M", "ر"), - (0x1EE94, "M", "ش"), - (0x1EE95, "M", "ت"), - (0x1EE96, "M", "ث"), - (0x1EE97, "M", "خ"), - (0x1EE98, "M", "ذ"), - (0x1EE99, "M", "ض"), - (0x1EE9A, "M", "ظ"), - (0x1EE9B, "M", "غ"), - (0x1EE9C, "X"), - (0x1EEA1, "M", "ب"), - (0x1EEA2, "M", "ج"), - (0x1EEA3, "M", "د"), - (0x1EEA4, "X"), - (0x1EEA5, "M", "و"), - (0x1EEA6, "M", "ز"), - (0x1EEA7, "M", "ح"), - (0x1EEA8, "M", "ط"), - (0x1EEA9, "M", "ي"), - (0x1EEAA, "X"), - (0x1EEAB, "M", "ل"), - (0x1EEAC, "M", "م"), - (0x1EEAD, "M", "ن"), - (0x1EEAE, "M", "س"), - (0x1EEAF, "M", "ع"), - (0x1EEB0, "M", "ف"), - (0x1EEB1, "M", "ص"), - (0x1EEB2, "M", "ق"), - (0x1EEB3, "M", "ر"), - (0x1EEB4, "M", "ش"), - (0x1EEB5, "M", "ت"), - (0x1EEB6, "M", "ث"), - (0x1EEB7, "M", "خ"), - (0x1EEB8, "M", "ذ"), - ] - - -def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1EEB9, "M", "ض"), - (0x1EEBA, "M", "ظ"), - (0x1EEBB, "M", "غ"), - (0x1EEBC, "X"), - (0x1EEF0, "V"), - (0x1EEF2, "X"), - (0x1F000, "V"), - (0x1F02C, "X"), - (0x1F030, "V"), - (0x1F094, "X"), - (0x1F0A0, "V"), - (0x1F0AF, "X"), - (0x1F0B1, "V"), - (0x1F0C0, "X"), - (0x1F0C1, "V"), - (0x1F0D0, "X"), - (0x1F0D1, "V"), - (0x1F0F6, "X"), - (0x1F101, "3", "0,"), - (0x1F102, "3", "1,"), - (0x1F103, "3", "2,"), - (0x1F104, "3", "3,"), - (0x1F105, "3", "4,"), - (0x1F106, "3", "5,"), - (0x1F107, "3", "6,"), - (0x1F108, "3", "7,"), - (0x1F109, "3", "8,"), - (0x1F10A, "3", "9,"), - (0x1F10B, "V"), - (0x1F110, "3", "(a)"), - (0x1F111, "3", "(b)"), - (0x1F112, "3", "(c)"), - (0x1F113, "3", "(d)"), - (0x1F114, "3", "(e)"), - (0x1F115, "3", "(f)"), - (0x1F116, "3", "(g)"), - (0x1F117, "3", "(h)"), - (0x1F118, "3", "(i)"), - (0x1F119, "3", "(j)"), - (0x1F11A, "3", "(k)"), - (0x1F11B, "3", "(l)"), - (0x1F11C, "3", "(m)"), - (0x1F11D, "3", "(n)"), - (0x1F11E, "3", "(o)"), - (0x1F11F, "3", "(p)"), - (0x1F120, "3", "(q)"), - (0x1F121, "3", "(r)"), - (0x1F122, "3", "(s)"), - (0x1F123, "3", "(t)"), - (0x1F124, "3", "(u)"), - (0x1F125, "3", "(v)"), - (0x1F126, "3", "(w)"), - (0x1F127, "3", "(x)"), - (0x1F128, "3", "(y)"), - (0x1F129, "3", "(z)"), - (0x1F12A, "M", "〔s〕"), - (0x1F12B, "M", "c"), - (0x1F12C, "M", "r"), - (0x1F12D, "M", "cd"), - (0x1F12E, "M", "wz"), - (0x1F12F, "V"), - (0x1F130, "M", "a"), - (0x1F131, "M", "b"), - (0x1F132, "M", "c"), - (0x1F133, "M", "d"), - (0x1F134, "M", "e"), - (0x1F135, "M", "f"), - (0x1F136, "M", "g"), - (0x1F137, "M", "h"), - (0x1F138, "M", "i"), - (0x1F139, "M", "j"), - (0x1F13A, "M", "k"), - (0x1F13B, "M", "l"), - (0x1F13C, "M", "m"), - (0x1F13D, "M", "n"), - (0x1F13E, "M", "o"), - (0x1F13F, "M", "p"), - (0x1F140, "M", "q"), - (0x1F141, "M", "r"), - (0x1F142, "M", "s"), - (0x1F143, "M", "t"), - (0x1F144, "M", "u"), - (0x1F145, "M", "v"), - (0x1F146, "M", "w"), - (0x1F147, "M", "x"), - (0x1F148, "M", "y"), - (0x1F149, "M", "z"), - (0x1F14A, "M", "hv"), - (0x1F14B, "M", "mv"), - (0x1F14C, "M", "sd"), - (0x1F14D, "M", "ss"), - (0x1F14E, "M", "ppv"), - (0x1F14F, "M", "wc"), - (0x1F150, "V"), - (0x1F16A, "M", "mc"), - (0x1F16B, "M", "md"), - (0x1F16C, "M", "mr"), - (0x1F16D, "V"), - (0x1F190, "M", "dj"), - (0x1F191, "V"), - ] - - -def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1F1AE, "X"), - (0x1F1E6, "V"), - (0x1F200, "M", "ほか"), - (0x1F201, "M", "ココ"), - (0x1F202, "M", "サ"), - (0x1F203, "X"), - (0x1F210, "M", "手"), - (0x1F211, "M", "字"), - (0x1F212, "M", "双"), - (0x1F213, "M", "デ"), - (0x1F214, "M", "二"), - (0x1F215, "M", "多"), - (0x1F216, "M", "解"), - (0x1F217, "M", "天"), - (0x1F218, "M", "交"), - (0x1F219, "M", "映"), - (0x1F21A, "M", "無"), - (0x1F21B, "M", "料"), - (0x1F21C, "M", "前"), - (0x1F21D, "M", "後"), - (0x1F21E, "M", "再"), - (0x1F21F, "M", "新"), - (0x1F220, "M", "初"), - (0x1F221, "M", "終"), - (0x1F222, "M", "生"), - (0x1F223, "M", "販"), - (0x1F224, "M", "声"), - (0x1F225, "M", "吹"), - (0x1F226, "M", "演"), - (0x1F227, "M", "投"), - (0x1F228, "M", "捕"), - (0x1F229, "M", "一"), - (0x1F22A, "M", "三"), - (0x1F22B, "M", "遊"), - (0x1F22C, "M", "左"), - (0x1F22D, "M", "中"), - (0x1F22E, "M", "右"), - (0x1F22F, "M", "指"), - (0x1F230, "M", "走"), - (0x1F231, "M", "打"), - (0x1F232, "M", "禁"), - (0x1F233, "M", "空"), - (0x1F234, "M", "合"), - (0x1F235, "M", "満"), - (0x1F236, "M", "有"), - (0x1F237, "M", "月"), - (0x1F238, "M", "申"), - (0x1F239, "M", "割"), - (0x1F23A, "M", "営"), - (0x1F23B, "M", "配"), - (0x1F23C, "X"), - (0x1F240, "M", "〔本〕"), - (0x1F241, "M", "〔三〕"), - (0x1F242, "M", "〔二〕"), - (0x1F243, "M", "〔安〕"), - (0x1F244, "M", "〔点〕"), - (0x1F245, "M", "〔打〕"), - (0x1F246, "M", "〔盗〕"), - (0x1F247, "M", "〔勝〕"), - (0x1F248, "M", "〔敗〕"), - (0x1F249, "X"), - (0x1F250, "M", "得"), - (0x1F251, "M", "可"), - (0x1F252, "X"), - (0x1F260, "V"), - (0x1F266, "X"), - (0x1F300, "V"), - (0x1F6D8, "X"), - (0x1F6DC, "V"), - (0x1F6ED, "X"), - (0x1F6F0, "V"), - (0x1F6FD, "X"), - (0x1F700, "V"), - (0x1F777, "X"), - (0x1F77B, "V"), - (0x1F7DA, "X"), - (0x1F7E0, "V"), - (0x1F7EC, "X"), - (0x1F7F0, "V"), - (0x1F7F1, "X"), - (0x1F800, "V"), - (0x1F80C, "X"), - (0x1F810, "V"), - (0x1F848, "X"), - (0x1F850, "V"), - (0x1F85A, "X"), - (0x1F860, "V"), - (0x1F888, "X"), - (0x1F890, "V"), - (0x1F8AE, "X"), - (0x1F8B0, "V"), - (0x1F8B2, "X"), - (0x1F900, "V"), - (0x1FA54, "X"), - (0x1FA60, "V"), - (0x1FA6E, "X"), - (0x1FA70, "V"), - (0x1FA7D, "X"), - (0x1FA80, "V"), - (0x1FA89, "X"), - ] - - -def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1FA90, "V"), - (0x1FABE, "X"), - (0x1FABF, "V"), - (0x1FAC6, "X"), - (0x1FACE, "V"), - (0x1FADC, "X"), - (0x1FAE0, "V"), - (0x1FAE9, "X"), - (0x1FAF0, "V"), - (0x1FAF9, "X"), - (0x1FB00, "V"), - (0x1FB93, "X"), - (0x1FB94, "V"), - (0x1FBCB, "X"), - (0x1FBF0, "M", "0"), - (0x1FBF1, "M", "1"), - (0x1FBF2, "M", "2"), - (0x1FBF3, "M", "3"), - (0x1FBF4, "M", "4"), - (0x1FBF5, "M", "5"), - (0x1FBF6, "M", "6"), - (0x1FBF7, "M", "7"), - (0x1FBF8, "M", "8"), - (0x1FBF9, "M", "9"), - (0x1FBFA, "X"), - (0x20000, "V"), - (0x2A6E0, "X"), - (0x2A700, "V"), - (0x2B73A, "X"), - (0x2B740, "V"), - (0x2B81E, "X"), - (0x2B820, "V"), - (0x2CEA2, "X"), - (0x2CEB0, "V"), - (0x2EBE1, "X"), - (0x2EBF0, "V"), - (0x2EE5E, "X"), - (0x2F800, "M", "丽"), - (0x2F801, "M", "丸"), - (0x2F802, "M", "乁"), - (0x2F803, "M", "𠄢"), - (0x2F804, "M", "你"), - (0x2F805, "M", "侮"), - (0x2F806, "M", "侻"), - (0x2F807, "M", "倂"), - (0x2F808, "M", "偺"), - (0x2F809, "M", "備"), - (0x2F80A, "M", "僧"), - (0x2F80B, "M", "像"), - (0x2F80C, "M", "㒞"), - (0x2F80D, "M", "𠘺"), - (0x2F80E, "M", "免"), - (0x2F80F, "M", "兔"), - (0x2F810, "M", "兤"), - (0x2F811, "M", "具"), - (0x2F812, "M", "𠔜"), - (0x2F813, "M", "㒹"), - (0x2F814, "M", "內"), - (0x2F815, "M", "再"), - (0x2F816, "M", "𠕋"), - (0x2F817, "M", "冗"), - (0x2F818, "M", "冤"), - (0x2F819, "M", "仌"), - (0x2F81A, "M", "冬"), - (0x2F81B, "M", "况"), - (0x2F81C, "M", "𩇟"), - (0x2F81D, "M", "凵"), - (0x2F81E, "M", "刃"), - (0x2F81F, "M", "㓟"), - (0x2F820, "M", "刻"), - (0x2F821, "M", "剆"), - (0x2F822, "M", "割"), - (0x2F823, "M", "剷"), - (0x2F824, "M", "㔕"), - (0x2F825, "M", "勇"), - (0x2F826, "M", "勉"), - (0x2F827, "M", "勤"), - (0x2F828, "M", "勺"), - (0x2F829, "M", "包"), - (0x2F82A, "M", "匆"), - (0x2F82B, "M", "北"), - (0x2F82C, "M", "卉"), - (0x2F82D, "M", "卑"), - (0x2F82E, "M", "博"), - (0x2F82F, "M", "即"), - (0x2F830, "M", "卽"), - (0x2F831, "M", "卿"), - (0x2F834, "M", "𠨬"), - (0x2F835, "M", "灰"), - (0x2F836, "M", "及"), - (0x2F837, "M", "叟"), - (0x2F838, "M", "𠭣"), - (0x2F839, "M", "叫"), - (0x2F83A, "M", "叱"), - (0x2F83B, "M", "吆"), - (0x2F83C, "M", "咞"), - (0x2F83D, "M", "吸"), - (0x2F83E, "M", "呈"), - (0x2F83F, "M", "周"), - (0x2F840, "M", "咢"), - ] - - -def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F841, "M", "哶"), - (0x2F842, "M", "唐"), - (0x2F843, "M", "啓"), - (0x2F844, "M", "啣"), - (0x2F845, "M", "善"), - (0x2F847, "M", "喙"), - (0x2F848, "M", "喫"), - (0x2F849, "M", "喳"), - (0x2F84A, "M", "嗂"), - (0x2F84B, "M", "圖"), - (0x2F84C, "M", "嘆"), - (0x2F84D, "M", "圗"), - (0x2F84E, "M", "噑"), - (0x2F84F, "M", "噴"), - (0x2F850, "M", "切"), - (0x2F851, "M", "壮"), - (0x2F852, "M", "城"), - (0x2F853, "M", "埴"), - (0x2F854, "M", "堍"), - (0x2F855, "M", "型"), - (0x2F856, "M", "堲"), - (0x2F857, "M", "報"), - (0x2F858, "M", "墬"), - (0x2F859, "M", "𡓤"), - (0x2F85A, "M", "売"), - (0x2F85B, "M", "壷"), - (0x2F85C, "M", "夆"), - (0x2F85D, "M", "多"), - (0x2F85E, "M", "夢"), - (0x2F85F, "M", "奢"), - (0x2F860, "M", "𡚨"), - (0x2F861, "M", "𡛪"), - (0x2F862, "M", "姬"), - (0x2F863, "M", "娛"), - (0x2F864, "M", "娧"), - (0x2F865, "M", "姘"), - (0x2F866, "M", "婦"), - (0x2F867, "M", "㛮"), - (0x2F868, "X"), - (0x2F869, "M", "嬈"), - (0x2F86A, "M", "嬾"), - (0x2F86C, "M", "𡧈"), - (0x2F86D, "M", "寃"), - (0x2F86E, "M", "寘"), - (0x2F86F, "M", "寧"), - (0x2F870, "M", "寳"), - (0x2F871, "M", "𡬘"), - (0x2F872, "M", "寿"), - (0x2F873, "M", "将"), - (0x2F874, "X"), - (0x2F875, "M", "尢"), - (0x2F876, "M", "㞁"), - (0x2F877, "M", "屠"), - (0x2F878, "M", "屮"), - (0x2F879, "M", "峀"), - (0x2F87A, "M", "岍"), - (0x2F87B, "M", "𡷤"), - (0x2F87C, "M", "嵃"), - (0x2F87D, "M", "𡷦"), - (0x2F87E, "M", "嵮"), - (0x2F87F, "M", "嵫"), - (0x2F880, "M", "嵼"), - (0x2F881, "M", "巡"), - (0x2F882, "M", "巢"), - (0x2F883, "M", "㠯"), - (0x2F884, "M", "巽"), - (0x2F885, "M", "帨"), - (0x2F886, "M", "帽"), - (0x2F887, "M", "幩"), - (0x2F888, "M", "㡢"), - (0x2F889, "M", "𢆃"), - (0x2F88A, "M", "㡼"), - (0x2F88B, "M", "庰"), - (0x2F88C, "M", "庳"), - (0x2F88D, "M", "庶"), - (0x2F88E, "M", "廊"), - (0x2F88F, "M", "𪎒"), - (0x2F890, "M", "廾"), - (0x2F891, "M", "𢌱"), - (0x2F893, "M", "舁"), - (0x2F894, "M", "弢"), - (0x2F896, "M", "㣇"), - (0x2F897, "M", "𣊸"), - (0x2F898, "M", "𦇚"), - (0x2F899, "M", "形"), - (0x2F89A, "M", "彫"), - (0x2F89B, "M", "㣣"), - (0x2F89C, "M", "徚"), - (0x2F89D, "M", "忍"), - (0x2F89E, "M", "志"), - (0x2F89F, "M", "忹"), - (0x2F8A0, "M", "悁"), - (0x2F8A1, "M", "㤺"), - (0x2F8A2, "M", "㤜"), - (0x2F8A3, "M", "悔"), - (0x2F8A4, "M", "𢛔"), - (0x2F8A5, "M", "惇"), - (0x2F8A6, "M", "慈"), - (0x2F8A7, "M", "慌"), - (0x2F8A8, "M", "慎"), - ] - - -def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F8A9, "M", "慌"), - (0x2F8AA, "M", "慺"), - (0x2F8AB, "M", "憎"), - (0x2F8AC, "M", "憲"), - (0x2F8AD, "M", "憤"), - (0x2F8AE, "M", "憯"), - (0x2F8AF, "M", "懞"), - (0x2F8B0, "M", "懲"), - (0x2F8B1, "M", "懶"), - (0x2F8B2, "M", "成"), - (0x2F8B3, "M", "戛"), - (0x2F8B4, "M", "扝"), - (0x2F8B5, "M", "抱"), - (0x2F8B6, "M", "拔"), - (0x2F8B7, "M", "捐"), - (0x2F8B8, "M", "𢬌"), - (0x2F8B9, "M", "挽"), - (0x2F8BA, "M", "拼"), - (0x2F8BB, "M", "捨"), - (0x2F8BC, "M", "掃"), - (0x2F8BD, "M", "揤"), - (0x2F8BE, "M", "𢯱"), - (0x2F8BF, "M", "搢"), - (0x2F8C0, "M", "揅"), - (0x2F8C1, "M", "掩"), - (0x2F8C2, "M", "㨮"), - (0x2F8C3, "M", "摩"), - (0x2F8C4, "M", "摾"), - (0x2F8C5, "M", "撝"), - (0x2F8C6, "M", "摷"), - (0x2F8C7, "M", "㩬"), - (0x2F8C8, "M", "敏"), - (0x2F8C9, "M", "敬"), - (0x2F8CA, "M", "𣀊"), - (0x2F8CB, "M", "旣"), - (0x2F8CC, "M", "書"), - (0x2F8CD, "M", "晉"), - (0x2F8CE, "M", "㬙"), - (0x2F8CF, "M", "暑"), - (0x2F8D0, "M", "㬈"), - (0x2F8D1, "M", "㫤"), - (0x2F8D2, "M", "冒"), - (0x2F8D3, "M", "冕"), - (0x2F8D4, "M", "最"), - (0x2F8D5, "M", "暜"), - (0x2F8D6, "M", "肭"), - (0x2F8D7, "M", "䏙"), - (0x2F8D8, "M", "朗"), - (0x2F8D9, "M", "望"), - (0x2F8DA, "M", "朡"), - (0x2F8DB, "M", "杞"), - (0x2F8DC, "M", "杓"), - (0x2F8DD, "M", "𣏃"), - (0x2F8DE, "M", "㭉"), - (0x2F8DF, "M", "柺"), - (0x2F8E0, "M", "枅"), - (0x2F8E1, "M", "桒"), - (0x2F8E2, "M", "梅"), - (0x2F8E3, "M", "𣑭"), - (0x2F8E4, "M", "梎"), - (0x2F8E5, "M", "栟"), - (0x2F8E6, "M", "椔"), - (0x2F8E7, "M", "㮝"), - (0x2F8E8, "M", "楂"), - (0x2F8E9, "M", "榣"), - (0x2F8EA, "M", "槪"), - (0x2F8EB, "M", "檨"), - (0x2F8EC, "M", "𣚣"), - (0x2F8ED, "M", "櫛"), - (0x2F8EE, "M", "㰘"), - (0x2F8EF, "M", "次"), - (0x2F8F0, "M", "𣢧"), - (0x2F8F1, "M", "歔"), - (0x2F8F2, "M", "㱎"), - (0x2F8F3, "M", "歲"), - (0x2F8F4, "M", "殟"), - (0x2F8F5, "M", "殺"), - (0x2F8F6, "M", "殻"), - (0x2F8F7, "M", "𣪍"), - (0x2F8F8, "M", "𡴋"), - (0x2F8F9, "M", "𣫺"), - (0x2F8FA, "M", "汎"), - (0x2F8FB, "M", "𣲼"), - (0x2F8FC, "M", "沿"), - (0x2F8FD, "M", "泍"), - (0x2F8FE, "M", "汧"), - (0x2F8FF, "M", "洖"), - (0x2F900, "M", "派"), - (0x2F901, "M", "海"), - (0x2F902, "M", "流"), - (0x2F903, "M", "浩"), - (0x2F904, "M", "浸"), - (0x2F905, "M", "涅"), - (0x2F906, "M", "𣴞"), - (0x2F907, "M", "洴"), - (0x2F908, "M", "港"), - (0x2F909, "M", "湮"), - (0x2F90A, "M", "㴳"), - (0x2F90B, "M", "滋"), - (0x2F90C, "M", "滇"), - ] - - -def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F90D, "M", "𣻑"), - (0x2F90E, "M", "淹"), - (0x2F90F, "M", "潮"), - (0x2F910, "M", "𣽞"), - (0x2F911, "M", "𣾎"), - (0x2F912, "M", "濆"), - (0x2F913, "M", "瀹"), - (0x2F914, "M", "瀞"), - (0x2F915, "M", "瀛"), - (0x2F916, "M", "㶖"), - (0x2F917, "M", "灊"), - (0x2F918, "M", "災"), - (0x2F919, "M", "灷"), - (0x2F91A, "M", "炭"), - (0x2F91B, "M", "𠔥"), - (0x2F91C, "M", "煅"), - (0x2F91D, "M", "𤉣"), - (0x2F91E, "M", "熜"), - (0x2F91F, "X"), - (0x2F920, "M", "爨"), - (0x2F921, "M", "爵"), - (0x2F922, "M", "牐"), - (0x2F923, "M", "𤘈"), - (0x2F924, "M", "犀"), - (0x2F925, "M", "犕"), - (0x2F926, "M", "𤜵"), - (0x2F927, "M", "𤠔"), - (0x2F928, "M", "獺"), - (0x2F929, "M", "王"), - (0x2F92A, "M", "㺬"), - (0x2F92B, "M", "玥"), - (0x2F92C, "M", "㺸"), - (0x2F92E, "M", "瑇"), - (0x2F92F, "M", "瑜"), - (0x2F930, "M", "瑱"), - (0x2F931, "M", "璅"), - (0x2F932, "M", "瓊"), - (0x2F933, "M", "㼛"), - (0x2F934, "M", "甤"), - (0x2F935, "M", "𤰶"), - (0x2F936, "M", "甾"), - (0x2F937, "M", "𤲒"), - (0x2F938, "M", "異"), - (0x2F939, "M", "𢆟"), - (0x2F93A, "M", "瘐"), - (0x2F93B, "M", "𤾡"), - (0x2F93C, "M", "𤾸"), - (0x2F93D, "M", "𥁄"), - (0x2F93E, "M", "㿼"), - (0x2F93F, "M", "䀈"), - (0x2F940, "M", "直"), - (0x2F941, "M", "𥃳"), - (0x2F942, "M", "𥃲"), - (0x2F943, "M", "𥄙"), - (0x2F944, "M", "𥄳"), - (0x2F945, "M", "眞"), - (0x2F946, "M", "真"), - (0x2F948, "M", "睊"), - (0x2F949, "M", "䀹"), - (0x2F94A, "M", "瞋"), - (0x2F94B, "M", "䁆"), - (0x2F94C, "M", "䂖"), - (0x2F94D, "M", "𥐝"), - (0x2F94E, "M", "硎"), - (0x2F94F, "M", "碌"), - (0x2F950, "M", "磌"), - (0x2F951, "M", "䃣"), - (0x2F952, "M", "𥘦"), - (0x2F953, "M", "祖"), - (0x2F954, "M", "𥚚"), - (0x2F955, "M", "𥛅"), - (0x2F956, "M", "福"), - (0x2F957, "M", "秫"), - (0x2F958, "M", "䄯"), - (0x2F959, "M", "穀"), - (0x2F95A, "M", "穊"), - (0x2F95B, "M", "穏"), - (0x2F95C, "M", "𥥼"), - (0x2F95D, "M", "𥪧"), - (0x2F95F, "X"), - (0x2F960, "M", "䈂"), - (0x2F961, "M", "𥮫"), - (0x2F962, "M", "篆"), - (0x2F963, "M", "築"), - (0x2F964, "M", "䈧"), - (0x2F965, "M", "𥲀"), - (0x2F966, "M", "糒"), - (0x2F967, "M", "䊠"), - (0x2F968, "M", "糨"), - (0x2F969, "M", "糣"), - (0x2F96A, "M", "紀"), - (0x2F96B, "M", "𥾆"), - (0x2F96C, "M", "絣"), - (0x2F96D, "M", "䌁"), - (0x2F96E, "M", "緇"), - (0x2F96F, "M", "縂"), - (0x2F970, "M", "繅"), - (0x2F971, "M", "䌴"), - (0x2F972, "M", "𦈨"), - (0x2F973, "M", "𦉇"), - ] - - -def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F974, "M", "䍙"), - (0x2F975, "M", "𦋙"), - (0x2F976, "M", "罺"), - (0x2F977, "M", "𦌾"), - (0x2F978, "M", "羕"), - (0x2F979, "M", "翺"), - (0x2F97A, "M", "者"), - (0x2F97B, "M", "𦓚"), - (0x2F97C, "M", "𦔣"), - (0x2F97D, "M", "聠"), - (0x2F97E, "M", "𦖨"), - (0x2F97F, "M", "聰"), - (0x2F980, "M", "𣍟"), - (0x2F981, "M", "䏕"), - (0x2F982, "M", "育"), - (0x2F983, "M", "脃"), - (0x2F984, "M", "䐋"), - (0x2F985, "M", "脾"), - (0x2F986, "M", "媵"), - (0x2F987, "M", "𦞧"), - (0x2F988, "M", "𦞵"), - (0x2F989, "M", "𣎓"), - (0x2F98A, "M", "𣎜"), - (0x2F98B, "M", "舁"), - (0x2F98C, "M", "舄"), - (0x2F98D, "M", "辞"), - (0x2F98E, "M", "䑫"), - (0x2F98F, "M", "芑"), - (0x2F990, "M", "芋"), - (0x2F991, "M", "芝"), - (0x2F992, "M", "劳"), - (0x2F993, "M", "花"), - (0x2F994, "M", "芳"), - (0x2F995, "M", "芽"), - (0x2F996, "M", "苦"), - (0x2F997, "M", "𦬼"), - (0x2F998, "M", "若"), - (0x2F999, "M", "茝"), - (0x2F99A, "M", "荣"), - (0x2F99B, "M", "莭"), - (0x2F99C, "M", "茣"), - (0x2F99D, "M", "莽"), - (0x2F99E, "M", "菧"), - (0x2F99F, "M", "著"), - (0x2F9A0, "M", "荓"), - (0x2F9A1, "M", "菊"), - (0x2F9A2, "M", "菌"), - (0x2F9A3, "M", "菜"), - (0x2F9A4, "M", "𦰶"), - (0x2F9A5, "M", "𦵫"), - (0x2F9A6, "M", "𦳕"), - (0x2F9A7, "M", "䔫"), - (0x2F9A8, "M", "蓱"), - (0x2F9A9, "M", "蓳"), - (0x2F9AA, "M", "蔖"), - (0x2F9AB, "M", "𧏊"), - (0x2F9AC, "M", "蕤"), - (0x2F9AD, "M", "𦼬"), - (0x2F9AE, "M", "䕝"), - (0x2F9AF, "M", "䕡"), - (0x2F9B0, "M", "𦾱"), - (0x2F9B1, "M", "𧃒"), - (0x2F9B2, "M", "䕫"), - (0x2F9B3, "M", "虐"), - (0x2F9B4, "M", "虜"), - (0x2F9B5, "M", "虧"), - (0x2F9B6, "M", "虩"), - (0x2F9B7, "M", "蚩"), - (0x2F9B8, "M", "蚈"), - (0x2F9B9, "M", "蜎"), - (0x2F9BA, "M", "蛢"), - (0x2F9BB, "M", "蝹"), - (0x2F9BC, "M", "蜨"), - (0x2F9BD, "M", "蝫"), - (0x2F9BE, "M", "螆"), - (0x2F9BF, "X"), - (0x2F9C0, "M", "蟡"), - (0x2F9C1, "M", "蠁"), - (0x2F9C2, "M", "䗹"), - (0x2F9C3, "M", "衠"), - (0x2F9C4, "M", "衣"), - (0x2F9C5, "M", "𧙧"), - (0x2F9C6, "M", "裗"), - (0x2F9C7, "M", "裞"), - (0x2F9C8, "M", "䘵"), - (0x2F9C9, "M", "裺"), - (0x2F9CA, "M", "㒻"), - (0x2F9CB, "M", "𧢮"), - (0x2F9CC, "M", "𧥦"), - (0x2F9CD, "M", "䚾"), - (0x2F9CE, "M", "䛇"), - (0x2F9CF, "M", "誠"), - (0x2F9D0, "M", "諭"), - (0x2F9D1, "M", "變"), - (0x2F9D2, "M", "豕"), - (0x2F9D3, "M", "𧲨"), - (0x2F9D4, "M", "貫"), - (0x2F9D5, "M", "賁"), - (0x2F9D6, "M", "贛"), - (0x2F9D7, "M", "起"), - ] - - -def _seg_81() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F9D8, "M", "𧼯"), - (0x2F9D9, "M", "𠠄"), - (0x2F9DA, "M", "跋"), - (0x2F9DB, "M", "趼"), - (0x2F9DC, "M", "跰"), - (0x2F9DD, "M", "𠣞"), - (0x2F9DE, "M", "軔"), - (0x2F9DF, "M", "輸"), - (0x2F9E0, "M", "𨗒"), - (0x2F9E1, "M", "𨗭"), - (0x2F9E2, "M", "邔"), - (0x2F9E3, "M", "郱"), - (0x2F9E4, "M", "鄑"), - (0x2F9E5, "M", "𨜮"), - (0x2F9E6, "M", "鄛"), - (0x2F9E7, "M", "鈸"), - (0x2F9E8, "M", "鋗"), - (0x2F9E9, "M", "鋘"), - (0x2F9EA, "M", "鉼"), - (0x2F9EB, "M", "鏹"), - (0x2F9EC, "M", "鐕"), - (0x2F9ED, "M", "𨯺"), - (0x2F9EE, "M", "開"), - (0x2F9EF, "M", "䦕"), - (0x2F9F0, "M", "閷"), - (0x2F9F1, "M", "𨵷"), - (0x2F9F2, "M", "䧦"), - (0x2F9F3, "M", "雃"), - (0x2F9F4, "M", "嶲"), - (0x2F9F5, "M", "霣"), - (0x2F9F6, "M", "𩅅"), - (0x2F9F7, "M", "𩈚"), - (0x2F9F8, "M", "䩮"), - (0x2F9F9, "M", "䩶"), - (0x2F9FA, "M", "韠"), - (0x2F9FB, "M", "𩐊"), - (0x2F9FC, "M", "䪲"), - (0x2F9FD, "M", "𩒖"), - (0x2F9FE, "M", "頋"), - (0x2FA00, "M", "頩"), - (0x2FA01, "M", "𩖶"), - (0x2FA02, "M", "飢"), - (0x2FA03, "M", "䬳"), - (0x2FA04, "M", "餩"), - (0x2FA05, "M", "馧"), - (0x2FA06, "M", "駂"), - (0x2FA07, "M", "駾"), - (0x2FA08, "M", "䯎"), - (0x2FA09, "M", "𩬰"), - (0x2FA0A, "M", "鬒"), - (0x2FA0B, "M", "鱀"), - (0x2FA0C, "M", "鳽"), - (0x2FA0D, "M", "䳎"), - (0x2FA0E, "M", "䳭"), - (0x2FA0F, "M", "鵧"), - (0x2FA10, "M", "𪃎"), - (0x2FA11, "M", "䳸"), - (0x2FA12, "M", "𪄅"), - (0x2FA13, "M", "𪈎"), - (0x2FA14, "M", "𪊑"), - (0x2FA15, "M", "麻"), - (0x2FA16, "M", "䵖"), - (0x2FA17, "M", "黹"), - (0x2FA18, "M", "黾"), - (0x2FA19, "M", "鼅"), - (0x2FA1A, "M", "鼏"), - (0x2FA1B, "M", "鼖"), - (0x2FA1C, "M", "鼻"), - (0x2FA1D, "M", "𪘀"), - (0x2FA1E, "X"), - (0x30000, "V"), - (0x3134B, "X"), - (0x31350, "V"), - (0x323B0, "X"), - (0xE0100, "I"), - (0xE01F0, "X"), - ] - - -uts46data = tuple( - _seg_0() - + _seg_1() - + _seg_2() - + _seg_3() - + _seg_4() - + _seg_5() - + _seg_6() - + _seg_7() - + _seg_8() - + _seg_9() - + _seg_10() - + _seg_11() - + _seg_12() - + _seg_13() - + _seg_14() - + _seg_15() - + _seg_16() - + _seg_17() - + _seg_18() - + _seg_19() - + _seg_20() - + _seg_21() - + _seg_22() - + _seg_23() - + _seg_24() - + _seg_25() - + _seg_26() - + _seg_27() - + _seg_28() - + _seg_29() - + _seg_30() - + _seg_31() - + _seg_32() - + _seg_33() - + _seg_34() - + _seg_35() - + _seg_36() - + _seg_37() - + _seg_38() - + _seg_39() - + _seg_40() - + _seg_41() - + _seg_42() - + _seg_43() - + _seg_44() - + _seg_45() - + _seg_46() - + _seg_47() - + _seg_48() - + _seg_49() - + _seg_50() - + _seg_51() - + _seg_52() - + _seg_53() - + _seg_54() - + _seg_55() - + _seg_56() - + _seg_57() - + _seg_58() - + _seg_59() - + _seg_60() - + _seg_61() - + _seg_62() - + _seg_63() - + _seg_64() - + _seg_65() - + _seg_66() - + _seg_67() - + _seg_68() - + _seg_69() - + _seg_70() - + _seg_71() - + _seg_72() - + _seg_73() - + _seg_74() - + _seg_75() - + _seg_76() - + _seg_77() - + _seg_78() - + _seg_79() - + _seg_80() - + _seg_81() -) # type: Tuple[Union[Tuple[int, str], Tuple[int, str, str]], ...] diff --git a/venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/INSTALLER b/venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/METADATA b/venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/METADATA deleted file mode 100644 index ffef2ff..0000000 --- a/venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/METADATA +++ /dev/null @@ -1,84 +0,0 @@ -Metadata-Version: 2.4 -Name: Jinja2 -Version: 3.1.6 -Summary: A very fast and expressive template engine. -Maintainer-email: Pallets -Requires-Python: >=3.7 -Description-Content-Type: text/markdown -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 -Classifier: Typing :: Typed -License-File: LICENSE.txt -Requires-Dist: MarkupSafe>=2.0 -Requires-Dist: Babel>=2.7 ; extra == "i18n" -Project-URL: Changes, https://jinja.palletsprojects.com/changes/ -Project-URL: Chat, https://discord.gg/pallets -Project-URL: Documentation, https://jinja.palletsprojects.com/ -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Source, https://github.com/pallets/jinja/ -Provides-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. - - -## In A Nutshell - -```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 - -## Contributing - -See our [detailed contributing documentation][contrib] for many ways to -contribute, including reporting issues, requesting features, asking or answering -questions, and making PRs. - -[contrib]: https://palletsprojects.com/contributing/ - diff --git a/venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/RECORD b/venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/RECORD deleted file mode 100644 index b51accc..0000000 --- a/venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/RECORD +++ /dev/null @@ -1,58 +0,0 @@ -jinja2-3.1.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -jinja2-3.1.6.dist-info/METADATA,sha256=aMVUj7Z8QTKhOJjZsx7FDGvqKr3ZFdkh8hQ1XDpkmcg,2871 -jinja2-3.1.6.dist-info/RECORD,, -jinja2-3.1.6.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -jinja2-3.1.6.dist-info/WHEEL,sha256=_2ozNFCLWc93bK4WKHCO-eDUENDlo-dgc9cU3qokYO4,82 -jinja2-3.1.6.dist-info/entry_points.txt,sha256=OL85gYU1eD8cuPlikifFngXpeBjaxl6rIJ8KkC_3r-I,58 -jinja2-3.1.6.dist-info/licenses/LICENSE.txt,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 -jinja2/__init__.py,sha256=xxepO9i7DHsqkQrgBEduLtfoz2QCuT6_gbL4XSN1hbU,1928 -jinja2/__pycache__/__init__.cpython-311.pyc,, -jinja2/__pycache__/_identifier.cpython-311.pyc,, -jinja2/__pycache__/async_utils.cpython-311.pyc,, -jinja2/__pycache__/bccache.cpython-311.pyc,, -jinja2/__pycache__/compiler.cpython-311.pyc,, -jinja2/__pycache__/constants.cpython-311.pyc,, -jinja2/__pycache__/debug.cpython-311.pyc,, -jinja2/__pycache__/defaults.cpython-311.pyc,, -jinja2/__pycache__/environment.cpython-311.pyc,, -jinja2/__pycache__/exceptions.cpython-311.pyc,, -jinja2/__pycache__/ext.cpython-311.pyc,, -jinja2/__pycache__/filters.cpython-311.pyc,, -jinja2/__pycache__/idtracking.cpython-311.pyc,, -jinja2/__pycache__/lexer.cpython-311.pyc,, -jinja2/__pycache__/loaders.cpython-311.pyc,, -jinja2/__pycache__/meta.cpython-311.pyc,, -jinja2/__pycache__/nativetypes.cpython-311.pyc,, -jinja2/__pycache__/nodes.cpython-311.pyc,, -jinja2/__pycache__/optimizer.cpython-311.pyc,, -jinja2/__pycache__/parser.cpython-311.pyc,, -jinja2/__pycache__/runtime.cpython-311.pyc,, -jinja2/__pycache__/sandbox.cpython-311.pyc,, -jinja2/__pycache__/tests.cpython-311.pyc,, -jinja2/__pycache__/utils.cpython-311.pyc,, -jinja2/__pycache__/visitor.cpython-311.pyc,, -jinja2/_identifier.py,sha256=_zYctNKzRqlk_murTNlzrju1FFJL7Va_Ijqqd7ii2lU,1958 -jinja2/async_utils.py,sha256=vK-PdsuorOMnWSnEkT3iUJRIkTnYgO2T6MnGxDgHI5o,2834 -jinja2/bccache.py,sha256=gh0qs9rulnXo0PhX5jTJy2UHzI8wFnQ63o_vw7nhzRg,14061 -jinja2/compiler.py,sha256=9RpCQl5X88BHllJiPsHPh295Hh0uApvwFJNQuutULeM,74131 -jinja2/constants.py,sha256=GMoFydBF_kdpaRKPoM5cl5MviquVRLVyZtfp5-16jg0,1433 -jinja2/debug.py,sha256=CnHqCDHd-BVGvti_8ZsTolnXNhA3ECsY-6n_2pwU8Hw,6297 -jinja2/defaults.py,sha256=boBcSw78h-lp20YbaXSJsqkAI2uN_mD_TtCydpeq5wU,1267 -jinja2/environment.py,sha256=9nhrP7Ch-NbGX00wvyr4yy-uhNHq2OCc60ggGrni_fk,61513 -jinja2/exceptions.py,sha256=ioHeHrWwCWNaXX1inHmHVblvc4haO7AXsjCp3GfWvx0,5071 -jinja2/ext.py,sha256=5PF5eHfh8mXAIxXHHRB2xXbXohi8pE3nHSOxa66uS7E,31875 -jinja2/filters.py,sha256=PQ_Egd9n9jSgtnGQYyF4K5j2nYwhUIulhPnyimkdr-k,55212 -jinja2/idtracking.py,sha256=-ll5lIp73pML3ErUYiIJj7tdmWxcH_IlDv3yA_hiZYo,10555 -jinja2/lexer.py,sha256=LYiYio6br-Tep9nPcupWXsPEtjluw3p1mU-lNBVRUfk,29786 -jinja2/loaders.py,sha256=wIrnxjvcbqh5VwW28NSkfotiDq8qNCxIOSFbGUiSLB4,24055 -jinja2/meta.py,sha256=OTDPkaFvU2Hgvx-6akz7154F8BIWaRmvJcBFvwopHww,4397 -jinja2/nativetypes.py,sha256=7GIGALVJgdyL80oZJdQUaUfwSt5q2lSSZbXt0dNf_M4,4210 -jinja2/nodes.py,sha256=m1Duzcr6qhZI8JQ6VyJgUNinjAf5bQzijSmDnMsvUx8,34579 -jinja2/optimizer.py,sha256=rJnCRlQ7pZsEEmMhsQDgC_pKyDHxP5TPS6zVPGsgcu8,1651 -jinja2/parser.py,sha256=lLOFy3sEmHc5IaEHRiH1sQVnId2moUQzhyeJZTtdY30,40383 -jinja2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -jinja2/runtime.py,sha256=gDk-GvdriJXqgsGbHgrcKTP0Yp6zPXzhzrIpCFH3jAU,34249 -jinja2/sandbox.py,sha256=Mw2aitlY2I8la7FYhcX2YG9BtUYcLnD0Gh3d29cDWrY,15009 -jinja2/tests.py,sha256=VLsBhVFnWg-PxSBz1MhRnNWgP1ovXk3neO1FLQMeC9Q,5926 -jinja2/utils.py,sha256=rRp3o9e7ZKS4fyrWRbELyLcpuGVTFcnooaOa1qx_FIk,24129 -jinja2/visitor.py,sha256=EcnL1PIwf_4RVCOMxsRNuR8AXHbS1qfAdMOE2ngKJz4,3557 diff --git a/venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/REQUESTED b/venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/WHEEL b/venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/WHEEL deleted file mode 100644 index 23d2d7e..0000000 --- a/venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.11.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/entry_points.txt b/venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/entry_points.txt deleted file mode 100644 index abc3eae..0000000 --- a/venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/entry_points.txt +++ /dev/null @@ -1,3 +0,0 @@ -[babel.extractors] -jinja2=jinja2.ext:babel_extract[i18n] - diff --git a/venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt b/venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt deleted file mode 100644 index c37cae4..0000000 --- a/venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt +++ /dev/null @@ -1,28 +0,0 @@ -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/venv/lib/python3.11/site-packages/jinja2/__init__.py b/venv/lib/python3.11/site-packages/jinja2/__init__.py deleted file mode 100644 index 1a423a3..0000000 --- a/venv/lib/python3.11/site-packages/jinja2/__init__.py +++ /dev/null @@ -1,38 +0,0 @@ -"""Jinja is a template engine written in pure Python. It provides a -non-XML syntax that supports inline expressions and an optional -sandboxed environment. -""" - -from .bccache import BytecodeCache as BytecodeCache -from .bccache import FileSystemBytecodeCache as FileSystemBytecodeCache -from .bccache import MemcachedBytecodeCache as MemcachedBytecodeCache -from .environment import Environment as Environment -from .environment import Template as Template -from .exceptions import TemplateAssertionError as TemplateAssertionError -from .exceptions import TemplateError as TemplateError -from .exceptions import TemplateNotFound as TemplateNotFound -from .exceptions import TemplateRuntimeError as TemplateRuntimeError -from .exceptions import TemplatesNotFound as TemplatesNotFound -from .exceptions import TemplateSyntaxError as TemplateSyntaxError -from .exceptions import UndefinedError as UndefinedError -from .loaders import BaseLoader as BaseLoader -from .loaders import ChoiceLoader as ChoiceLoader -from .loaders import DictLoader as DictLoader -from .loaders import FileSystemLoader as FileSystemLoader -from .loaders import FunctionLoader as FunctionLoader -from .loaders import ModuleLoader as ModuleLoader -from .loaders import PackageLoader as PackageLoader -from .loaders import PrefixLoader as PrefixLoader -from .runtime import ChainableUndefined as ChainableUndefined -from .runtime import DebugUndefined as DebugUndefined -from .runtime import make_logging_undefined as make_logging_undefined -from .runtime import StrictUndefined as StrictUndefined -from .runtime import Undefined as Undefined -from .utils import clear_caches as clear_caches -from .utils import is_undefined as is_undefined -from .utils import pass_context as pass_context -from .utils import pass_environment as pass_environment -from .utils import pass_eval_context as pass_eval_context -from .utils import select_autoescape as select_autoescape - -__version__ = "3.1.6" diff --git a/venv/lib/python3.11/site-packages/jinja2/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/jinja2/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 1030a546ede734532e8a2666a2dd7e46c1431702..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2111 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 diff --git a/venv/lib/python3.11/site-packages/jinja2/__pycache__/bccache.cpython-311.pyc b/venv/lib/python3.11/site-packages/jinja2/__pycache__/bccache.cpython-311.pyc deleted file mode 100644 index e6ff8cc992f0cd4cc2cc0ec35f89a10f705bb239..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20909 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 G)cD_foN|c( diff --git a/venv/lib/python3.11/site-packages/jinja2/__pycache__/compiler.cpython-311.pyc b/venv/lib/python3.11/site-packages/jinja2/__pycache__/compiler.cpython-311.pyc deleted file mode 100644 index 555de84bbfb06d3dc2ea02da7ece0b83826b4bbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112431 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 Zx5}QW^U_?CKUzlV?CvkN$i%SP{}1(+m7V|q diff --git a/venv/lib/python3.11/site-packages/jinja2/__pycache__/constants.cpython-311.pyc b/venv/lib/python3.11/site-packages/jinja2/__pycache__/constants.cpython-311.pyc deleted file mode 100644 index 4ba96fd70b5c37c797295e8a929e2395d002e946..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1546 zcmX|>&#E0o5XR5ZC^C>m6t~jbEX*Og6A=Uzgv3ZLBDe{Cdg{!nYfty2|IFn+iTDKK z+qiZoF5LvO%gSHPxjM{LRrgd^ef?E+|91cWu;cmiuYaar-`VZ{w!weT{?2%9F2C%? z-A}u5f3&4M@wnocd9{ z>D9-m#3&xYWVC4u(2GB6>t(Zu)JyHvjegN%ufwRIA2nF6i>eJ{N?NPh6s|dfe9TFL z8@t+9olH_2snE?y6g{z{0pkw0M7AY~5K;gtCF4tI^KO`p!ax9a~!#hRrK zCs;F-?nF3~6a|dUxtIh?|OEb@c9RTc!+mMy-MshBFw86p)>7iR1-P z>O;5SIy#*fDWd{W6K{~EnFH0Fq-?ra(R8VO9BXF_%VCh?RMW^ak#;mjEa;rsOw?%j~1n?%C8#kC<$>a`wHLq9c&%=8RiY z88B=+a|X7la^xpI3C;-~SWqxpeo0$dNt0YG3zYPDMoc5OgU-PqnF z@p=j_kD6UBK@rIpaf>hHQ0x9hM#d5&1F7U07IxUSn!>eP&MdI77!@}lEKs?%3`P_F zz|=)HBadPzci6SnVi&WX|u zMd|)-0HD=mZ-rphPrC74IWLkN{6!jQTUupwRqzq(8x(9BiB;QBb5OFF$~a?;R!20| z2^_}}aO4SGD9sFb;jGc8jgDel?ZQSQb}oY{A~%{+#}2VD0s4z!tTZq+t|Hd=!X4$T zOmoP^koCy#zxTyJjmMG3sh*>>+SqJ3am*^ZUUeiHf!H?vzgRf1eSEj6H} zP`owA-WHDI+T+q2W&7^o{?7+bo<0Bi>5Ff_zxv_niyxmo|LW@Z-D|sV-+Xf*?cwI; z=5UI-&|U|Utp|?EVYzJ-lw#t~FizPY!nV*}<-lmfJV)ea`LC iqkK``C9K`$^#jDKxA*(~t9$Q%_|YG`2bZ_pWBy-^RWnZj diff --git a/venv/lib/python3.11/site-packages/jinja2/__pycache__/debug.cpython-311.pyc b/venv/lib/python3.11/site-packages/jinja2/__pycache__/debug.cpython-311.pyc deleted file mode 100644 index f4a1f2be66e25422baf76ddfc5af2c4572cfae74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6706 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 diff --git a/venv/lib/python3.11/site-packages/jinja2/__pycache__/exceptions.cpython-311.pyc b/venv/lib/python3.11/site-packages/jinja2/__pycache__/exceptions.cpython-311.pyc deleted file mode 100644 index f8eb90ab70e4d0454b2a9c4bcc2ab40ea4d268d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8597 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 QdsQ7A-&xfi5|f+%2KWDUApigX diff --git a/venv/lib/python3.11/site-packages/jinja2/__pycache__/ext.cpython-311.pyc b/venv/lib/python3.11/site-packages/jinja2/__pycache__/ext.cpython-311.pyc deleted file mode 100644 index e0b75ec540bb26e894ae3efcb531b47fd70140a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43373 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�sLQ6`R# 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 diff --git a/venv/lib/python3.11/site-packages/jinja2/__pycache__/idtracking.cpython-311.pyc b/venv/lib/python3.11/site-packages/jinja2/__pycache__/idtracking.cpython-311.pyc deleted file mode 100644 index cfd8d27da92fb8025d301c62d956a051e8fef067..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19501 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 diff --git a/venv/lib/python3.11/site-packages/jinja2/__pycache__/lexer.cpython-311.pyc b/venv/lib/python3.11/site-packages/jinja2/__pycache__/lexer.cpython-311.pyc deleted file mode 100644 index af49765af4e09759eeb376662a8b6d711d4c2377..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35654 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 C92x8Y diff --git a/venv/lib/python3.11/site-packages/jinja2/__pycache__/loaders.cpython-311.pyc b/venv/lib/python3.11/site-packages/jinja2/__pycache__/loaders.cpython-311.pyc deleted file mode 100644 index b2d3be00533c263e87c94ee0782ca95cd1605c46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34387 zcmcJ2d2m#Be&_4^P+vM*7vkvvNgxCQY_I@<42Z*kJvKA;;F*ycbqfS7wfwrpAxn

{_sa)KD$|?vqgs5;z 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 diff --git a/venv/lib/python3.11/site-packages/jinja2/__pycache__/meta.cpython-311.pyc b/venv/lib/python3.11/site-packages/jinja2/__pycache__/meta.cpython-311.pyc deleted file mode 100644 index a21df52e7b7abed3bf1c0d49d5db56e2aaf48189..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5691 zcmcf_U2NON`6y8mEnBt||0Qnu8vtjBog%(d19g5VB zl>cI5-VmVf;0JH$5I?klAKa`%HXs91pbs0+hd%643ItRj5TL_QV8vckqy>UL?YpBy zNsd#Xd)SFQ9(i})eg8lDV<;3v(9ZnxKeI#o5c(H;sWg9i@ZhR|&`qSE7*YhqqX{vO z;#EY=n-*iDfMD#?d})8o&&Pfk2VwyM5zm}d0Y&|=Dxfu_gR!81Jm@@9q#HvJw-Oan*i$UOJa`ob z?|^O)6ca!{Jc;u@e|hthKNrvxa^0xzr-!3jVY&sOl=gHXGXRPm+(K+*P7Vr8j5mGG1?XAd9T zO!FRC(EUNUi7dvNa=Qi3+m#ozT{Gi;L@NT=gHW%*0HxYZA-u%<2kBXfh>ATvb3KYEmWCjCgI)BwCU(JGL9* zaadxS@wmxO!g%ewGsE*T9bQ;i7*1+xM$e{)=Yc)LnmRL_S+Y`w{#^9fv0+oS$WR8D zFV7Nlcuv*luLz((M6>A*edz*bN0 z$f?{5ujQr5f;5?vChw1&_-o(YzICx6_2&5X0Jb4pSgex{<2aWNb3@>L1jeuBrn83L zZ{YiS3GA!8z4duR~|im6Jb*y{jJHdsoF3uOeLI(CEO5 zxPsZ=f)}So4m`1-y&&}o*@*=nue>Yh-*|a zY6rmk7}`9UiZoE>wV5S?ONw)z+5vMZJ!5F5?b8fdfd|MiZ90k@nAMCKSu-hf=C)T> zl!)JvEOVE(5V!p@cVo6MBZGt}*EdEVW^IiNojw8Y%TMnu@)}GSNb}dwfv$d8(bb-N zQqR^zUJ4haa83$;5$@j^Duhpb9)9s&_{Ds9v=AOGAy308-sPK~T0isduQvT#zG6$q z*1>x%;ap32JA3DB;W%8c=la=IY;7;JKJ$6&@V(aIJHCAD$wKSNTQ{1Wb!`;9kRW%$>svgcm{`W(ow1SRh5@ctm1i`F%&N|V)tO7v zPB33k!ER;<)(qnsQE)bclhjBDnesY84Gd+`!Vvap7JPe}L^1vmNysef!N-J=&Zrs$ zK$yX*)o)_mu<$kASkUo8N=>9Vr0VgN<6ygj6_O#k!m#?7>bTB}z2NSB{O1aYC>YGO(J?7}UZwiNhdfVZ>bwu?LUV&JRS~ zIgl>Q!HOu@xJd^3ulI50CJh6=A0NSetJkmN8JXf|AnY4>b+x~`nFp(+sw?rTcZ$0V z835Q3JUWW6_rw1FRet6)%@T)Fc8)G5rwNjAa#9m7fO~PM0$;{m3eQG-^D5*O+@(XDeg-Ve4zTPE zlDE28eekhjqr4cO4}6jHIU?7QMJqQ*1$saCX&O2i;o-$4wA+ zK{;H%XO2mdH;bi4<+f{2!-}`M?kDJ`AfSy`6rntt&_#FrejRjAb=UVm4+32-7G;>9 z*1-|#C}XjKw_RACtJ_lp({f8Rgskq$ZiF7;a9=GZz~P=pIQ)1XL5fz!{fSLs16Mc# z<0DR5E6;#hoCB8uW(i?}nLZ^+sO9toxbJGY$3h05g|Gtgf%^~c=^d|(Wu2Qc^P!q5&MIif@ z0X58P%pE!VR8^G}{vQwV-8?R|0`?YbiraTdELf2f=0QCKoSd<%sPY z2lcRQ-*gsmv&GkeNAwV%n3uIIp%FF?TwvOx5Zh-t%NQ#m7I2?0vVR&Vs}1c?e zn(P3Em{YPjVPG$=(=k}cZu1(XbN`0l8Y+d+zV@3v<{Te)4r~+S+_10 z5B0vkx-Na$a&T+l!-<{Ae9NYWWQol`%oFPdw@?)9yNnh$J=ACULc`Osh?GzfS#bbZ_n`!}XOxcuSSt&3lKJtM(y5OjPF zjtw8(c?#0?5HJL~&Cva}C%4jnxs-1^R%km0xb7P$cK7Gn%h$uNeQaqEwRNq(#(wX< zRvH(8iJYBIebP+_nDG3dE09dsf@LE|H>7e}N+}B|yza0=(?5H2B0m1=#Q5Zesq;0J z4fEr+G+jHQvI=CySj@}~4 zX;58Tx=?m@w)6(iM`Vp_3uXVqIi&;pKj1s*C8vlQqZi?o6$R!A=u2Kf5K118AOg3b zlaSDsL;IcU3k2i3tB87Y^;Z$~^ulD}1e3i8no1j)XBQ=K}} zAspR4u>+b3gFEtF^2zw!IsUS{dlt2{Z=|;_7oHsYDEsG?PcHxMN-i|H7A!V4ZJgRX z@!sfmUm-klXX5VbpZ0w=lxusV(D>$>RPv7qUCse8fCJ_}-S=7dKgK^hR5e%o#~k$f0s) zBw1QIP*d+h8@P?yrmzacfELK64q_DfkPrD#6q{^+0BH+kQNv&e z6(Qa0BBzKPyF%o+68exQs8`yZT(8WvLmz8<|A`c zB-!^BeoiJiGnmim3YGF1Wl_q*w|icqnu17nR?4Y>cyd}km&K~kDMbZZy-3e3&nsWS zVGtx#i?X6&^Y;L0kYLM6Div7ASxL)i(zKGH$~=XZzzKCRM~iAfQFZwAo>L0*c}Z7H z56ogg(M%6j^aZMBaSXe70Kx6p`VA8Uy`@cWY!e|R5RVUCuyydW%7;MtafA9YSK>66 z?3yCFEm%NS;+#}6{|4(%#S$kA&BMIx(z|TF(95NJn_tdRHCGA7P>(z4iO$5lJ}<{C zX;cq2d6l>laq_!NWcOyv*iBm5a|Kp?oO}pXA2+I<>$&Xm5k1yuBzi+=aTRjcO|Nq_ zXYVO8MD&Je6QcLFaN5ztr}<$*-5hYtx?UqwWQknjUn5Ig(kH2K0I#q^6(v!X^xUE% zzO<~*7FAIPX%eStu^{TRikQ!7x>%eRv&F)EF0aTUldqI`dfG2SK@zHH3wd44X~0U$ zsWW+n5$zLmx+XFS!Zu5U6gefHg-&!Srz!ieJ7dF`iV{^|95oA~2UCKvBu&(G3M@4o zuywGkq>2|6k*S9)F6H!D#^0T^yNbM}06gIy$0(#o0eEW#5oy6m4WKr_M=Fj#v_blAxvLm%sKOMKM4Tcy?vC z)t0diDs?np%u0FfSwL)(JutlX7=Tq$?oC2s4d~dN)wFMN!6zY~vD1f<2 zhD-t3P&6(kpI21Vp97K7bVKw)0GKINfPNisTsDR)8^JuM3P+FvBU}{;_ zrAzgX7nMShF0+p$Pa~}JtRl%KPo*UdIe;kBU05G-ERQCk4jdrS9spP+58@;k{iSDp zapTQObhi=RT?q^tfx*?|cLR|c;oRNTNMcR@vdh0V_M_!1%j*+wzqR^SH5^|by*jhT z--+~Z3|-eMks%{81mwQHYNB`TOpOQZfrkWp*Qc)+DuI1QU>~+7@AT~47~AZv^z1cy z_O6|*hNJJ!yfahZP~6B$Z^{4|9x=irYkW=cx)XOIyB>H+D84?lak3m7ssx9O;Ltsv zJLHl6g|6d6XU>0f{#kRUz;O{|r6&4PpT{4&E6+w0>?m0YAR%E{Q3mmO*MQ~cmbeHS~ z8k;9+rEgk(;Nyed9&posxl0Mm1sfxHm5}UH!gF}eth9~kmHp5w`saJefoZQC1lrhN zNE-s$xEuhN9ySw`%&I!P@QO46hCx=u8QXP>OS8G`EEq>sR;bo$f;I8tGT2dFlw=t! zAhRJCE`VD~2Id7!2RBJE5=wFu zt&WBybv1}(WMx_cv!0pGsZu_-qO9!cu%Og7vct#-b##^7jdZUC>9+tk-7_%X`79bH zyWlj~eA0kiBdvx`<~DIE+luT0&&oa8v$lK6BtJ>fuKs$?C}$(=}I{n)irKR;EU)2r~V3>-87c8?j|W0lCb z5g9Lg$E~v#(3zX=X^b{auPr`VG|_fJoSpq200CL#HtiP2yX2Z{$bs`*FAI)nQE;|u ziPk7@t}(LH&b-a(f#z@}PDhEXm!`dP#$nV|5~fIr?;QD++U7AuXbKo6y`~o;Zg%>n z7yVr(t6!pMu&57!=|5eVFKSv2q6j*O6+t@!KQ8GK#QrEZNjDwC9)}R1meC^!o&}(x zI|L7A`>@`|vCro6az-y&W3N2%$fI}AGPW0i?JB8xNUY~t=;xsg<$bjh-ETzqueraB z3~apGbYy$(#QTi+U?o0m#D~kl;V%O{>+7P=+649i5+V%+>P|T`_?;e zZ77wO^*IT+W8M&CnYKRE+T(+RVjYT#&-Q*|KWjX?*nqE5~x5CA7sI#<8IB^LK zCaOHeTb~)qoUFUH)9Q4Q{v$S=K=2#_^o#5iEaQ%rkRo^ze%fBx(bdLZ&E;}?YXpIp zc;Yn|=kD2zeb9qJRnLvlo8t^=f_pqrU3s0+)jXX0&<*aU|C7;A$Bn)JfK-P*%d%HH z@C4j@s@?tXLBNREclKHDBPWa_Qw+W9^Iz?$xuLN}oM5NW=!zJ2#dp0cpm%+tnj79V z;sim#Jy0JLF{|T1v*SR$;{bN-2&_%St;@o%QBb|H)bBgakTLCc5yhi)Ii)x4#WX>Z zH)EC^Ysp%yJTsw+aJjLw7;sgT^hQ*r*Yg?dVy14p>}sjWq>rA4$5wT^mc}dggi`b601Jh&OgxV$M91N~2P1BXvHzMLZs_5aJ+S#* zX4u+%+e4XxL}wsF^u`jtw}+h=3SuC>^}lS=V5#7}y*N@vTn82p(vbq^-(f7Jio`w878O#Tnz7vBRq~bcDL_vHPL4zlD88FZY2&>qusZodu~PdY-TIbCyeM5 z_jp%#_&xyu4ki?S2x)?7KR5>8;U-`VhHfXuZY9Pli9<%>P&rtCFtu-MC3FqR?Y1SZS@RbEs&lRk!9eo`d=?@Y769QCcnn7>@ z0jd^7kJzS=!Md)qX|L>h#F{8}HUL=jhh&`*dEAKXtr6ZAz7v0}8a)FFmq3L}SPBOb z-CwW6xGS5(w+9d38a(_NUl}}V3?7B5O7t0{(~kW;b^LcnC!QvsKRtA8H~)pm0qhXk zu*igM@Fec&Sp*7#HxRT1z8Jkw1b7bGB>=09zv_-;S?H+=VfW#UiT6*`2p~6JzWFLc zK6&%g1%|W(F$7fHO?Qm|@>%S+Jq-EJ(ch0Vt^))s&2d!{FWXO*43wQu zmGqRIPnGN{JD*Oy9xoHebC)E_&ZkO-%Fd?~=j}AZW#V|MWOv#5)I5)KiH+UwKe74p z2d^4Czgr{l{R#J}|FhBGjvEIi*mpZP&JA&JkJt`2_TR(W`^}~oIDt#Ty<;2L2;9Tk k`^~1X$brM$4%WYa4{Pr?n@)0M_{lPf8AL3zhl$<)0RfLu{r~^~ diff --git a/venv/lib/python3.11/site-packages/jinja2/__pycache__/nodes.cpython-311.pyc b/venv/lib/python3.11/site-packages/jinja2/__pycache__/nodes.cpython-311.pyc deleted file mode 100644 index 3b926c3eb5d6d8f9d4023b2c372c07047007b1fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64472 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 diff --git a/venv/lib/python3.11/site-packages/jinja2/__pycache__/parser.cpython-311.pyc b/venv/lib/python3.11/site-packages/jinja2/__pycache__/parser.cpython-311.pyc deleted file mode 100644 index e825058ef24fb8fc367d57f954ed979614c1ffbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60018 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 KTP29C?f*Y@8cIt5 diff --git a/venv/lib/python3.11/site-packages/jinja2/__pycache__/sandbox.cpython-311.pyc b/venv/lib/python3.11/site-packages/jinja2/__pycache__/sandbox.cpython-311.pyc deleted file mode 100644 index 4c09576c82368f20b7a43368cafb522c448e38cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19213 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 G#{U9GJAv~6 diff --git a/venv/lib/python3.11/site-packages/jinja2/__pycache__/utils.cpython-311.pyc b/venv/lib/python3.11/site-packages/jinja2/__pycache__/utils.cpython-311.pyc deleted file mode 100644 index 0127c570df7c46ca80d2f8aea94e9e6c38924a76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37549 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аw#!A6HIDS+8OA7o~^yoOl`ubnfi~ob1Uz78H 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 H#$WvZ%7`6J diff --git a/venv/lib/python3.11/site-packages/jinja2/__pycache__/visitor.cpython-311.pyc b/venv/lib/python3.11/site-packages/jinja2/__pycache__/visitor.cpython-311.pyc deleted file mode 100644 index b0d1848c7a55a9ecb31bcff33a36f116d9c0084a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5690 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 N*ZB6?7G2ED{{!H4oXh|K diff --git a/venv/lib/python3.11/site-packages/jinja2/_identifier.py b/venv/lib/python3.11/site-packages/jinja2/_identifier.py deleted file mode 100644 index 928c150..0000000 --- a/venv/lib/python3.11/site-packages/jinja2/_identifier.py +++ /dev/null @@ -1,6 +0,0 @@ -import re - -# generated by scripts/generate_identifier_pattern.py -pattern = re.compile( - r"[\w·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-ٰٟۖ-ۜ۟-۪ۤۧۨ-ܑۭܰ-݊ަ-ް߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࣓-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣঁ-ঃ়া-ৄেৈো-্ৗৢৣ৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑੰੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍ୖୗୢୣஂா-ூெ-ைொ-்ௗఀ-ఄా-ౄె-ైొ-్ౕౖౢౣಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣංඃ්ා-ුූෘ-ෟෲෳัิ-ฺ็-๎ັິ-ູົຼ່-ໍ༹༘༙༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏႚ-ႝ፝-፟ᜒ-᜔ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝᠋-᠍ᢅᢆᢩᤠ-ᤫᤰ-᤻ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼᪰-᪽ᬀ-ᬄ᬴-᭄᭫-᭳ᮀ-ᮂᮡ-ᮭ᯦-᯳ᰤ-᰷᳐-᳔᳒-᳨᳭ᳲ-᳴᳷-᳹᷀-᷹᷻-᷿‿⁀⁔⃐-⃥⃜⃡-⃰℘℮⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧꢀꢁꢴ-ꣅ꣠-꣱ꣿꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀ꧥꨩ-ꨶꩃꩌꩍꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭ﬞ︀-️︠-︯︳︴﹍-﹏_𐇽𐋠𐍶-𐍺𐨁-𐨃𐨅𐨆𐨌-𐨏𐨸-𐨿𐨺𐫦𐫥𐴤-𐽆𐴧-𐽐𑀀-𑀂𑀸-𑁆𑁿-𑂂𑂰-𑂺𑄀-𑄂𑄧-𑄴𑅅𑅆𑅳𑆀-𑆂𑆳-𑇀𑇉-𑇌𑈬-𑈷𑈾𑋟-𑋪𑌀-𑌃𑌻𑌼𑌾-𑍄𑍇𑍈𑍋-𑍍𑍗𑍢𑍣𑍦-𑍬𑍰-𑍴𑐵-𑑆𑑞𑒰-𑓃𑖯-𑖵𑖸-𑗀𑗜𑗝𑘰-𑙀𑚫-𑚷𑜝-𑜫𑠬-𑠺𑨁-𑨊𑨳-𑨹𑨻-𑨾𑩇𑩑-𑩛𑪊-𑪙𑰯-𑰶𑰸-𑰿𑲒-𑲧𑲩-𑲶𑴱-𑴶𑴺𑴼𑴽𑴿-𑵅𑵇𑶊-𑶎𑶐𑶑𑶓-𑶗𑻳-𑻶𖫰-𖫴𖬰-𖬶𖽑-𖽾𖾏-𖾒𛲝𛲞𝅥-𝅩𝅭-𝅲𝅻-𝆂𝆅-𝆋𝆪-𝆭𝉂-𝉄𝨀-𝨶𝨻-𝩬𝩵𝪄𝪛-𝪟𝪡-𝪯𞀀-𞀆𞀈-𞀘𞀛-𞀡𞀣𞀤𞀦-𞣐𞀪-𞣖𞥄-𞥊󠄀-󠇯]+" # noqa: B950 -) diff --git a/venv/lib/python3.11/site-packages/jinja2/async_utils.py b/venv/lib/python3.11/site-packages/jinja2/async_utils.py deleted file mode 100644 index f0c1402..0000000 --- a/venv/lib/python3.11/site-packages/jinja2/async_utils.py +++ /dev/null @@ -1,99 +0,0 @@ -import inspect -import typing as t -from functools import WRAPPER_ASSIGNMENTS -from functools import wraps - -from .utils import _PassArg -from .utils import pass_eval_context - -if t.TYPE_CHECKING: - import typing_extensions as te - -V = t.TypeVar("V") - - -def async_variant(normal_func): # type: ignore - def decorator(async_func): # type: ignore - pass_arg = _PassArg.from_obj(normal_func) - need_eval_context = pass_arg is None - - if pass_arg is _PassArg.environment: - - def is_async(args: t.Any) -> bool: - return t.cast(bool, args[0].is_async) - - else: - - def is_async(args: t.Any) -> bool: - return t.cast(bool, args[0].environment.is_async) - - # Take the doc and annotations from the sync function, but the - # name from the async function. Pallets-Sphinx-Themes - # build_function_directive expects __wrapped__ to point to the - # sync function. - async_func_attrs = ("__module__", "__name__", "__qualname__") - normal_func_attrs = tuple(set(WRAPPER_ASSIGNMENTS).difference(async_func_attrs)) - - @wraps(normal_func, assigned=normal_func_attrs) - @wraps(async_func, assigned=async_func_attrs, updated=()) - def wrapper(*args, **kwargs): # type: ignore - b = is_async(args) - - if need_eval_context: - args = args[1:] - - if b: - return async_func(*args, **kwargs) - - return normal_func(*args, **kwargs) - - if need_eval_context: - wrapper = pass_eval_context(wrapper) - - wrapper.jinja_async_variant = True # type: ignore[attr-defined] - return wrapper - - return decorator - - -_common_primitives = {int, float, bool, str, list, dict, tuple, type(None)} - - -async def auto_await(value: t.Union[t.Awaitable["V"], "V"]) -> "V": - # Avoid a costly call to isawaitable - if type(value) in _common_primitives: - return t.cast("V", value) - - if inspect.isawaitable(value): - return await t.cast("t.Awaitable[V]", value) - - return value - - -class _IteratorToAsyncIterator(t.Generic[V]): - def __init__(self, iterator: "t.Iterator[V]"): - self._iterator = iterator - - def __aiter__(self) -> "te.Self": - return self - - async def __anext__(self) -> V: - try: - return next(self._iterator) - except StopIteration as e: - raise StopAsyncIteration(e.value) from e - - -def auto_aiter( - iterable: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", -) -> "t.AsyncIterator[V]": - if hasattr(iterable, "__aiter__"): - return iterable.__aiter__() - else: - return _IteratorToAsyncIterator(iter(iterable)) - - -async def auto_to_list( - value: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", -) -> t.List["V"]: - return [x async for x in auto_aiter(value)] diff --git a/venv/lib/python3.11/site-packages/jinja2/bccache.py b/venv/lib/python3.11/site-packages/jinja2/bccache.py deleted file mode 100644 index ada8b09..0000000 --- a/venv/lib/python3.11/site-packages/jinja2/bccache.py +++ /dev/null @@ -1,408 +0,0 @@ -"""The optional bytecode cache system. This is useful if you have very -complex template situations and the compilation of all those templates -slows down your application too much. - -Situations where this is useful are often forking web applications that -are initialized on the first request. -""" - -import errno -import fnmatch -import marshal -import os -import pickle -import stat -import sys -import tempfile -import typing as t -from hashlib import sha1 -from io import BytesIO -from types import CodeType - -if t.TYPE_CHECKING: - import typing_extensions as te - - from .environment import Environment - - class _MemcachedClient(te.Protocol): - def get(self, key: str) -> bytes: ... - - def set( - self, key: str, value: bytes, timeout: t.Optional[int] = None - ) -> None: ... - - -bc_version = 5 -# Magic bytes to identify Jinja bytecode cache files. Contains the -# Python major and minor version to avoid loading incompatible bytecode -# if a project upgrades its Python version. -bc_magic = ( - b"j2" - + pickle.dumps(bc_version, 2) - + pickle.dumps((sys.version_info[0] << 24) | sys.version_info[1], 2) -) - - -class Bucket: - """Buckets are used to store the bytecode for one template. It's created - and initialized by the bytecode cache and passed to the loading functions. - - The buckets get an internal checksum from the cache assigned and use this - to automatically reject outdated cache material. Individual bytecode - cache subclasses don't have to care about cache invalidation. - """ - - def __init__(self, environment: "Environment", key: str, checksum: str) -> None: - self.environment = environment - self.key = key - self.checksum = checksum - self.reset() - - def reset(self) -> None: - """Resets the bucket (unloads the bytecode).""" - self.code: t.Optional[CodeType] = None - - def load_bytecode(self, f: t.BinaryIO) -> None: - """Loads bytecode from a file or file like object.""" - # make sure the magic header is correct - magic = f.read(len(bc_magic)) - if magic != bc_magic: - self.reset() - return - # the source code of the file changed, we need to reload - checksum = pickle.load(f) - if self.checksum != checksum: - self.reset() - return - # if marshal_load fails then we need to reload - try: - self.code = marshal.load(f) - except (EOFError, ValueError, TypeError): - self.reset() - return - - def write_bytecode(self, f: t.IO[bytes]) -> None: - """Dump the bytecode into the file or file like object passed.""" - if self.code is None: - raise TypeError("can't write empty bucket") - f.write(bc_magic) - pickle.dump(self.checksum, f, 2) - marshal.dump(self.code, f) - - def bytecode_from_string(self, string: bytes) -> None: - """Load bytecode from bytes.""" - self.load_bytecode(BytesIO(string)) - - def bytecode_to_string(self) -> bytes: - """Return the bytecode as bytes.""" - out = BytesIO() - self.write_bytecode(out) - return out.getvalue() - - -class BytecodeCache: - """To implement your own bytecode cache you have to subclass this class - and override :meth:`load_bytecode` and :meth:`dump_bytecode`. Both of - these methods are passed a :class:`~jinja2.bccache.Bucket`. - - A very basic bytecode cache that saves the bytecode on the file system:: - - from os import path - - class MyCache(BytecodeCache): - - def __init__(self, directory): - self.directory = directory - - def load_bytecode(self, bucket): - filename = path.join(self.directory, bucket.key) - if path.exists(filename): - with open(filename, 'rb') as f: - bucket.load_bytecode(f) - - def dump_bytecode(self, bucket): - filename = path.join(self.directory, bucket.key) - with open(filename, 'wb') as f: - bucket.write_bytecode(f) - - A more advanced version of a filesystem based bytecode cache is part of - Jinja. - """ - - def load_bytecode(self, bucket: Bucket) -> None: - """Subclasses have to override this method to load bytecode into a - bucket. If they are not able to find code in the cache for the - bucket, it must not do anything. - """ - raise NotImplementedError() - - def dump_bytecode(self, bucket: Bucket) -> None: - """Subclasses have to override this method to write the bytecode - from a bucket back to the cache. If it unable to do so it must not - fail silently but raise an exception. - """ - raise NotImplementedError() - - def clear(self) -> None: - """Clears the cache. This method is not used by Jinja but should be - implemented to allow applications to clear the bytecode cache used - by a particular environment. - """ - - def get_cache_key( - self, name: str, filename: t.Optional[t.Union[str]] = None - ) -> str: - """Returns the unique hash key for this template name.""" - hash = sha1(name.encode("utf-8")) - - if filename is not None: - hash.update(f"|{filename}".encode()) - - return hash.hexdigest() - - def get_source_checksum(self, source: str) -> str: - """Returns a checksum for the source.""" - return sha1(source.encode("utf-8")).hexdigest() - - def get_bucket( - self, - environment: "Environment", - name: str, - filename: t.Optional[str], - source: str, - ) -> Bucket: - """Return a cache bucket for the given template. All arguments are - mandatory but filename may be `None`. - """ - key = self.get_cache_key(name, filename) - checksum = self.get_source_checksum(source) - bucket = Bucket(environment, key, checksum) - self.load_bytecode(bucket) - return bucket - - def set_bucket(self, bucket: Bucket) -> None: - """Put the bucket into the cache.""" - self.dump_bytecode(bucket) - - -class FileSystemBytecodeCache(BytecodeCache): - """A bytecode cache that stores bytecode on the filesystem. It accepts - two arguments: The directory where the cache items are stored and a - pattern string that is used to build the filename. - - If no directory is specified a default cache directory is selected. On - Windows the user's temp directory is used, on UNIX systems a directory - is created for the user in the system temp directory. - - The pattern can be used to have multiple separate caches operate on the - same directory. The default pattern is ``'__jinja2_%s.cache'``. ``%s`` - is replaced with the cache key. - - >>> bcc = FileSystemBytecodeCache('/tmp/jinja_cache', '%s.cache') - - This bytecode cache supports clearing of the cache using the clear method. - """ - - def __init__( - self, directory: t.Optional[str] = None, pattern: str = "__jinja2_%s.cache" - ) -> None: - if directory is None: - directory = self._get_default_cache_dir() - self.directory = directory - self.pattern = pattern - - def _get_default_cache_dir(self) -> str: - def _unsafe_dir() -> "te.NoReturn": - raise RuntimeError( - "Cannot determine safe temp directory. You " - "need to explicitly provide one." - ) - - tmpdir = tempfile.gettempdir() - - # On windows the temporary directory is used specific unless - # explicitly forced otherwise. We can just use that. - if os.name == "nt": - return tmpdir - if not hasattr(os, "getuid"): - _unsafe_dir() - - dirname = f"_jinja2-cache-{os.getuid()}" - actual_dir = os.path.join(tmpdir, dirname) - - try: - os.mkdir(actual_dir, stat.S_IRWXU) - except OSError as e: - if e.errno != errno.EEXIST: - raise - try: - os.chmod(actual_dir, stat.S_IRWXU) - actual_dir_stat = os.lstat(actual_dir) - if ( - actual_dir_stat.st_uid != os.getuid() - or not stat.S_ISDIR(actual_dir_stat.st_mode) - or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU - ): - _unsafe_dir() - except OSError as e: - if e.errno != errno.EEXIST: - raise - - actual_dir_stat = os.lstat(actual_dir) - if ( - actual_dir_stat.st_uid != os.getuid() - or not stat.S_ISDIR(actual_dir_stat.st_mode) - or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU - ): - _unsafe_dir() - - return actual_dir - - def _get_cache_filename(self, bucket: Bucket) -> str: - return os.path.join(self.directory, self.pattern % (bucket.key,)) - - def load_bytecode(self, bucket: Bucket) -> None: - filename = self._get_cache_filename(bucket) - - # Don't test for existence before opening the file, since the - # file could disappear after the test before the open. - try: - f = open(filename, "rb") - except (FileNotFoundError, IsADirectoryError, PermissionError): - # PermissionError can occur on Windows when an operation is - # in progress, such as calling clear(). - return - - with f: - bucket.load_bytecode(f) - - def dump_bytecode(self, bucket: Bucket) -> None: - # Write to a temporary file, then rename to the real name after - # writing. This avoids another process reading the file before - # it is fully written. - name = self._get_cache_filename(bucket) - f = tempfile.NamedTemporaryFile( - mode="wb", - dir=os.path.dirname(name), - prefix=os.path.basename(name), - suffix=".tmp", - delete=False, - ) - - def remove_silent() -> None: - try: - os.remove(f.name) - except OSError: - # Another process may have called clear(). On Windows, - # another program may be holding the file open. - pass - - try: - with f: - bucket.write_bytecode(f) - except BaseException: - remove_silent() - raise - - try: - os.replace(f.name, name) - except OSError: - # Another process may have called clear(). On Windows, - # another program may be holding the file open. - remove_silent() - except BaseException: - remove_silent() - raise - - def clear(self) -> None: - # imported lazily here because google app-engine doesn't support - # write access on the file system and the function does not exist - # normally. - from os import remove - - files = fnmatch.filter(os.listdir(self.directory), self.pattern % ("*",)) - for filename in files: - try: - remove(os.path.join(self.directory, filename)) - except OSError: - pass - - -class MemcachedBytecodeCache(BytecodeCache): - """This class implements a bytecode cache that uses a memcache cache for - storing the information. It does not enforce a specific memcache library - (tummy's memcache or cmemcache) but will accept any class that provides - the minimal interface required. - - Libraries compatible with this class: - - - `cachelib `_ - - `python-memcached `_ - - (Unfortunately the django cache interface is not compatible because it - does not support storing binary data, only text. You can however pass - the underlying cache client to the bytecode cache which is available - as `django.core.cache.cache._client`.) - - The minimal interface for the client passed to the constructor is this: - - .. class:: MinimalClientInterface - - .. method:: set(key, value[, timeout]) - - Stores the bytecode in the cache. `value` is a string and - `timeout` the timeout of the key. If timeout is not provided - a default timeout or no timeout should be assumed, if it's - provided it's an integer with the number of seconds the cache - item should exist. - - .. method:: get(key) - - Returns the value for the cache key. If the item does not - exist in the cache the return value must be `None`. - - The other arguments to the constructor are the prefix for all keys that - is added before the actual cache key and the timeout for the bytecode in - the cache system. We recommend a high (or no) timeout. - - This bytecode cache does not support clearing of used items in the cache. - The clear method is a no-operation function. - - .. versionadded:: 2.7 - Added support for ignoring memcache errors through the - `ignore_memcache_errors` parameter. - """ - - def __init__( - self, - client: "_MemcachedClient", - prefix: str = "jinja2/bytecode/", - timeout: t.Optional[int] = None, - ignore_memcache_errors: bool = True, - ): - self.client = client - self.prefix = prefix - self.timeout = timeout - self.ignore_memcache_errors = ignore_memcache_errors - - def load_bytecode(self, bucket: Bucket) -> None: - try: - code = self.client.get(self.prefix + bucket.key) - except Exception: - if not self.ignore_memcache_errors: - raise - else: - bucket.bytecode_from_string(code) - - def dump_bytecode(self, bucket: Bucket) -> None: - key = self.prefix + bucket.key - value = bucket.bytecode_to_string() - - try: - if self.timeout is not None: - self.client.set(key, value, self.timeout) - else: - self.client.set(key, value) - except Exception: - if not self.ignore_memcache_errors: - raise diff --git a/venv/lib/python3.11/site-packages/jinja2/compiler.py b/venv/lib/python3.11/site-packages/jinja2/compiler.py deleted file mode 100644 index a4ff6a1..0000000 --- a/venv/lib/python3.11/site-packages/jinja2/compiler.py +++ /dev/null @@ -1,1998 +0,0 @@ -"""Compiles nodes from the parser into Python code.""" - -import typing as t -from contextlib import contextmanager -from functools import update_wrapper -from io import StringIO -from itertools import chain -from keyword import iskeyword as is_python_keyword - -from markupsafe import escape -from markupsafe import Markup - -from . import nodes -from .exceptions import TemplateAssertionError -from .idtracking import Symbols -from .idtracking import VAR_LOAD_ALIAS -from .idtracking import VAR_LOAD_PARAMETER -from .idtracking import VAR_LOAD_RESOLVE -from .idtracking import VAR_LOAD_UNDEFINED -from .nodes import EvalContext -from .optimizer import Optimizer -from .utils import _PassArg -from .utils import concat -from .visitor import NodeVisitor - -if t.TYPE_CHECKING: - import typing_extensions as te - - from .environment import Environment - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) - -operators = { - "eq": "==", - "ne": "!=", - "gt": ">", - "gteq": ">=", - "lt": "<", - "lteq": "<=", - "in": "in", - "notin": "not in", -} - - -def optimizeconst(f: F) -> F: - def new_func( - self: "CodeGenerator", node: nodes.Expr, frame: "Frame", **kwargs: t.Any - ) -> t.Any: - # Only optimize if the frame is not volatile - if self.optimizer is not None and not frame.eval_ctx.volatile: - new_node = self.optimizer.visit(node, frame.eval_ctx) - - if new_node != node: - return self.visit(new_node, frame) - - return f(self, node, frame, **kwargs) - - return update_wrapper(new_func, f) # type: ignore[return-value] - - -def _make_binop(op: str) -> t.Callable[["CodeGenerator", nodes.BinExpr, "Frame"], None]: - @optimizeconst - def visitor(self: "CodeGenerator", node: nodes.BinExpr, frame: Frame) -> None: - if ( - self.environment.sandboxed and op in self.environment.intercepted_binops # type: ignore - ): - self.write(f"environment.call_binop(context, {op!r}, ") - self.visit(node.left, frame) - self.write(", ") - self.visit(node.right, frame) - else: - self.write("(") - self.visit(node.left, frame) - self.write(f" {op} ") - self.visit(node.right, frame) - - self.write(")") - - return visitor - - -def _make_unop( - op: str, -) -> t.Callable[["CodeGenerator", nodes.UnaryExpr, "Frame"], None]: - @optimizeconst - def visitor(self: "CodeGenerator", node: nodes.UnaryExpr, frame: Frame) -> None: - if ( - self.environment.sandboxed and op in self.environment.intercepted_unops # type: ignore - ): - self.write(f"environment.call_unop(context, {op!r}, ") - self.visit(node.node, frame) - else: - self.write("(" + op) - self.visit(node.node, frame) - - self.write(")") - - return visitor - - -def generate( - node: nodes.Template, - environment: "Environment", - name: t.Optional[str], - filename: t.Optional[str], - stream: t.Optional[t.TextIO] = None, - defer_init: bool = False, - optimized: bool = True, -) -> t.Optional[str]: - """Generate the python source for a node tree.""" - if not isinstance(node, nodes.Template): - raise TypeError("Can't compile non template nodes") - - generator = environment.code_generator_class( - environment, name, filename, stream, defer_init, optimized - ) - generator.visit(node) - - if stream is None: - return generator.stream.getvalue() # type: ignore - - return None - - -def has_safe_repr(value: t.Any) -> bool: - """Does the node have a safe representation?""" - if value is None or value is NotImplemented or value is Ellipsis: - return True - - if type(value) in {bool, int, float, complex, range, str, Markup}: - return True - - if type(value) in {tuple, list, set, frozenset}: - return all(has_safe_repr(v) for v in value) - - if type(value) is dict: # noqa E721 - return all(has_safe_repr(k) and has_safe_repr(v) for k, v in value.items()) - - return False - - -def find_undeclared( - nodes: t.Iterable[nodes.Node], names: t.Iterable[str] -) -> t.Set[str]: - """Check if the names passed are accessed undeclared. The return value - is a set of all the undeclared names from the sequence of names found. - """ - visitor = UndeclaredNameVisitor(names) - try: - for node in nodes: - visitor.visit(node) - except VisitorExit: - pass - return visitor.undeclared - - -class MacroRef: - def __init__(self, node: t.Union[nodes.Macro, nodes.CallBlock]) -> None: - self.node = node - self.accesses_caller = False - self.accesses_kwargs = False - self.accesses_varargs = False - - -class Frame: - """Holds compile time information for us.""" - - def __init__( - self, - eval_ctx: EvalContext, - parent: t.Optional["Frame"] = None, - level: t.Optional[int] = None, - ) -> None: - self.eval_ctx = eval_ctx - - # the parent of this frame - self.parent = parent - - if parent is None: - self.symbols = Symbols(level=level) - - # in some dynamic inheritance situations the compiler needs to add - # write tests around output statements. - self.require_output_check = False - - # inside some tags we are using a buffer rather than yield statements. - # this for example affects {% filter %} or {% macro %}. If a frame - # is buffered this variable points to the name of the list used as - # buffer. - self.buffer: t.Optional[str] = None - - # the name of the block we're in, otherwise None. - self.block: t.Optional[str] = None - - else: - self.symbols = Symbols(parent.symbols, level=level) - self.require_output_check = parent.require_output_check - self.buffer = parent.buffer - self.block = parent.block - - # a toplevel frame is the root + soft frames such as if conditions. - self.toplevel = False - - # the root frame is basically just the outermost frame, so no if - # conditions. This information is used to optimize inheritance - # situations. - self.rootlevel = False - - # variables set inside of loops and blocks should not affect outer frames, - # but they still needs to be kept track of as part of the active context. - self.loop_frame = False - self.block_frame = False - - # track whether the frame is being used in an if-statement or conditional - # expression as it determines which errors should be raised during runtime - # or compile time. - self.soft_frame = False - - def copy(self) -> "te.Self": - """Create a copy of the current one.""" - rv = object.__new__(self.__class__) - rv.__dict__.update(self.__dict__) - rv.symbols = self.symbols.copy() - return rv - - def inner(self, isolated: bool = False) -> "Frame": - """Return an inner frame.""" - if isolated: - return Frame(self.eval_ctx, level=self.symbols.level + 1) - return Frame(self.eval_ctx, self) - - def soft(self) -> "te.Self": - """Return a soft frame. A soft frame may not be modified as - standalone thing as it shares the resources with the frame it - was created of, but it's not a rootlevel frame any longer. - - This is only used to implement if-statements and conditional - expressions. - """ - rv = self.copy() - rv.rootlevel = False - rv.soft_frame = True - return rv - - __copy__ = copy - - -class VisitorExit(RuntimeError): - """Exception used by the `UndeclaredNameVisitor` to signal a stop.""" - - -class DependencyFinderVisitor(NodeVisitor): - """A visitor that collects filter and test calls.""" - - def __init__(self) -> None: - self.filters: t.Set[str] = set() - self.tests: t.Set[str] = set() - - def visit_Filter(self, node: nodes.Filter) -> None: - self.generic_visit(node) - self.filters.add(node.name) - - def visit_Test(self, node: nodes.Test) -> None: - self.generic_visit(node) - self.tests.add(node.name) - - def visit_Block(self, node: nodes.Block) -> None: - """Stop visiting at blocks.""" - - -class UndeclaredNameVisitor(NodeVisitor): - """A visitor that checks if a name is accessed without being - declared. This is different from the frame visitor as it will - not stop at closure frames. - """ - - def __init__(self, names: t.Iterable[str]) -> None: - self.names = set(names) - self.undeclared: t.Set[str] = set() - - def visit_Name(self, node: nodes.Name) -> None: - if node.ctx == "load" and node.name in self.names: - self.undeclared.add(node.name) - if self.undeclared == self.names: - raise VisitorExit() - else: - self.names.discard(node.name) - - def visit_Block(self, node: nodes.Block) -> None: - """Stop visiting a blocks.""" - - -class CompilerExit(Exception): - """Raised if the compiler encountered a situation where it just - doesn't make sense to further process the code. Any block that - raises such an exception is not further processed. - """ - - -class CodeGenerator(NodeVisitor): - def __init__( - self, - environment: "Environment", - name: t.Optional[str], - filename: t.Optional[str], - stream: t.Optional[t.TextIO] = None, - defer_init: bool = False, - optimized: bool = True, - ) -> None: - if stream is None: - stream = StringIO() - self.environment = environment - self.name = name - self.filename = filename - self.stream = stream - self.created_block_context = False - self.defer_init = defer_init - self.optimizer: t.Optional[Optimizer] = None - - if optimized: - self.optimizer = Optimizer(environment) - - # aliases for imports - self.import_aliases: t.Dict[str, str] = {} - - # a registry for all blocks. Because blocks are moved out - # into the global python scope they are registered here - self.blocks: t.Dict[str, nodes.Block] = {} - - # the number of extends statements so far - self.extends_so_far = 0 - - # some templates have a rootlevel extends. In this case we - # can safely assume that we're a child template and do some - # more optimizations. - self.has_known_extends = False - - # the current line number - self.code_lineno = 1 - - # registry of all filters and tests (global, not block local) - self.tests: t.Dict[str, str] = {} - self.filters: t.Dict[str, str] = {} - - # the debug information - self.debug_info: t.List[t.Tuple[int, int]] = [] - self._write_debug_info: t.Optional[int] = None - - # the number of new lines before the next write() - self._new_lines = 0 - - # the line number of the last written statement - self._last_line = 0 - - # true if nothing was written so far. - self._first_write = True - - # used by the `temporary_identifier` method to get new - # unique, temporary identifier - self._last_identifier = 0 - - # the current indentation - self._indentation = 0 - - # Tracks toplevel assignments - self._assign_stack: t.List[t.Set[str]] = [] - - # Tracks parameter definition blocks - self._param_def_block: t.List[t.Set[str]] = [] - - # Tracks the current context. - self._context_reference_stack = ["context"] - - @property - def optimized(self) -> bool: - return self.optimizer is not None - - # -- Various compilation helpers - - def fail(self, msg: str, lineno: int) -> "te.NoReturn": - """Fail with a :exc:`TemplateAssertionError`.""" - raise TemplateAssertionError(msg, lineno, self.name, self.filename) - - def temporary_identifier(self) -> str: - """Get a new unique identifier.""" - self._last_identifier += 1 - return f"t_{self._last_identifier}" - - def buffer(self, frame: Frame) -> None: - """Enable buffering for the frame from that point onwards.""" - frame.buffer = self.temporary_identifier() - self.writeline(f"{frame.buffer} = []") - - def return_buffer_contents( - self, frame: Frame, force_unescaped: bool = False - ) -> None: - """Return the buffer contents of the frame.""" - if not force_unescaped: - if frame.eval_ctx.volatile: - self.writeline("if context.eval_ctx.autoescape:") - self.indent() - self.writeline(f"return Markup(concat({frame.buffer}))") - self.outdent() - self.writeline("else:") - self.indent() - self.writeline(f"return concat({frame.buffer})") - self.outdent() - return - elif frame.eval_ctx.autoescape: - self.writeline(f"return Markup(concat({frame.buffer}))") - return - self.writeline(f"return concat({frame.buffer})") - - def indent(self) -> None: - """Indent by one.""" - self._indentation += 1 - - def outdent(self, step: int = 1) -> None: - """Outdent by step.""" - self._indentation -= step - - def start_write(self, frame: Frame, node: t.Optional[nodes.Node] = None) -> None: - """Yield or write into the frame buffer.""" - if frame.buffer is None: - self.writeline("yield ", node) - else: - self.writeline(f"{frame.buffer}.append(", node) - - def end_write(self, frame: Frame) -> None: - """End the writing process started by `start_write`.""" - if frame.buffer is not None: - self.write(")") - - def simple_write( - self, s: str, frame: Frame, node: t.Optional[nodes.Node] = None - ) -> None: - """Simple shortcut for start_write + write + end_write.""" - self.start_write(frame, node) - self.write(s) - self.end_write(frame) - - def blockvisit(self, nodes: t.Iterable[nodes.Node], frame: Frame) -> None: - """Visit a list of nodes as block in a frame. If the current frame - is no buffer a dummy ``if 0: yield None`` is written automatically. - """ - try: - self.writeline("pass") - for node in nodes: - self.visit(node, frame) - except CompilerExit: - pass - - def write(self, x: str) -> None: - """Write a string into the output stream.""" - if self._new_lines: - if not self._first_write: - self.stream.write("\n" * self._new_lines) - self.code_lineno += self._new_lines - if self._write_debug_info is not None: - self.debug_info.append((self._write_debug_info, self.code_lineno)) - self._write_debug_info = None - self._first_write = False - self.stream.write(" " * self._indentation) - self._new_lines = 0 - self.stream.write(x) - - def writeline( - self, x: str, node: t.Optional[nodes.Node] = None, extra: int = 0 - ) -> None: - """Combination of newline and write.""" - self.newline(node, extra) - self.write(x) - - def newline(self, node: t.Optional[nodes.Node] = None, extra: int = 0) -> None: - """Add one or more newlines before the next write.""" - self._new_lines = max(self._new_lines, 1 + extra) - if node is not None and node.lineno != self._last_line: - self._write_debug_info = node.lineno - self._last_line = node.lineno - - def signature( - self, - node: t.Union[nodes.Call, nodes.Filter, nodes.Test], - frame: Frame, - extra_kwargs: t.Optional[t.Mapping[str, t.Any]] = None, - ) -> None: - """Writes a function call to the stream for the current node. - A leading comma is added automatically. The extra keyword - arguments may not include python keywords otherwise a syntax - error could occur. The extra keyword arguments should be given - as python dict. - """ - # if any of the given keyword arguments is a python keyword - # we have to make sure that no invalid call is created. - kwarg_workaround = any( - is_python_keyword(t.cast(str, k)) - for k in chain((x.key for x in node.kwargs), extra_kwargs or ()) - ) - - for arg in node.args: - self.write(", ") - self.visit(arg, frame) - - if not kwarg_workaround: - for kwarg in node.kwargs: - self.write(", ") - self.visit(kwarg, frame) - if extra_kwargs is not None: - for key, value in extra_kwargs.items(): - self.write(f", {key}={value}") - if node.dyn_args: - self.write(", *") - self.visit(node.dyn_args, frame) - - if kwarg_workaround: - if node.dyn_kwargs is not None: - self.write(", **dict({") - else: - self.write(", **{") - for kwarg in node.kwargs: - self.write(f"{kwarg.key!r}: ") - self.visit(kwarg.value, frame) - self.write(", ") - if extra_kwargs is not None: - for key, value in extra_kwargs.items(): - self.write(f"{key!r}: {value}, ") - if node.dyn_kwargs is not None: - self.write("}, **") - self.visit(node.dyn_kwargs, frame) - self.write(")") - else: - self.write("}") - - elif node.dyn_kwargs is not None: - self.write(", **") - self.visit(node.dyn_kwargs, frame) - - def pull_dependencies(self, nodes: t.Iterable[nodes.Node]) -> None: - """Find all filter and test names used in the template and - assign them to variables in the compiled namespace. Checking - that the names are registered with the environment is done when - compiling the Filter and Test nodes. If the node is in an If or - CondExpr node, the check is done at runtime instead. - - .. versionchanged:: 3.0 - Filters and tests in If and CondExpr nodes are checked at - runtime instead of compile time. - """ - visitor = DependencyFinderVisitor() - - for node in nodes: - visitor.visit(node) - - for id_map, names, dependency in ( - (self.filters, visitor.filters, "filters"), - ( - self.tests, - visitor.tests, - "tests", - ), - ): - for name in sorted(names): - if name not in id_map: - id_map[name] = self.temporary_identifier() - - # add check during runtime that dependencies used inside of executed - # blocks are defined, as this step may be skipped during compile time - self.writeline("try:") - self.indent() - self.writeline(f"{id_map[name]} = environment.{dependency}[{name!r}]") - self.outdent() - self.writeline("except KeyError:") - self.indent() - self.writeline("@internalcode") - self.writeline(f"def {id_map[name]}(*unused):") - self.indent() - self.writeline( - f'raise TemplateRuntimeError("No {dependency[:-1]}' - f' named {name!r} found.")' - ) - self.outdent() - self.outdent() - - def enter_frame(self, frame: Frame) -> None: - undefs = [] - for target, (action, param) in frame.symbols.loads.items(): - if action == VAR_LOAD_PARAMETER: - pass - elif action == VAR_LOAD_RESOLVE: - self.writeline(f"{target} = {self.get_resolve_func()}({param!r})") - elif action == VAR_LOAD_ALIAS: - self.writeline(f"{target} = {param}") - elif action == VAR_LOAD_UNDEFINED: - undefs.append(target) - else: - raise NotImplementedError("unknown load instruction") - if undefs: - self.writeline(f"{' = '.join(undefs)} = missing") - - def leave_frame(self, frame: Frame, with_python_scope: bool = False) -> None: - if not with_python_scope: - undefs = [] - for target in frame.symbols.loads: - undefs.append(target) - if undefs: - self.writeline(f"{' = '.join(undefs)} = missing") - - def choose_async(self, async_value: str = "async ", sync_value: str = "") -> str: - return async_value if self.environment.is_async else sync_value - - def func(self, name: str) -> str: - return f"{self.choose_async()}def {name}" - - def macro_body( - self, node: t.Union[nodes.Macro, nodes.CallBlock], frame: Frame - ) -> t.Tuple[Frame, MacroRef]: - """Dump the function def of a macro or call block.""" - frame = frame.inner() - frame.symbols.analyze_node(node) - macro_ref = MacroRef(node) - - explicit_caller = None - skip_special_params = set() - args = [] - - for idx, arg in enumerate(node.args): - if arg.name == "caller": - explicit_caller = idx - if arg.name in ("kwargs", "varargs"): - skip_special_params.add(arg.name) - args.append(frame.symbols.ref(arg.name)) - - undeclared = find_undeclared(node.body, ("caller", "kwargs", "varargs")) - - if "caller" in undeclared: - # In older Jinja versions there was a bug that allowed caller - # to retain the special behavior even if it was mentioned in - # the argument list. However thankfully this was only really - # working if it was the last argument. So we are explicitly - # checking this now and error out if it is anywhere else in - # the argument list. - if explicit_caller is not None: - try: - node.defaults[explicit_caller - len(node.args)] - except IndexError: - self.fail( - "When defining macros or call blocks the " - 'special "caller" argument must be omitted ' - "or be given a default.", - node.lineno, - ) - else: - args.append(frame.symbols.declare_parameter("caller")) - macro_ref.accesses_caller = True - if "kwargs" in undeclared and "kwargs" not in skip_special_params: - args.append(frame.symbols.declare_parameter("kwargs")) - macro_ref.accesses_kwargs = True - if "varargs" in undeclared and "varargs" not in skip_special_params: - args.append(frame.symbols.declare_parameter("varargs")) - macro_ref.accesses_varargs = True - - # macros are delayed, they never require output checks - frame.require_output_check = False - frame.symbols.analyze_node(node) - self.writeline(f"{self.func('macro')}({', '.join(args)}):", node) - self.indent() - - self.buffer(frame) - self.enter_frame(frame) - - self.push_parameter_definitions(frame) - for idx, arg in enumerate(node.args): - ref = frame.symbols.ref(arg.name) - self.writeline(f"if {ref} is missing:") - self.indent() - try: - default = node.defaults[idx - len(node.args)] - except IndexError: - self.writeline( - f'{ref} = undefined("parameter {arg.name!r} was not provided",' - f" name={arg.name!r})" - ) - else: - self.writeline(f"{ref} = ") - self.visit(default, frame) - self.mark_parameter_stored(ref) - self.outdent() - self.pop_parameter_definitions() - - self.blockvisit(node.body, frame) - self.return_buffer_contents(frame, force_unescaped=True) - self.leave_frame(frame, with_python_scope=True) - self.outdent() - - return frame, macro_ref - - def macro_def(self, macro_ref: MacroRef, frame: Frame) -> None: - """Dump the macro definition for the def created by macro_body.""" - arg_tuple = ", ".join(repr(x.name) for x in macro_ref.node.args) - name = getattr(macro_ref.node, "name", None) - if len(macro_ref.node.args) == 1: - arg_tuple += "," - self.write( - f"Macro(environment, macro, {name!r}, ({arg_tuple})," - f" {macro_ref.accesses_kwargs!r}, {macro_ref.accesses_varargs!r}," - f" {macro_ref.accesses_caller!r}, context.eval_ctx.autoescape)" - ) - - def position(self, node: nodes.Node) -> str: - """Return a human readable position for the node.""" - rv = f"line {node.lineno}" - if self.name is not None: - rv = f"{rv} in {self.name!r}" - return rv - - def dump_local_context(self, frame: Frame) -> str: - items_kv = ", ".join( - f"{name!r}: {target}" - for name, target in frame.symbols.dump_stores().items() - ) - return f"{{{items_kv}}}" - - def write_commons(self) -> None: - """Writes a common preamble that is used by root and block functions. - Primarily this sets up common local helpers and enforces a generator - through a dead branch. - """ - self.writeline("resolve = context.resolve_or_missing") - self.writeline("undefined = environment.undefined") - self.writeline("concat = environment.concat") - # always use the standard Undefined class for the implicit else of - # conditional expressions - self.writeline("cond_expr_undefined = Undefined") - self.writeline("if 0: yield None") - - def push_parameter_definitions(self, frame: Frame) -> None: - """Pushes all parameter targets from the given frame into a local - stack that permits tracking of yet to be assigned parameters. In - particular this enables the optimization from `visit_Name` to skip - undefined expressions for parameters in macros as macros can reference - otherwise unbound parameters. - """ - self._param_def_block.append(frame.symbols.dump_param_targets()) - - def pop_parameter_definitions(self) -> None: - """Pops the current parameter definitions set.""" - self._param_def_block.pop() - - def mark_parameter_stored(self, target: str) -> None: - """Marks a parameter in the current parameter definitions as stored. - This will skip the enforced undefined checks. - """ - if self._param_def_block: - self._param_def_block[-1].discard(target) - - def push_context_reference(self, target: str) -> None: - self._context_reference_stack.append(target) - - def pop_context_reference(self) -> None: - self._context_reference_stack.pop() - - def get_context_ref(self) -> str: - return self._context_reference_stack[-1] - - def get_resolve_func(self) -> str: - target = self._context_reference_stack[-1] - if target == "context": - return "resolve" - return f"{target}.resolve" - - def derive_context(self, frame: Frame) -> str: - return f"{self.get_context_ref()}.derived({self.dump_local_context(frame)})" - - def parameter_is_undeclared(self, target: str) -> bool: - """Checks if a given target is an undeclared parameter.""" - if not self._param_def_block: - return False - return target in self._param_def_block[-1] - - def push_assign_tracking(self) -> None: - """Pushes a new layer for assignment tracking.""" - self._assign_stack.append(set()) - - def pop_assign_tracking(self, frame: Frame) -> None: - """Pops the topmost level for assignment tracking and updates the - context variables if necessary. - """ - vars = self._assign_stack.pop() - if ( - not frame.block_frame - and not frame.loop_frame - and not frame.toplevel - or not vars - ): - return - public_names = [x for x in vars if x[:1] != "_"] - if len(vars) == 1: - name = next(iter(vars)) - ref = frame.symbols.ref(name) - if frame.loop_frame: - self.writeline(f"_loop_vars[{name!r}] = {ref}") - return - if frame.block_frame: - self.writeline(f"_block_vars[{name!r}] = {ref}") - return - self.writeline(f"context.vars[{name!r}] = {ref}") - else: - if frame.loop_frame: - self.writeline("_loop_vars.update({") - elif frame.block_frame: - self.writeline("_block_vars.update({") - else: - self.writeline("context.vars.update({") - for idx, name in enumerate(sorted(vars)): - if idx: - self.write(", ") - ref = frame.symbols.ref(name) - self.write(f"{name!r}: {ref}") - self.write("})") - if not frame.block_frame and not frame.loop_frame and public_names: - if len(public_names) == 1: - self.writeline(f"context.exported_vars.add({public_names[0]!r})") - else: - names_str = ", ".join(map(repr, sorted(public_names))) - self.writeline(f"context.exported_vars.update(({names_str}))") - - # -- Statement Visitors - - def visit_Template( - self, node: nodes.Template, frame: t.Optional[Frame] = None - ) -> None: - assert frame is None, "no root frame allowed" - eval_ctx = EvalContext(self.environment, self.name) - - from .runtime import async_exported - from .runtime import exported - - if self.environment.is_async: - exported_names = sorted(exported + async_exported) - else: - exported_names = sorted(exported) - - self.writeline("from jinja2.runtime import " + ", ".join(exported_names)) - - # if we want a deferred initialization we cannot move the - # environment into a local name - envenv = "" if self.defer_init else ", environment=environment" - - # do we have an extends tag at all? If not, we can save some - # overhead by just not processing any inheritance code. - have_extends = node.find(nodes.Extends) is not None - - # find all blocks - for block in node.find_all(nodes.Block): - if block.name in self.blocks: - self.fail(f"block {block.name!r} defined twice", block.lineno) - self.blocks[block.name] = block - - # find all imports and import them - for import_ in node.find_all(nodes.ImportedName): - if import_.importname not in self.import_aliases: - imp = import_.importname - self.import_aliases[imp] = alias = self.temporary_identifier() - if "." in imp: - module, obj = imp.rsplit(".", 1) - self.writeline(f"from {module} import {obj} as {alias}") - else: - self.writeline(f"import {imp} as {alias}") - - # add the load name - self.writeline(f"name = {self.name!r}") - - # generate the root render function. - self.writeline( - f"{self.func('root')}(context, missing=missing{envenv}):", extra=1 - ) - self.indent() - self.write_commons() - - # process the root - frame = Frame(eval_ctx) - if "self" in find_undeclared(node.body, ("self",)): - ref = frame.symbols.declare_parameter("self") - self.writeline(f"{ref} = TemplateReference(context)") - frame.symbols.analyze_node(node) - frame.toplevel = frame.rootlevel = True - frame.require_output_check = have_extends and not self.has_known_extends - if have_extends: - self.writeline("parent_template = None") - self.enter_frame(frame) - self.pull_dependencies(node.body) - self.blockvisit(node.body, frame) - self.leave_frame(frame, with_python_scope=True) - self.outdent() - - # make sure that the parent root is called. - if have_extends: - if not self.has_known_extends: - self.indent() - self.writeline("if parent_template is not None:") - self.indent() - if not self.environment.is_async: - self.writeline("yield from parent_template.root_render_func(context)") - else: - self.writeline("agen = parent_template.root_render_func(context)") - self.writeline("try:") - self.indent() - self.writeline("async for event in agen:") - self.indent() - self.writeline("yield event") - self.outdent() - self.outdent() - self.writeline("finally: await agen.aclose()") - self.outdent(1 + (not self.has_known_extends)) - - # at this point we now have the blocks collected and can visit them too. - for name, block in self.blocks.items(): - self.writeline( - f"{self.func('block_' + name)}(context, missing=missing{envenv}):", - block, - 1, - ) - self.indent() - self.write_commons() - # It's important that we do not make this frame a child of the - # toplevel template. This would cause a variety of - # interesting issues with identifier tracking. - block_frame = Frame(eval_ctx) - block_frame.block_frame = True - undeclared = find_undeclared(block.body, ("self", "super")) - if "self" in undeclared: - ref = block_frame.symbols.declare_parameter("self") - self.writeline(f"{ref} = TemplateReference(context)") - if "super" in undeclared: - ref = block_frame.symbols.declare_parameter("super") - self.writeline(f"{ref} = context.super({name!r}, block_{name})") - block_frame.symbols.analyze_node(block) - block_frame.block = name - self.writeline("_block_vars = {}") - self.enter_frame(block_frame) - self.pull_dependencies(block.body) - self.blockvisit(block.body, block_frame) - self.leave_frame(block_frame, with_python_scope=True) - self.outdent() - - blocks_kv_str = ", ".join(f"{x!r}: block_{x}" for x in self.blocks) - self.writeline(f"blocks = {{{blocks_kv_str}}}", extra=1) - debug_kv_str = "&".join(f"{k}={v}" for k, v in self.debug_info) - self.writeline(f"debug_info = {debug_kv_str!r}") - - def visit_Block(self, node: nodes.Block, frame: Frame) -> None: - """Call a block and register it for the template.""" - level = 0 - if frame.toplevel: - # if we know that we are a child template, there is no need to - # check if we are one - if self.has_known_extends: - return - if self.extends_so_far > 0: - self.writeline("if parent_template is None:") - self.indent() - level += 1 - - if node.scoped: - context = self.derive_context(frame) - else: - context = self.get_context_ref() - - if node.required: - self.writeline(f"if len(context.blocks[{node.name!r}]) <= 1:", node) - self.indent() - self.writeline( - f'raise TemplateRuntimeError("Required block {node.name!r} not found")', - node, - ) - self.outdent() - - if not self.environment.is_async and frame.buffer is None: - self.writeline( - f"yield from context.blocks[{node.name!r}][0]({context})", node - ) - else: - self.writeline(f"gen = context.blocks[{node.name!r}][0]({context})") - self.writeline("try:") - self.indent() - self.writeline( - f"{self.choose_async()}for event in gen:", - node, - ) - self.indent() - self.simple_write("event", frame) - self.outdent() - self.outdent() - self.writeline( - f"finally: {self.choose_async('await gen.aclose()', 'gen.close()')}" - ) - - self.outdent(level) - - def visit_Extends(self, node: nodes.Extends, frame: Frame) -> None: - """Calls the extender.""" - if not frame.toplevel: - self.fail("cannot use extend from a non top-level scope", node.lineno) - - # if the number of extends statements in general is zero so - # far, we don't have to add a check if something extended - # the template before this one. - if self.extends_so_far > 0: - # if we have a known extends we just add a template runtime - # error into the generated code. We could catch that at compile - # time too, but i welcome it not to confuse users by throwing the - # same error at different times just "because we can". - if not self.has_known_extends: - self.writeline("if parent_template is not None:") - self.indent() - self.writeline('raise TemplateRuntimeError("extended multiple times")') - - # if we have a known extends already we don't need that code here - # as we know that the template execution will end here. - if self.has_known_extends: - raise CompilerExit() - else: - self.outdent() - - self.writeline("parent_template = environment.get_template(", node) - self.visit(node.template, frame) - self.write(f", {self.name!r})") - self.writeline("for name, parent_block in parent_template.blocks.items():") - self.indent() - self.writeline("context.blocks.setdefault(name, []).append(parent_block)") - self.outdent() - - # if this extends statement was in the root level we can take - # advantage of that information and simplify the generated code - # in the top level from this point onwards - if frame.rootlevel: - self.has_known_extends = True - - # and now we have one more - self.extends_so_far += 1 - - def visit_Include(self, node: nodes.Include, frame: Frame) -> None: - """Handles includes.""" - if node.ignore_missing: - self.writeline("try:") - self.indent() - - func_name = "get_or_select_template" - if isinstance(node.template, nodes.Const): - if isinstance(node.template.value, str): - func_name = "get_template" - elif isinstance(node.template.value, (tuple, list)): - func_name = "select_template" - elif isinstance(node.template, (nodes.Tuple, nodes.List)): - func_name = "select_template" - - self.writeline(f"template = environment.{func_name}(", node) - self.visit(node.template, frame) - self.write(f", {self.name!r})") - if node.ignore_missing: - self.outdent() - self.writeline("except TemplateNotFound:") - self.indent() - self.writeline("pass") - self.outdent() - self.writeline("else:") - self.indent() - - def loop_body() -> None: - self.indent() - self.simple_write("event", frame) - self.outdent() - - if node.with_context: - self.writeline( - f"gen = template.root_render_func(" - "template.new_context(context.get_all(), True," - f" {self.dump_local_context(frame)}))" - ) - self.writeline("try:") - self.indent() - self.writeline(f"{self.choose_async()}for event in gen:") - loop_body() - self.outdent() - self.writeline( - f"finally: {self.choose_async('await gen.aclose()', 'gen.close()')}" - ) - elif self.environment.is_async: - self.writeline( - "for event in (await template._get_default_module_async())" - "._body_stream:" - ) - loop_body() - else: - self.writeline("yield from template._get_default_module()._body_stream") - - if node.ignore_missing: - self.outdent() - - def _import_common( - self, node: t.Union[nodes.Import, nodes.FromImport], frame: Frame - ) -> None: - self.write(f"{self.choose_async('await ')}environment.get_template(") - self.visit(node.template, frame) - self.write(f", {self.name!r}).") - - if node.with_context: - f_name = f"make_module{self.choose_async('_async')}" - self.write( - f"{f_name}(context.get_all(), True, {self.dump_local_context(frame)})" - ) - else: - self.write(f"_get_default_module{self.choose_async('_async')}(context)") - - def visit_Import(self, node: nodes.Import, frame: Frame) -> None: - """Visit regular imports.""" - self.writeline(f"{frame.symbols.ref(node.target)} = ", node) - if frame.toplevel: - self.write(f"context.vars[{node.target!r}] = ") - - self._import_common(node, frame) - - if frame.toplevel and not node.target.startswith("_"): - self.writeline(f"context.exported_vars.discard({node.target!r})") - - def visit_FromImport(self, node: nodes.FromImport, frame: Frame) -> None: - """Visit named imports.""" - self.newline(node) - self.write("included_template = ") - self._import_common(node, frame) - var_names = [] - discarded_names = [] - for name in node.names: - if isinstance(name, tuple): - name, alias = name - else: - alias = name - self.writeline( - f"{frame.symbols.ref(alias)} =" - f" getattr(included_template, {name!r}, missing)" - ) - self.writeline(f"if {frame.symbols.ref(alias)} is missing:") - self.indent() - # The position will contain the template name, and will be formatted - # into a string that will be compiled into an f-string. Curly braces - # in the name must be replaced with escapes so that they will not be - # executed as part of the f-string. - position = self.position(node).replace("{", "{{").replace("}", "}}") - message = ( - "the template {included_template.__name__!r}" - f" (imported on {position})" - f" does not export the requested name {name!r}" - ) - self.writeline( - f"{frame.symbols.ref(alias)} = undefined(f{message!r}, name={name!r})" - ) - self.outdent() - if frame.toplevel: - var_names.append(alias) - if not alias.startswith("_"): - discarded_names.append(alias) - - if var_names: - if len(var_names) == 1: - name = var_names[0] - self.writeline(f"context.vars[{name!r}] = {frame.symbols.ref(name)}") - else: - names_kv = ", ".join( - f"{name!r}: {frame.symbols.ref(name)}" for name in var_names - ) - self.writeline(f"context.vars.update({{{names_kv}}})") - if discarded_names: - if len(discarded_names) == 1: - self.writeline(f"context.exported_vars.discard({discarded_names[0]!r})") - else: - names_str = ", ".join(map(repr, discarded_names)) - self.writeline( - f"context.exported_vars.difference_update(({names_str}))" - ) - - def visit_For(self, node: nodes.For, frame: Frame) -> None: - loop_frame = frame.inner() - loop_frame.loop_frame = True - test_frame = frame.inner() - else_frame = frame.inner() - - # try to figure out if we have an extended loop. An extended loop - # is necessary if the loop is in recursive mode if the special loop - # variable is accessed in the body if the body is a scoped block. - extended_loop = ( - node.recursive - or "loop" - in find_undeclared(node.iter_child_nodes(only=("body",)), ("loop",)) - or any(block.scoped for block in node.find_all(nodes.Block)) - ) - - loop_ref = None - if extended_loop: - loop_ref = loop_frame.symbols.declare_parameter("loop") - - loop_frame.symbols.analyze_node(node, for_branch="body") - if node.else_: - else_frame.symbols.analyze_node(node, for_branch="else") - - if node.test: - loop_filter_func = self.temporary_identifier() - test_frame.symbols.analyze_node(node, for_branch="test") - self.writeline(f"{self.func(loop_filter_func)}(fiter):", node.test) - self.indent() - self.enter_frame(test_frame) - self.writeline(self.choose_async("async for ", "for ")) - self.visit(node.target, loop_frame) - self.write(" in ") - self.write(self.choose_async("auto_aiter(fiter)", "fiter")) - self.write(":") - self.indent() - self.writeline("if ", node.test) - self.visit(node.test, test_frame) - self.write(":") - self.indent() - self.writeline("yield ") - self.visit(node.target, loop_frame) - self.outdent(3) - self.leave_frame(test_frame, with_python_scope=True) - - # if we don't have an recursive loop we have to find the shadowed - # variables at that point. Because loops can be nested but the loop - # variable is a special one we have to enforce aliasing for it. - if node.recursive: - self.writeline( - f"{self.func('loop')}(reciter, loop_render_func, depth=0):", node - ) - self.indent() - self.buffer(loop_frame) - - # Use the same buffer for the else frame - else_frame.buffer = loop_frame.buffer - - # make sure the loop variable is a special one and raise a template - # assertion error if a loop tries to write to loop - if extended_loop: - self.writeline(f"{loop_ref} = missing") - - for name in node.find_all(nodes.Name): - if name.ctx == "store" and name.name == "loop": - self.fail( - "Can't assign to special loop variable in for-loop target", - name.lineno, - ) - - if node.else_: - iteration_indicator = self.temporary_identifier() - self.writeline(f"{iteration_indicator} = 1") - - self.writeline(self.choose_async("async for ", "for "), node) - self.visit(node.target, loop_frame) - if extended_loop: - self.write(f", {loop_ref} in {self.choose_async('Async')}LoopContext(") - else: - self.write(" in ") - - if node.test: - self.write(f"{loop_filter_func}(") - if node.recursive: - self.write("reciter") - else: - if self.environment.is_async and not extended_loop: - self.write("auto_aiter(") - self.visit(node.iter, frame) - if self.environment.is_async and not extended_loop: - self.write(")") - if node.test: - self.write(")") - - if node.recursive: - self.write(", undefined, loop_render_func, depth):") - else: - self.write(", undefined):" if extended_loop else ":") - - self.indent() - self.enter_frame(loop_frame) - - self.writeline("_loop_vars = {}") - self.blockvisit(node.body, loop_frame) - if node.else_: - self.writeline(f"{iteration_indicator} = 0") - self.outdent() - self.leave_frame( - loop_frame, with_python_scope=node.recursive and not node.else_ - ) - - if node.else_: - self.writeline(f"if {iteration_indicator}:") - self.indent() - self.enter_frame(else_frame) - self.blockvisit(node.else_, else_frame) - self.leave_frame(else_frame) - self.outdent() - - # if the node was recursive we have to return the buffer contents - # and start the iteration code - if node.recursive: - self.return_buffer_contents(loop_frame) - self.outdent() - self.start_write(frame, node) - self.write(f"{self.choose_async('await ')}loop(") - if self.environment.is_async: - self.write("auto_aiter(") - self.visit(node.iter, frame) - if self.environment.is_async: - self.write(")") - self.write(", loop)") - self.end_write(frame) - - # at the end of the iteration, clear any assignments made in the - # loop from the top level - if self._assign_stack: - self._assign_stack[-1].difference_update(loop_frame.symbols.stores) - - def visit_If(self, node: nodes.If, frame: Frame) -> None: - if_frame = frame.soft() - self.writeline("if ", node) - self.visit(node.test, if_frame) - self.write(":") - self.indent() - self.blockvisit(node.body, if_frame) - self.outdent() - for elif_ in node.elif_: - self.writeline("elif ", elif_) - self.visit(elif_.test, if_frame) - self.write(":") - self.indent() - self.blockvisit(elif_.body, if_frame) - self.outdent() - if node.else_: - self.writeline("else:") - self.indent() - self.blockvisit(node.else_, if_frame) - self.outdent() - - def visit_Macro(self, node: nodes.Macro, frame: Frame) -> None: - macro_frame, macro_ref = self.macro_body(node, frame) - self.newline() - if frame.toplevel: - if not node.name.startswith("_"): - self.write(f"context.exported_vars.add({node.name!r})") - self.writeline(f"context.vars[{node.name!r}] = ") - self.write(f"{frame.symbols.ref(node.name)} = ") - self.macro_def(macro_ref, macro_frame) - - def visit_CallBlock(self, node: nodes.CallBlock, frame: Frame) -> None: - call_frame, macro_ref = self.macro_body(node, frame) - self.writeline("caller = ") - self.macro_def(macro_ref, call_frame) - self.start_write(frame, node) - self.visit_Call(node.call, frame, forward_caller=True) - self.end_write(frame) - - def visit_FilterBlock(self, node: nodes.FilterBlock, frame: Frame) -> None: - filter_frame = frame.inner() - filter_frame.symbols.analyze_node(node) - self.enter_frame(filter_frame) - self.buffer(filter_frame) - self.blockvisit(node.body, filter_frame) - self.start_write(frame, node) - self.visit_Filter(node.filter, filter_frame) - self.end_write(frame) - self.leave_frame(filter_frame) - - def visit_With(self, node: nodes.With, frame: Frame) -> None: - with_frame = frame.inner() - with_frame.symbols.analyze_node(node) - self.enter_frame(with_frame) - for target, expr in zip(node.targets, node.values): - self.newline() - self.visit(target, with_frame) - self.write(" = ") - self.visit(expr, frame) - self.blockvisit(node.body, with_frame) - self.leave_frame(with_frame) - - def visit_ExprStmt(self, node: nodes.ExprStmt, frame: Frame) -> None: - self.newline(node) - self.visit(node.node, frame) - - class _FinalizeInfo(t.NamedTuple): - const: t.Optional[t.Callable[..., str]] - src: t.Optional[str] - - @staticmethod - def _default_finalize(value: t.Any) -> t.Any: - """The default finalize function if the environment isn't - configured with one. Or, if the environment has one, this is - called on that function's output for constants. - """ - return str(value) - - _finalize: t.Optional[_FinalizeInfo] = None - - def _make_finalize(self) -> _FinalizeInfo: - """Build the finalize function to be used on constants and at - runtime. Cached so it's only created once for all output nodes. - - Returns a ``namedtuple`` with the following attributes: - - ``const`` - A function to finalize constant data at compile time. - - ``src`` - Source code to output around nodes to be evaluated at - runtime. - """ - if self._finalize is not None: - return self._finalize - - finalize: t.Optional[t.Callable[..., t.Any]] - finalize = default = self._default_finalize - src = None - - if self.environment.finalize: - src = "environment.finalize(" - env_finalize = self.environment.finalize - pass_arg = { - _PassArg.context: "context", - _PassArg.eval_context: "context.eval_ctx", - _PassArg.environment: "environment", - }.get( - _PassArg.from_obj(env_finalize) # type: ignore - ) - finalize = None - - if pass_arg is None: - - def finalize(value: t.Any) -> t.Any: # noqa: F811 - return default(env_finalize(value)) - - else: - src = f"{src}{pass_arg}, " - - if pass_arg == "environment": - - def finalize(value: t.Any) -> t.Any: # noqa: F811 - return default(env_finalize(self.environment, value)) - - self._finalize = self._FinalizeInfo(finalize, src) - return self._finalize - - def _output_const_repr(self, group: t.Iterable[t.Any]) -> str: - """Given a group of constant values converted from ``Output`` - child nodes, produce a string to write to the template module - source. - """ - return repr(concat(group)) - - def _output_child_to_const( - self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo - ) -> str: - """Try to optimize a child of an ``Output`` node by trying to - convert it to constant, finalized data at compile time. - - If :exc:`Impossible` is raised, the node is not constant and - will be evaluated at runtime. Any other exception will also be - evaluated at runtime for easier debugging. - """ - const = node.as_const(frame.eval_ctx) - - if frame.eval_ctx.autoescape: - const = escape(const) - - # Template data doesn't go through finalize. - if isinstance(node, nodes.TemplateData): - return str(const) - - return finalize.const(const) # type: ignore - - def _output_child_pre( - self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo - ) -> None: - """Output extra source code before visiting a child of an - ``Output`` node. - """ - if frame.eval_ctx.volatile: - self.write("(escape if context.eval_ctx.autoescape else str)(") - elif frame.eval_ctx.autoescape: - self.write("escape(") - else: - self.write("str(") - - if finalize.src is not None: - self.write(finalize.src) - - def _output_child_post( - self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo - ) -> None: - """Output extra source code after visiting a child of an - ``Output`` node. - """ - self.write(")") - - if finalize.src is not None: - self.write(")") - - def visit_Output(self, node: nodes.Output, frame: Frame) -> None: - # If an extends is active, don't render outside a block. - if frame.require_output_check: - # A top-level extends is known to exist at compile time. - if self.has_known_extends: - return - - self.writeline("if parent_template is None:") - self.indent() - - finalize = self._make_finalize() - body: t.List[t.Union[t.List[t.Any], nodes.Expr]] = [] - - # Evaluate constants at compile time if possible. Each item in - # body will be either a list of static data or a node to be - # evaluated at runtime. - for child in node.nodes: - try: - if not ( - # If the finalize function requires runtime context, - # constants can't be evaluated at compile time. - finalize.const - # Unless it's basic template data that won't be - # finalized anyway. - or isinstance(child, nodes.TemplateData) - ): - raise nodes.Impossible() - - const = self._output_child_to_const(child, frame, finalize) - except (nodes.Impossible, Exception): - # The node was not constant and needs to be evaluated at - # runtime. Or another error was raised, which is easier - # to debug at runtime. - body.append(child) - continue - - if body and isinstance(body[-1], list): - body[-1].append(const) - else: - body.append([const]) - - if frame.buffer is not None: - if len(body) == 1: - self.writeline(f"{frame.buffer}.append(") - else: - self.writeline(f"{frame.buffer}.extend((") - - self.indent() - - for item in body: - if isinstance(item, list): - # A group of constant data to join and output. - val = self._output_const_repr(item) - - if frame.buffer is None: - self.writeline("yield " + val) - else: - self.writeline(val + ",") - else: - if frame.buffer is None: - self.writeline("yield ", item) - else: - self.newline(item) - - # A node to be evaluated at runtime. - self._output_child_pre(item, frame, finalize) - self.visit(item, frame) - self._output_child_post(item, frame, finalize) - - if frame.buffer is not None: - self.write(",") - - if frame.buffer is not None: - self.outdent() - self.writeline(")" if len(body) == 1 else "))") - - if frame.require_output_check: - self.outdent() - - def visit_Assign(self, node: nodes.Assign, frame: Frame) -> None: - self.push_assign_tracking() - - # ``a.b`` is allowed for assignment, and is parsed as an NSRef. However, - # it is only valid if it references a Namespace object. Emit a check for - # that for each ref here, before assignment code is emitted. This can't - # be done in visit_NSRef as the ref could be in the middle of a tuple. - seen_refs: t.Set[str] = set() - - for nsref in node.find_all(nodes.NSRef): - if nsref.name in seen_refs: - # Only emit the check for each reference once, in case the same - # ref is used multiple times in a tuple, `ns.a, ns.b = c, d`. - continue - - seen_refs.add(nsref.name) - ref = frame.symbols.ref(nsref.name) - self.writeline(f"if not isinstance({ref}, Namespace):") - self.indent() - self.writeline( - "raise TemplateRuntimeError" - '("cannot assign attribute on non-namespace object")' - ) - self.outdent() - - self.newline(node) - self.visit(node.target, frame) - self.write(" = ") - self.visit(node.node, frame) - self.pop_assign_tracking(frame) - - def visit_AssignBlock(self, node: nodes.AssignBlock, frame: Frame) -> None: - self.push_assign_tracking() - block_frame = frame.inner() - # This is a special case. Since a set block always captures we - # will disable output checks. This way one can use set blocks - # toplevel even in extended templates. - block_frame.require_output_check = False - block_frame.symbols.analyze_node(node) - self.enter_frame(block_frame) - self.buffer(block_frame) - self.blockvisit(node.body, block_frame) - self.newline(node) - self.visit(node.target, frame) - self.write(" = (Markup if context.eval_ctx.autoescape else identity)(") - if node.filter is not None: - self.visit_Filter(node.filter, block_frame) - else: - self.write(f"concat({block_frame.buffer})") - self.write(")") - self.pop_assign_tracking(frame) - self.leave_frame(block_frame) - - # -- Expression Visitors - - def visit_Name(self, node: nodes.Name, frame: Frame) -> None: - if node.ctx == "store" and ( - frame.toplevel or frame.loop_frame or frame.block_frame - ): - if self._assign_stack: - self._assign_stack[-1].add(node.name) - ref = frame.symbols.ref(node.name) - - # If we are looking up a variable we might have to deal with the - # case where it's undefined. We can skip that case if the load - # instruction indicates a parameter which are always defined. - if node.ctx == "load": - load = frame.symbols.find_load(ref) - if not ( - load is not None - and load[0] == VAR_LOAD_PARAMETER - and not self.parameter_is_undeclared(ref) - ): - self.write( - f"(undefined(name={node.name!r}) if {ref} is missing else {ref})" - ) - return - - self.write(ref) - - def visit_NSRef(self, node: nodes.NSRef, frame: Frame) -> None: - # NSRef is a dotted assignment target a.b=c, but uses a[b]=c internally. - # visit_Assign emits code to validate that each ref is to a Namespace - # object only. That can't be emitted here as the ref could be in the - # middle of a tuple assignment. - ref = frame.symbols.ref(node.name) - self.writeline(f"{ref}[{node.attr!r}]") - - def visit_Const(self, node: nodes.Const, frame: Frame) -> None: - val = node.as_const(frame.eval_ctx) - if isinstance(val, float): - self.write(str(val)) - else: - self.write(repr(val)) - - def visit_TemplateData(self, node: nodes.TemplateData, frame: Frame) -> None: - try: - self.write(repr(node.as_const(frame.eval_ctx))) - except nodes.Impossible: - self.write( - f"(Markup if context.eval_ctx.autoescape else identity)({node.data!r})" - ) - - def visit_Tuple(self, node: nodes.Tuple, frame: Frame) -> None: - self.write("(") - idx = -1 - for idx, item in enumerate(node.items): - if idx: - self.write(", ") - self.visit(item, frame) - self.write(",)" if idx == 0 else ")") - - def visit_List(self, node: nodes.List, frame: Frame) -> None: - self.write("[") - for idx, item in enumerate(node.items): - if idx: - self.write(", ") - self.visit(item, frame) - self.write("]") - - def visit_Dict(self, node: nodes.Dict, frame: Frame) -> None: - self.write("{") - for idx, item in enumerate(node.items): - if idx: - self.write(", ") - self.visit(item.key, frame) - self.write(": ") - self.visit(item.value, frame) - self.write("}") - - visit_Add = _make_binop("+") - visit_Sub = _make_binop("-") - visit_Mul = _make_binop("*") - visit_Div = _make_binop("/") - visit_FloorDiv = _make_binop("//") - visit_Pow = _make_binop("**") - visit_Mod = _make_binop("%") - visit_And = _make_binop("and") - visit_Or = _make_binop("or") - visit_Pos = _make_unop("+") - visit_Neg = _make_unop("-") - visit_Not = _make_unop("not ") - - @optimizeconst - def visit_Concat(self, node: nodes.Concat, frame: Frame) -> None: - if frame.eval_ctx.volatile: - func_name = "(markup_join if context.eval_ctx.volatile else str_join)" - elif frame.eval_ctx.autoescape: - func_name = "markup_join" - else: - func_name = "str_join" - self.write(f"{func_name}((") - for arg in node.nodes: - self.visit(arg, frame) - self.write(", ") - self.write("))") - - @optimizeconst - def visit_Compare(self, node: nodes.Compare, frame: Frame) -> None: - self.write("(") - self.visit(node.expr, frame) - for op in node.ops: - self.visit(op, frame) - self.write(")") - - def visit_Operand(self, node: nodes.Operand, frame: Frame) -> None: - self.write(f" {operators[node.op]} ") - self.visit(node.expr, frame) - - @optimizeconst - def visit_Getattr(self, node: nodes.Getattr, frame: Frame) -> None: - if self.environment.is_async: - self.write("(await auto_await(") - - self.write("environment.getattr(") - self.visit(node.node, frame) - self.write(f", {node.attr!r})") - - if self.environment.is_async: - self.write("))") - - @optimizeconst - def visit_Getitem(self, node: nodes.Getitem, frame: Frame) -> None: - # slices bypass the environment getitem method. - if isinstance(node.arg, nodes.Slice): - self.visit(node.node, frame) - self.write("[") - self.visit(node.arg, frame) - self.write("]") - else: - if self.environment.is_async: - self.write("(await auto_await(") - - self.write("environment.getitem(") - self.visit(node.node, frame) - self.write(", ") - self.visit(node.arg, frame) - self.write(")") - - if self.environment.is_async: - self.write("))") - - def visit_Slice(self, node: nodes.Slice, frame: Frame) -> None: - if node.start is not None: - self.visit(node.start, frame) - self.write(":") - if node.stop is not None: - self.visit(node.stop, frame) - if node.step is not None: - self.write(":") - self.visit(node.step, frame) - - @contextmanager - def _filter_test_common( - self, node: t.Union[nodes.Filter, nodes.Test], frame: Frame, is_filter: bool - ) -> t.Iterator[None]: - if self.environment.is_async: - self.write("(await auto_await(") - - if is_filter: - self.write(f"{self.filters[node.name]}(") - func = self.environment.filters.get(node.name) - else: - self.write(f"{self.tests[node.name]}(") - func = self.environment.tests.get(node.name) - - # When inside an If or CondExpr frame, allow the filter to be - # undefined at compile time and only raise an error if it's - # actually called at runtime. See pull_dependencies. - if func is None and not frame.soft_frame: - type_name = "filter" if is_filter else "test" - self.fail(f"No {type_name} named {node.name!r}.", node.lineno) - - pass_arg = { - _PassArg.context: "context", - _PassArg.eval_context: "context.eval_ctx", - _PassArg.environment: "environment", - }.get( - _PassArg.from_obj(func) # type: ignore - ) - - if pass_arg is not None: - self.write(f"{pass_arg}, ") - - # Back to the visitor function to handle visiting the target of - # the filter or test. - yield - - self.signature(node, frame) - self.write(")") - - if self.environment.is_async: - self.write("))") - - @optimizeconst - def visit_Filter(self, node: nodes.Filter, frame: Frame) -> None: - with self._filter_test_common(node, frame, True): - # if the filter node is None we are inside a filter block - # and want to write to the current buffer - if node.node is not None: - self.visit(node.node, frame) - elif frame.eval_ctx.volatile: - self.write( - f"(Markup(concat({frame.buffer}))" - f" if context.eval_ctx.autoescape else concat({frame.buffer}))" - ) - elif frame.eval_ctx.autoescape: - self.write(f"Markup(concat({frame.buffer}))") - else: - self.write(f"concat({frame.buffer})") - - @optimizeconst - def visit_Test(self, node: nodes.Test, frame: Frame) -> None: - with self._filter_test_common(node, frame, False): - self.visit(node.node, frame) - - @optimizeconst - def visit_CondExpr(self, node: nodes.CondExpr, frame: Frame) -> None: - frame = frame.soft() - - def write_expr2() -> None: - if node.expr2 is not None: - self.visit(node.expr2, frame) - return - - self.write( - f'cond_expr_undefined("the inline if-expression on' - f" {self.position(node)} evaluated to false and no else" - f' section was defined.")' - ) - - self.write("(") - self.visit(node.expr1, frame) - self.write(" if ") - self.visit(node.test, frame) - self.write(" else ") - write_expr2() - self.write(")") - - @optimizeconst - def visit_Call( - self, node: nodes.Call, frame: Frame, forward_caller: bool = False - ) -> None: - if self.environment.is_async: - self.write("(await auto_await(") - if self.environment.sandboxed: - self.write("environment.call(context, ") - else: - self.write("context.call(") - self.visit(node.node, frame) - extra_kwargs = {"caller": "caller"} if forward_caller else None - loop_kwargs = {"_loop_vars": "_loop_vars"} if frame.loop_frame else {} - block_kwargs = {"_block_vars": "_block_vars"} if frame.block_frame else {} - if extra_kwargs: - extra_kwargs.update(loop_kwargs, **block_kwargs) - elif loop_kwargs or block_kwargs: - extra_kwargs = dict(loop_kwargs, **block_kwargs) - self.signature(node, frame, extra_kwargs) - self.write(")") - if self.environment.is_async: - self.write("))") - - def visit_Keyword(self, node: nodes.Keyword, frame: Frame) -> None: - self.write(node.key + "=") - self.visit(node.value, frame) - - # -- Unused nodes for extensions - - def visit_MarkSafe(self, node: nodes.MarkSafe, frame: Frame) -> None: - self.write("Markup(") - self.visit(node.expr, frame) - self.write(")") - - def visit_MarkSafeIfAutoescape( - self, node: nodes.MarkSafeIfAutoescape, frame: Frame - ) -> None: - self.write("(Markup if context.eval_ctx.autoescape else identity)(") - self.visit(node.expr, frame) - self.write(")") - - def visit_EnvironmentAttribute( - self, node: nodes.EnvironmentAttribute, frame: Frame - ) -> None: - self.write("environment." + node.name) - - def visit_ExtensionAttribute( - self, node: nodes.ExtensionAttribute, frame: Frame - ) -> None: - self.write(f"environment.extensions[{node.identifier!r}].{node.name}") - - def visit_ImportedName(self, node: nodes.ImportedName, frame: Frame) -> None: - self.write(self.import_aliases[node.importname]) - - def visit_InternalName(self, node: nodes.InternalName, frame: Frame) -> None: - self.write(node.name) - - def visit_ContextReference( - self, node: nodes.ContextReference, frame: Frame - ) -> None: - self.write("context") - - def visit_DerivedContextReference( - self, node: nodes.DerivedContextReference, frame: Frame - ) -> None: - self.write(self.derive_context(frame)) - - def visit_Continue(self, node: nodes.Continue, frame: Frame) -> None: - self.writeline("continue", node) - - def visit_Break(self, node: nodes.Break, frame: Frame) -> None: - self.writeline("break", node) - - def visit_Scope(self, node: nodes.Scope, frame: Frame) -> None: - scope_frame = frame.inner() - scope_frame.symbols.analyze_node(node) - self.enter_frame(scope_frame) - self.blockvisit(node.body, scope_frame) - self.leave_frame(scope_frame) - - def visit_OverlayScope(self, node: nodes.OverlayScope, frame: Frame) -> None: - ctx = self.temporary_identifier() - self.writeline(f"{ctx} = {self.derive_context(frame)}") - self.writeline(f"{ctx}.vars = ") - self.visit(node.context, frame) - self.push_context_reference(ctx) - - scope_frame = frame.inner(isolated=True) - scope_frame.symbols.analyze_node(node) - self.enter_frame(scope_frame) - self.blockvisit(node.body, scope_frame) - self.leave_frame(scope_frame) - self.pop_context_reference() - - def visit_EvalContextModifier( - self, node: nodes.EvalContextModifier, frame: Frame - ) -> None: - for keyword in node.options: - self.writeline(f"context.eval_ctx.{keyword.key} = ") - self.visit(keyword.value, frame) - try: - val = keyword.value.as_const(frame.eval_ctx) - except nodes.Impossible: - frame.eval_ctx.volatile = True - else: - setattr(frame.eval_ctx, keyword.key, val) - - def visit_ScopedEvalContextModifier( - self, node: nodes.ScopedEvalContextModifier, frame: Frame - ) -> None: - old_ctx_name = self.temporary_identifier() - saved_ctx = frame.eval_ctx.save() - self.writeline(f"{old_ctx_name} = context.eval_ctx.save()") - self.visit_EvalContextModifier(node, frame) - for child in node.body: - self.visit(child, frame) - frame.eval_ctx.revert(saved_ctx) - self.writeline(f"context.eval_ctx.revert({old_ctx_name})") diff --git a/venv/lib/python3.11/site-packages/jinja2/constants.py b/venv/lib/python3.11/site-packages/jinja2/constants.py deleted file mode 100644 index 41a1c23..0000000 --- a/venv/lib/python3.11/site-packages/jinja2/constants.py +++ /dev/null @@ -1,20 +0,0 @@ -#: list of lorem ipsum words used by the lipsum() helper function -LOREM_IPSUM_WORDS = """\ -a ac accumsan ad adipiscing aenean aliquam aliquet amet ante aptent arcu at -auctor augue bibendum blandit class commodo condimentum congue consectetuer -consequat conubia convallis cras cubilia cum curabitur curae cursus dapibus -diam dictum dictumst dignissim dis dolor donec dui duis egestas eget eleifend -elementum elit enim erat eros est et etiam eu euismod facilisi facilisis fames -faucibus felis fermentum feugiat fringilla fusce gravida habitant habitasse hac -hendrerit hymenaeos iaculis id imperdiet in inceptos integer interdum ipsum -justo lacinia lacus laoreet lectus leo libero ligula litora lobortis lorem -luctus maecenas magna magnis malesuada massa mattis mauris metus mi molestie -mollis montes morbi mus nam nascetur natoque nec neque netus nibh nisi nisl non -nonummy nostra nulla nullam nunc odio orci ornare parturient pede pellentesque -penatibus per pharetra phasellus placerat platea porta porttitor posuere -potenti praesent pretium primis proin pulvinar purus quam quis quisque rhoncus -ridiculus risus rutrum sagittis sapien scelerisque sed sem semper senectus sit -sociis sociosqu sodales sollicitudin suscipit suspendisse taciti tellus tempor -tempus tincidunt torquent tortor tristique turpis ullamcorper ultrices -ultricies urna ut varius vehicula vel velit venenatis vestibulum vitae vivamus -viverra volutpat vulputate""" diff --git a/venv/lib/python3.11/site-packages/jinja2/debug.py b/venv/lib/python3.11/site-packages/jinja2/debug.py deleted file mode 100644 index eeeeee7..0000000 --- a/venv/lib/python3.11/site-packages/jinja2/debug.py +++ /dev/null @@ -1,191 +0,0 @@ -import sys -import typing as t -from types import CodeType -from types import TracebackType - -from .exceptions import TemplateSyntaxError -from .utils import internal_code -from .utils import missing - -if t.TYPE_CHECKING: - from .runtime import Context - - -def rewrite_traceback_stack(source: t.Optional[str] = None) -> BaseException: - """Rewrite the current exception to replace any tracebacks from - within compiled template code with tracebacks that look like they - came from the template source. - - This must be called within an ``except`` block. - - :param source: For ``TemplateSyntaxError``, the original source if - known. - :return: The original exception with the rewritten traceback. - """ - _, exc_value, tb = sys.exc_info() - exc_value = t.cast(BaseException, exc_value) - tb = t.cast(TracebackType, tb) - - if isinstance(exc_value, TemplateSyntaxError) and not exc_value.translated: - exc_value.translated = True - exc_value.source = source - # Remove the old traceback, otherwise the frames from the - # compiler still show up. - exc_value.with_traceback(None) - # Outside of runtime, so the frame isn't executing template - # code, but it still needs to point at the template. - tb = fake_traceback( - exc_value, None, exc_value.filename or "", exc_value.lineno - ) - else: - # Skip the frame for the render function. - tb = tb.tb_next - - stack = [] - - # Build the stack of traceback object, replacing any in template - # code with the source file and line information. - while tb is not None: - # Skip frames decorated with @internalcode. These are internal - # calls that aren't useful in template debugging output. - if tb.tb_frame.f_code in internal_code: - tb = tb.tb_next - continue - - template = tb.tb_frame.f_globals.get("__jinja_template__") - - if template is not None: - lineno = template.get_corresponding_lineno(tb.tb_lineno) - fake_tb = fake_traceback(exc_value, tb, template.filename, lineno) - stack.append(fake_tb) - else: - stack.append(tb) - - tb = tb.tb_next - - tb_next = None - - # Assign tb_next in reverse to avoid circular references. - for tb in reversed(stack): - tb.tb_next = tb_next - tb_next = tb - - return exc_value.with_traceback(tb_next) - - -def fake_traceback( # type: ignore - exc_value: BaseException, tb: t.Optional[TracebackType], filename: str, lineno: int -) -> TracebackType: - """Produce a new traceback object that looks like it came from the - template source instead of the compiled code. The filename, line - number, and location name will point to the template, and the local - variables will be the current template context. - - :param exc_value: The original exception to be re-raised to create - the new traceback. - :param tb: The original traceback to get the local variables and - code info from. - :param filename: The template filename. - :param lineno: The line number in the template source. - """ - if tb is not None: - # Replace the real locals with the context that would be - # available at that point in the template. - locals = get_template_locals(tb.tb_frame.f_locals) - locals.pop("__jinja_exception__", None) - else: - locals = {} - - globals = { - "__name__": filename, - "__file__": filename, - "__jinja_exception__": exc_value, - } - # Raise an exception at the correct line number. - code: CodeType = compile( - "\n" * (lineno - 1) + "raise __jinja_exception__", filename, "exec" - ) - - # Build a new code object that points to the template file and - # replaces the location with a block name. - location = "template" - - if tb is not None: - function = tb.tb_frame.f_code.co_name - - if function == "root": - location = "top-level template code" - elif function.startswith("block_"): - location = f"block {function[6:]!r}" - - if sys.version_info >= (3, 8): - code = code.replace(co_name=location) - else: - code = CodeType( - code.co_argcount, - code.co_kwonlyargcount, - code.co_nlocals, - code.co_stacksize, - code.co_flags, - code.co_code, - code.co_consts, - code.co_names, - code.co_varnames, - code.co_filename, - location, - code.co_firstlineno, - code.co_lnotab, - code.co_freevars, - code.co_cellvars, - ) - - # Execute the new code, which is guaranteed to raise, and return - # the new traceback without this frame. - try: - exec(code, globals, locals) - except BaseException: - return sys.exc_info()[2].tb_next # type: ignore - - -def get_template_locals(real_locals: t.Mapping[str, t.Any]) -> t.Dict[str, t.Any]: - """Based on the runtime locals, get the context that would be - available at that point in the template. - """ - # Start with the current template context. - ctx: t.Optional[Context] = real_locals.get("context") - - if ctx is not None: - data: t.Dict[str, t.Any] = ctx.get_all().copy() - else: - data = {} - - # Might be in a derived context that only sets local variables - # rather than pushing a context. Local variables follow the scheme - # l_depth_name. Find the highest-depth local that has a value for - # each name. - local_overrides: t.Dict[str, t.Tuple[int, t.Any]] = {} - - for name, value in real_locals.items(): - if not name.startswith("l_") or value is missing: - # Not a template variable, or no longer relevant. - continue - - try: - _, depth_str, name = name.split("_", 2) - depth = int(depth_str) - except ValueError: - continue - - cur_depth = local_overrides.get(name, (-1,))[0] - - if cur_depth < depth: - local_overrides[name] = (depth, value) - - # Modify the context with any derived context. - for name, (_, value) in local_overrides.items(): - if value is missing: - data.pop(name, None) - else: - data[name] = value - - return data diff --git a/venv/lib/python3.11/site-packages/jinja2/defaults.py b/venv/lib/python3.11/site-packages/jinja2/defaults.py deleted file mode 100644 index 638cad3..0000000 --- a/venv/lib/python3.11/site-packages/jinja2/defaults.py +++ /dev/null @@ -1,48 +0,0 @@ -import typing as t - -from .filters import FILTERS as DEFAULT_FILTERS # noqa: F401 -from .tests import TESTS as DEFAULT_TESTS # noqa: F401 -from .utils import Cycler -from .utils import generate_lorem_ipsum -from .utils import Joiner -from .utils import Namespace - -if t.TYPE_CHECKING: - import typing_extensions as te - -# defaults for the parser / lexer -BLOCK_START_STRING = "{%" -BLOCK_END_STRING = "%}" -VARIABLE_START_STRING = "{{" -VARIABLE_END_STRING = "}}" -COMMENT_START_STRING = "{#" -COMMENT_END_STRING = "#}" -LINE_STATEMENT_PREFIX: t.Optional[str] = None -LINE_COMMENT_PREFIX: t.Optional[str] = None -TRIM_BLOCKS = False -LSTRIP_BLOCKS = False -NEWLINE_SEQUENCE: "te.Literal['\\n', '\\r\\n', '\\r']" = "\n" -KEEP_TRAILING_NEWLINE = False - -# default filters, tests and namespace - -DEFAULT_NAMESPACE = { - "range": range, - "dict": dict, - "lipsum": generate_lorem_ipsum, - "cycler": Cycler, - "joiner": Joiner, - "namespace": Namespace, -} - -# default policies -DEFAULT_POLICIES: t.Dict[str, t.Any] = { - "compiler.ascii_str": True, - "urlize.rel": "noopener", - "urlize.target": None, - "urlize.extra_schemes": None, - "truncate.leeway": 5, - "json.dumps_function": None, - "json.dumps_kwargs": {"sort_keys": True}, - "ext.i18n.trimmed": False, -} diff --git a/venv/lib/python3.11/site-packages/jinja2/environment.py b/venv/lib/python3.11/site-packages/jinja2/environment.py deleted file mode 100644 index 0fc6e5b..0000000 --- a/venv/lib/python3.11/site-packages/jinja2/environment.py +++ /dev/null @@ -1,1672 +0,0 @@ -"""Classes for managing templates and their runtime and compile time -options. -""" - -import os -import typing -import typing as t -import weakref -from collections import ChainMap -from functools import lru_cache -from functools import partial -from functools import reduce -from types import CodeType - -from markupsafe import Markup - -from . import nodes -from .compiler import CodeGenerator -from .compiler import generate -from .defaults import BLOCK_END_STRING -from .defaults import BLOCK_START_STRING -from .defaults import COMMENT_END_STRING -from .defaults import COMMENT_START_STRING -from .defaults import DEFAULT_FILTERS # type: ignore[attr-defined] -from .defaults import DEFAULT_NAMESPACE -from .defaults import DEFAULT_POLICIES -from .defaults import DEFAULT_TESTS # type: ignore[attr-defined] -from .defaults import KEEP_TRAILING_NEWLINE -from .defaults import LINE_COMMENT_PREFIX -from .defaults import LINE_STATEMENT_PREFIX -from .defaults import LSTRIP_BLOCKS -from .defaults import NEWLINE_SEQUENCE -from .defaults import TRIM_BLOCKS -from .defaults import VARIABLE_END_STRING -from .defaults import VARIABLE_START_STRING -from .exceptions import TemplateNotFound -from .exceptions import TemplateRuntimeError -from .exceptions import TemplatesNotFound -from .exceptions import TemplateSyntaxError -from .exceptions import UndefinedError -from .lexer import get_lexer -from .lexer import Lexer -from .lexer import TokenStream -from .nodes import EvalContext -from .parser import Parser -from .runtime import Context -from .runtime import new_context -from .runtime import Undefined -from .utils import _PassArg -from .utils import concat -from .utils import consume -from .utils import import_string -from .utils import internalcode -from .utils import LRUCache -from .utils import missing - -if t.TYPE_CHECKING: - import typing_extensions as te - - from .bccache import BytecodeCache - from .ext import Extension - from .loaders import BaseLoader - -_env_bound = t.TypeVar("_env_bound", bound="Environment") - - -# for direct template usage we have up to ten living environments -@lru_cache(maxsize=10) -def get_spontaneous_environment(cls: t.Type[_env_bound], *args: t.Any) -> _env_bound: - """Return a new spontaneous environment. A spontaneous environment - is used for templates created directly rather than through an - existing environment. - - :param cls: Environment class to create. - :param args: Positional arguments passed to environment. - """ - env = cls(*args) - env.shared = True - return env - - -def create_cache( - size: int, -) -> t.Optional[t.MutableMapping[t.Tuple["weakref.ref[t.Any]", str], "Template"]]: - """Return the cache class for the given size.""" - if size == 0: - return None - - if size < 0: - return {} - - return LRUCache(size) # type: ignore - - -def copy_cache( - cache: t.Optional[t.MutableMapping[t.Any, t.Any]], -) -> t.Optional[t.MutableMapping[t.Tuple["weakref.ref[t.Any]", str], "Template"]]: - """Create an empty copy of the given cache.""" - if cache is None: - return None - - if type(cache) is dict: # noqa E721 - return {} - - return LRUCache(cache.capacity) # type: ignore - - -def load_extensions( - environment: "Environment", - extensions: t.Sequence[t.Union[str, t.Type["Extension"]]], -) -> t.Dict[str, "Extension"]: - """Load the extensions from the list and bind it to the environment. - Returns a dict of instantiated extensions. - """ - result = {} - - for extension in extensions: - if isinstance(extension, str): - extension = t.cast(t.Type["Extension"], import_string(extension)) - - result[extension.identifier] = extension(environment) - - return result - - -def _environment_config_check(environment: _env_bound) -> _env_bound: - """Perform a sanity check on the environment.""" - assert issubclass( - environment.undefined, Undefined - ), "'undefined' must be a subclass of 'jinja2.Undefined'." - assert ( - environment.block_start_string - != environment.variable_start_string - != environment.comment_start_string - ), "block, variable and comment start strings must be different." - assert environment.newline_sequence in { - "\r", - "\r\n", - "\n", - }, "'newline_sequence' must be one of '\\n', '\\r\\n', or '\\r'." - return environment - - -class Environment: - r"""The core component of Jinja is the `Environment`. It contains - important shared variables like configuration, filters, tests, - globals and others. Instances of this class may be modified if - they are not shared and if no template was loaded so far. - Modifications on environments after the first template was loaded - will lead to surprising effects and undefined behavior. - - Here are the possible initialization parameters: - - `block_start_string` - The string marking the beginning of a block. Defaults to ``'{%'``. - - `block_end_string` - The string marking the end of a block. Defaults to ``'%}'``. - - `variable_start_string` - The string marking the beginning of a print statement. - Defaults to ``'{{'``. - - `variable_end_string` - The string marking the end of a print statement. Defaults to - ``'}}'``. - - `comment_start_string` - The string marking the beginning of a comment. Defaults to ``'{#'``. - - `comment_end_string` - The string marking the end of a comment. Defaults to ``'#}'``. - - `line_statement_prefix` - If given and a string, this will be used as prefix for line based - statements. See also :ref:`line-statements`. - - `line_comment_prefix` - If given and a string, this will be used as prefix for line based - comments. See also :ref:`line-statements`. - - .. versionadded:: 2.2 - - `trim_blocks` - If this is set to ``True`` the first newline after a block is - removed (block, not variable tag!). Defaults to `False`. - - `lstrip_blocks` - If this is set to ``True`` leading spaces and tabs are stripped - from the start of a line to a block. Defaults to `False`. - - `newline_sequence` - The sequence that starts a newline. Must be one of ``'\r'``, - ``'\n'`` or ``'\r\n'``. The default is ``'\n'`` which is a - useful default for Linux and OS X systems as well as web - applications. - - `keep_trailing_newline` - Preserve the trailing newline when rendering templates. - The default is ``False``, which causes a single newline, - if present, to be stripped from the end of the template. - - .. versionadded:: 2.7 - - `extensions` - List of Jinja extensions to use. This can either be import paths - as strings or extension classes. For more information have a - look at :ref:`the extensions documentation `. - - `optimized` - should the optimizer be enabled? Default is ``True``. - - `undefined` - :class:`Undefined` or a subclass of it that is used to represent - undefined values in the template. - - `finalize` - A callable that can be used to process the result of a variable - expression before it is output. For example one can convert - ``None`` implicitly into an empty string here. - - `autoescape` - If set to ``True`` the XML/HTML autoescaping feature is enabled by - default. For more details about autoescaping see - :class:`~markupsafe.Markup`. As of Jinja 2.4 this can also - be a callable that is passed the template name and has to - return ``True`` or ``False`` depending on autoescape should be - enabled by default. - - .. versionchanged:: 2.4 - `autoescape` can now be a function - - `loader` - The template loader for this environment. - - `cache_size` - The size of the cache. Per default this is ``400`` which means - that if more than 400 templates are loaded the loader will clean - out the least recently used template. If the cache size is set to - ``0`` templates are recompiled all the time, if the cache size is - ``-1`` the cache will not be cleaned. - - .. versionchanged:: 2.8 - The cache size was increased to 400 from a low 50. - - `auto_reload` - Some loaders load templates from locations where the template - sources may change (ie: file system or database). If - ``auto_reload`` is set to ``True`` (default) every time a template is - requested the loader checks if the source changed and if yes, it - will reload the template. For higher performance it's possible to - disable that. - - `bytecode_cache` - If set to a bytecode cache object, this object will provide a - cache for the internal Jinja bytecode so that templates don't - have to be parsed if they were not changed. - - See :ref:`bytecode-cache` for more information. - - `enable_async` - If set to true this enables async template execution which - allows using async functions and generators. - """ - - #: if this environment is sandboxed. Modifying this variable won't make - #: the environment sandboxed though. For a real sandboxed environment - #: have a look at jinja2.sandbox. This flag alone controls the code - #: generation by the compiler. - sandboxed = False - - #: True if the environment is just an overlay - overlayed = False - - #: the environment this environment is linked to if it is an overlay - linked_to: t.Optional["Environment"] = None - - #: shared environments have this set to `True`. A shared environment - #: must not be modified - shared = False - - #: the class that is used for code generation. See - #: :class:`~jinja2.compiler.CodeGenerator` for more information. - code_generator_class: t.Type["CodeGenerator"] = CodeGenerator - - concat = "".join - - #: the context class that is used for templates. See - #: :class:`~jinja2.runtime.Context` for more information. - context_class: t.Type[Context] = Context - - template_class: t.Type["Template"] - - def __init__( - self, - block_start_string: str = BLOCK_START_STRING, - block_end_string: str = BLOCK_END_STRING, - variable_start_string: str = VARIABLE_START_STRING, - variable_end_string: str = VARIABLE_END_STRING, - comment_start_string: str = COMMENT_START_STRING, - comment_end_string: str = COMMENT_END_STRING, - line_statement_prefix: t.Optional[str] = LINE_STATEMENT_PREFIX, - line_comment_prefix: t.Optional[str] = LINE_COMMENT_PREFIX, - trim_blocks: bool = TRIM_BLOCKS, - lstrip_blocks: bool = LSTRIP_BLOCKS, - newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = NEWLINE_SEQUENCE, - keep_trailing_newline: bool = KEEP_TRAILING_NEWLINE, - extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = (), - optimized: bool = True, - undefined: t.Type[Undefined] = Undefined, - finalize: t.Optional[t.Callable[..., t.Any]] = None, - autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = False, - loader: t.Optional["BaseLoader"] = None, - cache_size: int = 400, - auto_reload: bool = True, - bytecode_cache: t.Optional["BytecodeCache"] = None, - enable_async: bool = False, - ): - # !!Important notice!! - # The constructor accepts quite a few arguments that should be - # passed by keyword rather than position. However it's important to - # not change the order of arguments because it's used at least - # internally in those cases: - # - spontaneous environments (i18n extension and Template) - # - unittests - # If parameter changes are required only add parameters at the end - # and don't change the arguments (or the defaults!) of the arguments - # existing already. - - # lexer / parser information - self.block_start_string = block_start_string - self.block_end_string = block_end_string - self.variable_start_string = variable_start_string - self.variable_end_string = variable_end_string - self.comment_start_string = comment_start_string - self.comment_end_string = comment_end_string - self.line_statement_prefix = line_statement_prefix - self.line_comment_prefix = line_comment_prefix - self.trim_blocks = trim_blocks - self.lstrip_blocks = lstrip_blocks - self.newline_sequence = newline_sequence - self.keep_trailing_newline = keep_trailing_newline - - # runtime information - self.undefined: t.Type[Undefined] = undefined - self.optimized = optimized - self.finalize = finalize - self.autoescape = autoescape - - # defaults - self.filters = DEFAULT_FILTERS.copy() - self.tests = DEFAULT_TESTS.copy() - self.globals = DEFAULT_NAMESPACE.copy() - - # set the loader provided - self.loader = loader - self.cache = create_cache(cache_size) - self.bytecode_cache = bytecode_cache - self.auto_reload = auto_reload - - # configurable policies - self.policies = DEFAULT_POLICIES.copy() - - # load extensions - self.extensions = load_extensions(self, extensions) - - self.is_async = enable_async - _environment_config_check(self) - - def add_extension(self, extension: t.Union[str, t.Type["Extension"]]) -> None: - """Adds an extension after the environment was created. - - .. versionadded:: 2.5 - """ - self.extensions.update(load_extensions(self, [extension])) - - def extend(self, **attributes: t.Any) -> None: - """Add the items to the instance of the environment if they do not exist - yet. This is used by :ref:`extensions ` to register - callbacks and configuration values without breaking inheritance. - """ - for key, value in attributes.items(): - if not hasattr(self, key): - setattr(self, key, value) - - def overlay( - self, - block_start_string: str = missing, - block_end_string: str = missing, - variable_start_string: str = missing, - variable_end_string: str = missing, - comment_start_string: str = missing, - comment_end_string: str = missing, - line_statement_prefix: t.Optional[str] = missing, - line_comment_prefix: t.Optional[str] = missing, - trim_blocks: bool = missing, - lstrip_blocks: bool = missing, - newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = missing, - keep_trailing_newline: bool = missing, - extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = missing, - optimized: bool = missing, - undefined: t.Type[Undefined] = missing, - finalize: t.Optional[t.Callable[..., t.Any]] = missing, - autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = missing, - loader: t.Optional["BaseLoader"] = missing, - cache_size: int = missing, - auto_reload: bool = missing, - bytecode_cache: t.Optional["BytecodeCache"] = missing, - enable_async: bool = missing, - ) -> "te.Self": - """Create a new overlay environment that shares all the data with the - current environment except for cache and the overridden attributes. - Extensions cannot be removed for an overlayed environment. An overlayed - environment automatically gets all the extensions of the environment it - is linked to plus optional extra extensions. - - Creating overlays should happen after the initial environment was set - up completely. Not all attributes are truly linked, some are just - copied over so modifications on the original environment may not shine - through. - - .. versionchanged:: 3.1.5 - ``enable_async`` is applied correctly. - - .. versionchanged:: 3.1.2 - Added the ``newline_sequence``, ``keep_trailing_newline``, - and ``enable_async`` parameters to match ``__init__``. - """ - args = dict(locals()) - del args["self"], args["cache_size"], args["extensions"], args["enable_async"] - - rv = object.__new__(self.__class__) - rv.__dict__.update(self.__dict__) - rv.overlayed = True - rv.linked_to = self - - for key, value in args.items(): - if value is not missing: - setattr(rv, key, value) - - if cache_size is not missing: - rv.cache = create_cache(cache_size) - else: - rv.cache = copy_cache(self.cache) - - rv.extensions = {} - for key, value in self.extensions.items(): - rv.extensions[key] = value.bind(rv) - if extensions is not missing: - rv.extensions.update(load_extensions(rv, extensions)) - - if enable_async is not missing: - rv.is_async = enable_async - - return _environment_config_check(rv) - - @property - def lexer(self) -> Lexer: - """The lexer for this environment.""" - return get_lexer(self) - - def iter_extensions(self) -> t.Iterator["Extension"]: - """Iterates over the extensions by priority.""" - return iter(sorted(self.extensions.values(), key=lambda x: x.priority)) - - def getitem( - self, obj: t.Any, argument: t.Union[str, t.Any] - ) -> t.Union[t.Any, Undefined]: - """Get an item or attribute of an object but prefer the item.""" - try: - return obj[argument] - except (AttributeError, TypeError, LookupError): - if isinstance(argument, str): - try: - attr = str(argument) - except Exception: - pass - else: - try: - return getattr(obj, attr) - except AttributeError: - pass - return self.undefined(obj=obj, name=argument) - - def getattr(self, obj: t.Any, attribute: str) -> t.Any: - """Get an item or attribute of an object but prefer the attribute. - Unlike :meth:`getitem` the attribute *must* be a string. - """ - try: - return getattr(obj, attribute) - except AttributeError: - pass - try: - return obj[attribute] - except (TypeError, LookupError, AttributeError): - return self.undefined(obj=obj, name=attribute) - - def _filter_test_common( - self, - name: t.Union[str, Undefined], - value: t.Any, - args: t.Optional[t.Sequence[t.Any]], - kwargs: t.Optional[t.Mapping[str, t.Any]], - context: t.Optional[Context], - eval_ctx: t.Optional[EvalContext], - is_filter: bool, - ) -> t.Any: - if is_filter: - env_map = self.filters - type_name = "filter" - else: - env_map = self.tests - type_name = "test" - - func = env_map.get(name) # type: ignore - - if func is None: - msg = f"No {type_name} named {name!r}." - - if isinstance(name, Undefined): - try: - name._fail_with_undefined_error() - except Exception as e: - msg = f"{msg} ({e}; did you forget to quote the callable name?)" - - raise TemplateRuntimeError(msg) - - args = [value, *(args if args is not None else ())] - kwargs = kwargs if kwargs is not None else {} - pass_arg = _PassArg.from_obj(func) - - if pass_arg is _PassArg.context: - if context is None: - raise TemplateRuntimeError( - f"Attempted to invoke a context {type_name} without context." - ) - - args.insert(0, context) - elif pass_arg is _PassArg.eval_context: - if eval_ctx is None: - if context is not None: - eval_ctx = context.eval_ctx - else: - eval_ctx = EvalContext(self) - - args.insert(0, eval_ctx) - elif pass_arg is _PassArg.environment: - args.insert(0, self) - - return func(*args, **kwargs) - - def call_filter( - self, - name: str, - value: t.Any, - args: t.Optional[t.Sequence[t.Any]] = None, - kwargs: t.Optional[t.Mapping[str, t.Any]] = None, - context: t.Optional[Context] = None, - eval_ctx: t.Optional[EvalContext] = None, - ) -> t.Any: - """Invoke a filter on a value the same way the compiler does. - - This might return a coroutine if the filter is running from an - environment in async mode and the filter supports async - execution. It's your responsibility to await this if needed. - - .. versionadded:: 2.7 - """ - return self._filter_test_common( - name, value, args, kwargs, context, eval_ctx, True - ) - - def call_test( - self, - name: str, - value: t.Any, - args: t.Optional[t.Sequence[t.Any]] = None, - kwargs: t.Optional[t.Mapping[str, t.Any]] = None, - context: t.Optional[Context] = None, - eval_ctx: t.Optional[EvalContext] = None, - ) -> t.Any: - """Invoke a test on a value the same way the compiler does. - - This might return a coroutine if the test is running from an - environment in async mode and the test supports async execution. - It's your responsibility to await this if needed. - - .. versionchanged:: 3.0 - Tests support ``@pass_context``, etc. decorators. Added - the ``context`` and ``eval_ctx`` parameters. - - .. versionadded:: 2.7 - """ - return self._filter_test_common( - name, value, args, kwargs, context, eval_ctx, False - ) - - @internalcode - def parse( - self, - source: str, - name: t.Optional[str] = None, - filename: t.Optional[str] = None, - ) -> nodes.Template: - """Parse the sourcecode and return the abstract syntax tree. This - tree of nodes is used by the compiler to convert the template into - executable source- or bytecode. This is useful for debugging or to - extract information from templates. - - If you are :ref:`developing Jinja extensions ` - this gives you a good overview of the node tree generated. - """ - try: - return self._parse(source, name, filename) - except TemplateSyntaxError: - self.handle_exception(source=source) - - def _parse( - self, source: str, name: t.Optional[str], filename: t.Optional[str] - ) -> nodes.Template: - """Internal parsing function used by `parse` and `compile`.""" - return Parser(self, source, name, filename).parse() - - def lex( - self, - source: str, - name: t.Optional[str] = None, - filename: t.Optional[str] = None, - ) -> t.Iterator[t.Tuple[int, str, str]]: - """Lex the given sourcecode and return a generator that yields - tokens as tuples in the form ``(lineno, token_type, value)``. - This can be useful for :ref:`extension development ` - and debugging templates. - - This does not perform preprocessing. If you want the preprocessing - of the extensions to be applied you have to filter source through - the :meth:`preprocess` method. - """ - source = str(source) - try: - return self.lexer.tokeniter(source, name, filename) - except TemplateSyntaxError: - self.handle_exception(source=source) - - def preprocess( - self, - source: str, - name: t.Optional[str] = None, - filename: t.Optional[str] = None, - ) -> str: - """Preprocesses the source with all extensions. This is automatically - called for all parsing and compiling methods but *not* for :meth:`lex` - because there you usually only want the actual source tokenized. - """ - return reduce( - lambda s, e: e.preprocess(s, name, filename), - self.iter_extensions(), - str(source), - ) - - def _tokenize( - self, - source: str, - name: t.Optional[str], - filename: t.Optional[str] = None, - state: t.Optional[str] = None, - ) -> TokenStream: - """Called by the parser to do the preprocessing and filtering - for all the extensions. Returns a :class:`~jinja2.lexer.TokenStream`. - """ - source = self.preprocess(source, name, filename) - stream = self.lexer.tokenize(source, name, filename, state) - - for ext in self.iter_extensions(): - stream = ext.filter_stream(stream) # type: ignore - - if not isinstance(stream, TokenStream): - stream = TokenStream(stream, name, filename) - - return stream - - def _generate( - self, - source: nodes.Template, - name: t.Optional[str], - filename: t.Optional[str], - defer_init: bool = False, - ) -> str: - """Internal hook that can be overridden to hook a different generate - method in. - - .. versionadded:: 2.5 - """ - return generate( # type: ignore - source, - self, - name, - filename, - defer_init=defer_init, - optimized=self.optimized, - ) - - def _compile(self, source: str, filename: str) -> CodeType: - """Internal hook that can be overridden to hook a different compile - method in. - - .. versionadded:: 2.5 - """ - return compile(source, filename, "exec") - - @typing.overload - def compile( - self, - source: t.Union[str, nodes.Template], - name: t.Optional[str] = None, - filename: t.Optional[str] = None, - raw: "te.Literal[False]" = False, - defer_init: bool = False, - ) -> CodeType: ... - - @typing.overload - def compile( - self, - source: t.Union[str, nodes.Template], - name: t.Optional[str] = None, - filename: t.Optional[str] = None, - raw: "te.Literal[True]" = ..., - defer_init: bool = False, - ) -> str: ... - - @internalcode - def compile( - self, - source: t.Union[str, nodes.Template], - name: t.Optional[str] = None, - filename: t.Optional[str] = None, - raw: bool = False, - defer_init: bool = False, - ) -> t.Union[str, CodeType]: - """Compile a node or template source code. The `name` parameter is - the load name of the template after it was joined using - :meth:`join_path` if necessary, not the filename on the file system. - the `filename` parameter is the estimated filename of the template on - the file system. If the template came from a database or memory this - can be omitted. - - The return value of this method is a python code object. If the `raw` - parameter is `True` the return value will be a string with python - code equivalent to the bytecode returned otherwise. This method is - mainly used internally. - - `defer_init` is use internally to aid the module code generator. This - causes the generated code to be able to import without the global - environment variable to be set. - - .. versionadded:: 2.4 - `defer_init` parameter added. - """ - source_hint = None - try: - if isinstance(source, str): - source_hint = source - source = self._parse(source, name, filename) - source = self._generate(source, name, filename, defer_init=defer_init) - if raw: - return source - if filename is None: - filename = "

fLmDlC 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 diff --git a/venv/lib/python3.11/site-packages/anyio/streams/buffered.py b/venv/lib/python3.11/site-packages/anyio/streams/buffered.py deleted file mode 100644 index f5d5e83..0000000 --- a/venv/lib/python3.11/site-packages/anyio/streams/buffered.py +++ /dev/null @@ -1,119 +0,0 @@ -from __future__ import annotations - -from collections.abc import Callable, Mapping -from dataclasses import dataclass, field -from typing import Any - -from .. import ClosedResourceError, DelimiterNotFound, EndOfStream, IncompleteRead -from ..abc import AnyByteReceiveStream, ByteReceiveStream - - -@dataclass(eq=False) -class BufferedByteReceiveStream(ByteReceiveStream): - """ - Wraps any bytes-based receive stream and uses a buffer to provide sophisticated - receiving capabilities in the form of a byte stream. - """ - - receive_stream: AnyByteReceiveStream - _buffer: bytearray = field(init=False, default_factory=bytearray) - _closed: bool = field(init=False, default=False) - - async def aclose(self) -> None: - await self.receive_stream.aclose() - self._closed = True - - @property - def buffer(self) -> bytes: - """The bytes currently in the buffer.""" - return bytes(self._buffer) - - @property - def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: - return self.receive_stream.extra_attributes - - async def receive(self, max_bytes: int = 65536) -> bytes: - if self._closed: - raise ClosedResourceError - - if self._buffer: - chunk = bytes(self._buffer[:max_bytes]) - del self._buffer[:max_bytes] - return chunk - elif isinstance(self.receive_stream, ByteReceiveStream): - return await self.receive_stream.receive(max_bytes) - else: - # With a bytes-oriented object stream, we need to handle any surplus bytes - # we get from the receive() call - chunk = await self.receive_stream.receive() - if len(chunk) > max_bytes: - # Save the surplus bytes in the buffer - self._buffer.extend(chunk[max_bytes:]) - return chunk[:max_bytes] - else: - return chunk - - async def receive_exactly(self, nbytes: int) -> bytes: - """ - Read exactly the given amount of bytes from the stream. - - :param nbytes: the number of bytes to read - :return: the bytes read - :raises ~anyio.IncompleteRead: if the stream was closed before the requested - amount of bytes could be read from the stream - - """ - while True: - remaining = nbytes - len(self._buffer) - if remaining <= 0: - retval = self._buffer[:nbytes] - del self._buffer[:nbytes] - return bytes(retval) - - try: - if isinstance(self.receive_stream, ByteReceiveStream): - chunk = await self.receive_stream.receive(remaining) - else: - chunk = await self.receive_stream.receive() - except EndOfStream as exc: - raise IncompleteRead from exc - - self._buffer.extend(chunk) - - async def receive_until(self, delimiter: bytes, max_bytes: int) -> bytes: - """ - Read from the stream until the delimiter is found or max_bytes have been read. - - :param delimiter: the marker to look for in the stream - :param max_bytes: maximum number of bytes that will be read before raising - :exc:`~anyio.DelimiterNotFound` - :return: the bytes read (not including the delimiter) - :raises ~anyio.IncompleteRead: if the stream was closed before the delimiter - was found - :raises ~anyio.DelimiterNotFound: if the delimiter is not found within the - bytes read up to the maximum allowed - - """ - delimiter_size = len(delimiter) - offset = 0 - while True: - # Check if the delimiter can be found in the current buffer - index = self._buffer.find(delimiter, offset) - if index >= 0: - found = self._buffer[:index] - del self._buffer[: index + len(delimiter) :] - return bytes(found) - - # Check if the buffer is already at or over the limit - if len(self._buffer) >= max_bytes: - raise DelimiterNotFound(max_bytes) - - # Read more data into the buffer from the socket - try: - data = await self.receive_stream.receive() - except EndOfStream as exc: - raise IncompleteRead from exc - - # Move the offset forward and add the new data to the buffer - offset = max(len(self._buffer) - delimiter_size + 1, 0) - self._buffer.extend(data) diff --git a/venv/lib/python3.11/site-packages/anyio/streams/file.py b/venv/lib/python3.11/site-packages/anyio/streams/file.py deleted file mode 100644 index f492464..0000000 --- a/venv/lib/python3.11/site-packages/anyio/streams/file.py +++ /dev/null @@ -1,148 +0,0 @@ -from __future__ import annotations - -from collections.abc import Callable, Mapping -from io import SEEK_SET, UnsupportedOperation -from os import PathLike -from pathlib import Path -from typing import Any, BinaryIO, cast - -from .. import ( - BrokenResourceError, - ClosedResourceError, - EndOfStream, - TypedAttributeSet, - to_thread, - typed_attribute, -) -from ..abc import ByteReceiveStream, ByteSendStream - - -class FileStreamAttribute(TypedAttributeSet): - #: the open file descriptor - file: BinaryIO = typed_attribute() - #: the path of the file on the file system, if available (file must be a real file) - path: Path = typed_attribute() - #: the file number, if available (file must be a real file or a TTY) - fileno: int = typed_attribute() - - -class _BaseFileStream: - def __init__(self, file: BinaryIO): - self._file = file - - async def aclose(self) -> None: - await to_thread.run_sync(self._file.close) - - @property - def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: - attributes: dict[Any, Callable[[], Any]] = { - FileStreamAttribute.file: lambda: self._file, - } - - if hasattr(self._file, "name"): - attributes[FileStreamAttribute.path] = lambda: Path(self._file.name) - - try: - self._file.fileno() - except UnsupportedOperation: - pass - else: - attributes[FileStreamAttribute.fileno] = lambda: self._file.fileno() - - return attributes - - -class FileReadStream(_BaseFileStream, ByteReceiveStream): - """ - A byte stream that reads from a file in the file system. - - :param file: a file that has been opened for reading in binary mode - - .. versionadded:: 3.0 - """ - - @classmethod - async def from_path(cls, path: str | PathLike[str]) -> FileReadStream: - """ - Create a file read stream by opening the given file. - - :param path: path of the file to read from - - """ - file = await to_thread.run_sync(Path(path).open, "rb") - return cls(cast(BinaryIO, file)) - - async def receive(self, max_bytes: int = 65536) -> bytes: - try: - data = await to_thread.run_sync(self._file.read, max_bytes) - except ValueError: - raise ClosedResourceError from None - except OSError as exc: - raise BrokenResourceError from exc - - if data: - return data - else: - raise EndOfStream - - async def seek(self, position: int, whence: int = SEEK_SET) -> int: - """ - Seek the file to the given position. - - .. seealso:: :meth:`io.IOBase.seek` - - .. note:: Not all file descriptors are seekable. - - :param position: position to seek the file to - :param whence: controls how ``position`` is interpreted - :return: the new absolute position - :raises OSError: if the file is not seekable - - """ - return await to_thread.run_sync(self._file.seek, position, whence) - - async def tell(self) -> int: - """ - Return the current stream position. - - .. note:: Not all file descriptors are seekable. - - :return: the current absolute position - :raises OSError: if the file is not seekable - - """ - return await to_thread.run_sync(self._file.tell) - - -class FileWriteStream(_BaseFileStream, ByteSendStream): - """ - A byte stream that writes to a file in the file system. - - :param file: a file that has been opened for writing in binary mode - - .. versionadded:: 3.0 - """ - - @classmethod - async def from_path( - cls, path: str | PathLike[str], append: bool = False - ) -> FileWriteStream: - """ - Create a file write stream by opening the given file for writing. - - :param path: path of the file to write to - :param append: if ``True``, open the file for appending; if ``False``, any - existing file at the given path will be truncated - - """ - mode = "ab" if append else "wb" - file = await to_thread.run_sync(Path(path).open, mode) - return cls(cast(BinaryIO, file)) - - async def send(self, item: bytes) -> None: - try: - await to_thread.run_sync(self._file.write, item) - except ValueError: - raise ClosedResourceError from None - except OSError as exc: - raise BrokenResourceError from exc diff --git a/venv/lib/python3.11/site-packages/anyio/streams/memory.py b/venv/lib/python3.11/site-packages/anyio/streams/memory.py deleted file mode 100644 index 83bf1d9..0000000 --- a/venv/lib/python3.11/site-packages/anyio/streams/memory.py +++ /dev/null @@ -1,317 +0,0 @@ -from __future__ import annotations - -import warnings -from collections import OrderedDict, deque -from dataclasses import dataclass, field -from types import TracebackType -from typing import Generic, NamedTuple, TypeVar - -from .. import ( - BrokenResourceError, - ClosedResourceError, - EndOfStream, - WouldBlock, -) -from .._core._testing import TaskInfo, get_current_task -from ..abc import Event, ObjectReceiveStream, ObjectSendStream -from ..lowlevel import checkpoint - -T_Item = TypeVar("T_Item") -T_co = TypeVar("T_co", covariant=True) -T_contra = TypeVar("T_contra", contravariant=True) - - -class MemoryObjectStreamStatistics(NamedTuple): - current_buffer_used: int #: number of items stored in the buffer - #: maximum number of items that can be stored on this stream (or :data:`math.inf`) - max_buffer_size: float - open_send_streams: int #: number of unclosed clones of the send stream - open_receive_streams: int #: number of unclosed clones of the receive stream - #: number of tasks blocked on :meth:`MemoryObjectSendStream.send` - tasks_waiting_send: int - #: number of tasks blocked on :meth:`MemoryObjectReceiveStream.receive` - tasks_waiting_receive: int - - -@dataclass(eq=False) -class MemoryObjectItemReceiver(Generic[T_Item]): - task_info: TaskInfo = field(init=False, default_factory=get_current_task) - item: T_Item = field(init=False) - - def __repr__(self) -> str: - # When item is not defined, we get following error with default __repr__: - # AttributeError: 'MemoryObjectItemReceiver' object has no attribute 'item' - item = getattr(self, "item", None) - return f"{self.__class__.__name__}(task_info={self.task_info}, item={item!r})" - - -@dataclass(eq=False) -class MemoryObjectStreamState(Generic[T_Item]): - max_buffer_size: float = field() - buffer: deque[T_Item] = field(init=False, default_factory=deque) - open_send_channels: int = field(init=False, default=0) - open_receive_channels: int = field(init=False, default=0) - waiting_receivers: OrderedDict[Event, MemoryObjectItemReceiver[T_Item]] = field( - init=False, default_factory=OrderedDict - ) - waiting_senders: OrderedDict[Event, T_Item] = field( - init=False, default_factory=OrderedDict - ) - - def statistics(self) -> MemoryObjectStreamStatistics: - return MemoryObjectStreamStatistics( - len(self.buffer), - self.max_buffer_size, - self.open_send_channels, - self.open_receive_channels, - len(self.waiting_senders), - len(self.waiting_receivers), - ) - - -@dataclass(eq=False) -class MemoryObjectReceiveStream(Generic[T_co], ObjectReceiveStream[T_co]): - _state: MemoryObjectStreamState[T_co] - _closed: bool = field(init=False, default=False) - - def __post_init__(self) -> None: - self._state.open_receive_channels += 1 - - def receive_nowait(self) -> T_co: - """ - Receive the next item if it can be done without waiting. - - :return: the received item - :raises ~anyio.ClosedResourceError: if this send stream has been closed - :raises ~anyio.EndOfStream: if the buffer is empty and this stream has been - closed from the sending end - :raises ~anyio.WouldBlock: if there are no items in the buffer and no tasks - waiting to send - - """ - if self._closed: - raise ClosedResourceError - - if self._state.waiting_senders: - # Get the item from the next sender - send_event, item = self._state.waiting_senders.popitem(last=False) - self._state.buffer.append(item) - send_event.set() - - if self._state.buffer: - return self._state.buffer.popleft() - elif not self._state.open_send_channels: - raise EndOfStream - - raise WouldBlock - - async def receive(self) -> T_co: - await checkpoint() - try: - return self.receive_nowait() - except WouldBlock: - # Add ourselves in the queue - receive_event = Event() - receiver = MemoryObjectItemReceiver[T_co]() - self._state.waiting_receivers[receive_event] = receiver - - try: - await receive_event.wait() - finally: - self._state.waiting_receivers.pop(receive_event, None) - - try: - return receiver.item - except AttributeError: - raise EndOfStream from None - - def clone(self) -> MemoryObjectReceiveStream[T_co]: - """ - Create a clone of this receive stream. - - Each clone can be closed separately. Only when all clones have been closed will - the receiving end of the memory stream be considered closed by the sending ends. - - :return: the cloned stream - - """ - if self._closed: - raise ClosedResourceError - - return MemoryObjectReceiveStream(_state=self._state) - - def close(self) -> None: - """ - Close the stream. - - This works the exact same way as :meth:`aclose`, but is provided as a special - case for the benefit of synchronous callbacks. - - """ - if not self._closed: - self._closed = True - self._state.open_receive_channels -= 1 - if self._state.open_receive_channels == 0: - send_events = list(self._state.waiting_senders.keys()) - for event in send_events: - event.set() - - async def aclose(self) -> None: - self.close() - - def statistics(self) -> MemoryObjectStreamStatistics: - """ - Return statistics about the current state of this stream. - - .. versionadded:: 3.0 - """ - return self._state.statistics() - - def __enter__(self) -> MemoryObjectReceiveStream[T_co]: - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - self.close() - - def __del__(self) -> None: - if not self._closed: - warnings.warn( - f"Unclosed <{self.__class__.__name__} at {id(self):x}>", - ResourceWarning, - source=self, - ) - - -@dataclass(eq=False) -class MemoryObjectSendStream(Generic[T_contra], ObjectSendStream[T_contra]): - _state: MemoryObjectStreamState[T_contra] - _closed: bool = field(init=False, default=False) - - def __post_init__(self) -> None: - self._state.open_send_channels += 1 - - def send_nowait(self, item: T_contra) -> None: - """ - Send an item immediately if it can be done without waiting. - - :param item: the item to send - :raises ~anyio.ClosedResourceError: if this send stream has been closed - :raises ~anyio.BrokenResourceError: if the stream has been closed from the - receiving end - :raises ~anyio.WouldBlock: if the buffer is full and there are no tasks waiting - to receive - - """ - if self._closed: - raise ClosedResourceError - if not self._state.open_receive_channels: - raise BrokenResourceError - - while self._state.waiting_receivers: - receive_event, receiver = self._state.waiting_receivers.popitem(last=False) - if not receiver.task_info.has_pending_cancellation(): - receiver.item = item - receive_event.set() - return - - if len(self._state.buffer) < self._state.max_buffer_size: - self._state.buffer.append(item) - else: - raise WouldBlock - - async def send(self, item: T_contra) -> None: - """ - Send an item to the stream. - - If the buffer is full, this method blocks until there is again room in the - buffer or the item can be sent directly to a receiver. - - :param item: the item to send - :raises ~anyio.ClosedResourceError: if this send stream has been closed - :raises ~anyio.BrokenResourceError: if the stream has been closed from the - receiving end - - """ - await checkpoint() - try: - self.send_nowait(item) - except WouldBlock: - # Wait until there's someone on the receiving end - send_event = Event() - self._state.waiting_senders[send_event] = item - try: - await send_event.wait() - except BaseException: - self._state.waiting_senders.pop(send_event, None) - raise - - if send_event in self._state.waiting_senders: - del self._state.waiting_senders[send_event] - raise BrokenResourceError from None - - def clone(self) -> MemoryObjectSendStream[T_contra]: - """ - Create a clone of this send stream. - - Each clone can be closed separately. Only when all clones have been closed will - the sending end of the memory stream be considered closed by the receiving ends. - - :return: the cloned stream - - """ - if self._closed: - raise ClosedResourceError - - return MemoryObjectSendStream(_state=self._state) - - def close(self) -> None: - """ - Close the stream. - - This works the exact same way as :meth:`aclose`, but is provided as a special - case for the benefit of synchronous callbacks. - - """ - if not self._closed: - self._closed = True - self._state.open_send_channels -= 1 - if self._state.open_send_channels == 0: - receive_events = list(self._state.waiting_receivers.keys()) - self._state.waiting_receivers.clear() - for event in receive_events: - event.set() - - async def aclose(self) -> None: - self.close() - - def statistics(self) -> MemoryObjectStreamStatistics: - """ - Return statistics about the current state of this stream. - - .. versionadded:: 3.0 - """ - return self._state.statistics() - - def __enter__(self) -> MemoryObjectSendStream[T_contra]: - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - self.close() - - def __del__(self) -> None: - if not self._closed: - warnings.warn( - f"Unclosed <{self.__class__.__name__} at {id(self):x}>", - ResourceWarning, - source=self, - ) diff --git a/venv/lib/python3.11/site-packages/anyio/streams/stapled.py b/venv/lib/python3.11/site-packages/anyio/streams/stapled.py deleted file mode 100644 index 80f64a2..0000000 --- a/venv/lib/python3.11/site-packages/anyio/streams/stapled.py +++ /dev/null @@ -1,141 +0,0 @@ -from __future__ import annotations - -from collections.abc import Callable, Mapping, Sequence -from dataclasses import dataclass -from typing import Any, Generic, TypeVar - -from ..abc import ( - ByteReceiveStream, - ByteSendStream, - ByteStream, - Listener, - ObjectReceiveStream, - ObjectSendStream, - ObjectStream, - TaskGroup, -) - -T_Item = TypeVar("T_Item") -T_Stream = TypeVar("T_Stream") - - -@dataclass(eq=False) -class StapledByteStream(ByteStream): - """ - Combines two byte streams into a single, bidirectional byte stream. - - Extra attributes will be provided from both streams, with the receive stream - providing the values in case of a conflict. - - :param ByteSendStream send_stream: the sending byte stream - :param ByteReceiveStream receive_stream: the receiving byte stream - """ - - send_stream: ByteSendStream - receive_stream: ByteReceiveStream - - async def receive(self, max_bytes: int = 65536) -> bytes: - return await self.receive_stream.receive(max_bytes) - - async def send(self, item: bytes) -> None: - await self.send_stream.send(item) - - async def send_eof(self) -> None: - await self.send_stream.aclose() - - async def aclose(self) -> None: - await self.send_stream.aclose() - await self.receive_stream.aclose() - - @property - def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: - return { - **self.send_stream.extra_attributes, - **self.receive_stream.extra_attributes, - } - - -@dataclass(eq=False) -class StapledObjectStream(Generic[T_Item], ObjectStream[T_Item]): - """ - Combines two object streams into a single, bidirectional object stream. - - Extra attributes will be provided from both streams, with the receive stream - providing the values in case of a conflict. - - :param ObjectSendStream send_stream: the sending object stream - :param ObjectReceiveStream receive_stream: the receiving object stream - """ - - send_stream: ObjectSendStream[T_Item] - receive_stream: ObjectReceiveStream[T_Item] - - async def receive(self) -> T_Item: - return await self.receive_stream.receive() - - async def send(self, item: T_Item) -> None: - await self.send_stream.send(item) - - async def send_eof(self) -> None: - await self.send_stream.aclose() - - async def aclose(self) -> None: - await self.send_stream.aclose() - await self.receive_stream.aclose() - - @property - def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: - return { - **self.send_stream.extra_attributes, - **self.receive_stream.extra_attributes, - } - - -@dataclass(eq=False) -class MultiListener(Generic[T_Stream], Listener[T_Stream]): - """ - Combines multiple listeners into one, serving connections from all of them at once. - - Any MultiListeners in the given collection of listeners will have their listeners - moved into this one. - - Extra attributes are provided from each listener, with each successive listener - overriding any conflicting attributes from the previous one. - - :param listeners: listeners to serve - :type listeners: Sequence[Listener[T_Stream]] - """ - - listeners: Sequence[Listener[T_Stream]] - - def __post_init__(self) -> None: - listeners: list[Listener[T_Stream]] = [] - for listener in self.listeners: - if isinstance(listener, MultiListener): - listeners.extend(listener.listeners) - del listener.listeners[:] # type: ignore[attr-defined] - else: - listeners.append(listener) - - self.listeners = listeners - - async def serve( - self, handler: Callable[[T_Stream], Any], task_group: TaskGroup | None = None - ) -> None: - from .. import create_task_group - - async with create_task_group() as tg: - for listener in self.listeners: - tg.start_soon(listener.serve, handler, task_group) - - async def aclose(self) -> None: - for listener in self.listeners: - await listener.aclose() - - @property - def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: - attributes: dict = {} - for listener in self.listeners: - attributes.update(listener.extra_attributes) - - return attributes diff --git a/venv/lib/python3.11/site-packages/anyio/streams/text.py b/venv/lib/python3.11/site-packages/anyio/streams/text.py deleted file mode 100644 index f1a1127..0000000 --- a/venv/lib/python3.11/site-packages/anyio/streams/text.py +++ /dev/null @@ -1,147 +0,0 @@ -from __future__ import annotations - -import codecs -from collections.abc import Callable, Mapping -from dataclasses import InitVar, dataclass, field -from typing import Any - -from ..abc import ( - AnyByteReceiveStream, - AnyByteSendStream, - AnyByteStream, - ObjectReceiveStream, - ObjectSendStream, - ObjectStream, -) - - -@dataclass(eq=False) -class TextReceiveStream(ObjectReceiveStream[str]): - """ - Stream wrapper that decodes bytes to strings using the given encoding. - - Decoding is done using :class:`~codecs.IncrementalDecoder` which returns any - completely received unicode characters as soon as they come in. - - :param transport_stream: any bytes-based receive stream - :param encoding: character encoding to use for decoding bytes to strings (defaults - to ``utf-8``) - :param errors: handling scheme for decoding errors (defaults to ``strict``; see the - `codecs module documentation`_ for a comprehensive list of options) - - .. _codecs module documentation: - https://docs.python.org/3/library/codecs.html#codec-objects - """ - - transport_stream: AnyByteReceiveStream - encoding: InitVar[str] = "utf-8" - errors: InitVar[str] = "strict" - _decoder: codecs.IncrementalDecoder = field(init=False) - - def __post_init__(self, encoding: str, errors: str) -> None: - decoder_class = codecs.getincrementaldecoder(encoding) - self._decoder = decoder_class(errors=errors) - - async def receive(self) -> str: - while True: - chunk = await self.transport_stream.receive() - decoded = self._decoder.decode(chunk) - if decoded: - return decoded - - async def aclose(self) -> None: - await self.transport_stream.aclose() - self._decoder.reset() - - @property - def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: - return self.transport_stream.extra_attributes - - -@dataclass(eq=False) -class TextSendStream(ObjectSendStream[str]): - """ - Sends strings to the wrapped stream as bytes using the given encoding. - - :param AnyByteSendStream transport_stream: any bytes-based send stream - :param str encoding: character encoding to use for encoding strings to bytes - (defaults to ``utf-8``) - :param str errors: handling scheme for encoding errors (defaults to ``strict``; see - the `codecs module documentation`_ for a comprehensive list of options) - - .. _codecs module documentation: - https://docs.python.org/3/library/codecs.html#codec-objects - """ - - transport_stream: AnyByteSendStream - encoding: InitVar[str] = "utf-8" - errors: str = "strict" - _encoder: Callable[..., tuple[bytes, int]] = field(init=False) - - def __post_init__(self, encoding: str) -> None: - self._encoder = codecs.getencoder(encoding) - - async def send(self, item: str) -> None: - encoded = self._encoder(item, self.errors)[0] - await self.transport_stream.send(encoded) - - async def aclose(self) -> None: - await self.transport_stream.aclose() - - @property - def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: - return self.transport_stream.extra_attributes - - -@dataclass(eq=False) -class TextStream(ObjectStream[str]): - """ - A bidirectional stream that decodes bytes to strings on receive and encodes strings - to bytes on send. - - Extra attributes will be provided from both streams, with the receive stream - providing the values in case of a conflict. - - :param AnyByteStream transport_stream: any bytes-based stream - :param str encoding: character encoding to use for encoding/decoding strings to/from - bytes (defaults to ``utf-8``) - :param str errors: handling scheme for encoding errors (defaults to ``strict``; see - the `codecs module documentation`_ for a comprehensive list of options) - - .. _codecs module documentation: - https://docs.python.org/3/library/codecs.html#codec-objects - """ - - transport_stream: AnyByteStream - encoding: InitVar[str] = "utf-8" - errors: InitVar[str] = "strict" - _receive_stream: TextReceiveStream = field(init=False) - _send_stream: TextSendStream = field(init=False) - - def __post_init__(self, encoding: str, errors: str) -> None: - self._receive_stream = TextReceiveStream( - self.transport_stream, encoding=encoding, errors=errors - ) - self._send_stream = TextSendStream( - self.transport_stream, encoding=encoding, errors=errors - ) - - async def receive(self) -> str: - return await self._receive_stream.receive() - - async def send(self, item: str) -> None: - await self._send_stream.send(item) - - async def send_eof(self) -> None: - await self.transport_stream.send_eof() - - async def aclose(self) -> None: - await self._send_stream.aclose() - await self._receive_stream.aclose() - - @property - def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: - return { - **self._send_stream.extra_attributes, - **self._receive_stream.extra_attributes, - } diff --git a/venv/lib/python3.11/site-packages/anyio/streams/tls.py b/venv/lib/python3.11/site-packages/anyio/streams/tls.py deleted file mode 100644 index 70a41cc..0000000 --- a/venv/lib/python3.11/site-packages/anyio/streams/tls.py +++ /dev/null @@ -1,352 +0,0 @@ -from __future__ import annotations - -import logging -import re -import ssl -import sys -from collections.abc import Callable, Mapping -from dataclasses import dataclass -from functools import wraps -from typing import Any, TypeVar - -from .. import ( - BrokenResourceError, - EndOfStream, - aclose_forcefully, - get_cancelled_exc_class, - to_thread, -) -from .._core._typedattr import TypedAttributeSet, typed_attribute -from ..abc import AnyByteStream, ByteStream, Listener, TaskGroup - -if sys.version_info >= (3, 11): - from typing import TypeVarTuple, Unpack -else: - from typing_extensions import TypeVarTuple, Unpack - -T_Retval = TypeVar("T_Retval") -PosArgsT = TypeVarTuple("PosArgsT") -_PCTRTT = tuple[tuple[str, str], ...] -_PCTRTTT = tuple[_PCTRTT, ...] - - -class TLSAttribute(TypedAttributeSet): - """Contains Transport Layer Security related attributes.""" - - #: the selected ALPN protocol - alpn_protocol: str | None = typed_attribute() - #: the channel binding for type ``tls-unique`` - channel_binding_tls_unique: bytes = typed_attribute() - #: the selected cipher - cipher: tuple[str, str, int] = typed_attribute() - #: the peer certificate in dictionary form (see :meth:`ssl.SSLSocket.getpeercert` - # for more information) - peer_certificate: None | (dict[str, str | _PCTRTTT | _PCTRTT]) = typed_attribute() - #: the peer certificate in binary form - peer_certificate_binary: bytes | None = typed_attribute() - #: ``True`` if this is the server side of the connection - server_side: bool = typed_attribute() - #: ciphers shared by the client during the TLS handshake (``None`` if this is the - #: client side) - shared_ciphers: list[tuple[str, str, int]] | None = typed_attribute() - #: the :class:`~ssl.SSLObject` used for encryption - ssl_object: ssl.SSLObject = typed_attribute() - #: ``True`` if this stream does (and expects) a closing TLS handshake when the - #: stream is being closed - standard_compatible: bool = typed_attribute() - #: the TLS protocol version (e.g. ``TLSv1.2``) - tls_version: str = typed_attribute() - - -@dataclass(eq=False) -class TLSStream(ByteStream): - """ - A stream wrapper that encrypts all sent data and decrypts received data. - - This class has no public initializer; use :meth:`wrap` instead. - All extra attributes from :class:`~TLSAttribute` are supported. - - :var AnyByteStream transport_stream: the wrapped stream - - """ - - transport_stream: AnyByteStream - standard_compatible: bool - _ssl_object: ssl.SSLObject - _read_bio: ssl.MemoryBIO - _write_bio: ssl.MemoryBIO - - @classmethod - async def wrap( - cls, - transport_stream: AnyByteStream, - *, - server_side: bool | None = None, - hostname: str | None = None, - ssl_context: ssl.SSLContext | None = None, - standard_compatible: bool = True, - ) -> TLSStream: - """ - Wrap an existing stream with Transport Layer Security. - - This performs a TLS handshake with the peer. - - :param transport_stream: a bytes-transporting stream to wrap - :param server_side: ``True`` if this is the server side of the connection, - ``False`` if this is the client side (if omitted, will be set to ``False`` - if ``hostname`` has been provided, ``False`` otherwise). Used only to create - a default context when an explicit context has not been provided. - :param hostname: host name of the peer (if host name checking is desired) - :param ssl_context: the SSLContext object to use (if not provided, a secure - default will be created) - :param standard_compatible: if ``False``, skip the closing handshake when - closing the connection, and don't raise an exception if the peer does the - same - :raises ~ssl.SSLError: if the TLS handshake fails - - """ - if server_side is None: - server_side = not hostname - - if not ssl_context: - purpose = ( - ssl.Purpose.CLIENT_AUTH if server_side else ssl.Purpose.SERVER_AUTH - ) - ssl_context = ssl.create_default_context(purpose) - - # Re-enable detection of unexpected EOFs if it was disabled by Python - if hasattr(ssl, "OP_IGNORE_UNEXPECTED_EOF"): - ssl_context.options &= ~ssl.OP_IGNORE_UNEXPECTED_EOF - - bio_in = ssl.MemoryBIO() - bio_out = ssl.MemoryBIO() - - # External SSLContext implementations may do blocking I/O in wrap_bio(), - # but the standard library implementation won't - if type(ssl_context) is ssl.SSLContext: - ssl_object = ssl_context.wrap_bio( - bio_in, bio_out, server_side=server_side, server_hostname=hostname - ) - else: - ssl_object = await to_thread.run_sync( - ssl_context.wrap_bio, - bio_in, - bio_out, - server_side, - hostname, - None, - ) - - wrapper = cls( - transport_stream=transport_stream, - standard_compatible=standard_compatible, - _ssl_object=ssl_object, - _read_bio=bio_in, - _write_bio=bio_out, - ) - await wrapper._call_sslobject_method(ssl_object.do_handshake) - return wrapper - - async def _call_sslobject_method( - self, func: Callable[[Unpack[PosArgsT]], T_Retval], *args: Unpack[PosArgsT] - ) -> T_Retval: - while True: - try: - result = func(*args) - except ssl.SSLWantReadError: - try: - # Flush any pending writes first - if self._write_bio.pending: - await self.transport_stream.send(self._write_bio.read()) - - data = await self.transport_stream.receive() - except EndOfStream: - self._read_bio.write_eof() - except OSError as exc: - self._read_bio.write_eof() - self._write_bio.write_eof() - raise BrokenResourceError from exc - else: - self._read_bio.write(data) - except ssl.SSLWantWriteError: - await self.transport_stream.send(self._write_bio.read()) - except ssl.SSLSyscallError as exc: - self._read_bio.write_eof() - self._write_bio.write_eof() - raise BrokenResourceError from exc - except ssl.SSLError as exc: - self._read_bio.write_eof() - self._write_bio.write_eof() - if isinstance(exc, ssl.SSLEOFError) or ( - exc.strerror and "UNEXPECTED_EOF_WHILE_READING" in exc.strerror - ): - if self.standard_compatible: - raise BrokenResourceError from exc - else: - raise EndOfStream from None - - raise - else: - # Flush any pending writes first - if self._write_bio.pending: - await self.transport_stream.send(self._write_bio.read()) - - return result - - async def unwrap(self) -> tuple[AnyByteStream, bytes]: - """ - Does the TLS closing handshake. - - :return: a tuple of (wrapped byte stream, bytes left in the read buffer) - - """ - await self._call_sslobject_method(self._ssl_object.unwrap) - self._read_bio.write_eof() - self._write_bio.write_eof() - return self.transport_stream, self._read_bio.read() - - async def aclose(self) -> None: - if self.standard_compatible: - try: - await self.unwrap() - except BaseException: - await aclose_forcefully(self.transport_stream) - raise - - await self.transport_stream.aclose() - - async def receive(self, max_bytes: int = 65536) -> bytes: - data = await self._call_sslobject_method(self._ssl_object.read, max_bytes) - if not data: - raise EndOfStream - - return data - - async def send(self, item: bytes) -> None: - await self._call_sslobject_method(self._ssl_object.write, item) - - async def send_eof(self) -> None: - tls_version = self.extra(TLSAttribute.tls_version) - match = re.match(r"TLSv(\d+)(?:\.(\d+))?", tls_version) - if match: - major, minor = int(match.group(1)), int(match.group(2) or 0) - if (major, minor) < (1, 3): - raise NotImplementedError( - f"send_eof() requires at least TLSv1.3; current " - f"session uses {tls_version}" - ) - - raise NotImplementedError( - "send_eof() has not yet been implemented for TLS streams" - ) - - @property - def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: - return { - **self.transport_stream.extra_attributes, - TLSAttribute.alpn_protocol: self._ssl_object.selected_alpn_protocol, - TLSAttribute.channel_binding_tls_unique: ( - self._ssl_object.get_channel_binding - ), - TLSAttribute.cipher: self._ssl_object.cipher, - TLSAttribute.peer_certificate: lambda: self._ssl_object.getpeercert(False), - TLSAttribute.peer_certificate_binary: lambda: self._ssl_object.getpeercert( - True - ), - TLSAttribute.server_side: lambda: self._ssl_object.server_side, - TLSAttribute.shared_ciphers: lambda: self._ssl_object.shared_ciphers() - if self._ssl_object.server_side - else None, - TLSAttribute.standard_compatible: lambda: self.standard_compatible, - TLSAttribute.ssl_object: lambda: self._ssl_object, - TLSAttribute.tls_version: self._ssl_object.version, - } - - -@dataclass(eq=False) -class TLSListener(Listener[TLSStream]): - """ - A convenience listener that wraps another listener and auto-negotiates a TLS session - on every accepted connection. - - If the TLS handshake times out or raises an exception, - :meth:`handle_handshake_error` is called to do whatever post-mortem processing is - deemed necessary. - - Supports only the :attr:`~TLSAttribute.standard_compatible` extra attribute. - - :param Listener listener: the listener to wrap - :param ssl_context: the SSL context object - :param standard_compatible: a flag passed through to :meth:`TLSStream.wrap` - :param handshake_timeout: time limit for the TLS handshake - (passed to :func:`~anyio.fail_after`) - """ - - listener: Listener[Any] - ssl_context: ssl.SSLContext - standard_compatible: bool = True - handshake_timeout: float = 30 - - @staticmethod - async def handle_handshake_error(exc: BaseException, stream: AnyByteStream) -> None: - """ - Handle an exception raised during the TLS handshake. - - This method does 3 things: - - #. Forcefully closes the original stream - #. Logs the exception (unless it was a cancellation exception) using the - ``anyio.streams.tls`` logger - #. Reraises the exception if it was a base exception or a cancellation exception - - :param exc: the exception - :param stream: the original stream - - """ - await aclose_forcefully(stream) - - # Log all except cancellation exceptions - if not isinstance(exc, get_cancelled_exc_class()): - # CPython (as of 3.11.5) returns incorrect `sys.exc_info()` here when using - # any asyncio implementation, so we explicitly pass the exception to log - # (https://github.com/python/cpython/issues/108668). Trio does not have this - # issue because it works around the CPython bug. - logging.getLogger(__name__).exception( - "Error during TLS handshake", exc_info=exc - ) - - # Only reraise base exceptions and cancellation exceptions - if not isinstance(exc, Exception) or isinstance(exc, get_cancelled_exc_class()): - raise - - async def serve( - self, - handler: Callable[[TLSStream], Any], - task_group: TaskGroup | None = None, - ) -> None: - @wraps(handler) - async def handler_wrapper(stream: AnyByteStream) -> None: - from .. import fail_after - - try: - with fail_after(self.handshake_timeout): - wrapped_stream = await TLSStream.wrap( - stream, - ssl_context=self.ssl_context, - standard_compatible=self.standard_compatible, - ) - except BaseException as exc: - await self.handle_handshake_error(exc, stream) - else: - await handler(wrapped_stream) - - await self.listener.serve(handler_wrapper, task_group) - - async def aclose(self) -> None: - await self.listener.aclose() - - @property - def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: - return { - TLSAttribute.standard_compatible: lambda: self.standard_compatible, - } diff --git a/venv/lib/python3.11/site-packages/anyio/to_interpreter.py b/venv/lib/python3.11/site-packages/anyio/to_interpreter.py deleted file mode 100644 index 8a2e993..0000000 --- a/venv/lib/python3.11/site-packages/anyio/to_interpreter.py +++ /dev/null @@ -1,218 +0,0 @@ -from __future__ import annotations - -import atexit -import os -import pickle -import sys -from collections import deque -from collections.abc import Callable -from textwrap import dedent -from typing import Any, Final, TypeVar - -from . import current_time, to_thread -from ._core._exceptions import BrokenWorkerIntepreter -from ._core._synchronization import CapacityLimiter -from .lowlevel import RunVar - -if sys.version_info >= (3, 11): - from typing import TypeVarTuple, Unpack -else: - from typing_extensions import TypeVarTuple, Unpack - -UNBOUND: Final = 2 # I have no clue how this works, but it was used in the stdlib -FMT_UNPICKLED: Final = 0 -FMT_PICKLED: Final = 1 -DEFAULT_CPU_COUNT: Final = 8 # this is just an arbitrarily selected value -MAX_WORKER_IDLE_TIME = ( - 30 # seconds a subinterpreter can be idle before becoming eligible for pruning -) - -T_Retval = TypeVar("T_Retval") -PosArgsT = TypeVarTuple("PosArgsT") - -_idle_workers = RunVar[deque["Worker"]]("_available_workers") -_default_interpreter_limiter = RunVar[CapacityLimiter]("_default_interpreter_limiter") - - -class Worker: - _run_func = compile( - dedent(""" - import _interpqueues as queues - import _interpreters as interpreters - from pickle import loads, dumps, HIGHEST_PROTOCOL - - item = queues.get(queue_id)[0] - try: - func, args = loads(item) - retval = func(*args) - except BaseException as exc: - is_exception = True - retval = exc - else: - is_exception = False - - try: - queues.put(queue_id, (retval, is_exception), FMT_UNPICKLED, UNBOUND) - except interpreters.NotShareableError: - retval = dumps(retval, HIGHEST_PROTOCOL) - queues.put(queue_id, (retval, is_exception), FMT_PICKLED, UNBOUND) - """), - "", - "exec", - ) - - last_used: float = 0 - - _initialized: bool = False - _interpreter_id: int - _queue_id: int - - def initialize(self) -> None: - import _interpqueues as queues - import _interpreters as interpreters - - self._interpreter_id = interpreters.create() - self._queue_id = queues.create(2, FMT_UNPICKLED, UNBOUND) - self._initialized = True - interpreters.set___main___attrs( - self._interpreter_id, - { - "queue_id": self._queue_id, - "FMT_PICKLED": FMT_PICKLED, - "FMT_UNPICKLED": FMT_UNPICKLED, - "UNBOUND": UNBOUND, - }, - ) - - def destroy(self) -> None: - import _interpqueues as queues - import _interpreters as interpreters - - if self._initialized: - interpreters.destroy(self._interpreter_id) - queues.destroy(self._queue_id) - - def _call( - self, - func: Callable[..., T_Retval], - args: tuple[Any], - ) -> tuple[Any, bool]: - import _interpqueues as queues - import _interpreters as interpreters - - if not self._initialized: - self.initialize() - - payload = pickle.dumps((func, args), pickle.HIGHEST_PROTOCOL) - queues.put(self._queue_id, payload, FMT_PICKLED, UNBOUND) - - res: Any - is_exception: bool - if exc_info := interpreters.exec(self._interpreter_id, self._run_func): - raise BrokenWorkerIntepreter(exc_info) - - (res, is_exception), fmt = queues.get(self._queue_id)[:2] - if fmt == FMT_PICKLED: - res = pickle.loads(res) - - return res, is_exception - - async def call( - self, - func: Callable[..., T_Retval], - args: tuple[Any], - limiter: CapacityLimiter, - ) -> T_Retval: - result, is_exception = await to_thread.run_sync( - self._call, - func, - args, - limiter=limiter, - ) - if is_exception: - raise result - - return result - - -def _stop_workers(workers: deque[Worker]) -> None: - for worker in workers: - worker.destroy() - - workers.clear() - - -async def run_sync( - func: Callable[[Unpack[PosArgsT]], T_Retval], - *args: Unpack[PosArgsT], - limiter: CapacityLimiter | None = None, -) -> T_Retval: - """ - Call the given function with the given arguments in a subinterpreter. - - If the ``cancellable`` option is enabled and the task waiting for its completion is - cancelled, the call will still run its course but its return value (or any raised - exception) will be ignored. - - .. warning:: This feature is **experimental**. The upstream interpreter API has not - yet been finalized or thoroughly tested, so don't rely on this for anything - mission critical. - - :param func: a callable - :param args: positional arguments for the callable - :param limiter: capacity limiter to use to limit the total amount of subinterpreters - running (if omitted, the default limiter is used) - :return: the result of the call - :raises BrokenWorkerIntepreter: if there's an internal error in a subinterpreter - - """ - if sys.version_info <= (3, 13): - raise RuntimeError("subinterpreters require at least Python 3.13") - - if limiter is None: - limiter = current_default_interpreter_limiter() - - try: - idle_workers = _idle_workers.get() - except LookupError: - idle_workers = deque() - _idle_workers.set(idle_workers) - atexit.register(_stop_workers, idle_workers) - - async with limiter: - try: - worker = idle_workers.pop() - except IndexError: - worker = Worker() - - try: - return await worker.call(func, args, limiter) - finally: - # Prune workers that have been idle for too long - now = current_time() - while idle_workers: - if now - idle_workers[0].last_used <= MAX_WORKER_IDLE_TIME: - break - - await to_thread.run_sync(idle_workers.popleft().destroy, limiter=limiter) - - worker.last_used = current_time() - idle_workers.append(worker) - - -def current_default_interpreter_limiter() -> CapacityLimiter: - """ - Return the capacity limiter that is used by default to limit the number of - concurrently running subinterpreters. - - Defaults to the number of CPU cores. - - :return: a capacity limiter object - - """ - try: - return _default_interpreter_limiter.get() - except LookupError: - limiter = CapacityLimiter(os.cpu_count() or DEFAULT_CPU_COUNT) - _default_interpreter_limiter.set(limiter) - return limiter diff --git a/venv/lib/python3.11/site-packages/anyio/to_process.py b/venv/lib/python3.11/site-packages/anyio/to_process.py deleted file mode 100644 index 495de2a..0000000 --- a/venv/lib/python3.11/site-packages/anyio/to_process.py +++ /dev/null @@ -1,258 +0,0 @@ -from __future__ import annotations - -import os -import pickle -import subprocess -import sys -from collections import deque -from collections.abc import Callable -from importlib.util import module_from_spec, spec_from_file_location -from typing import TypeVar, cast - -from ._core._eventloop import current_time, get_async_backend, get_cancelled_exc_class -from ._core._exceptions import BrokenWorkerProcess -from ._core._subprocesses import open_process -from ._core._synchronization import CapacityLimiter -from ._core._tasks import CancelScope, fail_after -from .abc import ByteReceiveStream, ByteSendStream, Process -from .lowlevel import RunVar, checkpoint_if_cancelled -from .streams.buffered import BufferedByteReceiveStream - -if sys.version_info >= (3, 11): - from typing import TypeVarTuple, Unpack -else: - from typing_extensions import TypeVarTuple, Unpack - -WORKER_MAX_IDLE_TIME = 300 # 5 minutes - -T_Retval = TypeVar("T_Retval") -PosArgsT = TypeVarTuple("PosArgsT") - -_process_pool_workers: RunVar[set[Process]] = RunVar("_process_pool_workers") -_process_pool_idle_workers: RunVar[deque[tuple[Process, float]]] = RunVar( - "_process_pool_idle_workers" -) -_default_process_limiter: RunVar[CapacityLimiter] = RunVar("_default_process_limiter") - - -async def run_sync( # type: ignore[return] - func: Callable[[Unpack[PosArgsT]], T_Retval], - *args: Unpack[PosArgsT], - cancellable: bool = False, - limiter: CapacityLimiter | None = None, -) -> T_Retval: - """ - Call the given function with the given arguments in a worker process. - - If the ``cancellable`` option is enabled and the task waiting for its completion is - cancelled, the worker process running it will be abruptly terminated using SIGKILL - (or ``terminateProcess()`` on Windows). - - :param func: a callable - :param args: positional arguments for the callable - :param cancellable: ``True`` to allow cancellation of the operation while it's - running - :param limiter: capacity limiter to use to limit the total amount of processes - running (if omitted, the default limiter is used) - :return: an awaitable that yields the return value of the function. - - """ - - async def send_raw_command(pickled_cmd: bytes) -> object: - try: - await stdin.send(pickled_cmd) - response = await buffered.receive_until(b"\n", 50) - status, length = response.split(b" ") - if status not in (b"RETURN", b"EXCEPTION"): - raise RuntimeError( - f"Worker process returned unexpected response: {response!r}" - ) - - pickled_response = await buffered.receive_exactly(int(length)) - except BaseException as exc: - workers.discard(process) - try: - process.kill() - with CancelScope(shield=True): - await process.aclose() - except ProcessLookupError: - pass - - if isinstance(exc, get_cancelled_exc_class()): - raise - else: - raise BrokenWorkerProcess from exc - - retval = pickle.loads(pickled_response) - if status == b"EXCEPTION": - assert isinstance(retval, BaseException) - raise retval - else: - return retval - - # First pickle the request before trying to reserve a worker process - await checkpoint_if_cancelled() - request = pickle.dumps(("run", func, args), protocol=pickle.HIGHEST_PROTOCOL) - - # If this is the first run in this event loop thread, set up the necessary variables - try: - workers = _process_pool_workers.get() - idle_workers = _process_pool_idle_workers.get() - except LookupError: - workers = set() - idle_workers = deque() - _process_pool_workers.set(workers) - _process_pool_idle_workers.set(idle_workers) - get_async_backend().setup_process_pool_exit_at_shutdown(workers) - - async with limiter or current_default_process_limiter(): - # Pop processes from the pool (starting from the most recently used) until we - # find one that hasn't exited yet - process: Process - while idle_workers: - process, idle_since = idle_workers.pop() - if process.returncode is None: - stdin = cast(ByteSendStream, process.stdin) - buffered = BufferedByteReceiveStream( - cast(ByteReceiveStream, process.stdout) - ) - - # Prune any other workers that have been idle for WORKER_MAX_IDLE_TIME - # seconds or longer - now = current_time() - killed_processes: list[Process] = [] - while idle_workers: - if now - idle_workers[0][1] < WORKER_MAX_IDLE_TIME: - break - - process_to_kill, idle_since = idle_workers.popleft() - process_to_kill.kill() - workers.remove(process_to_kill) - killed_processes.append(process_to_kill) - - with CancelScope(shield=True): - for killed_process in killed_processes: - await killed_process.aclose() - - break - - workers.remove(process) - else: - command = [sys.executable, "-u", "-m", __name__] - process = await open_process( - command, stdin=subprocess.PIPE, stdout=subprocess.PIPE - ) - try: - stdin = cast(ByteSendStream, process.stdin) - buffered = BufferedByteReceiveStream( - cast(ByteReceiveStream, process.stdout) - ) - with fail_after(20): - message = await buffered.receive(6) - - if message != b"READY\n": - raise BrokenWorkerProcess( - f"Worker process returned unexpected response: {message!r}" - ) - - main_module_path = getattr(sys.modules["__main__"], "__file__", None) - pickled = pickle.dumps( - ("init", sys.path, main_module_path), - protocol=pickle.HIGHEST_PROTOCOL, - ) - await send_raw_command(pickled) - except (BrokenWorkerProcess, get_cancelled_exc_class()): - raise - except BaseException as exc: - process.kill() - raise BrokenWorkerProcess( - "Error during worker process initialization" - ) from exc - - workers.add(process) - - with CancelScope(shield=not cancellable): - try: - return cast(T_Retval, await send_raw_command(request)) - finally: - if process in workers: - idle_workers.append((process, current_time())) - - -def current_default_process_limiter() -> CapacityLimiter: - """ - Return the capacity limiter that is used by default to limit the number of worker - processes. - - :return: a capacity limiter object - - """ - try: - return _default_process_limiter.get() - except LookupError: - limiter = CapacityLimiter(os.cpu_count() or 2) - _default_process_limiter.set(limiter) - return limiter - - -def process_worker() -> None: - # Redirect standard streams to os.devnull so that user code won't interfere with the - # parent-worker communication - stdin = sys.stdin - stdout = sys.stdout - sys.stdin = open(os.devnull) - sys.stdout = open(os.devnull, "w") - - stdout.buffer.write(b"READY\n") - while True: - retval = exception = None - try: - command, *args = pickle.load(stdin.buffer) - except EOFError: - return - except BaseException as exc: - exception = exc - else: - if command == "run": - func, args = args - try: - retval = func(*args) - except BaseException as exc: - exception = exc - elif command == "init": - main_module_path: str | None - sys.path, main_module_path = args - del sys.modules["__main__"] - if main_module_path and os.path.isfile(main_module_path): - # Load the parent's main module but as __mp_main__ instead of - # __main__ (like multiprocessing does) to avoid infinite recursion - try: - spec = spec_from_file_location("__mp_main__", main_module_path) - if spec and spec.loader: - main = module_from_spec(spec) - spec.loader.exec_module(main) - sys.modules["__main__"] = main - except BaseException as exc: - exception = exc - try: - if exception is not None: - status = b"EXCEPTION" - pickled = pickle.dumps(exception, pickle.HIGHEST_PROTOCOL) - else: - status = b"RETURN" - pickled = pickle.dumps(retval, pickle.HIGHEST_PROTOCOL) - except BaseException as exc: - exception = exc - status = b"EXCEPTION" - pickled = pickle.dumps(exc, pickle.HIGHEST_PROTOCOL) - - stdout.buffer.write(b"%s %d\n" % (status, len(pickled))) - stdout.buffer.write(pickled) - - # Respect SIGTERM - if isinstance(exception, SystemExit): - raise exception - - -if __name__ == "__main__": - process_worker() diff --git a/venv/lib/python3.11/site-packages/anyio/to_thread.py b/venv/lib/python3.11/site-packages/anyio/to_thread.py deleted file mode 100644 index 5070516..0000000 --- a/venv/lib/python3.11/site-packages/anyio/to_thread.py +++ /dev/null @@ -1,69 +0,0 @@ -from __future__ import annotations - -import sys -from collections.abc import Callable -from typing import TypeVar -from warnings import warn - -from ._core._eventloop import get_async_backend -from .abc import CapacityLimiter - -if sys.version_info >= (3, 11): - from typing import TypeVarTuple, Unpack -else: - from typing_extensions import TypeVarTuple, Unpack - -T_Retval = TypeVar("T_Retval") -PosArgsT = TypeVarTuple("PosArgsT") - - -async def run_sync( - func: Callable[[Unpack[PosArgsT]], T_Retval], - *args: Unpack[PosArgsT], - abandon_on_cancel: bool = False, - cancellable: bool | None = None, - limiter: CapacityLimiter | None = None, -) -> T_Retval: - """ - Call the given function with the given arguments in a worker thread. - - If the ``cancellable`` option is enabled and the task waiting for its completion is - cancelled, the thread will still run its course but its return value (or any raised - exception) will be ignored. - - :param func: a callable - :param args: positional arguments for the callable - :param abandon_on_cancel: ``True`` to abandon the thread (leaving it to run - unchecked on own) if the host task is cancelled, ``False`` to ignore - cancellations in the host task until the operation has completed in the worker - thread - :param cancellable: deprecated alias of ``abandon_on_cancel``; will override - ``abandon_on_cancel`` if both parameters are passed - :param limiter: capacity limiter to use to limit the total amount of threads running - (if omitted, the default limiter is used) - :return: an awaitable that yields the return value of the function. - - """ - if cancellable is not None: - abandon_on_cancel = cancellable - warn( - "The `cancellable=` keyword argument to `anyio.to_thread.run_sync` is " - "deprecated since AnyIO 4.1.0; use `abandon_on_cancel=` instead", - DeprecationWarning, - stacklevel=2, - ) - - return await get_async_backend().run_sync_in_worker_thread( - func, args, abandon_on_cancel=abandon_on_cancel, limiter=limiter - ) - - -def current_default_thread_limiter() -> CapacityLimiter: - """ - Return the capacity limiter that is used by default to limit the number of - concurrent threads. - - :return: a capacity limiter object - - """ - return get_async_backend().current_default_thread_limiter() diff --git a/venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/INSTALLER b/venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/LICENSE b/venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/LICENSE deleted file mode 100644 index 11069ed..0000000 --- a/venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/METADATA b/venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/METADATA deleted file mode 100644 index 96f0bdf..0000000 --- a/venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/METADATA +++ /dev/null @@ -1,330 +0,0 @@ -Metadata-Version: 2.2 -Name: bcrypt -Version: 4.3.0 -Summary: Modern password hashing for your software and your servers -Author-email: The Python Cryptographic Authority developers -License: Apache-2.0 -Project-URL: homepage, https://github.com/pyca/bcrypt/ -Classifier: Development Status :: 5 - Production/Stable -Classifier: License :: OSI Approved :: Apache Software License -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Requires-Python: >=3.8 -Description-Content-Type: text/x-rst -License-File: LICENSE -Provides-Extra: tests -Requires-Dist: pytest!=3.3.0,>=3.2.1; extra == "tests" -Provides-Extra: typecheck -Requires-Dist: mypy; extra == "typecheck" - -bcrypt -====== - -.. image:: https://img.shields.io/pypi/v/bcrypt.svg - :target: https://pypi.org/project/bcrypt/ - :alt: Latest Version - -.. image:: https://github.com/pyca/bcrypt/workflows/CI/badge.svg?branch=main - :target: https://github.com/pyca/bcrypt/actions?query=workflow%3ACI+branch%3Amain - -Acceptable password hashing for your software and your servers (but you should -really use argon2id or scrypt) - - -Installation -============ - -To install bcrypt, simply: - -.. code:: console - - $ pip install bcrypt - -Note that bcrypt should build very easily on Linux provided you have a C -compiler and a Rust compiler (the minimum supported Rust version is 1.56.0). - -For Debian and Ubuntu, the following command will ensure that the required dependencies are installed: - -.. code:: console - - $ sudo apt-get install build-essential cargo - -For Fedora and RHEL-derivatives, the following command will ensure that the required dependencies are installed: - -.. code:: console - - $ sudo yum install gcc cargo - -For Alpine, the following command will ensure that the required dependencies are installed: - -.. code:: console - - $ apk add --update musl-dev gcc cargo - - -Alternatives -============ - -While bcrypt remains an acceptable choice for password storage, depending on your specific use case you may also want to consider using scrypt (either via `standard library`_ or `cryptography`_) or argon2id via `argon2_cffi`_. - -Changelog -========= - -Unreleased ----------- - -* Dropped support for Python 3.7. -* We now support free-threaded Python 3.13. -* We now support PyPy 3.11. -* We now publish wheels for free-threaded Python 3.13, for PyPy 3.11 on - ``manylinux``, and for ARMv7l on ``manylinux``. - -4.2.1 ------ - -* Bump Rust dependency versions - this should resolve crashes on Python 3.13 - free-threaded builds. -* We no longer build ``manylinux`` wheels for PyPy 3.9. - -4.2.0 ------ - -* Bump Rust dependency versions -* Removed the ``BCRYPT_ALLOW_RUST_163`` environment variable. - -4.1.3 ------ - -* Bump Rust dependency versions - -4.1.2 ------ - -* Publish both ``py37`` and ``py39`` wheels. This should resolve some errors - relating to initializing a module multiple times per process. - -4.1.1 ------ - -* Fixed the type signature on the ``kdf`` method. -* Fixed packaging bug on Windows. -* Fixed incompatibility with passlib package detection assumptions. - -4.1.0 ------ - -* Dropped support for Python 3.6. -* Bumped MSRV to 1.64. (Note: Rust 1.63 can be used by setting the ``BCRYPT_ALLOW_RUST_163`` environment variable) - -4.0.1 ------ - -* We now build PyPy ``manylinux`` wheels. -* Fixed a bug where passing an invalid ``salt`` to ``checkpw`` could result in - a ``pyo3_runtime.PanicException``. It now correctly raises a ``ValueError``. - -4.0.0 ------ - -* ``bcrypt`` is now implemented in Rust. Users building from source will need - to have a Rust compiler available. Nothing will change for users downloading - wheels. -* We no longer ship ``manylinux2010`` wheels. Users should upgrade to the latest - ``pip`` to ensure this doesn’t cause issues downloading wheels on their - platform. We now ship ``manylinux_2_28`` wheels for users on new enough platforms. -* ``NUL`` bytes are now allowed in inputs. - - -3.2.2 ------ - -* Fixed packaging of ``py.typed`` files in wheels so that ``mypy`` works. - -3.2.1 ------ - -* Added support for compilation on z/OS -* The next release of ``bcrypt`` with be 4.0 and it will require Rust at - compile time, for users building from source. There will be no additional - requirement for users who are installing from wheels. Users on most - platforms will be able to obtain a wheel by making sure they have an up to - date ``pip``. The minimum supported Rust version will be 1.56.0. -* This will be the final release for which we ship ``manylinux2010`` wheels. - Going forward the minimum supported manylinux ABI for our wheels will be - ``manylinux2014``. The vast majority of users will continue to receive - ``manylinux`` wheels provided they have an up to date ``pip``. - - -3.2.0 ------ - -* Added typehints for library functions. -* Dropped support for Python versions less than 3.6 (2.7, 3.4, 3.5). -* Shipped ``abi3`` Windows wheels (requires pip >= 20). - -3.1.7 ------ - -* Set a ``setuptools`` lower bound for PEP517 wheel building. -* We no longer distribute 32-bit ``manylinux1`` wheels. Continuing to produce - them was a maintenance burden. - -3.1.6 ------ - -* Added support for compilation on Haiku. - -3.1.5 ------ - -* Added support for compilation on AIX. -* Dropped Python 2.6 and 3.3 support. -* Switched to using ``abi3`` wheels for Python 3. If you are not getting a - wheel on a compatible platform please upgrade your ``pip`` version. - -3.1.4 ------ - -* Fixed compilation with mingw and on illumos. - -3.1.3 ------ -* Fixed a compilation issue on Solaris. -* Added a warning when using too few rounds with ``kdf``. - -3.1.2 ------ -* Fixed a compile issue affecting big endian platforms. -* Fixed invalid escape sequence warnings on Python 3.6. -* Fixed building in non-UTF8 environments on Python 2. - -3.1.1 ------ -* Resolved a ``UserWarning`` when used with ``cffi`` 1.8.3. - -3.1.0 ------ -* Added support for ``checkpw``, a convenience method for verifying a password. -* Ensure that you get a ``$2y$`` hash when you input a ``$2y$`` salt. -* Fixed a regression where ``$2a`` hashes were vulnerable to a wraparound bug. -* Fixed compilation under Alpine Linux. - -3.0.0 ------ -* Switched the C backend to code obtained from the OpenBSD project rather than - openwall. -* Added support for ``bcrypt_pbkdf`` via the ``kdf`` function. - -2.0.0 ------ -* Added support for an adjustible prefix when calling ``gensalt``. -* Switched to CFFI 1.0+ - -Usage ------ - -Password Hashing -~~~~~~~~~~~~~~~~ - -Hashing and then later checking that a password matches the previous hashed -password is very simple: - -.. code:: pycon - - >>> import bcrypt - >>> password = b"super secret password" - >>> # Hash a password for the first time, with a randomly-generated salt - >>> hashed = bcrypt.hashpw(password, bcrypt.gensalt()) - >>> # Check that an unhashed password matches one that has previously been - >>> # hashed - >>> if bcrypt.checkpw(password, hashed): - ... print("It Matches!") - ... else: - ... print("It Does not Match :(") - -KDF -~~~ - -As of 3.0.0 ``bcrypt`` now offers a ``kdf`` function which does ``bcrypt_pbkdf``. -This KDF is used in OpenSSH's newer encrypted private key format. - -.. code:: pycon - - >>> import bcrypt - >>> key = bcrypt.kdf( - ... password=b'password', - ... salt=b'salt', - ... desired_key_bytes=32, - ... rounds=100) - - -Adjustable Work Factor -~~~~~~~~~~~~~~~~~~~~~~ -One of bcrypt's features is an adjustable logarithmic work factor. To adjust -the work factor merely pass the desired number of rounds to -``bcrypt.gensalt(rounds=12)`` which defaults to 12): - -.. code:: pycon - - >>> import bcrypt - >>> password = b"super secret password" - >>> # Hash a password for the first time, with a certain number of rounds - >>> hashed = bcrypt.hashpw(password, bcrypt.gensalt(14)) - >>> # Check that a unhashed password matches one that has previously been - >>> # hashed - >>> if bcrypt.checkpw(password, hashed): - ... print("It Matches!") - ... else: - ... print("It Does not Match :(") - - -Adjustable Prefix -~~~~~~~~~~~~~~~~~ - -Another one of bcrypt's features is an adjustable prefix to let you define what -libraries you'll remain compatible with. To adjust this, pass either ``2a`` or -``2b`` (the default) to ``bcrypt.gensalt(prefix=b"2b")`` as a bytes object. - -As of 3.0.0 the ``$2y$`` prefix is still supported in ``hashpw`` but deprecated. - -Maximum Password Length -~~~~~~~~~~~~~~~~~~~~~~~ - -The bcrypt algorithm only handles passwords up to 72 characters, any characters -beyond that are ignored. To work around this, a common approach is to hash a -password with a cryptographic hash (such as ``sha256``) and then base64 -encode it to prevent NULL byte problems before hashing the result with -``bcrypt``: - -.. code:: pycon - - >>> password = b"an incredibly long password" * 10 - >>> hashed = bcrypt.hashpw( - ... base64.b64encode(hashlib.sha256(password).digest()), - ... bcrypt.gensalt() - ... ) - -Compatibility -------------- - -This library should be compatible with py-bcrypt and it will run on Python -3.8+ (including free-threaded builds), and PyPy 3. - -Security --------- - -``bcrypt`` follows the `same security policy as cryptography`_, if you -identify a vulnerability, we ask you to contact us privately. - -.. _`same security policy as cryptography`: https://cryptography.io/en/latest/security.html -.. _`standard library`: https://docs.python.org/3/library/hashlib.html#hashlib.scrypt -.. _`argon2_cffi`: https://argon2-cffi.readthedocs.io -.. _`cryptography`: https://cryptography.io/en/latest/hazmat/primitives/key-derivation-functions/#cryptography.hazmat.primitives.kdf.scrypt.Scrypt diff --git a/venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/RECORD b/venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/RECORD deleted file mode 100644 index 9ab1a92..0000000 --- a/venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/RECORD +++ /dev/null @@ -1,12 +0,0 @@ -bcrypt-4.3.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -bcrypt-4.3.0.dist-info/LICENSE,sha256=gXPVwptPlW1TJ4HSuG5OMPg-a3h43OGMkZRR1rpwfJA,10850 -bcrypt-4.3.0.dist-info/METADATA,sha256=95qX7ziIfmOF0kNM95YZuWhLVfFy-6EtssVvf1ZgeWg,10042 -bcrypt-4.3.0.dist-info/RECORD,, -bcrypt-4.3.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -bcrypt-4.3.0.dist-info/WHEEL,sha256=XlovOtcAZFqrc4OSNBtc5R3yDeRHyhWP24RdDnylFpY,111 -bcrypt-4.3.0.dist-info/top_level.txt,sha256=BkR_qBzDbSuycMzHWE1vzXrfYecAzUVmQs6G2CukqNI,7 -bcrypt/__init__.py,sha256=cv-NupIX6P7o6A4PK_F0ur6IZoDr3GnvyzFO9k16wKQ,1000 -bcrypt/__init__.pyi,sha256=ITUCB9mPVU8sKUbJQMDUH5YfQXZb1O55F9qvKZR_o8I,333 -bcrypt/__pycache__/__init__.cpython-311.pyc,, -bcrypt/_bcrypt.abi3.so,sha256=oMArVCuY_atg2H4SGNfM-zbfEgUOkd4qSiWn2nPqmXc,644928 -bcrypt/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/REQUESTED b/venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/WHEEL b/venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/WHEEL deleted file mode 100644 index dd95e91..0000000 --- a/venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (75.8.2) -Root-Is-Purelib: false -Tag: cp39-abi3-manylinux_2_34_x86_64 - diff --git a/venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/top_level.txt b/venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/top_level.txt deleted file mode 100644 index 7f0b6e7..0000000 --- a/venv/lib/python3.11/site-packages/bcrypt-4.3.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -bcrypt diff --git a/venv/lib/python3.11/site-packages/bcrypt/__init__.py b/venv/lib/python3.11/site-packages/bcrypt/__init__.py deleted file mode 100644 index 81a92fd..0000000 --- a/venv/lib/python3.11/site-packages/bcrypt/__init__.py +++ /dev/null @@ -1,43 +0,0 @@ -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from ._bcrypt import ( - __author__, - __copyright__, - __email__, - __license__, - __summary__, - __title__, - __uri__, - checkpw, - gensalt, - hashpw, - kdf, -) -from ._bcrypt import ( - __version_ex__ as __version__, -) - -__all__ = [ - "__author__", - "__copyright__", - "__email__", - "__license__", - "__summary__", - "__title__", - "__uri__", - "__version__", - "checkpw", - "gensalt", - "hashpw", - "kdf", -] diff --git a/venv/lib/python3.11/site-packages/bcrypt/__init__.pyi b/venv/lib/python3.11/site-packages/bcrypt/__init__.pyi deleted file mode 100644 index 12e4a2e..0000000 --- a/venv/lib/python3.11/site-packages/bcrypt/__init__.pyi +++ /dev/null @@ -1,10 +0,0 @@ -def gensalt(rounds: int = 12, prefix: bytes = b"2b") -> bytes: ... -def hashpw(password: bytes, salt: bytes) -> bytes: ... -def checkpw(password: bytes, hashed_password: bytes) -> bool: ... -def kdf( - password: bytes, - salt: bytes, - desired_key_bytes: int, - rounds: int, - ignore_few_rounds: bool = False, -) -> bytes: ... diff --git a/venv/lib/python3.11/site-packages/bcrypt/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/bcrypt/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index f2bc5544edbf5a8b2691dbc5ca67524193ed88dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 711 zcmc(cv2NQi5Qa&~wq(n4h9FDcKtn?WoeBimx@PId<-kacM3|HXO0ughZ;`!A(O2lB zXbZYD$YLN{rrg2t)&kv10w3;3-jDx|-_vx#aD94wE`NuN{i5W!g7@I%27?Dyu!39W zxa2O7feU5mCUWAYa_VMs<{}xnSjKKH=WZbvE|CeRngDB-GUcpfMfi=&RWbR(vgs2? z(JUDk0IKh*jRzQ0fPB*o-jr2`=^Q{iWh{mXfHk?UTYX5{-Z|xm!=ui0md+!9-Wv+? zO6TilH%29vDBF#*O0^XpgzMriu0f5UhH-|ac50a_fBke zy%pBnie|w1)gLb|FGXuQ{h?9$T9vvL2QLD^)CLE7(G0KgmD?1()z|(ERp}4fpNM_P eIp3czd9Y{y6XyXr_#5Ih!P_J5BijBH?Y{xX8Lr0w diff --git a/venv/lib/python3.11/site-packages/bcrypt/_bcrypt.abi3.so b/venv/lib/python3.11/site-packages/bcrypt/_bcrypt.abi3.so deleted file mode 100755 index ae9f55b6df8e1b5062ad13fd04d5cf1741370f98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 644928 zcmeFadwdkt{r|t43vA>vi?SLOWz}dy>m^apL_u~Tfmz*XDxk5V1R)TV%Sv`NsNiBk z&2+o{L~CnoYa45;vF)eEUTC0RHef?Q#RYFs+Y<4%F<#;g;*I^j-shZ2X5VI7`~5zC z|NI`^R%YfoXWr+1-sgSpXC}9l2j^rtoeuMt?Ks~teC2TX)Q#vfd1er>631cqce3Mn z5jJP&&Il)sikU~ZyrwvE>9kp1^W#767Iz)y(P4Q`#8)&*KFE&lrBZwIXnl^JNZmVH zJjai&N+~X(j^=Y&!1UbUe)$|fIw%1B)X^oc9Hb-t7gC%b3sgAsNMY$mvCui!&%E~H z9{sB1!C}T%`9^ptJ-70CX%~L{{*m$l^JvERZ9JzesU-gEgUSZSB`Q8sFMiCwNXjvf zrcY746Y*a*{+oNz0>_QV$B&34uYKc*=f8FJ&wexg^1lB)N@z-EyBYt{b5cJMvzr+G zJo|3?K%R~KZ!;b`e1uykBVscR*4tOZ@FRuak3b`ZUkW}___v|(Na45J#Cw;Go*^6V zh5V7?r8vF#kN>WK!AH_3+fGj#{xXW=NOD}T+lf3RC-)$| zBl*c0Hum3c!zbGKTd_^P+-D_V;ecg*ywYijr_}Osp(5=i1a8Yi;!T%*H-1+Js*q^c>?zT#k&uuS*^rjzx=>uUfNuQC)cP+VG-9jzxj_ z6^oYEtgTtTqApysc7Da|m1|bl%wK%<${KlZ<8O|20Ua@4&(waqc z)~;DKFT8fe>gE2`OXo>t=&^b0kepTWxkZb@E9(|5uL&<&ymTpv0j4O!Yt|x>ka`i4 z3?Y#vVVI|8?b_9A7D2nk;T3CEBlN6w;hMS;Ba(Ogby5M+udGJtCvORbD26$USJn+h zf$RBeBj%+{=7PGKwU;ekyBY~m3er`1JzZSCc;%vbi?6SlUkmdsHHk`qf>$qD6~dkQ zk6<^~~HMFn?XBW)UvutX#ajjuNM?=dD~5#$^y5yT~6xGRP+4ib9wH19kHv zSBE7akDypqTpdATlrxc9b5~qn11qc4RV)rKsjZ=?gtUulZop~9nxzrg6nb2=cvX#5 z64-P=6{UIUuUjyGPRWo%4CC_EIJWojqyOBGbETEoihSTwID zJb&%tB{f$sUUDr7L6Ry_7{bzVa0LNF$-8VtxV8+XPDG{zK!MqdBglTK!K}rZxjOVL zr9UGk(`KZCDPe9PI4`_7TmvsySp!K{jc~pwP)GH|3Q=hYKSr7Zt3qqmhRswDNhn`k z7eVQyng!KTXf2#@t&|N#Y;d4VML4Gh`KZn>TCS#U+Y+g zb|ZZDR0nFanrm^SN(6^Ri|Rwm(Wb1ep|Z7Tt*GZii^H`;;%C7@!{n($1bPH2DT12S z*E<$p4JUw^7KiJt0fLKHFOMu-|7wVD+*!R&og%vNfyWDG+DY zRmkbNmsqb5?;_EHg+-0J2>Dl!_G`te&`L*0v1@DAEm|V7HUljc_2Cezs|nXB-5jf6 zFxX=0%0)2uS}F#iS~NE+S6sb($&y8Nr`N4Hy_l|+(An9Jl}k^9Nh9^A)t8)o+SyYH zp6Qqy49uFn=*-j4a?G7Qd(qU>&pf?IoSijv#2ppp%#xwg;;BQYXIV~%!=82eFfJZ` z?#$Dtp>L4oa1Q-PXW8P)2}=LV!F;j2KS~{)m>HyV^MCaG=%Fi<4j)~Rm*vP4Qb%Ft zGz+uXQlj~<(=o;|R!NYO=?RjM`R_Q8QDF36<~r!WwJUeIKr?tG|H>`8>yiidCMnZVb(o{!v}e6W7^} zzYaa`azxcVlGk+mkI|DG=h&{;o#J||W4F4N@sAPllTLpU_g#*c)crq->(P$a)phvj z70@Tw@xHol5%+T(pR4Q0F?1gmQxn#%U*ZOS=KOVZH9DyHxfxF+1$N{!9#!1SxOrX3 zxI?WI_!z%H@hZlDq<9nKtuIJ@ni-EO-p2VqW%zc+dlm0syjsagF#e{}C&~Ch#Z!zQ zQH<=R-+h^OK3(yA8(w6?b;f_Gr6YC;R|iJ&xTjo z@DStgD}9=5c&iQXu;ED?p0eSN`!myP>XUE7i)^@V!>et0y$x@+;cYg&hw;!SvRDr? z-kz4+@jzyJe=}A3Nj~F~r%7I9!*#|d&XM7(YrHpXiLGTwv@@3G+n zj3>V%<#?&%fS=j^CLU9EV7%EaxsP$jk+Qwk8TZn}GJe&J`zA^rWqd%Byp{3hagrw( z?=6$Om+`2QlVZGhp-iviH<{_Z?@GztjGN&L8UK|E?_=ByUuDBXHoVD(x7zRy#&;-v zx*303@gBw#il-Pi~9d>1F)xE2P~j8GnZ+R4LyXKj$jRLyY^>bvxsx`~>4= zN=}mT8H)EZZp!ukE;C)%tMEmP-=nyX@uB=>+|;v{anlaQh^pDlS0cClV|NWap3nF$6~2)1BiBedKE}%xuVnl>#j6?L z9FlVCZFsW{Z?oYE8{WhC^D5o}#y?ct@#jqYnBnso|5Sx9WPDK7S0#)WDL>H}AAOy) zLlxsL#cLTqLh*XWx2Sr%iSbeuzJ+l!-ZsX~csm%MspNDsZp!Il{HH442N++VZS2BK~3SZ6mQpH1z-=lbx@rM*|X56Rpv6XQ%d^_WNl$-?PZz-N+ z{A0y?89%08+F^k4(^dVM|CdaAR&SN{fS2(iHGVH)+#IJ@F<$wIlvB^RPsxum-n?Gw z*~0jM;_WuP+lKer@If2y?#Q%*8E>Ht_c7kHL6t`v9eI{k z!-@|w?ug3p?k$;iFnOU3_u23&8y>RZO*XvMhIiQTqzzBmaL3k>)0=O@i)^@V!>et0 zy$x@+;cYfNVZ(cD_<#*}sf9eVzhvgS*M^ta@JhyulwVadZpyE>;mtO@&4wpzc#jPq zV7yf6>3Ss7A589L+|<9shF99~S{oj<;Vm}2-G+DD@Ln4}Xv5u)X4=6_Z=ntMF+ORd zst;{=i17_7d=uk474KlYXaY6_;+J6DM;o5;OESJw^>ca|ze$B3WIU%q)rXH|+Tmiw z3mLy#aUbKKD_+TXpi#=NW<2^$nXY=qi-MB3Fz%Qlc`M`5Qzh@<{BX$=oU8CXoU8D? zjQ6T|2N`cxa$JvR+U-7--h9RriWf58sdx$FW_X=(x3XI`;~}MIE#v!@{AR{|=PNri z-aB2{nejm-r^ALP8TZbVa#D=D?~vS;$h2Ga49VS$-?vHnPoWL>+3+gHKUZ>U88_ue z84r9{#@o!e8NSViCv5lt<4Kj?LB`)v@wz%Q?PJF4W&GE-Nj*y#A5grKalJ`~uVws) ziq|uKkK#>?H|xqz7$2A`c?aXIN=`T9_bQ&U;jV3&cDP@K&u9F96)$9bhvFrScPn1S z_-@5(8PCzB-Rc=P<85NxjJJhxGu{ryUsmyUGybLGDaH>eKFGKkK7V_r-A*!;pD?~k zah>t&6|Z94Ojj-AQ5C+P@oH6{H#457kbcs_cvOXNWxP`HHpYLb;!QCAPsIlq_kCN& zJIMH@-;?$!d?M3sy()YW43OqDyvt1prIL>V{h$tK1(C^@Z+CzPBH z#*<3V1mnAuoE{rKV8dO1%e0Rv$IE#0_hovE7&pV~HoV$~*W2)B#!KQd-ZsV?6z^fY z=yGZQUdA2YQGUXBbCu+du1q^3dwzp|4zvXF>cDKXWW$2!npfN zDZiC*htem(xGBGzaZ`ShaZ}F}<7uV8V@IZas+B(ZjQ5_c?8A7a($mNI4gVwUTxG*U zj5}_Z;hPx$j^Z7R`>vAu^f2DLO!8jFs~1b2VtlWX@9567!^w9@eexMkESGYM7&q-x z$#{FM3?E`Vq&|>P&v>uvE%VGTt1Qyod1)m97CB?%J7Y2Q$2v@ijk` z_9?O9m5jfq!q+l>>77zel=0TJQvVjlO*?lmp14kiPcYtFCwVvH_o{e%7=Kc6*RD)E zw5$AbGv225CwLjZ;zu%FMT|#Px^%|9O8-j68{ZytMOkT+NR;7=RaWi}s;|G=eTE>5> zc$D!AekS#4Vf-hGx7+Y;8$QUm?=ZZ$ieLWIndwd5C+%6n_<-V7jJMw-!`CzJRlJ39 zhfBuW%6L+RZ)3du=Td$<=gYU!lUcGrnH&1mkA9dTjWB4R`Iav5yTevEh|Ayw-+C z89(|Lsy?*g?KZrd@!OSsl8ld4cJ5((lH$FL|4GS7G5!O^2N-`?@j=GTcpZB)?R>8a z?_&ICin|&Ao#Oe7oASMk|5$}DWc+@`ix~GRJCrb9ptz6m4kbrt+|;MihF3BELnWu0 z@%t37Wn5S7V~FuBDttZTran=|?^fZP7=KXlX2$=bcnjmb_e#HQx8dE4zyF8~-^+OA zb+X+YWW4nY$sNyT`cJdsF2-B0l;PcsM<12(7TR#14X?7{A;!;mOv;Zko>cL+*zj(~ zi&n{f{wcV0Y;?0bk;oBI`?vm;1VB8F!WPG^_pR(bOS2FEmhR?U*MK)Zw;ng<0-i9~Z z@HQKsu;D#6e87gg{+?-vsPc0!@m9sF7*8l(&AGBql<^|vCrymsq4aEF+_X=E@uaFxx*2c1 zSn8i-e20=h$hg^_=J#gW`EwP%ka2SyRKob%Ps;M5Gya9*)r=qilnh_bxH&#;V|?H$ zRo^o1s8{}J!+RKaE4%eF?p1P9Hhh5bpwi#*YNp*TQ{2sXNO3RYKT*7h@y8U`ZFn`~ zhdr(A$@uw-H!*I8Z)Mz2;oBL1O7U*S2NmyO{KVZ-p8>`fD(>2!X*ZL5ZFq?duVj4k zGcw*<8y>acEsQTva@uWpH{+XC_+G}{NvTiC8=2`%&X?;%KE`|R6w6!=opJY1B(LQB z$C6huUfnEtHRB02{}5ulUGXU6$)}{8X2wHJ^8J?<#uG=%bhR;F^t3F$9gO$>T*^-{ zzEgdlD#^G**{z512a-~sUdCrWCwYqT0ab4gFn;-6QlI=cGxMwH2wBf~8IS%!hA-rN zx8y~P7pZ*oF@FEkQqL;J-9MCet7be}D(zg$_~33Sr=IcFIa2>9<3$tjpXZ@{94Own-jkJo;0a zt`^2CFOc$E8IP*>VLKRa-6iED7?1u)@@~cx=gE9YGG491_b~p$JyQP^Y;S7(eAH z8NQnF=KCeDWqjZXnXY=qqkoa%ql~vMkm+q^+@thqVZ2iH=UW-CzDCOF;QVJY-X!C# zFH1dp7>_aZ_>+%enHaLB^|nD!<;&%&*FmWxQ_2qoZZ`e8!U}N$zF5d9T#7ka72g zQhpKRN%{ajekF`2R6VRS-u`20w@SvFS4;WTjK84z3AK!y-xCNi?pP${)HDA3gizBF zWjt5ad##LDcSt?k828;G<##Y%t@?Ed#w*9l`l_4pgz8tM7>}xbn*)qDkCyrjGTu5} z`9puEKRCuoJ>8stq5OgIq)Klg=eJA$^fBH#TFS3v+^hBpS25mvq6}Znc(Oz4Q_HyT z5*a?kc;aoDkM)dyq&~FY%=o}KY5x|+o1;>G8{^exKZo&wa;awrXT$VdYhEr!+3kP4ByLm=tnYN1{nWrhw>A~Th;e8T<>K1iT4B2$Fz($X^F?R;*1a-(CF9W-r5&mmPyAZySpYB#$XPpbZ2l5uZD%1JR^y+ras#=UPyeO&Km`cKij(*9n?tKHH*MT|$y@iODh znhambc<2PFPc7p~RZc^US1yp@>lrUPL5}OAjQ6Sby@~OwRejRJcr*RMBm7z!cdK&U z#<)ZESKApsT8$Sv7%%#}v~v&RzTZhd>1BN2EXh-hx93Vd9q(o4mv^${F2)^dJm_Y; zw?*pXWjw0duR_M#)q5F5jQ74S%Y~2eR^{haj1P>J>8fVD_fx4)i1DrT2fXmBXWadJ z$)k*W&31utpG*2-E90#br9K^u4;(Lfg7M0CWVz^O{EqEXpCseH*)m^x7_X#1q=;WH z<8Jjm(iG!SGvD9O%=gMR8Lyl1#I2GSGX87TpDAKIFv~xY$+ zj5jw(|14DVif(0I^AJ+wFV0(Rc&(B{R+JW#lIks7dV=Il7A{M=&X(q&Rz`{?r@Iebd!@}LF{vmr7S$MvM7hAa3!q2qu zDhof$!fP#js)aXM_%sXeu<)}jyvM@NvGA0Imst3Kg_l~mOU-*wde5_PpM_7i@G1+R zVc|^{e!hh_Tlh>1Z?SNng|}O{-@=m?KFh*;EPS?w_gZ+Fg}c=Fozh!w;a&@$W8p;> zKG(uaEL^v6-NFMF9<}fbEWF9WFSPJh3lCa&%EBuw+@Z#ml&*^`+-KnzTX@vMD=oaq z!oO|d9Tt9xh4)zaJPYr&@c9-#VBrfa+@Z!9g%)0I;a6ICvxQ$};Ry?0WZ~TwUTxt?3tw#E0~UU@g%4Wz5)02) z;}^2$QVTD!@EQx(Eqs}US6cXT3$L~CS_^No@D&!`Y~j~fc$Pzuv+-Ec^xwPgr=p zg(oe1orU*W_>C5xvhbTM+^zbt)Q3IS!t*UWV&Ps3x9V>R^54_{THwDH_^$>2Yk~h- z;J+65uLb^Vf&W_IzZUraxdlGbj{i(=c*mv3a*gkdcIcZD;jDC0Z+ODBU8Foc?dAES z9qE(*j(@euKAh3D7&-R!rtv#@FJ05reqT~t@1kp(((g;)dVy}dk@l><45GJCApD|w zX?G;+%I$i5+zS)HjUBr2f^O_edmgG9?O1lYHn~xR(CP9{UZ)$M z>#@;#e5^w+{Xo~|exNrT%JVycN!@rk?OA^1Xve06 z_M-%}Na~x?+MS)Q&dAL{D?HPCZXh+a^EA4r19-XB6SL&Ny3D4EzxjEIy zz|ADs8f#?szmD;fg%o4tXjmrM?+qG*{l`MQZu~Rtxe@NtKMrQj(~W&;&pgCjyc4Dm zYUP7atissf3K&-OJHMAHxBAX zS1SCvL-?DYYza#Sj02SQ4L8D!%Y(72VaC_B#yeoDVC>vL!=cgIZNC%t%PAoH>Bd{q zCyWo%o+6P5VYcZ7rrESj-=l|(LqTJI!1yBV*^7(}8tJs>?n~&Tw|@cKV@P008U>!j^vbgz)urY zf#BGKg9D*cqBx_(2p(VGk@kFvyvwkU^s3MF_>845<~kmuC5g1>8DzCKIZ9%N<6l3Z z8<9bX#Szs&Ja^9tPKsIR^K34iwj*+}FVHMB2;B>wz;(A$q8*i4+7p2uL-iLbFRyN_ zhq{r0Wjo3TAvV4~mG+wiZN9__H_tqrJ zsf%2}c<#r?3T;}0#^`IZ{8d3?u1jxN?#1mnZUo8KjT=z#=HiH4dZtpzj?eJDkn6bS zl&jL7^DY`Iqk>SYnie%6z@9{OJ!-xB{%{v+foe`9v+uzldd;_@^|B;OQFyz)c z5%&cy-Izu3e)blncoyO%Rc1j#?m0r0S%r9%RB5LQBfehbX-JG;yQKoo&pT>zjjA-`$v@gL2&>NP1AzdytPBOx0w)!$lDqO}k4b6dp7ULWb%Ov>TTq zU6$*|C=Sc@k#OYUYtdPv`ZV{de;4I?#I>_RJlsgBl10sIh0~t(B-qj;Gm9eZPV&cp z9r-J`{Iuu0sQE|Ix9cb>ME}A>r0>yO-f((<{B@pxDag}HolB9PWnbs{yX~Jp^mXiU zx&8CIzs~bVXFM-DNYvSc74n1eY1?7iN6|W`gRvP8!A<(Vu?)YVEPQ+yG8uh&&dd06@^bhR^Pa$-}=Q-i$`nKV$ z_}#vJIG}$q7XP_-log1-U>b~v3*5ojX^n6|5s7NAMXP{Fwvu-K^z%beYoSDG-8WGB)He04VM0o{^hin_vJc@(edm+T4?}Q z@;Di^_(1Vq-Pn%7*rr7NSl#H+jodlNiYvCKJ(udE9WmFYof}dOpE|>+NqZVTJtgu_ zeFqJ>P{rpSCjwICL;mrVfe8BZ*SU3cQ_(3a4H}>6#!IQI(XHw~o`wrYqGUghw0sX` zaUXifse>=#RyKP7qKk^2X%KyUO9ww_ptDJRe9^xjHYWO~@X8XsA)SttKfn{X-pa}gTK38VVH1JMX1 zBCj(eug8hraFffSHLjx5I6C7E3FL2CflrT@k0W-4v?}Nq}%@iK9@LlssH1<`rE~ z3@Z?zL!w+g9Z7TdwxM-rdi>zsh1vbLX!b~ z;}ewOLnUsz7^a?DPH8IXI|Wsr0LKFK-9=aN8Bd~uLs!m?A;)8dcsA|%HImowew;k? zF`3{Ph&Co*bYTD*K28i6Ys(Pma3G;`>T<;2pG}ugCMc9Sn0oF#6imG*M5V4EULlW5?l>Q?8$&0M`pWV`53aLDx3510~Z=Vcn z&SoYqngalBE z9>r_uq4zmQ1qtoxJ=@8xuAFL$zuT6U%CRc%(J5=aOX_R#3tHvnVx_m2>|dBm5GOty zh0?VYbrGQw8ru(*6K~p+h9mYJV=>3?@m8;Cj<>}?+RWDf+#J7z@SyRhubLz9Yh{k0 zakDT(m6mA+VZg7LVc0yv3@}ftNY1c%+QfBk-;+`tm1Y?E4wVjR9@-ybXC7fXIcEXy zNPBu`!yzzhQRxVep&5y)wC8_)R2`tL3C2W!W2vY|d(cN1uHx3s!DDEa13{xCXoOI` zRik>#7VffRwhIct#H#=X{Y_q*PW*5nuJ*bO%a7uL%&EQz;lk-p|Xk*aO zOU)wV`cE3V2%|`c3#$52V7H?^3g?MQq)%s3Ec;R$-%h8ShwBe%#m}jpARi~c6aFUa zg79LqFjmp5PBpnd&Zt_5=iY{w#p&El#VDW7yr6~{p;B3buNBF908Nlcl59Sxz982m zXX>9t50kXgA!+g4NQMmQbR)|U<`gXeN?&2xbJi@R649VVkV@|VrKu!JkW8U$^>*%* zH%RB_GvfPqI#byZjUD3K?niuZj*xPW`n0F{eCZr$|H1`m|CY-34~@~Vb1X!u_>QMLBRR+MsDgxZAonAO_aCi113Hc;o$7@@^v!?@@Q3SC|I#16h9BI5NvyB> z!N#LW{(tTV#Y58KxvMf{{3m|!EtF8IGi8pOb*RNJcD0&HBb4xX=t><8|MFqKcsC>d z|HLnTOQkK-FY2d{0b*W#qnJtJ28IC-eSielZF)*}wIRJ?D|&eW}aeOsCNq zmg9S~zG!%-K49z)7%z$i713P?SDRG?x&lG!3Q#)(WBOpsrFj33&UGr~m2`%JlPkx| zIR#V;h!=q9#B0_NJ_;s!g88C`@YAy-?5H7O@!WZ0$gM<}jxmx5vx2DBjW^Sti71<- zAg)Nuc<%O}O9i2J?is?Qb}~hpq*|s-XbPDLDoDucYE=cG4-h{WhIYdQ+7yV3mC2;L zvAiHw4n9n+M6|)!^a3i5XhfD$4=c9?Eyl1bl#&O-73Tcg_T!)jAxCtDh9~MrsvizP z^pGE%)c;LUKTI!hguOzaekdy16{JX17`39p=qROV_N9EUV+bwRSJ40LMz&QLyDMlp zPP8Iz0Mv?5yIY(HV5F(tnLx+%mk;H_^qy1xfrD1IM{gLw3ecUZBh*-spvP2YvqE~5 zS$b8AG*p_UYvtjU)33VL7-5V5*tH(P`-D|!4{Mo>gcpm zLSzdB8S&i3_{0c3gEmg}RfK!Tb8AP*8>n;|3#8R#3wnl92EEbmEBjzUg=CPIJ}6R1 zHb9}#&3;}rVnsB)6snT$RLNf6BeDiW8~`^ zWiAND=6Lnk^)T@C>x1!}U3%$mU7NKVmxE+L^kr^FUj_sH!XPe-$etzAz(E=|(=0&T zQ*=1Ve~Y^P`Kg;;CIg8cp%^ZC7QUS8*h1TEp#mn(DvZI@jxR7=Y@l+69vOyp%g-hO zJ(vTj6muXLYNFT;-=8b)?@K+?i<)?7Do)JbQu(9wRI3Hf*c?pBT%RwN=$u^vjOeh| zy-N+1b>Rlpjflkp_%is9S^y_xu7KZSSpgq|8e6P@@105~ss1%IrF8+yTNZkF@N&KaKIh*> z`T@!V*1(UU>fgl{!6PV$mPPQ35V`##xSNWESOnib+#ZYEFR7r>`r~8)=L_1co9V>( zJQ&k19A3^v6})lKiOPUB4PYe*Rg=$Y?tCa82$UWOYI6=;5TEGO)4Oz|TR+&NpO7q0 z2M)d&x<=nhR>d!>PeCC`-hjpJomlbR+wak1^IR3$L*3*<-XN{`VlRd$GQx?1r~$pY zv0FE`1&z+sB+QhMqln!SqGrih_!YY)s63@T`^o81kl@cWsEB)x7Whfv;WE&?z$^fm z+rf&$BCpsbQk=lV^Tl3m(-%-V7@zS^bixAI_OYiI6_d8WTwMMhzqP%_%#YkW6yq%NkL zG0}5N04wpEI<-x2lBS8YTKv1zy#6fadBwpCBsZZ@%a!SaOr8Z_EPMjfDj+U(-tJeayHS3*Bg@zvqVk zV;xV_2J;JCYVG@25;g(Ph?#0kx5>$BY65Ap`eqmporF~Q&q~Kl3rT)_#(6y?)$<&r zs<|-(x}<)Gms9(?gl?DPnzCao9`JX~DRA}))vT6UMm2dn_W=lz7Djouod>?1LQy@I z_MCDSlwOEfFstU%Hh)5`!K`~Q&2~iEvkUiz=HB9fq<+mSP{Q*NZVmgITrU$H9}oU=2QkmDZ#iP|H*fiU$LH7T#ohXr8$b9>#kO&K59-Cc^t^46IlfRN;H_AcVPnuvOv=!I7w8q^qpXh4DbAO7_0je2M2c1u4fQmM~y{;R7>-((;w@*Y> z@4x@D>yC|W5mBwW^2rxYt?XZ-qAEvJE<}|J8;Gbb5K(&ry9$F-=i1 zQFk8##>p^`yK$NJ{N4<86orb9`;=V8z;wLNHBp2g_d5-iz76MMtwT574;t@bhfLb@ zM^vYf_b4j7;jY3}QeI@Pbw*Hb`?(1ON8k4-GVKA|&FnV%?=BJK5aD3>|?`+X2?Og}ts2TcG^frZfiBa;5( zfn>~+Ma-9onA543d&q6ksixjT>UWsMK%XJ?1ZdhbzBtoC<$N&p2Ve(mblZS^dDpws zo~uL;h^i#Y;vbQvs9=cB$A^$1nkF*9dP-R^UgyF#9xN?HzNKSqf_5^D?E%vU$5Xw0 z4Z{0lqv$TCY^c-XHJf-;BC6+!_4J#m(jNEmI8lpu@F?y4$w%ROj4}l4+-D%st*9A3 z6=FX+l|syzgf3y)^K)2|`aqV*ZxW&2EutIyQh$4qlCR;)wtQkpLjBi(@wDn1#n-tW zqmeu8P2!Q-8-!h9mSB7-nl1F-U=pmvEO4NSD#Bt8?GK~jTZuNMu^_50bZrWz4?fb? zpl`iQy9G568unUL_+G4Vtc0DClxFJJ%_RM_HFt_faS|*D_4Pvv)k;NaPt|Fo9S6{> zbcWYZ29)UNVEG_7SfFP}pAYG1TS)q(0%=bt z4D64M79rjekJY(~6Mf$o3gk{jZA%4FI_mS}1mqh}io4_1JU>*h>8)z&KO)hzy6VLx z5-{#0#Ia1*R(H}r-OIF<-J%&R-Z=!5fXR=vTjsg&&xQF~Ap~d>W)~uR zgl=Flf@U}=w}yH+S8flYca5$@FIDuIH(d(fijR9^jBuwe9LSx>gOxjd3&!j_h$6&4POjllFM;%;ZSkcxP|DA!&p=vdmt9GNyHh&AN-1=LHd#xdBx9F1fP z8oJ@KSxP>L0ffiu%w;IteGNzsbbF<1q{3Q>1Xm+~D5Z&ITHT;ambdu09S%q&>!4tY zL2j_1kcwxeHUZTU^sL5BA5Ru{5SHn)KpXE-S{0nrx^3t9P1<6xxM>?tR)wjno-w0R5z*OYRT$U|fDi?4v znpwt~MrWwRJ$Ylu{9?uC5S3{3hKI*Xkf+m-7o{jS`LLXKL7wN%zm052^2kr9g`$%Z zvL6W-QOku4aW6hChAM)5CqM1!Mt+;+OSQdkrG9uvmbmXuJ&3aynnt7NV3G!@VuZV{`K{tjnpJBgTU7A|h>b2@UkL#sj#(8HNxEob_+8>{p4+oORyKjxV&v zM{sA^7Ap53wRgwMji_(*$XS1>+y{Dtx9*h8@6i(u(9*Y6D&+r)O4;YzSPc69l9 z$3*@XXz0udG;GTWlzzIlzyHCZ@#!*u2W0x6O)M)rVVl-i4o@J-zLM$VBd?Wdo6E*K z%g*&VBQJ{cESzUWp6oxrsD*kpNl%oLKhbhpFIwbvEMP?8mPWF^;$&|7{dS z%T&a6#B4tmVcm~E>Y*5&gW>ly zuoVRF7aWh;!SbHQk0(&QReK7&VE8?ajRMXCG}EW%+;o~i+Vlw(9MqFnBfv6D8yxdA znt~nTV^xIf6wU??#)`1FKXMM5$oZ(hX}`4IFo=CZBqJCPIR}E;!_!J}EAkdSdyaZ` z$5VLLK;4$R0d*v`3^Zs-dnQvuLro}^cIvsvXlXbmYcO9vZoqFs?j1g=uTiO$x6`d) zJko)Uk{zi>u)!bm5ZT%fsL2l){|q#Axhd`+o-C7dp^RH~)o2r%Zq6+ zNTmiF&CT8IalGSVtWSuRwj4PTX-~brG>5{pAzRu~cl{{~+TRZCQ}m4oh*-cyV7LBI zV@)Ea&886X_3dfT9vaMWnWUn!INkHpmx<`uoO zllDyalC692-jV7e(k#z#2^^}g=BXV)VpfdwxzN<-V2`$uI&ymKN}-M(f7Fdy^|7Df zA54-K?@U!al;da+5Mv851fuSLc{BctYEw3a5D*92kc~s7Jow~6?%m$xl~*KJkN;U5 zsD-Efd+_&gI1u09RX4UaLzlGYPSkG!`M0;avV}29`$Nd2iAPee0Y!DkC|caBTS#j6 zA7?(?4h9pZJ@fIrd@x*!zS+=*37Q2X=|v88MD-jzs*s~Mo#HJ zN2iiUzbHB{1s+Q8r7k_)NpC*EdGJcjm8jJA4d-|I7Ng7Ols;$kfK2;R_z4%-E8J zio0=dc&g~MUL%UrY?s{GqBTSjf@JiS!k6*PxnhK}g=U}|_eQ2c-WcP9{?$rIq##;9 z#t}I+T0hniIi+}Kw0@jJ%sEGn?!Q1i6dq4u!li$3(%r~edIxE7B>ux9lI+|X*?#=t zEKx6SBaXhGWk^}PSKAyKM^Wg;mB^g+$?y@r#siTfw9R`P_B%WG=QZr|^?QKAqqipT zd_R({?&R(9KmJAfV7lz25`W$^{*BMjF6FXVbq=<0o&)F8W5+p;6An^l94a&R(+1|} z;p~wU($B)_&@&6aX1X476tOFn@%|ewjoIkZQ4t?bLF4%-KIAbOiAbMZI!RPMjnGf+ zw~x=b=UCLGtz9T?4INY~I?%F;{*dXPa)Y-QSxqwn&dAYQ?t%1W%^x+>XwezTi+|g> zX{WI#@*XW!3{RquiHt-1nBfsSk1#67OEcKR{UcOE*uy=ZRLR)?j9zAVjL4VUvf;dF zlFGYyi zW!l3hMV>>V+i;iq3$g67(%#6q(e-V^>HXVC=`Ax}RjGYJrS?Ti?c=fR{zkEMz70ZY z`l@Nc@6e*Q!B<*Q#k8a=y|MDP+p^no!pCGz$-@j{|9GFQEYNHZ&0k_k(GKIdcpTe}~GSUcH zir3Gc!p0g(=a#bANzkLAHyef!3gp}tbYheEK)M&rz^`Rn-G)d-{{=_!UZLz_B&hll zFVD32viGRzo21NN=ron(wCxprjIKzeo#&8=k?5z)&kHo7*_5?~@cO&ooZ#qv>~ zcyxZ|BZvs43YxpFK*u5uf1~ExM^VwDqy-pf#ZrUqf{r;9%f;<`a>`i-KLcGwc@CtghzQae) z#-~kxI0q`d08^W{Xo7ToD)rjWFu#GB(et3saCSFC&6m*2LssskL+M}`3&gqO(ThX6 z!+Ggm<#!mXM-c-8&UjFSpY}^SOu?%a19;JRrrtT2tvkE)J%_>*A>hxl#t6I8y|Nsc z&(rq@qBCmntRwQR1$x7b&kz!dy%8P@(Hr)Ra-<%7Je^K0MZR_A&OkUhPhfq%?*`n= zXecU&cOGoo8+QAnGtY>efPDb#&g~NmX$E@A|4c1_sr`?Ty)n0|_eU_`AbdVZVA%zU>S2JYC()yD~x60)%ZT@0#w9SyDDPKu;7BFwl`Cqgs`wQH;CR%W1@q;Vd#JS z4E$S$cW&mMd-KWZ@W~bDof4Ud%)JGFoKN(gN5Qj5(A=h*Pj&>-Pap1 z9cyF3DZP4W&)VXO>}9kpWs$)b%D`oT@g2`Cq zA)WglDldK)&c6?TJP`WBcxg{RT!r$2{Px&(XLRO5yiWwTMd$ApXX0keMIFk%VO01q zngEO5lAXBuz_N|EIL}>(4p0BPY`#V}l4aUoFfq8kRr|}LEPO9OZ+Pnqzmd>8Q={}P ze`#6r*Za4wbLt0Q^`qgztFmqSp11WCyAqd@3$5?gr=V}VzP-Ho6@BBU5=IhbM#XdJ zM0C{UL;2#p#fkFb1Lehd4Q?lF)z^&t_OIxqz<3X_crU`>@!>$PBODr#p-nupJ91^S zzN6FkAokyCn}0T*9xijz?AV>-J8@p_{7l>Y$oOpn9|Ue3za8g(XTtA%soeRj-}z;k za~t@t#y=tW-*NuP_`iuqX=3e9^oz{&JVDF;h*wUnei!S&y*SXhDK(%-5By@pefyDc;z_* z`KRnGGhX8C$ugslv!{(cnFza2_>)tf)HimC+=-!Uw^7(p<(Jm*Gg=Xft#79xL1PNV zAQ&r81Y?*VibXomKf^YNu|cRx)hml=n#+zG| zkv>3eb;gPV(nuep?+<-5*ugS*DIb&>|K#kWGUGkYKEXx= z^U>X;$dq0E*h?zYS?=sFbM7jORXpd{9{SYz`4$nNGd?!(m`DKzmfAyy^v?IsSdkXD zKA#nz{!`~Ov*TlLnDR_~>|Gl>pG{}MV+P8cgJsU%GAB&8zKvF6zA;8|}c1h_(NZb?_qWD8>4! z4@=V1zWJS8$5z@dd1bm+J#W6h`yT#UFJ`Iir-Wz<<|Q|4pUwFn^c6p%kIRTD4n3}8 zi`7Ilfx9r@xl3>OG|w*doFvfBCh-b; zhiEGBmSt)m-U)43pLB*#K+nI2CNL_D^HKSlyM3^GimKN(^d*o-J#g_}0qz1&?QKRg zhkivq-WEg2s6n-b&D_}15=eJxO-sb($LLC-AwTRGG3O{6ivLB;EgCD@4;3)}hL7)v zy>p-8`zPp_VQ-wft^ldi8fo}lytCOKojw)~;On@eDUH%+BJcJ+fQx`w(`@J+MAH&3 zEZ%A6mkR$U8J@oM^KKx1G4@+^Uq7n<+v0ReF98UQgc8EZ1dQL^GEC&tb2Z1S{ z2J-OY+ri+J9l^XEffM!wPWUuXx+ju{^-4F1+!I6xu59genI9nXfoGy9Rx{x_F?5rwAI+x_nMBk zxWhG+f^?$(N{EV#hQ}7~?4L-E8@pKf>y_Q2jfeAQ`m0#c-IhA_FUnb;a(h{Wgk{x*TdSF z06Yo0(~R$L|D4euHT_-mq0K$Am|jBt5pLUxS7^I+kJ?(9p5R0#e3*%Ep<&c8TDkdcH z?H0Urrn$?zwFzPahTL%=HVwvST(>|h`u+gVVh`XVM1{|Ky!9Bm4#=QcEFZzx zswVo})p@~KO|#yxz7>;y!a`IdVhXP#j0Ni4YtSN?RvJg8lRDGC7a_Ly7m7~|U?S;t zSuU{w&su2vPDVH}*$&Gk#H^tDf>uT87usz{<1V^)7sRKdSj&BE{YYqq6CccqBrB#I zL>6Lm=mZ3t)m3&@)}za2?Z`Rn{l~G0g6?D_3G=pT6E=~L4~=&yfqy1~elUC%-L57Y zDKs|0wn%U@`rS0KlL$^32$rVSmLcukScIL55{$2OVc&#M0LnlCG{V1EVbSVjU4QEA zuCl4nV)l-lsl!_Ie~+pz)G>HI)&B=thl(WoAJ|H>N$O7OIe}}s#jP!ni8lI5G)KZk z@Tni=BDEP+8GW<|oBL9CDVb0`L6ez%Pg1W7af&Et+gb!6=njeR+k?BpdmeZ~dC!5v zhO53iO!z8bzjCUCbSkW4oHtrJ)%J(Uro;0!_<#lN7DvrAIvBgf9h@?VZOUs;q=8e= zDci*&RJj4?KB{(#6O<6KMHaP3!1!1WX;M!^DjKwk*amn16Xy4fMEi~*;pZCQN^U`{!mgO)WxeN?+jWqd9^d<t@yMIf?2#yR=)sfRhD{ zzfs3x%I?TXG!UWzlc;~cgf)WB542m0avYAXxh`klZ74{=`1JAR+UC(%AD$6865p_J z?$K^N79p0=9?ltk)Hk7T3FzoxmgPF8qpxv01YzTQMf@@+y619(BSg$~ZbevhN(N_y zx6DQF6rb#fQg0^)ToGTC6)61(Yp1vf#4pRn1Ix1l4PVUAHoZ;A_@rXWKXel3!-Smh zWRXQQ8Wepd`U}|TE*ymi&PND6y)97sLgY1-k*C9I&Q9&tn-B_VbBJD#Uyl0G_-x8X z1waExj2$sZe5Lpm=vPpM)sz!x$>B3>K74`9W4s-7eyH6#3sMej!*U#ber0xi;@Pm$ zCEDghXYVo4d#}H9|3rV@HVj#|clM6gHb2|B--S!#+48(+vE!`L5veFM1`G1bj8_82 zQ%2{ruLX@)(R`jG%>N;@*BU<+Y1j!}v&x$0V)yICZhgmSK)Cl;_P=6}kk8+6C~NKH zU}?A3(1K9@&bRZ+nqcE#9Pbt2UZgl^B&hnnR;Nt9AEHEl^j`_6HJ%LvAhPWKyG56y zZ#Qa%iqh`7i~XJb?y{zZxlUARhqT6<@Ek;D`5WFE^rOWLKS-gbG=+1s5a3I#k^bU1 zebN9@BR`^Vo*V_;(L0&z?wcj!$kBJqbwfo*-!}nd1_|5u-HJ%z84FKFPNKWBQsj3G zAp`M6Ipjjwo=PR08QuEov1=U_dUsP%C&(NDyVv>9U% z3-%Anivy3*MO0oqD1z0=i?QNjnY=hkTwE?M4igt2=c0Lu&+v$gnevWTT%0K{V&dXt zap5@|7mo`+pnvdQ9kOeMM@8v2?Y0#-xgeHvwyvR@w_We-KNoH=IeS*qB=K%{ zXaCfO*JdiT@MxzDbGnsb7L1-Nv@$gA#7?v_>_R0r$;xt#?VbHcTFI!+l)IsqVjP`) zL9FcTQBZ7F)54>%UDc}H!lO|h31p~;I)+$=dWT7tp`Q4<0aFhjH2R8qrIp_!+M^tsCOh&?N`ifbst@nCbZig z#K|nwV`uw~7yX^@XW@M1Ol07x6X@)0XJUVj-+14jct6MQdJz@giw*nXg7c3;kogmw z2s8ieEMMY{EWh!BKk?ouzw13z2yN6t(&aPZ~Ricn9zvL|Abeb=|o4U;Ece=FC_nw$+HlC62gBj`K>0;2G2P|pCR#eCeDGF zsStBWaf?l1oL_Woo}9q4-ZcY=6&Gr>^(A&*B!`9_&Z;7SLAIEXiw7j4D#m~ z3(rXfI{UrL=w#69TCLfb&Jn9?U$>FAje|Bb>L(Tm|&`&mm+JxFol7^Aw4nMQcj#T$3sSt zS(Ojz79%V$W2Lo?VI!2A_!wY|5vH2_*i0jwWb#P}Z!yB*COq%t&HoH82J52Yi`R7r=?b6YPZgTn1Jy)x&k!pLyk-~izdw@2uyEB zkDV+_V0g7aS?EHHo$ObvS}>Y3$N>}eR``-Y!{5H>eCwFbS10Cuic&Wo^^mJPuiKCR zYu%`F%Fh1Mk1o}mrn0lsfrcmWzC;%~9$)4JjeT0fJT&Nif2V;>L$|a4FxsKoj~y%B z*<^lqm*3@Rx;(EhkJ6Fu>OT=VmDN89|7Q1NdAutJpK597%BAPJM$vO!qsc_>E*~~2 zHr1l19YVw6K+5rF7VwYQJSE;H?#Lr{FR{bu>@GSRLuYY18%t*mbT$tE^xxbuo(@<# zrNinD8ddi%@0dV`>W;(daCyfObhxC0-U#l$u){-#vW_F^Fr(urI-D(9ss1xMj;5=^ zj$`O>LdUUmIHqF~9ggTYjt*lxj;BLz$7CFICwx#DqpWEK5`_;>?{HG0L}KA5)=h5c zOMLea)C)K$z95kH41R>pM%*(65FaE+ds6cHcDjbcEdAo9vaVK8#YbsVpcMCQNe*ucf@y~(;Hcb`D%11 zmTI@YjGNl#?)XF_K6Vdg`>x%yv@nT@9q8F~BVNn$2!)hxyPShWid`vp$>E^vKxT@JJy2f7pBX_^7IL|33o> zBna%FL^(<|Xwbx46D5_@pczPDkIpFGv1(1LQfyU_OayDuz$BI3aVl-GwWk;9xAv6N z+7??yv|bXxB%ne-MG%X@3(h!zc;l+f@BLYO&twAF)7qZj>-)zSUuO1RdtIKj*0Y}V ztmn2?R9jBxjJ3&gXxNla%j0{OKkI)ee?csFU|@EudKB2T0T|!7ome1d0y2KRd-pOH zvzIH+GQas&J)ogrU^(Znf%zb7Y|x)5M92K5V}7GPG8IQ!^8=Ch`x+q;T00{vlc(Uq z>>54a3kbr8!RT2WmtmUZww2cL#wu5wi+)#FotntG3CF9sS_rizLztq`A&iF_1)cW^WlX;N-F%-utceYl3^Nr<&YOA#O932Np=3jxr90Q=uiUxR z7tYP^OhPDe6x&%-l1n6q=u8BxHKVC%2{*~hq%S9lAyX#xS4w3u3&;{AT|G|J;5ZH< zSJ17F)X39zfJ+%;5#-$-K1IiuEG)EIHd4VtX!6k_3sK7~Iq>iTDu>Z3JPF*Ia}(eE zk83domYjd(cSo;#_U2JNRTAhUu&W#0{9!jPRery-(qFc;?#5T|pahb*BmCc5cD+)p z$JPd7{!hkRj}5<8?9;$p9*17Rl^|fV7smGLaF3s)7u@6HhbmMymSP@CdnpT$2y)?JKo$5@y#4D=?WJRr- z1#jCwi0~{g41YRjtV*7fsYc`1yZmP(e5U+CIKTb2gK)mz?jD?XJ9M3O_a_kZgzouJ!aq6|U!Tl2jsDQi0j-5(dR@fJ{)Je`@(f!t>94>{;{p{6)i!v?b3wj$c` z{LaUb{l!+~Q=Vn9tJuX*FP(8>l~0e+O1K`>R<&4l)jBsRR>lAkwj~>0KJtgh?7Q7j z*wIORw+i!Ou-W9aQup;-KB(aZ1kV-J4K zXx{ADY2UpA@xD2a1!Fgf5X+WLYKWJ;vb^t4z3i-q{O7+IPc6fi@a16ak&=3_nw=2H-R+V2KXxr+QfA;b4*BhrUsl9#r zb^czZd-j92&6KwbR;m2Gl$VPLoVXtV-t=3~TQB&n)nbV9t(8`%wL)80p>t%db7!t| zOMb00c_0^2I2RyaQh?%x#l2kSS^DKcmVT`0zCZNKdHNiBo+>)t-KefO+kCiQAGFb? ziVFBJPxVA+^#vnLPCbJ37^=vBxc?Hcxp1pFDl*~9B`4DT1-ov)AXK`j?u9{1l^h;{FaXEHV z71oWUVkMQjNgx98vbU)Qg-fWX&Z`I$wsjK9GG^ko^O)f4a%bDVPGd4ZgLfi+#`31? zffb+kEj{SkkFP2#wG+4nSWKVOKF*r0nS0#XD(1P`%bMl;Oc@)90bTnp)wn@i0SAID zORL-1_K294Dtd)g&ek?5%R$Y=YjTzUv$rlZ9pA^c64^c6iaf<@zbFZn)@2>wTkA!g;sfuANPZA5>>$-LCr|%|2#P`cX5M70GLqPC@WE$pSfMEAjBn9 zwY3rDYvtbGQA$xzu#0(@Z(3;M+H+4Q7eo<7V8HrOYfW=JTt|>z;ZM*xz<9uocxJWi zqw5K=p=8u3IOh-SZDjB^sZ?nDmuTQZ*4X8Sj}^aAY!&7xv<9o{NwWqtbmao36uZGx z(Wwcb6eq6|!(?QFNsc^P?Z}q?VdS{3Lw1HmXvZo$wbV|nYWx_Jv;662p;OA1zw*5u z>1F#^{r2U5JkiGH@qa)5NB$OBnvcaA*5X1?fTeM0k<_(wN70M$9kQ0e#BFbW1NJS+ ziP&Jd|C(6pyX_Glpv&mhUT%3#du=%_)|S&`EpdSPL!-6jv|3wEv$c3KQK}*P8`z5D|4j^MK7BI5{WQ~#%{L?YxXv2! zsJ=3QhU(NPm`lAo-bnf8st)jEl43E;w1$X`k#!NsiJ#W#~3xm#*AC2GsDYZ zr!k2L^2*+qDteQNPn-Ijl}=nGY(N!2c$)egUB2)g1sX4<<)qQ!xFPt`5EUATUXR~D zugCsI>Zr8s4KYAC;Ph`AofEFc$V($p7>dp)4@IYr4n=Q(6jbIh-bT^Mc7^}dUwjz0 zpJl=l5NjhHj4lwpt2_{$0RL<3D_>wDOc|DbPp(wAf9C{PV`xL=Z*TUPU$<5al5lB) zD`Bn1pZg${BH?EOM3n}k^}|fm8_G>nIo25?Bxsrm7B-EY1>WBBDR>8r!%Zc{nP3pa z_Al(u{}<|NA>E6`GE=~f8mo+(8#3gp9&)mc^MLw4#lRtsqCD<5kXS8)w0SYo^+EtL zRK9kT2L`;mVAyKZk(I}Nt5>g_Wr-L0(8GEhEN`AEdlhsk%`6R?e=!t2hm+d{1;N;4 zpMU50eDrt3ds&1nz-x5c9lxNQg-*x}d8{&!1&!0T$k)8WYWV}%4QIt0}>!Dx#A$I*rS zvf3Ekdv%IRk8Zv@x^M2#JX_5JXl{|O7ktfJoCa$OH)`{zJbC=Xz6}4w&fuSWf!i03 zF7(FuO&F5@uy3KSag#etXQg{(@P$b`p4p*S4}-ytPZ$PsfBaftaN3f;&(cqsj+!oi z?%w_iDS+v%acS5d--8HCXd;7$9z06Jb?-L~TuxhJM6d6F9OjeB2Hd>{sO5DK%ME!m zGqVik?pXsN#TFX-ySwsJBMaZ?my@;i8vM)tzGL&j-_y3t#U`{J5fvwxEk65vy>1*} zNg4!L2c56m`N;YDB?7J~ z@D4eR$Jo(aB0Fae_N%946^|@0bVCwl@HdP9G0xY|bK#r)c#jsf8)pwoPn=0D8Rg_7%*by#!$%B(wWyEb588~(B+#m&R1%a2-b zj4mE3Beo_ARxwTf_S*hF68qrpC7VjKs+HJh3;}Xhz|>CXsv~!gFgEQ+(3Xj;WVN{4 z_%-Ybvyhrx!_>yvda!KH_`9;t9t)Sl7W~k!GF$M5xNvXGoqqG-I(;}g0p(e4Z?R-Z(g6y~1*9&vPM3AM*4Y?t-3 z8$GyelURmb@rUQ)Khz7qh8b=eW#B%0c83mF;Lxviw0WwDmmqdQnEaQ$*Kl;u=b|=z z@?mchoYJ>7JML%4e6|+neFHY8+84e6Ij7MchR-%jRaSi%bH8WKyzxG$K?Ac>s<@%n zSkHwJ3n)uE_4I@U_Hk#i=xg}NL)5XVI#b8=DXd)NT*$>E2FhquRbyRfN4j#R-(@@Q zyJNlrL-uploGdS8T6-dY$g#=?2KPSgC<;LcN6w%cLnfZ zWX`|^(GB8fZtjOT{;!$>F!TVwfGZymC-@wzu7_vHp3g%HeC+50F8Z&BWK>x#n>c;C z@v`93+TvfbS~idZpAn4RRTGT;R#;#y{*!?qdbb$?>%nCMP$CYfjh(uUuQ`E&XKm}b z0FsFI+*6zE$ftLOj}64CPqkAlgLm!72X`rW$q6im$j8$npIS3cVzlOitBlqSnbEq~ zoetemyCwc54%W#l1I{mV=y}NbqgFhHt~G_M=G6u$7Z<768v`mLQ#= zKOSDowp$;Xy)kF|oB zMH6jnB{6{~+14s-lkl&f`@w$Koey z1fg*<#=C(*Lhzm{dS+w4oWJTzFm_tQH)!U#9Fx(_LOhM0x1GGDp2NRs$=7bVz4nIi zjW_$B34d+IC67;OxN)+2iy&{t)SJdWb={5Oulb+4dFu2j{->|IeddLx{+r7NU&&9jRGpZfKR}Dk52Dx?-m;wK&?|z>)e>@+=y)NYXg-p-?_E0*13JC;~(Z+ zG+aVH2CesAHsNQY6l)kQc9o0G%W_@}|L5wP{=RZ;XX3^>^hL;!7?e-vzU1AVyy0$3@Gf( z`C4zdJETTFue6>7LM;)bIjhV=ZkbfkuX%t@#ZLkJ9`Z6T4ZF@`O=LOnJeG#nxQ*t{ z_$Go}Ux3w_5#&bh0=`Q)&=n@D<>U8H_iBI(VOA$nBX_>|_j|QY--QG(@St8@cBe#0 zwTv&Z{anGVWEZi#sRCBC&WMtwtcN67l!_lt5j(o1SV{6~dt48x4y)-2Js`w#{%XEO z^Xi2x3Jau=4cGA!AOA&P4s3R=WIcH3$vc)UvyhFFgJ^{vJzSoTkm~Z3k;;{eZjLr* zmBZQcB(khAr=ONb)s`asl$vzi*MSgcBJxb|N4l`3Cepa6iu zHY1@0*XK&_-a583>Wi2KPUmnzMhE38B`>6bqKod+(BQ-ntNbFOM2l2d<~I6(=V$1b=nC8gF7LS+xZzu1kVmN;Fa!Kha|r*RJSXXo9bA)miAf92$- z2$wceAWt%FiY4V*!qXwJ-r=|}<*mnVDq+byV)$Gwhxx7c*_CCclD7P|@ZibFO$S4I zE*y`B=!>SNRMG7OPw^_b!2lrz1dtcIxh0-xX`|29W4z5UVPnqt8m}e_52jF) zBcGzwQ2-+GV^h3Q>gGKdt$Y%6A{HjTTT~s0?8kccr#$(e6m|q-50xmN9X;)#)zaoN z&P~Zd8h>48(Cm=Y9JsdNQ;|}$GOi4a|XTA=)k741OgU3e#Q&Nt(yR?C2F#P^> z_B-6{ht;{+Wh!MmcE0I3#}0IYO(f|bfgQj1L$7BTZd4)i0@bl@P+sY_8EoIUrE|5>jNLUD^DS zX-Y1;r=;Hey2?vC_GHQZKm}62rY^`rR`E4%QVZh6PdA0|pl07hw_`6_gtzCkO#|4w29i6xfFyg;ymXlSxLCltK zhzu|m-PCGg$;Ws8Hb;SbTfWBGTJxYUp1innB$7?#c0ohFV^me~ab+5ghYaMw*bV*V ztBsoHHNaCG1!3E0gVqljwG`-`DtZsZa)T@wKU?GntOn^gCQ0614-(CqrvyFXF2 zG|#M1kx5~lD|qrQsVs~?04Y~XEpMo$%+1VlV)n}yNvcW281HBUL0p1#=hH6LPmqRq z$oIBsS+u5}5t+9-;Buc5G zW;4?}h>j7Gxb1rBA{qE#)yF}QXfCC#y9WaTGO>iaMj7K&QQmVN%?=Z8Rwj*1aLX#znT z-$8`!qF5GTvm@?GFw)B>-EKSEKx*Qgtq^X-1I{)%i5^z50*+-$;&9B1%|ik+U%9L_ z(Qm|}WB!0}0uX+552a#xH_?bIJv{|L7%w&}6JEu;?4bn2)rhHNgIn@;x8zq2D0vZIJ-l3 zk&1YClNXvnd~X$#FK@fV4^7Wt3&E=RLKLCN##GUQm8#lH{E-stQ$^8qqHDeozeDME zs;D8It{NsQ@l4|1WhY*w#A8!Mf$YR;C2}#qC@(SU-djk0z}ACIgKa)&4W)`s?hsV3 z$NzjQ2e01pQbS5~e%xyt%L}gdIZ=#}MoH^B~je^l{zzJn?z@tS#dq zHXtbjVtKy={{l|GK*#ue=@V?0l&c;X04%m=nZmDTnq}7@wz&WIG<4&N%~pY>L&vz$ z`kMHZKQ)i~lKC}{_D%M!c@#r`dWImukfxu~xO(af-=U2Hqm-TDTU~<|;$zty7Yb#wQIY)xR^$RC6pH+Y@4%2qM^_|OfWIzjvD~Iu z?gZK2;4b|JXi0~FVb@vCL;+7mK2ECm%|+zsy~8<5lR`t z!;ra(Uvz#!Vkk`oG8R0+=(*rD#y+jW;kC;|o)L#?_nD&IdZM7v)}xo&9!h3}>Fx$= z5Jm7PTm0IiLA5GGnq1++asrQ^bOHU6rU<6XC7|x!D?VxgrL0o7YgXy}l2*OL_SN|G zdynCV#TSb+6tk9nU`k9tDX!r(r>cChxA3?eg3|@k6$o&bkDTxEk@py8P5HWMu*O>a za;6_jNEO`%ZW#kHgYc3Z75%l-Adb#yWMN2L{xE+2HlQ$sfIBr{98Ko$E`|L6k+nlJZSOhjX61_;Urmi{Y@=@XrI%FTW=7Rhc~S;D2Fd(v zGSmHd7f!Fe;GOnDHoQYTcrOIrc~$=ay!oF6FWPGtw!}3IZ1xPjKpQT6jBX7d1=naf z;}*?fy-Y^l=X#Mc{6hGDP5y8%4FHMc4{tGnY5A*SdC%Tzn>FAHA95uuSwnY(w}k6`=m(z~3*;h?1O<=={rsYC`JFKu=4G0Way_Et?_ zS{|nDB3Ai_h=-H926m!{m7Q=Ip93o|SM4wy6MN8d9V6snoIK`b9RN!v8$j|gM=S>X zv3fGyW-?{YMfy%$FSOcNu!NlM_|qS=qA5De1+PNGTdbXgJ@nF&8exPhdFZ`kETP&Q z!?T&iGWuC_Y&XwuF;2m%Zk-hK8%M!ZDLC)xMEvml3Gn2st%Us<_vPHPF z5Q411EQ@Zy)3Pwjfn{O(aL}^Q>}9b!X>U0mN}UhXk0PY_ZvPwyB^-$!IWE_Yhmyr!{| z-EkRwc+ci~J$PZb)z@Gj*s%JmlP{ZEe=}La$ zR&rBMC9sw`iC<+-o$r@-9|Q0@NijT8P<1=d+y9gqM-UNuZo=OL0Zvzq{c@~YW#TI zM8VRtDQC^zLS@=iI7eMyGSLeghjkgM%e4sdB*bmLlwSDFO*wCQN1HD`ZWx19(dED$ zauOA(kn_Cp;%uRi8Q!-6QU@gITo$lW(BJXwiPNrC*WsuoKnXezmMl<@=m^uQ9ks_m zoE@%bP+)aDW|vU`x88{>xRlnKS#-(k8K`wch3lE@86xDGi1+9Mll_p^hdbHB)a0R$ zCO3YEQaz`$gN`Px6wRzx)MyAQ|o@PpKQ0Z7+0>abN+3!8&b+(V&+2YeOoz0RN)qo`v zDV}vZAvGO&M?W`MKBp7i8j8`q1^{t*jTST=ndr*64aJ4RB|Z|;a*F8iWo5 z;GiciI}`}@fH3VK5PpB}XMs@ffiTSzv%5QOZ;brKVh_Lyz`<}2?EgLk zrJA_zimxI>NO;7*lW)C1P^KF*nWT?0mWbjt$mGHAR}=YQ(Usj}(dY6g z7X5znJHKS1e&LJi&9AE=(n-38_d~JhN*6C8nV63Frrbfih%h5V+pd92mv)x^E&@iF z5q2N`a=_=WIpNPQS-=BZJAv&c_`8W7%0e z$vWqy$h`cC7b8_L#K@rniW0xj)U+$Up4){D4@25bUfOcfdehU12Z28YZa@MYJO)`o zH*@924Vck1a^!)Uo$r0T!e}3ju$a`p{Yk)ky@E6lZx@0>uRhWbG1szs1&uIvQrEa~ zbm`56`_#3~kFZ~HU;LQS=5;NvUguD0K14mqA?l4QpcY-FP1E0brj1?kI1$*$5s1v< zQWwO|yW;DV5}n1#r`iQDzMPb_JjA+0k z;z5XnkgtV&|6)9dghOh#&FS`BLU)!-`c_cj~p`%7&w3lhP40V z8NGUi7V!}Nk0#y#Dl{*?N$B_4-VXn0e3M&r&i#M(%l}LE%Y&K61J>k;f9YA1|FZq^ z25~Lv_$Jx*vGxCbuzhUy_nJd|?~%_$wiXk|o#O;M&-WK%MEV0lYO#$3ql%KjA-hRG z`iJ}oE&@qF&^Z+=2v`ys1qXCu4#4`u_?FwziTP19X#I^l(VQV+5J zyS<}N`{)g`cma-{d#o8>Bu;|W`~t{Ok?Iw1p{aUwj@A5*umpFlsy&U{jq98pn@G@x zH+I`)OT%Rp$;69r^UK89vnp|2ctu=iMYCu zn}}A0%GQMnxEge2sO;5H!K+#8`)>%?Y@5NzGpEQy&zV7Gedym<9p_Qk&iVV&OX^C)k)3^Wm!kyd<0FO zvfL0f>3m9#+!ABtVCcXZq5~50wepGZ`h+i%7J{PfILx|kwIDtNwIk&0@n3Nneiz_8 zpcYD9+^6v?I;}IkyK}8(onj?~8%D6+lB3$*D6}36mlPGOL+m!hZrf7IMKk$!!3TB$ z_AHmMme22ft%(3X9ws4GH1I+A?W1%Q8pef2gdK0q84!t!7@2zaBd1yq2YJ`oF?|dfOkf@qw+xooF53Mrh20 z5dX0M^lw3-|G)gFUxdtisxwI&@S6r{|BnB3^%q3ji?07>#((;!Y+4ZgoyV9D&)t~u zpKjtq+JE|ak`cHY|L7(E2VA_x=nh=WC_0_mjI7dp-vO@bY|je5T8cS#iC+HGTZXHp zLBE<}wwD1a%l4A?pPs|u8UN{udNm2s&SiOd#suu@pXooHSU`OoGH*Q}|LK~!-ziCH zAri`4{w}@n4S#A}DbTgmBOaUrpYT<)#{{D@F(s-Tdy+@OL0xn1AJr2(K)8K{9s9zw z-_UNo#aP4=_iTF=0`Ok+TgEnp1i1hpSG16NIY4Nz_#z*ZmG5gj)s7-Cj!vTC8e*f& z9G1i*NI^du@ja=$m{Y3RMO+YEGMMp#&pt1gWAq^>n#dkBD?eg7%;xDQaQM&yyNV0@ zCJ^6WlE|Ne_ zp;;ugljQPC2hEQxm@vjWaB_Y#ve(E2odYK4JSL}fa<9p`Xmn1_ynk&zmJ+i1f1VHH zP9g_BVAtFO$~E8#PO#tq-v0L!%$#im5``n($WTJC=Jc3>KIoDs0h`} zCa-PXm9nO<>@vK&C!=$fQ8i>w74k)ShlBbUBR`197_}jqk(_8a{>`0{( z{TKT$iT_G4aQI7}>~Vj5z69^oOX7EXUlhZGs1myz47{%U&we=!>FnhicIUCNh4+iwJ^1^YFMZWqYss|l7@mPVCK4P0Ew>u80QZh(3Xb#6Op@%XuDE8TFu7k zCw5;7LHnXU_UyemXaKA^i})Uj)yuPiLrC|czV_MkOS-7oy8AwT(yaX4MIG0bu8GbH zTZCKst@nP#KI*;3`z`l=i@o1Melg~r#}CS-L4P_DK_R+@R`+$0_iAvkbkM`zYq$IL z&)(|}z0yVwmDui$Z?d*sK(eemq@roy;IW%kqWEcW_Y)WS5-%_Va0h|NmL{%(Q|u4! z1@0g4p&f8lfr<#3FSz(;$6SLmn=6&Y8+~B34L=0~s5BibWDb*8I~S{Z!GX%I9>JgV ze63XQL^pp@Mc0xgh>CI{pA-(tL;(3AkZ9L}bSQ-gATd%jz>CO61ega)2*StQVzWa+ zzHtCq1uPJo+ItyKYQ^;m`6Bu5i_&RyYRE4rao)qMwQ654pu*hU;)M!1H4TC0NHv(g#H$H$n+1AfRpK0h z{qj@;_H&0WbQG{>6(UF)WrEH_u4xgf+Ik?;1WwT}L1GCi;>Ze{q-iF}yid~m%%1m& zdT;7^xAi`^=ePc2@$O}UpM%fqclk(#p3Z4#a0i)c} zFFsYNmzRh=4{)1M^9_urKQ`WHbpow$$5Uxwr|^)AOU`yhR}mSt9mQVe{zn#|x2I>X z3qGe2JXLhpPsmg1E*N89NO>(FH6glda1qeFd4wXl)80@}(VA>D`;Vr#VF0gZx%-i` z9+kcuw9&f4tLX~2rbu_O-x|WVAr~S{S{4rOTsAEHMO3fO`bhWa^!=*Q`2*E_pkgS8 zn>K=qb~YxJ`&hSrYw(;-D;(X3nU z)LOCOG5zq~ku9UmLQf8H>rX8`duWN(tV{ej{a~=s8%0Z*fHtaC`e&l+|2B#a`RDMn zbkI>dg`76XIp~v*%_GP;XtVnWat>-YkNF^QFXVipSY1t%1Lr+1Ba|NqaSa~*alagc zZo$}tX57(9+s=0AJ|7N&cKYnm)l^YFdS%RZ55_#hF1quE<4u0U;kf8r(TdD0H_@!Q z9&jGX!amgo>NQca2k*{CGU1iwhD6Vvq7Wn$G9Hipf3$Ysv_M6! zLB2rMszxsAm^_cm19GPwfPBeBJKxgG7K(AXc+R8QUVBY?LkM3dH#o5& zBdj^k@Dpg;o~H}cn|NmVb_NTy?-vtD&*`jK8`!lIVPPJ(Qa2otte&SNecCL-4nS zrf;#z8z^RuNU5T4g9Z3av5*RzSA@@n|8M*@P&FtAo6;~96G1claVad2!7DtX5m;7U z~=u7a#>sa@PRwhWd^3pWLMBHyMq31FksX8A4~;39h@iT zH&*%mD?ose3&93&{$W)}ut^Q>&4 zbB}y!B02!%AvnnqA2~l*h0nmd$kW#$TnWZXjtV;4?6Q}M-^T=ooRb31)cjD@#|=T< z1f4;yGlMaMSSCS$-br|R39_KdyRf8|MJNKGv7I|K5}%5fK*7s{tLiu!Q^<+4Nh zh=buMU^U5g(`Yo)p?vOxd}p+v_wy3J16`DGm_3)SRKCQj72Xf4Seq)E%2-LuQH*SJ zm@j;eQEJUmMo!tKHf(>nJSBP35E3zcMZqU&313T7MI8W1jL_(hid8nXavEHL z`^@e>d%5~|)w1}*<8ZE&_Y$;d+YO>P*Me{f!<@v%d}vZWzL%8$a`S|Y7emnp5^NK= zfc(Fm&)2#7nu(`#D{+X%JZ8#1PTAzmUU;44m8qg>pdS9o1}QsIMP(v(TJ?DsLJ$uf z@`uSc_GZMOoU*DH1e95H^X$s#ph!?`q7^em;BtQsGB zF(~g$u#!_kEy^9HaiS{2@=?KFhMZ3%n;y>#PhZwo8mHOI1)MA51-SFFfLmt}!UK-` z6uqvyZ3ohAH#Sr3{H$UR^e$G~tJvY`VpdDQe5kauieBHl=r-->nclv_N7GxYWw0q) zbX$L;E}qE`1Nu0^3+~q8a0cbr8DI2DD&?B_J`9aT8gqr4`zkN@VJ3HtmwQeocf`#d zc5~}Tb@w;9<;S7AFU{n>%*}n1o4diwtynYu$Md}0CuVXh1S|UOiwUc21a?u&%JV4b#fn+};Ry`EnH^9u2KqCQX3=OE&Q_2z3> zc+0jr@_SSfD|)@3JGO(A$=MllcE|tf0V9`*EF)uAhAI=|zi%1K33-uPlJzS`h$fzO z5}IdzJ*(s_BlN_F2*i+>y)U_#^h=)o0s-!(YON}Y9}?m!5PZPJq8^_(TCR8Cb5gm7 zVMrAv-2}YuQ$+2LRlZ58Sxc#rU3>~EZ}ck2V_$D?fpH;V9(&7RM#9Uvv&AbUUd8?D zj?>@xpq=7|a>Jn{hw8iA{I^Z>H)S=Cjc4WcCiQZ)OtI4`mMWS#7s}+tLFrM7IWOH}C z^J!4=>yWLQEyQ^xRdfrqTY66P9jR~~V_ipBpxDTc|3G%-^7Emp{b6)|ZWIg#10%#> z)psx*Z(ad`5Y;U`&&k~rKrlyge&cG1R#ZRJL7X=2C3slnTX(+&l`^9780@5ENrn`N zf%P#4S~}&FG7qDH**w&k6yoIWRs!d*96BgLrheUT&8}l_^k&XLaXWf*F*?aob2>&r zS))Z<=#`ON+mz8FHV?7+#?e>yG>BV(q(A$(v^uL{7S4<1e(L7RHPsALHLOsyi`}`Z zSG>JWkE&NTI~e*8x@D`L^NzZZ9+5?>Fzw$ZSysNXqN-@ZqsC-Vf(A@=m}q3+v1!GK ze-=<&YK7(oQsu#En^Wqh)S9#)LkBd|e#=IM6JAIGtL0{>uv#luYdVRjh0%H;ca3QY z8CQh7XqA}oCI@5(|b@1#b&6KBMX_ygYKb^=T6UPQ^a-FK-iq7WC6jBTVcKP3B zSXx@mU|G#N`xz3w5Bl>Iz_54h)z3BtCVoCyU0&G5J>qpnfS;2V=GSEsnm2|qEO^o&bNs?RaL}7+9^YfDc|8xJ zOa{+mm0tmxR8bHB64JSv*^7UHX_GX=5Syr+r8pRud+J7ve{Q}DctxqMXXxzcEZeT? zFd+kOJ11DxVcmTtlz;`_m-~#(MX05G51)XS8>W@9n*7EcY6doSyEzF2<%ThKj;u_0 zv`@jH)0(4;ne6CgrM8iWLgtUNM?XI#+WgvCPR-ZL#xq3LQ(oTD*$ zoE=2}`r9Km1f(ep#O@qc(VDg1tirL~){qHtes}ZB=F{2->$!3^p<=tLt?~7p%Y5M@ zu&$_K+G?LS)DYh@nIOm5cyk?z%QNkOXPxRM9OCyA2QYYRCHePFZ`l7D~1On8~+zEdwUtkDtAkn