From cbf167593bcdc480efa03b3efce60d07d3aaf714 Mon Sep 17 00:00:00 2001 From: CarmenGlez20 Date: Sat, 23 May 2026 09:07:33 -0600 Subject: [PATCH] proyecto completo - frontend + simulador + start.bat --- ecotrack | 1 + package-lock.json | 6 + .../__pycache__/main.cpython-312.pyc | Bin 0 -> 2974 bytes simulador-backend/main.py | 60 + simulador-backend/rutas.json | 242 + .../typing_extensions.cpython-312.pyc | Bin 0 -> 163655 bytes .../annotated_doc-0.0.4.dist-info/INSTALLER | 1 + .../annotated_doc-0.0.4.dist-info/METADATA | 145 + .../annotated_doc-0.0.4.dist-info/RECORD | 11 + .../annotated_doc-0.0.4.dist-info/WHEEL | 4 + .../entry_points.txt | 4 + .../licenses/LICENSE | 21 + .../site-packages/annotated_doc/__init__.py | 3 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 266 bytes .../__pycache__/main.cpython-312.pyc | Bin 0 -> 1914 bytes .../Lib/site-packages/annotated_doc/main.py | 36 + .../Lib/site-packages/annotated_doc/py.typed | 0 .../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-312.pyc | Bin 0 -> 18635 bytes .../__pycache__/test_cases.cpython-312.pyc | Bin 0 -> 13248 bytes .../site-packages/annotated_types/py.typed | 0 .../annotated_types/test_cases.py | 151 + .../anyio-4.13.0.dist-info/INSTALLER | 1 + .../anyio-4.13.0.dist-info/METADATA | 105 + .../anyio-4.13.0.dist-info/RECORD | 92 + .../anyio-4.13.0.dist-info/WHEEL | 5 + .../anyio-4.13.0.dist-info/entry_points.txt | 2 + .../anyio-4.13.0.dist-info/licenses/LICENSE | 20 + .../anyio-4.13.0.dist-info/top_level.txt | 1 + .../venv/Lib/site-packages/anyio/__init__.py | 111 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4638 bytes .../__pycache__/from_thread.cpython-312.pyc | Bin 0 -> 25839 bytes .../__pycache__/functools.cpython-312.pyc | Bin 0 -> 16581 bytes .../__pycache__/lowlevel.cpython-312.pyc | Bin 0 -> 8009 bytes .../__pycache__/pytest_plugin.cpython-312.pyc | Bin 0 -> 16789 bytes .../to_interpreter.cpython-312.pyc | Bin 0 -> 10341 bytes .../__pycache__/to_process.cpython-312.pyc | Bin 0 -> 11955 bytes .../__pycache__/to_thread.cpython-312.pyc | Bin 0 -> 3218 bytes .../site-packages/anyio/_backends/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 204 bytes .../__pycache__/_asyncio.cpython-312.pyc | Bin 0 -> 138635 bytes .../__pycache__/_trio.cpython-312.pyc | Bin 0 -> 71492 bytes .../site-packages/anyio/_backends/_asyncio.py | 2996 ++++++ .../site-packages/anyio/_backends/_trio.py | 1343 +++ .../Lib/site-packages/anyio/_core/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 200 bytes .../_asyncio_selector_thread.cpython-312.pyc | Bin 0 -> 8415 bytes .../_contextmanagers.cpython-312.pyc | Bin 0 -> 9010 bytes .../__pycache__/_eventloop.cpython-312.pyc | Bin 0 -> 8194 bytes .../__pycache__/_exceptions.cpython-312.pyc | Bin 0 -> 7437 bytes .../_core/__pycache__/_fileio.cpython-312.pyc | Bin 0 -> 43315 bytes .../__pycache__/_resources.cpython-312.pyc | Bin 0 -> 942 bytes .../__pycache__/_signals.cpython-312.pyc | Bin 0 -> 1396 bytes .../__pycache__/_sockets.cpython-312.pyc | Bin 0 -> 40607 bytes .../__pycache__/_streams.cpython-312.pyc | Bin 0 -> 2349 bytes .../__pycache__/_subprocesses.cpython-312.pyc | Bin 0 -> 9480 bytes .../_synchronization.cpython-312.pyc | Bin 0 -> 33108 bytes .../_core/__pycache__/_tasks.cpython-312.pyc | Bin 0 -> 7699 bytes .../__pycache__/_tempfile.cpython-312.pyc | Bin 0 -> 28052 bytes .../__pycache__/_testing.cpython-312.pyc | Bin 0 -> 3802 bytes .../__pycache__/_typedattr.cpython-312.pyc | Bin 0 -> 3845 bytes .../anyio/_core/_asyncio_selector_thread.py | 167 + .../anyio/_core/_contextmanagers.py | 200 + .../site-packages/anyio/_core/_eventloop.py | 234 + .../site-packages/anyio/_core/_exceptions.py | 156 + .../Lib/site-packages/anyio/_core/_fileio.py | 799 ++ .../site-packages/anyio/_core/_resources.py | 18 + .../Lib/site-packages/anyio/_core/_signals.py | 29 + .../Lib/site-packages/anyio/_core/_sockets.py | 1003 ++ .../Lib/site-packages/anyio/_core/_streams.py | 52 + .../anyio/_core/_subprocesses.py | 196 + .../anyio/_core/_synchronization.py | 757 ++ .../Lib/site-packages/anyio/_core/_tasks.py | 173 + .../site-packages/anyio/_core/_tempfile.py | 613 ++ .../Lib/site-packages/anyio/_core/_testing.py | 82 + .../site-packages/anyio/_core/_typedattr.py | 81 + .../Lib/site-packages/anyio/abc/__init__.py | 58 + .../abc/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2375 bytes .../__pycache__/_eventloop.cpython-312.pyc | Bin 0 -> 16536 bytes .../__pycache__/_resources.cpython-312.pyc | Bin 0 -> 1647 bytes .../abc/__pycache__/_sockets.cpython-312.pyc | Bin 0 -> 18278 bytes .../abc/__pycache__/_streams.cpython-312.pyc | Bin 0 -> 9681 bytes .../__pycache__/_subprocesses.cpython-312.pyc | Bin 0 -> 3255 bytes .../abc/__pycache__/_tasks.cpython-312.pyc | Bin 0 -> 5154 bytes .../abc/__pycache__/_testing.cpython-312.pyc | Bin 0 -> 2850 bytes .../Lib/site-packages/anyio/abc/_eventloop.py | 409 + .../Lib/site-packages/anyio/abc/_resources.py | 33 + .../Lib/site-packages/anyio/abc/_sockets.py | 399 + .../Lib/site-packages/anyio/abc/_streams.py | 233 + .../site-packages/anyio/abc/_subprocesses.py | 79 + .../Lib/site-packages/anyio/abc/_tasks.py | 117 + .../Lib/site-packages/anyio/abc/_testing.py | 65 + .../Lib/site-packages/anyio/from_thread.py | 578 ++ .../venv/Lib/site-packages/anyio/functools.py | 409 + .../venv/Lib/site-packages/anyio/lowlevel.py | 196 + .../venv/Lib/site-packages/anyio/py.typed | 0 .../Lib/site-packages/anyio/pytest_plugin.py | 363 + .../site-packages/anyio/streams/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 202 bytes .../__pycache__/buffered.cpython-312.pyc | Bin 0 -> 9081 bytes .../streams/__pycache__/file.cpython-312.pyc | Bin 0 -> 7473 bytes .../__pycache__/memory.cpython-312.pyc | Bin 0 -> 15023 bytes .../__pycache__/stapled.cpython-312.pyc | Bin 0 -> 7552 bytes .../streams/__pycache__/text.cpython-312.pyc | Bin 0 -> 9348 bytes .../streams/__pycache__/tls.cpython-312.pyc | Bin 0 -> 20150 bytes .../site-packages/anyio/streams/buffered.py | 188 + .../Lib/site-packages/anyio/streams/file.py | 154 + .../Lib/site-packages/anyio/streams/memory.py | 325 + .../site-packages/anyio/streams/stapled.py | 147 + .../Lib/site-packages/anyio/streams/text.py | 176 + .../Lib/site-packages/anyio/streams/tls.py | 421 + .../Lib/site-packages/anyio/to_interpreter.py | 246 + .../Lib/site-packages/anyio/to_process.py | 266 + .../venv/Lib/site-packages/anyio/to_thread.py | 78 + .../click-8.4.1.dist-info/INSTALLER | 1 + .../click-8.4.1.dist-info/METADATA | 84 + .../click-8.4.1.dist-info/RECORD | 40 + .../site-packages/click-8.4.1.dist-info/WHEEL | 4 + .../licenses/LICENSE.txt | 28 + .../venv/Lib/site-packages/click/__init__.py | 126 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4194 bytes .../click/__pycache__/_compat.cpython-312.pyc | Bin 0 -> 24312 bytes .../__pycache__/_termui_impl.cpython-312.pyc | Bin 0 -> 35256 bytes .../__pycache__/_textwrap.cpython-312.pyc | Bin 0 -> 7413 bytes .../click/__pycache__/_utils.cpython-312.pyc | Bin 0 -> 1436 bytes .../__pycache__/_winconsole.cpython-312.pyc | Bin 0 -> 11950 bytes .../click/__pycache__/core.cpython-312.pyc | Bin 0 -> 138980 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 0 -> 22191 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 16545 bytes .../__pycache__/formatting.cpython-312.pyc | Bin 0 -> 14124 bytes .../click/__pycache__/globals.cpython-312.pyc | Bin 0 -> 2973 bytes .../click/__pycache__/parser.cpython-312.pyc | Bin 0 -> 20501 bytes .../shell_completion.cpython-312.pyc | Bin 0 -> 23692 bytes .../click/__pycache__/termui.cpython-312.pyc | Bin 0 -> 37538 bytes .../click/__pycache__/testing.cpython-312.pyc | Bin 0 -> 34681 bytes .../click/__pycache__/types.cpython-312.pyc | Bin 0 -> 54532 bytes .../click/__pycache__/utils.cpython-312.pyc | Bin 0 -> 25375 bytes .../venv/Lib/site-packages/click/_compat.py | 627 ++ .../Lib/site-packages/click/_termui_impl.py | 929 ++ .../venv/Lib/site-packages/click/_textwrap.py | 188 + .../venv/Lib/site-packages/click/_utils.py | 36 + .../Lib/site-packages/click/_winconsole.py | 297 + .../venv/Lib/site-packages/click/core.py | 3542 +++++++ .../Lib/site-packages/click/decorators.py | 551 ++ .../Lib/site-packages/click/exceptions.py | 347 + .../Lib/site-packages/click/formatting.py | 315 + .../venv/Lib/site-packages/click/globals.py | 67 + .../venv/Lib/site-packages/click/parser.py | 533 + .../venv/Lib/site-packages/click/py.typed | 0 .../site-packages/click/shell_completion.py | 680 ++ .../venv/Lib/site-packages/click/termui.py | 941 ++ .../venv/Lib/site-packages/click/testing.py | 736 ++ .../venv/Lib/site-packages/click/types.py | 1309 +++ .../venv/Lib/site-packages/click/utils.py | 641 ++ .../colorama-0.4.6.dist-info/INSTALLER | 1 + .../colorama-0.4.6.dist-info/METADATA | 441 + .../colorama-0.4.6.dist-info/RECORD | 31 + .../colorama-0.4.6.dist-info/WHEEL | 5 + .../licenses/LICENSE.txt | 27 + .../Lib/site-packages/colorama/__init__.py | 7 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 497 bytes .../colorama/__pycache__/ansi.cpython-312.pyc | Bin 0 -> 3950 bytes .../__pycache__/ansitowin32.cpython-312.pyc | Bin 0 -> 16417 bytes .../__pycache__/initialise.cpython-312.pyc | Bin 0 -> 3555 bytes .../__pycache__/win32.cpython-312.pyc | Bin 0 -> 8140 bytes .../__pycache__/winterm.cpython-312.pyc | Bin 0 -> 9093 bytes .../venv/Lib/site-packages/colorama/ansi.py | 102 + .../Lib/site-packages/colorama/ansitowin32.py | 277 + .../Lib/site-packages/colorama/initialise.py | 121 + .../site-packages/colorama/tests/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 203 bytes .../__pycache__/ansi_test.cpython-312.pyc | Bin 0 -> 5472 bytes .../ansitowin32_test.cpython-312.pyc | Bin 0 -> 18011 bytes .../initialise_test.cpython-312.pyc | Bin 0 -> 11659 bytes .../__pycache__/isatty_test.cpython-312.pyc | Bin 0 -> 4786 bytes .../tests/__pycache__/utils.cpython-312.pyc | Bin 0 -> 2475 bytes .../__pycache__/winterm_test.cpython-312.pyc | Bin 0 -> 6617 bytes .../site-packages/colorama/tests/ansi_test.py | 76 + .../colorama/tests/ansitowin32_test.py | 294 + .../colorama/tests/initialise_test.py | 189 + .../colorama/tests/isatty_test.py | 57 + .../Lib/site-packages/colorama/tests/utils.py | 49 + .../colorama/tests/winterm_test.py | 131 + .../venv/Lib/site-packages/colorama/win32.py | 180 + .../Lib/site-packages/colorama/winterm.py | 195 + .../fastapi-0.136.1.dist-info/INSTALLER | 1 + .../fastapi-0.136.1.dist-info/METADATA | 622 ++ .../fastapi-0.136.1.dist-info/RECORD | 109 + .../fastapi-0.136.1.dist-info/REQUESTED | 0 .../fastapi-0.136.1.dist-info/WHEEL | 4 + .../entry_points.txt | 5 + .../licenses/LICENSE | 21 + .../fastapi/.agents/skills/fastapi/SKILL.md | 436 + .../skills/fastapi/references/dependencies.md | 142 + .../skills/fastapi/references/other-tools.md | 76 + .../skills/fastapi/references/streaming.md | 105 + .../Lib/site-packages/fastapi/__init__.py | 25 + .../Lib/site-packages/fastapi/__main__.py | 3 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1111 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 258 bytes .../__pycache__/applications.cpython-312.pyc | Bin 0 -> 87430 bytes .../__pycache__/background.cpython-312.pyc | Bin 0 -> 2439 bytes .../fastapi/__pycache__/cli.cpython-312.pyc | Bin 0 -> 672 bytes .../__pycache__/concurrency.cpython-312.pyc | Bin 0 -> 1733 bytes .../datastructures.cpython-312.pyc | Bin 0 -> 7263 bytes .../__pycache__/encoders.cpython-312.pyc | Bin 0 -> 11544 bytes .../exception_handlers.cpython-312.pyc | Bin 0 -> 2038 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 10454 bytes .../__pycache__/logger.cpython-312.pyc | Bin 0 -> 298 bytes .../param_functions.cpython-312.pyc | Bin 0 -> 40958 bytes .../__pycache__/params.cpython-312.pyc | Bin 0 -> 23559 bytes .../__pycache__/requests.cpython-312.pyc | Bin 0 -> 287 bytes .../__pycache__/responses.cpython-312.pyc | Bin 0 -> 5364 bytes .../__pycache__/routing.cpython-312.pyc | Bin 0 -> 104534 bytes .../fastapi/__pycache__/sse.cpython-312.pyc | Bin 0 -> 7303 bytes .../__pycache__/staticfiles.cpython-312.pyc | Bin 0 -> 259 bytes .../__pycache__/templating.cpython-312.pyc | Bin 0 -> 261 bytes .../__pycache__/testclient.cpython-312.pyc | Bin 0 -> 256 bytes .../fastapi/__pycache__/types.cpython-312.pyc | Bin 0 -> 801 bytes .../fastapi/__pycache__/utils.cpython-312.pyc | Bin 0 -> 5410 bytes .../__pycache__/websockets.cpython-312.pyc | Bin 0 -> 336 bytes .../site-packages/fastapi/_compat/__init__.py | 40 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1640 bytes .../__pycache__/shared.cpython-312.pyc | Bin 0 -> 9368 bytes .../_compat/__pycache__/v2.cpython-312.pyc | Bin 0 -> 19777 bytes .../site-packages/fastapi/_compat/shared.py | 214 + .../Lib/site-packages/fastapi/_compat/v2.py | 493 + .../Lib/site-packages/fastapi/applications.py | 4691 +++++++++ .../Lib/site-packages/fastapi/background.py | 61 + .../venv/Lib/site-packages/fastapi/cli.py | 13 + .../Lib/site-packages/fastapi/concurrency.py | 41 + .../site-packages/fastapi/datastructures.py | 186 + .../fastapi/dependencies/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 209 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 9158 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 40973 bytes .../fastapi/dependencies/models.py | 193 + .../fastapi/dependencies/utils.py | 1057 ++ .../Lib/site-packages/fastapi/encoders.py | 364 + .../fastapi/exception_handlers.py | 34 + .../Lib/site-packages/fastapi/exceptions.py | 256 + .../venv/Lib/site-packages/fastapi/logger.py | 3 + .../fastapi/middleware/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 265 bytes .../asyncexitstack.cpython-312.pyc | Bin 0 -> 1500 bytes .../__pycache__/cors.cpython-312.pyc | Bin 0 -> 270 bytes .../__pycache__/gzip.cpython-312.pyc | Bin 0 -> 270 bytes .../__pycache__/httpsredirect.cpython-312.pyc | Bin 0 -> 299 bytes .../__pycache__/trustedhost.cpython-312.pyc | Bin 0 -> 293 bytes .../__pycache__/wsgi.cpython-312.pyc | Bin 0 -> 272 bytes .../fastapi/middleware/asyncexitstack.py | 18 + .../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 | 3 + .../site-packages/fastapi/openapi/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 204 bytes .../__pycache__/constants.cpython-312.pyc | Bin 0 -> 374 bytes .../openapi/__pycache__/docs.cpython-312.pyc | Bin 0 -> 12856 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 22368 bytes .../openapi/__pycache__/utils.cpython-312.pyc | Bin 0 -> 22681 bytes .../fastapi/openapi/constants.py | 3 + .../Lib/site-packages/fastapi/openapi/docs.py | 389 + .../site-packages/fastapi/openapi/models.py | 435 + .../site-packages/fastapi/openapi/utils.py | 606 ++ .../site-packages/fastapi/param_functions.py | 2460 +++++ .../venv/Lib/site-packages/fastapi/params.py | 754 ++ .../venv/Lib/site-packages/fastapi/py.typed | 0 .../Lib/site-packages/fastapi/requests.py | 2 + .../Lib/site-packages/fastapi/responses.py | 98 + .../venv/Lib/site-packages/fastapi/routing.py | 4956 ++++++++++ .../fastapi/security/__init__.py | 15 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 861 bytes .../__pycache__/api_key.cpython-312.pyc | Bin 0 -> 10471 bytes .../security/__pycache__/base.cpython-312.pyc | Bin 0 -> 523 bytes .../security/__pycache__/http.cpython-312.pyc | Bin 0 -> 14534 bytes .../__pycache__/oauth2.cpython-312.pyc | Bin 0 -> 20549 bytes .../open_id_connect_url.cpython-312.pyc | Bin 0 -> 3750 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 604 bytes .../site-packages/fastapi/security/api_key.py | 320 + .../site-packages/fastapi/security/base.py | 6 + .../site-packages/fastapi/security/http.py | 417 + .../site-packages/fastapi/security/oauth2.py | 693 ++ .../fastapi/security/open_id_connect_url.py | 94 + .../site-packages/fastapi/security/utils.py | 7 + .../venv/Lib/site-packages/fastapi/sse.py | 222 + .../Lib/site-packages/fastapi/staticfiles.py | 1 + .../Lib/site-packages/fastapi/templating.py | 1 + .../Lib/site-packages/fastapi/testclient.py | 1 + .../venv/Lib/site-packages/fastapi/types.py | 12 + .../venv/Lib/site-packages/fastapi/utils.py | 136 + .../Lib/site-packages/fastapi/websockets.py | 3 + .../h11-0.16.0.dist-info/INSTALLER | 1 + .../h11-0.16.0.dist-info/METADATA | 202 + .../site-packages/h11-0.16.0.dist-info/RECORD | 29 + .../site-packages/h11-0.16.0.dist-info/WHEEL | 5 + .../h11-0.16.0.dist-info/licenses/LICENSE.txt | 22 + .../h11-0.16.0.dist-info/top_level.txt | 1 + .../venv/Lib/site-packages/h11/__init__.py | 62 + .../h11/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1083 bytes .../h11/__pycache__/_abnf.cpython-312.pyc | Bin 0 -> 1789 bytes .../__pycache__/_connection.cpython-312.pyc | Bin 0 -> 23139 bytes .../h11/__pycache__/_events.cpython-312.pyc | Bin 0 -> 13229 bytes .../h11/__pycache__/_headers.cpython-312.pyc | Bin 0 -> 7991 bytes .../h11/__pycache__/_readers.cpython-312.pyc | Bin 0 -> 9656 bytes .../_receivebuffer.cpython-312.pyc | Bin 0 -> 4707 bytes .../h11/__pycache__/_state.cpython-312.pyc | Bin 0 -> 8471 bytes .../h11/__pycache__/_util.cpython-312.pyc | Bin 0 -> 4727 bytes .../h11/__pycache__/_version.cpython-312.pyc | Bin 0 -> 221 bytes .../h11/__pycache__/_writers.cpython-312.pyc | Bin 0 -> 6293 bytes .../venv/Lib/site-packages/h11/_abnf.py | 132 + .../venv/Lib/site-packages/h11/_connection.py | 659 ++ .../venv/Lib/site-packages/h11/_events.py | 369 + .../venv/Lib/site-packages/h11/_headers.py | 282 + .../venv/Lib/site-packages/h11/_readers.py | 250 + .../Lib/site-packages/h11/_receivebuffer.py | 153 + .../venv/Lib/site-packages/h11/_state.py | 365 + .../venv/Lib/site-packages/h11/_util.py | 135 + .../venv/Lib/site-packages/h11/_version.py | 16 + .../venv/Lib/site-packages/h11/_writers.py | 145 + .../venv/Lib/site-packages/h11/py.typed | 1 + .../idna-3.16.dist-info/INSTALLER | 1 + .../idna-3.16.dist-info/METADATA | 164 + .../site-packages/idna-3.16.dist-info/RECORD | 28 + .../site-packages/idna-3.16.dist-info/WHEEL | 4 + .../idna-3.16.dist-info/entry_points.txt | 3 + .../idna-3.16.dist-info/licenses/LICENSE.md | 31 + .../venv/Lib/site-packages/idna/__init__.py | 45 + .../venv/Lib/site-packages/idna/__main__.py | 6 + .../idna/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 891 bytes .../idna/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 362 bytes .../idna/__pycache__/cli.cpython-312.pyc | Bin 0 -> 5867 bytes .../idna/__pycache__/codec.cpython-312.pyc | Bin 0 -> 6333 bytes .../idna/__pycache__/compat.cpython-312.pyc | Bin 0 -> 1913 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 0 -> 25976 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 0 -> 102326 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 0 -> 2596 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 0 -> 222 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 0 -> 144069 bytes .../venv/Lib/site-packages/idna/cli.py | 128 + .../venv/Lib/site-packages/idna/codec.py | 159 + .../venv/Lib/site-packages/idna/compat.py | 41 + .../venv/Lib/site-packages/idna/core.py | 605 ++ .../venv/Lib/site-packages/idna/idnadata.py | 4366 +++++++++ .../venv/Lib/site-packages/idna/intranges.py | 55 + .../Lib/site-packages/idna/package_data.py | 1 + .../venv/Lib/site-packages/idna/py.typed | 0 .../venv/Lib/site-packages/idna/uts46data.py | 8383 ++++++++++++++++ .../pip-24.2.dist-info/AUTHORS.txt | 796 ++ .../pip-24.2.dist-info/INSTALLER | 1 + .../pip-24.2.dist-info/LICENSE.txt | 20 + .../site-packages/pip-24.2.dist-info/METADATA | 89 + .../site-packages/pip-24.2.dist-info/RECORD | 853 ++ .../pip-24.2.dist-info/REQUESTED | 0 .../site-packages/pip-24.2.dist-info/WHEEL | 5 + .../pip-24.2.dist-info/entry_points.txt | 3 + .../pip-24.2.dist-info/top_level.txt | 1 + .../venv/Lib/site-packages/pip/__init__.py | 13 + .../venv/Lib/site-packages/pip/__main__.py | 24 + .../Lib/site-packages/pip/__pip-runner__.py | 50 + .../pip/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 701 bytes .../pip/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 857 bytes .../__pip-runner__.cpython-312.pyc | Bin 0 -> 2221 bytes .../site-packages/pip/_internal/__init__.py | 18 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 803 bytes .../__pycache__/build_env.cpython-312.pyc | Bin 0 -> 14488 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 12683 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 0 -> 17648 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 35567 bytes .../__pycache__/main.cpython-312.pyc | Bin 0 -> 686 bytes .../__pycache__/pyproject.cpython-312.pyc | Bin 0 -> 5134 bytes .../self_outdated_check.cpython-312.pyc | Bin 0 -> 10224 bytes .../__pycache__/wheel_builder.cpython-312.pyc | Bin 0 -> 13631 bytes .../site-packages/pip/_internal/build_env.py | 315 + .../Lib/site-packages/pip/_internal/cache.py | 290 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 294 bytes .../autocompletion.cpython-312.pyc | Bin 0 -> 8622 bytes .../__pycache__/base_command.cpython-312.pyc | Bin 0 -> 10210 bytes .../__pycache__/cmdoptions.cpython-312.pyc | Bin 0 -> 30411 bytes .../command_context.cpython-312.pyc | Bin 0 -> 1790 bytes .../__pycache__/index_command.cpython-312.pyc | Bin 0 -> 7140 bytes .../cli/__pycache__/main.cpython-312.pyc | Bin 0 -> 2316 bytes .../__pycache__/main_parser.cpython-312.pyc | Bin 0 -> 4922 bytes .../cli/__pycache__/parser.cpython-312.pyc | Bin 0 -> 15029 bytes .../__pycache__/progress_bars.cpython-312.pyc | Bin 0 -> 3850 bytes .../__pycache__/req_command.cpython-312.pyc | Bin 0 -> 12257 bytes .../cli/__pycache__/spinners.cpython-312.pyc | Bin 0 -> 7849 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 0 -> 391 bytes .../pip/_internal/cli/autocompletion.py | 176 + .../pip/_internal/cli/base_command.py | 231 + .../pip/_internal/cli/cmdoptions.py | 1075 +++ .../pip/_internal/cli/command_context.py | 27 + .../pip/_internal/cli/index_command.py | 170 + .../site-packages/pip/_internal/cli/main.py | 80 + .../pip/_internal/cli/main_parser.py | 134 + .../site-packages/pip/_internal/cli/parser.py | 294 + .../pip/_internal/cli/progress_bars.py | 94 + .../pip/_internal/cli/req_command.py | 329 + .../pip/_internal/cli/spinners.py | 159 + .../pip/_internal/cli/status_codes.py | 6 + .../pip/_internal/commands/__init__.py | 132 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4018 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 9717 bytes .../__pycache__/check.cpython-312.pyc | Bin 0 -> 2608 bytes .../__pycache__/completion.cpython-312.pyc | Bin 0 -> 5209 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 0 -> 13179 bytes .../__pycache__/debug.cpython-312.pyc | Bin 0 -> 10084 bytes .../__pycache__/download.cpython-312.pyc | Bin 0 -> 7519 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 0 -> 4401 bytes .../commands/__pycache__/hash.cpython-312.pyc | Bin 0 -> 2984 bytes .../commands/__pycache__/help.cpython-312.pyc | Bin 0 -> 1689 bytes .../__pycache__/index.cpython-312.pyc | Bin 0 -> 6687 bytes .../__pycache__/inspect.cpython-312.pyc | Bin 0 -> 3996 bytes .../__pycache__/install.cpython-312.pyc | Bin 0 -> 29130 bytes .../commands/__pycache__/list.cpython-312.pyc | Bin 0 -> 15773 bytes .../__pycache__/search.cpython-312.pyc | Bin 0 -> 7534 bytes .../commands/__pycache__/show.cpython-312.pyc | Bin 0 -> 10493 bytes .../__pycache__/uninstall.cpython-312.pyc | Bin 0 -> 4725 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 0 -> 8881 bytes .../pip/_internal/commands/cache.py | 225 + .../pip/_internal/commands/check.py | 67 + .../pip/_internal/commands/completion.py | 130 + .../pip/_internal/commands/configuration.py | 280 + .../pip/_internal/commands/debug.py | 201 + .../pip/_internal/commands/download.py | 146 + .../pip/_internal/commands/freeze.py | 109 + .../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 | 783 ++ .../pip/_internal/commands/list.py | 375 + .../pip/_internal/commands/search.py | 172 + .../pip/_internal/commands/show.py | 217 + .../pip/_internal/commands/uninstall.py | 114 + .../pip/_internal/commands/wheel.py | 182 + .../pip/_internal/configuration.py | 383 + .../pip/_internal/distributions/__init__.py | 21 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 957 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 2909 bytes .../__pycache__/installed.cpython-312.pyc | Bin 0 -> 1716 bytes .../__pycache__/sdist.cpython-312.pyc | Bin 0 -> 8443 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 0 -> 2297 bytes .../pip/_internal/distributions/base.py | 53 + .../pip/_internal/distributions/installed.py | 29 + .../pip/_internal/distributions/sdist.py | 158 + .../pip/_internal/distributions/wheel.py | 42 + .../site-packages/pip/_internal/exceptions.py | 777 ++ .../pip/_internal/index/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 248 bytes .../__pycache__/collector.cpython-312.pyc | Bin 0 -> 21633 bytes .../package_finder.cpython-312.pyc | Bin 0 -> 40664 bytes .../index/__pycache__/sources.cpython-312.pyc | Bin 0 -> 12604 bytes .../pip/_internal/index/collector.py | 494 + .../pip/_internal/index/package_finder.py | 1020 ++ .../pip/_internal/index/sources.py | 285 + .../pip/_internal/locations/__init__.py | 456 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 16456 bytes .../__pycache__/_distutils.cpython-312.pyc | Bin 0 -> 6868 bytes .../__pycache__/_sysconfig.cpython-312.pyc | Bin 0 -> 8044 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 3797 bytes .../pip/_internal/locations/_distutils.py | 172 + .../pip/_internal/locations/_sysconfig.py | 214 + .../pip/_internal/locations/base.py | 81 + .../Lib/site-packages/pip/_internal/main.py | 12 + .../pip/_internal/metadata/__init__.py | 128 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5885 bytes .../__pycache__/_json.cpython-312.pyc | Bin 0 -> 2942 bytes .../metadata/__pycache__/base.cpython-312.pyc | Bin 0 -> 35214 bytes .../__pycache__/pkg_resources.cpython-312.pyc | Bin 0 -> 16100 bytes .../pip/_internal/metadata/_json.py | 84 + .../pip/_internal/metadata/base.py | 688 ++ .../_internal/metadata/importlib/__init__.py | 6 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 374 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 0 -> 4507 bytes .../__pycache__/_dists.cpython-312.pyc | Bin 0 -> 12581 bytes .../__pycache__/_envs.cpython-312.pyc | Bin 0 -> 11095 bytes .../_internal/metadata/importlib/_compat.py | 85 + .../_internal/metadata/importlib/_dists.py | 221 + .../pip/_internal/metadata/importlib/_envs.py | 189 + .../pip/_internal/metadata/pkg_resources.py | 301 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 282 bytes .../__pycache__/candidate.cpython-312.pyc | Bin 0 -> 1620 bytes .../__pycache__/direct_url.cpython-312.pyc | Bin 0 -> 10860 bytes .../format_control.cpython-312.pyc | Bin 0 -> 4239 bytes .../models/__pycache__/index.cpython-312.pyc | Bin 0 -> 1710 bytes .../installation_report.cpython-312.pyc | Bin 0 -> 2293 bytes .../models/__pycache__/link.cpython-312.pyc | Bin 0 -> 26633 bytes .../models/__pycache__/scheme.cpython-312.pyc | Bin 0 -> 1039 bytes .../__pycache__/search_scope.cpython-312.pyc | Bin 0 -> 5003 bytes .../selection_prefs.cpython-312.pyc | Bin 0 -> 1867 bytes .../__pycache__/target_python.cpython-312.pyc | Bin 0 -> 4969 bytes .../models/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 5776 bytes .../pip/_internal/models/candidate.py | 25 + .../pip/_internal/models/direct_url.py | 224 + .../pip/_internal/models/format_control.py | 78 + .../pip/_internal/models/index.py | 28 + .../_internal/models/installation_report.py | 56 + .../pip/_internal/models/link.py | 590 ++ .../pip/_internal/models/scheme.py | 25 + .../pip/_internal/models/search_scope.py | 127 + .../pip/_internal/models/selection_prefs.py | 53 + .../pip/_internal/models/target_python.py | 121 + .../pip/_internal/models/wheel.py | 93 + .../pip/_internal/network/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 270 bytes .../network/__pycache__/auth.cpython-312.pyc | Bin 0 -> 22115 bytes .../network/__pycache__/cache.cpython-312.pyc | Bin 0 -> 6467 bytes .../__pycache__/download.cpython-312.pyc | Bin 0 -> 8495 bytes .../__pycache__/lazy_wheel.cpython-312.pyc | Bin 0 -> 11623 bytes .../__pycache__/session.cpython-312.pyc | Bin 0 -> 18890 bytes .../network/__pycache__/utils.cpython-312.pyc | Bin 0 -> 2271 bytes .../__pycache__/xmlrpc.cpython-312.pyc | Bin 0 -> 2965 bytes .../pip/_internal/network/auth.py | 566 ++ .../pip/_internal/network/cache.py | 106 + .../pip/_internal/network/download.py | 187 + .../pip/_internal/network/lazy_wheel.py | 210 + .../pip/_internal/network/session.py | 522 + .../pip/_internal/network/utils.py | 98 + .../pip/_internal/network/xmlrpc.py | 62 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 213 bytes .../__pycache__/check.cpython-312.pyc | Bin 0 -> 7120 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 0 -> 10144 bytes .../__pycache__/prepare.cpython-312.pyc | Bin 0 -> 25788 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 219 bytes .../__pycache__/build_tracker.cpython-312.pyc | Bin 0 -> 7683 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 1873 bytes .../metadata_editable.cpython-312.pyc | Bin 0 -> 1907 bytes .../metadata_legacy.cpython-312.pyc | Bin 0 -> 3027 bytes .../build/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 1693 bytes .../wheel_editable.cpython-312.pyc | Bin 0 -> 2032 bytes .../__pycache__/wheel_legacy.cpython-312.pyc | Bin 0 -> 3862 bytes .../operations/build/build_tracker.py | 138 + .../_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 | 181 + .../pip/_internal/operations/freeze.py | 258 + .../_internal/operations/install/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 282 bytes .../editable_legacy.cpython-312.pyc | Bin 0 -> 1814 bytes .../install/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 34119 bytes .../operations/install/editable_legacy.py | 47 + .../pip/_internal/operations/install/wheel.py | 741 ++ .../pip/_internal/operations/prepare.py | 732 ++ .../site-packages/pip/_internal/pyproject.py | 185 + .../pip/_internal/req/__init__.py | 90 + .../req/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3461 bytes .../__pycache__/constructors.cpython-312.pyc | Bin 0 -> 21234 bytes .../req/__pycache__/req_file.cpython-312.pyc | Bin 0 -> 21448 bytes .../__pycache__/req_install.cpython-312.pyc | Bin 0 -> 38491 bytes .../req/__pycache__/req_set.cpython-312.pyc | Bin 0 -> 5499 bytes .../__pycache__/req_uninstall.cpython-312.pyc | Bin 0 -> 32110 bytes .../pip/_internal/req/constructors.py | 560 ++ .../pip/_internal/req/req_file.py | 551 ++ .../pip/_internal/req/req_install.py | 934 ++ .../pip/_internal/req/req_set.py | 82 + .../pip/_internal/req/req_uninstall.py | 633 ++ .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 213 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 1201 bytes .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 220 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 0 -> 22595 bytes .../_internal/resolution/legacy/resolver.py | 597 ++ .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 224 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 8165 bytes .../__pycache__/candidates.cpython-312.pyc | Bin 0 -> 29188 bytes .../__pycache__/factory.cpython-312.pyc | Bin 0 -> 32302 bytes .../found_candidates.cpython-312.pyc | Bin 0 -> 6809 bytes .../__pycache__/provider.cpython-312.pyc | Bin 0 -> 10539 bytes .../__pycache__/reporter.cpython-312.pyc | Bin 0 -> 5056 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 0 -> 15372 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 0 -> 12330 bytes .../_internal/resolution/resolvelib/base.py | 139 + .../resolution/resolvelib/candidates.py | 569 ++ .../resolution/resolvelib/factory.py | 817 ++ .../resolution/resolvelib/found_candidates.py | 174 + .../resolution/resolvelib/provider.py | 258 + .../resolution/resolvelib/reporter.py | 81 + .../resolution/resolvelib/requirements.py | 245 + .../resolution/resolvelib/resolver.py | 317 + .../pip/_internal/self_outdated_check.py | 244 + .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 208 bytes .../__pycache__/_jaraco_text.cpython-312.pyc | Bin 0 -> 4543 bytes .../utils/__pycache__/_log.cpython-312.pyc | Bin 0 -> 1879 bytes .../utils/__pycache__/appdirs.cpython-312.pyc | Bin 0 -> 2423 bytes .../utils/__pycache__/compat.cpython-312.pyc | Bin 0 -> 2920 bytes .../compatibility_tags.cpython-312.pyc | Bin 0 -> 5576 bytes .../__pycache__/datetime.cpython-312.pyc | Bin 0 -> 697 bytes .../__pycache__/deprecation.cpython-312.pyc | Bin 0 -> 4204 bytes .../direct_url_helpers.cpython-312.pyc | Bin 0 -> 3549 bytes .../__pycache__/egg_link.cpython-312.pyc | Bin 0 -> 3219 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 0 -> 2161 bytes .../__pycache__/entrypoints.cpython-312.pyc | Bin 0 -> 4006 bytes .../__pycache__/filesystem.cpython-312.pyc | Bin 0 -> 7342 bytes .../__pycache__/filetypes.cpython-312.pyc | Bin 0 -> 1177 bytes .../utils/__pycache__/glibc.cpython-312.pyc | Bin 0 -> 2432 bytes .../utils/__pycache__/hashes.cpython-312.pyc | Bin 0 -> 7616 bytes .../utils/__pycache__/logging.cpython-312.pyc | Bin 0 -> 13571 bytes .../utils/__pycache__/misc.cpython-312.pyc | Bin 0 -> 33564 bytes .../__pycache__/packaging.cpython-312.pyc | Bin 0 -> 2596 bytes .../utils/__pycache__/retry.cpython-312.pyc | Bin 0 -> 2121 bytes .../setuptools_build.cpython-312.pyc | Bin 0 -> 4563 bytes .../__pycache__/subprocess.cpython-312.pyc | Bin 0 -> 8652 bytes .../__pycache__/temp_dir.cpython-312.pyc | Bin 0 -> 12037 bytes .../__pycache__/unpacking.cpython-312.pyc | Bin 0 -> 13511 bytes .../utils/__pycache__/urls.cpython-312.pyc | Bin 0 -> 2090 bytes .../__pycache__/virtualenv.cpython-312.pyc | Bin 0 -> 4479 bytes .../utils/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 5916 bytes .../pip/_internal/utils/_jaraco_text.py | 109 + .../site-packages/pip/_internal/utils/_log.py | 38 + .../pip/_internal/utils/appdirs.py | 52 + .../pip/_internal/utils/compat.py | 79 + .../pip/_internal/utils/compatibility_tags.py | 165 + .../pip/_internal/utils/datetime.py | 11 + .../pip/_internal/utils/deprecation.py | 124 + .../pip/_internal/utils/direct_url_helpers.py | 87 + .../pip/_internal/utils/egg_link.py | 80 + .../pip/_internal/utils/encoding.py | 36 + .../pip/_internal/utils/entrypoints.py | 84 + .../pip/_internal/utils/filesystem.py | 149 + .../pip/_internal/utils/filetypes.py | 27 + .../pip/_internal/utils/glibc.py | 101 + .../pip/_internal/utils/hashes.py | 147 + .../pip/_internal/utils/logging.py | 347 + .../site-packages/pip/_internal/utils/misc.py | 777 ++ .../pip/_internal/utils/packaging.py | 57 + .../pip/_internal/utils/retry.py | 42 + .../pip/_internal/utils/setuptools_build.py | 146 + .../pip/_internal/utils/subprocess.py | 245 + .../pip/_internal/utils/temp_dir.py | 296 + .../pip/_internal/utils/unpacking.py | 337 + .../site-packages/pip/_internal/utils/urls.py | 55 + .../pip/_internal/utils/virtualenv.py | 104 + .../pip/_internal/utils/wheel.py | 134 + .../pip/_internal/vcs/__init__.py | 15 + .../vcs/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 547 bytes .../vcs/__pycache__/bazaar.cpython-312.pyc | Bin 0 -> 5068 bytes .../vcs/__pycache__/git.cpython-312.pyc | Bin 0 -> 19033 bytes .../vcs/__pycache__/mercurial.cpython-312.pyc | Bin 0 -> 7621 bytes .../__pycache__/subversion.cpython-312.pyc | Bin 0 -> 12540 bytes .../versioncontrol.cpython-312.pyc | Bin 0 -> 29013 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 112 + .../site-packages/pip/_internal/vcs/git.py | 527 + .../pip/_internal/vcs/mercurial.py | 163 + .../pip/_internal/vcs/subversion.py | 324 + .../pip/_internal/vcs/versioncontrol.py | 688 ++ .../pip/_internal/wheel_builder.py | 354 + .../Lib/site-packages/pip/_vendor/__init__.py | 116 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4566 bytes .../typing_extensions.cpython-312.pyc | Bin 0 -> 139468 bytes .../pip/_vendor/cachecontrol/__init__.py | 28 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 919 bytes .../__pycache__/_cmd.cpython-312.pyc | Bin 0 -> 2663 bytes .../__pycache__/adapter.cpython-312.pyc | Bin 0 -> 6481 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 3804 bytes .../__pycache__/controller.cpython-312.pyc | Bin 0 -> 16241 bytes .../__pycache__/filewrapper.cpython-312.pyc | Bin 0 -> 4364 bytes .../__pycache__/heuristics.cpython-312.pyc | Bin 0 -> 6711 bytes .../__pycache__/serialize.cpython-312.pyc | Bin 0 -> 5278 bytes .../__pycache__/wrapper.cpython-312.pyc | Bin 0 -> 1691 bytes .../pip/_vendor/cachecontrol/_cmd.py | 70 + .../pip/_vendor/cachecontrol/adapter.py | 161 + .../pip/_vendor/cachecontrol/cache.py | 74 + .../_vendor/cachecontrol/caches/__init__.py | 8 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 452 bytes .../__pycache__/file_cache.cpython-312.pyc | Bin 0 -> 7780 bytes .../__pycache__/redis_cache.cpython-312.pyc | Bin 0 -> 2750 bytes .../_vendor/cachecontrol/caches/file_cache.py | 182 + .../cachecontrol/caches/redis_cache.py | 48 + .../pip/_vendor/cachecontrol/controller.py | 499 + .../pip/_vendor/cachecontrol/filewrapper.py | 119 + .../pip/_vendor/cachecontrol/heuristics.py | 154 + .../pip/_vendor/cachecontrol/py.typed | 0 .../pip/_vendor/cachecontrol/serialize.py | 146 + .../pip/_vendor/cachecontrol/wrapper.py | 43 + .../pip/_vendor/certifi/__init__.py | 4 + .../pip/_vendor/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 335 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 662 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 0 -> 3228 bytes .../pip/_vendor/certifi/cacert.pem | 4798 +++++++++ .../site-packages/pip/_vendor/certifi/core.py | 114 + .../pip/_vendor/certifi/py.typed | 0 .../pip/_vendor/distlib/__init__.py | 33 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1286 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 45548 bytes .../__pycache__/database.cpython-312.pyc | Bin 0 -> 65698 bytes .../distlib/__pycache__/index.cpython-312.pyc | Bin 0 -> 24333 bytes .../__pycache__/locators.cpython-312.pyc | Bin 0 -> 59947 bytes .../__pycache__/manifest.cpython-312.pyc | Bin 0 -> 15093 bytes .../__pycache__/markers.cpython-312.pyc | Bin 0 -> 7695 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 41683 bytes .../__pycache__/resources.cpython-312.pyc | Bin 0 -> 17329 bytes .../__pycache__/scripts.cpython-312.pyc | Bin 0 -> 19786 bytes .../distlib/__pycache__/util.cpython-312.pyc | Bin 0 -> 88034 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 30362 bytes .../distlib/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 51465 bytes .../pip/_vendor/distlib/compat.py | 1138 +++ .../pip/_vendor/distlib/database.py | 1359 +++ .../pip/_vendor/distlib/index.py | 508 + .../pip/_vendor/distlib/locators.py | 1303 +++ .../pip/_vendor/distlib/manifest.py | 384 + .../pip/_vendor/distlib/markers.py | 167 + .../pip/_vendor/distlib/metadata.py | 1068 ++ .../pip/_vendor/distlib/resources.py | 358 + .../pip/_vendor/distlib/scripts.py | 466 + .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 97792 bytes .../pip/_vendor/distlib/t64-arm.exe | Bin 0 -> 182784 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 108032 bytes .../site-packages/pip/_vendor/distlib/util.py | 2025 ++++ .../pip/_vendor/distlib/version.py | 751 ++ .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 91648 bytes .../pip/_vendor/distlib/w64-arm.exe | Bin 0 -> 168448 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 101888 bytes .../pip/_vendor/distlib/wheel.py | 1099 +++ .../pip/_vendor/distro/__init__.py | 54 + .../pip/_vendor/distro/__main__.py | 4 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 977 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 309 bytes .../distro/__pycache__/distro.cpython-312.pyc | Bin 0 -> 53809 bytes .../pip/_vendor/distro/distro.py | 1403 +++ .../site-packages/pip/_vendor/distro/py.typed | 0 .../pip/_vendor/idna/__init__.py | 44 + .../idna/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 898 bytes .../idna/__pycache__/codec.cpython-312.pyc | Bin 0 -> 4993 bytes .../idna/__pycache__/compat.cpython-312.pyc | Bin 0 -> 904 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 0 -> 15808 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 0 -> 99493 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 0 -> 2650 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 0 -> 233 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 0 -> 158865 bytes .../site-packages/pip/_vendor/idna/codec.py | 118 + .../site-packages/pip/_vendor/idna/compat.py | 13 + .../site-packages/pip/_vendor/idna/core.py | 395 + .../pip/_vendor/idna/idnadata.py | 4245 ++++++++ .../pip/_vendor/idna/intranges.py | 54 + .../pip/_vendor/idna/package_data.py | 2 + .../site-packages/pip/_vendor/idna/py.typed | 0 .../pip/_vendor/idna/uts46data.py | 8598 +++++++++++++++++ .../pip/_vendor/msgpack/__init__.py | 55 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1758 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 2042 bytes .../msgpack/__pycache__/ext.cpython-312.pyc | Bin 0 -> 8187 bytes .../__pycache__/fallback.cpython-312.pyc | Bin 0 -> 42060 bytes .../pip/_vendor/msgpack/exceptions.py | 48 + .../site-packages/pip/_vendor/msgpack/ext.py | 168 + .../pip/_vendor/msgpack/fallback.py | 951 ++ .../pip/_vendor/packaging/__init__.py | 15 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 575 bytes .../__pycache__/_elffile.cpython-312.pyc | Bin 0 -> 4984 bytes .../__pycache__/_manylinux.cpython-312.pyc | Bin 0 -> 9702 bytes .../__pycache__/_musllinux.cpython-312.pyc | Bin 0 -> 4571 bytes .../__pycache__/_parser.cpython-312.pyc | Bin 0 -> 14002 bytes .../__pycache__/_structures.cpython-312.pyc | Bin 0 -> 3258 bytes .../__pycache__/_tokenizer.cpython-312.pyc | Bin 0 -> 7932 bytes .../__pycache__/markers.cpython-312.pyc | Bin 0 -> 11028 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 24970 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 0 -> 4427 bytes .../__pycache__/specifiers.cpython-312.pyc | Bin 0 -> 38756 bytes .../__pycache__/tags.cpython-312.pyc | Bin 0 -> 21361 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 7358 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 19524 bytes .../pip/_vendor/packaging/_elffile.py | 110 + .../pip/_vendor/packaging/_manylinux.py | 262 + .../pip/_vendor/packaging/_musllinux.py | 85 + .../pip/_vendor/packaging/_parser.py | 354 + .../pip/_vendor/packaging/_structures.py | 61 + .../pip/_vendor/packaging/_tokenizer.py | 194 + .../pip/_vendor/packaging/markers.py | 325 + .../pip/_vendor/packaging/metadata.py | 804 ++ .../pip/_vendor/packaging/py.typed | 0 .../pip/_vendor/packaging/requirements.py | 91 + .../pip/_vendor/packaging/specifiers.py | 1009 ++ .../pip/_vendor/packaging/tags.py | 568 ++ .../pip/_vendor/packaging/utils.py | 174 + .../pip/_vendor/packaging/version.py | 563 ++ .../pip/_vendor/pkg_resources/__init__.py | 3676 +++++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 161278 bytes .../pip/_vendor/platformdirs/__init__.py | 627 ++ .../pip/_vendor/platformdirs/__main__.py | 55 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 19846 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 1965 bytes .../__pycache__/android.cpython-312.pyc | Bin 0 -> 10714 bytes .../__pycache__/api.cpython-312.pyc | Bin 0 -> 12928 bytes .../__pycache__/macos.cpython-312.pyc | Bin 0 -> 8024 bytes .../__pycache__/unix.cpython-312.pyc | Bin 0 -> 15054 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 614 bytes .../__pycache__/windows.cpython-312.pyc | Bin 0 -> 13691 bytes .../pip/_vendor/platformdirs/android.py | 249 + .../pip/_vendor/platformdirs/api.py | 292 + .../pip/_vendor/platformdirs/macos.py | 130 + .../pip/_vendor/platformdirs/py.typed | 0 .../pip/_vendor/platformdirs/unix.py | 275 + .../pip/_vendor/platformdirs/version.py | 16 + .../pip/_vendor/platformdirs/windows.py | 272 + .../pip/_vendor/pygments/__init__.py | 82 + .../pip/_vendor/pygments/__main__.py | 17 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3506 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 752 bytes .../__pycache__/cmdline.cpython-312.pyc | Bin 0 -> 26602 bytes .../__pycache__/console.cpython-312.pyc | Bin 0 -> 2646 bytes .../__pycache__/filter.cpython-312.pyc | Bin 0 -> 3239 bytes .../__pycache__/formatter.cpython-312.pyc | Bin 0 -> 4738 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 0 -> 38379 bytes .../__pycache__/modeline.cpython-312.pyc | Bin 0 -> 1577 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 0 -> 2626 bytes .../__pycache__/regexopt.cpython-312.pyc | Bin 0 -> 4095 bytes .../__pycache__/scanner.cpython-312.pyc | Bin 0 -> 4774 bytes .../__pycache__/sphinxext.cpython-312.pyc | Bin 0 -> 12116 bytes .../__pycache__/style.cpython-312.pyc | Bin 0 -> 6711 bytes .../__pycache__/token.cpython-312.pyc | Bin 0 -> 8207 bytes .../__pycache__/unistring.cpython-312.pyc | Bin 0 -> 32990 bytes .../pygments/__pycache__/util.cpython-312.pyc | Bin 0 -> 14087 bytes .../pip/_vendor/pygments/cmdline.py | 668 ++ .../pip/_vendor/pygments/console.py | 70 + .../pip/_vendor/pygments/filter.py | 70 + .../pip/_vendor/pygments/filters/__init__.py | 940 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 37929 bytes .../pip/_vendor/pygments/formatter.py | 129 + .../_vendor/pygments/formatters/__init__.py | 157 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6920 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 4233 bytes .../__pycache__/bbcode.cpython-312.pyc | Bin 0 -> 4240 bytes .../__pycache__/groff.cpython-312.pyc | Bin 0 -> 7311 bytes .../__pycache__/html.cpython-312.pyc | Bin 0 -> 41044 bytes .../__pycache__/img.cpython-312.pyc | Bin 0 -> 28566 bytes .../__pycache__/irc.cpython-312.pyc | Bin 0 -> 6073 bytes .../__pycache__/latex.cpython-312.pyc | Bin 0 -> 20143 bytes .../__pycache__/other.cpython-312.pyc | Bin 0 -> 6895 bytes .../__pycache__/pangomarkup.cpython-312.pyc | Bin 0 -> 2976 bytes .../__pycache__/rtf.cpython-312.pyc | Bin 0 -> 13791 bytes .../__pycache__/svg.cpython-312.pyc | Bin 0 -> 9157 bytes .../__pycache__/terminal.cpython-312.pyc | Bin 0 -> 5837 bytes .../__pycache__/terminal256.cpython-312.pyc | Bin 0 -> 15136 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 | 987 ++ .../pip/_vendor/pygments/formatters/img.py | 685 ++ .../pip/_vendor/pygments/formatters/irc.py | 154 + .../pip/_vendor/pygments/formatters/latex.py | 518 + .../pip/_vendor/pygments/formatters/other.py | 160 + .../pygments/formatters/pangomarkup.py | 83 + .../pip/_vendor/pygments/formatters/rtf.py | 349 + .../pip/_vendor/pygments/formatters/svg.py | 185 + .../_vendor/pygments/formatters/terminal.py | 127 + .../pygments/formatters/terminal256.py | 338 + .../pip/_vendor/pygments/lexer.py | 963 ++ .../pip/_vendor/pygments/lexers/__init__.py | 362 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 14639 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 68281 bytes .../lexers/__pycache__/python.cpython-312.pyc | Bin 0 -> 42985 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 589 ++ .../pip/_vendor/pygments/lexers/python.py | 1198 +++ .../pip/_vendor/pygments/modeline.py | 43 + .../pip/_vendor/pygments/plugin.py | 72 + .../pip/_vendor/pygments/regexopt.py | 91 + .../pip/_vendor/pygments/scanner.py | 104 + .../pip/_vendor/pygments/sphinxext.py | 247 + .../pip/_vendor/pygments/style.py | 203 + .../pip/_vendor/pygments/styles/__init__.py | 61 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2682 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 3666 bytes .../pip/_vendor/pygments/styles/_mapping.py | 54 + .../pip/_vendor/pygments/token.py | 214 + .../pip/_vendor/pygments/unistring.py | 153 + .../pip/_vendor/pygments/util.py | 324 + .../pip/_vendor/pyproject_hooks/__init__.py | 23 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 631 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 0 -> 392 bytes .../__pycache__/_impl.cpython-312.pyc | Bin 0 -> 14711 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-312.pyc | Bin 0 -> 1098 bytes .../__pycache__/_in_process.cpython-312.pyc | Bin 0 -> 14371 bytes .../_in_process/_in_process.py | 353 + .../pip/_vendor/requests/__init__.py | 179 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5271 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 0 -> 602 bytes .../_internal_utils.cpython-312.pyc | Bin 0 -> 2042 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 0 -> 28449 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 0 -> 7209 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 0 -> 13939 bytes .../__pycache__/certs.cpython-312.pyc | Bin 0 -> 940 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 1695 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 0 -> 25216 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 7616 bytes .../requests/__pycache__/help.cpython-312.pyc | Bin 0 -> 4246 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 0 -> 1069 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 35446 bytes .../__pycache__/packages.cpython-312.pyc | Bin 0 -> 1284 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 0 -> 27864 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 0 -> 6041 bytes .../__pycache__/structures.cpython-312.pyc | Bin 0 -> 5641 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 36384 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 50 + .../pip/_vendor/requests/adapters.py | 719 ++ .../site-packages/pip/_vendor/requests/api.py | 157 + .../pip/_vendor/requests/auth.py | 314 + .../pip/_vendor/requests/certs.py | 24 + .../pip/_vendor/requests/compat.py | 78 + .../pip/_vendor/requests/cookies.py | 561 ++ .../pip/_vendor/requests/exceptions.py | 151 + .../pip/_vendor/requests/help.py | 127 + .../pip/_vendor/requests/hooks.py | 33 + .../pip/_vendor/requests/models.py | 1037 ++ .../pip/_vendor/requests/packages.py | 25 + .../pip/_vendor/requests/sessions.py | 831 ++ .../pip/_vendor/requests/status_codes.py | 128 + .../pip/_vendor/requests/structures.py | 99 + .../pip/_vendor/requests/utils.py | 1096 +++ .../pip/_vendor/resolvelib/__init__.py | 26 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 652 bytes .../__pycache__/providers.cpython-312.pyc | Bin 0 -> 6869 bytes .../__pycache__/reporters.cpython-312.pyc | Bin 0 -> 2672 bytes .../__pycache__/resolvers.cpython-312.pyc | Bin 0 -> 25898 bytes .../__pycache__/structs.cpython-312.pyc | Bin 0 -> 10518 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 218 bytes .../collections_abc.cpython-312.pyc | Bin 0 -> 438 bytes .../resolvelib/compat/collections_abc.py | 6 + .../pip/_vendor/resolvelib/providers.py | 133 + .../pip/_vendor/resolvelib/py.typed | 0 .../pip/_vendor/resolvelib/reporters.py | 43 + .../pip/_vendor/resolvelib/resolvers.py | 547 ++ .../pip/_vendor/resolvelib/structs.py | 170 + .../pip/_vendor/rich/__init__.py | 177 + .../pip/_vendor/rich/__main__.py | 273 + .../rich/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 7033 bytes .../rich/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 10310 bytes .../__pycache__/_cell_widths.cpython-312.pyc | Bin 0 -> 7890 bytes .../__pycache__/_emoji_codes.cpython-312.pyc | Bin 0 -> 205994 bytes .../_emoji_replace.cpython-312.pyc | Bin 0 -> 1747 bytes .../_export_format.cpython-312.pyc | Bin 0 -> 2367 bytes .../__pycache__/_extension.cpython-312.pyc | Bin 0 -> 555 bytes .../rich/__pycache__/_fileno.cpython-312.pyc | Bin 0 -> 873 bytes .../rich/__pycache__/_inspect.cpython-312.pyc | Bin 0 -> 12091 bytes .../__pycache__/_log_render.cpython-312.pyc | Bin 0 -> 4165 bytes .../rich/__pycache__/_loop.cpython-312.pyc | Bin 0 -> 1888 bytes .../__pycache__/_null_file.cpython-312.pyc | Bin 0 -> 3638 bytes .../__pycache__/_palettes.cpython-312.pyc | Bin 0 -> 5178 bytes .../rich/__pycache__/_pick.cpython-312.pyc | Bin 0 -> 739 bytes .../rich/__pycache__/_ratio.cpython-312.pyc | Bin 0 -> 6588 bytes .../__pycache__/_spinners.cpython-312.pyc | Bin 0 -> 13197 bytes .../rich/__pycache__/_stack.cpython-312.pyc | Bin 0 -> 983 bytes .../rich/__pycache__/_timer.cpython-312.pyc | Bin 0 -> 883 bytes .../_win32_console.cpython-312.pyc | Bin 0 -> 28994 bytes .../rich/__pycache__/_windows.cpython-312.pyc | Bin 0 -> 2508 bytes .../_windows_renderer.cpython-312.pyc | Bin 0 -> 3581 bytes .../rich/__pycache__/_wrap.cpython-312.pyc | Bin 0 -> 3344 bytes .../rich/__pycache__/abc.cpython-312.pyc | Bin 0 -> 1626 bytes .../rich/__pycache__/align.cpython-312.pyc | Bin 0 -> 12305 bytes .../rich/__pycache__/ansi.cpython-312.pyc | Bin 0 -> 9084 bytes .../rich/__pycache__/bar.cpython-312.pyc | Bin 0 -> 4290 bytes .../rich/__pycache__/box.cpython-312.pyc | Bin 0 -> 11856 bytes .../rich/__pycache__/cells.cpython-312.pyc | Bin 0 -> 5828 bytes .../rich/__pycache__/color.cpython-312.pyc | Bin 0 -> 26587 bytes .../__pycache__/color_triplet.cpython-312.pyc | Bin 0 -> 1719 bytes .../rich/__pycache__/columns.cpython-312.pyc | Bin 0 -> 8602 bytes .../rich/__pycache__/console.cpython-312.pyc | Bin 0 -> 113454 bytes .../__pycache__/constrain.cpython-312.pyc | Bin 0 -> 2276 bytes .../__pycache__/containers.cpython-312.pyc | Bin 0 -> 9228 bytes .../rich/__pycache__/control.cpython-312.pyc | Bin 0 -> 10959 bytes .../default_styles.cpython-312.pyc | Bin 0 -> 10384 bytes .../rich/__pycache__/diagnose.cpython-312.pyc | Bin 0 -> 1506 bytes .../rich/__pycache__/emoji.cpython-312.pyc | Bin 0 -> 4230 bytes .../rich/__pycache__/errors.cpython-312.pyc | Bin 0 -> 1863 bytes .../__pycache__/file_proxy.cpython-312.pyc | Bin 0 -> 3589 bytes .../rich/__pycache__/filesize.cpython-312.pyc | Bin 0 -> 3090 bytes .../__pycache__/highlighter.cpython-312.pyc | Bin 0 -> 9905 bytes .../rich/__pycache__/json.cpython-312.pyc | Bin 0 -> 6053 bytes .../rich/__pycache__/jupyter.cpython-312.pyc | Bin 0 -> 5226 bytes .../rich/__pycache__/layout.cpython-312.pyc | Bin 0 -> 20176 bytes .../rich/__pycache__/live.cpython-312.pyc | Bin 0 -> 19027 bytes .../__pycache__/live_render.cpython-312.pyc | Bin 0 -> 4907 bytes .../rich/__pycache__/logging.cpython-312.pyc | Bin 0 -> 13572 bytes .../rich/__pycache__/markup.cpython-312.pyc | Bin 0 -> 9585 bytes .../rich/__pycache__/measure.cpython-312.pyc | Bin 0 -> 6396 bytes .../rich/__pycache__/padding.cpython-312.pyc | Bin 0 -> 7142 bytes .../rich/__pycache__/pager.cpython-312.pyc | Bin 0 -> 1829 bytes .../rich/__pycache__/palette.cpython-312.pyc | Bin 0 -> 5315 bytes .../rich/__pycache__/panel.cpython-312.pyc | Bin 0 -> 12201 bytes .../rich/__pycache__/pretty.cpython-312.pyc | Bin 0 -> 40165 bytes .../rich/__pycache__/progress.cpython-312.pyc | Bin 0 -> 74953 bytes .../__pycache__/progress_bar.cpython-312.pyc | Bin 0 -> 10395 bytes .../rich/__pycache__/prompt.cpython-312.pyc | Bin 0 -> 14805 bytes .../rich/__pycache__/protocol.cpython-312.pyc | Bin 0 -> 1810 bytes .../rich/__pycache__/region.cpython-312.pyc | Bin 0 -> 585 bytes .../rich/__pycache__/repr.cpython-312.pyc | Bin 0 -> 6631 bytes .../rich/__pycache__/rule.cpython-312.pyc | Bin 0 -> 6586 bytes .../rich/__pycache__/scope.cpython-312.pyc | Bin 0 -> 3843 bytes .../rich/__pycache__/screen.cpython-312.pyc | Bin 0 -> 2497 bytes .../rich/__pycache__/segment.cpython-312.pyc | Bin 0 -> 28133 bytes .../rich/__pycache__/spinner.cpython-312.pyc | Bin 0 -> 6082 bytes .../rich/__pycache__/status.cpython-312.pyc | Bin 0 -> 6079 bytes .../rich/__pycache__/style.cpython-312.pyc | Bin 0 -> 33518 bytes .../rich/__pycache__/styled.cpython-312.pyc | Bin 0 -> 2157 bytes .../rich/__pycache__/syntax.cpython-312.pyc | Bin 0 -> 39966 bytes .../rich/__pycache__/table.cpython-312.pyc | Bin 0 -> 43557 bytes .../terminal_theme.cpython-312.pyc | Bin 0 -> 3366 bytes .../rich/__pycache__/text.cpython-312.pyc | Bin 0 -> 60867 bytes .../rich/__pycache__/theme.cpython-312.pyc | Bin 0 -> 6353 bytes .../rich/__pycache__/themes.cpython-312.pyc | Bin 0 -> 332 bytes .../__pycache__/traceback.cpython-312.pyc | Bin 0 -> 31529 bytes .../rich/__pycache__/tree.cpython-312.pyc | Bin 0 -> 11454 bytes .../pip/_vendor/rich/_cell_widths.py | 454 + .../pip/_vendor/rich/_emoji_codes.py | 3610 +++++++ .../pip/_vendor/rich/_emoji_replace.py | 32 + .../pip/_vendor/rich/_export_format.py | 76 + .../pip/_vendor/rich/_extension.py | 10 + .../site-packages/pip/_vendor/rich/_fileno.py | 24 + .../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 | 69 + .../pip/_vendor/rich/_palettes.py | 309 + .../site-packages/pip/_vendor/rich/_pick.py | 17 + .../site-packages/pip/_vendor/rich/_ratio.py | 159 + .../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 | 71 + .../pip/_vendor/rich/_windows_renderer.py | 56 + .../site-packages/pip/_vendor/rich/_wrap.py | 93 + .../Lib/site-packages/pip/_vendor/rich/abc.py | 33 + .../site-packages/pip/_vendor/rich/align.py | 311 + .../site-packages/pip/_vendor/rich/ansi.py | 240 + .../Lib/site-packages/pip/_vendor/rich/bar.py | 93 + .../Lib/site-packages/pip/_vendor/rich/box.py | 480 + .../site-packages/pip/_vendor/rich/cells.py | 167 + .../site-packages/pip/_vendor/rich/color.py | 621 ++ .../pip/_vendor/rich/color_triplet.py | 38 + .../site-packages/pip/_vendor/rich/columns.py | 187 + .../site-packages/pip/_vendor/rich/console.py | 2633 +++++ .../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 | 190 + .../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 | 57 + .../pip/_vendor/rich/filesize.py | 89 + .../pip/_vendor/rich/highlighter.py | 232 + .../site-packages/pip/_vendor/rich/json.py | 139 + .../site-packages/pip/_vendor/rich/jupyter.py | 101 + .../site-packages/pip/_vendor/rich/layout.py | 442 + .../site-packages/pip/_vendor/rich/live.py | 375 + .../pip/_vendor/rich/live_render.py | 112 + .../site-packages/pip/_vendor/rich/logging.py | 289 + .../site-packages/pip/_vendor/rich/markup.py | 251 + .../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 | 312 + .../site-packages/pip/_vendor/rich/pretty.py | 995 ++ .../pip/_vendor/rich/progress.py | 1699 ++++ .../pip/_vendor/rich/progress_bar.py | 223 + .../site-packages/pip/_vendor/rich/prompt.py | 375 + .../pip/_vendor/rich/protocol.py | 42 + .../site-packages/pip/_vendor/rich/py.typed | 0 .../site-packages/pip/_vendor/rich/region.py | 10 + .../site-packages/pip/_vendor/rich/repr.py | 149 + .../site-packages/pip/_vendor/rich/rule.py | 130 + .../site-packages/pip/_vendor/rich/scope.py | 86 + .../site-packages/pip/_vendor/rich/screen.py | 54 + .../site-packages/pip/_vendor/rich/segment.py | 738 ++ .../site-packages/pip/_vendor/rich/spinner.py | 137 + .../site-packages/pip/_vendor/rich/status.py | 131 + .../site-packages/pip/_vendor/rich/style.py | 796 ++ .../site-packages/pip/_vendor/rich/styled.py | 42 + .../site-packages/pip/_vendor/rich/syntax.py | 958 ++ .../site-packages/pip/_vendor/rich/table.py | 1000 ++ .../pip/_vendor/rich/terminal_theme.py | 153 + .../site-packages/pip/_vendor/rich/text.py | 1357 +++ .../site-packages/pip/_vendor/rich/theme.py | 115 + .../site-packages/pip/_vendor/rich/themes.py | 5 + .../pip/_vendor/rich/traceback.py | 753 ++ .../site-packages/pip/_vendor/rich/tree.py | 249 + .../pip/_vendor/tomli/__init__.py | 11 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 402 bytes .../tomli/__pycache__/_parser.cpython-312.pyc | Bin 0 -> 26917 bytes .../tomli/__pycache__/_re.cpython-312.pyc | Bin 0 -> 3926 bytes .../tomli/__pycache__/_types.cpython-312.pyc | Bin 0 -> 384 bytes .../pip/_vendor/tomli/_parser.py | 691 ++ .../site-packages/pip/_vendor/tomli/_re.py | 107 + .../site-packages/pip/_vendor/tomli/_types.py | 10 + .../site-packages/pip/_vendor/tomli/py.typed | 1 + .../pip/_vendor/truststore/__init__.py | 13 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 636 bytes .../__pycache__/_api.cpython-312.pyc | Bin 0 -> 16558 bytes .../__pycache__/_macos.cpython-312.pyc | Bin 0 -> 16590 bytes .../__pycache__/_openssl.cpython-312.pyc | Bin 0 -> 2223 bytes .../_ssl_constants.cpython-312.pyc | Bin 0 -> 1117 bytes .../__pycache__/_windows.cpython-312.pyc | Bin 0 -> 15758 bytes .../pip/_vendor/truststore/_api.py | 313 + .../pip/_vendor/truststore/_macos.py | 499 + .../pip/_vendor/truststore/_openssl.py | 66 + .../pip/_vendor/truststore/_ssl_constants.py | 31 + .../pip/_vendor/truststore/_windows.py | 564 ++ .../pip/_vendor/truststore/py.typed | 0 .../pip/_vendor/typing_extensions.py | 3641 +++++++ .../pip/_vendor/urllib3/__init__.py | 102 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3423 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 0 -> 16382 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 236 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 20421 bytes .../connectionpool.cpython-312.pyc | Bin 0 -> 36455 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 13511 bytes .../__pycache__/fields.cpython-312.pyc | Bin 0 -> 10420 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 0 -> 4030 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 0 -> 20447 bytes .../__pycache__/request.cpython-312.pyc | Bin 0 -> 7312 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 33961 bytes .../pip/_vendor/urllib3/_collections.py | 355 + .../pip/_vendor/urllib3/_version.py | 2 + .../pip/_vendor/urllib3/connection.py | 572 ++ .../pip/_vendor/urllib3/connectionpool.py | 1137 +++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 216 bytes .../_appengine_environ.cpython-312.pyc | Bin 0 -> 1866 bytes .../__pycache__/appengine.cpython-312.pyc | Bin 0 -> 11582 bytes .../__pycache__/ntlmpool.cpython-312.pyc | Bin 0 -> 5732 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 0 -> 24466 bytes .../securetransport.cpython-312.pyc | Bin 0 -> 35519 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 0 -> 7529 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 233 bytes .../__pycache__/bindings.cpython-312.pyc | Bin 0 -> 17445 bytes .../__pycache__/low_level.cpython-312.pyc | Bin 0 -> 14781 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 | 920 ++ .../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-312.pyc | Bin 0 -> 217 bytes .../packages/__pycache__/six.cpython-312.pyc | Bin 0 -> 41273 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 227 bytes .../__pycache__/makefile.cpython-312.pyc | Bin 0 -> 1843 bytes .../weakref_finalize.cpython-312.pyc | Bin 0 -> 7354 bytes .../urllib3/packages/backports/makefile.py | 51 + .../packages/backports/weakref_finalize.py | 155 + .../pip/_vendor/urllib3/packages/six.py | 1076 +++ .../pip/_vendor/urllib3/poolmanager.py | 540 ++ .../pip/_vendor/urllib3/request.py | 191 + .../pip/_vendor/urllib3/response.py | 879 ++ .../pip/_vendor/urllib3/util/__init__.py | 49 + .../util/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1164 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 4765 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 0 -> 1570 bytes .../util/__pycache__/queue.cpython-312.pyc | Bin 0 -> 1370 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 0 -> 4201 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 0 -> 3010 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 0 -> 21719 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 0 -> 15102 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 0 -> 5069 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 0 -> 10771 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 0 -> 11157 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 0 -> 15803 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 0 -> 4421 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 | 271 + .../pip/_vendor/urllib3/util/url.py | 435 + .../pip/_vendor/urllib3/util/wait.py | 152 + .../Lib/site-packages/pip/_vendor/vendor.txt | 18 + .../venv/Lib/site-packages/pip/py.typed | 4 + .../pydantic-2.13.4.dist-info/INSTALLER | 1 + .../pydantic-2.13.4.dist-info/METADATA | 1294 +++ .../pydantic-2.13.4.dist-info/RECORD | 217 + .../pydantic-2.13.4.dist-info/WHEEL | 4 + .../licenses/LICENSE | 21 + .../Lib/site-packages/pydantic/__init__.py | 456 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 14437 bytes .../__pycache__/_migration.cpython-312.pyc | Bin 0 -> 11044 bytes .../alias_generators.cpython-312.pyc | Bin 0 -> 3294 bytes .../__pycache__/aliases.cpython-312.pyc | Bin 0 -> 6574 bytes .../annotated_handlers.cpython-312.pyc | Bin 0 -> 5508 bytes .../class_validators.cpython-312.pyc | Bin 0 -> 382 bytes .../__pycache__/color.cpython-312.pyc | Bin 0 -> 30188 bytes .../__pycache__/config.cpython-312.pyc | Bin 0 -> 7566 bytes .../__pycache__/dataclasses.cpython-312.pyc | Bin 0 -> 17375 bytes .../datetime_parse.cpython-312.pyc | Bin 0 -> 382 bytes .../__pycache__/decorator.cpython-312.pyc | Bin 0 -> 372 bytes .../__pycache__/env_settings.cpython-312.pyc | Bin 0 -> 378 bytes .../error_wrappers.cpython-312.pyc | Bin 0 -> 382 bytes .../__pycache__/errors.cpython-312.pyc | Bin 0 -> 7654 bytes .../__pycache__/fields.cpython-312.pyc | Bin 0 -> 75243 bytes .../functional_serializers.cpython-312.pyc | Bin 0 -> 19098 bytes .../functional_validators.cpython-312.pyc | Bin 0 -> 34658 bytes .../__pycache__/generics.cpython-312.pyc | Bin 0 -> 370 bytes .../pydantic/__pycache__/json.cpython-312.pyc | Bin 0 -> 362 bytes .../__pycache__/json_schema.cpython-312.pyc | Bin 0 -> 121827 bytes .../pydantic/__pycache__/main.cpython-312.pyc | Bin 0 -> 78101 bytes .../pydantic/__pycache__/mypy.cpython-312.pyc | Bin 0 -> 64145 bytes .../__pycache__/networks.cpython-312.pyc | Bin 0 -> 50229 bytes .../__pycache__/parse.cpython-312.pyc | Bin 0 -> 364 bytes .../__pycache__/root_model.cpython-312.pyc | Bin 0 -> 7928 bytes .../__pycache__/schema.cpython-312.pyc | Bin 0 -> 366 bytes .../__pycache__/tools.cpython-312.pyc | Bin 0 -> 364 bytes .../__pycache__/type_adapter.cpython-312.pyc | Bin 0 -> 35909 bytes .../__pycache__/types.cpython-312.pyc | Bin 0 -> 97196 bytes .../__pycache__/typing.cpython-312.pyc | Bin 0 -> 362 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 364 bytes .../validate_call_decorator.cpython-312.pyc | Bin 0 -> 5501 bytes .../__pycache__/validators.cpython-312.pyc | Bin 0 -> 374 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 4810 bytes .../__pycache__/warnings.cpython-312.pyc | Bin 0 -> 7226 bytes .../pydantic/_internal/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 207 bytes .../__pycache__/_config.cpython-312.pyc | Bin 0 -> 15812 bytes .../_core_metadata.cpython-312.pyc | Bin 0 -> 4627 bytes .../__pycache__/_core_utils.cpython-312.pyc | Bin 0 -> 7724 bytes .../__pycache__/_dataclasses.cpython-312.pyc | Bin 0 -> 13444 bytes .../__pycache__/_decorators.cpython-312.pyc | Bin 0 -> 38145 bytes .../_decorators_v1.cpython-312.pyc | Bin 0 -> 8627 bytes .../_discriminated_union.cpython-312.pyc | Bin 0 -> 21349 bytes .../_docs_extraction.cpython-312.pyc | Bin 0 -> 5320 bytes .../__pycache__/_fields.cpython-312.pyc | Bin 0 -> 27358 bytes .../__pycache__/_forward_ref.cpython-312.pyc | Bin 0 -> 1316 bytes .../_generate_schema.cpython-312.pyc | Bin 0 -> 132422 bytes .../__pycache__/_generics.cpython-312.pyc | Bin 0 -> 23826 bytes .../__pycache__/_git.cpython-312.pyc | Bin 0 -> 1522 bytes .../__pycache__/_import_utils.cpython-312.pyc | Bin 0 -> 835 bytes .../_internal_dataclass.cpython-312.pyc | Bin 0 -> 356 bytes .../_known_annotated_metadata.cpython-312.pyc | Bin 0 -> 14269 bytes .../__pycache__/_mock_val_ser.cpython-312.pyc | Bin 0 -> 11105 bytes .../_model_construction.cpython-312.pyc | Bin 0 -> 36008 bytes .../_namespace_utils.cpython-312.pyc | Bin 0 -> 12325 bytes .../__pycache__/_repr.cpython-312.pyc | Bin 0 -> 7865 bytes .../_schema_gather.cpython-312.pyc | Bin 0 -> 7592 bytes .../_schema_generation_shared.cpython-312.pyc | Bin 0 -> 6233 bytes .../__pycache__/_serializers.cpython-312.pyc | Bin 0 -> 2123 bytes .../__pycache__/_signature.cpython-312.pyc | Bin 0 -> 6792 bytes .../__pycache__/_typing_extra.cpython-312.pyc | Bin 0 -> 29106 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 0 -> 19837 bytes .../_validate_call.cpython-312.pyc | Bin 0 -> 7024 bytes .../__pycache__/_validators.cpython-312.pyc | Bin 0 -> 22866 bytes .../pydantic/_internal/_config.py | 386 + .../pydantic/_internal/_core_metadata.py | 97 + .../pydantic/_internal/_core_utils.py | 174 + .../pydantic/_internal/_dataclasses.py | 315 + .../pydantic/_internal/_decorators.py | 873 ++ .../pydantic/_internal/_decorators_v1.py | 174 + .../_internal/_discriminated_union.py | 494 + .../pydantic/_internal/_docs_extraction.py | 113 + .../pydantic/_internal/_fields.py | 729 ++ .../pydantic/_internal/_forward_ref.py | 23 + .../pydantic/_internal/_generate_schema.py | 2934 ++++++ .../pydantic/_internal/_generics.py | 530 + .../site-packages/pydantic/_internal/_git.py | 27 + .../pydantic/_internal/_import_utils.py | 20 + .../pydantic/_internal/_internal_dataclass.py | 7 + .../_internal/_known_annotated_metadata.py | 403 + .../pydantic/_internal/_mock_val_ser.py | 228 + .../pydantic/_internal/_model_construction.py | 868 ++ .../pydantic/_internal/_namespace_utils.py | 293 + .../site-packages/pydantic/_internal/_repr.py | 124 + .../pydantic/_internal/_schema_gather.py | 212 + .../_internal/_schema_generation_shared.py | 125 + .../pydantic/_internal/_serializers.py | 53 + .../pydantic/_internal/_signature.py | 189 + .../pydantic/_internal/_typing_extra.py | 785 ++ .../pydantic/_internal/_utils.py | 446 + .../pydantic/_internal/_validate_call.py | 141 + .../pydantic/_internal/_validators.py | 534 + .../Lib/site-packages/pydantic/_migration.py | 316 + .../pydantic/alias_generators.py | 62 + .../Lib/site-packages/pydantic/aliases.py | 135 + .../pydantic/annotated_handlers.py | 122 + .../pydantic/class_validators.py | 5 + .../venv/Lib/site-packages/pydantic/color.py | 604 ++ .../venv/Lib/site-packages/pydantic/config.py | 1296 +++ .../Lib/site-packages/pydantic/dataclasses.py | 413 + .../site-packages/pydantic/datetime_parse.py | 5 + .../Lib/site-packages/pydantic/decorator.py | 5 + .../pydantic/deprecated/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 208 bytes .../class_validators.cpython-312.pyc | Bin 0 -> 11774 bytes .../__pycache__/config.cpython-312.pyc | Bin 0 -> 4085 bytes .../copy_internals.cpython-312.pyc | Bin 0 -> 8672 bytes .../__pycache__/decorator.cpython-312.pyc | Bin 0 -> 14036 bytes .../__pycache__/json.cpython-312.pyc | Bin 0 -> 6184 bytes .../__pycache__/parse.cpython-312.pyc | Bin 0 -> 3414 bytes .../__pycache__/tools.cpython-312.pyc | Bin 0 -> 3550 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 + .../venv/Lib/site-packages/pydantic/errors.py | 189 + .../pydantic/experimental/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 322 bytes .../arguments_schema.cpython-312.pyc | Bin 0 -> 2414 bytes .../missing_sentinel.cpython-312.pyc | Bin 0 -> 363 bytes .../__pycache__/pipeline.cpython-312.pyc | Bin 0 -> 34700 bytes .../pydantic/experimental/arguments_schema.py | 44 + .../pydantic/experimental/missing_sentinel.py | 5 + .../pydantic/experimental/pipeline.py | 663 ++ .../venv/Lib/site-packages/pydantic/fields.py | 1892 ++++ .../pydantic/functional_serializers.py | 470 + .../pydantic/functional_validators.py | 889 ++ .../Lib/site-packages/pydantic/generics.py | 5 + .../venv/Lib/site-packages/pydantic/json.py | 5 + .../Lib/site-packages/pydantic/json_schema.py | 2911 ++++++ .../venv/Lib/site-packages/pydantic/main.py | 1838 ++++ .../venv/Lib/site-packages/pydantic/mypy.py | 1412 +++ .../Lib/site-packages/pydantic/networks.py | 1332 +++ .../venv/Lib/site-packages/pydantic/parse.py | 5 + .../site-packages/pydantic/plugin/__init__.py | 193 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 8950 bytes .../__pycache__/_loader.cpython-312.pyc | Bin 0 -> 2440 bytes .../_schema_validator.cpython-312.pyc | Bin 0 -> 7067 bytes .../site-packages/pydantic/plugin/_loader.py | 58 + .../pydantic/plugin/_schema_validator.py | 143 + .../venv/Lib/site-packages/pydantic/py.typed | 0 .../Lib/site-packages/pydantic/root_model.py | 157 + .../venv/Lib/site-packages/pydantic/schema.py | 5 + .../venv/Lib/site-packages/pydantic/tools.py | 5 + .../site-packages/pydantic/type_adapter.py | 801 ++ .../venv/Lib/site-packages/pydantic/types.py | 3310 +++++++ .../venv/Lib/site-packages/pydantic/typing.py | 5 + .../venv/Lib/site-packages/pydantic/utils.py | 5 + .../Lib/site-packages/pydantic/v1/__init__.py | 131 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2231 bytes .../_hypothesis_plugin.cpython-312.pyc | Bin 0 -> 20516 bytes .../annotated_types.cpython-312.pyc | Bin 0 -> 3895 bytes .../class_validators.cpython-312.pyc | Bin 0 -> 19655 bytes .../v1/__pycache__/color.cpython-312.pyc | Bin 0 -> 25861 bytes .../v1/__pycache__/config.cpython-312.pyc | Bin 0 -> 8410 bytes .../__pycache__/dataclasses.cpython-312.pyc | Bin 0 -> 22755 bytes .../datetime_parse.cpython-312.pyc | Bin 0 -> 10363 bytes .../v1/__pycache__/decorator.cpython-312.pyc | Bin 0 -> 13928 bytes .../__pycache__/env_settings.cpython-312.pyc | Bin 0 -> 17730 bytes .../error_wrappers.cpython-312.pyc | Bin 0 -> 8938 bytes .../v1/__pycache__/errors.cpython-312.pyc | Bin 0 -> 29613 bytes .../v1/__pycache__/fields.cpython-312.pyc | Bin 0 -> 57453 bytes .../v1/__pycache__/generics.cpython-312.pyc | Bin 0 -> 17031 bytes .../v1/__pycache__/json.cpython-312.pyc | Bin 0 -> 5221 bytes .../v1/__pycache__/main.cpython-312.pyc | Bin 0 -> 48680 bytes .../v1/__pycache__/mypy.cpython-312.pyc | Bin 0 -> 46369 bytes .../v1/__pycache__/networks.cpython-312.pyc | Bin 0 -> 29560 bytes .../v1/__pycache__/parse.cpython-312.pyc | Bin 0 -> 2758 bytes .../v1/__pycache__/schema.cpython-312.pyc | Bin 0 -> 48486 bytes .../v1/__pycache__/tools.cpython-312.pyc | Bin 0 -> 3891 bytes .../v1/__pycache__/types.cpython-312.pyc | Bin 0 -> 48498 bytes .../v1/__pycache__/typing.cpython-312.pyc | Bin 0 -> 23020 bytes .../v1/__pycache__/utils.cpython-312.pyc | Bin 0 -> 35267 bytes .../v1/__pycache__/validators.cpython-312.pyc | Bin 0 -> 30906 bytes .../v1/__pycache__/version.cpython-312.pyc | Bin 0 -> 1969 bytes .../pydantic/v1/_hypothesis_plugin.py | 391 + .../pydantic/v1/annotated_types.py | 72 + .../pydantic/v1/class_validators.py | 361 + .../Lib/site-packages/pydantic/v1/color.py | 494 + .../Lib/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 + .../Lib/site-packages/pydantic/v1/errors.py | 646 ++ .../Lib/site-packages/pydantic/v1/fields.py | 1253 +++ .../Lib/site-packages/pydantic/v1/generics.py | 400 + .../Lib/site-packages/pydantic/v1/json.py | 112 + .../Lib/site-packages/pydantic/v1/main.py | 1130 +++ .../Lib/site-packages/pydantic/v1/mypy.py | 949 ++ .../Lib/site-packages/pydantic/v1/networks.py | 747 ++ .../Lib/site-packages/pydantic/v1/parse.py | 66 + .../Lib/site-packages/pydantic/v1/py.typed | 0 .../Lib/site-packages/pydantic/v1/schema.py | 1163 +++ .../Lib/site-packages/pydantic/v1/tools.py | 92 + .../Lib/site-packages/pydantic/v1/types.py | 1205 +++ .../Lib/site-packages/pydantic/v1/typing.py | 627 ++ .../Lib/site-packages/pydantic/v1/utils.py | 807 ++ .../site-packages/pydantic/v1/validators.py | 768 ++ .../Lib/site-packages/pydantic/v1/version.py | 38 + .../pydantic/validate_call_decorator.py | 116 + .../Lib/site-packages/pydantic/validators.py | 5 + .../Lib/site-packages/pydantic/version.py | 113 + .../Lib/site-packages/pydantic/warnings.py | 122 + .../pydantic_core-2.46.4.dist-info/INSTALLER | 1 + .../pydantic_core-2.46.4.dist-info/METADATA | 173 + .../pydantic_core-2.46.4.dist-info/RECORD | 13 + .../pydantic_core-2.46.4.dist-info/WHEEL | 4 + .../licenses/LICENSE | 21 + .../sboms/pydantic-core.cyclonedx.json | 3961 ++++++++ .../site-packages/pydantic_core/__init__.py | 171 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3163 bytes .../__pycache__/core_schema.cpython-312.pyc | Bin 0 -> 156029 bytes .../_pydantic_core.cp312-win_amd64.pyd | Bin 0 -> 5253120 bytes .../pydantic_core/_pydantic_core.pyi | 1056 ++ .../pydantic_core/core_schema.py | 4461 +++++++++ .../Lib/site-packages/pydantic_core/py.typed | 0 .../starlette-1.0.1.dist-info/INSTALLER | 1 + .../starlette-1.0.1.dist-info/METADATA | 177 + .../starlette-1.0.1.dist-info/RECORD | 74 + .../starlette-1.0.1.dist-info/WHEEL | 4 + .../licenses/LICENSE.md | 27 + .../Lib/site-packages/starlette/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 224 bytes .../_exception_handler.cpython-312.pyc | Bin 0 -> 3084 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 0 -> 5133 bytes .../__pycache__/applications.cpython-312.pyc | Bin 0 -> 7287 bytes .../authentication.cpython-312.pyc | Bin 0 -> 7726 bytes .../__pycache__/background.cpython-312.pyc | Bin 0 -> 2546 bytes .../__pycache__/concurrency.cpython-312.pyc | Bin 0 -> 3186 bytes .../__pycache__/config.cpython-312.pyc | Bin 0 -> 7524 bytes .../__pycache__/convertors.cpython-312.pyc | Bin 0 -> 4777 bytes .../datastructures.cpython-312.pyc | Bin 0 -> 40583 bytes .../__pycache__/endpoints.cpython-312.pyc | Bin 0 -> 7966 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 2409 bytes .../__pycache__/formparsers.cpython-312.pyc | Bin 0 -> 14414 bytes .../__pycache__/requests.cpython-312.pyc | Bin 0 -> 16875 bytes .../__pycache__/responses.cpython-312.pyc | Bin 0 -> 31087 bytes .../__pycache__/routing.cpython-312.pyc | Bin 0 -> 38480 bytes .../__pycache__/schemas.cpython-312.pyc | Bin 0 -> 7076 bytes .../__pycache__/staticfiles.cpython-312.pyc | Bin 0 -> 11623 bytes .../__pycache__/status.cpython-312.pyc | Bin 0 -> 5195 bytes .../__pycache__/templating.cpython-312.pyc | Bin 0 -> 7118 bytes .../__pycache__/testclient.cpython-312.pyc | Bin 0 -> 33146 bytes .../__pycache__/types.cpython-312.pyc | Bin 0 -> 1330 bytes .../__pycache__/websockets.cpython-312.pyc | Bin 0 -> 11862 bytes .../starlette/_exception_handler.py | 65 + .../Lib/site-packages/starlette/_utils.py | 105 + .../site-packages/starlette/applications.py | 118 + .../site-packages/starlette/authentication.py | 142 + .../Lib/site-packages/starlette/background.py | 36 + .../site-packages/starlette/concurrency.py | 57 + .../Lib/site-packages/starlette/config.py | 140 + .../Lib/site-packages/starlette/convertors.py | 89 + .../site-packages/starlette/datastructures.py | 704 ++ .../Lib/site-packages/starlette/endpoints.py | 123 + .../Lib/site-packages/starlette/exceptions.py | 33 + .../site-packages/starlette/formparsers.py | 276 + .../starlette/middleware/__init__.py | 37 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2549 bytes .../authentication.cpython-312.pyc | Bin 0 -> 2909 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 11812 bytes .../__pycache__/cors.cpython-312.pyc | Bin 0 -> 7870 bytes .../__pycache__/errors.cpython-312.pyc | Bin 0 -> 9949 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 4115 bytes .../__pycache__/gzip.cpython-312.pyc | Bin 0 -> 8804 bytes .../__pycache__/httpsredirect.cpython-312.pyc | Bin 0 -> 1784 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 0 -> 7263 bytes .../__pycache__/trustedhost.cpython-312.pyc | Bin 0 -> 3150 bytes .../__pycache__/wsgi.cpython-312.pyc | Bin 0 -> 8574 bytes .../starlette/middleware/authentication.py | 52 + .../starlette/middleware/base.py | 244 + .../starlette/middleware/cors.py | 179 + .../starlette/middleware/errors.py | 259 + .../starlette/middleware/exceptions.py | 73 + .../starlette/middleware/gzip.py | 145 + .../starlette/middleware/httpsredirect.py | 19 + .../starlette/middleware/sessions.py | 125 + .../starlette/middleware/trustedhost.py | 60 + .../starlette/middleware/wsgi.py | 154 + .../venv/Lib/site-packages/starlette/py.typed | 0 .../Lib/site-packages/starlette/requests.py | 337 + .../Lib/site-packages/starlette/responses.py | 568 ++ .../Lib/site-packages/starlette/routing.py | 747 ++ .../Lib/site-packages/starlette/schemas.py | 148 + .../site-packages/starlette/staticfiles.py | 220 + .../Lib/site-packages/starlette/status.py | 209 + .../Lib/site-packages/starlette/templating.py | 156 + .../Lib/site-packages/starlette/testclient.py | 739 ++ .../venv/Lib/site-packages/starlette/types.py | 26 + .../Lib/site-packages/starlette/websockets.py | 196 + .../INSTALLER | 1 + .../METADATA | 72 + .../typing_extensions-4.15.0.dist-info/RECORD | 7 + .../typing_extensions-4.15.0.dist-info/WHEEL | 4 + .../licenses/LICENSE | 279 + .../Lib/site-packages/typing_extensions.py | 4317 +++++++++ .../INSTALLER | 1 + .../METADATA | 49 + .../typing_inspection-0.4.2.dist-info/RECORD | 13 + .../typing_inspection-0.4.2.dist-info/WHEEL | 4 + .../licenses/LICENSE | 21 + .../typing_inspection/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 206 bytes .../__pycache__/introspection.cpython-312.pyc | Bin 0 -> 17803 bytes .../typing_objects.cpython-312.pyc | Bin 0 -> 17382 bytes .../typing_inspection/introspection.py | 587 ++ .../site-packages/typing_inspection/py.typed | 0 .../typing_inspection/typing_objects.py | 607 ++ .../typing_inspection/typing_objects.pyi | 417 + .../uvicorn-0.47.0.dist-info/INSTALLER | 1 + .../uvicorn-0.47.0.dist-info/METADATA | 191 + .../uvicorn-0.47.0.dist-info/RECORD | 89 + .../uvicorn-0.47.0.dist-info/REQUESTED | 0 .../uvicorn-0.47.0.dist-info/WHEEL | 4 + .../uvicorn-0.47.0.dist-info/entry_points.txt | 2 + .../licenses/LICENSE.md | 27 + .../Lib/site-packages/uvicorn/__init__.py | 5 + .../Lib/site-packages/uvicorn/__main__.py | 4 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 394 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 314 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 0 -> 4012 bytes .../__pycache__/_subprocess.cpython-312.pyc | Bin 0 -> 2957 bytes .../__pycache__/_types.cpython-312.pyc | Bin 0 -> 11425 bytes .../__pycache__/config.cpython-312.pyc | Bin 0 -> 28198 bytes .../__pycache__/importer.cpython-312.pyc | Bin 0 -> 1787 bytes .../__pycache__/logging.cpython-312.pyc | Bin 0 -> 7796 bytes .../uvicorn/__pycache__/main.cpython-312.pyc | Bin 0 -> 21947 bytes .../__pycache__/server.cpython-312.pyc | Bin 0 -> 17254 bytes .../__pycache__/workers.cpython-312.pyc | Bin 0 -> 6575 bytes .../venv/Lib/site-packages/uvicorn/_compat.py | 91 + .../Lib/site-packages/uvicorn/_subprocess.py | 84 + .../venv/Lib/site-packages/uvicorn/_types.py | 274 + .../venv/Lib/site-packages/uvicorn/config.py | 588 ++ .../Lib/site-packages/uvicorn/importer.py | 34 + .../uvicorn/lifespan/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 205 bytes .../lifespan/__pycache__/off.cpython-312.pyc | Bin 0 -> 994 bytes .../lifespan/__pycache__/on.cpython-312.pyc | Bin 0 -> 7954 bytes .../Lib/site-packages/uvicorn/lifespan/off.py | 17 + .../Lib/site-packages/uvicorn/lifespan/on.py | 137 + .../venv/Lib/site-packages/uvicorn/logging.py | 117 + .../site-packages/uvicorn/loops/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 202 bytes .../loops/__pycache__/asyncio.cpython-312.pyc | Bin 0 -> 734 bytes .../loops/__pycache__/auto.cpython-312.pyc | Bin 0 -> 834 bytes .../loops/__pycache__/uvloop.cpython-312.pyc | Bin 0 -> 591 bytes .../site-packages/uvicorn/loops/asyncio.py | 11 + .../Lib/site-packages/uvicorn/loops/auto.py | 17 + .../Lib/site-packages/uvicorn/loops/uvloop.py | 10 + .../venv/Lib/site-packages/uvicorn/main.py | 644 ++ .../uvicorn/middleware/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 207 bytes .../__pycache__/asgi2.cpython-312.pyc | Bin 0 -> 1017 bytes .../message_logger.cpython-312.pyc | Bin 0 -> 4408 bytes .../__pycache__/proxy_headers.cpython-312.pyc | Bin 0 -> 7194 bytes .../__pycache__/wsgi.cpython-312.pyc | Bin 0 -> 9948 bytes .../site-packages/uvicorn/middleware/asgi2.py | 15 + .../uvicorn/middleware/message_logger.py | 87 + .../uvicorn/middleware/proxy_headers.py | 174 + .../site-packages/uvicorn/middleware/wsgi.py | 199 + .../uvicorn/protocols/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 206 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 3158 bytes .../uvicorn/protocols/http/__init__.py | 0 .../http/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 211 bytes .../http/__pycache__/auto.cpython-312.pyc | Bin 0 -> 622 bytes .../__pycache__/flow_control.cpython-312.pyc | Bin 0 -> 3052 bytes .../http/__pycache__/h11_impl.cpython-312.pyc | Bin 0 -> 27688 bytes .../httptools_impl.cpython-312.pyc | Bin 0 -> 29601 bytes .../uvicorn/protocols/http/auto.py | 15 + .../uvicorn/protocols/http/flow_control.py | 54 + .../uvicorn/protocols/http/h11_impl.py | 544 ++ .../uvicorn/protocols/http/httptools_impl.py | 576 ++ .../site-packages/uvicorn/protocols/utils.py | 62 + .../uvicorn/protocols/websockets/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 217 bytes .../__pycache__/auto.cpython-312.pyc | Bin 0 -> 826 bytes .../websockets_impl.cpython-312.pyc | Bin 0 -> 19967 bytes .../websockets_sansio_impl.cpython-312.pyc | Bin 0 -> 28874 bytes .../__pycache__/wsproto_impl.cpython-312.pyc | Bin 0 -> 27578 bytes .../uvicorn/protocols/websockets/auto.py | 21 + .../protocols/websockets/websockets_impl.py | 372 + .../websockets/websockets_sansio_impl.py | 477 + .../protocols/websockets/wsproto_impl.py | 458 + .../venv/Lib/site-packages/uvicorn/py.typed | 1 + .../venv/Lib/site-packages/uvicorn/server.py | 346 + .../uvicorn/supervisors/__init__.py | 16 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 771 bytes .../__pycache__/basereload.cpython-312.pyc | Bin 0 -> 7043 bytes .../__pycache__/multiprocess.cpython-312.pyc | Bin 0 -> 13462 bytes .../__pycache__/statreload.cpython-312.pyc | Bin 0 -> 2837 bytes .../watchfilesreload.cpython-312.pyc | Bin 0 -> 4288 bytes .../uvicorn/supervisors/basereload.py | 125 + .../uvicorn/supervisors/multiprocess.py | 223 + .../uvicorn/supervisors/statreload.py | 52 + .../uvicorn/supervisors/watchfilesreload.py | 86 + .../venv/Lib/site-packages/uvicorn/workers.py | 111 + simulador-backend/venv/Scripts/Activate.ps1 | 502 + simulador-backend/venv/Scripts/activate | 70 + simulador-backend/venv/Scripts/activate.bat | 34 + simulador-backend/venv/Scripts/deactivate.bat | 22 + simulador-backend/venv/Scripts/fastapi.exe | Bin 0 -> 108430 bytes simulador-backend/venv/Scripts/idna.exe | Bin 0 -> 108427 bytes simulador-backend/venv/Scripts/pip.exe | Bin 0 -> 108441 bytes simulador-backend/venv/Scripts/pip3.12.exe | Bin 0 -> 108441 bytes simulador-backend/venv/Scripts/pip3.exe | Bin 0 -> 108441 bytes simulador-backend/venv/Scripts/python.exe | Bin 0 -> 270104 bytes simulador-backend/venv/Scripts/pythonw.exe | Bin 0 -> 258840 bytes simulador-backend/venv/Scripts/uvicorn.exe | Bin 0 -> 108431 bytes simulador-backend/venv/pyvenv.cfg | 5 + start.bat | 10 + 1629 files changed, 282522 insertions(+) create mode 160000 ecotrack create mode 100644 package-lock.json create mode 100644 simulador-backend/__pycache__/main.cpython-312.pyc create mode 100644 simulador-backend/main.py create mode 100644 simulador-backend/rutas.json create mode 100644 simulador-backend/venv/Lib/site-packages/__pycache__/typing_extensions.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/annotated_doc-0.0.4.dist-info/INSTALLER create mode 100644 simulador-backend/venv/Lib/site-packages/annotated_doc-0.0.4.dist-info/METADATA create mode 100644 simulador-backend/venv/Lib/site-packages/annotated_doc-0.0.4.dist-info/RECORD create mode 100644 simulador-backend/venv/Lib/site-packages/annotated_doc-0.0.4.dist-info/WHEEL create mode 100644 simulador-backend/venv/Lib/site-packages/annotated_doc-0.0.4.dist-info/entry_points.txt create mode 100644 simulador-backend/venv/Lib/site-packages/annotated_doc-0.0.4.dist-info/licenses/LICENSE create mode 100644 simulador-backend/venv/Lib/site-packages/annotated_doc/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/annotated_doc/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/annotated_doc/__pycache__/main.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/annotated_doc/main.py create mode 100644 simulador-backend/venv/Lib/site-packages/annotated_doc/py.typed create mode 100644 simulador-backend/venv/Lib/site-packages/annotated_types-0.7.0.dist-info/INSTALLER create mode 100644 simulador-backend/venv/Lib/site-packages/annotated_types-0.7.0.dist-info/METADATA create mode 100644 simulador-backend/venv/Lib/site-packages/annotated_types-0.7.0.dist-info/RECORD create mode 100644 simulador-backend/venv/Lib/site-packages/annotated_types-0.7.0.dist-info/WHEEL create mode 100644 simulador-backend/venv/Lib/site-packages/annotated_types-0.7.0.dist-info/licenses/LICENSE create mode 100644 simulador-backend/venv/Lib/site-packages/annotated_types/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/annotated_types/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/annotated_types/__pycache__/test_cases.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/annotated_types/py.typed create mode 100644 simulador-backend/venv/Lib/site-packages/annotated_types/test_cases.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/INSTALLER create mode 100644 simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/METADATA create mode 100644 simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/RECORD create mode 100644 simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/WHEEL create mode 100644 simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/entry_points.txt create mode 100644 simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/licenses/LICENSE create mode 100644 simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/top_level.txt create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/__pycache__/from_thread.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/__pycache__/functools.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/__pycache__/lowlevel.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/__pycache__/pytest_plugin.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/__pycache__/to_interpreter.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/__pycache__/to_process.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/__pycache__/to_thread.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_backends/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_backends/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_backends/__pycache__/_asyncio.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_backends/__pycache__/_trio.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_backends/_asyncio.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_backends/_trio.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_asyncio_selector_thread.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_contextmanagers.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_eventloop.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_exceptions.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_fileio.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_resources.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_signals.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_sockets.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_streams.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_subprocesses.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_synchronization.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_tasks.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_tempfile.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_testing.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_typedattr.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/_asyncio_selector_thread.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/_contextmanagers.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/_eventloop.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/_exceptions.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/_fileio.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/_resources.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/_signals.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/_sockets.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/_streams.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/_subprocesses.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/_synchronization.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/_tasks.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/_tempfile.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/_testing.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/_core/_typedattr.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/abc/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/abc/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/abc/__pycache__/_eventloop.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/abc/__pycache__/_resources.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/abc/__pycache__/_sockets.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/abc/__pycache__/_streams.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/abc/__pycache__/_tasks.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/abc/__pycache__/_testing.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/abc/_eventloop.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/abc/_resources.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/abc/_sockets.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/abc/_streams.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/abc/_subprocesses.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/abc/_tasks.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/abc/_testing.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/from_thread.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/functools.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/lowlevel.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/py.typed create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/pytest_plugin.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/streams/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/streams/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/streams/__pycache__/buffered.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/streams/__pycache__/file.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/streams/__pycache__/memory.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/streams/__pycache__/stapled.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/streams/__pycache__/text.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/streams/__pycache__/tls.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/streams/buffered.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/streams/file.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/streams/memory.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/streams/stapled.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/streams/text.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/streams/tls.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/to_interpreter.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/to_process.py create mode 100644 simulador-backend/venv/Lib/site-packages/anyio/to_thread.py create mode 100644 simulador-backend/venv/Lib/site-packages/click-8.4.1.dist-info/INSTALLER create mode 100644 simulador-backend/venv/Lib/site-packages/click-8.4.1.dist-info/METADATA create mode 100644 simulador-backend/venv/Lib/site-packages/click-8.4.1.dist-info/RECORD create mode 100644 simulador-backend/venv/Lib/site-packages/click-8.4.1.dist-info/WHEEL create mode 100644 simulador-backend/venv/Lib/site-packages/click-8.4.1.dist-info/licenses/LICENSE.txt create mode 100644 simulador-backend/venv/Lib/site-packages/click/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/click/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/click/__pycache__/_compat.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/click/__pycache__/_termui_impl.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/click/__pycache__/_textwrap.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/click/__pycache__/_utils.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/click/__pycache__/_winconsole.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/click/__pycache__/core.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/click/__pycache__/decorators.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/click/__pycache__/exceptions.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/click/__pycache__/formatting.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/click/__pycache__/globals.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/click/__pycache__/parser.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/click/__pycache__/shell_completion.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/click/__pycache__/termui.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/click/__pycache__/testing.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/click/__pycache__/types.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/click/__pycache__/utils.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/click/_compat.py create mode 100644 simulador-backend/venv/Lib/site-packages/click/_termui_impl.py create mode 100644 simulador-backend/venv/Lib/site-packages/click/_textwrap.py create mode 100644 simulador-backend/venv/Lib/site-packages/click/_utils.py create mode 100644 simulador-backend/venv/Lib/site-packages/click/_winconsole.py create mode 100644 simulador-backend/venv/Lib/site-packages/click/core.py create mode 100644 simulador-backend/venv/Lib/site-packages/click/decorators.py create mode 100644 simulador-backend/venv/Lib/site-packages/click/exceptions.py create mode 100644 simulador-backend/venv/Lib/site-packages/click/formatting.py create mode 100644 simulador-backend/venv/Lib/site-packages/click/globals.py create mode 100644 simulador-backend/venv/Lib/site-packages/click/parser.py create mode 100644 simulador-backend/venv/Lib/site-packages/click/py.typed create mode 100644 simulador-backend/venv/Lib/site-packages/click/shell_completion.py create mode 100644 simulador-backend/venv/Lib/site-packages/click/termui.py create mode 100644 simulador-backend/venv/Lib/site-packages/click/testing.py create mode 100644 simulador-backend/venv/Lib/site-packages/click/types.py create mode 100644 simulador-backend/venv/Lib/site-packages/click/utils.py create mode 100644 simulador-backend/venv/Lib/site-packages/colorama-0.4.6.dist-info/INSTALLER create mode 100644 simulador-backend/venv/Lib/site-packages/colorama-0.4.6.dist-info/METADATA create mode 100644 simulador-backend/venv/Lib/site-packages/colorama-0.4.6.dist-info/RECORD create mode 100644 simulador-backend/venv/Lib/site-packages/colorama-0.4.6.dist-info/WHEEL create mode 100644 simulador-backend/venv/Lib/site-packages/colorama-0.4.6.dist-info/licenses/LICENSE.txt create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/__pycache__/ansi.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/__pycache__/ansitowin32.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/__pycache__/initialise.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/__pycache__/win32.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/__pycache__/winterm.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/ansi.py create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/ansitowin32.py create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/initialise.py create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/tests/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/tests/__pycache__/ansi_test.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/tests/__pycache__/ansitowin32_test.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/tests/__pycache__/initialise_test.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/tests/__pycache__/isatty_test.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/tests/__pycache__/utils.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/tests/__pycache__/winterm_test.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/tests/ansi_test.py create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/tests/ansitowin32_test.py create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/tests/initialise_test.py create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/tests/isatty_test.py create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/tests/utils.py create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/tests/winterm_test.py create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/win32.py create mode 100644 simulador-backend/venv/Lib/site-packages/colorama/winterm.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi-0.136.1.dist-info/INSTALLER create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi-0.136.1.dist-info/METADATA create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi-0.136.1.dist-info/RECORD create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi-0.136.1.dist-info/REQUESTED create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi-0.136.1.dist-info/WHEEL create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi-0.136.1.dist-info/entry_points.txt create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi-0.136.1.dist-info/licenses/LICENSE create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/.agents/skills/fastapi/SKILL.md create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/.agents/skills/fastapi/references/dependencies.md create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/.agents/skills/fastapi/references/other-tools.md create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/.agents/skills/fastapi/references/streaming.md create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/__main__.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/__pycache__/__main__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/__pycache__/applications.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/__pycache__/background.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/__pycache__/cli.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/__pycache__/concurrency.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/__pycache__/datastructures.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/__pycache__/encoders.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/__pycache__/exception_handlers.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/__pycache__/exceptions.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/__pycache__/logger.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/__pycache__/param_functions.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/__pycache__/params.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/__pycache__/requests.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/__pycache__/responses.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/__pycache__/routing.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/__pycache__/sse.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/__pycache__/staticfiles.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/__pycache__/templating.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/__pycache__/testclient.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/__pycache__/types.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/__pycache__/utils.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/__pycache__/websockets.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/_compat/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/_compat/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/_compat/__pycache__/shared.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/_compat/__pycache__/v2.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/_compat/shared.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/_compat/v2.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/applications.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/background.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/cli.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/concurrency.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/datastructures.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/dependencies/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/dependencies/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/dependencies/__pycache__/models.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/dependencies/__pycache__/utils.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/dependencies/models.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/dependencies/utils.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/encoders.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/exception_handlers.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/exceptions.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/logger.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/middleware/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/middleware/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/middleware/__pycache__/asyncexitstack.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/middleware/__pycache__/cors.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/middleware/__pycache__/gzip.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/middleware/__pycache__/httpsredirect.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/middleware/__pycache__/trustedhost.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/middleware/__pycache__/wsgi.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/middleware/asyncexitstack.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/middleware/cors.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/middleware/gzip.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/middleware/httpsredirect.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/middleware/trustedhost.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/middleware/wsgi.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/openapi/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/openapi/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/openapi/__pycache__/constants.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/openapi/__pycache__/docs.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/openapi/__pycache__/models.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/openapi/__pycache__/utils.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/openapi/constants.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/openapi/docs.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/openapi/models.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/openapi/utils.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/param_functions.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/params.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/py.typed create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/requests.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/responses.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/routing.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/security/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/security/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/security/__pycache__/api_key.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/security/__pycache__/base.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/security/__pycache__/http.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/security/__pycache__/oauth2.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/security/__pycache__/open_id_connect_url.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/security/__pycache__/utils.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/security/api_key.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/security/base.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/security/http.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/security/oauth2.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/security/open_id_connect_url.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/security/utils.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/sse.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/staticfiles.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/templating.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/testclient.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/types.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/utils.py create mode 100644 simulador-backend/venv/Lib/site-packages/fastapi/websockets.py create mode 100644 simulador-backend/venv/Lib/site-packages/h11-0.16.0.dist-info/INSTALLER create mode 100644 simulador-backend/venv/Lib/site-packages/h11-0.16.0.dist-info/METADATA create mode 100644 simulador-backend/venv/Lib/site-packages/h11-0.16.0.dist-info/RECORD create mode 100644 simulador-backend/venv/Lib/site-packages/h11-0.16.0.dist-info/WHEEL create mode 100644 simulador-backend/venv/Lib/site-packages/h11-0.16.0.dist-info/licenses/LICENSE.txt create mode 100644 simulador-backend/venv/Lib/site-packages/h11-0.16.0.dist-info/top_level.txt create mode 100644 simulador-backend/venv/Lib/site-packages/h11/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/h11/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/h11/__pycache__/_abnf.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/h11/__pycache__/_connection.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/h11/__pycache__/_events.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/h11/__pycache__/_headers.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/h11/__pycache__/_readers.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/h11/__pycache__/_receivebuffer.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/h11/__pycache__/_state.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/h11/__pycache__/_util.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/h11/__pycache__/_version.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/h11/__pycache__/_writers.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/h11/_abnf.py create mode 100644 simulador-backend/venv/Lib/site-packages/h11/_connection.py create mode 100644 simulador-backend/venv/Lib/site-packages/h11/_events.py create mode 100644 simulador-backend/venv/Lib/site-packages/h11/_headers.py create mode 100644 simulador-backend/venv/Lib/site-packages/h11/_readers.py create mode 100644 simulador-backend/venv/Lib/site-packages/h11/_receivebuffer.py create mode 100644 simulador-backend/venv/Lib/site-packages/h11/_state.py create mode 100644 simulador-backend/venv/Lib/site-packages/h11/_util.py create mode 100644 simulador-backend/venv/Lib/site-packages/h11/_version.py create mode 100644 simulador-backend/venv/Lib/site-packages/h11/_writers.py create mode 100644 simulador-backend/venv/Lib/site-packages/h11/py.typed create mode 100644 simulador-backend/venv/Lib/site-packages/idna-3.16.dist-info/INSTALLER create mode 100644 simulador-backend/venv/Lib/site-packages/idna-3.16.dist-info/METADATA create mode 100644 simulador-backend/venv/Lib/site-packages/idna-3.16.dist-info/RECORD create mode 100644 simulador-backend/venv/Lib/site-packages/idna-3.16.dist-info/WHEEL create mode 100644 simulador-backend/venv/Lib/site-packages/idna-3.16.dist-info/entry_points.txt create mode 100644 simulador-backend/venv/Lib/site-packages/idna-3.16.dist-info/licenses/LICENSE.md create mode 100644 simulador-backend/venv/Lib/site-packages/idna/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/idna/__main__.py create mode 100644 simulador-backend/venv/Lib/site-packages/idna/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/idna/__pycache__/__main__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/idna/__pycache__/cli.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/idna/__pycache__/codec.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/idna/__pycache__/compat.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/idna/__pycache__/core.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/idna/__pycache__/idnadata.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/idna/__pycache__/intranges.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/idna/__pycache__/package_data.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/idna/__pycache__/uts46data.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/idna/cli.py create mode 100644 simulador-backend/venv/Lib/site-packages/idna/codec.py create mode 100644 simulador-backend/venv/Lib/site-packages/idna/compat.py create mode 100644 simulador-backend/venv/Lib/site-packages/idna/core.py create mode 100644 simulador-backend/venv/Lib/site-packages/idna/idnadata.py create mode 100644 simulador-backend/venv/Lib/site-packages/idna/intranges.py create mode 100644 simulador-backend/venv/Lib/site-packages/idna/package_data.py create mode 100644 simulador-backend/venv/Lib/site-packages/idna/py.typed create mode 100644 simulador-backend/venv/Lib/site-packages/idna/uts46data.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip-24.2.dist-info/AUTHORS.txt create mode 100644 simulador-backend/venv/Lib/site-packages/pip-24.2.dist-info/INSTALLER create mode 100644 simulador-backend/venv/Lib/site-packages/pip-24.2.dist-info/LICENSE.txt create mode 100644 simulador-backend/venv/Lib/site-packages/pip-24.2.dist-info/METADATA create mode 100644 simulador-backend/venv/Lib/site-packages/pip-24.2.dist-info/RECORD create mode 100644 simulador-backend/venv/Lib/site-packages/pip-24.2.dist-info/REQUESTED create mode 100644 simulador-backend/venv/Lib/site-packages/pip-24.2.dist-info/WHEEL create mode 100644 simulador-backend/venv/Lib/site-packages/pip-24.2.dist-info/entry_points.txt create mode 100644 simulador-backend/venv/Lib/site-packages/pip-24.2.dist-info/top_level.txt create mode 100644 simulador-backend/venv/Lib/site-packages/pip/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/__main__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/__pip-runner__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/__pycache__/__main__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/build_env.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cache.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/__pycache__/index_command.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/base_command.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/command_context.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/index_command.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/main.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/main_parser.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/parser.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/req_command.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/spinners.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/cli/status_codes.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/__pycache__/check.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/__pycache__/help.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/__pycache__/index.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/__pycache__/list.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/__pycache__/search.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/cache.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/check.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/completion.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/configuration.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/debug.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/download.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/freeze.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/hash.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/help.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/index.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/inspect.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/install.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/list.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/search.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/show.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/uninstall.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/commands/wheel.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/configuration.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/distributions/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/distributions/base.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/distributions/installed.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/distributions/sdist.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/distributions/wheel.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/exceptions.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/index/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/index/collector.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/index/package_finder.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/index/sources.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/locations/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/locations/__pycache__/base.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/locations/_distutils.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/locations/_sysconfig.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/locations/base.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/main.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/metadata/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/metadata/_json.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/metadata/base.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/metadata/importlib/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/metadata/importlib/_compat.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/models/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/models/__pycache__/scheme.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/models/__pycache__/wheel.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/models/candidate.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/models/direct_url.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/models/format_control.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/models/index.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/models/installation_report.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/models/link.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/models/scheme.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/models/search_scope.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/models/target_python.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/models/wheel.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/network/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/network/__pycache__/session.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/network/auth.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/network/cache.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/network/download.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/network/session.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/network/utils.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/build/build_tracker.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/build/metadata_editable.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/build/wheel_editable.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/check.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/freeze.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/operations/prepare.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/pyproject.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/req/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/req/constructors.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/req/req_file.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/req/req_install.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/req/req_set.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/base.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/self_outdated_check.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/retry.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/_jaraco_text.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/_log.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/appdirs.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/compat.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/datetime.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/deprecation.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/egg_link.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/encoding.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/filesystem.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/filetypes.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/glibc.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/hashes.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/logging.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/misc.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/packaging.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/retry.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/subprocess.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/unpacking.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/urls.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/utils/wheel.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/vcs/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/vcs/git.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/vcs/subversion.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_internal/wheel_builder.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/cachecontrol/py.typed create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/certifi/core.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/certifi/py.typed create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/compat.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/database.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/index.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/locators.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/markers.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/resources.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/t64-arm.exe create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/util.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/version.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/w64-arm.exe create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distro/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distro/__main__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distro/distro.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/distro/py.typed create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/idna/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/idna/codec.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/idna/compat.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/idna/core.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/idna/intranges.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/idna/package_data.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/idna/py.typed create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_elffile.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_parser.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_tokenizer.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/metadata.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/_elffile.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/_manylinux.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/_musllinux.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/_parser.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/_tokenizer.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/markers.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/metadata.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/py.typed create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/tags.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/utils.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/packaging/version.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/platformdirs/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/platformdirs/__main__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/platformdirs/android.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/platformdirs/api.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/platformdirs/macos.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/platformdirs/py.typed create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/platformdirs/unix.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/platformdirs/version.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/platformdirs/windows.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/__main__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/cmdline.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/console.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/filter.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/filters/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatter.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/_mapping.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/bbcode.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/groff.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/html.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/img.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/irc.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/latex.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/other.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/rtf.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/svg.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/terminal.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/formatters/terminal256.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/lexer.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/lexers/python.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/modeline.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/plugin.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/regexopt.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/scanner.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/sphinxext.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/style.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/styles/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/styles/__pycache__/_mapping.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/styles/_mapping.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/token.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/unistring.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pygments/util.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_compat.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_impl.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/api.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/help.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/models.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/__version__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/adapters.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/api.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/auth.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/certs.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/compat.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/cookies.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/help.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/hooks.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/models.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/packages.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/sessions.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/structures.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/requests/utils.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/resolvelib/py.typed create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__main__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/align.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/console.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/control.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/region.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/status.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/style.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/table.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/text.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/_cell_widths.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/_emoji_codes.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/_emoji_replace.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/_export_format.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/_extension.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/_fileno.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/_inspect.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/_log_render.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/_loop.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/_null_file.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/_palettes.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/_pick.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/_ratio.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/_spinners.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/_stack.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/_timer.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/_win32_console.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/_windows.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/_windows_renderer.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/_wrap.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/abc.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/align.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/ansi.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/bar.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/box.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/cells.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/color.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/color_triplet.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/columns.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/console.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/constrain.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/containers.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/control.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/default_styles.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/diagnose.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/emoji.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/errors.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/file_proxy.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/filesize.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/highlighter.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/json.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/jupyter.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/layout.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/live.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/live_render.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/logging.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/markup.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/measure.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/padding.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/pager.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/palette.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/panel.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/pretty.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/progress.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/progress_bar.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/prompt.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/protocol.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/py.typed create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/region.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/repr.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/rule.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/scope.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/screen.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/segment.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/spinner.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/status.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/style.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/styled.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/syntax.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/table.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/terminal_theme.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/text.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/theme.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/themes.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/traceback.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/rich/tree.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/tomli/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/tomli/_parser.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/tomli/_re.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/tomli/_types.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/tomli/py.typed create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/truststore/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/truststore/__pycache__/_openssl.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/truststore/_api.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/truststore/_macos.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/truststore/_openssl.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/truststore/_ssl_constants.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/truststore/_windows.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/truststore/py.typed create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/typing_extensions.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/_version.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/request.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/response.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/proxy.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/ssltransport.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 simulador-backend/venv/Lib/site-packages/pip/_vendor/vendor.txt create mode 100644 simulador-backend/venv/Lib/site-packages/pip/py.typed create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic-2.13.4.dist-info/INSTALLER create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic-2.13.4.dist-info/METADATA create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic-2.13.4.dist-info/RECORD create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic-2.13.4.dist-info/WHEEL create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic-2.13.4.dist-info/licenses/LICENSE create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/_migration.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/alias_generators.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/aliases.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/annotated_handlers.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/class_validators.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/color.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/config.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/dataclasses.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/datetime_parse.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/decorator.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/env_settings.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/error_wrappers.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/errors.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/fields.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/functional_serializers.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/functional_validators.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/generics.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/json.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/json_schema.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/main.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/mypy.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/networks.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/parse.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/root_model.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/schema.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/tools.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/type_adapter.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/types.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/typing.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/utils.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/validate_call_decorator.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/validators.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/version.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/__pycache__/warnings.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_config.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_core_metadata.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_core_utils.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_dataclasses.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_decorators.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_decorators_v1.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_discriminated_union.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_docs_extraction.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_fields.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_forward_ref.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_generate_schema.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_generics.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_git.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_import_utils.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_internal_dataclass.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_known_annotated_metadata.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_mock_val_ser.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_model_construction.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_namespace_utils.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_repr.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_schema_gather.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_schema_generation_shared.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_serializers.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_signature.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_typing_extra.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_utils.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_validate_call.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/__pycache__/_validators.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_config.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_core_metadata.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_core_utils.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_dataclasses.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_decorators.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_decorators_v1.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_discriminated_union.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_docs_extraction.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_fields.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_forward_ref.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_generate_schema.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_generics.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_git.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_import_utils.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_internal_dataclass.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_known_annotated_metadata.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_mock_val_ser.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_model_construction.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_namespace_utils.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_repr.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_schema_gather.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_schema_generation_shared.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_serializers.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_signature.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_typing_extra.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_utils.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_validate_call.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_internal/_validators.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/_migration.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/alias_generators.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/aliases.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/annotated_handlers.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/class_validators.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/color.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/config.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/dataclasses.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/datetime_parse.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/decorator.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/deprecated/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/deprecated/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/deprecated/__pycache__/class_validators.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/deprecated/__pycache__/config.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/deprecated/__pycache__/copy_internals.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/deprecated/__pycache__/decorator.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/deprecated/__pycache__/json.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/deprecated/__pycache__/parse.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/deprecated/__pycache__/tools.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/deprecated/class_validators.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/deprecated/config.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/deprecated/copy_internals.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/deprecated/decorator.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/deprecated/json.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/deprecated/parse.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/deprecated/tools.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/env_settings.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/error_wrappers.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/errors.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/experimental/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/experimental/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/experimental/__pycache__/arguments_schema.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/experimental/__pycache__/missing_sentinel.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/experimental/__pycache__/pipeline.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/experimental/arguments_schema.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/experimental/missing_sentinel.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/experimental/pipeline.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/fields.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/functional_serializers.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/functional_validators.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/generics.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/json.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/json_schema.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/main.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/mypy.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/networks.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/parse.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/plugin/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/plugin/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/plugin/__pycache__/_loader.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/plugin/__pycache__/_schema_validator.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/plugin/_loader.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/plugin/_schema_validator.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/py.typed create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/root_model.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/schema.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/tools.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/type_adapter.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/types.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/typing.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/utils.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/_hypothesis_plugin.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/annotated_types.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/class_validators.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/color.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/config.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/dataclasses.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/datetime_parse.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/decorator.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/env_settings.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/error_wrappers.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/errors.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/fields.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/generics.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/json.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/main.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/mypy.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/networks.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/parse.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/schema.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/tools.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/types.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/typing.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/utils.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/validators.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/__pycache__/version.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/_hypothesis_plugin.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/annotated_types.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/class_validators.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/color.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/config.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/dataclasses.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/datetime_parse.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/decorator.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/env_settings.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/error_wrappers.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/errors.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/fields.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/generics.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/json.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/main.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/mypy.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/networks.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/parse.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/py.typed create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/schema.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/tools.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/types.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/typing.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/utils.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/validators.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/v1/version.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/validate_call_decorator.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/validators.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/version.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic/warnings.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic_core-2.46.4.dist-info/INSTALLER create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic_core-2.46.4.dist-info/METADATA create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic_core-2.46.4.dist-info/RECORD create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic_core-2.46.4.dist-info/WHEEL create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic_core-2.46.4.dist-info/licenses/LICENSE create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic_core-2.46.4.dist-info/sboms/pydantic-core.cyclonedx.json create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic_core/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic_core/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic_core/__pycache__/core_schema.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic_core/_pydantic_core.cp312-win_amd64.pyd create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic_core/_pydantic_core.pyi create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic_core/core_schema.py create mode 100644 simulador-backend/venv/Lib/site-packages/pydantic_core/py.typed create mode 100644 simulador-backend/venv/Lib/site-packages/starlette-1.0.1.dist-info/INSTALLER create mode 100644 simulador-backend/venv/Lib/site-packages/starlette-1.0.1.dist-info/METADATA create mode 100644 simulador-backend/venv/Lib/site-packages/starlette-1.0.1.dist-info/RECORD create mode 100644 simulador-backend/venv/Lib/site-packages/starlette-1.0.1.dist-info/WHEEL create mode 100644 simulador-backend/venv/Lib/site-packages/starlette-1.0.1.dist-info/licenses/LICENSE.md create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/__pycache__/_exception_handler.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/__pycache__/_utils.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/__pycache__/applications.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/__pycache__/authentication.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/__pycache__/background.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/__pycache__/concurrency.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/__pycache__/config.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/__pycache__/convertors.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/__pycache__/datastructures.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/__pycache__/endpoints.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/__pycache__/exceptions.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/__pycache__/formparsers.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/__pycache__/requests.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/__pycache__/responses.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/__pycache__/routing.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/__pycache__/schemas.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/__pycache__/staticfiles.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/__pycache__/status.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/__pycache__/templating.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/__pycache__/testclient.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/__pycache__/types.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/__pycache__/websockets.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/_exception_handler.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/_utils.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/applications.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/authentication.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/background.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/concurrency.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/config.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/convertors.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/datastructures.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/endpoints.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/exceptions.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/formparsers.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/middleware/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/middleware/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/middleware/__pycache__/authentication.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/middleware/__pycache__/base.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/middleware/__pycache__/cors.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/middleware/__pycache__/errors.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/middleware/__pycache__/exceptions.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/middleware/__pycache__/gzip.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/middleware/__pycache__/httpsredirect.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/middleware/__pycache__/sessions.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/middleware/__pycache__/trustedhost.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/middleware/__pycache__/wsgi.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/middleware/authentication.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/middleware/base.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/middleware/cors.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/middleware/errors.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/middleware/exceptions.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/middleware/gzip.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/middleware/httpsredirect.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/middleware/sessions.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/middleware/trustedhost.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/middleware/wsgi.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/py.typed create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/requests.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/responses.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/routing.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/schemas.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/staticfiles.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/status.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/templating.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/testclient.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/types.py create mode 100644 simulador-backend/venv/Lib/site-packages/starlette/websockets.py create mode 100644 simulador-backend/venv/Lib/site-packages/typing_extensions-4.15.0.dist-info/INSTALLER create mode 100644 simulador-backend/venv/Lib/site-packages/typing_extensions-4.15.0.dist-info/METADATA create mode 100644 simulador-backend/venv/Lib/site-packages/typing_extensions-4.15.0.dist-info/RECORD create mode 100644 simulador-backend/venv/Lib/site-packages/typing_extensions-4.15.0.dist-info/WHEEL create mode 100644 simulador-backend/venv/Lib/site-packages/typing_extensions-4.15.0.dist-info/licenses/LICENSE create mode 100644 simulador-backend/venv/Lib/site-packages/typing_extensions.py create mode 100644 simulador-backend/venv/Lib/site-packages/typing_inspection-0.4.2.dist-info/INSTALLER create mode 100644 simulador-backend/venv/Lib/site-packages/typing_inspection-0.4.2.dist-info/METADATA create mode 100644 simulador-backend/venv/Lib/site-packages/typing_inspection-0.4.2.dist-info/RECORD create mode 100644 simulador-backend/venv/Lib/site-packages/typing_inspection-0.4.2.dist-info/WHEEL create mode 100644 simulador-backend/venv/Lib/site-packages/typing_inspection-0.4.2.dist-info/licenses/LICENSE create mode 100644 simulador-backend/venv/Lib/site-packages/typing_inspection/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/typing_inspection/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/typing_inspection/__pycache__/introspection.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/typing_inspection/__pycache__/typing_objects.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/typing_inspection/introspection.py create mode 100644 simulador-backend/venv/Lib/site-packages/typing_inspection/py.typed create mode 100644 simulador-backend/venv/Lib/site-packages/typing_inspection/typing_objects.py create mode 100644 simulador-backend/venv/Lib/site-packages/typing_inspection/typing_objects.pyi create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn-0.47.0.dist-info/INSTALLER create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn-0.47.0.dist-info/METADATA create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn-0.47.0.dist-info/RECORD create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn-0.47.0.dist-info/REQUESTED create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn-0.47.0.dist-info/WHEEL create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn-0.47.0.dist-info/entry_points.txt create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn-0.47.0.dist-info/licenses/LICENSE.md create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/__main__.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/__pycache__/__main__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/__pycache__/_compat.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/__pycache__/_subprocess.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/__pycache__/_types.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/__pycache__/config.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/__pycache__/importer.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/__pycache__/logging.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/__pycache__/main.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/__pycache__/server.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/__pycache__/workers.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/_compat.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/_subprocess.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/_types.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/config.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/importer.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/lifespan/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/lifespan/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/lifespan/__pycache__/off.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/lifespan/__pycache__/on.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/lifespan/off.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/lifespan/on.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/logging.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/loops/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/loops/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/loops/__pycache__/asyncio.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/loops/__pycache__/auto.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/loops/__pycache__/uvloop.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/loops/asyncio.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/loops/auto.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/loops/uvloop.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/main.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/middleware/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/middleware/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/middleware/__pycache__/asgi2.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/middleware/__pycache__/message_logger.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/middleware/__pycache__/proxy_headers.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/middleware/__pycache__/wsgi.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/middleware/asgi2.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/middleware/message_logger.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/middleware/proxy_headers.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/middleware/wsgi.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/protocols/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/protocols/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/protocols/__pycache__/utils.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/protocols/http/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/protocols/http/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/protocols/http/__pycache__/auto.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/protocols/http/__pycache__/flow_control.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/protocols/http/__pycache__/h11_impl.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/protocols/http/__pycache__/httptools_impl.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/protocols/http/auto.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/protocols/http/flow_control.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/protocols/http/h11_impl.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/protocols/http/httptools_impl.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/protocols/utils.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/protocols/websockets/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/protocols/websockets/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/protocols/websockets/__pycache__/auto.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/protocols/websockets/__pycache__/websockets_impl.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/protocols/websockets/__pycache__/websockets_sansio_impl.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/protocols/websockets/__pycache__/wsproto_impl.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/protocols/websockets/auto.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/protocols/websockets/websockets_impl.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/protocols/websockets/websockets_sansio_impl.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/protocols/websockets/wsproto_impl.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/py.typed create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/server.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/supervisors/__init__.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/supervisors/__pycache__/__init__.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/supervisors/__pycache__/basereload.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/supervisors/__pycache__/multiprocess.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/supervisors/__pycache__/statreload.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/supervisors/__pycache__/watchfilesreload.cpython-312.pyc create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/supervisors/basereload.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/supervisors/multiprocess.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/supervisors/statreload.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/supervisors/watchfilesreload.py create mode 100644 simulador-backend/venv/Lib/site-packages/uvicorn/workers.py create mode 100644 simulador-backend/venv/Scripts/Activate.ps1 create mode 100644 simulador-backend/venv/Scripts/activate create mode 100644 simulador-backend/venv/Scripts/activate.bat create mode 100644 simulador-backend/venv/Scripts/deactivate.bat create mode 100644 simulador-backend/venv/Scripts/fastapi.exe create mode 100644 simulador-backend/venv/Scripts/idna.exe create mode 100644 simulador-backend/venv/Scripts/pip.exe create mode 100644 simulador-backend/venv/Scripts/pip3.12.exe create mode 100644 simulador-backend/venv/Scripts/pip3.exe create mode 100644 simulador-backend/venv/Scripts/python.exe create mode 100644 simulador-backend/venv/Scripts/pythonw.exe create mode 100644 simulador-backend/venv/Scripts/uvicorn.exe create mode 100644 simulador-backend/venv/pyvenv.cfg create mode 100644 start.bat diff --git a/ecotrack b/ecotrack new file mode 160000 index 0000000..82eb245 --- /dev/null +++ b/ecotrack @@ -0,0 +1 @@ +Subproject commit 82eb2450718c8b4eeee58a79225620c058be64f8 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..a5ac79c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "Proyecto", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/simulador-backend/__pycache__/main.cpython-312.pyc b/simulador-backend/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6259cd98b5df20ee6bb0d5d13d2f981487d0fc5e GIT binary patch literal 2974 zcmaJ?Z)_CD6`$GN+q?7m{`maw{12b`({dDS#Q{UD2xE+CND~)fP{iTX+TM)K9(%i| z**%O86FC93CPl(lQ0yv1qTdpkO8Hu~QdRY1zue_OcDF>KYATg)CXSSrPkpm@y9TGp zoNngLoA=(%`}do_hQoCT#?L=!$Uc-2`X}GG!#RP?rX(P=j0hrFLphwrnA3tLTVW#d-zs>)2SzGNM`-v2dg})WrK2=T z!fn8ZHBwunwKc|9(g5Fx!D*cDT&twGq8YQBM1Yp3b> zcSyH*(yg>{N+5|FlBd)39Xf5EPWy9TXeJ#uP`U+l`nFvOwxrY3>3U8lF)QvuFCi1p z2pFA*Xkm2gH&?{-Xa=WtJmF?i*!G`POl$b`DIg;wKRYx2hDwM=XB0-qfE6H$MJ+W) zi}BHnah55WOUZFHSI`tAEDQ0ihG;|xYqOV|09XP^2NcD_CRDIg^GoxV9Q^b~ZB}Z+)#R{2Au$4_qu?prB zUVnBlZ3y*TFKfYE_PqRjWCKvOZ7RBiyXIc^F5Z;4z4aq^YK5%M|WR3|qdeXa#D1f;PG0 zvtuU)Ctfp5njBGBj_S$Nl+j}HCx%{BG+LZE&5T)^v5X1R4fugyK>VprCUT0Z_vUBq z;54-+9Vb{9SWLp-6W)h(tFB_%N4 z=e7vfPhqwLXp?_D$vQbZ;CjV&!ge=5<^9T?YPdakb8zwEz1Gscqow3fC3LJL9dlf> zao-Dx+!Y+xik)5$B)zuC7>ucq93v&zen_XO zWT`D(G?c)&6R83>bU^&HN?Z9;IUUgeyhGDT3F!#dW_D)|4oO|V>D#i-$#Dr;{_1@I@qAX$rL*qq<}zUQ(#bJl+aTWC^&ukuk3=^D zfR4+D(XF?CCjveO#-4DqjCT`j;!^`mHoi~{?0I!?&l`h##*3YALFeWGTd0{-E-TQs z%+Qks9f}>Qz;F8%b5;lJv3;gSX}((XzC2T*3wS}WA99lc(_&K`VxdfUC)grD762>9 zDU(-lGFj^je-#KAdl|R~;BWpGrhlXV%%k7d`{2IS{|we!L6c#m76OkA{bUwEX~y%qrwxs9;`kP6eL?qFTY< z-?o;A#csy8vN?-*CRq!Zg3$7K*`W-h@Ssh?({ss*;$mEuaEg5+VFXI%vAcjJ0-|yhKMo#7wY&N^?!j96_ofKb^SvQ zmzwrIkW=&GVzKsB?tDl$uUf(c(;&Ds+%8!?fbyxwmRSG pTu>`G!G(5l3vCYd%{dH?m3+O=%z6mtpF@o!1L9u>d?Q2t{{gc$k4XRk literal 0 HcmV?d00001 diff --git a/simulador-backend/main.py b/simulador-backend/main.py new file mode 100644 index 0000000..546250e --- /dev/null +++ b/simulador-backend/main.py @@ -0,0 +1,60 @@ +# main.py +from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware +import json, asyncio, os +from datetime import datetime + +app = FastAPI(title="EcoTrack Simulador") + +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_methods=["*"], + allow_headers=["*"], +) + +# Carga el JSON de rutas +with open("rutas.json", "r", encoding="utf-8") as f: + RUTAS = json.load(f) + +# Estado actual del simulador en memoria +estado = {} +for ruta in RUTAS: + estado[ruta["routeId"]] = { + "routeId": ruta["routeId"], + "name": ruta["name"], + "truckId": ruta["truckId"], + "status": ruta["status"], + "posicionActual": 1, + "totalNodos": len(ruta["positions"]) + } + +@app.get("/rutas") +def get_rutas(): + return list(estado.values()) + +@app.get("/rutas/{route_id}") +def get_ruta(route_id: str): + return estado.get(route_id, {"error": "Ruta no encontrada"}) + +@app.get("/") +def root(): + return {"mensaje": "Simulador EcoTrack corriendo", "hora": datetime.now().isoformat()} + +# Simulador — avanza posicionActual cada 90 segundos +async def simular(): + while True: + await asyncio.sleep(10) + for route_id in estado: + pos = estado[route_id]["posicionActual"] + total = estado[route_id]["totalNodos"] + if pos < total: + estado[route_id]["posicionActual"] += 1 + else: + # Reinicia la ruta al terminar + estado[route_id]["posicionActual"] = 1 + print(f"[{datetime.now().strftime('%H:%M:%S')}] Camiones avanzaron un nodo") + +@app.on_event("startup") +async def startup(): + asyncio.create_task(simular()) \ No newline at end of file diff --git a/simulador-backend/rutas.json b/simulador-backend/rutas.json new file mode 100644 index 0000000..6127adb --- /dev/null +++ b/simulador-backend/rutas.json @@ -0,0 +1,242 @@ +[ + { + "routeId": "RUTA-01", + "name": "Zona Centro - Las Arboledas", + "truckId": 101, + "status": "EN_RUTA", + "positions": [ + { "positionId": 1, "lat": 20.5111, "lng": -100.9037, "speed": 0, "timestamp": "2026-05-22T06:00:00Z" }, + { "positionId": 2, "lat": 20.5185, "lng": -100.8450, "speed": 45, "timestamp": "2026-05-22T06:12:00Z" }, + { "positionId": 3, "lat": 20.5215, "lng": -100.8142, "speed": 22, "timestamp": "2026-05-22T06:25:00Z" }, + { "positionId": 4, "lat": 20.5212, "lng": -100.8175, "speed": 15, "timestamp": "2026-05-22T06:38:00Z" }, + { "positionId": 5, "lat": 20.5210, "lng": -100.8210, "speed": 0, "timestamp": "2026-05-22T06:50:00Z" }, + { "positionId": 6, "lat": 20.5235, "lng": -100.8212, "speed": 18, "timestamp": "2026-05-22T07:05:00Z" }, + { "positionId": 7, "lat": 20.5260, "lng": -100.8215, "speed": 20, "timestamp": "2026-05-22T07:18:00Z" }, + { "positionId": 8, "lat": 20.5111, "lng": -100.9037, "speed": 40, "timestamp": "2026-05-22T07:40:00Z" } + ] + }, + { + "routeId": "RUTA-02", + "name": "Sector Norte - Av. Tecnológico", + "truckId": 102, + "status": "EN_RUTA", + "positions": [ + { "positionId": 1, "lat": 20.5111, "lng": -100.9037, "speed": 0, "timestamp": "2026-05-22T06:05:00Z" }, + { "positionId": 2, "lat": 20.5280, "lng": -100.8135, "speed": 38, "timestamp": "2026-05-22T06:18:00Z" }, + { "positionId": 3, "lat": 20.5410, "lng": -100.8130, "speed": 25, "timestamp": "2026-05-22T06:30:00Z" }, + { "positionId": 4, "lat": 20.5445, "lng": -100.8132, "speed": 12, "timestamp": "2026-05-22T06:45:00Z" }, + { "positionId": 5, "lat": 20.5480, "lng": -100.8135, "speed": 0, "timestamp": "2026-05-22T06:58:00Z" }, + { "positionId": 6, "lat": 20.5515, "lng": -100.8138, "speed": 15, "timestamp": "2026-05-22T07:10:00Z" }, + { "positionId": 7, "lat": 20.5540, "lng": -100.8110, "speed": 22, "timestamp": "2026-05-22T07:25:00Z" }, + { "positionId": 8, "lat": 20.5111, "lng": -100.9037, "speed": 45, "timestamp": "2026-05-22T07:50:00Z" } + ] + }, + { + "routeId": "RUTA-03", + "name": "Sector Poniente - San Juanico", + "truckId": 103, + "status": "EN_RUTA", + "positions": [ + { "positionId": 1, "lat": 20.5111, "lng": -100.9037, "speed": 0, "timestamp": "2026-05-22T06:10:00Z" }, + { "positionId": 2, "lat": 20.5250, "lng": -100.8510, "speed": 42, "timestamp": "2026-05-22T06:20:00Z" }, + { "positionId": 3, "lat": 20.5290, "lng": -100.8320, "speed": 20, "timestamp": "2026-05-22T06:35:00Z" }, + { "positionId": 4, "lat": 20.5315, "lng": -100.8355, "speed": 15, "timestamp": "2026-05-22T06:48:00Z" }, + { "positionId": 5, "lat": 20.5340, "lng": -100.8390, "speed": 0, "timestamp": "2026-05-22T07:00:00Z" }, + { "positionId": 6, "lat": 20.5362, "lng": -100.8425, "speed": 10, "timestamp": "2026-05-22T07:15:00Z" }, + { "positionId": 7, "lat": 20.5330, "lng": -100.8430, "speed": 18, "timestamp": "2026-05-22T07:28:00Z" }, + { "positionId": 8, "lat": 20.5111, "lng": -100.9037, "speed": 35, "timestamp": "2026-05-22T07:45:00Z" } + ] + }, + { + "routeId": "RUTA-04", + "name": "Oriente - Los Olivos", + "truckId": 104, + "status": "EN_RUTA", + "positions": [ + { "positionId": 1, "lat": 20.5111, "lng": -100.9037, "speed": 0, "timestamp": "2026-05-22T06:15:00Z" }, + { "positionId": 2, "lat": 20.5260, "lng": -100.8010, "speed": 45, "timestamp": "2026-05-22T06:30:00Z" }, + { "positionId": 3, "lat": 20.5295, "lng": -100.7890, "speed": 24, "timestamp": "2026-05-22T06:45:00Z" }, + { "positionId": 4, "lat": 20.5320, "lng": -100.7850, "speed": 12, "timestamp": "2026-05-22T06:58:00Z" }, + { "positionId": 5, "lat": 20.5350, "lng": -100.7790, "speed": 0, "timestamp": "2026-05-22T07:12:00Z" }, + { "positionId": 6, "lat": 20.5310, "lng": -100.7760, "speed": 15, "timestamp": "2026-05-22T07:25:00Z" }, + { "positionId": 7, "lat": 20.5270, "lng": -100.7820, "speed": 26, "timestamp": "2026-05-22T07:38:00Z" }, + { "positionId": 8, "lat": 20.5111, "lng": -100.9037, "speed": 48, "timestamp": "2026-05-22T07:58:00Z" } + ] + }, + { + "routeId": "RUTA-05", + "name": "Sector Sur - Rancho Seco", + "truckId": 105, + "status": "EN_RUTA", + "positions": [ + { "positionId": 1, "lat": 20.5111, "lng": -100.9037, "speed": 0, "timestamp": "2026-05-22T06:20:00Z" }, + { "positionId": 2, "lat": 20.5050, "lng": -100.8620, "speed": 35, "timestamp": "2026-05-22T06:32:00Z" }, + { "positionId": 3, "lat": 20.5020, "lng": -100.8350, "speed": 22, "timestamp": "2026-05-22T06:45:00Z" }, + { "positionId": 4, "lat": 20.4995, "lng": -100.8210, "speed": 14, "timestamp": "2026-05-22T06:58:00Z" }, + { "positionId": 5, "lat": 20.4970, "lng": -100.8150, "speed": 0, "timestamp": "2026-05-22T07:10:00Z" }, + { "positionId": 6, "lat": 20.5010, "lng": -100.8120, "speed": 16, "timestamp": "2026-05-22T07:22:00Z" }, + { "positionId": 7, "lat": 20.5060, "lng": -100.8160, "speed": 25, "timestamp": "2026-05-22T07:35:00Z" }, + { "positionId": 8, "lat": 20.5111, "lng": -100.9037, "speed": 40, "timestamp": "2026-05-22T07:55:00Z" } + ] + }, + { + "routeId": "RUTA-06", + "name": "Norte Extremo - Rumbos de Roque", + "truckId": 106, + "status": "EN_RUTA", + "positions": [ + { "positionId": 1, "lat": 20.5111, "lng": -100.9037, "speed": 0, "timestamp": "2026-05-22T06:00:00Z" }, + { "positionId": 2, "lat": 20.5380, "lng": -100.8380, "speed": 40, "timestamp": "2026-05-22T06:15:00Z" }, + { "positionId": 3, "lat": 20.5610, "lng": -100.8370, "speed": 30, "timestamp": "2026-05-22T06:30:00Z" }, + { "positionId": 4, "lat": 20.5750, "lng": -100.8360, "speed": 15, "timestamp": "2026-05-22T06:45:00Z" }, + { "positionId": 5, "lat": 20.5820, "lng": -100.8350, "speed": 0, "timestamp": "2026-05-22T07:00:00Z" }, + { "positionId": 6, "lat": 20.5780, "lng": -100.8310, "speed": 20, "timestamp": "2026-05-22T07:15:00Z" }, + { "positionId": 7, "lat": 20.5650, "lng": -100.8320, "speed": 28, "timestamp": "2026-05-22T07:30:00Z" }, + { "positionId": 8, "lat": 20.5111, "lng": -100.9037, "speed": 45, "timestamp": "2026-05-22T07:55:00Z" } + ] + }, + { + "routeId": "RUTA-07", + "name": "Nororiente - Ciudad Industrial", + "truckId": 107, + "status": "EN_RUTA", + "positions": [ + { "positionId": 1, "lat": 20.5111, "lng": -100.9037, "speed": 0, "timestamp": "2026-05-22T06:10:00Z" }, + { "positionId": 2, "lat": 20.5350, "lng": -100.8050, "speed": 44, "timestamp": "2026-05-22T06:24:00Z" }, + { "positionId": 3, "lat": 20.5450, "lng": -100.7950, "speed": 25, "timestamp": "2026-05-22T06:38:00Z" }, + { "positionId": 4, "lat": 20.5480, "lng": -100.7850, "speed": 18, "timestamp": "2026-05-22T06:52:00Z" }, + { "positionId": 5, "lat": 20.5510, "lng": -100.7750, "speed": 0, "timestamp": "2026-05-22T07:05:00Z" }, + { "positionId": 6, "lat": 20.5460, "lng": -100.7720, "speed": 12, "timestamp": "2026-05-22T07:18:00Z" }, + { "positionId": 7, "lat": 20.5390, "lng": -100.7820, "speed": 30, "timestamp": "2026-05-22T07:30:00Z" }, + { "positionId": 8, "lat": 20.5111, "lng": -100.9037, "speed": 42, "timestamp": "2026-05-22T07:52:00Z" } + ] + }, + { + "routeId": "RUTA-08", + "name": "Suroriente - Universidad Latina", + "truckId": 108, + "status": "EN_RUTA", + "positions": [ + { "positionId": 1, "lat": 20.5111, "lng": -100.9037, "speed": 0, "timestamp": "2026-05-22T06:15:00Z" }, + { "positionId": 2, "lat": 20.5180, "lng": -100.8310, "speed": 38, "timestamp": "2026-05-22T06:28:00Z" }, + { "positionId": 3, "lat": 20.5245, "lng": -100.7980, "speed": 30, "timestamp": "2026-05-22T06:42:00Z" }, + { "positionId": 4, "lat": 20.5210, "lng": -100.7995, "speed": 14, "timestamp": "2026-05-22T06:55:00Z" }, + { "positionId": 5, "lat": 20.5175, "lng": -100.8010, "speed": 0, "timestamp": "2026-05-22T07:08:00Z" }, + { "positionId": 6, "lat": 20.5140, "lng": -100.8030, "speed": 18, "timestamp": "2026-05-22T07:20:00Z" }, + { "positionId": 7, "lat": 20.5110, "lng": -100.8055, "speed": 22, "timestamp": "2026-05-22T07:32:00Z" }, + { "positionId": 8, "lat": 20.5111, "lng": -100.9037, "speed": 40, "timestamp": "2026-05-22T07:54:00Z" } + ] + }, + { + "routeId": "RUTA-09", + "name": "Poniente - Hospital General", + "truckId": 109, + "status": "EN_RUTA", + "positions": [ + { "positionId": 1, "lat": 20.5111, "lng": -100.9037, "speed": 0, "timestamp": "2026-05-22T06:02:00Z" }, + { "positionId": 2, "lat": 20.5210, "lng": -100.8650, "speed": 45, "timestamp": "2026-05-22T06:12:00Z" }, + { "positionId": 3, "lat": 20.5260, "lng": -100.8520, "speed": 26, "timestamp": "2026-05-22T06:24:00Z" }, + { "positionId": 4, "lat": 20.5275, "lng": -100.8490, "speed": 12, "timestamp": "2026-05-22T06:36:00Z" }, + { "positionId": 5, "lat": 20.5285, "lng": -100.8460, "speed": 0, "timestamp": "2026-05-22T06:48:00Z" }, + { "positionId": 6, "lat": 20.5250, "lng": -100.8470, "speed": 15, "timestamp": "2026-05-22T07:00:00Z" }, + { "positionId": 7, "lat": 20.5220, "lng": -100.8550, "speed": 32, "timestamp": "2026-05-22T07:12:00Z" }, + { "positionId": 8, "lat": 20.5111, "lng": -100.9037, "speed": 44, "timestamp": "2026-05-22T07:30:00Z" } + ] + }, + { + "routeId": "RUTA-10", + "name": "Eje Juan Pablo II - Sede UG Sur", + "truckId": 110, + "status": "EN_RUTA", + "positions": [ + { "positionId": 1, "lat": 20.5111, "lng": -100.9037, "speed": 0, "timestamp": "2026-05-22T06:22:00Z" }, + { "positionId": 2, "lat": 20.5015, "lng": -100.8520, "speed": 40, "timestamp": "2026-05-22T06:34:00Z" }, + { "positionId": 3, "lat": 20.4990, "lng": -100.8390, "speed": 28, "timestamp": "2026-05-22T06:46:00Z" }, + { "positionId": 4, "lat": 20.4950, "lng": -100.8320, "speed": 18, "timestamp": "2026-05-22T06:58:00Z" }, + { "positionId": 5, "lat": 20.4920, "lng": -100.8280, "speed": 0, "timestamp": "2026-05-22T07:10:00Z" }, + { "positionId": 6, "lat": 20.4945, "lng": -100.8240, "speed": 14, "timestamp": "2026-05-22T07:22:00Z" }, + { "positionId": 7, "lat": 20.4980, "lng": -100.8300, "speed": 30, "timestamp": "2026-05-22T07:34:00Z" }, + { "positionId": 8, "lat": 20.5111, "lng": -100.9037, "speed": 38, "timestamp": "2026-05-22T07:52:00Z" } + ] + }, + { + "routeId": "RUTA-11", + "name": "Zona de Oro - Torres Landa", + "truckId": 111, + "status": "EN_RUTA", + "positions": [ + { "positionId": 1, "lat": 20.5111, "lng": -100.9037, "speed": 0, "timestamp": "2026-05-22T06:04:00Z" }, + { "positionId": 2, "lat": 20.5240, "lng": -100.8350, "speed": 36, "timestamp": "2026-05-22T06:16:00Z" }, + { "positionId": 3, "lat": 20.5280, "lng": -100.8250, "speed": 22, "timestamp": "2026-05-22T06:29:00Z" }, + { "positionId": 4, "lat": 20.5295, "lng": -100.8210, "speed": 10, "timestamp": "2026-05-22T06:42:00Z" }, + { "positionId": 5, "lat": 20.5310, "lng": -100.8170, "speed": 0, "timestamp": "2026-05-22T06:55:00Z" }, + { "positionId": 6, "lat": 20.5290, "lng": -100.8140, "speed": 16, "timestamp": "2026-05-22T07:08:00Z" }, + { "positionId": 7, "lat": 20.5260, "lng": -100.8220, "speed": 28, "timestamp": "2026-05-22T07:21:00Z" }, + { "positionId": 8, "lat": 20.5111, "lng": -100.9037, "speed": 42, "timestamp": "2026-05-22T07:42:00Z" } + ] + }, + { + "routeId": "RUTA-12", + "name": "Nororiente - Las Insurgentes", + "truckId": 112, + "status": "EN_RUTA", + "positions": [ + { "positionId": 1, "lat": 20.5111, "lng": -100.9037, "speed": 0, "timestamp": "2026-05-22T06:08:00Z" }, + { "positionId": 2, "lat": 20.5280, "lng": -100.8080, "speed": 40, "timestamp": "2026-05-22T06:22:00Z" }, + { "positionId": 3, "lat": 20.5320, "lng": -100.7980, "speed": 24, "timestamp": "2026-05-22T06:35:00Z" }, + { "positionId": 4, "lat": 20.5340, "lng": -100.7940, "speed": 15, "timestamp": "2026-05-22T06:48:00Z" }, + { "positionId": 5, "lat": 20.5360, "lng": -100.7900, "speed": 0, "timestamp": "2026-05-22T07:00:00Z" }, + { "positionId": 6, "lat": 20.5310, "lng": -100.7920, "speed": 12, "timestamp": "2026-05-22T07:12:00Z" }, + { "positionId": 7, "lat": 20.5270, "lng": -100.8020, "speed": 26, "timestamp": "2026-05-22T07:25:00Z" }, + { "positionId": 8, "lat": 20.5111, "lng": -100.9037, "speed": 44, "timestamp": "2026-05-22T07:48:00Z" } + ] + }, + { + "routeId": "RUTA-13", + "name": "Sector Norte - Trojes e Irrigación", + "truckId": 113, + "status": "EN_RUTA", + "positions": [ + { "positionId": 1, "lat": 20.5111, "lng": -100.9037, "speed": 0, "timestamp": "2026-05-22T06:12:00Z" }, + { "positionId": 2, "lat": 20.5360, "lng": -100.8190, "speed": 35, "timestamp": "2026-05-22T06:26:00Z" }, + { "positionId": 3, "lat": 20.5420, "lng": -100.8080, "speed": 28, "timestamp": "2026-05-22T06:40:00Z" }, + { "positionId": 4, "lat": 20.5440, "lng": -100.8040, "speed": 14, "timestamp": "2026-05-22T06:54:00Z" }, + { "positionId": 5, "lat": 20.5460, "lng": -100.8000, "speed": 0, "timestamp": "2026-05-22T07:06:00Z" }, + { "positionId": 6, "lat": 20.5410, "lng": -100.8020, "speed": 18, "timestamp": "2026-05-22T07:18:00Z" }, + { "positionId": 7, "lat": 20.5370, "lng": -100.8120, "speed": 25, "timestamp": "2026-05-22T07:30:00Z" }, + { "positionId": 8, "lat": 20.5111, "lng": -100.9037, "speed": 39, "timestamp": "2026-05-22T07:54:00Z" } + ] + }, + { + "routeId": "RUTA-14", + "name": "Sur Poniente - La Toscana", + "truckId": 114, + "status": "EN_RUTA", + "positions": [ + { "positionId": 1, "lat": 20.5111, "lng": -100.9037, "speed": 0, "timestamp": "2026-05-22T06:16:00Z" }, + { "positionId": 2, "lat": 20.5150, "lng": -100.8580, "speed": 42, "timestamp": "2026-05-22T06:28:00Z" }, + { "positionId": 3, "lat": 20.5140, "lng": -100.8390, "speed": 26, "timestamp": "2026-05-22T06:41:00Z" }, + { "positionId": 4, "lat": 20.5125, "lng": -100.8310, "speed": 16, "timestamp": "2026-05-22T06:54:00Z" }, + { "positionId": 5, "lat": 20.5110, "lng": -100.8250, "speed": 0, "timestamp": "2026-05-22T07:06:00Z" }, + { "positionId": 6, "lat": 20.5135, "lng": -100.8280, "speed": 12, "timestamp": "2026-05-22T07:18:00Z" }, + { "positionId": 7, "lat": 20.5160, "lng": -100.8420, "speed": 32, "timestamp": "2026-05-22T07:30:00Z" }, + { "positionId": 8, "lat": 20.5111, "lng": -100.9037, "speed": 45, "timestamp": "2026-05-22T07:51:00Z" } + ] + }, + { + "routeId": "RUTA-15", + "name": "Norponiente - Camino a San José de Celaya", + "truckId": 115, + "status": "EN_RUTA", + "positions": [ + { "positionId": 1, "lat": 20.5111, "lng": -100.9037, "speed": 0, "timestamp": "2026-05-22T06:18:00Z" }, + { "positionId": 2, "lat": 20.5320, "lng": -100.8590, "speed": 38, "timestamp": "2026-05-22T06:31:00Z" }, + { "positionId": 3, "lat": 20.5390, "lng": -100.8480, "speed": 24, "timestamp": "2026-05-22T06:44:00Z" }, + { "positionId": 4, "lat": 20.5420, "lng": -100.8440, "speed": 15, "timestamp": "2026-05-22T06:57:00Z" }, + { "positionId": 5, "lat": 20.5450, "lng": -100.8410, "speed": 0, "timestamp": "2026-05-22T07:09:00Z" }, + { "positionId": 6, "lat": 20.5410, "lng": -100.8430, "speed": 14, "timestamp": "2026-05-22T07:21:00Z" }, + { "positionId": 7, "lat": 20.5360, "lng": -100.8520, "speed": 28, "timestamp": "2026-05-22T07:33:00Z" }, + { "positionId": 8, "lat": 20.5111, "lng": -100.9037, "speed": 41, "timestamp": "2026-05-22T07:54:00Z" } + ] + } +] \ No newline at end of file diff --git a/simulador-backend/venv/Lib/site-packages/__pycache__/typing_extensions.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/__pycache__/typing_extensions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a565e9d224555502bf6efdc6919e3436ba488870 GIT binary patch literal 163655 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

Doa~Dl+BiG|M!^L5xmo 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 WtHSX|o(D+&m0+z^Wd5tb2qXcE-^K_4 literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/annotated_doc-0.0.4.dist-info/INSTALLER b/simulador-backend/venv/Lib/site-packages/annotated_doc-0.0.4.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/annotated_doc-0.0.4.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/simulador-backend/venv/Lib/site-packages/annotated_doc-0.0.4.dist-info/METADATA b/simulador-backend/venv/Lib/site-packages/annotated_doc-0.0.4.dist-info/METADATA new file mode 100644 index 0000000..9bf7a9e --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/annotated_doc-0.0.4.dist-info/METADATA @@ -0,0 +1,145 @@ +Metadata-Version: 2.4 +Name: annotated-doc +Version: 0.0.4 +Summary: Document parameters, class attributes, return types, and variables inline, with Annotated. +Author-Email: =?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= +License-Expression: MIT +License-File: LICENSE +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: Intended Audience :: Developers +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: Programming Language :: Python :: 3.14 +Project-URL: Homepage, https://github.com/fastapi/annotated-doc +Project-URL: Documentation, https://github.com/fastapi/annotated-doc +Project-URL: Repository, https://github.com/fastapi/annotated-doc +Project-URL: Issues, https://github.com/fastapi/annotated-doc/issues +Project-URL: Changelog, https://github.com/fastapi/annotated-doc/release-notes.md +Requires-Python: >=3.8 +Description-Content-Type: text/markdown + +# Annotated Doc + +Document parameters, class attributes, return types, and variables inline, with `Annotated`. + + + Test + + + Coverage + + + Package version + + + Supported Python versions + + +## Installation + +```bash +pip install annotated-doc +``` + +Or with `uv`: + +```Python +uv add annotated-doc +``` + +## Usage + +Import `Doc` and pass a single literal string with the documentation for the specific parameter, class attribute, return type, or variable. + +For example, to document a parameter `name` in a function `hi` you could do: + +```Python +from typing import Annotated + +from annotated_doc import Doc + +def hi(name: Annotated[str, Doc("Who to say hi to")]) -> None: + print(f"Hi, {name}!") +``` + +You can also use it to document class attributes: + +```Python +from typing import Annotated + +from annotated_doc import Doc + +class User: + name: Annotated[str, Doc("The user's name")] + age: Annotated[int, Doc("The user's age")] +``` + +The same way, you could document return types and variables, or anything that could have a type annotation with `Annotated`. + +## Who Uses This + +`annotated-doc` was made for: + +* [FastAPI](https://fastapi.tiangolo.com/) +* [Typer](https://typer.tiangolo.com/) +* [SQLModel](https://sqlmodel.tiangolo.com/) +* [Asyncer](https://asyncer.tiangolo.com/) + +`annotated-doc` is supported by [griffe-typingdoc](https://github.com/mkdocstrings/griffe-typingdoc), which powers reference documentation like the one in the [FastAPI Reference](https://fastapi.tiangolo.com/reference/). + +## Reasons not to use `annotated-doc` + +You are already comfortable with one of the existing docstring formats, like: + +* Sphinx +* numpydoc +* Google +* Keras + +Your team is already comfortable using them. + +You prefer having the documentation about parameters all together in a docstring, separated from the code defining them. + +You care about a specific set of users, using one specific editor, and that editor already has support for the specific docstring format you use. + +## Reasons to use `annotated-doc` + +* No micro-syntax to learn for newcomers, it’s **just Python** syntax. +* **Editing** would be already fully supported by default by any editor (current or future) supporting Python syntax, including syntax errors, syntax highlighting, etc. +* **Rendering** would be relatively straightforward to implement by static tools (tools that don't need runtime execution), as the information can be extracted from the AST they normally already create. +* **Deduplication of information**: the name of a parameter would be defined in a single place, not duplicated inside of a docstring. +* **Elimination** of the possibility of having **inconsistencies** when removing a parameter or class variable and **forgetting to remove** its documentation. +* **Minimization** of the probability of adding a new parameter or class variable and **forgetting to add its documentation**. +* **Elimination** of the possibility of having **inconsistencies** between the **name** of a parameter in the **signature** and the name in the docstring when it is renamed. +* **Access** to the documentation string for each symbol at **runtime**, including existing (older) Python versions. +* A more formalized way to document other symbols, like type aliases, that could use Annotated. +* **Support** for apps using FastAPI, Typer and others. +* **AI Accessibility**: AI tools will have an easier way understanding each parameter as the distance from documentation to parameter is much closer. + +## History + +I ([@tiangolo](https://github.com/tiangolo)) originally wanted for this to be part of the Python standard library (in [PEP 727](https://peps.python.org/pep-0727/)), but the proposal was withdrawn as there was a fair amount of negative feedback and opposition. + +The conclusion was that this was better done as an external effort, in a third-party library. + +So, here it is, with a simpler approach, as a third-party library, in a way that can be used by others, starting with FastAPI and friends. + +## License + +This project is licensed under the terms of the MIT license. diff --git a/simulador-backend/venv/Lib/site-packages/annotated_doc-0.0.4.dist-info/RECORD b/simulador-backend/venv/Lib/site-packages/annotated_doc-0.0.4.dist-info/RECORD new file mode 100644 index 0000000..06bbc8d --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/annotated_doc-0.0.4.dist-info/RECORD @@ -0,0 +1,11 @@ +annotated_doc-0.0.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +annotated_doc-0.0.4.dist-info/METADATA,sha256=Irm5KJua33dY2qKKAjJ-OhKaVBVIfwFGej_dSe3Z1TU,6566 +annotated_doc-0.0.4.dist-info/RECORD,, +annotated_doc-0.0.4.dist-info/WHEEL,sha256=9P2ygRxDrTJz3gsagc0Z96ukrxjr-LFBGOgv3AuKlCA,90 +annotated_doc-0.0.4.dist-info/entry_points.txt,sha256=6OYgBcLyFCUgeqLgnvMyOJxPCWzgy7se4rLPKtNonMs,34 +annotated_doc-0.0.4.dist-info/licenses/LICENSE,sha256=__Fwd5pqy_ZavbQFwIfxzuF4ZpHkqWpANFF-SlBKDN8,1086 +annotated_doc/__init__.py,sha256=VuyxxUe80kfEyWnOrCx_Bk8hybo3aKo6RYBlkBBYW8k,52 +annotated_doc/__pycache__/__init__.cpython-312.pyc,, +annotated_doc/__pycache__/main.cpython-312.pyc,, +annotated_doc/main.py,sha256=5Zfvxv80SwwLqpRW73AZyZyiM4bWma9QWRbp_cgD20s,1075 +annotated_doc/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/simulador-backend/venv/Lib/site-packages/annotated_doc-0.0.4.dist-info/WHEEL b/simulador-backend/venv/Lib/site-packages/annotated_doc-0.0.4.dist-info/WHEEL new file mode 100644 index 0000000..045c8ac --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/annotated_doc-0.0.4.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: pdm-backend (2.4.5) +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/simulador-backend/venv/Lib/site-packages/annotated_doc-0.0.4.dist-info/entry_points.txt b/simulador-backend/venv/Lib/site-packages/annotated_doc-0.0.4.dist-info/entry_points.txt new file mode 100644 index 0000000..c3ad472 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/annotated_doc-0.0.4.dist-info/entry_points.txt @@ -0,0 +1,4 @@ +[console_scripts] + +[gui_scripts] + diff --git a/simulador-backend/venv/Lib/site-packages/annotated_doc-0.0.4.dist-info/licenses/LICENSE b/simulador-backend/venv/Lib/site-packages/annotated_doc-0.0.4.dist-info/licenses/LICENSE new file mode 100644 index 0000000..7a25446 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/annotated_doc-0.0.4.dist-info/licenses/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2025 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/simulador-backend/venv/Lib/site-packages/annotated_doc/__init__.py b/simulador-backend/venv/Lib/site-packages/annotated_doc/__init__.py new file mode 100644 index 0000000..a0152a7 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/annotated_doc/__init__.py @@ -0,0 +1,3 @@ +from .main import Doc as Doc + +__version__ = "0.0.4" diff --git a/simulador-backend/venv/Lib/site-packages/annotated_doc/__pycache__/__init__.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/annotated_doc/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39d4d2f1869ae080a713a69e4d6ebc94a2bb3c50 GIT binary patch literal 266 zcmX@j%ge<81eyJUStdaGF^B^LOi;#W5g=naLkdF*V-70%Y* zm0z5y;G9^Lo0_K(kXn>lrQn{QSCyEPS``yelwX;eT#_GCoS9pilbDiUq??qOoSmAN z5>u9%R~F-wnFN$7N!2X?iYBI~7RMy!<>i+omZYY{r{pK=$H!;pWtPOp>lIYq;;_lh lPbtkwwJYKT+6;1SF)xt#z|6?Vc$Y!u0iS3icM&^K1OR}YN*VwF literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/annotated_doc/__pycache__/main.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/annotated_doc/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e9c2cd7e6fc5067bfb7e0ee770cb8957ef76f49 GIT binary patch literal 1914 zcmZux-ESL35a0W-_8I0BUF)HnVCLy(YoVrI`D4eIE$GqW?d^P8ES{bhbW zPk`iim$%<>3Hbw+F@bLA{AFN=#3pwMCkKREkL}d3N&0r#@lz#TC;!|t{|K^aak6Q1 zYt!MjaJj?Xmdi5-?q-HN!fn|+3vw3Z8IWf{&hea>1w9Xbv!GwW+<9Z@e5oXU{; z0gEEa;#kXOFBVaSwtAs&4rU>z9TB$`r(LEQh(d#1i@2vly32wdxK9p5?_H)PYX%}( z$(#L80Icz&QCsx_4gdgaS49#7u%N2Kpid)+4PXNa=d%EDvLH}j!agMEgRX+e92dwP zK?Rqw(f}FaT`a_w2;l%@gfk#PD&q+d8Bt$#x`DvLMfhhL_F1SSASvQ5)CEffk#?C3 zFfFVX)_+nh+PHwAF^YEQD~6HQ(jqh(jr)D5VrX(`Y1P4QVaBr4RXV1VCQThiofO=I z0As&(<)3d%8vPTWWYEu%#EJEi}M^|ks(3VQWE)6g1vUudyM@2YT*1!Av$U#q_GV^xo2rx!4; zbhXL+9TD>St_XMQAIm0~Vo~kFF541O{X*&9>M$9ubo)up^JFMv&)b`W3ayMa9PkJq zf`{bE>u-MR{+@gF95muvxQ+;uGYKw%a0t)9KG`1Ip5foy-2TDYAZ4ev=VBWYtE_Y2 z0O`*Hi||aUF&e_rqN}HHQtdT#LrehY@|8#Y>}u)sYH4ug=1*@A3e`cbs^`G?d~g-8 z9Flkf96*jc1eP&99@#gDo`F4VNt;D&(-K{Po&TXk;}m78y@75EuskGB3k#3d&lazr zE?)n&aAT0WVE`r>1!JPkEde(}cmYfi8z5Z3Y2oXZ()fLivN8G_+8~fgcC1bLzV*D_ zof0AA+}tED;TeQyB=m*G;K>U$6@NH>1q2^mOVb{`2o9rLnKmiwdEx;ipHFWL%0=`k z!-A>5aC4d!lS71rkoHH!5}s{ zngzQY-GSwR{An*{a>I(1xq0jl39z3R&yfwYR%Yes8p%lgN@X5IRWz+!&*517~DO#lD@ literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/annotated_doc/main.py b/simulador-backend/venv/Lib/site-packages/annotated_doc/main.py new file mode 100644 index 0000000..7063c59 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/annotated_doc/main.py @@ -0,0 +1,36 @@ +class Doc: + """Define the documentation of a type annotation using `Annotated`, to be + used in class attributes, function and method parameters, return values, + and variables. + + The value should be a positional-only string literal to allow static tools + like editors and documentation generators to use it. + + This complements docstrings. + + The string value passed is available in the attribute `documentation`. + + Example: + + ```Python + from typing import Annotated + from annotated_doc import Doc + + def hi(name: Annotated[str, Doc("Who to say hi to")]) -> None: + print(f"Hi, {name}!") + ``` + """ + + def __init__(self, documentation: str, /) -> None: + self.documentation = documentation + + def __repr__(self) -> str: + return f"Doc({self.documentation!r})" + + def __hash__(self) -> int: + return hash(self.documentation) + + def __eq__(self, other: object) -> bool: + if not isinstance(other, Doc): + return NotImplemented + return self.documentation == other.documentation diff --git a/simulador-backend/venv/Lib/site-packages/annotated_doc/py.typed b/simulador-backend/venv/Lib/site-packages/annotated_doc/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/simulador-backend/venv/Lib/site-packages/annotated_types-0.7.0.dist-info/INSTALLER b/simulador-backend/venv/Lib/site-packages/annotated_types-0.7.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/annotated_types-0.7.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/simulador-backend/venv/Lib/site-packages/annotated_types-0.7.0.dist-info/METADATA b/simulador-backend/venv/Lib/site-packages/annotated_types-0.7.0.dist-info/METADATA new file mode 100644 index 0000000..3ac05cf --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/annotated_types-0.7.0.dist-info/METADATA @@ -0,0 +1,295 @@ +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/simulador-backend/venv/Lib/site-packages/annotated_types-0.7.0.dist-info/RECORD b/simulador-backend/venv/Lib/site-packages/annotated_types-0.7.0.dist-info/RECORD new file mode 100644 index 0000000..7045729 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/annotated_types-0.7.0.dist-info/RECORD @@ -0,0 +1,10 @@ +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-312.pyc,, +annotated_types/__pycache__/test_cases.cpython-312.pyc,, +annotated_types/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +annotated_types/test_cases.py,sha256=zHFX6EpcMbGJ8FzBYDbO56bPwx_DYIVSKbZM-4B3_lg,6421 diff --git a/simulador-backend/venv/Lib/site-packages/annotated_types-0.7.0.dist-info/WHEEL b/simulador-backend/venv/Lib/site-packages/annotated_types-0.7.0.dist-info/WHEEL new file mode 100644 index 0000000..516596c --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/annotated_types-0.7.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: hatchling 1.24.2 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/simulador-backend/venv/Lib/site-packages/annotated_types-0.7.0.dist-info/licenses/LICENSE b/simulador-backend/venv/Lib/site-packages/annotated_types-0.7.0.dist-info/licenses/LICENSE new file mode 100644 index 0000000..d99323a --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/annotated_types-0.7.0.dist-info/licenses/LICENSE @@ -0,0 +1,21 @@ +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/simulador-backend/venv/Lib/site-packages/annotated_types/__init__.py b/simulador-backend/venv/Lib/site-packages/annotated_types/__init__.py new file mode 100644 index 0000000..74e0dee --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/annotated_types/__init__.py @@ -0,0 +1,432 @@ +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/simulador-backend/venv/Lib/site-packages/annotated_types/__pycache__/__init__.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/annotated_types/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42d15a2ee0772d4a82d7fb14fbf4689e8cefbcbf GIT binary patch literal 18635 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 literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/annotated_types/__pycache__/test_cases.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/annotated_types/__pycache__/test_cases.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96b007960bf2a5b1add5ad375b37205115ace5a9 GIT binary patch literal 13248 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 literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/annotated_types/py.typed b/simulador-backend/venv/Lib/site-packages/annotated_types/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/simulador-backend/venv/Lib/site-packages/annotated_types/test_cases.py b/simulador-backend/venv/Lib/site-packages/annotated_types/test_cases.py new file mode 100644 index 0000000..d9164d6 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/annotated_types/test_cases.py @@ -0,0 +1,151 @@ +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/simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/INSTALLER b/simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/METADATA b/simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/METADATA new file mode 100644 index 0000000..2de1cd5 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/METADATA @@ -0,0 +1,105 @@ +Metadata-Version: 2.4 +Name: anyio +Version: 4.13.0 +Summary: High-level concurrency and networking framework on top of asyncio or Trio +Author-email: Alex Grönholm +License-Expression: 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: Framework :: AnyIO +Classifier: Typing :: Typed +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +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 :: 3.14 +Requires-Python: >=3.10 +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: typing_extensions>=4.5; python_version < "3.13" +Provides-Extra: trio +Requires-Dist: trio>=0.32.0; extra == "trio" +Dynamic: license-file + +.. 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 +.. image:: https://tidelift.com/badges/package/pypi/anyio + :target: https://tidelift.com/subscription/pkg/pypi-anyio + :alt: Tidelift + +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. + +To find out why you might want to use AnyIO's APIs instead of asyncio's, you can read about it +`here `_. + +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 +* Subinterpreter support for code parallelization (on Python 3.13 and later) +* Asynchronous file I/O (using worker threads) +* Signal handling +* Asynchronous version of the functools_ module + +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/ +.. _functools: https://docs.python.org/3/library/functools.html +.. _Hypothesis: https://hypothesis.works/ + +Security contact information +---------------------------- + +To report a security vulnerability, please use the `Tidelift security contact`_. +Tidelift will coordinate the fix and disclosure. + +.. _Tidelift security contact: https://tidelift.com/security diff --git a/simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/RECORD b/simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/RECORD new file mode 100644 index 0000000..c0e5e01 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/RECORD @@ -0,0 +1,92 @@ +anyio-4.13.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +anyio-4.13.0.dist-info/METADATA,sha256=F0EYfiPlmTRwmJN2JktNxJg1GNnl0wHhzOWmz7pFvjM,4513 +anyio-4.13.0.dist-info/RECORD,, +anyio-4.13.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91 +anyio-4.13.0.dist-info/entry_points.txt,sha256=_d6Yu6uiaZmNe0CydowirE9Cmg7zUL2g08tQpoS3Qvc,39 +anyio-4.13.0.dist-info/licenses/LICENSE,sha256=U2GsncWPLvX9LpsJxoKXwX8ElQkJu8gCO9uC6s8iwrA,1081 +anyio-4.13.0.dist-info/top_level.txt,sha256=QglSMiWX8_5dpoVAEIHdEYzvqFMdSYWmCj6tYw2ITkQ,6 +anyio/__init__.py,sha256=7iDVqMUprUuKNY91FuoKqayAhR-OY136YDPI6P78HHk,6170 +anyio/__pycache__/__init__.cpython-312.pyc,, +anyio/__pycache__/from_thread.cpython-312.pyc,, +anyio/__pycache__/functools.cpython-312.pyc,, +anyio/__pycache__/lowlevel.cpython-312.pyc,, +anyio/__pycache__/pytest_plugin.cpython-312.pyc,, +anyio/__pycache__/to_interpreter.cpython-312.pyc,, +anyio/__pycache__/to_process.cpython-312.pyc,, +anyio/__pycache__/to_thread.cpython-312.pyc,, +anyio/_backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +anyio/_backends/__pycache__/__init__.cpython-312.pyc,, +anyio/_backends/__pycache__/_asyncio.cpython-312.pyc,, +anyio/_backends/__pycache__/_trio.cpython-312.pyc,, +anyio/_backends/_asyncio.py,sha256=kuqlg2sBUsFdgY80xSDAw60Gx_4WNCl9iSL5XlY6lCU,99476 +anyio/_backends/_trio.py,sha256=l9U-TsKRxzmTQxSMvOhn0bNeFn_iRx3Ho30jvR5Bdu0,41366 +anyio/_core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +anyio/_core/__pycache__/__init__.cpython-312.pyc,, +anyio/_core/__pycache__/_asyncio_selector_thread.cpython-312.pyc,, +anyio/_core/__pycache__/_contextmanagers.cpython-312.pyc,, +anyio/_core/__pycache__/_eventloop.cpython-312.pyc,, +anyio/_core/__pycache__/_exceptions.cpython-312.pyc,, +anyio/_core/__pycache__/_fileio.cpython-312.pyc,, +anyio/_core/__pycache__/_resources.cpython-312.pyc,, +anyio/_core/__pycache__/_signals.cpython-312.pyc,, +anyio/_core/__pycache__/_sockets.cpython-312.pyc,, +anyio/_core/__pycache__/_streams.cpython-312.pyc,, +anyio/_core/__pycache__/_subprocesses.cpython-312.pyc,, +anyio/_core/__pycache__/_synchronization.cpython-312.pyc,, +anyio/_core/__pycache__/_tasks.cpython-312.pyc,, +anyio/_core/__pycache__/_tempfile.cpython-312.pyc,, +anyio/_core/__pycache__/_testing.cpython-312.pyc,, +anyio/_core/__pycache__/_typedattr.cpython-312.pyc,, +anyio/_core/_asyncio_selector_thread.py,sha256=2PdxFM3cs02Kp6BSppbvmRT7q7asreTW5FgBxEsflBo,5626 +anyio/_core/_contextmanagers.py,sha256=YInBCabiEeS-UaP_Jdxa1CaFC71ETPW8HZTHIM8Rsc8,7215 +anyio/_core/_eventloop.py,sha256=c2EdcBX-xnKwxPcC4Pjn3_qG9I-x4IWFO2R9RqCGjM4,6448 +anyio/_core/_exceptions.py,sha256=Y3aq-Wxd7Q2HqwSg7nZPvRsHEuGazv_qeet6gqEBdPk,4407 +anyio/_core/_fileio.py,sha256=CKi1gFNiW2G4knWeBE7He7-rptQwgYjDUWfG8DSlvLs,25665 +anyio/_core/_resources.py,sha256=NbmU5O5UX3xEyACnkmYX28Fmwdl-f-ny0tHym26e0w0,435 +anyio/_core/_signals.py,sha256=mjTBB2hTKNPRlU0IhnijeQedpWOGERDiMjSlJQsFrug,1016 +anyio/_core/_sockets.py,sha256=RBXHcUqZt5gg_-OOfgHVv8uq2FSKk1uVUzTdpjBoI1o,34977 +anyio/_core/_streams.py,sha256=FczFwIgDpnkK0bODWJXMpsUJYdvAD04kaUaGzJU8DK0,1806 +anyio/_core/_subprocesses.py,sha256=tkmkPKEkEaiMD8C9WRZBlmgjOYRDRbZdte6e-unay2E,7916 +anyio/_core/_synchronization.py,sha256=9G3fvRsPNrrWJ_Z6gD_80wXq8I8qgAyhwM8PvHQnT2c,21061 +anyio/_core/_tasks.py,sha256=pVB7K6AAulzUM8YgXAeqNZG44nSyZ1bYJjH8GznC00I,5435 +anyio/_core/_tempfile.py,sha256=jE2w59FRF3yRo4vjkjfZF2YcqsBZvc66VWRwrJGDYGk,19624 +anyio/_core/_testing.py,sha256=u7MPqGXwpTxqI7hclSdNA30z2GH1Nw258uwKvy_RfBg,2340 +anyio/_core/_typedattr.py,sha256=P4ozZikn3-DbpoYcvyghS_FOYAgbmUxeoU8-L_07pZM,2508 +anyio/abc/__init__.py,sha256=6mWhcl_pGXhrgZVHP_TCfMvIXIOp9mroEFM90fYCU_U,2869 +anyio/abc/__pycache__/__init__.cpython-312.pyc,, +anyio/abc/__pycache__/_eventloop.cpython-312.pyc,, +anyio/abc/__pycache__/_resources.cpython-312.pyc,, +anyio/abc/__pycache__/_sockets.cpython-312.pyc,, +anyio/abc/__pycache__/_streams.cpython-312.pyc,, +anyio/abc/__pycache__/_subprocesses.cpython-312.pyc,, +anyio/abc/__pycache__/_tasks.cpython-312.pyc,, +anyio/abc/__pycache__/_testing.cpython-312.pyc,, +anyio/abc/_eventloop.py,sha256=39lYnmtvoHaZw22sWBKOTA_zv7bamOnr8O49PqgDXdw,10629 +anyio/abc/_resources.py,sha256=DrYvkNN1hH6Uvv5_5uKySvDsnknGVDe8FCKfko0VtN8,783 +anyio/abc/_sockets.py,sha256=OmVDrfemVvF9c5K1tpBgQyV6fn5v0XyCExLAqBOGz9o,13124 +anyio/abc/_streams.py,sha256=HYvna1iZbWcwLROTO6IhLX79RTRLPShZMWe0sG1q54I,7481 +anyio/abc/_subprocesses.py,sha256=cumAPJTktOQtw63IqG0lDpyZqu_l1EElvQHMiwJgL08,2067 +anyio/abc/_tasks.py,sha256=KC7wrciE48AINOI-AhPutnFhe1ewfP7QnamFlDzqesQ,3721 +anyio/abc/_testing.py,sha256=tBJUzkSfOXJw23fe8qSJ03kJlShOYjjaEyFB6k6MYT8,1821 +anyio/from_thread.py,sha256=L-0w1HxJ6BSb-KuVi57k5Tkc3yzQrx3QK5tAxMPcY-0,19141 +anyio/functools.py,sha256=5AWM1iYTKkTzptvUhQDdLSh5GvbBW-vcs-SAUfIfA9A,12076 +anyio/lowlevel.py,sha256=AyKLVK3LaWSoK39LkCKxE4_GDMLKZBNqTrLUgk63y80,5158 +anyio/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +anyio/pytest_plugin.py,sha256=t6h4KJstqIxfxwTZ1YO8vpUVuB99nfCLltn0NHfatHo,12775 +anyio/streams/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +anyio/streams/__pycache__/__init__.cpython-312.pyc,, +anyio/streams/__pycache__/buffered.cpython-312.pyc,, +anyio/streams/__pycache__/file.cpython-312.pyc,, +anyio/streams/__pycache__/memory.cpython-312.pyc,, +anyio/streams/__pycache__/stapled.cpython-312.pyc,, +anyio/streams/__pycache__/text.cpython-312.pyc,, +anyio/streams/__pycache__/tls.cpython-312.pyc,, +anyio/streams/buffered.py,sha256=2R3PeJhe4EXrdYqz44Y6-Eg9R6DrmlsYrP36Ir43-po,6263 +anyio/streams/file.py,sha256=msnrotVKGMQomUu_Rj2qz9MvIdUp6d3JGr7MOEO8kV4,4428 +anyio/streams/memory.py,sha256=F0zwzvFJKAhX_LRZGoKzzqDC2oMM-f-yyTBrEYEGOaU,10740 +anyio/streams/stapled.py,sha256=T8Xqwf8K6EgURPxbt1N4i7A8BAk-gScv-GRhjLXIf_o,4390 +anyio/streams/text.py,sha256=BcVAGJw1VRvtIqnv-o0Rb0pwH7p8vwlvl21xHq522ag,5765 +anyio/streams/tls.py,sha256=DQVkXUvsTEYKkBO8dlVU7j_5H8QOtLy4sGi1Wrjqevo,15303 +anyio/to_interpreter.py,sha256=_mLngrMy97TMR6VbW4Y6YzDUk9ZuPcQMPlkuyRh3C9k,7100 +anyio/to_process.py,sha256=J7gAA_YOuoHqnpDAf5fm1Qu6kOmTzdFbiDNvnV755vk,9798 +anyio/to_thread.py,sha256=f6h_k2d743GBv9FhAnhM_YpTvWgIrzBy9cOE0eJ1UJw,2693 diff --git a/simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/WHEEL b/simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/WHEEL new file mode 100644 index 0000000..14a883f --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (82.0.1) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/entry_points.txt b/simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/entry_points.txt new file mode 100644 index 0000000..44dd9bd --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[pytest11] +anyio = anyio.pytest_plugin diff --git a/simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/licenses/LICENSE b/simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/licenses/LICENSE new file mode 100644 index 0000000..104eebf --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/licenses/LICENSE @@ -0,0 +1,20 @@ +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/simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/top_level.txt b/simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/top_level.txt new file mode 100644 index 0000000..c77c069 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio-4.13.0.dist-info/top_level.txt @@ -0,0 +1 @@ +anyio diff --git a/simulador-backend/venv/Lib/site-packages/anyio/__init__.py b/simulador-backend/venv/Lib/site-packages/anyio/__init__.py new file mode 100644 index 0000000..d23c5a5 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/__init__.py @@ -0,0 +1,111 @@ +from __future__ import annotations + +from ._core._contextmanagers import AsyncContextManagerMixin as AsyncContextManagerMixin +from ._core._contextmanagers import ContextManagerMixin as ContextManagerMixin +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_available_backends as get_available_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 BrokenWorkerInterpreter as BrokenWorkerInterpreter +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 ConnectionFailed as ConnectionFailed +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 NoEventLoopError as NoEventLoopError +from ._core._exceptions import RunFinishedError as RunFinishedError +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 TCPConnectable as TCPConnectable +from ._core._sockets import UNIXConnectable as UNIXConnectable +from ._core._sockets import as_connectable as as_connectable +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 notify_closing as notify_closing +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 + + +def __getattr__(attr: str) -> type[BrokenWorkerInterpreter]: + """Support deprecated aliases.""" + if attr == "BrokenWorkerIntepreter": + import warnings + + warnings.warn( + "The 'BrokenWorkerIntepreter' alias is deprecated, use 'BrokenWorkerInterpreter' instead.", + DeprecationWarning, + stacklevel=2, + ) + return BrokenWorkerInterpreter + + raise AttributeError(f"module {__name__!r} has no attribute {attr!r}") diff --git a/simulador-backend/venv/Lib/site-packages/anyio/__pycache__/__init__.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..276f7d91769602025e24b3420b6da62f4a020666 GIT binary patch literal 4638 zcmZ{n%THX_9mmhW!0>*XmxDdAjWIUHFZ{MKZw$tO88GA+_vSM902l6KbnYE&P+C=0 z7pW8}in>Uos!|r+ROzCBLbg>GbsMEkryVI$+eLP+l5D!__xGE*U|bjBFQ4=K{m$c_ z$L}2fzP7eX;AiW@#;wkFA^t&y=%>5@v2Vk;5FZOmSTRSqF&T>qtHdgGO59Re${YvB zWt_RpDRawZIdeHUArs6AaD}X3t^ilcO6E#%m8@c}0$0mw=4x<_tYNMJ*UDPvTBpvf zm-Wnb;0D>iTn}!Pjm!<;CfUT?2yT|m%uV1H*}~imJ|d4Ww}4w^EAtU>n`~ol1-Hv~ z<~DGL>|kyOcgjxY4)9TVl)2M+%k7d~%tyh;@UR?a zz6lwr;0ZawJP4kYlg#(P_vL-&A!o{+meb6`;0N*n z^9XoG&M=RHAIgW!W8hgi%RCOAlXJ`y&b<3bK4P8(FUSSv`{0yJF;9UPhYwB9+)(7|w9D9cdK(?;4c1FBT2v(#-_;3$;=)G`?BzE(R*!%$r?WWCUK zP;4I2J~~`bfuGfBHLkT!QEdhDvah$5p2COej8@Qt8U@$9_S1?xZXC%5yRSFXJnHy? zvR*egU{XAlrb(Q@=P3)#HjXLBc5U=A>xUD5)+1x}xM$6+r$Vhv7sa|MFYUV-2P0Wf zCIvLi`r|v8#~I(xL}PDQ$a)jDX9t_gifkQ=yBTE-hoQFDvY|rwc6Pr))v}*;tP#gg zZ==adUd;&%3x)W+8E%r%&nVAWFBmJIX)_ZQ8qG9)Bh7GHt!Eu)7vU`&9@rb6=@?q2 zm0g(py2a7?;vIc53CYsm=_HbYX&uLDj{g5vFNPYocP-v!A1UG>!QQRa6N( zB5P%g0H32mxV!(?je3SXU}>hNfDgI^=$( zt!nIC)3UVft@{`n6+P2c#bOkJJCU zy=mVtX5;XLSSNH*yKgO4ufpaD(WGT_UOOnQAv)o1TjVSt_A+C|B0g!Vu=hCSMju6= ziqJ+hVqnER>^_5RoQHYKQF3OBu||o4b5`r&tb$~?V_StYbJ&yOgIFI@5;Dvv3+1W| z!}YB!lDm-;d*!CLYy17_;%&xv5xsnIhsD0#1AHvr!^?O3j1c++zk9_GWADYbigz5x z7sZOxOS$l4mHnnXx(8z-EWV|MNQtm=KPD0K>zm5ID6uNugZ?re-H$(s^;Yg3O=UA! zy)bDhTm@<58!Kr#wi&3PKiB&Dby2u2bP3v<-CJ4QRLPztGT-U%YyHaT!mp!rZSA)l3bjc)K3u>&ZegtI5q9UTthJe>*j?HZg8C-Uj+$mO-*}JSCiC`)RNRea*a{V=V_JUx0tRc zC#{@rBxxdPCTSr#LefgoMuPuf3f)1{NpcjDt1Y%km%Q!kx5&{&a*X6Sg+v3^#n)1x zlVq+d)-2rjfqwgtk+0!EpMX)HBsoRWO>&x~hXiL@=w6buBW?seRAh<0q}YP7yaqZj#(0xlMA1 zv?f0FM3!3 zV|j6(s}HhX<8~f@Us4h)`MzAlCebarddyL9;ul?^e^kOR0Is`vaXT+2_A8-)L0*O_ zFD`NyXab=yqPu~-7|M$U4#1cTLxrN&RUY1jyudFiA`BI0qKZTRE*A|gA5HxH{>O74 z&3)0*{pb4AKc4(+qVD}?pVWN1_C=!iFNuLaCI)`H@?~Q1tFG?%6JJ(zzAQtMdRZmP OYQ8J4i9Lw%Wd9e_-fm3* literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/__pycache__/from_thread.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/__pycache__/from_thread.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d12d8b4730e7bfd41fd76f62f2306527bdf22bba GIT binary patch literal 25839 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 literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/__pycache__/functools.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/__pycache__/functools.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d8e8bdfcac38a2f78701452a62521c0c848ca83 GIT binary patch literal 16581 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 literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/__pycache__/pytest_plugin.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/__pycache__/pytest_plugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b3414ba9690f4f9862273fe4e5f828f97e62da1 GIT binary patch literal 16789 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 axLqr5&uExs>rxFvDo6fr0bL!X^Zyqc3>kI+ literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/__pycache__/to_interpreter.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/__pycache__/to_interpreter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e55f96d410dfa6fd57f82f69b3e49faf737b2cb GIT binary patch literal 10341 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 sX$o%{HS$yEd^EyC^9)5GNs+n~C( zNQfE(Yc5!uY)y8jT2mGg71L8c>?sgl4r&jqY;J2Bz9)n6(f3R+5!mpX{G~lcp7jf+ zgQ^>T6SgFf|kTHuxDRiTdR#YN9-4}j3=O;>W5qkk&Vo4Nx z@rvRs@S?CA#$4Tkxs~fIidZM&AeR^VJ^nURAUYdNiGB1IKI+Rn_8409I?P|=B7n}x z>#WE8Fz(;Xj5P}THmL8rIH!=-a$5^YFXCzG+X9r=(#nGOEgrA4D6QO<`kGqS3vV>+ zw9YzA1X6hL=QH8+D0Q>exR#c4hy6T!1Xn7-|4#_94(@^Qbz%YVTZJFYZWX?7#X~)S zKQ6$qc>??SBxDLfce8n1A=9IkUgmlEM4Jai+BSB~^EwVZSTAWcI-8QqX- zjVl;Ol;*3((wj?0zuo>sjM{A~d&X+0DHjN0Kp~DsKW2K3Zm=*8#WG!ziiWW^_I%j| zM26GyDD&WAHp{FGUV`^J#y4;Yr&3=gN^{yt;*llA<3tGxXeOLqfF+pdQ^i6JZt!<} zZhUKG#yXsa%R(wX+*Y&46ziJ6G-2m{&O+m2J_fPCL$} zCT+JDRKg)%v7~tzk8bxu#MwH=DU4AAwrt!$909i#4wMflfG0OZgN7L%D^i0p1{s2X zB#Q0!8!XcKTG^II#)g!}?HI&y3x|dh0TDNT$sSiGo#_h0&>O_S2OtSf$!Ib%o6+TH zfaJsBiW$N=fCglM3r+2%BYA^@V1Qx{-;2~`ZXl~Fe@ zaUam5&NVp8U5q-(3K}+eZMs z+@@>14-^16^Xh>SY(w&eaz2)Mjh_c^%^}c6*N<>OhfrVXHPL_boAitGpPzsAH3PyY z2>}a*LdQ^v_OXOQ$*<}dig*N3i5dkp4V`KhM;ujwCY`>KGY#nd9XLJ!E`?`ydTQv4 z7YZ*UZ|-HIm^xS+Gh;JDi>ZUTudza764H-5H=2uIlfaehOhLV*x4Gh*^s7>AvWRak z-d3{D{a7yQu$x3Ikm}|9pjre3*B5Vw9TH#TCm;OTvwbFnTiukIPKGqXp{fC#X5$m_s73X(F5Pawv zJs58|VyuHNfN-B29%rMY3Pz7V!?CvjD(1imXs8IsEf(plSRT(mBxIf^w9^Ncm|Mcr z2`Q3p2hJq9WX$jr%36Y$z5Pi9H&#YgVkWB2ky_wpn6>W*_&oq?f7O+63I=K1USF?HuocA>d5 zyv5wTdyx+BHh0wvs62IC#gII8I#NaoslMr=NVlLW32riJ^Te@BRX&)OvgoQQbf%y_ z4UIAvtrKb0^Oh38n0uZ=R-|Rm11~)JRi>KdCwF-tbJJ$+c+85OlxpJXs`#_4CgRXSxsVpJu~X@cVaG3K^uQn z9W_jLAqr{^Ul>&bL|XZBR|ZMMuc(XAhZi^fD|iiT%d+;!X9kY#7PiX=Rbsh&V|(VIJ@ekiAMLrnI4|uuFa6W`(qG-__nLs>cI8j*$zN0-xo5X4 zgBm$=ZuiXD-SeOOmwUk~?N(nM*wB9HzAz|4J1CLoP7lf`Rmk*noOV|9_hYtfc?| literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/_backends/__init__.py b/simulador-backend/venv/Lib/site-packages/anyio/_backends/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/_backends/__pycache__/__init__.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/_backends/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ae95dd1c49608064bd01dbdc2ff5d11ef4be3f5 GIT binary patch literal 204 zcmX@j%ge<81X=xpSs?l`h(HIQS%4zb87dhx8U0o=6fpsLpFwJVWxH6#c;y$TDmW(= z<)-E-1f&+FRw=mW=T#-X(TfTD@%sl_pgd6k*@`teXz#rpB_nR%Hd@$q^EmA5!-a`RJ4b5iY!Sb=sk S0&y{j@sXL4k+Fyw$N~VR0yu&I literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/_backends/__pycache__/_asyncio.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/_backends/__pycache__/_asyncio.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f2d4c0e95d46edf7cc03253d9183d68fc876fc7 GIT binary patch literal 138635 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 XeEH~OQI38iPhwx#qNmari}`;6w?v?( literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/_backends/__pycache__/_trio.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/_backends/__pycache__/_trio.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5bccf1494f5e2b2e1da255d9a27cb144051e1db0 GIT binary patch literal 71492 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 literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/_backends/_asyncio.py b/simulador-backend/venv/Lib/site-packages/anyio/_backends/_asyncio.py new file mode 100644 index 0000000..9f1ddc2 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/_backends/_asyncio.py @@ -0,0 +1,2996 @@ +from __future__ import annotations + +import array +import asyncio +import concurrent.futures +import contextvars +import math +import os +import socket +import sys +import threading +import weakref +from asyncio import ( + AbstractEventLoop, + CancelledError, + all_tasks, + create_task, + current_task, + get_running_loop, + sleep, +) +from asyncio.base_events import _run_until_complete_cb # type: ignore[attr-defined] +from collections import OrderedDict, deque +from collections.abc import ( + AsyncGenerator, + AsyncIterator, + Awaitable, + Callable, + Collection, + Coroutine, + Iterable, + Sequence, +) +from concurrent.futures import Future +from contextlib import AbstractContextManager, suppress +from contextvars import Context, copy_context +from dataclasses import dataclass, field +from functools import partial, wraps +from inspect import ( + CORO_RUNNING, + CORO_SUSPENDED, + getcoroutinestate, + iscoroutine, +) +from io import IOBase +from os import PathLike +from queue import Queue +from signal import Signals +from socket import AddressFamily, SocketKind +from threading import Thread +from types import CodeType, TracebackType +from typing import ( + IO, + TYPE_CHECKING, + Any, + ParamSpec, + TypeVar, + cast, +) +from weakref import WeakKeyDictionary + +from .. import ( + CapacityLimiterStatistics, + EventStatistics, + LockStatistics, + TaskInfo, + abc, +) +from .._core._eventloop import ( + claim_worker_thread, + set_current_async_library, + threadlocals, +) +from .._core._exceptions import ( + BrokenResourceError, + BusyResourceError, + ClosedResourceError, + EndOfStream, + RunFinishedError, + WouldBlock, +) +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 ( + AsyncBackend, + IPSockAddrType, + SocketListener, + UDPPacketType, + UNIXDatagramPacketType, +) +from ..abc._eventloop import StrOrBytesPath +from ..lowlevel import RunVar +from ..streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream + +if TYPE_CHECKING: + from _typeshed import FileDescriptorLike +else: + FileDescriptorLike = object + +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] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self.close() + + def close(self) -> None: + """Shutdown and close event loop.""" + loop = self._loop + if self._state is not _State.INITIALIZED or loop is None: + return + try: + _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 # noqa: B904 + 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 via 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._cancel_reason: str | None = None + 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 + if isinstance(exc_val, BaseExceptionGroup): + cancelleds_caught, remaining = exc_val.split( + lambda exc: ( + isinstance(exc, CancelledError) + and is_anyio_cancellation(exc) + ) + ) + + if cancelleds_caught is None: + return False + + self._cancelled_caught = True + + if remaining is None: + return True + + context = remaining.__context__ + try: + # Preserve __cause__ and __suppress_context__ by avoiding `raise + # ... from ...` + raise remaining + finally: + # Preserve __context__ + remaining.__context__ = context + del context + else: + if isinstance(exc_val, CancelledError) and is_anyio_cancellation( + exc_val + ): + self._cancelled_caught = True + return True + else: + return False + 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("deadline exceeded") + 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(origin._cancel_reason) + 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, reason: str | None = None) -> None: + if not self._cancel_called: + if self._timeout_handle: + self._timeout_handle.cancel() + self._timeout_handle = None + + self._cancel_called = True + self._cancel_reason = f"Cancelled via cancel scope {id(self):x}" + if task := current_task(): + self._cancel_reason += f" by {task}" + + if reason: + self._cancel_reason += f"; reason: {reason}" + + 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: + 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: + if sys.version_info >= (3, 14) and self.cancel_scope._host_task is not None: + asyncio.future_discard_from_awaited_by( + _task, self.cancel_scope._host_task + ) + + 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) + if sys.version_info >= (3, 14) and self.cancel_scope._host_task is not None: + asyncio.future_add_to_awaited_by(task, self.cancel_scope._host_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[T_Retval | None, BaseException | None] + + +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") + + +# +# 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 + _closed: bool = field(init=False, default=False) + + async def send(self, item: bytes) -> None: + await AsyncIOBackend.checkpoint_if_cancelled() + stream_paused = self._stream._protocol._paused # type: ignore[attr-defined] + try: + self._stream.write(item) + await self._stream.drain() + except (ConnectionResetError, BrokenPipeError, RuntimeError) as exc: + # If closed by us and/or the peer: + # * on stdlib, drain() raises ConnectionResetError or BrokenPipeError + # * on uvloop and Winloop, write() eventually starts raising RuntimeError + if self._closed: + raise ClosedResourceError from exc + elif self._stream.is_closing(): + raise BrokenResourceError from exc + + raise + + if not stream_paused: + await AsyncIOBackend.cancel_shielded_checkpoint() + + async def aclose(self) -> None: + self._closed = True + 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 # type: ignore[name-defined] + 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.copy(): + if process.returncode is not 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: + workers = workers.copy() + 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 = 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 BrokenResourceError from self._protocol.exception + 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 BrokenResourceError from 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: + self._closed = True + if not self._transport.is_closing(): + 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: + self._closed = True + if not self._transport.is_closing(): + 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: + self._closed = True + if not self._transport.is_closing(): + 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.Future[bool]]] = RunVar("read_events") +_write_events: RunVar[dict[int, asyncio.Future[bool]]] = 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 < 0: + raise ValueError("total_tokens must be >= 0") + + 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 _notify_next_waiter(self) -> 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 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) + if event.is_set(): + self._notify_next_waiter() + + 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 + + self._notify_next_waiter() + + 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: + if sys.platform != "win32": + import uvloop + + loop_factory = uvloop.new_event_loop + else: + import winloop + + loop_factory = winloop.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): + if sys.platform != "win32": + import uvloop + + loop_factory = uvloop.new_event_loop + else: + import winloop + + loop_factory = winloop.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(set_current_async_library, 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() -> T_Retval: + __tracebackhide__ = True + if scope is not None: + 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: + if scope is not None: + scope._tasks.discard(task) + + loop = cast( + "AbstractEventLoop", token or threadlocals.current_token.native_token + ) + if loop.is_closed(): + raise RunFinishedError + + context = copy_context() + context.run(set_current_async_library, "asyncio") + scope = getattr(threadlocals, "current_cancel_scope", None) + f: concurrent.futures.Future[T_Retval] = context.run( + asyncio.run_coroutine_threadsafe, task_wrapper(), loop=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: + set_current_async_library("asyncio") + f.set_result(func(*args)) + except BaseException as exc: + f.set_exception(exc) + if not isinstance(exc, Exception): + raise + + loop = cast( + "AbstractEventLoop", token or threadlocals.current_token.native_token + ) + if loop.is_closed(): + raise RunFinishedError + + f: concurrent.futures.Future[T_Retval] = Future() + loop.call_soon_threadsafe(wrapper) + return f.result() + + @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: + try: + read_events = _read_events.get() + except LookupError: + read_events = {} + _read_events.set(read_events) + + fd = obj if isinstance(obj, int) else obj.fileno() + if read_events.get(fd): + raise BusyResourceError("reading from") + + loop = get_running_loop() + fut: asyncio.Future[bool] = loop.create_future() + + def cb() -> None: + try: + del read_events[fd] + except KeyError: + pass + else: + remove_reader(fd) + + try: + fut.set_result(True) + except asyncio.InvalidStateError: + pass + + try: + loop.add_reader(fd, cb) + except NotImplementedError: + from anyio._core._asyncio_selector_thread import get_selector + + selector = get_selector() + selector.add_reader(fd, cb) + remove_reader = selector.remove_reader + else: + remove_reader = loop.remove_reader + + read_events[fd] = fut + try: + success = await fut + finally: + try: + del read_events[fd] + except KeyError: + pass + else: + remove_reader(fd) + + if not success: + raise ClosedResourceError + + @classmethod + async def wait_writable(cls, obj: FileDescriptorLike) -> None: + try: + write_events = _write_events.get() + except LookupError: + write_events = {} + _write_events.set(write_events) + + fd = obj if isinstance(obj, int) else obj.fileno() + if write_events.get(fd): + raise BusyResourceError("writing to") + + loop = get_running_loop() + fut: asyncio.Future[bool] = loop.create_future() + + def cb() -> None: + try: + del write_events[fd] + except KeyError: + pass + else: + remove_writer(fd) + + try: + fut.set_result(True) + except asyncio.InvalidStateError: + pass + + try: + loop.add_writer(fd, cb) + except NotImplementedError: + from anyio._core._asyncio_selector_thread import get_selector + + selector = get_selector() + selector.add_writer(fd, cb) + remove_writer = selector.remove_writer + else: + remove_writer = loop.remove_writer + + write_events[fd] = fut + try: + success = await fut + finally: + try: + del write_events[fd] + except KeyError: + pass + else: + remove_writer(fd) + + if not success: + raise ClosedResourceError + + @classmethod + def notify_closing(cls, obj: FileDescriptorLike) -> None: + fd = obj if isinstance(obj, int) else obj.fileno() + loop = get_running_loop() + + try: + write_events = _write_events.get() + except LookupError: + pass + else: + try: + fut = write_events.pop(fd) + except KeyError: + pass + else: + try: + fut.set_result(False) + except asyncio.InvalidStateError: + pass + + try: + loop.remove_writer(fd) + except NotImplementedError: + from anyio._core._asyncio_selector_thread import get_selector + + get_selector().remove_writer(fd) + + try: + read_events = _read_events.get() + except LookupError: + pass + else: + try: + fut = read_events.pop(fd) + except KeyError: + pass + else: + try: + fut.set_result(False) + except asyncio.InvalidStateError: + pass + + try: + loop.remove_reader(fd) + except NotImplementedError: + from anyio._core._asyncio_selector_thread import get_selector + + get_selector().remove_reader(fd) + + @classmethod + async def wrap_listener_socket(cls, sock: socket.socket) -> SocketListener: + return TCPSocketListener(sock) + + @classmethod + async def wrap_stream_socket(cls, sock: socket.socket) -> SocketStream: + transport, protocol = await get_running_loop().create_connection( + StreamProtocol, sock=sock + ) + return SocketStream(transport, protocol) + + @classmethod + async def wrap_unix_stream_socket(cls, sock: socket.socket) -> UNIXSocketStream: + return UNIXSocketStream(sock) + + @classmethod + async def wrap_udp_socket(cls, sock: socket.socket) -> UDPSocket: + transport, protocol = await get_running_loop().create_datagram_endpoint( + DatagramProtocol, sock=sock + ) + return UDPSocket(transport, protocol) + + @classmethod + async def wrap_connected_udp_socket(cls, sock: socket.socket) -> ConnectedUDPSocket: + transport, protocol = await get_running_loop().create_datagram_endpoint( + DatagramProtocol, sock=sock + ) + return ConnectedUDPSocket(transport, protocol) + + @classmethod + async def wrap_unix_datagram_socket(cls, sock: socket.socket) -> UNIXDatagramSocket: + return UNIXDatagramSocket(sock) + + @classmethod + async def wrap_connected_unix_datagram_socket( + cls, sock: socket.socket + ) -> ConnectedUNIXDatagramSocket: + return ConnectedUNIXDatagramSocket(sock) + + @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/simulador-backend/venv/Lib/site-packages/anyio/_backends/_trio.py b/simulador-backend/venv/Lib/site-packages/anyio/_backends/_trio.py new file mode 100644 index 0000000..b85a10a --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/_backends/_trio.py @@ -0,0 +1,1343 @@ +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 contextlib import AbstractContextManager +from dataclasses import dataclass +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, + ParamSpec, + 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, + notify_closing, + wait_readable, + wait_writable, +) +from trio.socket import SocketType as TrioSocketType +from trio.to_thread import run_sync + +from .. import ( + CapacityLimiterStatistics, + EventStatistics, + LockStatistics, + RunFinishedError, + 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 FileDescriptorLike + +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, reason: str | None = None) -> None: + self.__original.cancel(reason) + + @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) + + +# +# 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 bytes(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: + trio_token = cast("trio.lowlevel.TrioToken | None", token) + try: + return trio.from_thread.run(func, *args, trio_token=trio_token) + except trio.RunFinishedError: + raise RunFinishedError from None + + @classmethod + def run_sync_from_thread( + cls, + func: Callable[[Unpack[PosArgsT]], T_Retval], + args: tuple[Unpack[PosArgsT]], + token: object, + ) -> T_Retval: + trio_token = cast("trio.lowlevel.TrioToken | None", token) + try: + return trio.from_thread.run_sync(func, *args, trio_token=trio_token) + except trio.RunFinishedError: + raise RunFinishedError from None + + @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: FileDescriptorLike) -> 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: FileDescriptorLike) -> 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 notify_closing(cls, obj: FileDescriptorLike) -> None: + notify_closing(obj) + + @classmethod + async def wrap_listener_socket(cls, sock: socket.socket) -> abc.SocketListener: + return TCPSocketListener(sock) + + @classmethod + async def wrap_stream_socket(cls, sock: socket.socket) -> SocketStream: + trio_sock = trio.socket.from_stdlib_socket(sock) + return SocketStream(trio_sock) + + @classmethod + async def wrap_unix_stream_socket(cls, sock: socket.socket) -> UNIXSocketStream: + trio_sock = trio.socket.from_stdlib_socket(sock) + return UNIXSocketStream(trio_sock) + + @classmethod + async def wrap_udp_socket(cls, sock: socket.socket) -> UDPSocket: + trio_sock = trio.socket.from_stdlib_socket(sock) + return UDPSocket(trio_sock) + + @classmethod + async def wrap_connected_udp_socket(cls, sock: socket.socket) -> ConnectedUDPSocket: + trio_sock = trio.socket.from_stdlib_socket(sock) + return ConnectedUDPSocket(trio_sock) + + @classmethod + async def wrap_unix_datagram_socket(cls, sock: socket.socket) -> UNIXDatagramSocket: + trio_sock = trio.socket.from_stdlib_socket(sock) + return UNIXDatagramSocket(trio_sock) + + @classmethod + async def wrap_connected_unix_datagram_socket( + cls, sock: socket.socket + ) -> ConnectedUNIXDatagramSocket: + trio_sock = trio.socket.from_stdlib_socket(sock) + return ConnectedUNIXDatagramSocket(trio_sock) + + @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/simulador-backend/venv/Lib/site-packages/anyio/_core/__init__.py b/simulador-backend/venv/Lib/site-packages/anyio/_core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/__init__.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58745de77b232535512f73a9e8cd649339ad5c50 GIT binary patch literal 200 zcmX@j%ge<81X=xpSs?l`h(HIQS%4zb87dhx8U0o=6fpsLpFwJVrMpX(TfTD@%sl_pgd6k*@`tiy6MXCDn@tJv literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_asyncio_selector_thread.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_asyncio_selector_thread.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7929353aaf55dba953271f9afc18d9e1deb836e1 GIT binary patch literal 8415 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 literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_contextmanagers.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_contextmanagers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..443299c43594151879882571723e7a2b444e02b2 GIT binary patch literal 9010 zcmds6TWl2989p<+v)=pKyT<132?4_rV{RtF4uyar1OgTXnktLa^>}8C$C=%6&ddT{ zOiB_O5eYS*pxRNChCU^TRLW!2r$%|H)R#rJgu5aNZBwaz+hEjGJXHPvGqYE(DVL;8 zJC@I$`Oob?|M_pb$J5(l!LKIFXDK5crSm$*< z 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 literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_eventloop.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_eventloop.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..481a6630a238c5b5d90a379b99b7331ecf7f43c1 GIT binary patch literal 8194 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 RCqM5G9(|Pm`6C>Z{{;{n3V;9r literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_exceptions.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6e231884d8ce89ad81cdca3ec0510023842d689 GIT binary patch literal 7437 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 %xMZq3|s8@ReeF8>_OZch$JQ> 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 Jp^9GZSWZ8xt#t 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 be)1I%d?_Sf5y2dmqeQTj-zY^GmMJ literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_streams.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_streams.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f93ccc6a60f9a0beebc8e01dcb0da81e9aa30d0c GIT binary patch literal 2349 zcmb7FO>ERw5PshEI{TMola>GprB8rp7J-9Qs!FR0iJulIGzm?h>JsF5?YFy5{F6RE zC*4&l(TYQF?TuEdRIXJxaO|WuAOg;YYSS9&{dX8h)x zdEbnG>+jDKcox1HS{UdfbQcl2A_BscH)T({|dCt8%21 z?Tn*T6_7KgV)r@OYSzhBb56dRmq>~*+3Z`B;!~@I6uCgm>}_J^SdryeVLupHHvX@t zaJQCDeEVCea{ei9%2HU+UDp%3usqkFgni#^Yl&UgIf(L#&fTXe^h<~PKVpu@TT`_K zW{8iO!K`IABRJEYaAc=xhPh^<->1D~h@5926bqGE?UG=Q5d(_X1f8^f6!v!rBUQ;H zP!p+|&Jk12k?s$wk-nX&%8-Q;ju`+!FwKe3XvrU#L-twsh=%|27P(ycVjnSk^%%rxp$f6f2^}sbM^REDKBTnoHQ#Ep3Uvdg#yIurQCy!knQc@NDq=mJFm8Ixr@)>j?mU;Caa)(B=&5pCP=uwb)MQJX8E{8tr9w}sCwqrcdd+8$ z(yI#isTXi$3X<~XxT>m{y5;(U>82Xz%9#kbTY<|J!II4|#c`}sa+${|L`SkF`vlyi zk?<`dUj|m#OWS`%+*_4Iq{d|d`M>K~e3uYDCh)E30e__{uOjMT5g?V#_dD9--X5jYT(;0YXEJQ zSzBO_^;k)D-UuA#3fk0t@MG={t|0vrI;khsh$;V%Cq0&Myc(Ehc_6Q`XtQNzmkXhc z=)*L?5A&9fjM80$p+bcD>$)AV_c`}C$2$&(&nFy)A^8c+M4&sz%jG!jISzIX)1H*& zFm2d=IJm16VXl{Rn86lez6|czAOAGYSLQzSpbyUJ9BM(Q8E0*J!E@WX&DwL*+-t$S z_2zub32fc;_=y^10rZ|*X72Lb6{`j&!A>lJR&OwWPIp_DH=!9GXA{XB^wp(S*r#bO zThX-k;aAjAO`MJZJiiUgEwZJM;@A)7kInC!4+=-`wSS)Y{q2VnQ;&uZbl#ZV7{1mi zUfV2;es}dj;b5dYvoUcO=rQjge5*0xew*0Qt}N)4&RS;-}bJ40%v*_q9q zSy5z{u52Z#WT>?a*O3b7hXWXh6eXyCraxL(h#;ltA2M{o^}ucfG(~HmKh|&x$wYzl zoO^edOL3*bap3w#hvc0zckbhybI&>Ve0TUye!rK%b@H|F$^Yyk1DK2ts`jb@sY&5W*BTQaT5 zR)HvOO8bJF5XGyswF09hy1h&%J7k~IDf^#-cXB`uC_cp}2a$pwB8TK~iEfZ1SA%ur z^Zv-qa^v@0$u67+W~wz$(^dcPKa1QVM`8T#`9Q4oBV3r6VAV^Srkj$P)-@yMu>8Zu zyp|d@6)H`uish+L?r%uhY+9SOJmboDbBdNyptJj#c~db)4+H5rBAF)+rB5j_yX81C zdgP$ha6nR3MLt6HlwueMDb=YJI-qB=s$y2EVM^QRVaqk0A3Hh9ymQtq_O~%R;RU}iHG$rHI4z5_xa;CLx&a|9{DW^5d1vecY@vcy6Ia4Q;)G5oJnv*TNqMf$t4O60K z4zw_%TYfelXl+K7W(_OM-c4%C+@t~0LcQh5N`^5xBZD+KLxJ%aSC&sXV^WE;Xjsl% z1{hAEWOyOV=rZRB5k7g>PRL(0Jx>I19NB%oX-1HR@A(!(dE3kWyzp|pS?)z-`;8L) zieN%7e&tDCpf1x^1+`vZUlI{bKsPJ24not zcG>;|r;~hzoD(+IEQV#9Y@4;c+GK+B@asnDUe(&p`!6=+!zVrEcI$WAnQu5*zy4gN z@}b)8W#^5OWCDQ}zHqZ%Nw_Gp@=sa$+&*&gAK~vh{JjBx-|r*4xo%+oAF}n@N1VhE=4=A_4tSqH zF1~rj{v9$WK8e1ZZS{aaU0h2*I?QiF)mA{v_ToT7flV+c=7DPZ;c&2bZBaz zB9$c0q*Z073cHx7PoGp$Cey{#7z{r3q&PLj*qNFV_0zCHq-EgSJdxfY6yHO>0CpZw z0r2yOnRK%P$0wdWd~^a-_(=6s^TRgIxR{;+l}*r`G6kKflr|JGuABi=eW}V;Hzx^G z*b&ydvMgo40DH`&HQ3}0aSrSl_@RoKqZ(MF3=76A+dKi5yK4h8b8=i9oe?3+0e09@ z0y`;aH>)tSn$zhiG-NqVVa0Vi&#f?Rh||i9P8AW{sch*Lo=U!3JrSe`Oy-Rfp@E1Q zo;v}*Syh5;h|QbUz!kyCWD$C%sji`iR305QSHDyj6$e0fR; z11tdoZ-uA=SsXRQ{%@x>S)Vh&0oD0fHB%cBq`1iPq)oG-t}&QUU1c(sJC%IC!pyqG zi2V@y#Q0{Zj_6rMn-XEk*hrlBbjsMk)TT78WTqxFQ{GWAjkMe!6ODPpR3Lal8Vd#o z1!yQEfvG{juC~wAiL@$Lbd;rO6LwQ*G>x zp-F_0lcMP?SSgFyrxYbCqS(NiIj6uK<7CNBAcR)bw}C~)c=+6yslqlfGXt)WKFutG z2?IXB$1d+tu<}Rd%@ZKm{-?#ggI^mEA0iFQdaH+I6{w)!f6VF>8nl$l!tRLPBZ2d> z;hA;}#VjpV_3rur+Z7c(gngEuSNvL2W&tXlRt7*B;MeS>2n6`Ing&nimI2YF+9G%u zsZ3NAPQ+Ol3*#401Rh{*vqpKmV=m73CyXdmF+lY4R$NXMDhA2sjkEA;h>woEC0}6S z8+JL6s~o@CPR?wLuYW}tLLtc&)%?WDb&9j@Q=6$Av?T07)v(I*JBbgs83Q|0k5IPwAl z`+36hG+``erwCIl=Nv|5%L6F$w4~;gm=hr(pvw#bMp-#yxu$dAAPgbqv{P1)zn#Q5 z1}kA0I4fpJXV=tcQ7};Ph(eVGaRl@vsmj7}0JihE=NvcEnVc%gI^9`9 zw8z0NP9Hy%o`zSZvNH=fSDICfG4psNBJW+I!-u@qV|EPPVXV3ZI73Z%!U7s45uAlP{+k{JwowmOgcDUZO@3dWs zK*bGVr|oA=K#VPH!yTfWr?IS!=Z7rCLmyIAeNK_D`)L~tM-fCnClnBKssE9=m z7QI;XVX*~^typZsVmlUSZWNJK%tZ&_w$QlYSmPMWIbWnZ;gw}iYk>K=$yyG~4`Lz9 z`z>5~erDmr09#fh#iK5YAdE3+dHIH7=(@(4Mcyq3c%*E(q?8J4Z#giTx4e7`%vEST z_D7sgzk&r~(^%AUm*N0LB=w*YIBHuAS) z*T;T7{9b7P-ABJ#e0A|hO@(OZ<;?4u)oA~6wEtSuN_1#7G_({Ns?@Ah44UJdsxhx^|8 z?ytiA9|Xj=8{bY{+qb&o>E#_yuk`GH*Zs@r(w}^LCGf(M=Y`+Yw_h1~d*Y{k*XCA- zhL?wiSGGR$ZsM1TmHP1|$9VCe08@O*RPkxC7pDER7$V_a_Y0wc`*(ff{UWk*A9#V^ z<;b?RBC>RUU5Ou~693y+g_S!OAL$bQUP$yf{=oy(O_z|^;=1X!Bkhfh)Y)%#3W@EW zn_YIKdxpQB*yH?#C?p>9{Gz7^=vy`+G2ppnZ$`RJNDO*zwL6gRu7?h{9upF~T(@>O zkRGasL2t!{5x3*klf&EL;r12*%k2WZz70+HIByTIa*&m~Sp6Q?h@wDr+Y!R%2}Ep9`NrR?lnIFg6}kGvKYvF zUv|RjS3tJm4v?>hr+Rp@vnOBa$-$odaK3RIT+fN;WU>qEY-ICpb+USggEn~O$&8RM zpSd~9r*5+QYF$3?w(wU1obL$LCvA9EanVsaHRy(;HMYx+W6q69{r`4uQ1fiyVQKQ0 z|9If@<9bo5q$#y=eF+Wn42hqVd=dD)_O$<(2)+hKaOzzHHe(97885@;&GEEchRh}0 zqs><9mH}iy;&8{@awATLQ?5+TFcD)(6}-%_sjSSTHIA7p>sf`E#VVv+f_`ucUxs7V z^OvzDL!w_QK+3-`TvM+om z;9N}4!TE6M+=0VhzI%;5nESJ|9|1tD?!ol=k(qPMMjN3Q{VH}1()~z(UJPQnPR+rw zw_)HXy$8~2mQ%CYSg`;tjH^&E6jq!TNSAmvQE=BUxtj~Eo#$QWPhSY!b^9Q*F0^&S z=PDAP6APbf&1e7yUm5leM}(U`VL0r#>30Gh>t*U%i;Zvi z%qr%^@@L{>8{fRh(9MF6AN%J;1YAtnYmETJpx@}>WAHKfMWEO#1_MW6ZVs;)g;>aP zOzXPJ5YbxG#wp5O5i+i|l)hUZ15`YK-!Up9i#RBLlH-VyAu$Fk{}}5KTdw&lLI7_s zGILuC!5A?Cga~x4ZM5{^1gGRJD|4c8a?JNQPz%im9{3zyLZ-1UZiESJ z&McA1T}v0tut%{SL&(n|C1UYN$tXg9?mmq1jUv!*;M4Jan>TnzLfhLQ_U+$b;M}rhQa|(E*VK4nPFqUr6u2lf(*1d`O}n zlICBN;bk)XYqDd7?D#j*`XPyZNVeYX=zeSK-#mY<|DCwY| zz@@qsGFtSJ_U=OOwnE=_{B4L9dbSp}^cR}j3$1O1uD(K-Sm^92boBz(ErcT<_st5z zgi!E5QM5A(PGEd3MK`BC#3vT(IPE3=o?<2YwbGn7JbQD`T-9~~P#dc12koxvwC#SoJucO$_X^}*B7JE3|OMJm1 z=f1dwxH>=C%IlMM!bOMj(V}-hCkQSkIT9$iSadVegYwlel8enqA4=zEWB`Q=GBSj+ zg&Em^qD2_lh>|riGKzvVGqMHcYGq^_iq+1@4wR~sksxfa$oMLX#O42O57yEoSjqnY D%*auK literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_synchronization.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_synchronization.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d7ed5e65af2cad4714c283f0777665ecc1775b8 GIT binary patch literal 33108 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 HDem;&mtKit literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_tempfile.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_tempfile.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46b6f7f64405467263004b4d86f324d507370c06 GIT binary patch literal 28052 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 AhX4Qo literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_testing.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_testing.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba016bc14d2210e01850a5a44bf09bbdb169a347 GIT binary patch literal 3802 zcmc&1U2GgjdFF2Ser=zf#EDIvFg31~O&z-}ZCsp&s!AHmY2<{u66oTvUf+)6b@p~I zGkdY_aFInL6p1357fe-3UL8dhuRN9q1QIW2T*=mo3M7i4Z>}5(lqbG#_HJ`_46p3z zzWrvtZ)U#v{`ZfaojC%}($9L9hO&hG4F|19ix9fI2*?_-iA`NnrbS8-Pq>M4vY0Gu zMNN&9u3k7Yu@Eyc9MHsSb;BKKKX`M3$>CZgD+{c zu;&I3OiR|hk~wdcZgS5qMdwDaDFofU4C6JzNs-#5n6POvX(x(WmhAo6Svv`$>2}W6 z;GMGbwhr$!TpZ+hY8B4fcDPbObzAN=kmP#XAu z1|_}C$VtHAPj~Ms8wWAzU42DgYI;CC3CKs_+(2o%{9ek($rWPaj_O&VFpBwB5-^HS zUO~=O%&EaB-5S-1k(dtYsF4Y~(Lqa9p$v!S40EPg_U)?6O*8B;&0AH=#haO?=z#U2 z6G0b(0)lP;Mk>@KcNY$#h1x>ZD@hatJ&>`-H!e)fUh*Yp=Pgm@9=pl~ud_+tt6MIw z&t4UN4fO8MN~c_PE!!8Tn~^hnn|rrsFFW%<3i#;?#FKS{%UN(D#~(96@qEk-xCD#d z7_HR8jA=Ta6PRYbrxgmLt*N6Rk30`xl|1Sq-R!Qm-8XQ*@L{2G?BqIKAKE%~cH`99 zhVfdX_uO6W{oMAket4y~pBsf&*ESo1S9bgL^LMqMW_Mv5QffCOnnam=4v;kxU@}n8 z3JqeuRt6INE94+!uh4^LZ=NJ%h6J%;XUGFOZD?W6k&Y(=%PVn_hqII|!mepQm?~FX z4vG%AZ6pL-ssjLW8;v~=sC4Mv>yC= z`N8t~&EFjR^vLh~f7}0Q=O4b)C|qe|t~{+ElwK)F17wZVsFA3fDji}-zs-ZH@Yvkk zJEF?x<}k5i)xd1Rz!uD6CG<(%q|WIc;R3NJ&DKQE9E7!^*e9rhTaEsPTFZ zD^7C){i$xmHUAnE{1Mgy*MTeU43Ko)(8SkaMVN|;NthB!RiQTT`z}P|7!UShex|>II zcR~>K7_-=~oSLvgau19)RN0s1!_`zhOT<9f0+7rRUCd(2~_dhKfL<_C|PB~oD z+0en7Wou9G5-E6sSqwu!H9L{lH9MB}HEO>JVS(RCu=kr#UxLfNUwKmqUreAIdp?uZ zO2rqDJoolX9GRI5+{}?oR6P$|8k#2b{5UY;!xja%?5Mi}>!S9>VFdf^qvjC23V(^I z8p_il(s6t(|TMQ{QB62m+)R(GSDeKz>b&B0f;1}8TLCpQPDHuIMn z+NGzhhL(8`Tf?h>yhZ39%e5@>zvALOXcd0|yZk({mi)1c+{+%ucG<6F6xH*zm;=FV(sXa1y}c`UJs{L#QL{S_V3?x%*K zd1JP=y=nJ0LtVJ3#}8R$zFs!(XK6Gg>^g?;_J&|p@eZ-*)Pn1HJYEWgUAuv$4L z25c06cw7{O%8=?3&*NO2F2l@gQ6v0q@j4K&?U0yNcaoIS&&l9F$P0fV1AiyRzfvQ# a_bUQm_xm(UU)t@<(zocNz62dtyZr|TY><5b literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_typedattr.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/_core/__pycache__/_typedattr.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..978f15b2dddfe722363c2fe4294939f9b4074e50 GIT binary patch literal 3845 zcma)9U1%KF6~6Pc|0}J2qK%vs`#M$>uPe!FQoF5a+PYE_J9bnP+l8!UCbKhlt+8ik zHg{$v?XnKSh*rTV4Ta)Be=vP034ZBoUrHVe?SowtA`dQgX-mnQ90hFh)N}6qtR#of zfxXBN-;!h1H($?=_a-EpOlx)(Fs*;3r*_Inh zRcWYIRjd^|)ks&n+ z*O}kq4%KPPvEFJi>eenX!=IonkD1hWX+!6isgFufJ=VgT0?pDP<%eVo<$Ynz%`Cj? zdW_EMyuloLnsL^lueeS}w^?W5GHC^4%_?hHKkkFh;;sUR;=6WX5HW`ir_x89Z~FHd{5@GJ1ZcZaq5jTD6e% zqVB=lpuw~kQ&WPUk-R8alZGFdCvE*6Ccl)nzjqg4W09MY@mC~2ni0|^aq!QP3(pa9 zMefR%Qovx>XUZ`hm);%e%3Wzm@}zg4@-s1^sdVLE$)@@nC8oS8sl?C5=kF+8^0Sd% z>`A0eDyjLPq-i~~JWUHEt&_*77ST>S`>5s7hUIyH8EX09y`7$@q=U>w21o-OD5k}O zyyxrO_m(Yx5r6^2Ay!fzzE&`(X_jO8TI^m;Lm(Qq$I&N27Wp`Og9SNF6aLpU50el) z_bMNP3EvAt=fGnzG4&YZJwWI!!0>35+#8?#z_|6o+()%L<0sY&_eP(7fA+W8_2V1E zPk%BzetUTQhWGLC*Z+|HsPMPxllRK|Hp=wI=#Ap7iIcaUIJKq7PY!Jod2nbmMfU9f zyhw8W?__Rg_kWx{AVM4xOqvT62kN}*Fz`uM)6fj?XI|49uGzA2UevU=TDl#bWHilm z4NVg!1$~jh2D5GOip2M${up6D2n~nFBOC{GgNMVTHS$1KQ`v{bY-;QQfkCJvhzvMS zz9fyKJ9dJOsb&Tsr^Y#{nqp})Ybx7zGO&{~)g3!omIJ8f&D2^dxtVFFD}|uE^JyUM zELkSwo!KAikehmN6*Cs0aoO?~G1oOi>Ilnh#piktoZi$9z@cj(XrwJf-gROTOsDz@ z*cRZ#3~>ySr^xn*Yk!f^-5gP-5tW8WmGB`2HDo@{yr%1z5c~<#CEaeZIHjPJ6Cv+N zcTShN-h`Y1^=Fas*d#t7SSBeGau#h z9-)S?j*UAAg-M*mj2e2IVjbh)c|1s1_H2!$GodZk7Rv$PItHsm$r3H&1K?VyG^)q! zx`;(8VlfyHj_efxuk+lOKl{{fLP&CPmDntkfuZ$WSS6y$4yWNKUKZo_IwYzOrTI`5 znNPr0kn6b-?}4HShae?{b-wmhs(cd&Jl7kX)31+*$u7v6BiXxM)5(DrI zIY9ixk7I=Ikw{neBk&W_BD}b*U`RI+LGYRKRVX`#{01OsnXD*pkY%Z&=zrRdB;nbE ziQ6Y=Wd4gS2WFPT%t}~e!4)*>Xb^A$EHU~nTF_~HIkvY2-Aq&GdZP#X84=ovXnL^0 z8Z|%*Kw76WB8|+v`S#8?hbH083V=Had{oPZ)(ty_WHXW!nG(tg6&5W*2uDOSEmm^TXz28^};rqHa$Z*DVk7-P@wAn%b%Fwytu9f)I3_$8>Hi(zlCH}vIeFiRjr(jqmn|sr_eH$ZtJ{dW5d*sju-?=?acb>(*Hz`gR}ThlMyDZl*ZxmyFL??1Ws7yX+#IRC;c0>i7NQS$!2 z8Rd`Cj51%5`7^NBc{b|p&xd{a1a!h-*MI)}g$WvNUbq0}A%Z!w5%jRNrTEJ~gzZkaYhh&NfG37N|$W&W3sfC<66d zv^sY`mESn}{Vh^XjpA0}fef=y3^I>h$kCq4Fg7jq7W^%NrX_65O53|>y=HLCDjf4@ zkoMd7he}-K*pG(Bplv}xV=D%0iY8pdR_Jx%TH!EZGX8rIO^Yyemj{CEcfe~{@rWcokk`G4jH-W$D>dula(w>bRX$vZ{5n!8&Zx^{du ax0RNqCm!ZY5;RIMJRF;pAl_gQPWT_EhwV`S literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/_core/_asyncio_selector_thread.py b/simulador-backend/venv/Lib/site-packages/anyio/_core/_asyncio_selector_thread.py new file mode 100644 index 0000000..9f35bae --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/_core/_asyncio_selector_thread.py @@ -0,0 +1,167 @@ +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/simulador-backend/venv/Lib/site-packages/anyio/_core/_contextmanagers.py b/simulador-backend/venv/Lib/site-packages/anyio/_core/_contextmanagers.py new file mode 100644 index 0000000..302f32b --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/_core/_contextmanagers.py @@ -0,0 +1,200 @@ +from __future__ import annotations + +from abc import abstractmethod +from contextlib import AbstractAsyncContextManager, AbstractContextManager +from inspect import isasyncgen, iscoroutine, isgenerator +from types import TracebackType +from typing import Protocol, TypeVar, cast, final + +_T_co = TypeVar("_T_co", covariant=True) +_ExitT_co = TypeVar("_ExitT_co", covariant=True, bound="bool | None") + + +class _SupportsCtxMgr(Protocol[_T_co, _ExitT_co]): + def __contextmanager__(self) -> AbstractContextManager[_T_co, _ExitT_co]: ... + + +class _SupportsAsyncCtxMgr(Protocol[_T_co, _ExitT_co]): + def __asynccontextmanager__( + self, + ) -> AbstractAsyncContextManager[_T_co, _ExitT_co]: ... + + +class ContextManagerMixin: + """ + Mixin class providing context manager functionality via a generator-based + implementation. + + This class allows you to implement a context manager via :meth:`__contextmanager__` + which should return a generator. The mechanics are meant to mirror those of + :func:`@contextmanager `. + + .. note:: Classes using this mix-in are not reentrant as context managers, meaning + that once you enter it, you can't re-enter before first exiting it. + + .. seealso:: :doc:`contextmanagers` + """ + + __cm: AbstractContextManager[object, bool | None] | None = None + + @final + def __enter__(self: _SupportsCtxMgr[_T_co, bool | None]) -> _T_co: + # Needed for mypy to assume self still has the __cm member + assert isinstance(self, ContextManagerMixin) + if self.__cm is not None: + raise RuntimeError( + f"this {self.__class__.__qualname__} has already been entered" + ) + + cm = self.__contextmanager__() + if not isinstance(cm, AbstractContextManager): + if isgenerator(cm): + raise TypeError( + "__contextmanager__() returned a generator object instead of " + "a context manager. Did you forget to add the @contextmanager " + "decorator?" + ) + + raise TypeError( + f"__contextmanager__() did not return a context manager object, " + f"but {cm.__class__!r}" + ) + + if cm is self: + raise TypeError( + f"{self.__class__.__qualname__}.__contextmanager__() returned " + f"self. Did you forget to add the @contextmanager decorator and a " + f"'yield' statement?" + ) + + value = cm.__enter__() + self.__cm = cm + return value + + @final + def __exit__( + self: _SupportsCtxMgr[object, _ExitT_co], + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> _ExitT_co: + # Needed for mypy to assume self still has the __cm member + assert isinstance(self, ContextManagerMixin) + if self.__cm is None: + raise RuntimeError( + f"this {self.__class__.__qualname__} has not been entered yet" + ) + + # Prevent circular references + cm = self.__cm + del self.__cm + + return cast(_ExitT_co, cm.__exit__(exc_type, exc_val, exc_tb)) + + @abstractmethod + def __contextmanager__(self) -> AbstractContextManager[object, bool | None]: + """ + Implement your context manager logic here. + + This method **must** be decorated with + :func:`@contextmanager `. + + .. note:: Remember that the ``yield`` will raise any exception raised in the + enclosed context block, so use a ``finally:`` block to clean up resources! + + :return: a context manager object + """ + + +class AsyncContextManagerMixin: + """ + Mixin class providing async context manager functionality via a generator-based + implementation. + + This class allows you to implement a context manager via + :meth:`__asynccontextmanager__`. The mechanics are meant to mirror those of + :func:`@asynccontextmanager `. + + .. note:: Classes using this mix-in are not reentrant as context managers, meaning + that once you enter it, you can't re-enter before first exiting it. + + .. seealso:: :doc:`contextmanagers` + """ + + __cm: AbstractAsyncContextManager[object, bool | None] | None = None + + @final + async def __aenter__(self: _SupportsAsyncCtxMgr[_T_co, bool | None]) -> _T_co: + # Needed for mypy to assume self still has the __cm member + assert isinstance(self, AsyncContextManagerMixin) + if self.__cm is not None: + raise RuntimeError( + f"this {self.__class__.__qualname__} has already been entered" + ) + + cm = self.__asynccontextmanager__() + if not isinstance(cm, AbstractAsyncContextManager): + if isasyncgen(cm): + raise TypeError( + "__asynccontextmanager__() returned an async generator instead of " + "an async context manager. Did you forget to add the " + "@asynccontextmanager decorator?" + ) + elif iscoroutine(cm): + cm.close() + raise TypeError( + "__asynccontextmanager__() returned a coroutine object instead of " + "an async context manager. Did you forget to add the " + "@asynccontextmanager decorator and a 'yield' statement?" + ) + + raise TypeError( + f"__asynccontextmanager__() did not return an async context manager, " + f"but {cm.__class__!r}" + ) + + if cm is self: + raise TypeError( + f"{self.__class__.__qualname__}.__asynccontextmanager__() returned " + f"self. Did you forget to add the @asynccontextmanager decorator and a " + f"'yield' statement?" + ) + + value = await cm.__aenter__() + self.__cm = cm + return value + + @final + async def __aexit__( + self: _SupportsAsyncCtxMgr[object, _ExitT_co], + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> _ExitT_co: + assert isinstance(self, AsyncContextManagerMixin) + if self.__cm is None: + raise RuntimeError( + f"this {self.__class__.__qualname__} has not been entered yet" + ) + + # Prevent circular references + cm = self.__cm + del self.__cm + + return cast(_ExitT_co, await cm.__aexit__(exc_type, exc_val, exc_tb)) + + @abstractmethod + def __asynccontextmanager__( + self, + ) -> AbstractAsyncContextManager[object, bool | None]: + """ + Implement your async context manager logic here. + + This method **must** be decorated with + :func:`@asynccontextmanager `. + + .. note:: Remember that the ``yield`` will raise any exception raised in the + enclosed context block, so use a ``finally:`` block to clean up resources! + + :return: an async context manager object + """ diff --git a/simulador-backend/venv/Lib/site-packages/anyio/_core/_eventloop.py b/simulador-backend/venv/Lib/site-packages/anyio/_core/_eventloop.py new file mode 100644 index 0000000..59a69cc --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/_core/_eventloop.py @@ -0,0 +1,234 @@ +from __future__ import annotations + +import math +import sys +import threading +from collections.abc import Awaitable, Callable, Generator +from contextlib import contextmanager +from contextvars import Token +from importlib import import_module +from typing import TYPE_CHECKING, Any, TypeVar + +from ._exceptions import NoEventLoopError + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +sniffio: Any +try: + import sniffio +except ModuleNotFoundError: + sniffio = None + +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 + + """ + if asynclib_name := current_async_library(): + 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 asynclib_name is None: + # Since we're in control of the event loop, we can cache the name of the async + # library + token = set_current_async_library(backend) + + try: + backend_options = backend_options or {} + return async_backend.run(func, args, {}, backend_options) + finally: + reset_current_async_library(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) + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + 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_available_backends() -> tuple[str, ...]: + """ + Test for the availability of built-in backends. + + :return a tuple of the built-in backend names that were successfully imported + + .. versionadded:: 4.12 + + """ + available_backends: list[str] = [] + for backend_name in get_all_backends(): + try: + get_async_backend(backend_name) + except ImportError: + continue + + available_backends.append(backend_name) + + return tuple(available_backends) + + +def get_cancelled_exc_class() -> type[BaseException]: + """ + Return the current async library's cancellation exception class. + + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().cancelled_exception_class() + + +# +# Private API +# + + +@contextmanager +def claim_worker_thread( + backend_class: type[AsyncBackend], token: object +) -> Generator[Any, None, None]: + from ..lowlevel import EventLoopToken + + threadlocals.current_token = EventLoopToken(backend_class, token) + try: + yield + finally: + del threadlocals.current_token + + +def get_async_backend(asynclib_name: str | None = None) -> type[AsyncBackend]: + if asynclib_name is None: + asynclib_name = current_async_library() + if not asynclib_name: + raise NoEventLoopError( + f"Not currently running on any asynchronous event loop. " + f"Available async backends: {', '.join(get_all_backends())}" + ) + + # 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 + + +def current_async_library() -> str | None: + if sniffio is None: + # If sniffio is not installed, we assume we're either running asyncio or nothing + import asyncio + + try: + asyncio.get_running_loop() + return "asyncio" + except RuntimeError: + pass + else: + try: + return sniffio.current_async_library() + except sniffio.AsyncLibraryNotFoundError: + pass + + return None + + +def set_current_async_library(asynclib_name: str | None) -> Token | None: + # no-op if sniffio is not installed + if sniffio is None: + return None + + return sniffio.current_async_library_cvar.set(asynclib_name) + + +def reset_current_async_library(token: Token | None) -> None: + if token is not None: + sniffio.current_async_library_cvar.reset(token) diff --git a/simulador-backend/venv/Lib/site-packages/anyio/_core/_exceptions.py b/simulador-backend/venv/Lib/site-packages/anyio/_core/_exceptions.py new file mode 100644 index 0000000..3776bed --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/_core/_exceptions.py @@ -0,0 +1,156 @@ +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 BrokenWorkerInterpreter(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 ConnectionFailed(OSError): + """ + Raised when a connection attempt fails. + + .. note:: This class inherits from :exc:`OSError` for backwards compatibility. + """ + + +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 + + +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.""" + + +class NoEventLoopError(RuntimeError): + """ + Raised by several functions that require an event loop to be running in the current + thread when there is no running event loop. + + This is also raised by :func:`.from_thread.run` and :func:`.from_thread.run_sync` + if not calling from an AnyIO worker thread, and no ``token`` was passed. + """ + + +class RunFinishedError(RuntimeError): + """ + Raised by :func:`.from_thread.run` and :func:`.from_thread.run_sync` if the event + loop associated with the explicitly passed token has already finished. + """ + + def __init__(self) -> None: + super().__init__( + "The event loop associated with the given token has already finished" + ) diff --git a/simulador-backend/venv/Lib/site-packages/anyio/_core/_fileio.py b/simulador-backend/venv/Lib/site-packages/anyio/_core/_fileio.py new file mode 100644 index 0000000..3bb8c84 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/_core/_fileio.py @@ -0,0 +1,799 @@ +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__() + + if sys.version_info >= (3, 15): + + def __vfspath__(self) -> str: + return self._path.__vfspath__() + + 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, + preserve_metadata: bool = False, + ) -> Path: + func = partial( + self._path.copy, + follow_symlinks=follow_symlinks, + preserve_metadata=preserve_metadata, + ) + return Path(await to_thread.run_sync(func, pathlib.Path(target))) + + async def copy_into( + self, + target_dir: str | os.PathLike[str], + *, + follow_symlinks: bool = True, + preserve_metadata: bool = False, + ) -> Path: + func = partial( + self._path.copy_into, + follow_symlinks=follow_symlinks, + preserve_metadata=preserve_metadata, + ) + return Path(await to_thread.run_sync(func, pathlib.Path(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) + ) + + if sys.version_info < (3, 12): + # Python 3.11 and earlier + def glob(self, pattern: str) -> AsyncIterator[Path]: + gen = self._path.glob(pattern) + return _PathIterator(gen) + elif (3, 12) <= sys.version_info < (3, 13): + # changed in Python 3.12: + # - The case_sensitive parameter was added. + def glob( + self, + pattern: str, + *, + case_sensitive: bool | None = None, + ) -> AsyncIterator[Path]: + gen = self._path.glob(pattern, case_sensitive=case_sensitive) + return _PathIterator(gen) + elif sys.version_info >= (3, 13): + # Changed in Python 3.13: + # - The recurse_symlinks parameter was added. + # - The pattern parameter accepts a path-like object. + def glob( # type: ignore[misc] # mypy doesn't allow for differing signatures in a conditional block + self, + pattern: str | PathLike[str], + *, + case_sensitive: bool | None = None, + recurse_symlinks: bool = False, + ) -> AsyncIterator[Path]: + gen = self._path.glob( + pattern, # type: ignore[arg-type] + case_sensitive=case_sensitive, + recurse_symlinks=recurse_symlinks, + ) + 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 + ) + + if sys.version_info < (3, 15): + + 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: + # relative_to() should work with any PathLike but it doesn't + others = [pathlib.Path(other) for other in other] + return Path(self._path.relative_to(*others, 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)) + + if sys.version_info < (3, 12): + # Pre Python 3.12 + def rglob(self, pattern: str) -> AsyncIterator[Path]: + gen = self._path.rglob(pattern) + return _PathIterator(gen) + elif (3, 12) <= sys.version_info < (3, 13): + # Changed in Python 3.12: + # - The case_sensitive parameter was added. + def rglob( + self, pattern: str, *, case_sensitive: bool | None = None + ) -> AsyncIterator[Path]: + gen = self._path.rglob(pattern, case_sensitive=case_sensitive) + return _PathIterator(gen) + elif sys.version_info >= (3, 13): + # Changed in Python 3.13: + # - The recurse_symlinks parameter was added. + # - The pattern parameter accepts a path-like object. + def rglob( # type: ignore[misc] # mypy doesn't allow for differing signatures in a conditional block + self, + pattern: str | PathLike[str], + *, + case_sensitive: bool | None = None, + recurse_symlinks: bool = False, + ) -> AsyncIterator[Path]: + gen = self._path.rglob( + pattern, # type: ignore[arg-type] + case_sensitive=case_sensitive, + recurse_symlinks=recurse_symlinks, + ) + 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: + return await to_thread.run_sync( + self._path.write_text, data, encoding, errors, newline + ) + + +PathLike.register(Path) diff --git a/simulador-backend/venv/Lib/site-packages/anyio/_core/_resources.py b/simulador-backend/venv/Lib/site-packages/anyio/_core/_resources.py new file mode 100644 index 0000000..b9a5344 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/_core/_resources.py @@ -0,0 +1,18 @@ +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/simulador-backend/venv/Lib/site-packages/anyio/_core/_signals.py b/simulador-backend/venv/Lib/site-packages/anyio/_core/_signals.py new file mode 100644 index 0000000..e24c79e --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/_core/_signals.py @@ -0,0 +1,29 @@ +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 + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + .. 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/simulador-backend/venv/Lib/site-packages/anyio/_core/_sockets.py b/simulador-backend/venv/Lib/site-packages/anyio/_core/_sockets.py new file mode 100644 index 0000000..6c99b3a --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/_core/_sockets.py @@ -0,0 +1,1003 @@ +from __future__ import annotations + +import errno +import os +import socket +import ssl +import stat +import sys +from collections.abc import Awaitable +from dataclasses import dataclass +from ipaddress import IPv4Address, IPv6Address, ip_address +from os import PathLike, chmod +from socket import AddressFamily, SocketKind +from typing import TYPE_CHECKING, Any, Literal, cast, overload + +from .. import ConnectionFailed, to_thread +from ..abc import ( + ByteStreamConnectable, + ConnectedUDPSocket, + ConnectedUNIXDatagramSocket, + IPAddressType, + IPSockAddrType, + SocketListener, + SocketStream, + UDPSocket, + UNIXDatagramSocket, + UNIXSocketStream, +) +from ..streams.stapled import MultiListener +from ..streams.tls import TLSConnectable, 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, 12): + from typing import override +else: + from typing_extensions import override + +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 ConnectionFailed: if the connection 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, *_, 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 _af, addr in 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 + :raises ConnectionFailed: if the connection fails + + """ + 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 multi-listener object containing one or more socket listeners + :raises OSError: if there's an error creating a socket, or binding to one or more + interfaces failed + + """ + asynclib = get_async_backend() + backlog = min(backlog, 65536) + local_host = str(local_host) if local_host is not None else None + + def setup_raw_socket( + fam: AddressFamily, + bind_addr: tuple[str, int] | tuple[str, int, int, int], + *, + v6only: bool = True, + ) -> socket.socket: + sock = socket.socket(fam) + try: + sock.setblocking(False) + + if fam == AddressFamily.AF_INET6: + sock.setsockopt(IPPROTO_IPV6, socket.IPV6_V6ONLY, v6only) + + # For Windows, enable exclusive address use. For others, enable address + # reuse. + if sys.platform == "win32": + sock.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1) + else: + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + + if reuse_port: + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) + + # Workaround for #554 + if fam == socket.AF_INET6 and "%" in bind_addr[0]: + addr, scope_id = bind_addr[0].split("%", 1) + bind_addr = (addr, bind_addr[1], 0, int(scope_id)) + + sock.bind(bind_addr) + sock.listen(backlog) + except BaseException: + sock.close() + raise + + return sock + + # We passing type=0 on non-Windows platforms as a workaround for a 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 + gai_res = await getaddrinfo( + local_host, + local_port, + family=family, + type=socket.SOCK_STREAM if sys.platform == "win32" else 0, + flags=socket.AI_PASSIVE | socket.AI_ADDRCONFIG, + ) + + # The set comprehension is here to work around a glibc bug: + # https://sourceware.org/bugzilla/show_bug.cgi?id=14969 + sockaddrs = sorted({res for res in gai_res if res[1] == SocketKind.SOCK_STREAM}) + + # Special case for dual-stack binding on the "any" interface + if ( + local_host is None + and family == AddressFamily.AF_UNSPEC + and socket.has_dualstack_ipv6() + and any(fam == AddressFamily.AF_INET6 for fam, *_ in gai_res) + ): + raw_socket = setup_raw_socket( + AddressFamily.AF_INET6, ("::", local_port), v6only=False + ) + listener = asynclib.create_tcp_listener(raw_socket) + return MultiListener([listener]) + + errors: list[OSError] = [] + try: + for _ in range(len(sockaddrs)): + listeners: list[SocketListener] = [] + bound_ephemeral_port = local_port + try: + for fam, *_, sockaddr in sockaddrs: + sockaddr = sockaddr[0], bound_ephemeral_port, *sockaddr[2:] + raw_socket = setup_raw_socket(fam, sockaddr) + + # Store the assigned port if an ephemeral port was requested, so + # we'll bind to the same port on all interfaces + if local_port == 0 and len(gai_res) > 1: + bound_ephemeral_port = raw_socket.getsockname()[1] + + listeners.append(asynclib.create_tcp_listener(raw_socket)) + except BaseException as exc: + for listener in listeners: + await listener.aclose() + + # If an ephemeral port was requested but binding the assigned port + # failed for another interface, rotate the address list and try again + if ( + isinstance(exc, OSError) + and exc.errno == errno.EADDRINUSE + and local_port == 0 + and bound_ephemeral_port + ): + errors.append(exc) + sockaddrs.append(sockaddrs.pop(0)) + continue + + raise + + return MultiListener(listeners) + + raise OSError( + f"Could not create {len(sockaddrs)} listeners with a consistent port" + ) from ExceptionGroup("Several bind attempts failed", errors) + finally: + del errors # Prevent reference cycles + + +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) + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + .. 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 + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + 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 + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + 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 + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + 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 + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + .. 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) + + +def notify_closing(obj: FileDescriptorLike) -> None: + """ + Call this before closing a file descriptor (on Unix) or socket (on + Windows). This will cause any `wait_readable` or `wait_writable` + calls on the given object to immediately wake up and raise + `~anyio.ClosedResourceError`. + + This doesn't actually close the object – you still have to do that + yourself afterwards. Also, you want to be careful to make sure no + new tasks start waiting on the object in between when you call this + and when it's actually closed. So to close something properly, you + usually want to do these steps in order: + + 1. Explicitly mark the object as closed, so that any new attempts + to use it will abort before they start. + 2. Call `notify_closing` to wake up any already-existing users. + 3. Actually close the object. + + It's also possible to do them in a different order if that's more + convenient, *but only if* you make sure not to have any checkpoints in + between the steps. This way they all happen in a single atomic + step, so other tasks won't be able to tell what order they happened + in anyway. + + :param obj: an object with a ``.fileno()`` method or an integer handle + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + get_async_backend().notify_closing(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 + + +@dataclass +class TCPConnectable(ByteStreamConnectable): + """ + Connects to a TCP server at the given host and port. + + :param host: host name or IP address of the server + :param port: TCP port number of the server + """ + + host: str | IPv4Address | IPv6Address + port: int + + def __post_init__(self) -> None: + if self.port < 1 or self.port > 65535: + raise ValueError("TCP port number out of range") + + @override + async def connect(self) -> SocketStream: + try: + return await connect_tcp(self.host, self.port) + except OSError as exc: + raise ConnectionFailed( + f"error connecting to {self.host}:{self.port}: {exc}" + ) from exc + + +@dataclass +class UNIXConnectable(ByteStreamConnectable): + """ + Connects to a UNIX domain socket at the given path. + + :param path: the file system path of the socket + """ + + path: str | bytes | PathLike[str] | PathLike[bytes] + + @override + async def connect(self) -> UNIXSocketStream: + try: + return await connect_unix(self.path) + except OSError as exc: + raise ConnectionFailed(f"error connecting to {self.path!r}: {exc}") from exc + + +def as_connectable( + remote: ByteStreamConnectable + | tuple[str | IPv4Address | IPv6Address, int] + | str + | bytes + | PathLike[str], + /, + *, + tls: bool = False, + ssl_context: ssl.SSLContext | None = None, + tls_hostname: str | None = None, + tls_standard_compatible: bool = True, +) -> ByteStreamConnectable: + """ + Return a byte stream connectable from the given object. + + If a bytestream connectable is given, it is returned unchanged. + If a tuple of (host, port) is given, a TCP connectable is returned. + If a string or bytes path is given, a UNIX connectable is returned. + + If ``tls=True``, the connectable will be wrapped in a + :class:`~.streams.tls.TLSConnectable`. + + :param remote: a connectable, a tuple of (host, port) or a path to a UNIX socket + :param tls: if ``True``, wrap the plaintext connectable in a + :class:`~.streams.tls.TLSConnectable`, using the provided TLS settings) + :param ssl_context: if ``tls=True``, the SSLContext object to use (if not provided, + a secure default will be created) + :param tls_hostname: if ``tls=True``, host name of the server to use for checking + the server certificate (defaults to the host portion of the address for TCP + connectables) + :param tls_standard_compatible: if ``False`` and ``tls=True``, makes the TLS stream + skip the closing handshake when closing the connection, so it won't raise an + exception if the server does the same + + """ + connectable: TCPConnectable | UNIXConnectable | TLSConnectable + if isinstance(remote, ByteStreamConnectable): + return remote + elif isinstance(remote, tuple) and len(remote) == 2: + connectable = TCPConnectable(*remote) + elif isinstance(remote, (str, bytes, PathLike)): + connectable = UNIXConnectable(remote) + else: + raise TypeError(f"cannot convert {remote!r} to a connectable") + + if tls: + if not tls_hostname and isinstance(connectable, TCPConnectable): + tls_hostname = str(connectable.host) + + connectable = TLSConnectable( + connectable, + ssl_context=ssl_context, + hostname=tls_hostname, + standard_compatible=tls_standard_compatible, + ) + + return connectable diff --git a/simulador-backend/venv/Lib/site-packages/anyio/_core/_streams.py b/simulador-backend/venv/Lib/site-packages/anyio/_core/_streams.py new file mode 100644 index 0000000..2b9c7df --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/_core/_streams.py @@ -0,0 +1,52 @@ +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/simulador-backend/venv/Lib/site-packages/anyio/_core/_subprocesses.py b/simulador-backend/venv/Lib/site-packages/anyio/_core/_subprocesses.py new file mode 100644 index 0000000..9796f8b --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/_core/_subprocesses.py @@ -0,0 +1,196 @@ +from __future__ import annotations + +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, TypeAlias, cast + +from ..abc import Process +from ._eventloop import get_async_backend +from ._tasks import create_task_group + +StrOrBytesPath: TypeAlias = 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/simulador-backend/venv/Lib/site-packages/anyio/_core/_synchronization.py b/simulador-backend/venv/Lib/site-packages/anyio/_core/_synchronization.py new file mode 100644 index 0000000..9c6f9a0 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/_core/_synchronization.py @@ -0,0 +1,757 @@ +from __future__ import annotations + +import math +from collections import deque +from collections.abc import Callable +from dataclasses import dataclass +from types import TracebackType +from typing import TypeVar + +from ..lowlevel import checkpoint_if_cancelled +from ._eventloop import get_async_backend +from ._exceptions import BusyResourceError, NoEventLoopError +from ._tasks import CancelScope +from ._testing import TaskInfo, get_current_task + +T = TypeVar("T") + + +@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 NoEventLoopError: + 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 NoEventLoopError: + 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_if_cancelled() + self._check_acquired() + event = Event() + self._waiters.append(event) + self.release() + try: + await event.wait() + except BaseException: + if not event.is_set(): + self._waiters.remove(event) + elif self._waiters: + # This task was notified by could not act on it, so pass + # it on to the next task + self._waiters.popleft().set() + + raise + finally: + with CancelScope(shield=True): + await self.acquire() + + async def wait_for(self, predicate: Callable[[], T]) -> T: + """ + Wait until a predicate becomes true. + + :param predicate: a callable that returns a truthy value when the condition is + met + :return: the result of the predicate + + .. versionadded:: 4.11.0 + + """ + while not (result := predicate()): + await self.wait() + + return result + + 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 NoEventLoopError: + 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 NoEventLoopError: + 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, + ) -> 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. + .. versionchanged:: 4.12 + The value can now be set to 0. + + """ + 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, + ) -> 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/simulador-backend/venv/Lib/site-packages/anyio/_core/_tasks.py b/simulador-backend/venv/Lib/site-packages/anyio/_core/_tasks.py new file mode 100644 index 0000000..0688bfe --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/_core/_tasks.py @@ -0,0 +1,173 @@ +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 + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + """ + + 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, reason: str | None = None) -> None: + """ + Cancel this scope immediately. + + :param reason: a message describing the reason for the cancellation + + """ + 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`\\] + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + 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 + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + 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 + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().current_effective_deadline() + + +def create_task_group() -> TaskGroup: + """ + Create a task group. + + :return: a task group + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().create_task_group() diff --git a/simulador-backend/venv/Lib/site-packages/anyio/_core/_tempfile.py b/simulador-backend/venv/Lib/site-packages/anyio/_core/_tempfile.py new file mode 100644 index 0000000..75a09f7 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/_core/_tempfile.py @@ -0,0 +1,613 @@ +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 + :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, + "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/simulador-backend/venv/Lib/site-packages/anyio/_core/_testing.py b/simulador-backend/venv/Lib/site-packages/anyio/_core/_testing.py new file mode 100644 index 0000000..369e65c --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/_core/_testing.py @@ -0,0 +1,82 @@ +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 + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + 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 + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + 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/simulador-backend/venv/Lib/site-packages/anyio/_core/_typedattr.py b/simulador-backend/venv/Lib/site-packages/anyio/_core/_typedattr.py new file mode 100644 index 0000000..f358a44 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/_core/_typedattr.py @@ -0,0 +1,81 @@ +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/simulador-backend/venv/Lib/site-packages/anyio/abc/__init__.py b/simulador-backend/venv/Lib/site-packages/anyio/abc/__init__.py new file mode 100644 index 0000000..d560ce3 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/abc/__init__.py @@ -0,0 +1,58 @@ +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 AnyByteStreamConnectable as AnyByteStreamConnectable +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 ByteStreamConnectable as ByteStreamConnectable +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 ObjectStreamConnectable as ObjectStreamConnectable +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/simulador-backend/venv/Lib/site-packages/anyio/abc/__pycache__/__init__.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/abc/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ddb6ff904accb48606afcebc079550db02074ee7 GIT binary patch literal 2375 zcmZvd%THTJ6voGZ-)}JHX)q5125bl+kA^4>kA@JT#0sRUrmn88eJ60qeOPm^iA*8`3SvP%?ImAdLVV;gW1OMLw1J9B2nGiS!XM57@B zpQCS*N0-8c{DqD7$JYeU+poI_`Hm<=@n}T%P>+WwT}rpsrFYYA!97}!?xkMAUd^Zb zsb8=UI6wn}{lGyQ6dV8!(U9OEaF~V#hkzqAA~*~jrBT5V;24bwjsnMNTyP9HK@)=G zz)6}EoB-~ny@HckpPr&A!M(u!v|n%^aGItCr+^3OfZ%@MK{_Zn4Ln4L1P=fY(_z7b zz$0`-@DT7Q9ThwboS_-PBfw*HOz6wg+N?fD=LF}pygpCo1+M-^d1>iX)uNCzrx}-1D zW&HxZps&ys{UW_6V)NRneu-WZyr5myuh1(V(nZ)+`1|O2t2U16?IJn*-;O=^G`%hI z#S|fQ4f3wDHDysLJnwEsj=nt0YLilI=UJYo8FquMNguakPjfxw^R>oOe)$zzd5;s8 z4a2l$TQv>q70w4R}{`HYrj#$QDQqH7tNLvZ+2d{ZLU`8w&>Kfc2&z}2IG(x zX*zp0XR;3MD6FA`YqeXW1kW!j{oveMI=c0qkDRVDf$lpqq}GkbM#E~!X2 z%in`-IyIwhv%S8-4x_b4az(>$HwLi>24|Xz#)sw@d9O#uYyqG@-G9%*^)@dwVgJ7>t8ZN!JiAAYw($4u$>qU|~T zC2m%s>|nox`?B?Do166-G(y0ns=8`3 z?gU}Qii&r|@qTj54BP41h3a>LdrX&WhbG4}4R6Xum1%obvsvXE8gx;OgObT@S#v^? zq?<}zW0K^MlaOpQRI?~os>Qqcn;3jpx9c2&9IrSS4Cm2Iv&Owm18$JGhZe`56(=BB z;sRRS4^19G38LW75r@@2#CBP{54{vhKS~;90A&zm2xS;$ z1Z5N@gEEFPj*>;0K$%2=my7UelpKf?m8^QD);thq@fq}dk_{(e@mcIOhfYAU;WS{= zcpjT+sS0~rl<-+PsH?CI7Ll zYvntp#j=|+*O`$mG0sl1+oo|MYwV;9_1A#=VwNpcuWPbm@$8d@B0i77nBrU9#npd6(RD3G{?q2<^M%u1GJ4 z5DZoPH{kPh{XA?NzA?p5O0KU!*}@~>4>ko literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/abc/__pycache__/_eventloop.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/abc/__pycache__/_eventloop.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46342b24fb84220161d1ac78e0a07c3995518376 GIT binary patch literal 16536 zcmdrzZEPIJb$g$@PktOJQq%{v5-EvCk<^DJOQJt%$&zKsvTRXFycBa>-Ym(Jc5ms~ zJ<~iJt-tb7G)3&DjUB)(k``^ODnSyoMVuB*jiN|D+z-oYV08=C3KAgopW-aFaU!%p z-<#Rp+r3-Tv}&M0Pt@DFd2imldGF1eH?wnZX0s^)KIgvJaqcsDLHIF#aXv9#2;F!) zBnU4HX9OaUkSb^)DHOtTSPe^I_KZjoct+Hy7L#IHT#7S%RBh1`QbJ2gNi8L%w6v6F z^)WT0Wu+`D$JJJ?O=@H17PVdLkUCg7q2{zssZ;Bcy0n~>V|7V&jn*x7YdunrwpLoJ z^-8_kI%%D@URoa#l*qXQj^OntNu56{2s8=OrJ?mkX`|LB^@W6Tg4JxQ*C;*oFw|vK zQQItShW@goRo$ZXOa0n_G@xyjwrbm?ZLGdc-L4HvgRI=H=CvVd2+AEKr|!^(rD1JE z8qr3jQEjKRQ`;r&(soO`wLQ`v?KbH)M%StC)%HpISh-8RUE441XXQ2O0qvl4FeHQp zWgY3h2wKOFGzQ-{k{`OnE^ro(EZSM@p)4STTyUv;ady3EvB2lc?2pNCu*kxpbnW zl|Thn?EWW|vS~$6fM8bgw4%ui^E$;5r4PxV0QGcHU%;=43E4P*tURl~hepjOtQ_d0 ztQ1X!oH=}okI`CRuRD3{Q-@_!o};p6BU_I#GSm(VZng6I6D7k`${lB=kb`B5x!( zPbr4|!m(NoN4JHHc$v@2ij0DUm~@>xGyzQs*gkGk#-a zO#r_hho8fP@jgtt18CO<(%w&c0%&`KXq`UD5wbR*%{nIMQPLZLThIBC2OJ*!Nsd7f zZXWRl#_2(_K7i9khC5C+1mOB?+{OUhCN6=$fBZ&HkiGzV5$HF2smViRQvltTCc2YE zT!zj!v&q9`^Kx`#i~XA8#fq$+s<&uNj?BK$Z!*6C;*pdxHDu&0B(rkK0$^9a61_8lVl_SH_ULKBBKGg z5yUwfB9D=s0W_nmy+n2e;CA}jPm)vt&;IZa2eCk=p`rdl+tv>+Wv zE4WzHVX-qyWksB=l#7@LiKVhA!yjfl^HeYE6+={Tu@_ZcUl>ifj3$6du|g@L%z0RR ziKtZ!Q-p*{oKZws#i}Kd!U9?<&mqr1He(Aito5w>F;NZ>$nDUklwt856Bl%&gyPDo z2o)6#q%cHN7pJFjAk)*0tF~uU2)I~izRd3tr(+PhJr6F)LD34J(Sn zwxT#lE6xXNwb;TN=pfAeH|GwIoqbR@6!DNuK{)Z0LY1m`R4-R$RjHnZOlS#mGySYl z(kiM>>@2vz6K7A9W&mX>BbYKmI%}Mj%S$DFr#w^KSzzX6PO`9MML-YLcCVX` zLd|U;$PLUXpA~KZ6pD7Hk7f30aNX(;+_6IX1!_V!(r3h_NSuD=BK4 zi{e(Dq0ynxVzlR<<%WN}_06&0f{#1MOKz_1OEJtyWtFYu?#&cbAZwLo2B&TPmU z#BNZT9k$1C13Wej9E;}{ba0PCX|~|@JI(q9!OE_8Dp5$G&R}}frCmnp zsXB4B$FF5q3>j2*1GZJdzX?BoR`>;5?w$)rL%xXt(S$4bv#x@l7S1)s9Kbn=xQQlV zpL4i=Hhj{;`9UydFYvIpc3uL9$MbMj^c3{`CP zHLX28xQXX*4=Oery3vA*C0Kx%y3nUr^pKf~2`dkf;{wfH#p4>TOc3s1^|oCIC(SH2 z@br5U&I8stbJ=yD0)fyAE~i*g4ferSq*R`zM?gPKaiFJeU7s&i2bM9lkLoO?)Tu+S1$U16OiuULJjE^m1;?JDDw)GFxg9A#?Cb zX3I^Z71};``*t;F<~*poF`Vj<{E08&2}{T zN0{-<0WkIRh6Uy~`oe-v%}N;#d2q>t`9Cajmw^K?a2;kf3@O~tTrpPVw!>njtipK` zOMOHqM7Wa~LW0Y00#07yJZw-@4IayN7GYsG6+7+}3_M%1Vuq?H3r+5|jt8fp$Wz_! z_poI{)FSk2+zr5Sveu4wvICd01Fs!^D?9MR>~3_g{7d;)#=kWDPNwgzOy36)p>@w& zfXMXy+$sN;F#s%{>l}}Vesj%O_7u7 zGY;>j8slb6HB+4EY+le$$RC$T#oet43u95bF z?smnabUw_I7c0h^87QU5lNkC4l&d+PZkcUh6aqbp-~j+fz>oYE z8yCoy?2aR>V|oS|VKW2g8RS?jgQBP4OI7rB9^frs0IC}pv>|4sgk*MANtFBu%x_l> zo;;(h$S~(j(HV^>YdUUm?9Bl8K!~B>rk)j6w2k9(^jgkq9y=v<>0qqlhzNTl%*pJu zYnJL7v-Aq-TLXjXX^6?wurpx`1%=$$fY4qa1el(O^QLwq-iEHjvGE10QEu}wYQll- zm^cfE&~?uZUi9gMXvc;L%6FHA=0)a9K)lLiSfHOoV$8prVnv7TDVS9i*pgfA3-Y8o z{%gR-@uT>v{Ai{AGj{*XhK(sP4|xpr`zSn1Bz?KRlgRj{O?|k|jLpo-hFOq{k5@|I zwVsJMPd5g1D@fRiz)t^G=btU?aY*51I8@2%gF83bI#dr+79l2okV|B2aE zY+QGtZcvx)LXNaRz&^`Z(}`v++=Kmdv)_Qzp#?{b!h)`=un#Xm)H5LwtiU)H%hg>z zJ+7j~`ykIUZnv5_Ye&22yl%joQp~QcEW}fYE;4`9+hF}PoTK2I(SliAXpF{n%+Ek5 z&s@Z0CP0y^k%9si_A7oz&OzVQT!FF&B=&@ngwVIycDauzJpD2V z=if?j`SQ{qk%97I|scXn0YX8eaLIh z!FmL7qy*-xlG66Y1Uf$U%f<3}Ac|Cm zV=EjOmS&gWoE%=#mFKGKeY4w-#4WaGjs2*jZ4TXwRIV=>PJHo)?jVv+EI;F~Y5|6*P?c?g$?S*LM1^uJo-n!!}0flmLJCF*Y+dqAHJS@bGe zm?)*YJl*n+vCnzsK$KazqC%F;-u62C>*@~Q~IW(`Jw`6?6m5SJ3%DRpeUb$oiL;FYbhD)s4qkchg&91sQb@Jm=MBL`FQF*G z3+)Qao$UqmAkg?cAZMqoa1)g41nlpR_{{`g_Gu%ZVrLaMcRLq~Cnx#k+)3xo>D1J) z=w3XYbnc{1O|dhfn?0}xR+Z*9Z0CNnm6VF+BrF8LqP#T420;G?Mq$PIfioS2FEG5n zWp(_Ph4U41M>xZ^zg0Uit(?41HkA9FH||poW%Q(8Rv`bJ050_J5FkJL_W<&7eu&R% z@g(1h&cIHc6NpH_JEy~*@`|lz{-_CvXNk3+aE&=_`F0QU)4^N^)IHFduze@<7 za!YvhLvsk2csrm3%KRmGR5NgpGHKtSp5kbUjV+*Z8k> zJH0dh+kpW1e-7!=&=!z0c*B~rAL3Yir9;~gur}MUHpMq5S**og=w$@I?v~hl1J{eH zeePv(=;2V)y>#%`m$519x!%0~YD$(8iH8!me$6B)yPEAeaLws)=r@w>Z zY(>x@Seu6>^fU!d#NM5(Lt17R7Kfs=!Fg7Sv183athqrpEOnPjV)^Ba^&`?n*Y8JpQ=6oQwlIoC!Lur42iZ8&NJS1lIw zxi&_y!9FWdDB$+DP_R;kf~LdWAuMMKg~uzhYGcyu))W6Z42>b1I}qH9;64P05gbAA z5Q0Y$Jc8gjf)fZ%A$SnMB!W*PkP#>d<`Jj}bOZ*1ClEZ1;Fl4+fZ+28ehtAF5&Q;% zH3;wkhkg~o?;`j*f(r;PBKRhPZz1>&f5gNylb@U_4#KR= z^?EoN>*rEnsn!kjShvZo+r;XaWXtz{ZOgW=4}NX%^?mP0BC+h1b(?DJx%U8jUQ2de zk3qdxI`|4&v4uguZ{ zv6K>e*4Ge+#_GJDg_2itMC3kPI$+a3cx7mmak|#Jm-oV*16d@54WiRuZqV%yoZ}Yz z1INiSCxoZ%gjh-l?cKE`mQv_?X()L|g9zKbYMcW|ij`baEPWIXNsysqtQLbOwi~D= zv6K=zw${>E%3vvrrBKxe$TQ$Q*BZJ70V7BzHAn#$2v%Gk@+m zYP;T=m0fRn*4M+ghO33afY;hLItE`mQfuJ`?;UjvzNXhT_}~f#&(^}>*yby}FrDx@ zx`#clCD&h%!FNSAq%>^4JJMh{|}p=-$jY%}C6c@&7|RZq&|RTTkEsE5+dD zot^XP>9hIlzg0dTlTP1{f~b65#+4X<#R*x8%+i(oIA%1n75M1@WHdB_OE#t>up?PA ztO)#Ufkv?o^BJqHsH-YohK3&lk0L6LC|K78nm~|5q7)n<;?H^2(hN;uMOZgz8VhlL z_`|cfHf)eZ(8_SIVTL0T+Kx3H2yzHI5p*HI{Kd+^k&ywt!#xeSDz+Bud$GQQw}v;` z@QYU@Fsx(&x8Mfc^QM^FTHOWsnTRsVu6f|Ec1l%t>5pQ1NpTBJ`w-wR81gz!%g$@4 zh*hml6`Wn5oR~;LR>w2obG=nab?4%uWtRy@z(~wecOeROB?pT kKKRDI@9n&_;n*{+FD5Sw$NnQe7Yk)y`Q*<8d@>*YADL7CPXGV_ literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/abc/__pycache__/_resources.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/abc/__pycache__/_resources.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47fcf65588fc7b9c31a63f52a9cb19735baaf945 GIT binary patch literal 1647 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 literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee1e96b4d8a07b4fabb8c43ae514a05a67ff755a GIT binary patch literal 3255 zcmcIn-H#MS5bxfd{r-UCASyAWLnN{hhG0T88>1XT)|2zNa2U+y;_U29-`&7`tlhJB z?!*_A2j6_;Zy>}s{|ldd(@BUXN+NFytBLw#)y(YN>~VZtjPp=iT~*yx_3P^D-tQZY zDuM6DH*+`U%Y^)jgXvd@89M0#bBCD3q&9JAmr~?&cFxIn^AVr76{pZG0I!$@yXcg< zrHC)uWv9}uIMr^Ik{sy}vvix7WnQ|MkJs+jMwM3eAr4wJtm&@n`MPg;u7qJz?@M3k zhVO8H(=$O*TD3M@-Ifn&JfX25N3L;|OK&I)-pYk@7e+q6$_;L9@l{`N-3gm0TIH@8 zkB!)IOqKYDPJRRC4&kIrP14Pow43LOSvPaHm3xVOw*Zocna@aykwnQzN+4;Pg^Z-k zE73~D9a*|!HPRgbOj0kYt`_MIn&mxo^+-2oR`$>}5?yr4@K^@LX>w*%lWPpl9AXYa6yMWxFSb{XuN5u6P6P_EZC*pME)Dz9NK9>cCtk6fhjo zZ}Z!jy3K<%NPEN$-&>QGGqiQn6Q}#S zaT5w-ZHv2GYfDxiR6ajF0I9yg<(lq}EboloH_m7~IB=;BMxn9|IR*6uN)<;92tpQt z{7(M5MgEppTVLiBIs+KU2$VjZpccUbpeAWf*SK&jSNFNhrhJNRz#-u4L)#uPYn=@| zDXqTEGtgae*>%e`y={34W?GUNx@}9=>!m9uk)CYzdTQzqrmb9AUHpW}k@UGUoh$(p zoV>c&xpwL5N4*~Ny=*`k$EwOC=WrsucAK^FoIY7Isy|JumwH|n2$yIAiFZ#N1U9Us zror44+f;M}EGAfSx5xx2c`mR&r0y9mU@q>?7daX3nxQJRgaR5>ai?Nx+R2hrwsg`jc%ug#S zBYXplGcaX)8^X04reoJK{cG{!uHK|RrK1{W$Dai68f$V^(qHdINvaG%3@U-n#{Z4XaLry56q%{e$U&1y&1-d}QOF(q^mW(Ng~=>;F!Wy#<%0B0%MBXSh@#%##%0S2Lh_0dwqD`<^x!$>S% z2QD!Qs$kB(V3A=wD>yRy{Mw~``HA=1)Zjo^)-+dlxTb|wO>;bRXd_?Ow9kgRooGs$ zW_pIE3A|6m9Fln?FCjS!BrFdEJY0l760f4{7!ro$IFi?pL{|~E$*5_F8gfYRWh@^6 zxlMjj-utC6|2S7D)F*jTJUm8j+yw4%uAIt%8y|kEtd!aTH$Fs)%^z_|S~wjoiKIDJ zU^p&LbxJZN(ZO(BpXzAgJe{3*p6<+~g@s+(g&A!pqkRNUJ2bi|qP&+|b%cC<2+uKq zTtF8jVIJN=G0N%wgONy{-cpp%sI0{&Sqk_sK|}>f1m`ToVfmeSKi?H+!34Xm#GM%D jDW&(x@dxDCeRA{xIq@@j>yP3kN;~vx=T8zbQJDV%(_<}? literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/abc/__pycache__/_tasks.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/abc/__pycache__/_tasks.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c89012c7d78995b639424e0fdb9e5f56ba49552a GIT binary patch literal 5154 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 literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/abc/__pycache__/_testing.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/abc/__pycache__/_testing.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab574e2ea9817324f3a78d55f8604cad0e57dcfd GIT binary patch literal 2850 zcmd5;&2Q9J5P$ZrcWtjX5C~AB(mbJ-Xxp$HDz#OFszQnosEtq?Rh5&-dTYNV3;x(X zdqZ}`fvP!h>!lJs_lD?y(p!5$ma0&3>TO|B51cyl?A@$GigK)XHE%pKZ#?sxc^>~( zubTv}+dodw#e#foYpkuKBgVvaO(Q*A=1?UiT`GmFx-jluE7>uewV-otJ+#9+z_Yv7Xv6 z|Hhk!lGa!lMhQ#WQ5Y{b)Ue81yVd)fW#fe~U67Xaz@*3rI>Pp-T-RnH$f+dki z^(E%}tmX66Sc*i{P1+$(^&1JOK?uG|SHfOeUFmiBH%z3ev*KnEWHb*)8U6(K4+$r> z;t@z*u}hxrsk@Lq*9=npd4^ZoEkDlv*p;G%XL{ucZS{b*=4lgJ{eaf;Did0xS8dc& zbA`vrSKSa&?hBK`buDyRC+_+z;W1@YfUX^GQohZ@g!)m`Y0_)kT=b|5;Lw11oF-cU z&gK@Z?U+Wb+uTj)-8N{uF)F$A8?%5Ns7m154=HB62I1XgYh2!*R_CacnrPB~h482e8 zlPAYcKBx_WC2kq%#3l1V;X~3R;y5q@H#W-R1T3k}cU&id{zwnNa1XBLw6C2Jd#k9;AuO!p9b#}ZrZmz)OoPyrR2|2QT*ndko)-9hBxaG!AvuraJtR07WJk+4jVzcXHIT=@1KB0d)sm(UO+}j- zR7hoJplaIe(-R8=4OWnxxG<<9r<3Uq1_p8_F;Bgy0XHm-><3elt7+EL)0YPttgv%> zZcs%|C+6uF25`AO%4XkeZyj#0Yu1yqpAAa5-uzasPmTHu4eq7y=PGbny0SHu)PN5$ z=K3s-8^;mNjV_KJfDK>3sfIlprzM!v0%xPdF+Ju+z7OLbzwVl-!fywGV_E1(3?OL* zw!(Z6_{}O1P1yk%z(vqg{c={rPsN8|haVjA0+2yTQItQ)`Deu1BlCOY#vkOy9+~?~ YvmUJcuzp{CS@}q@e*X9$0*lP)U#OAv6951J literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/abc/_eventloop.py b/simulador-backend/venv/Lib/site-packages/anyio/abc/_eventloop.py new file mode 100644 index 0000000..ae06288 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/abc/_eventloop.py @@ -0,0 +1,409 @@ +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, + TypeAlias, + TypeVar, + overload, +) + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +if TYPE_CHECKING: + from _typeshed import FileDescriptorLike + + from .._core._synchronization import CapacityLimiter, Event, Lock, Semaphore + from .._core._tasks import CancelScope + from .._core._testing import TaskInfo + 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 = 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 an object that allows other threads to run code inside the event loop. + + :return: a token object, specific to the event loop running in the current + thread + """ + + @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 + 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: FileDescriptorLike) -> None: + pass + + @classmethod + @abstractmethod + async def wait_writable(cls, obj: FileDescriptorLike) -> None: + pass + + @classmethod + @abstractmethod + def notify_closing(cls, obj: FileDescriptorLike) -> None: + pass + + @classmethod + @abstractmethod + async def wrap_listener_socket(cls, sock: socket) -> SocketListener: + pass + + @classmethod + @abstractmethod + async def wrap_stream_socket(cls, sock: socket) -> SocketStream: + pass + + @classmethod + @abstractmethod + async def wrap_unix_stream_socket(cls, sock: socket) -> UNIXSocketStream: + pass + + @classmethod + @abstractmethod + async def wrap_udp_socket(cls, sock: socket) -> UDPSocket: + pass + + @classmethod + @abstractmethod + async def wrap_connected_udp_socket(cls, sock: socket) -> ConnectedUDPSocket: + pass + + @classmethod + @abstractmethod + async def wrap_unix_datagram_socket(cls, sock: socket) -> UNIXDatagramSocket: + pass + + @classmethod + @abstractmethod + async def wrap_connected_unix_datagram_socket( + cls, sock: socket + ) -> ConnectedUNIXDatagramSocket: + 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/simulador-backend/venv/Lib/site-packages/anyio/abc/_resources.py b/simulador-backend/venv/Lib/site-packages/anyio/abc/_resources.py new file mode 100644 index 0000000..10df115 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/abc/_resources.py @@ -0,0 +1,33 @@ +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/simulador-backend/venv/Lib/site-packages/anyio/abc/_sockets.py b/simulador-backend/venv/Lib/site-packages/anyio/abc/_sockets.py new file mode 100644 index 0000000..feb26bd --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/abc/_sockets.py @@ -0,0 +1,399 @@ +from __future__ import annotations + +import errno +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 typing import Any, TypeAlias, TypeVar + +from .._core._eventloop import get_async_backend +from .._core._typedattr import ( + TypedAttributeProvider, + TypedAttributeSet, + typed_attribute, +) +from ._streams import ByteStream, Listener, UnreliableObjectStream +from ._tasks import TaskGroup + +IPAddressType: TypeAlias = str | IPv4Address | IPv6Address +IPSockAddrType: TypeAlias = tuple[str, int] +SockAddrType: TypeAlias = IPSockAddrType | str +UDPPacketType: TypeAlias = tuple[bytes, IPSockAddrType] +UNIXDatagramPacketType: TypeAlias = tuple[bytes, str] +T_Retval = TypeVar("T_Retval") + + +def _validate_socket( + sock_or_fd: socket.socket | int, + sock_type: socket.SocketKind, + addr_family: socket.AddressFamily = socket.AF_UNSPEC, + *, + require_connected: bool = False, + require_bound: bool = False, +) -> socket.socket: + if isinstance(sock_or_fd, int): + try: + sock = socket.socket(fileno=sock_or_fd) + except OSError as exc: + if exc.errno == errno.ENOTSOCK: + raise ValueError( + "the file descriptor does not refer to a socket" + ) from exc + elif require_connected: + raise ValueError("the socket must be connected") from exc + elif require_bound: + raise ValueError("the socket must be bound to a local address") from exc + else: + raise + elif isinstance(sock_or_fd, socket.socket): + sock = sock_or_fd + else: + raise TypeError( + f"expected an int or socket, got {type(sock_or_fd).__qualname__} instead" + ) + + try: + if require_connected: + try: + sock.getpeername() + except OSError as exc: + raise ValueError("the socket must be connected") from exc + + if require_bound: + try: + if sock.family in (socket.AF_INET, socket.AF_INET6): + bound_addr = sock.getsockname()[1] + else: + bound_addr = sock.getsockname() + except OSError: + bound_addr = None + + if not bound_addr: + raise ValueError("the socket must be bound to a local address") + + if addr_family != socket.AF_UNSPEC and sock.family != addr_family: + raise ValueError( + f"address family mismatch: expected {addr_family.name}, got " + f"{sock.family.name}" + ) + + if sock.type != sock_type: + raise ValueError( + f"socket type mismatch: expected {sock_type.name}, got {sock.type.name}" + ) + except BaseException: + # Avoid ResourceWarning from the locally constructed socket object + if isinstance(sock_or_fd, int): + sock.detach() + + raise + + sock.setblocking(False) + return sock + + +class SocketAttribute(TypedAttributeSet): + """ + .. attribute:: family + :type: socket.AddressFamily + + the address family of the underlying socket + + .. attribute:: local_address + :type: tuple[str, int] | str + + the local address the underlying socket is connected to + + .. attribute:: local_port + :type: int + + for IP based sockets, the local port the underlying socket is bound to + + .. attribute:: raw_socket + :type: socket.socket + + the underlying stdlib socket object + + .. attribute:: remote_address + :type: tuple[str, int] | str + + the remote address the underlying socket is connected to + + .. attribute:: remote_port + :type: int + + for IP based sockets, the remote port the underlying socket is connected to + """ + + family: AddressFamily = typed_attribute() + local_address: SockAddrType = typed_attribute() + local_port: int = typed_attribute() + raw_socket: socket.socket = typed_attribute() + remote_address: SockAddrType = typed_attribute() + 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`. + """ + + @classmethod + async def from_socket(cls, sock_or_fd: socket.socket | int) -> SocketStream: + """ + Wrap an existing socket object or file descriptor as a socket stream. + + The newly created socket wrapper takes ownership of the socket being passed in. + The existing socket must already be connected. + + :param sock_or_fd: a socket object or file descriptor + :return: a socket stream + + """ + sock = _validate_socket(sock_or_fd, socket.SOCK_STREAM, require_connected=True) + return await get_async_backend().wrap_stream_socket(sock) + + +class UNIXSocketStream(SocketStream): + @classmethod + async def from_socket(cls, sock_or_fd: socket.socket | int) -> UNIXSocketStream: + """ + Wrap an existing socket object or file descriptor as a UNIX socket stream. + + The newly created socket wrapper takes ownership of the socket being passed in. + The existing socket must already be connected. + + :param sock_or_fd: a socket object or file descriptor + :return: a UNIX socket stream + + """ + sock = _validate_socket( + sock_or_fd, socket.SOCK_STREAM, socket.AF_UNIX, require_connected=True + ) + return await get_async_backend().wrap_unix_stream_socket(sock) + + @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`. + """ + + @classmethod + async def from_socket( + cls, + sock_or_fd: socket.socket | int, + ) -> SocketListener: + """ + Wrap an existing socket object or file descriptor as a socket listener. + + The newly created listener takes ownership of the socket being passed in. + + :param sock_or_fd: a socket object or file descriptor + :return: a socket listener + + """ + sock = _validate_socket(sock_or_fd, socket.SOCK_STREAM, require_bound=True) + return await get_async_backend().wrap_listener_socket(sock) + + @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`. + """ + + @classmethod + async def from_socket(cls, sock_or_fd: socket.socket | int) -> UDPSocket: + """ + Wrap an existing socket object or file descriptor as a UDP socket. + + The newly created socket wrapper takes ownership of the socket being passed in. + The existing socket must be bound to a local address. + + :param sock_or_fd: a socket object or file descriptor + :return: a UDP socket + + """ + sock = _validate_socket(sock_or_fd, socket.SOCK_DGRAM, require_bound=True) + return await get_async_backend().wrap_udp_socket(sock) + + 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`. + """ + + @classmethod + async def from_socket(cls, sock_or_fd: socket.socket | int) -> ConnectedUDPSocket: + """ + Wrap an existing socket object or file descriptor as a connected UDP socket. + + The newly created socket wrapper takes ownership of the socket being passed in. + The existing socket must already be connected. + + :param sock_or_fd: a socket object or file descriptor + :return: a connected UDP socket + + """ + sock = _validate_socket( + sock_or_fd, + socket.SOCK_DGRAM, + require_connected=True, + ) + return await get_async_backend().wrap_connected_udp_socket(sock) + + +class UNIXDatagramSocket( + UnreliableObjectStream[UNIXDatagramPacketType], _SocketProvider +): + """ + Represents an unconnected Unix datagram socket. + + Supports all relevant extra attributes from :class:`~SocketAttribute`. + """ + + @classmethod + async def from_socket( + cls, + sock_or_fd: socket.socket | int, + ) -> UNIXDatagramSocket: + """ + Wrap an existing socket object or file descriptor as a UNIX datagram + socket. + + The newly created socket wrapper takes ownership of the socket being passed in. + + :param sock_or_fd: a socket object or file descriptor + :return: a UNIX datagram socket + + """ + sock = _validate_socket(sock_or_fd, socket.SOCK_DGRAM, socket.AF_UNIX) + return await get_async_backend().wrap_unix_datagram_socket(sock) + + 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`. + """ + + @classmethod + async def from_socket( + cls, + sock_or_fd: socket.socket | int, + ) -> ConnectedUNIXDatagramSocket: + """ + Wrap an existing socket object or file descriptor as a connected UNIX datagram + socket. + + The newly created socket wrapper takes ownership of the socket being passed in. + The existing socket must already be connected. + + :param sock_or_fd: a socket object or file descriptor + :return: a connected UNIX datagram socket + + """ + sock = _validate_socket( + sock_or_fd, socket.SOCK_DGRAM, socket.AF_UNIX, require_connected=True + ) + return await get_async_backend().wrap_connected_unix_datagram_socket(sock) diff --git a/simulador-backend/venv/Lib/site-packages/anyio/abc/_streams.py b/simulador-backend/venv/Lib/site-packages/anyio/abc/_streams.py new file mode 100644 index 0000000..186e3f5 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/abc/_streams.py @@ -0,0 +1,233 @@ +from __future__ import annotations + +from abc import ABCMeta, abstractmethod +from collections.abc import Callable +from typing import Any, Generic, TypeAlias, TypeVar + +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 from None + + @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 from None + + @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: TypeAlias = ( + UnreliableObjectReceiveStream[bytes] | ByteReceiveStream +) +#: Type alias for all unreliable bytes-oriented send streams. +AnyUnreliableByteSendStream: TypeAlias = ( + UnreliableObjectSendStream[bytes] | ByteSendStream +) +#: Type alias for all unreliable bytes-oriented streams. +AnyUnreliableByteStream: TypeAlias = UnreliableObjectStream[bytes] | ByteStream +#: Type alias for all bytes-oriented receive streams. +AnyByteReceiveStream: TypeAlias = ObjectReceiveStream[bytes] | ByteReceiveStream +#: Type alias for all bytes-oriented send streams. +AnyByteSendStream: TypeAlias = ObjectSendStream[bytes] | ByteSendStream +#: Type alias for all bytes-oriented streams. +AnyByteStream: TypeAlias = 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) + """ + + +class ObjectStreamConnectable(Generic[T_co], metaclass=ABCMeta): + @abstractmethod + async def connect(self) -> ObjectStream[T_co]: + """ + Connect to the remote endpoint. + + :return: an object stream connected to the remote end + :raises ConnectionFailed: if the connection fails + """ + + +class ByteStreamConnectable(metaclass=ABCMeta): + @abstractmethod + async def connect(self) -> ByteStream: + """ + Connect to the remote endpoint. + + :return: a bytestream connected to the remote end + :raises ConnectionFailed: if the connection fails + """ + + +#: Type alias for all connectables returning bytestreams or bytes-oriented object streams +AnyByteStreamConnectable: TypeAlias = ( + ObjectStreamConnectable[bytes] | ByteStreamConnectable +) diff --git a/simulador-backend/venv/Lib/site-packages/anyio/abc/_subprocesses.py b/simulador-backend/venv/Lib/site-packages/anyio/abc/_subprocesses.py new file mode 100644 index 0000000..ce0564c --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/abc/_subprocesses.py @@ -0,0 +1,79 @@ +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/simulador-backend/venv/Lib/site-packages/anyio/abc/_tasks.py b/simulador-backend/venv/Lib/site-packages/anyio/abc/_tasks.py new file mode 100644 index 0000000..516b3ec --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/abc/_tasks.py @@ -0,0 +1,117 @@ +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, overload + +if sys.version_info >= (3, 13): + from typing import TypeVar +else: + from typing_extensions import TypeVar + +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, default=None) +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. + + The target callable must accept a keyword argument ``task_status`` (of type + :class:`TaskStatus`). Awaiting on this method will return whatever was passed to + ``task_status.started()`` (``None`` by default). + + .. note:: The :class:`TaskStatus` class is generic, and the type argument should + indicate the type of the value that will be passed to + ``task_status.started()``. + + :param func: a coroutine function that accepts the ``task_status`` keyword + argument + :param args: positional arguments to call the function with + :param name: an optional name for the task, for introspection and debugging + :return: the value passed to ``task_status.started()`` + :raises RuntimeError: if the task finishes without calling + ``task_status.started()`` + + .. seealso:: :ref:`start_initialize` + + .. 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: + """Exit the task group context waiting for all tasks to finish.""" diff --git a/simulador-backend/venv/Lib/site-packages/anyio/abc/_testing.py b/simulador-backend/venv/Lib/site-packages/anyio/abc/_testing.py new file mode 100644 index 0000000..7c50ed7 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/abc/_testing.py @@ -0,0 +1,65 @@ +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/simulador-backend/venv/Lib/site-packages/anyio/from_thread.py b/simulador-backend/venv/Lib/site-packages/anyio/from_thread.py new file mode 100644 index 0000000..837de5e --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/from_thread.py @@ -0,0 +1,578 @@ +from __future__ import annotations + +__all__ = ( + "BlockingPortal", + "BlockingPortalProvider", + "check_cancelled", + "run", + "run_sync", + "start_blocking_portal", +) + +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 functools import partial +from inspect import isawaitable +from threading import Lock, Thread, current_thread, get_ident +from types import TracebackType +from typing import ( + Any, + Generic, + TypeVar, + cast, + overload, +) + +from ._core._eventloop import ( + get_cancelled_exc_class, + threadlocals, +) +from ._core._eventloop import run as run_eventloop +from ._core._exceptions import NoEventLoopError +from ._core._synchronization import Event +from ._core._tasks import CancelScope, create_task_group +from .abc._tasks import TaskStatus +from .lowlevel import EventLoopToken, current_token + +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 _token_or_error(token: EventLoopToken | None) -> EventLoopToken: + if token is not None: + return token + + try: + return threadlocals.current_token + except AttributeError: + raise NoEventLoopError( + "Not running inside an AnyIO worker thread, and no event loop token was " + "provided" + ) from None + + +def run( + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + *args: Unpack[PosArgsT], + token: EventLoopToken | None = None, +) -> T_Retval: + """ + Call a coroutine function from a worker thread. + + :param func: a coroutine function + :param args: positional arguments for the callable + :param token: an event loop token to use to get back to the event loop thread + (required if calling this function from outside an AnyIO worker thread) + :return: the return value of the coroutine function + :raises MissingTokenError: if no token was provided and called from outside an + AnyIO worker thread + :raises RunFinishedError: if the event loop tied to ``token`` is no longer running + + .. versionchanged:: 4.11.0 + Added the ``token`` parameter. + + """ + explicit_token = token is not None + token = _token_or_error(token) + return token.backend_class.run_async_from_thread( + func, args, token=token.native_token if explicit_token else None + ) + + +def run_sync( + func: Callable[[Unpack[PosArgsT]], T_Retval], + *args: Unpack[PosArgsT], + token: EventLoopToken | None = None, +) -> 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 + :param token: an event loop token to use to get back to the event loop thread + (required if calling this function from outside an AnyIO worker thread) + :return: the return value of the callable + :raises MissingTokenError: if no token was provided and called from outside an + AnyIO worker thread + :raises RunFinishedError: if the event loop tied to ``token`` is no longer running + + .. versionchanged:: 4.11.0 + Added the ``token`` parameter. + + """ + explicit_token = token is not None + token = _token_or_error(token) + return token.backend_class.run_sync_from_thread( + func, args, token=token.native_token if explicit_token else None + ) + + +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. + + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + """ + + def __init__(self) -> None: + self._token = current_token() + self._event_loop_thread_id: int | None = get_ident() + self._stop_event = Event() + self._task_group = create_task_group() + + 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: + 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("the blocking portal is shutting down") + + 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(): + if self._event_loop_thread_id == get_ident(): + scope.cancel("the future was cancelled") + elif self._event_loop_thread_id is not None: + self.call(scope.cancel, "the future was cancelled") + + try: + retval_or_awaitable = func(*args, **kwargs) + if isawaitable(retval_or_awaitable): + with CancelScope() as scope: + future.add_done_callback(callback) + retval = await retval_or_awaitable + else: + retval = retval_or_awaitable + except get_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. + + :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 + + """ + run_sync( + partial(self._task_group.start_soon, name=name), + self._call_func, + func, + args, + kwargs, + future, + token=self._token, + ) + + @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, + *, + name: str | 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 + :param name: name of the thread + :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_: + if name is None: + current_thread().name = f"{backend}-portal-{id(portal_):x}" + + future.set_result(portal_) + await portal_.sleep_until_stopped() + + def run_blocking_portal() -> None: + if future.set_running_or_notify_cancel(): + try: + run_eventloop( + 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, name=name) + 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: + token: EventLoopToken = threadlocals.current_token + except AttributeError: + raise NoEventLoopError( + "This function can only be called inside an AnyIO worker thread" + ) from None + + token.backend_class.check_cancelled() diff --git a/simulador-backend/venv/Lib/site-packages/anyio/functools.py b/simulador-backend/venv/Lib/site-packages/anyio/functools.py new file mode 100644 index 0000000..f1d6c7c --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/functools.py @@ -0,0 +1,409 @@ +from __future__ import annotations + +__all__ = ( + "AsyncCacheInfo", + "AsyncCacheParameters", + "AsyncLRUCacheWrapper", + "cache", + "lru_cache", + "reduce", +) + +import functools +import sys +from collections import OrderedDict +from collections.abc import ( + AsyncIterable, + Awaitable, + Callable, + Coroutine, + Hashable, + Iterable, +) +from functools import update_wrapper +from inspect import iscoroutinefunction +from typing import ( + Any, + Generic, + NamedTuple, + TypedDict, + TypeVar, + cast, + final, + overload, +) +from weakref import WeakKeyDictionary + +from ._core._eventloop import current_time +from ._core._synchronization import Lock +from .lowlevel import RunVar, checkpoint + +if sys.version_info >= (3, 11): + from typing import ParamSpec +else: + from typing_extensions import ParamSpec + +T = TypeVar("T") +S = TypeVar("S") +P = ParamSpec("P") +lru_cache_items: RunVar[ + WeakKeyDictionary[ + AsyncLRUCacheWrapper[Any, Any], + OrderedDict[ + Hashable, + tuple[_InitialMissingType, Lock, float | None] + | tuple[Any, None, float | None], + ], + ] +] = RunVar("lru_cache_items") + + +class _InitialMissingType: + pass + + +initial_missing: _InitialMissingType = _InitialMissingType() + + +class AsyncCacheInfo(NamedTuple): + hits: int + misses: int + maxsize: int | None + currsize: int + ttl: int | None + + +class AsyncCacheParameters(TypedDict): + maxsize: int | None + typed: bool + always_checkpoint: bool + ttl: int | None + + +class _LRUMethodWrapper(Generic[T]): + def __init__(self, wrapper: AsyncLRUCacheWrapper[..., T], instance: object): + self.__wrapper = wrapper + self.__instance = instance + + def cache_info(self) -> AsyncCacheInfo: + return self.__wrapper.cache_info() + + def cache_parameters(self) -> AsyncCacheParameters: + return self.__wrapper.cache_parameters() + + def cache_clear(self) -> None: + self.__wrapper.cache_clear() + + async def __call__(self, *args: Any, **kwargs: Any) -> T: + if self.__instance is None: + return await self.__wrapper(*args, **kwargs) + + return await self.__wrapper(self.__instance, *args, **kwargs) + + +@final +class AsyncLRUCacheWrapper(Generic[P, T]): + def __init__( + self, + func: Callable[P, Awaitable[T]], + maxsize: int | None, + typed: bool, + always_checkpoint: bool, + ttl: int | None, + ): + self.__wrapped__ = func + self._hits: int = 0 + self._misses: int = 0 + self._maxsize = max(maxsize, 0) if maxsize is not None else None + self._currsize: int = 0 + self._typed = typed + self._always_checkpoint = always_checkpoint + self._ttl = ttl + update_wrapper(self, func) + + def cache_info(self) -> AsyncCacheInfo: + return AsyncCacheInfo( + self._hits, self._misses, self._maxsize, self._currsize, self._ttl + ) + + def cache_parameters(self) -> AsyncCacheParameters: + return { + "maxsize": self._maxsize, + "typed": self._typed, + "always_checkpoint": self._always_checkpoint, + "ttl": self._ttl, + } + + def cache_clear(self) -> None: + if cache := lru_cache_items.get(None): + cache.pop(self, None) + self._hits = self._misses = self._currsize = 0 + + async def __call__(self, *args: P.args, **kwargs: P.kwargs) -> T: + # Easy case first: if maxsize == 0, no caching is done + if self._maxsize == 0: + value = await self.__wrapped__(*args, **kwargs) + self._misses += 1 + return value + + # The key is constructed as a flat tuple to avoid memory overhead + key: tuple[Any, ...] = args + if kwargs: + # initial_missing is used as a separator + key += (initial_missing,) + sum(kwargs.items(), ()) + + if self._typed: + key += tuple(type(arg) for arg in args) + if kwargs: + key += (initial_missing,) + tuple(type(val) for val in kwargs.values()) + + try: + cache = lru_cache_items.get() + except LookupError: + cache = WeakKeyDictionary() + lru_cache_items.set(cache) + + try: + cache_entry = cache[self] + except KeyError: + cache_entry = cache[self] = OrderedDict() + + cached_value: T | _InitialMissingType + try: + cached_value, lock, expires_at = cache_entry[key] + except KeyError: + # We're the first task to call this function + cached_value, lock, expires_at = ( + initial_missing, + Lock(fast_acquire=not self._always_checkpoint), + None, + ) + cache_entry[key] = cached_value, lock, expires_at + + if lock is None: + if expires_at is not None and current_time() >= expires_at: + self._currsize -= 1 + cached_value, lock, expires_at = ( + initial_missing, + Lock(fast_acquire=not self._always_checkpoint), + None, + ) + cache_entry[key] = cached_value, lock, expires_at + else: + # The value was already cached + self._hits += 1 + cache_entry.move_to_end(key) + if self._always_checkpoint: + await checkpoint() + + return cast(T, cached_value) + + async with lock: + # Check if another task filled the cache while we acquired the lock + if (cached_value := cache_entry[key][0]) is initial_missing: + self._misses += 1 + if self._maxsize is not None and self._currsize >= self._maxsize: + cache_entry.popitem(last=False) + else: + self._currsize += 1 + + value = await self.__wrapped__(*args, **kwargs) + expires_at = ( + current_time() + self._ttl if self._ttl is not None else None + ) + cache_entry[key] = value, None, expires_at + else: + # Another task filled the cache while we were waiting for the lock + self._hits += 1 + cache_entry.move_to_end(key) + value = cast(T, cached_value) + + return value + + def __get__( + self, instance: object, owner: type | None = None + ) -> _LRUMethodWrapper[T]: + wrapper = _LRUMethodWrapper(self, instance) + update_wrapper(wrapper, self.__wrapped__) + return wrapper + + +class _LRUCacheWrapper(Generic[T]): + def __init__( + self, maxsize: int | None, typed: bool, always_checkpoint: bool, ttl: int | None + ): + self._maxsize = maxsize + self._typed = typed + self._always_checkpoint = always_checkpoint + self._ttl = ttl + + @overload + def __call__( # type: ignore[overload-overlap] + self, func: Callable[P, Coroutine[Any, Any, T]], / + ) -> AsyncLRUCacheWrapper[P, T]: ... + + @overload + def __call__( + self, func: Callable[..., T], / + ) -> functools._lru_cache_wrapper[T]: ... + + def __call__( + self, f: Callable[P, Coroutine[Any, Any, T]] | Callable[..., T], / + ) -> AsyncLRUCacheWrapper[P, T] | functools._lru_cache_wrapper[T]: + if iscoroutinefunction(f): + return AsyncLRUCacheWrapper( + f, self._maxsize, self._typed, self._always_checkpoint, self._ttl + ) + + return functools.lru_cache(maxsize=self._maxsize, typed=self._typed)(f) # type: ignore[arg-type] + + +@overload +def cache( # type: ignore[overload-overlap] + func: Callable[P, Coroutine[Any, Any, T]], / +) -> AsyncLRUCacheWrapper[P, T]: ... + + +@overload +def cache(func: Callable[..., T], /) -> functools._lru_cache_wrapper[T]: ... + + +def cache( + func: Callable[..., T] | Callable[P, Coroutine[Any, Any, T]], / +) -> AsyncLRUCacheWrapper[P, T] | functools._lru_cache_wrapper[T]: + """ + A convenient shortcut for :func:`lru_cache` with ``maxsize=None``. + + This is the asynchronous equivalent to :func:`functools.cache`. + + """ + return lru_cache(maxsize=None)(func) + + +@overload +def lru_cache( + *, + maxsize: int | None = ..., + typed: bool = ..., + always_checkpoint: bool = ..., + ttl: int | None = ..., +) -> _LRUCacheWrapper[Any]: ... + + +@overload +def lru_cache( # type: ignore[overload-overlap] + func: Callable[P, Coroutine[Any, Any, T]], / +) -> AsyncLRUCacheWrapper[P, T]: ... + + +@overload +def lru_cache(func: Callable[..., T], /) -> functools._lru_cache_wrapper[T]: ... + + +def lru_cache( + func: Callable[P, Coroutine[Any, Any, T]] | Callable[..., T] | None = None, + /, + *, + maxsize: int | None = 128, + typed: bool = False, + always_checkpoint: bool = False, + ttl: int | None = None, +) -> ( + AsyncLRUCacheWrapper[P, T] | functools._lru_cache_wrapper[T] | _LRUCacheWrapper[Any] +): + """ + An asynchronous version of :func:`functools.lru_cache`. + + If a synchronous function is passed, the standard library + :func:`functools.lru_cache` is applied instead. + + :param always_checkpoint: if ``True``, every call to the cached function will be + guaranteed to yield control to the event loop at least once + :param ttl: time in seconds after which to invalidate cache entries + + .. note:: Caches and locks are managed on a per-event loop basis. + + """ + if func is None: + return _LRUCacheWrapper[Any](maxsize, typed, always_checkpoint, ttl) + + if not callable(func): + raise TypeError("the first argument must be callable") + + return _LRUCacheWrapper[T](maxsize, typed, always_checkpoint, ttl)(func) + + +@overload +async def reduce( + function: Callable[[T, S], Awaitable[T]], + iterable: Iterable[S] | AsyncIterable[S], + /, + initial: T, +) -> T: ... + + +@overload +async def reduce( + function: Callable[[T, T], Awaitable[T]], + iterable: Iterable[T] | AsyncIterable[T], + /, +) -> T: ... + + +async def reduce( # type: ignore[misc] + function: Callable[[T, T], Awaitable[T]] | Callable[[T, S], Awaitable[T]], + iterable: Iterable[T] | Iterable[S] | AsyncIterable[T] | AsyncIterable[S], + /, + initial: T | _InitialMissingType = initial_missing, +) -> T: + """ + Asynchronous version of :func:`functools.reduce`. + + :param function: a coroutine function that takes two arguments: the accumulated + value and the next element from the iterable + :param iterable: an iterable or async iterable + :param initial: the initial value (if missing, the first element of the iterable is + used as the initial value) + + """ + element: Any + function_called = False + if isinstance(iterable, AsyncIterable): + async_it = iterable.__aiter__() + if initial is initial_missing: + try: + value = cast(T, await async_it.__anext__()) + except StopAsyncIteration: + raise TypeError( + "reduce() of empty sequence with no initial value" + ) from None + else: + value = cast(T, initial) + + async for element in async_it: + value = await function(value, element) + function_called = True + elif isinstance(iterable, Iterable): + it = iter(iterable) + if initial is initial_missing: + try: + value = cast(T, next(it)) + except StopIteration: + raise TypeError( + "reduce() of empty sequence with no initial value" + ) from None + else: + value = cast(T, initial) + + for element in it: + value = await function(value, element) + function_called = True + else: + raise TypeError("reduce() argument 2 must be an iterable or async iterable") + + # Make sure there is at least one checkpoint, even if an empty iterable and an + # initial value were given + if not function_called: + await checkpoint() + + return value diff --git a/simulador-backend/venv/Lib/site-packages/anyio/lowlevel.py b/simulador-backend/venv/Lib/site-packages/anyio/lowlevel.py new file mode 100644 index 0000000..ffbb75a --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/lowlevel.py @@ -0,0 +1,196 @@ +from __future__ import annotations + +__all__ = ( + "EventLoopToken", + "RunvarToken", + "RunVar", + "checkpoint", + "checkpoint_if_cancelled", + "cancel_shielded_checkpoint", + "current_token", +) + +import enum +from dataclasses import dataclass +from types import TracebackType +from typing import Any, Generic, Literal, TypeVar, final, overload +from weakref import WeakKeyDictionary + +from ._core._eventloop import get_async_backend +from .abc import AsyncBackend + +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() + + +@final +@dataclass(frozen=True, repr=False) +class EventLoopToken: + """ + An opaque object that holds a reference to an event loop. + + .. versionadded:: 4.11.0 + """ + + backend_class: type[AsyncBackend] + native_token: object + + +def current_token() -> EventLoopToken: + """ + Return a token object that can be used to call code in the current event loop from + another thread. + + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + .. versionadded:: 4.11.0 + + """ + backend_class = get_async_backend() + raw_token = backend_class.current_token() + return EventLoopToken(backend_class, raw_token) + + +_run_vars: WeakKeyDictionary[object, dict[RunVar[Any], Any]] = WeakKeyDictionary() + + +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 + + def __enter__(self) -> RunvarToken[T]: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self._var.reset(self) + + +class RunVar(Generic[T]): + """ + Like a :class:`~contextvars.ContextVar`, except scoped to the running event loop. + + Can be used as a context manager, Just like :class:`~contextvars.ContextVar`, that + will reset the variable to its previous value when the context block is exited. + """ + + __slots__ = "_name", "_default" + + NO_VALUE_SET: Literal[_NoValueSet.NO_VALUE_SET] = _NoValueSet.NO_VALUE_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[RunVar[T], T]: + native_token = current_token().native_token + try: + return _run_vars[native_token] + except KeyError: + run_vars = _run_vars[native_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] + 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, RunVar.NO_VALUE_SET)) + current_vars[self] = 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] + except KeyError: + pass + else: + self._current_vars[self] = token._value + + token._redeemed = True + + def __repr__(self) -> str: + return f"" diff --git a/simulador-backend/venv/Lib/site-packages/anyio/py.typed b/simulador-backend/venv/Lib/site-packages/anyio/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/pytest_plugin.py b/simulador-backend/venv/Lib/site-packages/anyio/pytest_plugin.py new file mode 100644 index 0000000..a5183f0 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/pytest_plugin.py @@ -0,0 +1,363 @@ +from __future__ import annotations + +import dataclasses +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 +from _pytest.fixtures import FuncFixtureInfo, SubRequest +from _pytest.outcomes import Exit +from _pytest.python import CallSpec2 +from _pytest.scope import Scope + +from . import get_available_backends +from ._core._eventloop import ( + current_async_library, + get_async_backend, + reset_current_async_library, + set_current_async_library, +) +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 current_async_library() is None: + # Since we're in control of the event loop, we can cache the name of the + # async library + token = set_current_async_library(backend_name) + _runner_stack.callback(reset_current_async_library, 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_addoption(parser: pytest.Parser) -> None: + parser.addini( + "anyio_mode", + default="strict", + help='AnyIO plugin mode (either "strict" or "auto")', + ) + + +def pytest_configure(config: pytest.Config) -> None: + config.addinivalue_line( + "markers", + "anyio: mark the (coroutine function) test to be run asynchronously via anyio.", + ) + if ( + config.getini("anyio_mode") == "auto" + and config.pluginmanager.has_plugin("asyncio") + and config.getini("asyncio_mode") == "auto" + ): + config.issue_config_time_warning( + pytest.PytestConfigWarning( + "AnyIO auto mode has been enabled together with pytest-asyncio auto " + "mode. This may cause unexpected behavior." + ), + 1, + ) + + +@pytest.hookimpl(hookwrapper=True) +def pytest_fixture_setup(fixturedef: Any, request: Any) -> Generator[Any]: + def wrapper(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: pytest.Module | pytest.Class, name: str, obj: object +) -> None: + if collector.istestfunction(obj, name): + inner_func = obj.hypothesis.inner_test if hasattr(obj, "hypothesis") else obj + if iscoroutinefunction(inner_func): + anyio_auto_mode = collector.config.getini("anyio_mode") == "auto" + marker = collector.get_closest_marker("anyio") + own_markers = getattr(obj, "pytestmark", ()) + if ( + anyio_auto_mode + or marker + or any(marker.name == "anyio" for marker in own_markers) + ): + pytest.mark.usefixtures("anyio_backend")(obj) + + +def pytest_collection_finish(session: pytest.Session) -> None: + for i, item in reversed(list(enumerate(session.items))): + if ( + isinstance(item, pytest.Function) + and iscoroutinefunction(item.function) + and item.get_closest_marker("anyio") is not None + and "anyio_backend" not in item.fixturenames + ): + new_items = [] + try: + cs_fields = {f.name for f in dataclasses.fields(CallSpec2)} + except TypeError: + cs_fields = set() + + for param_index, backend in enumerate(get_available_backends()): + if "_arg2scope" in cs_fields: # pytest >= 8 + callspec = CallSpec2( + params={"anyio_backend": backend}, + indices={"anyio_backend": param_index}, + _arg2scope={"anyio_backend": Scope.Module}, + _idlist=[backend], + marks=[], + ) + else: # pytest 7.x + callspec = CallSpec2( # type: ignore[call-arg] + funcargs={}, + params={"anyio_backend": backend}, + indices={"anyio_backend": param_index}, + arg2scope={"anyio_backend": Scope.Module}, + idlist=[backend], + marks=[], + ) + + fi = item._fixtureinfo + new_names_closure = list(fi.names_closure) + if "anyio_backend" not in new_names_closure: + new_names_closure.append("anyio_backend") + + new_fixtureinfo = FuncFixtureInfo( + argnames=fi.argnames, + initialnames=fi.initialnames, + names_closure=new_names_closure, + name2fixturedefs=fi.name2fixturedefs, + ) + new_item = pytest.Function.from_parent( + item.parent, + name=f"{item.originalname}[{backend}]", + callspec=callspec, + callobj=item.obj, + fixtureinfo=new_fixtureinfo, + keywords=item.keywords, + originalname=item.originalname, + ) + new_items.append(new_item) + + session.items[i : i + 1] = new_items + + +@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_available_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/simulador-backend/venv/Lib/site-packages/anyio/streams/__init__.py b/simulador-backend/venv/Lib/site-packages/anyio/streams/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/streams/__pycache__/__init__.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/streams/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..78ef4c69e829b8e64e7f7214e8da65c1aabb25b9 GIT binary patch literal 202 zcmX@j%ge<81X=xpSs?l`h(HIQS%4zb87dhx8U0o=6fpsLpFwJVWx80!c;y$TDmW(= z<)-E-1f&+FRw=mW=T#-X(TfTD@%sl_pgd6k*@`o$$hsfoG8`tk9Zd6^~g@p=W7w>WHa^HWN5QtgUZ Vfi^P&aWRPTk(rT^v4|PS0st;EH{}2T literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/streams/__pycache__/buffered.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/streams/__pycache__/buffered.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a549a2432bd4b8cb90a0170970edb8b7fa276b0d GIT binary patch literal 9081 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 b650F7_Z|}{Jsz&*1`BPweof$)oyY$HO0Z2# literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/streams/__pycache__/file.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/streams/__pycache__/file.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d10c5bf6e2d201c9175c7beb14a391151947b503 GIT binary patch literal 7473 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 literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/streams/__pycache__/stapled.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/streams/__pycache__/stapled.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c82de2448475d1101b4f7eb63c877c2b7fcee97f GIT binary patch literal 7552 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 R#3pa23$eq0CXiu5{Tuk+lJfun literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/streams/__pycache__/tls.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/anyio/streams/__pycache__/tls.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e294e7891aa01427db8237ede9a544d10db2aa00 GIT binary patch literal 20150 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 Kio=`H=l=!A-s9E) literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/anyio/streams/buffered.py b/simulador-backend/venv/Lib/site-packages/anyio/streams/buffered.py new file mode 100644 index 0000000..57c7cd7 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/streams/buffered.py @@ -0,0 +1,188 @@ +from __future__ import annotations + +__all__ = ( + "BufferedByteReceiveStream", + "BufferedByteStream", + "BufferedConnectable", +) + +import sys +from collections.abc import Callable, Iterable, Mapping +from dataclasses import dataclass, field +from typing import Any, SupportsIndex + +from .. import ClosedResourceError, DelimiterNotFound, EndOfStream, IncompleteRead +from ..abc import ( + AnyByteReceiveStream, + AnyByteStream, + AnyByteStreamConnectable, + ByteReceiveStream, + ByteStream, + ByteStreamConnectable, +) + +if sys.version_info >= (3, 12): + from typing import override +else: + from typing_extensions import override + + +@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 + + def feed_data(self, data: Iterable[SupportsIndex], /) -> None: + """ + Append data directly into the buffer. + + Any data in the buffer will be consumed by receive operations before receiving + anything from the wrapped stream. + + :param data: the data to append to the buffer (can be bytes or anything else + that supports ``__index__()``) + + """ + self._buffer.extend(data) + + 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) + + +class BufferedByteStream(BufferedByteReceiveStream, ByteStream): + """ + A full-duplex variant of :class:`BufferedByteReceiveStream`. All writes are passed + through to the wrapped stream as-is. + """ + + def __init__(self, stream: AnyByteStream): + """ + :param stream: the stream to be wrapped + + """ + super().__init__(stream) + self._stream = stream + + @override + async def send_eof(self) -> None: + await self._stream.send_eof() + + @override + async def send(self, item: bytes) -> None: + await self._stream.send(item) + + +class BufferedConnectable(ByteStreamConnectable): + def __init__(self, connectable: AnyByteStreamConnectable): + """ + :param connectable: the connectable to wrap + + """ + self.connectable = connectable + + @override + async def connect(self) -> BufferedByteStream: + stream = await self.connectable.connect() + return BufferedByteStream(stream) diff --git a/simulador-backend/venv/Lib/site-packages/anyio/streams/file.py b/simulador-backend/venv/Lib/site-packages/anyio/streams/file.py new file mode 100644 index 0000000..79c3d50 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/streams/file.py @@ -0,0 +1,154 @@ +from __future__ import annotations + +__all__ = ( + "FileReadStream", + "FileStreamAttribute", + "FileWriteStream", +) + +from collections.abc import Callable, Mapping +from io import SEEK_SET, UnsupportedOperation +from os import PathLike +from pathlib import Path +from typing import IO, Any + +from .. import ( + BrokenResourceError, + ClosedResourceError, + EndOfStream, + TypedAttributeSet, + to_thread, + typed_attribute, +) +from ..abc import ByteReceiveStream, ByteSendStream + + +class FileStreamAttribute(TypedAttributeSet): + #: the open file descriptor + file: IO[bytes] = 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: IO[bytes]): + 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(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(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/simulador-backend/venv/Lib/site-packages/anyio/streams/memory.py b/simulador-backend/venv/Lib/site-packages/anyio/streams/memory.py new file mode 100644 index 0000000..a3fa0c3 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/streams/memory.py @@ -0,0 +1,325 @@ +from __future__ import annotations + +__all__ = ( + "MemoryObjectReceiveStream", + "MemoryObjectSendStream", + "MemoryObjectStreamStatistics", +) + +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, + stacklevel=1, + 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, + stacklevel=1, + source=self, + ) diff --git a/simulador-backend/venv/Lib/site-packages/anyio/streams/stapled.py b/simulador-backend/venv/Lib/site-packages/anyio/streams/stapled.py new file mode 100644 index 0000000..9248b68 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/streams/stapled.py @@ -0,0 +1,147 @@ +from __future__ import annotations + +__all__ = ( + "MultiListener", + "StapledByteStream", + "StapledObjectStream", +) + +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/simulador-backend/venv/Lib/site-packages/anyio/streams/text.py b/simulador-backend/venv/Lib/site-packages/anyio/streams/text.py new file mode 100644 index 0000000..296cd25 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/streams/text.py @@ -0,0 +1,176 @@ +from __future__ import annotations + +__all__ = ( + "TextConnectable", + "TextReceiveStream", + "TextSendStream", + "TextStream", +) + +import codecs +import sys +from collections.abc import Callable, Mapping +from dataclasses import InitVar, dataclass, field +from typing import Any + +from ..abc import ( + AnyByteReceiveStream, + AnyByteSendStream, + AnyByteStream, + AnyByteStreamConnectable, + ObjectReceiveStream, + ObjectSendStream, + ObjectStream, + ObjectStreamConnectable, +) + +if sys.version_info >= (3, 12): + from typing import override +else: + from typing_extensions import override + + +@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, + } + + +class TextConnectable(ObjectStreamConnectable[str]): + def __init__(self, connectable: AnyByteStreamConnectable): + """ + :param connectable: the bytestream endpoint to wrap + + """ + self.connectable = connectable + + @override + async def connect(self) -> TextStream: + stream = await self.connectable.connect() + return TextStream(stream) diff --git a/simulador-backend/venv/Lib/site-packages/anyio/streams/tls.py b/simulador-backend/venv/Lib/site-packages/anyio/streams/tls.py new file mode 100644 index 0000000..e2a7ca5 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/streams/tls.py @@ -0,0 +1,421 @@ +from __future__ import annotations + +__all__ = ( + "TLSAttribute", + "TLSConnectable", + "TLSListener", + "TLSStream", +) + +import logging +import re +import ssl +import sys +from collections.abc import Callable, Mapping +from dataclasses import dataclass +from functools import wraps +from ssl import SSLContext +from typing import Any, TypeAlias, TypeVar + +from .. import ( + BrokenResourceError, + EndOfStream, + aclose_forcefully, + get_cancelled_exc_class, + to_thread, +) +from .._core._typedattr import TypedAttributeSet, typed_attribute +from ..abc import ( + AnyByteStream, + AnyByteStreamConnectable, + ByteStream, + ByteStreamConnectable, + Listener, + TaskGroup, +) + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +if sys.version_info >= (3, 12): + from typing import override +else: + from typing_extensions import override + +T_Retval = TypeVar("T_Retval") +PosArgsT = TypeVarTuple("PosArgsT") +_PCTRTT: TypeAlias = tuple[tuple[str, str], ...] +_PCTRTTT: TypeAlias = 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, + } + + +class TLSConnectable(ByteStreamConnectable): + """ + Wraps another connectable and does TLS negotiation after a successful connection. + + :param connectable: the connectable to wrap + :param hostname: host name of the server (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 server does the same + """ + + def __init__( + self, + connectable: AnyByteStreamConnectable, + *, + hostname: str | None = None, + ssl_context: ssl.SSLContext | None = None, + standard_compatible: bool = True, + ) -> None: + self.connectable = connectable + self.ssl_context: SSLContext = ssl_context or ssl.create_default_context( + ssl.Purpose.SERVER_AUTH + ) + if not isinstance(self.ssl_context, ssl.SSLContext): + raise TypeError( + "ssl_context must be an instance of ssl.SSLContext, not " + f"{type(self.ssl_context).__name__}" + ) + self.hostname = hostname + self.standard_compatible = standard_compatible + + @override + async def connect(self) -> TLSStream: + stream = await self.connectable.connect() + try: + return await TLSStream.wrap( + stream, + hostname=self.hostname, + ssl_context=self.ssl_context, + standard_compatible=self.standard_compatible, + ) + except BaseException: + await aclose_forcefully(stream) + raise diff --git a/simulador-backend/venv/Lib/site-packages/anyio/to_interpreter.py b/simulador-backend/venv/Lib/site-packages/anyio/to_interpreter.py new file mode 100644 index 0000000..694dbe7 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/to_interpreter.py @@ -0,0 +1,246 @@ +from __future__ import annotations + +__all__ = ( + "run_sync", + "current_default_interpreter_limiter", +) + +import atexit +import os +import sys +from collections import deque +from collections.abc import Callable +from typing import Any, Final, TypeVar + +from . import current_time, to_thread +from ._core._exceptions import BrokenWorkerInterpreter +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 + +if sys.version_info >= (3, 14): + from concurrent.interpreters import ExecutionFailed, create + + def _interp_call( + func: Callable[..., Any], args: tuple[Any, ...] + ) -> tuple[Any, bool]: + try: + retval = func(*args) + except BaseException as exc: + return exc, True + else: + return retval, False + + class _Worker: + last_used: float = 0 + + def __init__(self) -> None: + self._interpreter = create() + + def destroy(self) -> None: + self._interpreter.close() + + def call( + self, + func: Callable[..., T_Retval], + args: tuple[Any, ...], + ) -> T_Retval: + try: + res, is_exception = self._interpreter.call(_interp_call, func, args) + except ExecutionFailed as exc: + raise BrokenWorkerInterpreter(exc.excinfo) from exc + + if is_exception: + raise res + + return res +elif sys.version_info >= (3, 13): + import _interpqueues + import _interpreters + + 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 + QUEUE_PICKLE_ARGS: Final = (FMT_PICKLED, UNBOUND) + QUEUE_UNPICKLE_ARGS: Final = (FMT_UNPICKLED, UNBOUND) + + _run_func = compile( + """ +import _interpqueues +from _interpreters import NotShareableError +from pickle import loads, dumps, HIGHEST_PROTOCOL + +QUEUE_PICKLE_ARGS = (1, 2) +QUEUE_UNPICKLE_ARGS = (0, 2) + +item = _interpqueues.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: + _interpqueues.put(queue_id, (retval, is_exception), *QUEUE_UNPICKLE_ARGS) +except NotShareableError: + retval = dumps(retval, HIGHEST_PROTOCOL) + _interpqueues.put(queue_id, (retval, is_exception), *QUEUE_PICKLE_ARGS) + """, + "", + "exec", + ) + + class _Worker: + last_used: float = 0 + + def __init__(self) -> None: + self._interpreter_id = _interpreters.create() + self._queue_id = _interpqueues.create(1, *QUEUE_UNPICKLE_ARGS) + _interpreters.set___main___attrs( + self._interpreter_id, {"queue_id": self._queue_id} + ) + + def destroy(self) -> None: + _interpqueues.destroy(self._queue_id) + _interpreters.destroy(self._interpreter_id) + + def call( + self, + func: Callable[..., T_Retval], + args: tuple[Any, ...], + ) -> T_Retval: + import pickle + + item = pickle.dumps((func, args), pickle.HIGHEST_PROTOCOL) + _interpqueues.put(self._queue_id, item, *QUEUE_PICKLE_ARGS) + exc_info = _interpreters.exec(self._interpreter_id, _run_func) + if exc_info: + raise BrokenWorkerInterpreter(exc_info) + + res = _interpqueues.get(self._queue_id) + (res, is_exception), fmt = res[:2] + if fmt == FMT_PICKLED: + res = pickle.loads(res) + + if is_exception: + raise res + + return res +else: + + class _Worker: + last_used: float = 0 + + def __init__(self) -> None: + raise RuntimeError("subinterpreters require at least Python 3.13") + + def call( + self, + func: Callable[..., T_Retval], + args: tuple[Any, ...], + ) -> T_Retval: + raise NotImplementedError + + def destroy(self) -> None: + pass + + +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") + + +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. + + .. warning:: On Python 3.13, the :mod:`concurrent.interpreters` module was not yet + available, so the code path for that Python version relies on an undocumented, + private API. As such, it is recommended to not rely on this function for anything + mission-critical on Python 3.13. + + :param func: a callable + :param args: the positional arguments for the callable + :param limiter: capacity limiter to use to limit the total number of subinterpreters + running (if omitted, the default limiter is used) + :return: the result of the call + :raises BrokenWorkerInterpreter: if there's an internal error in a subinterpreter + + """ + 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 to_thread.run_sync( + worker.call, + func, + args, + limiter=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 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/simulador-backend/venv/Lib/site-packages/anyio/to_process.py b/simulador-backend/venv/Lib/site-packages/anyio/to_process.py new file mode 100644 index 0000000..b289234 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/to_process.py @@ -0,0 +1,266 @@ +from __future__ import annotations + +__all__ = ( + "current_default_process_limiter", + "process_worker", + "run_sync", +) + +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) + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + :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/simulador-backend/venv/Lib/site-packages/anyio/to_thread.py b/simulador-backend/venv/Lib/site-packages/anyio/to_thread.py new file mode 100644 index 0000000..83c79d1 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/anyio/to_thread.py @@ -0,0 +1,78 @@ +from __future__ import annotations + +__all__ = ( + "run_sync", + "current_default_thread_limiter", +) + +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 ``abandon_on_cancel`` 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) + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + :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 + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().current_default_thread_limiter() diff --git a/simulador-backend/venv/Lib/site-packages/click-8.4.1.dist-info/INSTALLER b/simulador-backend/venv/Lib/site-packages/click-8.4.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/click-8.4.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/simulador-backend/venv/Lib/site-packages/click-8.4.1.dist-info/METADATA b/simulador-backend/venv/Lib/site-packages/click-8.4.1.dist-info/METADATA new file mode 100644 index 0000000..21d7a0c --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/click-8.4.1.dist-info/METADATA @@ -0,0 +1,84 @@ +Metadata-Version: 2.4 +Name: click +Version: 8.4.1 +Summary: Composable command line interface toolkit +Maintainer-email: Pallets +Requires-Python: >=3.10 +Description-Content-Type: text/markdown +License-Expression: BSD-3-Clause +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Typing :: Typed +License-File: LICENSE.txt +Requires-Dist: colorama; platform_system == 'Windows' +Project-URL: Changes, https://click.palletsprojects.com/page/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 + +## 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/simulador-backend/venv/Lib/site-packages/click-8.4.1.dist-info/RECORD b/simulador-backend/venv/Lib/site-packages/click-8.4.1.dist-info/RECORD new file mode 100644 index 0000000..3b06bd8 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/click-8.4.1.dist-info/RECORD @@ -0,0 +1,40 @@ +click-8.4.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +click-8.4.1.dist-info/METADATA,sha256=uWALc7Y-Ixjj35al3B2qNsyXk-0tf578YgIsL1Vbn98,2621 +click-8.4.1.dist-info/RECORD,, +click-8.4.1.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82 +click-8.4.1.dist-info/licenses/LICENSE.txt,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475 +click/__init__.py,sha256=FId2fXCSJB3yeWD-e2uON-mBhFa2Yc9MvXGmHu8OXG0,4634 +click/__pycache__/__init__.cpython-312.pyc,, +click/__pycache__/_compat.cpython-312.pyc,, +click/__pycache__/_termui_impl.cpython-312.pyc,, +click/__pycache__/_textwrap.cpython-312.pyc,, +click/__pycache__/_utils.cpython-312.pyc,, +click/__pycache__/_winconsole.cpython-312.pyc,, +click/__pycache__/core.cpython-312.pyc,, +click/__pycache__/decorators.cpython-312.pyc,, +click/__pycache__/exceptions.cpython-312.pyc,, +click/__pycache__/formatting.cpython-312.pyc,, +click/__pycache__/globals.cpython-312.pyc,, +click/__pycache__/parser.cpython-312.pyc,, +click/__pycache__/shell_completion.cpython-312.pyc,, +click/__pycache__/termui.cpython-312.pyc,, +click/__pycache__/testing.cpython-312.pyc,, +click/__pycache__/types.cpython-312.pyc,, +click/__pycache__/utils.cpython-312.pyc,, +click/_compat.py,sha256=XK1woqBSPRb1KNAwWwVsSMfEm8ZlfDwBCjceWzSGmEY,18910 +click/_termui_impl.py,sha256=VNyWY27pm0JUq12WK__pJNYxeUoDyfNwYEgE6vz_cnM,30411 +click/_textwrap.py,sha256=7Z0N7Vmn-66TNSTUwp6OXJbcUXRmYET9h9c2ucD8oQQ,6270 +click/_utils.py,sha256=eCZCtwJtsYD5QYkkNWJ8MY_8ABIjy8MczgMMyVY32rQ,996 +click/_winconsole.py,sha256=KSxfNbMlYRa6GOJuCLgsg2Pb3dVkgJNPqLJPae-Pa10,8543 +click/core.py,sha256=CQaJ0ALw4zyyVp6E7gP6a_G88eiuXE9mBzFnIJQ-igY,137917 +click/decorators.py,sha256=xgR8vZAClhWVkzitP22k6jETFRhKralh81zvA69Csd0,18467 +click/exceptions.py,sha256=FJitDd6MSZLj6CtKQWpkQzHnfsUw3UypxDU0t76bn0c,11294 +click/formatting.py,sha256=r6kGLpPyF0Cva6uSTwSZ_8ONRE7jp93I1C0JVRYQEqE,10370 +click/globals.py,sha256=gM-Nh6A4M0HB_SgkaF5M4ncGGMDHc_flHXu9_oh4GEU,1923 +click/parser.py,sha256=oJ-fU_3mvxugIuNtHaCATZ56lgEmHRggjJiSqEgYrjA,19052 +click/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +click/shell_completion.py,sha256=QxeFb3RapNSP8ZwvK2BDVI2jrEKS1RbJaeuFMrHJAnU,21748 +click/termui.py,sha256=hflZ_tK7P4WUv_ef_RVVRL7n0nRPhTD0wN0pkHE7hDo,33000 +click/testing.py,sha256=0k_v5By_5ZO2McjBT7lTqQ57W8QJuW0_5Sx7d2ZLKec,25717 +click/types.py,sha256=UiVEx0yoQtrWO2wH22NgME4LfDxMNQi8j1qtJupYIpw,42783 +click/utils.py,sha256=YsTNrChEfwDXl39CTC_yWnQ-ZVkZxYjFESRCfEgClY4,20386 diff --git a/simulador-backend/venv/Lib/site-packages/click-8.4.1.dist-info/WHEEL b/simulador-backend/venv/Lib/site-packages/click-8.4.1.dist-info/WHEEL new file mode 100644 index 0000000..d8b9936 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/click-8.4.1.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.12.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/simulador-backend/venv/Lib/site-packages/click-8.4.1.dist-info/licenses/LICENSE.txt b/simulador-backend/venv/Lib/site-packages/click-8.4.1.dist-info/licenses/LICENSE.txt new file mode 100644 index 0000000..d12a849 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/click-8.4.1.dist-info/licenses/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright 2014 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/simulador-backend/venv/Lib/site-packages/click/__init__.py b/simulador-backend/venv/Lib/site-packages/click/__init__.py new file mode 100644 index 0000000..64be7e0 --- /dev/null +++ b/simulador-backend/venv/Lib/site-packages/click/__init__.py @@ -0,0 +1,126 @@ +""" +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 __future__ import annotations + +from .core import Argument as Argument +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 Option as Option +from .core import Parameter as Parameter +from .core import ParameterSource as ParameterSource +from .decorators import argument as argument +from .decorators import command as command +from .decorators import confirmation_option as confirmation_option +from .decorators import group as group +from .decorators import help_option as help_option +from .decorators import make_pass_decorator as make_pass_decorator +from .decorators import option as option +from .decorators import pass_context as pass_context +from .decorators import pass_obj as pass_obj +from .decorators import password_option as password_option +from .decorators import version_option as version_option +from .exceptions import Abort as Abort +from .exceptions import BadArgumentUsage as BadArgumentUsage +from .exceptions import BadOptionUsage as BadOptionUsage +from .exceptions import BadParameter as BadParameter +from .exceptions import ClickException as ClickException +from .exceptions import FileError as FileError +from .exceptions import MissingParameter as MissingParameter +from .exceptions import NoSuchCommand as NoSuchCommand +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 .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 get_pager_file as get_pager_file +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 + + +def __getattr__(name: str) -> object: + import warnings + + if name == "BaseCommand": + from .core import _BaseCommand + + warnings.warn( + "'BaseCommand' is deprecated and will be removed in Click 9.0. Use" + " 'Command' instead.", + DeprecationWarning, + stacklevel=2, + ) + return _BaseCommand + + if name == "MultiCommand": + from .core import _MultiCommand + + warnings.warn( + "'MultiCommand' is deprecated and will be removed in Click 9.0. Use" + " 'Group' instead.", + DeprecationWarning, + stacklevel=2, + ) + return _MultiCommand + + if name == "OptionParser": + from .parser import _OptionParser + + warnings.warn( + "'OptionParser' is deprecated and will be removed in Click 9.0. The" + " old parser is available in 'optparse'.", + DeprecationWarning, + stacklevel=2, + ) + return _OptionParser + + if name == "__version__": + import importlib.metadata + import warnings + + warnings.warn( + "The '__version__' attribute is deprecated and will be removed in" + " Click 9.1. Use feature detection or" + " 'importlib.metadata.version(\"click\")' instead.", + DeprecationWarning, + stacklevel=2, + ) + return importlib.metadata.version("click") + + raise AttributeError(name) diff --git a/simulador-backend/venv/Lib/site-packages/click/__pycache__/__init__.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/click/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab39228dea995a790554a431873de0e7dc288180 GIT binary patch literal 4194 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 literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/click/__pycache__/_termui_impl.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/click/__pycache__/_termui_impl.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bcf12d0b3efcdf8c52f1319ad2bfd920b146c2e6 GIT binary patch literal 35256 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 b+cP|8_I+&1$w*bGrh@PGX2G1#t}y>EXd7p8 literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/click/__pycache__/_textwrap.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/click/__pycache__/_textwrap.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ffc48430cef02132d1c55bab36e235829d10d07 GIT binary patch literal 7413 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 literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/click/__pycache__/_utils.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/click/__pycache__/_utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3dda1a6abef2f540113ff5dc0627d731e3447845 GIT binary patch literal 1436 zcmah|%}*Ow5TCbRe;X3qG=Qq04b5e%un?&wKoKe`hNQJD#77QWM=y)_LF}w|-M4Gh zwR%7ms#5ikMm_itRVpWla_Aq@ixCItR;nVUm)?lr)KlkqZ9-F|j_i5AH(zgNcIMZf zo)jRJpY&D!i~zh6mo7y^Ku&rIKoeHM1d~`$B|0GjOO~Wd?K7gw5-flj*#=W)Ql%ZU z8zwwoV01xxjKwOwAwJLbxEW;$Gd7LFB%n?9yf(yo(u|``qGKahuKd^L;^>2DsHe>& zdZ+%!`+|4d-kG*{T6p`Cn)ypSt&$*Z*tX*tUfHqTLP-d_B!z&Se2Ab440K`wHjL;I z37Gt%W2Z;|b&Hv@DQ(Mo+>fZyAhFDBuWU1`@omnoSCzWUOvQ5)ldYpvaXVUN)3EBy z)lw-1Nz+il49j(Gt!Ud^2v9j&pNtJQq(p<`=KT`8HrDde{zyX(1fp{a;AC%DxE&OkpMiyK|*W!ye!1e;HStk zs8S&yni>g`l$I>Rbtw%Jl-fp>A(F+3t(RS9t-B&2w9y*+}IHjgjLUGJlt6(8P zbhWUYTL~`D=VupaA(xw5ruSy^t2y3-ft~{w8^$w&i7jrkI0E+?vTb-RMWcz=z0mW{ z_jk5(zx7}H@vD}6H9=xJZ1)VmjtVhI?l;JeBZQDYVE7fJe~0X8EJG$9 zdr$oD{8K=9JOnpx?#}GYY(-mfkTyAB@4`At7l8Jnrfq}uM z|J46^V0UO|Xup4KEB^Ss0~kAkk6sSHzpL)3dv^|R=JxS7Jl}%s51${v{1JT8&hZ~7 CP*&>z literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/click/__pycache__/_winconsole.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/click/__pycache__/_winconsole.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7abe82f19f2cea0836933b3d5e243525e71e6ef GIT binary patch literal 11950 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 literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/click/__pycache__/core.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/click/__pycache__/core.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fdca9d8b35c4012e8609e3fabbcd4f333e482a6 GIT binary patch literal 138980 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 z zOSZCda+R!0dV_Iq@OtyyK%#m3f|vJ?2PO~9SbyoQU+%(=6VV5q?&!|x{*<#k>8y$4 zUtlZ12^XB(QXc<|A2PX_hvS|`CFoA(+~I@=5qNgRJqWwpi;-l(3UV!Y8Zbr^RzypT z?)=PCgAh_v-80p(l8%_WW3jMe(Or=8J_2D%LE-->ES+qax;W90D6B`EZ%;l@i}Ui~ z{q6Qn_lvCXJ1FV~qH#eXVt|t${8Wgt*WGetQTD97d8@~5OZZcS5K&(En}JI3&6S|*Xo1S)|r5>&%{2}oFRN~G!qP-^#=&QYR>-2$8q08 zBqKipu@24cRR>&5O+_xas|jZGBG`>nWEw?0ge7nNI!)TJZk^f2IxpR=RukdSdbQ%d ziNNSj^dvJOlwBVuK-A~-3xdWv16vpo)Q8epKzN5u*8p}n-@_oYS2L|v;gNI}?eZ_2 zPun=hK4T8~Q_LOt=X4@(BuJ2Eh*Gk6NZ&pY1x)7>NSs(6gv&IMM6t8tq6))LyoPWG zqgq$SgJV~!h*w$MR)EfB;%$U~iy8&sD59FCimJxWiTcCYtlLpLzYWm zHm=!2g;Bc#QIzqbb1Vby*%{`bMk-T+2nGbGWYwOkC15O)X~vc*b()k=>r}56YOTq) z3j>!7goj25X#8$MN5(ZY1F;U95GaV6au}b8RX5;Mof%UvCac$0iV!uW9fQxxz_23f8jiFmMxvM4Z9EwkN;>dx^8qq`>@U%1Ls4b6~ADf%5m4a)t?+?2a;$}$y5 zmbb*qTjnxjTw?pWETSn*~AqnXH9@)Sk)iyZ{*7Sh>5tsIWzYf_)*A^REoeMYN~ zj2e(;m3gF45sz)BodUam(N2N1>1mrxDs7Il9m&|?i)8wIkEboi(w4{NKc``|ieY>e zY2lVk3UmYsV4bthg1jv>SE#lp4Y+79rQOVxETd&O_8 zj-2AJ$|YC%RN&3vbTE-0h~?E&Y)DA2s^=ZmDQEu6`^WcBo}qXko8q;b62+SlYl$?0 zfJ47_d1`mmy5t6iY#mD&6Yi#{Emd3^b)+0#=zASi(0wPJ)p2JvSkzb{ux0C#?&i3= zd3NN(OYdL0QFP-{eB1s+#{-CElyDya?iiR)C`U^+MZ!I|6Q;wpkqBwO!X~i2)&lJr>;{J_^ znyv+B_ZN<0+9u>o=ghPuO53CRKkMjXm3i0HrKvNs1#wTyjSV**y>Z}^r(@gpNBh1g zZJD&r6(wCejg7vq6)gY3HePHG)MtW^MhoPWYwgE*|PV6(lWA(rPf_-H4ySlUAL)9 zePjwFXo2)LV<$?UFVZb;LzypftQNIKmB^`i(OMHG6Y@_42G#9wIXt9^tO^9x5K

wy`Yyhs~&2z|0kWGRFWW3o> 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 literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/click/__pycache__/decorators.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/click/__pycache__/decorators.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7bf2a5e5dc7e6a5a0232cfe1dc05aceff6b156f GIT binary patch literal 22191 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 G?0*3{-v$N% literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/click/__pycache__/globals.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/click/__pycache__/globals.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0681b4e65cf8dc6a4b6e3e75e1779e48ada08209 GIT binary patch literal 2973 zcmbVOO>7&-6`olxDT<^-T9F;sO_Xt(pE7Y+$3=fY6m@OIPUIMhVe4W=0Xf_miYqU7 zh?yZN3Q8-v2HcmG9KwYQ?Z$Z!L@TN`kZTzoUC76{x!`(}12)2fq0 z2jJ}dym>S4d+&XZf1a4gA!z=UJu5#RL+Dd888$Z_;O#%b;3{H>;Q+PqBF1Ly1kPd# zzNx@%rx(*0@zhFTc=XX%W|+&;!B{)Hn8nCJJbgXcTpWiJ(~l&FBUWG&EOY6RT>cB> zCRve5E~5{i>q zD%(6HXSn2RLn%9*QF0Fa-OXUPyZhWB9&~2dGC+D_dfWF)UnFSF! zZaNbSu?5novHEORG8>7~qsQeWOdnHfwk#~ahQU=dj`R*_D-JB}Y7FZnxDZ;&?AnAW zbG`!o_2lF^^fjc-BW=?*V9l`Uyny8X_whPX1#L{Xjis(9cdz4%&UwV#_wf($z>U9s z+()aa^Qe!@X?hVZILmcchKlGGCkdRyf=v=oD}*exd__DOk_IPT#TlWBP|~LZqD78C zqn^jrE*-H;h-j>Ur%6+aHlg95--1XOssyc+w1wovZ+F1KzK*p8n#&Nvvd7^9`?6}Y z8+z4xhblF6cAYTp2}!k(Lw!cb1T*oKRn(Dwn@T?zm{&Ku0ci?JT0H1*sfg-&En`Tc zntLr#C;gTWt8IU|rNLOM#D^r1Txl@d4~f^J;j$kt6JINkXwjYzIvdoW0vA7qVvIl~ zXVokS(&?(!lOzt2YMbj;wVotgMR}sb>!XM#N-7o7gSUf;lrhe#Rr0OM;aGpQLnUpK zI18)9ZxY3|fv>(GyP(XxOj=))9u2wxxgzy>5yBS8hGOV$`&i@Ck!JkVqkcdeLF_vY z*f(i6Fd!umfDBwFsSim{pQNP9SHXj4yP@{m{DhQ3)+<&{ngqE2A82a_7fg7Vr@@0L z_!1)E@nD=Uk40EVu1A%QGBrzBQCex>iD>ee*3xfub*w(h&4rAw+N+|%=*4A6=Hbo= zb7fMDkX_ksNLejFw}Bqaxaqg?onq-q?}OgY{15m2=9ynT^HJl*!PjpVk8EX+e14~J z;1{R1@-P1bIUxAg;@&$`Gh5Fczd1Gg$30txQ`;$2+V>!X3Z;KP7&j6RmC=6jr82r! zJXT8me)3p8^@n^KhK~`7p$AJS4H#TS8v3|BiB47w{p@NCFYge@3RJe;Z5>@tXaXas z38}SL&Omr_laV3s52In2e?w-lKv(2m&^BLor7bJKnGmV4xed*tJ9 ze&T*7W?qooX~uyTs2{-K{{d=PjsXT-cGg}z%iE#{IGBXdqC*1St-zsypMz09pf4R`tzci;ck6R>F1s&%yK ztfO-yRfRdf+u?br0C=;oj-M17=ZsbE+HdC!i-j~u=+F2S3aGVcn94CNh^AfiL;$?j z4CpeD>s&KQ=^f@UL~ICAzpN5gff=x`VMopm5dl!izTpBZ5(sg@2y`rtHtP+R!>Afo z8oM#SV9PM%s3~bt+P(y4FThOBKsTDR(O#ft5%f4f4G*p*w#XMj?%PK8Rp=m#b0|Bp zHMakDar!5P&vMWHa^WwzS2kwvjpa6ebh|ipW$?jZE4%+*zGyvB#wQ`R4MVJzbmcVs z50Nx@_ayxB;O|A5m_#jUm2o8zjNFD0fqcoFnM`P$tP{hpAYoo@4_JZ7wabp3$gi6{ zQ`|w$nD{VnG$m(ak+Rt>M!8z8*@a@wYc*-&Bg*JO2TGANK^2YbmgJO~xohSV3+K1|cDVn;AzIrd^UOsy9=w0{OzmHG;^y!TZu%45;d|>my-_RV;pi{Vw=0?_z dCu_(5nc0g=+lL+e-R+!%pZ-^F0+*~G{tF?~+Kd1I literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/click/__pycache__/parser.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/click/__pycache__/parser.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..680b6b10e3cb5ce088564cc29cfbfbd9246e2dff GIT binary patch literal 20501 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 p=h@&n3LlIpQrB6qFX#0tX{|+|2K88*&hG^ literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/click/__pycache__/testing.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/click/__pycache__/testing.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95514818cb392cfd5f4d8b89dad27e9402b36edc GIT binary patch literal 34681 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 A=>Px# literal 0 HcmV?d00001 diff --git a/simulador-backend/venv/Lib/site-packages/click/__pycache__/types.cpython-312.pyc b/simulador-backend/venv/Lib/site-packages/click/__pycache__/types.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70ab5cfb8b9137670023efcbab438865a4bc0d1b GIT binary patch literal 54532 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