From 797d194bca4f228af279c769b9d8a9689aaeaa2e Mon Sep 17 00:00:00 2001 From: zhanggangyong Date: Sat, 17 Jan 2026 07:37:59 +0000 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0A2A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- a2a_litellm_agent/__init__.py | 16 + .../a2a_litellm_agent.Dockerfile | 43 + a2a_litellm_agent/a2a_server.py | 539 + a2a_litellm_agent/agent.py | 282 + a2a_litellm_agent/config.py | 145 + a2a_litellm_agent/main.py | 43 + a2a_litellm_agent/requirements.txt | 7 + azure_blob_agent/azure_blob_agent.Dockerfile | 36 + azure_blob_agent/azure_blob_agent.py | 536 + .../azure_blob_agent_a2a.Dockerfile | 29 + azure_blob_agent_a2a/azure_blob_agent_a2a.py | 663 ++ .../azure_blob_agent_mcp.Dockerfile | 28 + azure_blob_agent_mcp/azure_blob_agent_mcp.py | 622 ++ echo_agent/echo_agent.Dockerfile | 38 + echo_agent/echo_agent.py | 185 + .../jina_search_agent.Dockerfile | 42 + jina_search_agent/jina_search_agent.py | 320 + mysql_agent/mysql_agent.Dockerfile | 46 + mysql_agent/mysql_agent.py | 289 + postgresql_agent/postgresql_agent.Dockerfile | 44 + postgresql_agent/postgresql_agent.py | 289 + search_agent/API_DOCUMENTATION.md | 185 + search_agent/k8s-test-deployment.yaml | 137 + search_agent/search_agent.Dockerfile | 43 + search_agent/search_agent/.env | 19 + .../search_agent/.venv/bin/Activate.ps1 | 247 + search_agent/search_agent/.venv/bin/activate | 70 + .../search_agent/.venv/bin/activate.csh | 27 + .../search_agent/.venv/bin/activate.fish | 69 + search_agent/search_agent/.venv/bin/dotenv | 8 + .../search_agent/.venv/bin/normalizer | 8 + search_agent/search_agent/.venv/bin/pip | 8 + search_agent/search_agent/.venv/bin/pip3 | 8 + search_agent/search_agent/.venv/bin/pip3.12 | 8 + search_agent/search_agent/.venv/bin/python | 1 + search_agent/search_agent/.venv/bin/python3 | 1 + .../search_agent/.venv/bin/python3.12 | 1 + .../typing_extensions.cpython-312.pyc | Bin 0 -> 163747 bytes .../INSTALLER | 1 + .../aiohappyeyeballs-2.6.1.dist-info/LICENSE | 279 + .../aiohappyeyeballs-2.6.1.dist-info/METADATA | 123 + .../aiohappyeyeballs-2.6.1.dist-info/RECORD | 16 + .../aiohappyeyeballs-2.6.1.dist-info/WHEEL | 4 + .../aiohappyeyeballs/__init__.py | 14 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 504 bytes .../__pycache__/_staggered.cpython-312.pyc | Bin 0 -> 8006 bytes .../__pycache__/impl.cpython-312.pyc | Bin 0 -> 10117 bytes .../__pycache__/types.cpython-312.pyc | Bin 0 -> 600 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 3712 bytes .../aiohappyeyeballs/_staggered.py | 207 + .../site-packages/aiohappyeyeballs/impl.py | 259 + .../site-packages/aiohappyeyeballs/py.typed | 0 .../site-packages/aiohappyeyeballs/types.py | 17 + .../site-packages/aiohappyeyeballs/utils.py | 97 + .../aiohttp-3.13.3.dist-info/INSTALLER | 1 + .../aiohttp-3.13.3.dist-info/METADATA | 262 + .../aiohttp-3.13.3.dist-info/RECORD | 139 + .../aiohttp-3.13.3.dist-info/REQUESTED | 0 .../aiohttp-3.13.3.dist-info/WHEEL | 7 + .../licenses/LICENSE.txt | 13 + .../licenses/vendor/llhttp/LICENSE | 22 + .../aiohttp-3.13.3.dist-info/top_level.txt | 1 + .../aiohttp/.hash/_cparser.pxd.hash | 1 + .../aiohttp/.hash/_find_header.pxd.hash | 1 + .../aiohttp/.hash/_http_parser.pyx.hash | 1 + .../aiohttp/.hash/_http_writer.pyx.hash | 1 + .../site-packages/aiohttp/.hash/hdrs.py.hash | 1 + .../site-packages/aiohttp/__init__.py | 278 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5315 bytes .../_cookie_helpers.cpython-312.pyc | Bin 0 -> 10904 bytes .../aiohttp/__pycache__/abc.cpython-312.pyc | Bin 0 -> 12479 bytes .../__pycache__/base_protocol.cpython-312.pyc | Bin 0 -> 4522 bytes .../__pycache__/client.cpython-312.pyc | Bin 0 -> 56389 bytes .../client_exceptions.cpython-312.pyc | Bin 0 -> 17975 bytes ...ent_middleware_digest_auth.cpython-312.pyc | Bin 0 -> 16471 bytes .../client_middlewares.cpython-312.pyc | Bin 0 -> 2275 bytes .../__pycache__/client_proto.cpython-312.pyc | Bin 0 -> 13380 bytes .../__pycache__/client_reqrep.cpython-312.pyc | Bin 0 -> 64555 bytes .../__pycache__/client_ws.cpython-312.pyc | Bin 0 -> 22507 bytes .../compression_utils.cpython-312.pyc | Bin 0 -> 17744 bytes .../__pycache__/connector.cpython-312.pyc | Bin 0 -> 77337 bytes .../__pycache__/cookiejar.cpython-312.pyc | Bin 0 -> 21460 bytes .../__pycache__/formdata.cpython-312.pyc | Bin 0 -> 7617 bytes .../aiohttp/__pycache__/hdrs.cpython-312.pyc | Bin 0 -> 8481 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 0 -> 43204 bytes .../aiohttp/__pycache__/http.cpython-312.pyc | Bin 0 -> 1682 bytes .../http_exceptions.cpython-312.pyc | Bin 0 -> 6360 bytes .../__pycache__/http_parser.cpython-312.pyc | Bin 0 -> 37240 bytes .../http_websocket.cpython-312.pyc | Bin 0 -> 970 bytes .../__pycache__/http_writer.cpython-312.pyc | Bin 0 -> 14532 bytes .../aiohttp/__pycache__/log.cpython-312.pyc | Bin 0 -> 719 bytes .../__pycache__/multipart.cpython-312.pyc | Bin 0 -> 53262 bytes .../__pycache__/payload.cpython-312.pyc | Bin 0 -> 48839 bytes .../payload_streamer.cpython-312.pyc | Bin 0 -> 4407 bytes .../__pycache__/pytest_plugin.cpython-312.pyc | Bin 0 -> 18493 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 0 -> 10929 bytes .../__pycache__/streams.cpython-312.pyc | Bin 0 -> 31944 bytes .../__pycache__/tcp_helpers.cpython-312.pyc | Bin 0 -> 1778 bytes .../__pycache__/test_utils.cpython-312.pyc | Bin 0 -> 34823 bytes .../__pycache__/tracing.cpython-312.pyc | Bin 0 -> 21898 bytes .../__pycache__/typedefs.cpython-312.pyc | Bin 0 -> 2271 bytes .../aiohttp/__pycache__/web.cpython-312.pyc | Bin 0 -> 16177 bytes .../__pycache__/web_app.cpython-312.pyc | Bin 0 -> 27272 bytes .../web_exceptions.cpython-312.pyc | Bin 0 -> 15003 bytes .../web_fileresponse.cpython-312.pyc | Bin 0 -> 17203 bytes .../__pycache__/web_log.cpython-312.pyc | Bin 0 -> 10675 bytes .../web_middlewares.cpython-312.pyc | Bin 0 -> 5627 bytes .../__pycache__/web_protocol.cpython-312.pyc | Bin 0 -> 31252 bytes .../__pycache__/web_request.cpython-312.pyc | Bin 0 -> 38726 bytes .../__pycache__/web_response.cpython-312.pyc | Bin 0 -> 39149 bytes .../__pycache__/web_routedef.cpython-312.pyc | Bin 0 -> 11898 bytes .../__pycache__/web_runner.cpython-312.pyc | Bin 0 -> 19038 bytes .../__pycache__/web_server.cpython-312.pyc | Bin 0 -> 4906 bytes .../web_urldispatcher.cpython-312.pyc | Bin 0 -> 68896 bytes .../__pycache__/web_ws.cpython-312.pyc | Bin 0 -> 31576 bytes .../__pycache__/worker.cpython-312.pyc | Bin 0 -> 12067 bytes .../site-packages/aiohttp/_cookie_helpers.py | 338 + .../site-packages/aiohttp/_cparser.pxd | 158 + .../site-packages/aiohttp/_find_header.pxd | 2 + .../site-packages/aiohttp/_headers.pxi | 83 + ...ttp_parser.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 2833152 bytes .../site-packages/aiohttp/_http_parser.pyx | 835 ++ ...ttp_writer.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 539144 bytes .../site-packages/aiohttp/_http_writer.pyx | 162 + .../aiohttp/_websocket/.hash/mask.pxd.hash | 1 + .../aiohttp/_websocket/.hash/mask.pyx.hash | 1 + .../_websocket/.hash/reader_c.pxd.hash | 1 + .../aiohttp/_websocket/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 242 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 0 -> 5989 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 3452 bytes .../__pycache__/reader.cpython-312.pyc | Bin 0 -> 738 bytes .../__pycache__/reader_c.cpython-312.pyc | Bin 0 -> 17613 bytes .../__pycache__/reader_py.cpython-312.pyc | Bin 0 -> 17614 bytes .../__pycache__/writer.cpython-312.pyc | Bin 0 -> 10371 bytes .../aiohttp/_websocket/helpers.py | 147 + .../mask.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 263512 bytes .../site-packages/aiohttp/_websocket/mask.pxd | 3 + .../site-packages/aiohttp/_websocket/mask.pyx | 48 + .../aiohttp/_websocket/models.py | 84 + .../aiohttp/_websocket/reader.py | 31 + .../reader_c.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 1822128 bytes .../aiohttp/_websocket/reader_c.pxd | 110 + .../aiohttp/_websocket/reader_c.py | 478 + .../aiohttp/_websocket/reader_py.py | 478 + .../aiohttp/_websocket/writer.py | 262 + .../python3.12/site-packages/aiohttp/abc.py | 268 + .../site-packages/aiohttp/base_protocol.py | 100 + .../site-packages/aiohttp/client.py | 1635 +++ .../aiohttp/client_exceptions.py | 421 + .../aiohttp/client_middleware_digest_auth.py | 480 + .../aiohttp/client_middlewares.py | 55 + .../site-packages/aiohttp/client_proto.py | 359 + .../site-packages/aiohttp/client_reqrep.py | 1536 +++ .../site-packages/aiohttp/client_ws.py | 428 + .../aiohttp/compression_utils.py | 348 + .../site-packages/aiohttp/connector.py | 1842 ++++ .../site-packages/aiohttp/cookiejar.py | 522 + .../site-packages/aiohttp/formdata.py | 179 + .../python3.12/site-packages/aiohttp/hdrs.py | 121 + .../site-packages/aiohttp/helpers.py | 986 ++ .../python3.12/site-packages/aiohttp/http.py | 72 + .../site-packages/aiohttp/http_exceptions.py | 116 + .../site-packages/aiohttp/http_parser.py | 1086 ++ .../site-packages/aiohttp/http_websocket.py | 36 + .../site-packages/aiohttp/http_writer.py | 378 + .../python3.12/site-packages/aiohttp/log.py | 8 + .../site-packages/aiohttp/multipart.py | 1152 +++ .../site-packages/aiohttp/payload.py | 1120 +++ .../site-packages/aiohttp/payload_streamer.py | 78 + .../python3.12/site-packages/aiohttp/py.typed | 1 + .../site-packages/aiohttp/pytest_plugin.py | 444 + .../site-packages/aiohttp/resolver.py | 274 + .../site-packages/aiohttp/streams.py | 758 ++ .../site-packages/aiohttp/tcp_helpers.py | 37 + .../site-packages/aiohttp/test_utils.py | 774 ++ .../site-packages/aiohttp/tracing.py | 455 + .../site-packages/aiohttp/typedefs.py | 69 + .../python3.12/site-packages/aiohttp/web.py | 592 ++ .../site-packages/aiohttp/web_app.py | 620 ++ .../site-packages/aiohttp/web_exceptions.py | 452 + .../site-packages/aiohttp/web_fileresponse.py | 418 + .../site-packages/aiohttp/web_log.py | 216 + .../site-packages/aiohttp/web_middlewares.py | 121 + .../site-packages/aiohttp/web_protocol.py | 792 ++ .../site-packages/aiohttp/web_request.py | 914 ++ .../site-packages/aiohttp/web_response.py | 856 ++ .../site-packages/aiohttp/web_routedef.py | 214 + .../site-packages/aiohttp/web_runner.py | 399 + .../site-packages/aiohttp/web_server.py | 84 + .../aiohttp/web_urldispatcher.py | 1305 +++ .../site-packages/aiohttp/web_ws.py | 631 ++ .../site-packages/aiohttp/worker.py | 255 + .../aiosignal-1.4.0.dist-info/INSTALLER | 1 + .../aiosignal-1.4.0.dist-info/METADATA | 112 + .../aiosignal-1.4.0.dist-info/RECORD | 9 + .../aiosignal-1.4.0.dist-info/WHEEL | 5 + .../licenses/LICENSE | 201 + .../aiosignal-1.4.0.dist-info/top_level.txt | 1 + .../site-packages/aiosignal/__init__.py | 59 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2684 bytes .../site-packages/aiosignal/py.typed | 0 .../INSTALLER | 1 + .../asyncio_throttle-1.0.2.dist-info/LICENSE | 21 + .../asyncio_throttle-1.0.2.dist-info/METADATA | 124 + .../asyncio_throttle-1.0.2.dist-info/RECORD | 12 + .../REQUESTED | 0 .../asyncio_throttle-1.0.2.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../asyncio_throttle/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 234 bytes .../__pycache__/throttler.cpython-312.pyc | Bin 0 -> 2204 bytes .../site-packages/asyncio_throttle/py.typed | 0 .../asyncio_throttle/throttler.py | 36 + .../python3.12/site-packages/attr/__init__.py | 104 + .../site-packages/attr/__init__.pyi | 389 + .../attr/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2613 bytes .../attr/__pycache__/_cmp.cpython-312.pyc | Bin 0 -> 5077 bytes .../attr/__pycache__/_compat.cpython-312.pyc | Bin 0 -> 3634 bytes .../attr/__pycache__/_config.cpython-312.pyc | Bin 0 -> 1109 bytes .../attr/__pycache__/_funcs.cpython-312.pyc | Bin 0 -> 14031 bytes .../attr/__pycache__/_make.cpython-312.pyc | Bin 0 -> 107151 bytes .../__pycache__/_next_gen.cpython-312.pyc | Bin 0 -> 26367 bytes .../__pycache__/_version_info.cpython-312.pyc | Bin 0 -> 3418 bytes .../__pycache__/converters.cpython-312.pyc | Bin 0 -> 4627 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 3580 bytes .../attr/__pycache__/filters.cpython-312.pyc | Bin 0 -> 2994 bytes .../attr/__pycache__/setters.cpython-312.pyc | Bin 0 -> 1914 bytes .../__pycache__/validators.cpython-312.pyc | Bin 0 -> 27525 bytes .../lib/python3.12/site-packages/attr/_cmp.py | 160 + .../python3.12/site-packages/attr/_cmp.pyi | 13 + .../python3.12/site-packages/attr/_compat.py | 99 + .../python3.12/site-packages/attr/_config.py | 31 + .../python3.12/site-packages/attr/_funcs.py | 497 + .../python3.12/site-packages/attr/_make.py | 3362 +++++++ .../site-packages/attr/_next_gen.py | 674 ++ .../site-packages/attr/_typing_compat.pyi | 15 + .../site-packages/attr/_version_info.py | 89 + .../site-packages/attr/_version_info.pyi | 9 + .../site-packages/attr/converters.py | 162 + .../site-packages/attr/converters.pyi | 19 + .../site-packages/attr/exceptions.py | 95 + .../site-packages/attr/exceptions.pyi | 17 + .../python3.12/site-packages/attr/filters.py | 72 + .../python3.12/site-packages/attr/filters.pyi | 6 + .../python3.12/site-packages/attr/py.typed | 0 .../python3.12/site-packages/attr/setters.py | 79 + .../python3.12/site-packages/attr/setters.pyi | 20 + .../site-packages/attr/validators.py | 748 ++ .../site-packages/attr/validators.pyi | 140 + .../attrs-25.4.0.dist-info/INSTALLER | 1 + .../attrs-25.4.0.dist-info/METADATA | 235 + .../attrs-25.4.0.dist-info/RECORD | 55 + .../attrs-25.4.0.dist-info/WHEEL | 4 + .../attrs-25.4.0.dist-info/licenses/LICENSE | 21 + .../site-packages/attrs/__init__.py | 72 + .../site-packages/attrs/__init__.pyi | 314 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1210 bytes .../__pycache__/converters.cpython-312.pyc | Bin 0 -> 218 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 218 bytes .../attrs/__pycache__/filters.cpython-312.pyc | Bin 0 -> 212 bytes .../attrs/__pycache__/setters.cpython-312.pyc | Bin 0 -> 212 bytes .../__pycache__/validators.cpython-312.pyc | Bin 0 -> 218 bytes .../site-packages/attrs/converters.py | 3 + .../site-packages/attrs/exceptions.py | 3 + .../python3.12/site-packages/attrs/filters.py | 3 + .../python3.12/site-packages/attrs/py.typed | 0 .../python3.12/site-packages/attrs/setters.py | 3 + .../site-packages/attrs/validators.py | 3 + .../certifi-2026.1.4.dist-info/INSTALLER | 1 + .../certifi-2026.1.4.dist-info/METADATA | 78 + .../certifi-2026.1.4.dist-info/RECORD | 14 + .../certifi-2026.1.4.dist-info/WHEEL | 5 + .../licenses/LICENSE | 20 + .../certifi-2026.1.4.dist-info/top_level.txt | 1 + .../site-packages/certifi/__init__.py | 4 + .../site-packages/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 306 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 621 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 0 -> 2053 bytes .../site-packages/certifi/cacert.pem | 4468 +++++++++ .../python3.12/site-packages/certifi/core.py | 83 + .../python3.12/site-packages/certifi/py.typed | 0 .../INSTALLER | 1 + .../METADATA | 764 ++ .../charset_normalizer-3.4.4.dist-info/RECORD | 35 + .../charset_normalizer-3.4.4.dist-info/WHEEL | 7 + .../entry_points.txt | 2 + .../licenses/LICENSE | 21 + .../top_level.txt | 1 + .../charset_normalizer/__init__.py | 48 + .../charset_normalizer/__main__.py | 6 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1772 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 347 bytes .../__pycache__/api.cpython-312.pyc | Bin 0 -> 18183 bytes .../__pycache__/cd.cpython-312.pyc | Bin 0 -> 13288 bytes .../__pycache__/constant.cpython-312.pyc | Bin 0 -> 40802 bytes .../__pycache__/legacy.cpython-312.pyc | Bin 0 -> 3002 bytes .../__pycache__/md.cpython-312.pyc | Bin 0 -> 24339 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 17119 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 13748 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 374 bytes .../site-packages/charset_normalizer/api.py | 669 ++ .../site-packages/charset_normalizer/cd.py | 395 + .../charset_normalizer/cli/__init__.py | 8 + .../charset_normalizer/cli/__main__.py | 381 + .../cli/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 335 bytes .../cli/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 14396 bytes .../charset_normalizer/constant.py | 2015 ++++ .../charset_normalizer/legacy.py | 80 + .../md.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 15912 bytes .../site-packages/charset_normalizer/md.py | 635 ++ .../md__mypyc.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 290584 bytes .../charset_normalizer/models.py | 360 + .../site-packages/charset_normalizer/py.typed | 0 .../site-packages/charset_normalizer/utils.py | 414 + .../charset_normalizer/version.py | 8 + .../site-packages/dotenv/__init__.py | 51 + .../site-packages/dotenv/__main__.py | 6 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1683 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 351 bytes .../dotenv/__pycache__/cli.cpython-312.pyc | Bin 0 -> 10304 bytes .../__pycache__/ipython.cpython-312.pyc | Bin 0 -> 1967 bytes .../dotenv/__pycache__/main.cpython-312.pyc | Bin 0 -> 18202 bytes .../dotenv/__pycache__/parser.cpython-312.pyc | Bin 0 -> 9977 bytes .../__pycache__/variables.cpython-312.pyc | Bin 0 -> 5024 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 203 bytes .../python3.12/site-packages/dotenv/cli.py | 218 + .../site-packages/dotenv/ipython.py | 50 + .../python3.12/site-packages/dotenv/main.py | 435 + .../python3.12/site-packages/dotenv/parser.py | 182 + .../python3.12/site-packages/dotenv/py.typed | 1 + .../site-packages/dotenv/variables.py | 86 + .../site-packages/dotenv/version.py | 1 + .../frozenlist-1.8.0.dist-info/INSTALLER | 1 + .../frozenlist-1.8.0.dist-info/METADATA | 672 ++ .../frozenlist-1.8.0.dist-info/RECORD | 12 + .../frozenlist-1.8.0.dist-info/WHEEL | 7 + .../licenses/LICENSE | 201 + .../frozenlist-1.8.0.dist-info/top_level.txt | 1 + .../site-packages/frozenlist/__init__.py | 86 + .../site-packages/frozenlist/__init__.pyi | 47 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4059 bytes ...frozenlist.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 786872 bytes .../site-packages/frozenlist/_frozenlist.pyx | 148 + .../site-packages/frozenlist/py.typed | 1 + .../idna-3.11.dist-info/INSTALLER | 1 + .../idna-3.11.dist-info/METADATA | 209 + .../site-packages/idna-3.11.dist-info/RECORD | 22 + .../site-packages/idna-3.11.dist-info/WHEEL | 4 + .../idna-3.11.dist-info/licenses/LICENSE.md | 31 + .../python3.12/site-packages/idna/__init__.py | 45 + .../idna/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 874 bytes .../idna/__pycache__/codec.cpython-312.pyc | Bin 0 -> 4974 bytes .../idna/__pycache__/compat.cpython-312.pyc | Bin 0 -> 878 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 0 -> 16186 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 0 -> 100903 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 0 -> 2626 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 0 -> 205 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 0 -> 161833 bytes .../python3.12/site-packages/idna/codec.py | 122 + .../python3.12/site-packages/idna/compat.py | 15 + .../lib/python3.12/site-packages/idna/core.py | 437 + .../python3.12/site-packages/idna/idnadata.py | 4309 ++++++++ .../site-packages/idna/intranges.py | 57 + .../site-packages/idna/package_data.py | 1 + .../python3.12/site-packages/idna/py.typed | 0 .../site-packages/idna/uts46data.py | 8841 +++++++++++++++++ .../loguru-0.7.3.dist-info/INSTALLER | 1 + .../loguru-0.7.3.dist-info/METADATA | 462 + .../loguru-0.7.3.dist-info/RECORD | 45 + .../loguru-0.7.3.dist-info/REQUESTED | 0 .../loguru-0.7.3.dist-info/WHEEL | 4 + .../site-packages/loguru/__init__.py | 34 + .../site-packages/loguru/__init__.pyi | 368 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1002 bytes .../__pycache__/_asyncio_loop.cpython-312.pyc | Bin 0 -> 1287 bytes .../_better_exceptions.cpython-312.pyc | Bin 0 -> 24648 bytes .../__pycache__/_colorama.cpython-312.pyc | Bin 0 -> 2848 bytes .../__pycache__/_colorizer.cpython-312.pyc | Bin 0 -> 20059 bytes .../__pycache__/_contextvars.cpython-312.pyc | Bin 0 -> 626 bytes .../_ctime_functions.cpython-312.pyc | Bin 0 -> 3068 bytes .../__pycache__/_datetime.cpython-312.pyc | Bin 0 -> 12684 bytes .../__pycache__/_defaults.cpython-312.pyc | Bin 0 -> 3401 bytes .../_error_interceptor.cpython-312.pyc | Bin 0 -> 2079 bytes .../__pycache__/_file_sink.cpython-312.pyc | Bin 0 -> 21592 bytes .../__pycache__/_filters.cpython-312.pyc | Bin 0 -> 994 bytes .../__pycache__/_get_frame.cpython-312.pyc | Bin 0 -> 968 bytes .../__pycache__/_handler.cpython-312.pyc | Bin 0 -> 14985 bytes .../_locks_machinery.cpython-312.pyc | Bin 0 -> 1839 bytes .../__pycache__/_logger.cpython-312.pyc | Bin 0 -> 104083 bytes .../__pycache__/_recattrs.cpython-312.pyc | Bin 0 -> 4553 bytes .../__pycache__/_simple_sinks.cpython-312.pyc | Bin 0 -> 7047 bytes .../_string_parsers.cpython-312.pyc | Bin 0 -> 8023 bytes .../site-packages/loguru/_asyncio_loop.py | 27 + .../loguru/_better_exceptions.py | 573 ++ .../site-packages/loguru/_colorama.py | 67 + .../site-packages/loguru/_colorizer.py | 481 + .../site-packages/loguru/_contextvars.py | 15 + .../site-packages/loguru/_ctime_functions.py | 57 + .../site-packages/loguru/_datetime.py | 160 + .../site-packages/loguru/_defaults.py | 75 + .../loguru/_error_interceptor.py | 34 + .../site-packages/loguru/_file_sink.py | 429 + .../site-packages/loguru/_filters.py | 24 + .../site-packages/loguru/_get_frame.py | 23 + .../site-packages/loguru/_handler.py | 341 + .../site-packages/loguru/_locks_machinery.py | 50 + .../site-packages/loguru/_logger.py | 2139 ++++ .../site-packages/loguru/_recattrs.py | 92 + .../site-packages/loguru/_simple_sinks.py | 129 + .../site-packages/loguru/_string_parsers.py | 185 + .../python3.12/site-packages/loguru/py.typed | 0 .../multidict-6.7.0.dist-info/INSTALLER | 1 + .../multidict-6.7.0.dist-info/METADATA | 149 + .../multidict-6.7.0.dist-info/RECORD | 16 + .../multidict-6.7.0.dist-info/WHEEL | 7 + .../licenses/LICENSE | 13 + .../multidict-6.7.0.dist-info/top_level.txt | 1 + .../site-packages/multidict/__init__.py | 60 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1391 bytes .../__pycache__/_abc.cpython-312.pyc | Bin 0 -> 5537 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 0 -> 653 bytes .../__pycache__/_multidict_py.cpython-312.pyc | Bin 0 -> 65504 bytes .../site-packages/multidict/_abc.py | 73 + .../site-packages/multidict/_compat.py | 15 + ..._multidict.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 848984 bytes .../site-packages/multidict/_multidict_py.py | 1242 +++ .../site-packages/multidict/py.typed | 1 + .../orjson-3.11.5.dist-info/INSTALLER | 1 + .../orjson-3.11.5.dist-info/METADATA | 1137 +++ .../orjson-3.11.5.dist-info/RECORD | 12 + .../orjson-3.11.5.dist-info/REQUESTED | 0 .../orjson-3.11.5.dist-info/WHEEL | 5 + .../licenses/LICENSE-APACHE | 201 + .../licenses/LICENSE-MIT | 23 + .../site-packages/orjson/__init__.py | 28 + .../site-packages/orjson/__init__.pyi | 35 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 609 bytes .../orjson.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 252840 bytes .../python3.12/site-packages/orjson/py.typed | 0 .../pip-24.0.dist-info/AUTHORS.txt | 760 ++ .../pip-24.0.dist-info/INSTALLER | 1 + .../pip-24.0.dist-info/LICENSE.txt | 20 + .../site-packages/pip-24.0.dist-info/METADATA | 88 + .../site-packages/pip-24.0.dist-info/RECORD | 1005 ++ .../pip-24.0.dist-info/REQUESTED | 0 .../site-packages/pip-24.0.dist-info/WHEEL | 5 + .../pip-24.0.dist-info/entry_points.txt | 4 + .../pip-24.0.dist-info/top_level.txt | 1 + .../python3.12/site-packages/pip/__init__.py | 13 + .../python3.12/site-packages/pip/__main__.py | 24 + .../site-packages/pip/__pip-runner__.py | 50 + .../pip/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 684 bytes .../pip/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 840 bytes .../__pip-runner__.cpython-312.pyc | Bin 0 -> 2203 bytes .../site-packages/pip/_internal/__init__.py | 18 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 786 bytes .../__pycache__/build_env.cpython-312.pyc | Bin 0 -> 14293 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 12664 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 0 -> 17665 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 33283 bytes .../__pycache__/main.cpython-312.pyc | Bin 0 -> 669 bytes .../__pycache__/pyproject.cpython-312.pyc | Bin 0 -> 4970 bytes .../self_outdated_check.cpython-312.pyc | Bin 0 -> 10551 bytes .../__pycache__/wheel_builder.cpython-312.pyc | Bin 0 -> 13648 bytes .../site-packages/pip/_internal/build_env.py | 311 + .../site-packages/pip/_internal/cache.py | 290 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 277 bytes .../autocompletion.cpython-312.pyc | Bin 0 -> 8464 bytes .../__pycache__/base_command.cpython-312.pyc | Bin 0 -> 10454 bytes .../__pycache__/cmdoptions.cpython-312.pyc | Bin 0 -> 30373 bytes .../command_context.cpython-312.pyc | Bin 0 -> 1780 bytes .../cli/__pycache__/main.cpython-312.pyc | Bin 0 -> 2297 bytes .../__pycache__/main_parser.cpython-312.pyc | Bin 0 -> 4904 bytes .../cli/__pycache__/parser.cpython-312.pyc | Bin 0 -> 15021 bytes .../__pycache__/progress_bars.cpython-312.pyc | Bin 0 -> 2619 bytes .../__pycache__/req_command.cpython-312.pyc | Bin 0 -> 18851 bytes .../cli/__pycache__/spinners.cpython-312.pyc | Bin 0 -> 7839 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 0 -> 374 bytes .../pip/_internal/cli/autocompletion.py | 172 + .../pip/_internal/cli/base_command.py | 236 + .../pip/_internal/cli/cmdoptions.py | 1074 ++ .../pip/_internal/cli/command_context.py | 27 + .../site-packages/pip/_internal/cli/main.py | 79 + .../pip/_internal/cli/main_parser.py | 134 + .../site-packages/pip/_internal/cli/parser.py | 294 + .../pip/_internal/cli/progress_bars.py | 68 + .../pip/_internal/cli/req_command.py | 505 + .../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 -> 4001 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 9710 bytes .../__pycache__/check.cpython-312.pyc | Bin 0 -> 2089 bytes .../__pycache__/completion.cpython-312.pyc | Bin 0 -> 5191 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 0 -> 13211 bytes .../__pycache__/debug.cpython-312.pyc | Bin 0 -> 10160 bytes .../__pycache__/download.cpython-312.pyc | Bin 0 -> 7588 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 0 -> 4415 bytes .../commands/__pycache__/hash.cpython-312.pyc | Bin 0 -> 2982 bytes .../commands/__pycache__/help.cpython-312.pyc | Bin 0 -> 1672 bytes .../__pycache__/index.cpython-312.pyc | Bin 0 -> 6719 bytes .../__pycache__/inspect.cpython-312.pyc | Bin 0 -> 3974 bytes .../__pycache__/install.cpython-312.pyc | Bin 0 -> 28912 bytes .../commands/__pycache__/list.cpython-312.pyc | Bin 0 -> 15655 bytes .../__pycache__/search.cpython-312.pyc | Bin 0 -> 7620 bytes .../commands/__pycache__/show.cpython-312.pyc | Bin 0 -> 9727 bytes .../__pycache__/uninstall.cpython-312.pyc | Bin 0 -> 4725 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 0 -> 8955 bytes .../pip/_internal/commands/cache.py | 225 + .../pip/_internal/commands/check.py | 54 + .../pip/_internal/commands/completion.py | 130 + .../pip/_internal/commands/configuration.py | 280 + .../pip/_internal/commands/debug.py | 201 + .../pip/_internal/commands/download.py | 147 + .../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 | 774 ++ .../pip/_internal/commands/list.py | 370 + .../pip/_internal/commands/search.py | 174 + .../pip/_internal/commands/show.py | 189 + .../pip/_internal/commands/uninstall.py | 113 + .../pip/_internal/commands/wheel.py | 183 + .../pip/_internal/configuration.py | 383 + .../pip/_internal/distributions/__init__.py | 21 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 940 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 2861 bytes .../__pycache__/installed.cpython-312.pyc | Bin 0 -> 1699 bytes .../__pycache__/sdist.cpython-312.pyc | Bin 0 -> 8487 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 0 -> 2247 bytes .../pip/_internal/distributions/base.py | 51 + .../pip/_internal/distributions/installed.py | 29 + .../pip/_internal/distributions/sdist.py | 156 + .../pip/_internal/distributions/wheel.py | 40 + .../site-packages/pip/_internal/exceptions.py | 728 ++ .../pip/_internal/index/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 231 bytes .../__pycache__/collector.cpython-312.pyc | Bin 0 -> 21885 bytes .../package_finder.cpython-312.pyc | Bin 0 -> 40734 bytes .../index/__pycache__/sources.cpython-312.pyc | Bin 0 -> 12603 bytes .../pip/_internal/index/collector.py | 507 + .../pip/_internal/index/package_finder.py | 1027 ++ .../pip/_internal/index/sources.py | 285 + .../pip/_internal/locations/__init__.py | 467 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 16775 bytes .../__pycache__/_distutils.cpython-312.pyc | Bin 0 -> 6855 bytes .../__pycache__/_sysconfig.cpython-312.pyc | Bin 0 -> 8010 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 3780 bytes .../pip/_internal/locations/_distutils.py | 172 + .../pip/_internal/locations/_sysconfig.py | 213 + .../pip/_internal/locations/base.py | 81 + .../site-packages/pip/_internal/main.py | 12 + .../pip/_internal/metadata/__init__.py | 128 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5881 bytes .../__pycache__/_json.cpython-312.pyc | Bin 0 -> 2874 bytes .../metadata/__pycache__/base.cpython-312.pyc | Bin 0 -> 35711 bytes .../__pycache__/pkg_resources.cpython-312.pyc | Bin 0 -> 15789 bytes .../pip/_internal/metadata/_json.py | 84 + .../pip/_internal/metadata/base.py | 702 ++ .../_internal/metadata/importlib/__init__.py | 6 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 357 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 0 -> 3332 bytes .../__pycache__/_dists.cpython-312.pyc | Bin 0 -> 13424 bytes .../__pycache__/_envs.cpython-312.pyc | Bin 0 -> 11179 bytes .../_internal/metadata/importlib/_compat.py | 55 + .../_internal/metadata/importlib/_dists.py | 227 + .../pip/_internal/metadata/importlib/_envs.py | 189 + .../pip/_internal/metadata/pkg_resources.py | 278 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 265 bytes .../__pycache__/candidate.cpython-312.pyc | Bin 0 -> 1904 bytes .../__pycache__/direct_url.cpython-312.pyc | Bin 0 -> 11198 bytes .../format_control.cpython-312.pyc | Bin 0 -> 4226 bytes .../models/__pycache__/index.cpython-312.pyc | Bin 0 -> 1693 bytes .../installation_report.cpython-312.pyc | Bin 0 -> 2271 bytes .../models/__pycache__/link.cpython-312.pyc | Bin 0 -> 26001 bytes .../models/__pycache__/scheme.cpython-312.pyc | Bin 0 -> 1168 bytes .../__pycache__/search_scope.cpython-312.pyc | Bin 0 -> 5087 bytes .../selection_prefs.cpython-312.pyc | Bin 0 -> 1850 bytes .../__pycache__/target_python.cpython-312.pyc | Bin 0 -> 4953 bytes .../models/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 5779 bytes .../pip/_internal/models/candidate.py | 30 + .../pip/_internal/models/direct_url.py | 235 + .../pip/_internal/models/format_control.py | 78 + .../pip/_internal/models/index.py | 28 + .../_internal/models/installation_report.py | 56 + .../pip/_internal/models/link.py | 579 ++ .../pip/_internal/models/scheme.py | 31 + .../pip/_internal/models/search_scope.py | 132 + .../pip/_internal/models/selection_prefs.py | 51 + .../pip/_internal/models/target_python.py | 122 + .../pip/_internal/models/wheel.py | 92 + .../pip/_internal/network/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 253 bytes .../network/__pycache__/auth.cpython-312.pyc | Bin 0 -> 21995 bytes .../network/__pycache__/cache.cpython-312.pyc | Bin 0 -> 6517 bytes .../__pycache__/download.cpython-312.pyc | Bin 0 -> 8552 bytes .../__pycache__/lazy_wheel.cpython-312.pyc | Bin 0 -> 11662 bytes .../__pycache__/session.cpython-312.pyc | Bin 0 -> 18773 bytes .../network/__pycache__/utils.cpython-312.pyc | Bin 0 -> 2252 bytes .../__pycache__/xmlrpc.cpython-312.pyc | Bin 0 -> 2948 bytes .../pip/_internal/network/auth.py | 561 ++ .../pip/_internal/network/cache.py | 106 + .../pip/_internal/network/download.py | 186 + .../pip/_internal/network/lazy_wheel.py | 210 + .../pip/_internal/network/session.py | 520 + .../pip/_internal/network/utils.py | 96 + .../pip/_internal/network/xmlrpc.py | 62 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 196 bytes .../__pycache__/check.cpython-312.pyc | Bin 0 -> 7578 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 0 -> 10116 bytes .../__pycache__/prepare.cpython-312.pyc | Bin 0 -> 25746 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 202 bytes .../__pycache__/build_tracker.cpython-312.pyc | Bin 0 -> 7822 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 1879 bytes .../metadata_editable.cpython-312.pyc | Bin 0 -> 1913 bytes .../metadata_legacy.cpython-312.pyc | Bin 0 -> 3064 bytes .../build/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 1683 bytes .../wheel_editable.cpython-312.pyc | Bin 0 -> 2024 bytes .../__pycache__/wheel_legacy.cpython-312.pyc | Bin 0 -> 3928 bytes .../operations/build/build_tracker.py | 139 + .../_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 | 187 + .../pip/_internal/operations/freeze.py | 255 + .../_internal/operations/install/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 265 bytes .../editable_legacy.cpython-312.pyc | Bin 0 -> 1816 bytes .../install/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 33858 bytes .../operations/install/editable_legacy.py | 46 + .../pip/_internal/operations/install/wheel.py | 734 ++ .../pip/_internal/operations/prepare.py | 730 ++ .../site-packages/pip/_internal/pyproject.py | 179 + .../pip/_internal/req/__init__.py | 92 + .../req/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3742 bytes .../__pycache__/constructors.cpython-312.pyc | Bin 0 -> 21581 bytes .../req/__pycache__/req_file.cpython-312.pyc | Bin 0 -> 21460 bytes .../__pycache__/req_install.cpython-312.pyc | Bin 0 -> 38413 bytes .../req/__pycache__/req_set.cpython-312.pyc | Bin 0 -> 7217 bytes .../__pycache__/req_uninstall.cpython-312.pyc | Bin 0 -> 32976 bytes .../pip/_internal/req/constructors.py | 576 ++ .../pip/_internal/req/req_file.py | 554 ++ .../pip/_internal/req/req_install.py | 923 ++ .../pip/_internal/req/req_set.py | 119 + .../pip/_internal/req/req_uninstall.py | 649 ++ .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 196 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 1184 bytes .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 203 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 0 -> 22438 bytes .../_internal/resolution/legacy/resolver.py | 598 ++ .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 207 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 8336 bytes .../__pycache__/candidates.cpython-312.pyc | Bin 0 -> 30397 bytes .../__pycache__/factory.cpython-312.pyc | Bin 0 -> 32113 bytes .../found_candidates.cpython-312.pyc | Bin 0 -> 6207 bytes .../__pycache__/provider.cpython-312.pyc | Bin 0 -> 10377 bytes .../__pycache__/reporter.cpython-312.pyc | Bin 0 -> 4934 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 0 -> 11428 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 0 -> 12350 bytes .../_internal/resolution/resolvelib/base.py | 141 + .../resolution/resolvelib/candidates.py | 597 ++ .../resolution/resolvelib/factory.py | 812 ++ .../resolution/resolvelib/found_candidates.py | 155 + .../resolution/resolvelib/provider.py | 255 + .../resolution/resolvelib/reporter.py | 80 + .../resolution/resolvelib/requirements.py | 166 + .../resolution/resolvelib/resolver.py | 317 + .../pip/_internal/self_outdated_check.py | 248 + .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 191 bytes .../__pycache__/_jaraco_text.cpython-312.pyc | Bin 0 -> 4532 bytes .../utils/__pycache__/_log.cpython-312.pyc | Bin 0 -> 1862 bytes .../utils/__pycache__/appdirs.cpython-312.pyc | Bin 0 -> 2406 bytes .../utils/__pycache__/compat.cpython-312.pyc | Bin 0 -> 2209 bytes .../compatibility_tags.cpython-312.pyc | Bin 0 -> 5557 bytes .../__pycache__/datetime.cpython-312.pyc | Bin 0 -> 680 bytes .../__pycache__/deprecation.cpython-312.pyc | Bin 0 -> 4182 bytes .../direct_url_helpers.cpython-312.pyc | Bin 0 -> 3559 bytes .../__pycache__/egg_link.cpython-312.pyc | Bin 0 -> 3222 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 0 -> 2154 bytes .../__pycache__/entrypoints.cpython-312.pyc | Bin 0 -> 3989 bytes .../__pycache__/filesystem.cpython-312.pyc | Bin 0 -> 7454 bytes .../__pycache__/filetypes.cpython-312.pyc | Bin 0 -> 1160 bytes .../utils/__pycache__/glibc.cpython-312.pyc | Bin 0 -> 2338 bytes .../utils/__pycache__/hashes.cpython-312.pyc | Bin 0 -> 7550 bytes .../utils/__pycache__/logging.cpython-312.pyc | Bin 0 -> 13553 bytes .../utils/__pycache__/misc.cpython-312.pyc | Bin 0 -> 34117 bytes .../utils/__pycache__/models.cpython-312.pyc | Bin 0 -> 2708 bytes .../__pycache__/packaging.cpython-312.pyc | Bin 0 -> 2579 bytes .../setuptools_build.cpython-312.pyc | Bin 0 -> 4546 bytes .../__pycache__/subprocess.cpython-312.pyc | Bin 0 -> 8714 bytes .../__pycache__/temp_dir.cpython-312.pyc | Bin 0 -> 12058 bytes .../__pycache__/unpacking.cpython-312.pyc | Bin 0 -> 11104 bytes .../utils/__pycache__/urls.cpython-312.pyc | Bin 0 -> 2401 bytes .../__pycache__/virtualenv.cpython-312.pyc | Bin 0 -> 4476 bytes .../utils/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 5922 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 | 63 + .../pip/_internal/utils/compatibility_tags.py | 165 + .../pip/_internal/utils/datetime.py | 11 + .../pip/_internal/utils/deprecation.py | 120 + .../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 | 153 + .../pip/_internal/utils/filetypes.py | 27 + .../pip/_internal/utils/glibc.py | 88 + .../pip/_internal/utils/hashes.py | 151 + .../pip/_internal/utils/logging.py | 348 + .../site-packages/pip/_internal/utils/misc.py | 783 ++ .../pip/_internal/utils/models.py | 39 + .../pip/_internal/utils/packaging.py | 57 + .../pip/_internal/utils/setuptools_build.py | 146 + .../pip/_internal/utils/subprocess.py | 260 + .../pip/_internal/utils/temp_dir.py | 296 + .../pip/_internal/utils/unpacking.py | 257 + .../site-packages/pip/_internal/utils/urls.py | 62 + .../pip/_internal/utils/virtualenv.py | 104 + .../pip/_internal/utils/wheel.py | 134 + .../pip/_internal/vcs/__init__.py | 15 + .../vcs/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 530 bytes .../vcs/__pycache__/bazaar.cpython-312.pyc | Bin 0 -> 5022 bytes .../vcs/__pycache__/git.cpython-312.pyc | Bin 0 -> 18991 bytes .../vcs/__pycache__/mercurial.cpython-312.pyc | Bin 0 -> 7611 bytes .../__pycache__/subversion.cpython-312.pyc | Bin 0 -> 12483 bytes .../versioncontrol.cpython-312.pyc | Bin 0 -> 29009 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 112 + .../site-packages/pip/_internal/vcs/git.py | 526 + .../pip/_internal/vcs/mercurial.py | 163 + .../pip/_internal/vcs/subversion.py | 324 + .../pip/_internal/vcs/versioncontrol.py | 705 ++ .../pip/_internal/wheel_builder.py | 354 + .../site-packages/pip/_vendor/__init__.py | 121 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4692 bytes .../_vendor/__pycache__/six.cpython-312.pyc | Bin 0 -> 41269 bytes .../typing_extensions.cpython-312.pyc | Bin 0 -> 122049 bytes .../pip/_vendor/cachecontrol/__init__.py | 28 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 902 bytes .../__pycache__/_cmd.cpython-312.pyc | Bin 0 -> 2646 bytes .../__pycache__/adapter.cpython-312.pyc | Bin 0 -> 6464 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 3809 bytes .../__pycache__/controller.cpython-312.pyc | Bin 0 -> 16167 bytes .../__pycache__/filewrapper.cpython-312.pyc | Bin 0 -> 4347 bytes .../__pycache__/heuristics.cpython-312.pyc | Bin 0 -> 6694 bytes .../__pycache__/serialize.cpython-312.pyc | Bin 0 -> 6405 bytes .../__pycache__/wrapper.cpython-312.pyc | Bin 0 -> 1674 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 -> 435 bytes .../__pycache__/file_cache.cpython-312.pyc | Bin 0 -> 7710 bytes .../__pycache__/redis_cache.cpython-312.pyc | Bin 0 -> 2738 bytes .../_vendor/cachecontrol/caches/file_cache.py | 181 + .../cachecontrol/caches/redis_cache.py | 48 + .../pip/_vendor/cachecontrol/controller.py | 494 + .../pip/_vendor/cachecontrol/filewrapper.py | 119 + .../pip/_vendor/cachecontrol/heuristics.py | 154 + .../pip/_vendor/cachecontrol/serialize.py | 206 + .../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 -> 318 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 645 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 0 -> 3327 bytes .../pip/_vendor/certifi/cacert.pem | 4635 +++++++++ .../site-packages/pip/_vendor/certifi/core.py | 119 + .../pip/_vendor/chardet/__init__.py | 115 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4568 bytes .../__pycache__/big5freq.cpython-312.pyc | Bin 0 -> 27199 bytes .../__pycache__/big5prober.cpython-312.pyc | Bin 0 -> 1387 bytes .../chardistribution.cpython-312.pyc | Bin 0 -> 9638 bytes .../charsetgroupprober.cpython-312.pyc | Bin 0 -> 4122 bytes .../__pycache__/charsetprober.cpython-312.pyc | Bin 0 -> 5018 bytes .../codingstatemachine.cpython-312.pyc | Bin 0 -> 3878 bytes .../codingstatemachinedict.cpython-312.pyc | Bin 0 -> 789 bytes .../__pycache__/cp949prober.cpython-312.pyc | Bin 0 -> 1396 bytes .../chardet/__pycache__/enums.cpython-312.pyc | Bin 0 -> 2996 bytes .../__pycache__/escprober.cpython-312.pyc | Bin 0 -> 4566 bytes .../chardet/__pycache__/escsm.cpython-312.pyc | Bin 0 -> 15310 bytes .../__pycache__/eucjpprober.cpython-312.pyc | Bin 0 -> 4383 bytes .../__pycache__/euckrfreq.cpython-312.pyc | Bin 0 -> 12082 bytes .../__pycache__/euckrprober.cpython-312.pyc | Bin 0 -> 1390 bytes .../__pycache__/euctwfreq.cpython-312.pyc | Bin 0 -> 27204 bytes .../__pycache__/euctwprober.cpython-312.pyc | Bin 0 -> 1390 bytes .../__pycache__/gb2312freq.cpython-312.pyc | Bin 0 -> 19126 bytes .../__pycache__/gb2312prober.cpython-312.pyc | Bin 0 -> 1403 bytes .../__pycache__/hebrewprober.cpython-312.pyc | Bin 0 -> 5822 bytes .../__pycache__/jisfreq.cpython-312.pyc | Bin 0 -> 22155 bytes .../__pycache__/johabfreq.cpython-312.pyc | Bin 0 -> 83003 bytes .../__pycache__/johabprober.cpython-312.pyc | Bin 0 -> 1394 bytes .../__pycache__/jpcntx.cpython-312.pyc | Bin 0 -> 39549 bytes .../langbulgarianmodel.cpython-312.pyc | Bin 0 -> 83122 bytes .../langgreekmodel.cpython-312.pyc | Bin 0 -> 76988 bytes .../langhebrewmodel.cpython-312.pyc | Bin 0 -> 77499 bytes .../langhungarianmodel.cpython-312.pyc | Bin 0 -> 83076 bytes .../langrussianmodel.cpython-312.pyc | Bin 0 -> 105251 bytes .../__pycache__/langthaimodel.cpython-312.pyc | Bin 0 -> 77677 bytes .../langturkishmodel.cpython-312.pyc | Bin 0 -> 77516 bytes .../__pycache__/latin1prober.cpython-312.pyc | Bin 0 -> 7002 bytes .../macromanprober.cpython-312.pyc | Bin 0 -> 7182 bytes .../mbcharsetprober.cpython-312.pyc | Bin 0 -> 3903 bytes .../mbcsgroupprober.cpython-312.pyc | Bin 0 -> 1588 bytes .../__pycache__/mbcssm.cpython-312.pyc | Bin 0 -> 38645 bytes .../__pycache__/resultdict.cpython-312.pyc | Bin 0 -> 632 bytes .../sbcharsetprober.cpython-312.pyc | Bin 0 -> 6387 bytes .../sbcsgroupprober.cpython-312.pyc | Bin 0 -> 2357 bytes .../__pycache__/sjisprober.cpython-312.pyc | Bin 0 -> 4495 bytes .../universaldetector.cpython-312.pyc | Bin 0 -> 12269 bytes .../__pycache__/utf1632prober.cpython-312.pyc | Bin 0 -> 9979 bytes .../__pycache__/utf8prober.cpython-312.pyc | Bin 0 -> 3175 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 488 bytes .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 261 + .../pip/_vendor/chardet/charsetgroupprober.py | 106 + .../pip/_vendor/chardet/charsetprober.py | 147 + .../pip/_vendor/chardet/cli/__init__.py | 0 .../cli/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 195 bytes .../__pycache__/chardetect.cpython-312.pyc | Bin 0 -> 4012 bytes .../pip/_vendor/chardet/cli/chardetect.py | 112 + .../pip/_vendor/chardet/codingstatemachine.py | 90 + .../_vendor/chardet/codingstatemachinedict.py | 19 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 85 + .../pip/_vendor/chardet/escprober.py | 102 + .../pip/_vendor/chardet/escsm.py | 261 + .../pip/_vendor/chardet/eucjpprober.py | 102 + .../pip/_vendor/chardet/euckrfreq.py | 196 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 388 + .../pip/_vendor/chardet/euctwprober.py | 47 + .../pip/_vendor/chardet/gb2312freq.py | 284 + .../pip/_vendor/chardet/gb2312prober.py | 47 + .../pip/_vendor/chardet/hebrewprober.py | 316 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/johabfreq.py | 2382 +++++ .../pip/_vendor/chardet/johabprober.py | 47 + .../pip/_vendor/chardet/jpcntx.py | 238 + .../pip/_vendor/chardet/langbulgarianmodel.py | 4649 +++++++++ .../pip/_vendor/chardet/langgreekmodel.py | 4397 ++++++++ .../pip/_vendor/chardet/langhebrewmodel.py | 4380 ++++++++ .../pip/_vendor/chardet/langhungarianmodel.py | 4649 +++++++++ .../pip/_vendor/chardet/langrussianmodel.py | 5725 +++++++++++ .../pip/_vendor/chardet/langthaimodel.py | 4380 ++++++++ .../pip/_vendor/chardet/langturkishmodel.py | 4380 ++++++++ .../pip/_vendor/chardet/latin1prober.py | 147 + .../pip/_vendor/chardet/macromanprober.py | 162 + .../pip/_vendor/chardet/mbcharsetprober.py | 95 + .../pip/_vendor/chardet/mbcsgroupprober.py | 57 + .../pip/_vendor/chardet/mbcssm.py | 661 ++ .../pip/_vendor/chardet/metadata/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 200 bytes .../__pycache__/languages.cpython-312.pyc | Bin 0 -> 9755 bytes .../pip/_vendor/chardet/metadata/languages.py | 352 + .../pip/_vendor/chardet/resultdict.py | 16 + .../pip/_vendor/chardet/sbcharsetprober.py | 162 + .../pip/_vendor/chardet/sbcsgroupprober.py | 88 + .../pip/_vendor/chardet/sjisprober.py | 105 + .../pip/_vendor/chardet/universaldetector.py | 362 + .../pip/_vendor/chardet/utf1632prober.py | 225 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 7 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 492 bytes .../colorama/__pycache__/ansi.cpython-312.pyc | Bin 0 -> 3950 bytes .../__pycache__/ansitowin32.cpython-312.pyc | Bin 0 -> 16421 bytes .../__pycache__/initialise.cpython-312.pyc | Bin 0 -> 3550 bytes .../__pycache__/win32.cpython-312.pyc | Bin 0 -> 8126 bytes .../__pycache__/winterm.cpython-312.pyc | Bin 0 -> 9088 bytes .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 277 + .../pip/_vendor/colorama/initialise.py | 121 + .../pip/_vendor/colorama/tests/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 198 bytes .../__pycache__/ansi_test.cpython-312.pyc | Bin 0 -> 5467 bytes .../ansitowin32_test.cpython-312.pyc | Bin 0 -> 18103 bytes .../initialise_test.cpython-312.pyc | Bin 0 -> 11748 bytes .../__pycache__/isatty_test.cpython-312.pyc | Bin 0 -> 4904 bytes .../tests/__pycache__/utils.cpython-312.pyc | Bin 0 -> 2488 bytes .../__pycache__/winterm_test.cpython-312.pyc | Bin 0 -> 6612 bytes .../pip/_vendor/colorama/tests/ansi_test.py | 76 + .../colorama/tests/ansitowin32_test.py | 294 + .../_vendor/colorama/tests/initialise_test.py | 189 + .../pip/_vendor/colorama/tests/isatty_test.py | 57 + .../pip/_vendor/colorama/tests/utils.py | 49 + .../_vendor/colorama/tests/winterm_test.py | 131 + .../pip/_vendor/colorama/win32.py | 180 + .../pip/_vendor/colorama/winterm.py | 195 + .../pip/_vendor/distlib/__init__.py | 33 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1269 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 45605 bytes .../__pycache__/database.cpython-312.pyc | Bin 0 -> 66027 bytes .../distlib/__pycache__/index.cpython-312.pyc | Bin 0 -> 24366 bytes .../__pycache__/locators.cpython-312.pyc | Bin 0 -> 60158 bytes .../__pycache__/manifest.cpython-312.pyc | Bin 0 -> 15125 bytes .../__pycache__/markers.cpython-312.pyc | Bin 0 -> 7682 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 41799 bytes .../__pycache__/resources.cpython-312.pyc | Bin 0 -> 17325 bytes .../__pycache__/scripts.cpython-312.pyc | Bin 0 -> 19580 bytes .../distlib/__pycache__/util.cpython-312.pyc | Bin 0 -> 88256 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 30366 bytes .../distlib/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 51861 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 | 452 + .../site-packages/pip/_vendor/distlib/util.py | 2025 ++++ .../pip/_vendor/distlib/version.py | 751 ++ .../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 -> 960 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 292 bytes .../distro/__pycache__/distro.cpython-312.pyc | Bin 0 -> 53754 bytes .../pip/_vendor/distro/distro.py | 1399 +++ .../pip/_vendor/idna/__init__.py | 44 + .../idna/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 881 bytes .../idna/__pycache__/codec.cpython-312.pyc | Bin 0 -> 4633 bytes .../idna/__pycache__/compat.cpython-312.pyc | Bin 0 -> 887 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 0 -> 16023 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 0 -> 99497 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 0 -> 2638 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 0 -> 216 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 0 -> 158870 bytes .../site-packages/pip/_vendor/idna/codec.py | 112 + .../site-packages/pip/_vendor/idna/compat.py | 13 + .../site-packages/pip/_vendor/idna/core.py | 400 + .../pip/_vendor/idna/idnadata.py | 4246 ++++++++ .../pip/_vendor/idna/intranges.py | 54 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8600 ++++++++++++++++ .../pip/_vendor/msgpack/__init__.py | 57 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1831 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 2025 bytes .../msgpack/__pycache__/ext.cpython-312.pyc | Bin 0 -> 8668 bytes .../__pycache__/fallback.cpython-312.pyc | Bin 0 -> 43576 bytes .../pip/_vendor/msgpack/exceptions.py | 48 + .../site-packages/pip/_vendor/msgpack/ext.py | 193 + .../pip/_vendor/msgpack/fallback.py | 1010 ++ .../pip/_vendor/packaging/__about__.py | 26 + .../pip/_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-312.pyc | Bin 0 -> 630 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 466 bytes .../__pycache__/_manylinux.cpython-312.pyc | Bin 0 -> 12076 bytes .../__pycache__/_musllinux.cpython-312.pyc | Bin 0 -> 6910 bytes .../__pycache__/_structures.cpython-312.pyc | Bin 0 -> 3241 bytes .../__pycache__/markers.cpython-312.pyc | Bin 0 -> 14058 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 0 -> 6946 bytes .../__pycache__/specifiers.cpython-312.pyc | Bin 0 -> 31247 bytes .../__pycache__/tags.cpython-312.pyc | Bin 0 -> 18956 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 5868 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 19939 bytes .../pip/_vendor/packaging/_manylinux.py | 301 + .../pip/_vendor/packaging/_musllinux.py | 136 + .../pip/_vendor/packaging/_structures.py | 61 + .../pip/_vendor/packaging/markers.py | 304 + .../pip/_vendor/packaging/requirements.py | 146 + .../pip/_vendor/packaging/specifiers.py | 802 ++ .../pip/_vendor/packaging/tags.py | 487 + .../pip/_vendor/packaging/utils.py | 136 + .../pip/_vendor/packaging/version.py | 504 + .../pip/_vendor/pkg_resources/__init__.py | 3361 +++++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 146474 bytes .../pip/_vendor/platformdirs/__init__.py | 566 ++ .../pip/_vendor/platformdirs/__main__.py | 53 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 18029 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 1946 bytes .../__pycache__/android.cpython-312.pyc | Bin 0 -> 9444 bytes .../__pycache__/api.cpython-312.pyc | Bin 0 -> 9672 bytes .../__pycache__/macos.cpython-312.pyc | Bin 0 -> 5637 bytes .../__pycache__/unix.cpython-312.pyc | Bin 0 -> 12441 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 311 bytes .../__pycache__/windows.cpython-312.pyc | Bin 0 -> 12999 bytes .../pip/_vendor/platformdirs/android.py | 210 + .../pip/_vendor/platformdirs/api.py | 223 + .../pip/_vendor/platformdirs/macos.py | 91 + .../pip/_vendor/platformdirs/unix.py | 223 + .../pip/_vendor/platformdirs/version.py | 4 + .../pip/_vendor/platformdirs/windows.py | 255 + .../pip/_vendor/pygments/__init__.py | 82 + .../pip/_vendor/pygments/__main__.py | 17 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3489 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 735 bytes .../__pycache__/cmdline.cpython-312.pyc | Bin 0 -> 26606 bytes .../__pycache__/console.cpython-312.pyc | Bin 0 -> 2627 bytes .../__pycache__/filter.cpython-312.pyc | Bin 0 -> 3233 bytes .../__pycache__/formatter.cpython-312.pyc | Bin 0 -> 4570 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 0 -> 38330 bytes .../__pycache__/modeline.cpython-312.pyc | Bin 0 -> 1569 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 0 -> 3397 bytes .../__pycache__/regexopt.cpython-312.pyc | Bin 0 -> 4082 bytes .../__pycache__/scanner.cpython-312.pyc | Bin 0 -> 4757 bytes .../__pycache__/sphinxext.cpython-312.pyc | Bin 0 -> 11047 bytes .../__pycache__/style.cpython-312.pyc | Bin 0 -> 6675 bytes .../__pycache__/token.cpython-312.pyc | Bin 0 -> 8143 bytes .../__pycache__/unistring.cpython-312.pyc | Bin 0 -> 32989 bytes .../pygments/__pycache__/util.cpython-312.pyc | Bin 0 -> 13982 bytes .../pip/_vendor/pygments/cmdline.py | 668 ++ .../pip/_vendor/pygments/console.py | 70 + .../pip/_vendor/pygments/filter.py | 71 + .../pip/_vendor/pygments/filters/__init__.py | 940 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 37937 bytes .../pip/_vendor/pygments/formatter.py | 124 + .../_vendor/pygments/formatters/__init__.py | 158 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6927 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 4216 bytes .../__pycache__/bbcode.cpython-312.pyc | Bin 0 -> 4195 bytes .../__pycache__/groff.cpython-312.pyc | Bin 0 -> 7265 bytes .../__pycache__/html.cpython-312.pyc | Bin 0 -> 40573 bytes .../__pycache__/img.cpython-312.pyc | Bin 0 -> 27044 bytes .../__pycache__/irc.cpython-312.pyc | Bin 0 -> 6066 bytes .../__pycache__/latex.cpython-312.pyc | Bin 0 -> 19955 bytes .../__pycache__/other.cpython-312.pyc | Bin 0 -> 6885 bytes .../__pycache__/pangomarkup.cpython-312.pyc | Bin 0 -> 2931 bytes .../__pycache__/rtf.cpython-312.pyc | Bin 0 -> 6127 bytes .../__pycache__/svg.cpython-312.pyc | Bin 0 -> 9067 bytes .../__pycache__/terminal.cpython-312.pyc | Bin 0 -> 5830 bytes .../__pycache__/terminal256.cpython-312.pyc | Bin 0 -> 15158 bytes .../_vendor/pygments/formatters/_mapping.py | 23 + .../pip/_vendor/pygments/formatters/bbcode.py | 108 + .../pip/_vendor/pygments/formatters/groff.py | 170 + .../pip/_vendor/pygments/formatters/html.py | 989 ++ .../pip/_vendor/pygments/formatters/img.py | 645 ++ .../pip/_vendor/pygments/formatters/irc.py | 154 + .../pip/_vendor/pygments/formatters/latex.py | 521 + .../pip/_vendor/pygments/formatters/other.py | 161 + .../pygments/formatters/pangomarkup.py | 83 + .../pip/_vendor/pygments/formatters/rtf.py | 146 + .../pip/_vendor/pygments/formatters/svg.py | 188 + .../_vendor/pygments/formatters/terminal.py | 127 + .../pygments/formatters/terminal256.py | 338 + .../pip/_vendor/pygments/lexer.py | 943 ++ .../pip/_vendor/pygments/lexers/__init__.py | 362 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 14653 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 64405 bytes .../lexers/__pycache__/python.cpython-312.pyc | Bin 0 -> 42640 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 559 ++ .../pip/_vendor/pygments/lexers/python.py | 1198 +++ .../pip/_vendor/pygments/modeline.py | 43 + .../pip/_vendor/pygments/plugin.py | 88 + .../pip/_vendor/pygments/regexopt.py | 91 + .../pip/_vendor/pygments/scanner.py | 104 + .../pip/_vendor/pygments/sphinxext.py | 217 + .../pip/_vendor/pygments/style.py | 197 + .../pip/_vendor/pygments/styles/__init__.py | 103 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4449 bytes .../pip/_vendor/pygments/token.py | 213 + .../pip/_vendor/pygments/unistring.py | 153 + .../pip/_vendor/pygments/util.py | 330 + .../pip/_vendor/pyparsing/__init__.py | 322 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 7912 bytes .../__pycache__/actions.cpython-312.pyc | Bin 0 -> 8396 bytes .../__pycache__/common.cpython-312.pyc | Bin 0 -> 13415 bytes .../__pycache__/core.cpython-312.pyc | Bin 0 -> 267709 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 12995 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 0 -> 48502 bytes .../__pycache__/results.cpython-312.pyc | Bin 0 -> 34111 bytes .../__pycache__/testing.cpython-312.pyc | Bin 0 -> 17189 bytes .../__pycache__/unicode.cpython-312.pyc | Bin 0 -> 13185 bytes .../__pycache__/util.cpython-312.pyc | Bin 0 -> 14905 bytes .../pip/_vendor/pyparsing/actions.py | 217 + .../pip/_vendor/pyparsing/common.py | 432 + .../pip/_vendor/pyparsing/core.py | 6115 ++++++++++++ .../pip/_vendor/pyparsing/diagram/__init__.py | 656 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 26814 bytes .../pip/_vendor/pyparsing/exceptions.py | 299 + .../pip/_vendor/pyparsing/helpers.py | 1100 ++ .../pip/_vendor/pyparsing/results.py | 796 ++ .../pip/_vendor/pyparsing/testing.py | 331 + .../pip/_vendor/pyparsing/unicode.py | 361 + .../pip/_vendor/pyparsing/util.py | 284 + .../pip/_vendor/pyproject_hooks/__init__.py | 23 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 614 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 0 -> 375 bytes .../__pycache__/_impl.cpython-312.pyc | Bin 0 -> 14726 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 -> 1081 bytes .../__pycache__/_in_process.cpython-312.pyc | Bin 0 -> 14398 bytes .../_in_process/_in_process.py | 353 + .../pip/_vendor/requests/__init__.py | 182 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5454 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 0 -> 585 bytes .../_internal_utils.cpython-312.pyc | Bin 0 -> 2025 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 0 -> 21281 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 0 -> 7205 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 0 -> 13924 bytes .../__pycache__/certs.cpython-312.pyc | Bin 0 -> 923 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 1508 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 0 -> 25247 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 7048 bytes .../requests/__pycache__/help.cpython-312.pyc | Bin 0 -> 4313 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 0 -> 1053 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 35449 bytes .../__pycache__/packages.cpython-312.pyc | Bin 0 -> 773 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 0 -> 27758 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 0 -> 5960 bytes .../__pycache__/structures.cpython-312.pyc | Bin 0 -> 5618 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 36076 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 50 + .../pip/_vendor/requests/adapters.py | 538 + .../site-packages/pip/_vendor/requests/api.py | 157 + .../pip/_vendor/requests/auth.py | 315 + .../pip/_vendor/requests/certs.py | 24 + .../pip/_vendor/requests/compat.py | 67 + .../pip/_vendor/requests/cookies.py | 561 ++ .../pip/_vendor/requests/exceptions.py | 141 + .../pip/_vendor/requests/help.py | 131 + .../pip/_vendor/requests/hooks.py | 33 + .../pip/_vendor/requests/models.py | 1034 ++ .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 833 ++ .../pip/_vendor/requests/status_codes.py | 128 + .../pip/_vendor/requests/structures.py | 99 + .../pip/_vendor/requests/utils.py | 1088 ++ .../pip/_vendor/resolvelib/__init__.py | 26 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 635 bytes .../__pycache__/providers.cpython-312.pyc | Bin 0 -> 6852 bytes .../__pycache__/reporters.cpython-312.pyc | Bin 0 -> 2655 bytes .../__pycache__/resolvers.cpython-312.pyc | Bin 0 -> 25898 bytes .../__pycache__/structs.cpython-312.pyc | Bin 0 -> 10507 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 201 bytes .../collections_abc.cpython-312.pyc | Bin 0 -> 421 bytes .../resolvelib/compat/collections_abc.py | 6 + .../pip/_vendor/resolvelib/providers.py | 133 + .../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 | 274 + .../rich/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 7016 bytes .../rich/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 10305 bytes .../__pycache__/_cell_widths.cpython-312.pyc | Bin 0 -> 7822 bytes .../__pycache__/_emoji_codes.cpython-312.pyc | Bin 0 -> 205977 bytes .../_emoji_replace.cpython-312.pyc | Bin 0 -> 1730 bytes .../_export_format.cpython-312.pyc | Bin 0 -> 2322 bytes .../__pycache__/_extension.cpython-312.pyc | Bin 0 -> 538 bytes .../rich/__pycache__/_fileno.cpython-312.pyc | Bin 0 -> 856 bytes .../rich/__pycache__/_inspect.cpython-312.pyc | Bin 0 -> 12078 bytes .../__pycache__/_log_render.cpython-312.pyc | Bin 0 -> 4148 bytes .../rich/__pycache__/_loop.cpython-312.pyc | Bin 0 -> 1886 bytes .../__pycache__/_null_file.cpython-312.pyc | Bin 0 -> 3621 bytes .../__pycache__/_palettes.cpython-312.pyc | Bin 0 -> 5161 bytes .../rich/__pycache__/_pick.cpython-312.pyc | Bin 0 -> 727 bytes .../rich/__pycache__/_ratio.cpython-312.pyc | Bin 0 -> 6580 bytes .../__pycache__/_spinners.cpython-312.pyc | Bin 0 -> 13180 bytes .../rich/__pycache__/_stack.cpython-312.pyc | Bin 0 -> 966 bytes .../rich/__pycache__/_timer.cpython-312.pyc | Bin 0 -> 866 bytes .../_win32_console.cpython-312.pyc | Bin 0 -> 28977 bytes .../rich/__pycache__/_windows.cpython-312.pyc | Bin 0 -> 2491 bytes .../_windows_renderer.cpython-312.pyc | Bin 0 -> 3574 bytes .../rich/__pycache__/_wrap.cpython-312.pyc | Bin 0 -> 2361 bytes .../rich/__pycache__/abc.cpython-312.pyc | Bin 0 -> 1609 bytes .../rich/__pycache__/align.cpython-312.pyc | Bin 0 -> 12323 bytes .../rich/__pycache__/ansi.cpython-312.pyc | Bin 0 -> 9107 bytes .../rich/__pycache__/bar.cpython-312.pyc | Bin 0 -> 4273 bytes .../rich/__pycache__/box.cpython-312.pyc | Bin 0 -> 11859 bytes .../rich/__pycache__/cells.cpython-312.pyc | Bin 0 -> 5619 bytes .../rich/__pycache__/color.cpython-312.pyc | Bin 0 -> 26571 bytes .../__pycache__/color_triplet.cpython-312.pyc | Bin 0 -> 1702 bytes .../rich/__pycache__/columns.cpython-312.pyc | Bin 0 -> 8588 bytes .../rich/__pycache__/console.cpython-312.pyc | Bin 0 -> 113794 bytes .../__pycache__/constrain.cpython-312.pyc | Bin 0 -> 2259 bytes .../__pycache__/containers.cpython-312.pyc | Bin 0 -> 9227 bytes .../rich/__pycache__/control.cpython-312.pyc | Bin 0 -> 10930 bytes .../default_styles.cpython-312.pyc | Bin 0 -> 10374 bytes .../rich/__pycache__/diagnose.cpython-312.pyc | Bin 0 -> 1488 bytes .../rich/__pycache__/emoji.cpython-312.pyc | Bin 0 -> 4210 bytes .../rich/__pycache__/errors.cpython-312.pyc | Bin 0 -> 1846 bytes .../__pycache__/file_proxy.cpython-312.pyc | Bin 0 -> 3578 bytes .../rich/__pycache__/filesize.cpython-312.pyc | Bin 0 -> 3083 bytes .../__pycache__/highlighter.cpython-312.pyc | Bin 0 -> 9899 bytes .../rich/__pycache__/json.cpython-312.pyc | Bin 0 -> 6036 bytes .../rich/__pycache__/jupyter.cpython-312.pyc | Bin 0 -> 5210 bytes .../rich/__pycache__/layout.cpython-312.pyc | Bin 0 -> 20221 bytes .../rich/__pycache__/live.cpython-312.pyc | Bin 0 -> 19144 bytes .../__pycache__/live_render.cpython-312.pyc | Bin 0 -> 4895 bytes .../rich/__pycache__/logging.cpython-312.pyc | Bin 0 -> 13555 bytes .../rich/__pycache__/markup.cpython-312.pyc | Bin 0 -> 9299 bytes .../rich/__pycache__/measure.cpython-312.pyc | Bin 0 -> 6377 bytes .../rich/__pycache__/padding.cpython-312.pyc | Bin 0 -> 7135 bytes .../rich/__pycache__/pager.cpython-312.pyc | Bin 0 -> 1821 bytes .../rich/__pycache__/palette.cpython-312.pyc | Bin 0 -> 5315 bytes .../rich/__pycache__/panel.cpython-312.pyc | Bin 0 -> 12098 bytes .../rich/__pycache__/pretty.cpython-312.pyc | Bin 0 -> 40057 bytes .../rich/__pycache__/progress.cpython-312.pyc | Bin 0 -> 75079 bytes .../__pycache__/progress_bar.cpython-312.pyc | Bin 0 -> 10390 bytes .../rich/__pycache__/prompt.cpython-312.pyc | Bin 0 -> 14782 bytes .../rich/__pycache__/protocol.cpython-312.pyc | Bin 0 -> 1793 bytes .../rich/__pycache__/region.cpython-312.pyc | Bin 0 -> 568 bytes .../rich/__pycache__/repr.cpython-312.pyc | Bin 0 -> 6627 bytes .../rich/__pycache__/rule.cpython-312.pyc | Bin 0 -> 6569 bytes .../rich/__pycache__/scope.cpython-312.pyc | Bin 0 -> 3831 bytes .../rich/__pycache__/screen.cpython-312.pyc | Bin 0 -> 2485 bytes .../rich/__pycache__/segment.cpython-312.pyc | Bin 0 -> 28162 bytes .../rich/__pycache__/spinner.cpython-312.pyc | Bin 0 -> 6065 bytes .../rich/__pycache__/status.cpython-312.pyc | Bin 0 -> 6069 bytes .../rich/__pycache__/style.cpython-312.pyc | Bin 0 -> 33515 bytes .../rich/__pycache__/styled.cpython-312.pyc | Bin 0 -> 2140 bytes .../rich/__pycache__/syntax.cpython-312.pyc | Bin 0 -> 39613 bytes .../rich/__pycache__/table.cpython-312.pyc | Bin 0 -> 43585 bytes .../terminal_theme.cpython-312.pyc | Bin 0 -> 3349 bytes .../rich/__pycache__/text.cpython-312.pyc | Bin 0 -> 58964 bytes .../rich/__pycache__/theme.cpython-312.pyc | Bin 0 -> 6341 bytes .../rich/__pycache__/themes.cpython-312.pyc | Bin 0 -> 315 bytes .../__pycache__/traceback.cpython-312.pyc | Bin 0 -> 31549 bytes .../rich/__pycache__/tree.cpython-312.pyc | Bin 0 -> 11440 bytes .../pip/_vendor/rich/_cell_widths.py | 451 + .../pip/_vendor/rich/_emoji_codes.py | 3610 +++++++ .../pip/_vendor/rich/_emoji_replace.py | 32 + .../pip/_vendor/rich/_export_format.py | 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 | 160 + .../pip/_vendor/rich/_spinners.py | 482 + .../site-packages/pip/_vendor/rich/_stack.py | 16 + .../site-packages/pip/_vendor/rich/_timer.py | 19 + .../pip/_vendor/rich/_win32_console.py | 662 ++ .../pip/_vendor/rich/_windows.py | 72 + .../pip/_vendor/rich/_windows_renderer.py | 56 + .../site-packages/pip/_vendor/rich/_wrap.py | 56 + .../site-packages/pip/_vendor/rich/abc.py | 33 + .../site-packages/pip/_vendor/rich/align.py | 311 + .../site-packages/pip/_vendor/rich/ansi.py | 240 + .../site-packages/pip/_vendor/rich/bar.py | 94 + .../site-packages/pip/_vendor/rich/box.py | 517 + .../site-packages/pip/_vendor/rich/cells.py | 154 + .../site-packages/pip/_vendor/rich/color.py | 622 ++ .../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 | 140 + .../site-packages/pip/_vendor/rich/jupyter.py | 101 + .../site-packages/pip/_vendor/rich/layout.py | 443 + .../site-packages/pip/_vendor/rich/live.py | 375 + .../pip/_vendor/rich/live_render.py | 113 + .../site-packages/pip/_vendor/rich/logging.py | 289 + .../site-packages/pip/_vendor/rich/markup.py | 246 + .../site-packages/pip/_vendor/rich/measure.py | 151 + .../site-packages/pip/_vendor/rich/padding.py | 141 + .../site-packages/pip/_vendor/rich/pager.py | 34 + .../site-packages/pip/_vendor/rich/palette.py | 100 + .../site-packages/pip/_vendor/rich/panel.py | 308 + .../site-packages/pip/_vendor/rich/pretty.py | 994 ++ .../pip/_vendor/rich/progress.py | 1702 ++++ .../pip/_vendor/rich/progress_bar.py | 224 + .../site-packages/pip/_vendor/rich/prompt.py | 376 + .../pip/_vendor/rich/protocol.py | 42 + .../site-packages/pip/_vendor/rich/region.py | 10 + .../site-packages/pip/_vendor/rich/repr.py | 149 + .../site-packages/pip/_vendor/rich/rule.py | 130 + .../site-packages/pip/_vendor/rich/scope.py | 86 + .../site-packages/pip/_vendor/rich/screen.py | 54 + .../site-packages/pip/_vendor/rich/segment.py | 739 ++ .../site-packages/pip/_vendor/rich/spinner.py | 137 + .../site-packages/pip/_vendor/rich/status.py | 132 + .../site-packages/pip/_vendor/rich/style.py | 796 ++ .../site-packages/pip/_vendor/rich/styled.py | 42 + .../site-packages/pip/_vendor/rich/syntax.py | 948 ++ .../site-packages/pip/_vendor/rich/table.py | 1002 ++ .../pip/_vendor/rich/terminal_theme.py | 153 + .../site-packages/pip/_vendor/rich/text.py | 1307 +++ .../site-packages/pip/_vendor/rich/theme.py | 115 + .../site-packages/pip/_vendor/rich/themes.py | 5 + .../pip/_vendor/rich/traceback.py | 756 ++ .../site-packages/pip/_vendor/rich/tree.py | 251 + .../site-packages/pip/_vendor/six.py | 998 ++ .../pip/_vendor/tenacity/__init__.py | 608 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 27087 bytes .../__pycache__/_asyncio.cpython-312.pyc | Bin 0 -> 4807 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 0 -> 2316 bytes .../__pycache__/after.cpython-312.pyc | Bin 0 -> 1625 bytes .../__pycache__/before.cpython-312.pyc | Bin 0 -> 1465 bytes .../__pycache__/before_sleep.cpython-312.pyc | Bin 0 -> 2303 bytes .../tenacity/__pycache__/nap.cpython-312.pyc | Bin 0 -> 1413 bytes .../__pycache__/retry.cpython-312.pyc | Bin 0 -> 14282 bytes .../tenacity/__pycache__/stop.cpython-312.pyc | Bin 0 -> 5569 bytes .../__pycache__/tornadoweb.cpython-312.pyc | Bin 0 -> 2587 bytes .../tenacity/__pycache__/wait.cpython-312.pyc | Bin 0 -> 12414 bytes .../pip/_vendor/tenacity/_asyncio.py | 94 + .../pip/_vendor/tenacity/_utils.py | 76 + .../pip/_vendor/tenacity/after.py | 51 + .../pip/_vendor/tenacity/before.py | 46 + .../pip/_vendor/tenacity/before_sleep.py | 71 + .../site-packages/pip/_vendor/tenacity/nap.py | 43 + .../pip/_vendor/tenacity/retry.py | 272 + .../pip/_vendor/tenacity/stop.py | 103 + .../pip/_vendor/tenacity/tornadoweb.py | 59 + .../pip/_vendor/tenacity/wait.py | 228 + .../pip/_vendor/tomli/__init__.py | 11 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 385 bytes .../tomli/__pycache__/_parser.cpython-312.pyc | Bin 0 -> 26928 bytes .../tomli/__pycache__/_re.cpython-312.pyc | Bin 0 -> 3909 bytes .../tomli/__pycache__/_types.cpython-312.pyc | Bin 0 -> 367 bytes .../pip/_vendor/tomli/_parser.py | 691 ++ .../site-packages/pip/_vendor/tomli/_re.py | 107 + .../site-packages/pip/_vendor/tomli/_types.py | 10 + .../pip/_vendor/truststore/__init__.py | 13 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 619 bytes .../__pycache__/_api.cpython-312.pyc | Bin 0 -> 15798 bytes .../__pycache__/_macos.cpython-312.pyc | Bin 0 -> 16663 bytes .../__pycache__/_openssl.cpython-312.pyc | Bin 0 -> 2216 bytes .../_ssl_constants.cpython-312.pyc | Bin 0 -> 1100 bytes .../__pycache__/_windows.cpython-312.pyc | Bin 0 -> 15507 bytes .../pip/_vendor/truststore/_api.py | 302 + .../pip/_vendor/truststore/_macos.py | 501 + .../pip/_vendor/truststore/_openssl.py | 66 + .../pip/_vendor/truststore/_ssl_constants.py | 31 + .../pip/_vendor/truststore/_windows.py | 554 ++ .../pip/_vendor/typing_extensions.py | 3072 ++++++ .../pip/_vendor/urllib3/__init__.py | 102 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3406 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 0 -> 16489 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 219 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 20408 bytes .../connectionpool.cpython-312.pyc | Bin 0 -> 36443 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 13494 bytes .../__pycache__/fields.cpython-312.pyc | Bin 0 -> 10414 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 0 -> 4019 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 0 -> 20801 bytes .../__pycache__/request.cpython-312.pyc | Bin 0 -> 7295 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 33969 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 -> 199 bytes .../_appengine_environ.cpython-312.pyc | Bin 0 -> 1849 bytes .../__pycache__/appengine.cpython-312.pyc | Bin 0 -> 11565 bytes .../__pycache__/ntlmpool.cpython-312.pyc | Bin 0 -> 5720 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 0 -> 24451 bytes .../securetransport.cpython-312.pyc | Bin 0 -> 35557 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 0 -> 7512 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 216 bytes .../__pycache__/bindings.cpython-312.pyc | Bin 0 -> 17428 bytes .../__pycache__/low_level.cpython-312.pyc | Bin 0 -> 14802 bytes .../contrib/_securetransport/bindings.py | 519 + .../contrib/_securetransport/low_level.py | 397 + .../pip/_vendor/urllib3/contrib/appengine.py | 314 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 130 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 518 + .../urllib3/contrib/securetransport.py | 921 ++ .../pip/_vendor/urllib3/contrib/socks.py | 216 + .../pip/_vendor/urllib3/exceptions.py | 323 + .../pip/_vendor/urllib3/fields.py | 274 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 200 bytes .../packages/__pycache__/six.cpython-312.pyc | Bin 0 -> 41320 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 210 bytes .../__pycache__/makefile.cpython-312.pyc | Bin 0 -> 1826 bytes .../weakref_finalize.cpython-312.pyc | Bin 0 -> 7332 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 | 556 ++ .../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 -> 1147 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 4757 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 0 -> 1553 bytes .../util/__pycache__/queue.cpython-312.pyc | Bin 0 -> 1353 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 0 -> 4184 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 0 -> 2990 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 0 -> 21719 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 0 -> 15104 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 0 -> 5072 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 0 -> 10773 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 0 -> 11140 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 0 -> 15796 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 0 -> 4404 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 | 622 ++ .../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 + .../site-packages/pip/_vendor/vendor.txt | 24 + .../pip/_vendor/webencodings/__init__.py | 342 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 12002 bytes .../__pycache__/labels.cpython-312.pyc | Bin 0 -> 7133 bytes .../__pycache__/mklabels.cpython-312.pyc | Bin 0 -> 2700 bytes .../__pycache__/tests.cpython-312.pyc | Bin 0 -> 9252 bytes .../x_user_defined.cpython-312.pyc | Bin 0 -> 3296 bytes .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + .../lib/python3.12/site-packages/pip/py.typed | 4 + .../propcache-0.4.1.dist-info/INSTALLER | 1 + .../propcache-0.4.1.dist-info/METADATA | 443 + .../propcache-0.4.1.dist-info/RECORD | 18 + .../propcache-0.4.1.dist-info/WHEEL | 7 + .../licenses/LICENSE | 202 + .../propcache-0.4.1.dist-info/licenses/NOTICE | 13 + .../propcache-0.4.1.dist-info/top_level.txt | 1 + .../site-packages/propcache/__init__.py | 32 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1279 bytes .../__pycache__/_helpers.cpython-312.pyc | Bin 0 -> 1022 bytes .../__pycache__/_helpers_py.cpython-312.pyc | Bin 0 -> 3200 bytes .../propcache/__pycache__/api.cpython-312.pyc | Bin 0 -> 340 bytes .../site-packages/propcache/_helpers.py | 39 + ..._helpers_c.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 745424 bytes .../site-packages/propcache/_helpers_c.pyx | 103 + .../site-packages/propcache/_helpers_py.py | 62 + .../python3.12/site-packages/propcache/api.py | 8 + .../site-packages/propcache/py.typed | 1 + .../python_dotenv-1.2.1.dist-info/INSTALLER | 1 + .../python_dotenv-1.2.1.dist-info/METADATA | 749 ++ .../python_dotenv-1.2.1.dist-info/RECORD | 26 + .../python_dotenv-1.2.1.dist-info/REQUESTED | 0 .../python_dotenv-1.2.1.dist-info/WHEEL | 5 + .../entry_points.txt | 2 + .../licenses/LICENSE | 27 + .../top_level.txt | 1 + .../requests-2.32.5.dist-info/INSTALLER | 1 + .../requests-2.32.5.dist-info/METADATA | 133 + .../requests-2.32.5.dist-info/RECORD | 43 + .../requests-2.32.5.dist-info/REQUESTED | 0 .../requests-2.32.5.dist-info/WHEEL | 5 + .../licenses/LICENSE | 175 + .../requests-2.32.5.dist-info/top_level.txt | 1 + .../site-packages/requests/__init__.py | 184 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5409 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 0 -> 573 bytes .../_internal_utils.cpython-312.pyc | Bin 0 -> 2013 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 0 -> 27800 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 0 -> 7193 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 0 -> 13912 bytes .../__pycache__/certs.cpython-312.pyc | Bin 0 -> 655 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 2369 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 0 -> 25265 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 7574 bytes .../requests/__pycache__/help.cpython-312.pyc | Bin 0 -> 4316 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 0 -> 1041 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 35490 bytes .../__pycache__/packages.cpython-312.pyc | Bin 0 -> 1128 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 0 -> 27879 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 0 -> 6020 bytes .../__pycache__/structures.cpython-312.pyc | Bin 0 -> 5606 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 36167 bytes .../site-packages/requests/__version__.py | 14 + .../site-packages/requests/_internal_utils.py | 50 + .../site-packages/requests/adapters.py | 696 ++ .../python3.12/site-packages/requests/api.py | 157 + .../python3.12/site-packages/requests/auth.py | 314 + .../site-packages/requests/certs.py | 17 + .../site-packages/requests/compat.py | 106 + .../site-packages/requests/cookies.py | 561 ++ .../site-packages/requests/exceptions.py | 151 + .../python3.12/site-packages/requests/help.py | 134 + .../site-packages/requests/hooks.py | 33 + .../site-packages/requests/models.py | 1039 ++ .../site-packages/requests/packages.py | 23 + .../site-packages/requests/sessions.py | 831 ++ .../site-packages/requests/status_codes.py | 128 + .../site-packages/requests/structures.py | 99 + .../site-packages/requests/utils.py | 1086 ++ .../INSTALLER | 1 + .../METADATA | 72 + .../typing_extensions-4.15.0.dist-info/RECORD | 8 + .../REQUESTED | 0 .../typing_extensions-4.15.0.dist-info/WHEEL | 4 + .../licenses/LICENSE | 279 + .../site-packages/typing_extensions.py | 4317 ++++++++ .../urllib3-2.6.3.dist-info/INSTALLER | 1 + .../urllib3-2.6.3.dist-info/METADATA | 164 + .../urllib3-2.6.3.dist-info/RECORD | 79 + .../urllib3-2.6.3.dist-info/WHEEL | 4 + .../licenses/LICENSE.txt | 21 + .../site-packages/urllib3/__init__.py | 211 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 7304 bytes .../_base_connection.cpython-312.pyc | Bin 0 -> 6842 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 0 -> 22993 bytes .../_request_methods.cpython-312.pyc | Bin 0 -> 10596 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 787 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 38914 bytes .../connectionpool.cpython-312.pyc | Bin 0 -> 39729 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 16605 bytes .../__pycache__/fields.cpython-312.pyc | Bin 0 -> 12016 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 0 -> 3483 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 0 -> 24332 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 57484 bytes .../site-packages/urllib3/_base_connection.py | 165 + .../site-packages/urllib3/_collections.py | 487 + .../site-packages/urllib3/_request_methods.py | 278 + .../site-packages/urllib3/_version.py | 34 + .../site-packages/urllib3/connection.py | 1099 ++ .../site-packages/urllib3/connectionpool.py | 1178 +++ .../site-packages/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 187 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 0 -> 28210 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 0 -> 8165 bytes .../urllib3/contrib/emscripten/__init__.py | 17 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 984 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 10381 bytes .../__pycache__/fetch.cpython-312.pyc | Bin 0 -> 28632 bytes .../__pycache__/request.cpython-312.pyc | Bin 0 -> 1415 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 12209 bytes .../urllib3/contrib/emscripten/connection.py | 260 + .../emscripten/emscripten_fetch_worker.js | 110 + .../urllib3/contrib/emscripten/fetch.py | 726 ++ .../urllib3/contrib/emscripten/request.py | 22 + .../urllib3/contrib/emscripten/response.py | 277 + .../urllib3/contrib/pyopenssl.py | 564 ++ .../site-packages/urllib3/contrib/socks.py | 228 + .../site-packages/urllib3/exceptions.py | 335 + .../site-packages/urllib3/fields.py | 341 + .../site-packages/urllib3/filepost.py | 89 + .../site-packages/urllib3/http2/__init__.py | 53 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1740 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 17047 bytes .../http2/__pycache__/probe.cpython-312.pyc | Bin 0 -> 3691 bytes .../site-packages/urllib3/http2/connection.py | 356 + .../site-packages/urllib3/http2/probe.py | 87 + .../site-packages/urllib3/poolmanager.py | 651 ++ .../python3.12/site-packages/urllib3/py.typed | 2 + .../site-packages/urllib3/response.py | 1480 +++ .../site-packages/urllib3/util/__init__.py | 42 + .../util/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1000 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 4690 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 0 -> 1212 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 0 -> 8336 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 0 -> 2868 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 0 -> 20828 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 0 -> 17314 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 0 -> 5552 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 0 -> 13319 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 0 -> 11684 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 0 -> 16221 bytes .../util/__pycache__/util.cpython-312.pyc | Bin 0 -> 1989 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 0 -> 3435 bytes .../site-packages/urllib3/util/connection.py | 137 + .../site-packages/urllib3/util/proxy.py | 43 + .../site-packages/urllib3/util/request.py | 263 + .../site-packages/urllib3/util/response.py | 101 + .../site-packages/urllib3/util/retry.py | 549 + .../site-packages/urllib3/util/ssl_.py | 527 + .../urllib3/util/ssl_match_hostname.py | 159 + .../urllib3/util/ssltransport.py | 271 + .../site-packages/urllib3/util/timeout.py | 275 + .../site-packages/urllib3/util/url.py | 469 + .../site-packages/urllib3/util/util.py | 42 + .../site-packages/urllib3/util/wait.py | 124 + .../yarl-1.22.0.dist-info/INSTALLER | 1 + .../yarl-1.22.0.dist-info/METADATA | 2478 +++++ .../yarl-1.22.0.dist-info/RECORD | 26 + .../site-packages/yarl-1.22.0.dist-info/WHEEL | 7 + .../yarl-1.22.0.dist-info/licenses/LICENSE | 202 + .../yarl-1.22.0.dist-info/licenses/NOTICE | 13 + .../yarl-1.22.0.dist-info/top_level.txt | 1 + .../python3.12/site-packages/yarl/__init__.py | 14 + .../yarl/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 456 bytes .../yarl/__pycache__/_parse.cpython-312.pyc | Bin 0 -> 6968 bytes .../yarl/__pycache__/_path.cpython-312.pyc | Bin 0 -> 1410 bytes .../yarl/__pycache__/_query.cpython-312.pyc | Bin 0 -> 4995 bytes .../yarl/__pycache__/_quoters.cpython-312.pyc | Bin 0 -> 1991 bytes .../yarl/__pycache__/_quoting.cpython-312.pyc | Bin 0 -> 750 bytes .../__pycache__/_quoting_py.cpython-312.pyc | Bin 0 -> 8806 bytes .../yarl/__pycache__/_url.cpython-312.pyc | Bin 0 -> 60790 bytes .../python3.12/site-packages/yarl/_parse.py | 203 + .../python3.12/site-packages/yarl/_path.py | 41 + .../python3.12/site-packages/yarl/_query.py | 121 + .../python3.12/site-packages/yarl/_quoters.py | 33 + .../python3.12/site-packages/yarl/_quoting.py | 19 + ..._quoting_c.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 1170216 bytes .../site-packages/yarl/_quoting_c.pyx | 451 + .../site-packages/yarl/_quoting_py.py | 213 + .../lib/python3.12/site-packages/yarl/_url.py | 1622 +++ .../python3.12/site-packages/yarl/py.typed | 1 + search_agent/search_agent/.venv/lib64 | 1 + search_agent/search_agent/.venv/pyvenv.cfg | 5 + search_agent/search_agent/DESIGN.md | 1031 ++ search_agent/search_agent/README.md | 253 + .../__pycache__/config.cpython-311.pyc | Bin 0 -> 3317 bytes .../__pycache__/config.cpython-312.pyc | Bin 0 -> 2970 bytes search_agent/search_agent/agent/__init__.py | 18 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 434 bytes .../agent/__pycache__/prompts.cpython-312.pyc | Bin 0 -> 4580 bytes .../__pycache__/search_agent.cpython-312.pyc | Bin 0 -> 8880 bytes search_agent/search_agent/agent/prompts.py | 126 + .../search_agent/agent/search_agent.py | 209 + search_agent/search_agent/config.py | 81 + search_agent/search_agent/main.py | 125 + search_agent/search_agent/models/__init__.py | 34 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 580 bytes .../__pycache__/schemas.cpython-312.pyc | Bin 0 -> 8054 bytes search_agent/search_agent/models/schemas.py | 202 + search_agent/search_agent/modules/__init__.py | 22 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 694 bytes .../answer_generator.cpython-312.pyc | Bin 0 -> 5820 bytes .../content_extractor.cpython-312.pyc | Bin 0 -> 4074 bytes .../query_analyzer.cpython-312.pyc | Bin 0 -> 5048 bytes .../__pycache__/reflector.cpython-312.pyc | Bin 0 -> 5856 bytes .../result_processor.cpython-312.pyc | Bin 0 -> 4541 bytes .../search_executor.cpython-312.pyc | Bin 0 -> 4535 bytes .../search_planner.cpython-312.pyc | Bin 0 -> 4671 bytes .../search_agent/modules/answer_generator.py | 151 + .../search_agent/modules/content_extractor.py | 102 + .../search_agent/modules/query_analyzer.py | 117 + .../search_agent/modules/reflector.py | 166 + .../search_agent/modules/result_processor.py | 107 + .../search_agent/modules/search_executor.py | 89 + .../search_agent/modules/search_planner.py | 137 + search_agent/search_agent/requirements.txt | 19 + search_agent/search_agent/search.py | 16 + search_agent/search_agent/tools/__init__.py | 14 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 463 bytes .../__pycache__/jina_reader.cpython-312.pyc | Bin 0 -> 8224 bytes .../__pycache__/jina_reranker.cpython-312.pyc | Bin 0 -> 9110 bytes .../tools/__pycache__/serper.cpython-312.pyc | Bin 0 -> 8160 bytes .../search_agent/tools/jina_reader.py | 180 + .../search_agent/tools/jina_reranker.py | 191 + search_agent/search_agent/tools/serper.py | 212 + search_agent/search_agent/utils/__init__.py | 22 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 531 bytes .../utils/__pycache__/helpers.cpython-312.pyc | Bin 0 -> 6037 bytes .../__pycache__/llm_client.cpython-312.pyc | Bin 0 -> 6316 bytes search_agent/search_agent/utils/helpers.py | 197 + search_agent/search_agent/utils/llm_client.py | 159 + search_agent/search_agent_A2A/USER_GUIDE.md | 481 + search_agent/search_agent_A2A/__init__.py | 2 + .../__pycache__/a2a_server.cpython-312.pyc | Bin 0 -> 25341 bytes .../__pycache__/agent.cpython-312.pyc | Bin 0 -> 4221 bytes .../__pycache__/config.cpython-312.pyc | Bin 0 -> 5099 bytes .../__pycache__/main.cpython-312.pyc | Bin 0 -> 1827 bytes search_agent/search_agent_A2A/a2a_server.py | 608 ++ search_agent/search_agent_A2A/agent.py | 104 + search_agent/search_agent_A2A/config.py | 138 + search_agent/search_agent_A2A/main.py | 46 + .../search_agent_A2A/requirements.txt | 27 + .../search_agent_A2A/search_agent/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 206 bytes .../__pycache__/config.cpython-312.pyc | Bin 0 -> 2970 bytes .../search_agent/agent/__init__.py | 18 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 471 bytes .../agent/__pycache__/prompts.cpython-312.pyc | Bin 0 -> 4580 bytes .../__pycache__/search_agent.cpython-312.pyc | Bin 0 -> 8933 bytes .../search_agent/agent/prompts.py | 126 + .../search_agent/agent/search_agent.py | 209 + .../search_agent_A2A/search_agent/config.py | 81 + .../search_agent/models/__init__.py | 34 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 580 bytes .../__pycache__/schemas.cpython-312.pyc | Bin 0 -> 8054 bytes .../search_agent/models/schemas.py | 202 + .../search_agent/modules/__init__.py | 22 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 694 bytes .../answer_generator.cpython-312.pyc | Bin 0 -> 5836 bytes .../content_extractor.cpython-312.pyc | Bin 0 -> 4090 bytes .../query_analyzer.cpython-312.pyc | Bin 0 -> 5064 bytes .../__pycache__/reflector.cpython-312.pyc | Bin 0 -> 5872 bytes .../result_processor.cpython-312.pyc | Bin 0 -> 4557 bytes .../search_executor.cpython-312.pyc | Bin 0 -> 4551 bytes .../search_planner.cpython-312.pyc | Bin 0 -> 4687 bytes .../search_agent/modules/answer_generator.py | 151 + .../search_agent/modules/content_extractor.py | 102 + .../search_agent/modules/query_analyzer.py | 117 + .../search_agent/modules/reflector.py | 166 + .../search_agent/modules/result_processor.py | 107 + .../search_agent/modules/search_executor.py | 89 + .../search_agent/modules/search_planner.py | 137 + .../search_agent/tools/__init__.py | 14 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 463 bytes .../__pycache__/jina_reader.cpython-312.pyc | Bin 0 -> 8224 bytes .../__pycache__/jina_reranker.cpython-312.pyc | Bin 0 -> 9110 bytes .../tools/__pycache__/serper.cpython-312.pyc | Bin 0 -> 8160 bytes .../search_agent/tools/jina_reader.py | 180 + .../search_agent/tools/jina_reranker.py | 191 + .../search_agent/tools/serper.py | 212 + .../search_agent/utils/__init__.py | 22 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 531 bytes .../utils/__pycache__/helpers.cpython-312.pyc | Bin 0 -> 6037 bytes .../__pycache__/llm_client.cpython-312.pyc | Bin 0 -> 6745 bytes .../search_agent/utils/helpers.py | 197 + .../search_agent/utils/llm_client.py | 179 + .../search_agent_A2A.Dockerfile | 44 + search_agent/search_agent_A2A/test_a2a.py | 139 + search_agent/search_agent_MCP/README.md | 167 + search_agent/search_agent_MCP/USER_GUIDE.md | 397 + search_agent/search_agent_MCP/__init__.py | 4 + .../__pycache__/agent.cpython-312.pyc | Bin 0 -> 4780 bytes .../__pycache__/config.cpython-312.pyc | Bin 0 -> 4171 bytes .../__pycache__/main.cpython-312.pyc | Bin 0 -> 1827 bytes .../__pycache__/mcp_config.cpython-312.pyc | Bin 0 -> 4260 bytes .../__pycache__/mcp_server.cpython-312.pyc | Bin 0 -> 20232 bytes search_agent/search_agent_MCP/agent.py | 127 + search_agent/search_agent_MCP/main.py | 47 + search_agent/search_agent_MCP/mcp_config.py | 116 + search_agent/search_agent_MCP/mcp_server.py | 498 + .../search_agent_MCP/requirements.txt | 30 + search_agent/search_agent_MCP/search_agent | 1 + .../search_agent_MCP.Dockerfile | 44 + search_agent/search_agent_MCP/test_mcp.py | 305 + .../search_agent_MCP/test_mcp_structure.py | 129 + search_agent/search_agent_main.py | 416 + 1749 files changed, 310066 insertions(+) create mode 100644 a2a_litellm_agent/__init__.py create mode 100644 a2a_litellm_agent/a2a_litellm_agent.Dockerfile create mode 100644 a2a_litellm_agent/a2a_server.py create mode 100644 a2a_litellm_agent/agent.py create mode 100644 a2a_litellm_agent/config.py create mode 100644 a2a_litellm_agent/main.py create mode 100644 a2a_litellm_agent/requirements.txt create mode 100644 azure_blob_agent/azure_blob_agent.Dockerfile create mode 100644 azure_blob_agent/azure_blob_agent.py create mode 100644 azure_blob_agent_a2a/azure_blob_agent_a2a.Dockerfile create mode 100644 azure_blob_agent_a2a/azure_blob_agent_a2a.py create mode 100644 azure_blob_agent_mcp/azure_blob_agent_mcp.Dockerfile create mode 100644 azure_blob_agent_mcp/azure_blob_agent_mcp.py create mode 100644 echo_agent/echo_agent.Dockerfile create mode 100644 echo_agent/echo_agent.py create mode 100644 jina_search_agent/jina_search_agent.Dockerfile create mode 100644 jina_search_agent/jina_search_agent.py create mode 100644 mysql_agent/mysql_agent.Dockerfile create mode 100644 mysql_agent/mysql_agent.py create mode 100644 postgresql_agent/postgresql_agent.Dockerfile create mode 100644 postgresql_agent/postgresql_agent.py create mode 100644 search_agent/API_DOCUMENTATION.md create mode 100644 search_agent/k8s-test-deployment.yaml create mode 100644 search_agent/search_agent.Dockerfile create mode 100644 search_agent/search_agent/.env create mode 100644 search_agent/search_agent/.venv/bin/Activate.ps1 create mode 100644 search_agent/search_agent/.venv/bin/activate create mode 100644 search_agent/search_agent/.venv/bin/activate.csh create mode 100644 search_agent/search_agent/.venv/bin/activate.fish create mode 100755 search_agent/search_agent/.venv/bin/dotenv create mode 100755 search_agent/search_agent/.venv/bin/normalizer create mode 100755 search_agent/search_agent/.venv/bin/pip create mode 100755 search_agent/search_agent/.venv/bin/pip3 create mode 100755 search_agent/search_agent/.venv/bin/pip3.12 create mode 120000 search_agent/search_agent/.venv/bin/python create mode 120000 search_agent/search_agent/.venv/bin/python3 create mode 120000 search_agent/search_agent/.venv/bin/python3.12 create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/INSTALLER create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/LICENSE create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/METADATA create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/RECORD create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/WHEEL create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/__pycache__/_staggered.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/__pycache__/impl.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/__pycache__/types.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/__pycache__/utils.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/_staggered.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/impl.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/py.typed create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/types.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/utils.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/INSTALLER create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/METADATA create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/RECORD create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/REQUESTED create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/WHEEL create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/licenses/LICENSE.txt create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/licenses/vendor/llhttp/LICENSE create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/top_level.txt create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/.hash/_cparser.pxd.hash create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/.hash/_find_header.pxd.hash create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/.hash/_http_parser.pyx.hash create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/.hash/_http_writer.pyx.hash create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/.hash/hdrs.py.hash create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/_cookie_helpers.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/abc.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/base_protocol.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/client.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/client_exceptions.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/client_middleware_digest_auth.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/client_middlewares.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/client_proto.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/client_reqrep.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/client_ws.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/compression_utils.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/connector.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/cookiejar.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/formdata.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/hdrs.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/helpers.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/http.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/http_exceptions.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/http_parser.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/http_websocket.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/http_writer.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/log.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/multipart.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/payload.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/payload_streamer.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/pytest_plugin.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/resolver.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/streams.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/tcp_helpers.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/test_utils.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/tracing.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/typedefs.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_app.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_exceptions.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_fileresponse.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_log.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_middlewares.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_protocol.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_request.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_response.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_routedef.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_runner.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_server.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_urldispatcher.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_ws.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/worker.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_cookie_helpers.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_cparser.pxd create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_find_header.pxd create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_headers.pxi create mode 100755 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_http_parser.cpython-312-x86_64-linux-gnu.so create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_http_parser.pyx create mode 100755 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_http_writer.cpython-312-x86_64-linux-gnu.so create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_http_writer.pyx create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/.hash/mask.pxd.hash create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/.hash/mask.pyx.hash create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/.hash/reader_c.pxd.hash create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/helpers.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/models.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/reader.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/reader_c.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/reader_py.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/writer.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/helpers.py create mode 100755 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/mask.cpython-312-x86_64-linux-gnu.so create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/mask.pxd create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/mask.pyx create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/models.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/reader.py create mode 100755 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/reader_c.cpython-312-x86_64-linux-gnu.so create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/reader_c.pxd create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/reader_c.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/reader_py.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/writer.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/abc.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/base_protocol.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client_exceptions.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client_middleware_digest_auth.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client_middlewares.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client_proto.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client_reqrep.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client_ws.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/compression_utils.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/connector.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/cookiejar.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/formdata.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/hdrs.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/helpers.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/http.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/http_exceptions.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/http_parser.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/http_websocket.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/http_writer.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/log.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/multipart.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/payload.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/payload_streamer.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/py.typed create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/pytest_plugin.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/resolver.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/streams.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/tcp_helpers.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/test_utils.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/tracing.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/typedefs.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_app.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_exceptions.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_fileresponse.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_log.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_middlewares.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_protocol.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_request.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_response.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_routedef.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_runner.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_server.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_urldispatcher.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_ws.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/worker.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/INSTALLER create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/METADATA create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/RECORD create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/WHEEL create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/licenses/LICENSE create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/top_level.txt create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal/py.typed create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/INSTALLER create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/LICENSE create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/METADATA create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/RECORD create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/REQUESTED create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/WHEEL create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/top_level.txt create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle/__pycache__/throttler.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle/py.typed create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle/throttler.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__init__.pyi create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/_cmp.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/_compat.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/_config.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/_funcs.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/_make.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/_next_gen.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/_version_info.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/converters.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/exceptions.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/filters.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/setters.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/validators.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_cmp.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_cmp.pyi create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_compat.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_config.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_funcs.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_make.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_next_gen.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_typing_compat.pyi create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_version_info.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_version_info.pyi create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/converters.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/converters.pyi create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/exceptions.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/exceptions.pyi create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/filters.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/filters.pyi create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/py.typed create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/setters.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/setters.pyi create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/validators.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/validators.pyi create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs-25.4.0.dist-info/INSTALLER create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs-25.4.0.dist-info/METADATA create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs-25.4.0.dist-info/RECORD create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs-25.4.0.dist-info/WHEEL create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs-25.4.0.dist-info/licenses/LICENSE create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/__init__.pyi create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/__pycache__/converters.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/__pycache__/exceptions.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/__pycache__/filters.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/__pycache__/setters.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/__pycache__/validators.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/converters.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/exceptions.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/filters.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/py.typed create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/setters.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/validators.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/INSTALLER create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/METADATA create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/RECORD create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/WHEEL create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/licenses/LICENSE create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/top_level.txt create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/__main__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/__pycache__/__main__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/__pycache__/core.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/cacert.pem create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/core.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/py.typed create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/INSTALLER create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/METADATA create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/RECORD create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/WHEEL create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/entry_points.txt create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/licenses/LICENSE create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/top_level.txt create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__main__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__main__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/api.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/cd.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/constant.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/legacy.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/md.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/models.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/utils.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/version.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/api.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/cd.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__main__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__main__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/constant.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/legacy.py create mode 100755 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/md.cpython-312-x86_64-linux-gnu.so create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/md.py create mode 100755 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/md__mypyc.cpython-312-x86_64-linux-gnu.so create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/models.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/py.typed create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/utils.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/version.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/__main__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/__pycache__/__main__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/__pycache__/cli.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/__pycache__/ipython.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/__pycache__/main.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/__pycache__/parser.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/__pycache__/variables.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/__pycache__/version.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/cli.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/ipython.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/main.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/parser.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/py.typed create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/variables.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/version.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/INSTALLER create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/METADATA create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/RECORD create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/WHEEL create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/licenses/LICENSE create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/top_level.txt create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist/__init__.pyi create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist/__pycache__/__init__.cpython-312.pyc create mode 100755 search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist/_frozenlist.cpython-312-x86_64-linux-gnu.so create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist/_frozenlist.pyx create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist/py.typed create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/idna-3.11.dist-info/INSTALLER create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/idna-3.11.dist-info/METADATA create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/idna-3.11.dist-info/RECORD create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/idna-3.11.dist-info/WHEEL create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/idna-3.11.dist-info/licenses/LICENSE.md create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__pycache__/codec.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__pycache__/compat.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__pycache__/core.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__pycache__/idnadata.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__pycache__/intranges.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__pycache__/package_data.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__pycache__/uts46data.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/codec.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/compat.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/core.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/idnadata.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/intranges.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/package_data.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/py.typed create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/uts46data.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru-0.7.3.dist-info/INSTALLER create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru-0.7.3.dist-info/METADATA create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru-0.7.3.dist-info/RECORD create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru-0.7.3.dist-info/REQUESTED create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru-0.7.3.dist-info/WHEEL create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/__init__.pyi create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/__pycache__/_asyncio_loop.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/__pycache__/_better_exceptions.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/__pycache__/_colorama.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/__pycache__/_colorizer.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/__pycache__/_contextvars.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/__pycache__/_ctime_functions.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/__pycache__/_datetime.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/__pycache__/_defaults.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/__pycache__/_error_interceptor.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/__pycache__/_file_sink.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/__pycache__/_filters.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/__pycache__/_get_frame.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/__pycache__/_handler.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/__pycache__/_locks_machinery.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/__pycache__/_logger.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/__pycache__/_recattrs.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/__pycache__/_simple_sinks.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/__pycache__/_string_parsers.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/_asyncio_loop.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/_better_exceptions.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/_colorama.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/_colorizer.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/_contextvars.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/_ctime_functions.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/_datetime.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/_defaults.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/_error_interceptor.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/_file_sink.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/_filters.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/_get_frame.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/_handler.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/_locks_machinery.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/_logger.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/_recattrs.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/_simple_sinks.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/_string_parsers.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru/py.typed create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/multidict-6.7.0.dist-info/INSTALLER create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/multidict-6.7.0.dist-info/METADATA create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/multidict-6.7.0.dist-info/RECORD create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/multidict-6.7.0.dist-info/WHEEL create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/multidict-6.7.0.dist-info/licenses/LICENSE create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/multidict-6.7.0.dist-info/top_level.txt create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/multidict/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/multidict/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/multidict/__pycache__/_abc.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/multidict/__pycache__/_compat.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/multidict/__pycache__/_multidict_py.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/multidict/_abc.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/multidict/_compat.py create mode 100755 search_agent/search_agent/.venv/lib/python3.12/site-packages/multidict/_multidict.cpython-312-x86_64-linux-gnu.so create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/multidict/_multidict_py.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/multidict/py.typed create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/orjson-3.11.5.dist-info/INSTALLER create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/orjson-3.11.5.dist-info/METADATA create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/orjson-3.11.5.dist-info/RECORD create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/orjson-3.11.5.dist-info/REQUESTED create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/orjson-3.11.5.dist-info/WHEEL create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/orjson-3.11.5.dist-info/licenses/LICENSE-APACHE create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/orjson-3.11.5.dist-info/licenses/LICENSE-MIT create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/orjson/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/orjson/__init__.pyi create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/orjson/__pycache__/__init__.cpython-312.pyc create mode 100755 search_agent/search_agent/.venv/lib/python3.12/site-packages/orjson/orjson.cpython-312-x86_64-linux-gnu.so create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/orjson/py.typed create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip-24.0.dist-info/AUTHORS.txt create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip-24.0.dist-info/INSTALLER create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip-24.0.dist-info/LICENSE.txt create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip-24.0.dist-info/METADATA create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip-24.0.dist-info/RECORD create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip-24.0.dist-info/REQUESTED create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip-24.0.dist-info/WHEEL create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip-24.0.dist-info/entry_points.txt create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip-24.0.dist-info/top_level.txt create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/__main__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/__pip-runner__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/__pycache__/__main__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/build_env.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/cache.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/cli/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/cli/main.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/cli/status_codes.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/check.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/help.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/index.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/list.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/search.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/cache.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/check.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/completion.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/debug.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/download.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/freeze.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/hash.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/help.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/index.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/inspect.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/install.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/list.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/search.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/show.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/configuration.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/distributions/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/distributions/base.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/distributions/installed.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/exceptions.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/index/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/index/collector.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/index/sources.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/locations/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/base.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/locations/base.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/main.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/metadata/_json.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/metadata/base.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/models/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/format_control.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/scheme.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/target_python.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/wheel.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/models/candidate.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/models/format_control.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/models/index.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/models/installation_report.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/models/link.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/models/scheme.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/models/search_scope.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/models/target_python.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/models/wheel.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/network/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/cache.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/download.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/session.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/network/auth.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/network/cache.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/network/download.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/network/session.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/network/utils.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/check.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/freeze.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/pyproject.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/req/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/constructors.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_file.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_install.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/req/constructors.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/req/req_file.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/req/req_set.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/base.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/base.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/models.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/_log.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/compat.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/datetime.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/encoding.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/glibc.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/hashes.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/logging.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/misc.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/models.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/packaging.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/urls.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/utils/wheel.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/vcs/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/git.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/vcs/git.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/six.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/certifi/core.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachinedict.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/enums.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabfreq.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabprober.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/langrussianmodel.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/macromanprober.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/languages.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/resultdict.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf1632prober.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/chardet/version.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansi_test.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/initialise_test.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/isatty_test.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/utils.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/winterm_test.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/win32.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/database.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/markers.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/resources.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/version.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distro/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distro/__main__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/idna/codec.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/idna/compat.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/idna/core.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/version.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/cmdline.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/console.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/_mapping.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/bbcode.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/groff.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/html.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/irc.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/latex.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/other.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/rtf.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/svg.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal256.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/_mapping.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/python.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/modeline.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/plugin.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/regexopt.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/scanner.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/sphinxext.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/style.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/token.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/unistring.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/util.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/actions.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/common.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/core.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/exceptions.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_compat.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/api.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/help.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/models.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/api.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/certs.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/compat.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/help.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/models.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/packages.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/structures.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/requests/utils.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/align.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/console.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/control.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/region.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/status.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/style.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/table.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/text.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/abc.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/align.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/bar.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/box.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/cells.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/columns.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/containers.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/control.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/errors.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/json.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/jupyter.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/layout.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/live.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/live_render.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/logging.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/markup.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/measure.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/padding.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/pager.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/palette.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/panel.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/progress.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/protocol.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/region.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/repr.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/rule.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/scope.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/screen.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/segment.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/spinner.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/status.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/styled.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/table.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/terminal_theme.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/text.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/theme.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/themes.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/rich/tree.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/six.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_asyncio.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_utils.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/after.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before_sleep.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/nap.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/retry.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/stop.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/tornadoweb.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tenacity/wait.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tomli/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tomli/_parser.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tomli/_re.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/tomli/_types.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/truststore/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_openssl.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/truststore/_api.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/truststore/_macos.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/truststore/_openssl.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/truststore/_ssl_constants.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/truststore/_windows.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/request.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/response.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/proxy.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/vendor.txt create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/pip/py.typed create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/propcache-0.4.1.dist-info/INSTALLER create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/propcache-0.4.1.dist-info/METADATA create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/propcache-0.4.1.dist-info/RECORD create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/propcache-0.4.1.dist-info/WHEEL create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/propcache-0.4.1.dist-info/licenses/LICENSE create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/propcache-0.4.1.dist-info/licenses/NOTICE create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/propcache-0.4.1.dist-info/top_level.txt create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/propcache/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/propcache/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/propcache/__pycache__/_helpers.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/propcache/__pycache__/_helpers_py.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/propcache/__pycache__/api.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/propcache/_helpers.py create mode 100755 search_agent/search_agent/.venv/lib/python3.12/site-packages/propcache/_helpers_c.cpython-312-x86_64-linux-gnu.so create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/propcache/_helpers_c.pyx create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/propcache/_helpers_py.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/propcache/api.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/propcache/py.typed create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/python_dotenv-1.2.1.dist-info/INSTALLER create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/python_dotenv-1.2.1.dist-info/METADATA create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/python_dotenv-1.2.1.dist-info/RECORD create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/python_dotenv-1.2.1.dist-info/REQUESTED create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/python_dotenv-1.2.1.dist-info/WHEEL create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/python_dotenv-1.2.1.dist-info/entry_points.txt create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/python_dotenv-1.2.1.dist-info/licenses/LICENSE create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/python_dotenv-1.2.1.dist-info/top_level.txt create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests-2.32.5.dist-info/INSTALLER create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests-2.32.5.dist-info/METADATA create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests-2.32.5.dist-info/RECORD create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests-2.32.5.dist-info/REQUESTED create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests-2.32.5.dist-info/WHEEL create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests-2.32.5.dist-info/licenses/LICENSE create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests-2.32.5.dist-info/top_level.txt create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/__pycache__/__version__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/__pycache__/_internal_utils.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/__pycache__/adapters.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/__pycache__/api.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/__pycache__/auth.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/__pycache__/certs.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/__pycache__/compat.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/__pycache__/cookies.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/__pycache__/exceptions.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/__pycache__/help.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/__pycache__/hooks.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/__pycache__/models.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/__pycache__/packages.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/__pycache__/sessions.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/__pycache__/status_codes.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/__pycache__/structures.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/__pycache__/utils.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/__version__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/_internal_utils.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/adapters.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/api.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/auth.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/certs.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/compat.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/cookies.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/exceptions.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/help.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/hooks.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/models.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/packages.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/sessions.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/status_codes.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/structures.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/requests/utils.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info/INSTALLER create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info/METADATA create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info/RECORD create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info/REQUESTED create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info/WHEEL create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info/licenses/LICENSE create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/typing_extensions.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3-2.6.3.dist-info/INSTALLER create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3-2.6.3.dist-info/METADATA create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3-2.6.3.dist-info/RECORD create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3-2.6.3.dist-info/WHEEL create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3-2.6.3.dist-info/licenses/LICENSE.txt create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/__pycache__/_base_connection.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/__pycache__/_collections.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/__pycache__/_request_methods.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/__pycache__/_version.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/__pycache__/connection.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/__pycache__/connectionpool.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/__pycache__/exceptions.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/__pycache__/fields.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/__pycache__/filepost.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/__pycache__/poolmanager.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/__pycache__/response.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/_base_connection.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/_collections.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/_request_methods.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/_version.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/connection.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/connectionpool.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/contrib/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/contrib/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/contrib/__pycache__/socks.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/connection.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/fetch.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/request.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/response.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/connection.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/emscripten_fetch_worker.js create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/fetch.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/request.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/response.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/contrib/pyopenssl.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/contrib/socks.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/exceptions.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/fields.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/filepost.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/http2/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/http2/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/http2/__pycache__/connection.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/http2/__pycache__/probe.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/http2/connection.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/http2/probe.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/poolmanager.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/py.typed create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/response.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/connection.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/proxy.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/request.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/response.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/retry.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssl_.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssltransport.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/timeout.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/url.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/util.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/__pycache__/wait.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/connection.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/proxy.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/request.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/response.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/retry.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/ssl_.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/ssl_match_hostname.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/ssltransport.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/timeout.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/url.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/util.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/urllib3/util/wait.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl-1.22.0.dist-info/INSTALLER create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl-1.22.0.dist-info/METADATA create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl-1.22.0.dist-info/RECORD create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl-1.22.0.dist-info/WHEEL create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl-1.22.0.dist-info/licenses/LICENSE create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl-1.22.0.dist-info/licenses/NOTICE create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl-1.22.0.dist-info/top_level.txt create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl/__init__.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl/__pycache__/_parse.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl/__pycache__/_path.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl/__pycache__/_query.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl/__pycache__/_quoters.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl/__pycache__/_quoting.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl/__pycache__/_quoting_py.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl/__pycache__/_url.cpython-312.pyc create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl/_parse.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl/_path.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl/_query.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl/_quoters.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl/_quoting.py create mode 100755 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl/_quoting_c.cpython-312-x86_64-linux-gnu.so create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl/_quoting_c.pyx create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl/_quoting_py.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl/_url.py create mode 100644 search_agent/search_agent/.venv/lib/python3.12/site-packages/yarl/py.typed create mode 120000 search_agent/search_agent/.venv/lib64 create mode 100644 search_agent/search_agent/.venv/pyvenv.cfg create mode 100644 search_agent/search_agent/DESIGN.md create mode 100644 search_agent/search_agent/README.md create mode 100644 search_agent/search_agent/__pycache__/config.cpython-311.pyc create mode 100644 search_agent/search_agent/__pycache__/config.cpython-312.pyc create mode 100644 search_agent/search_agent/agent/__init__.py create mode 100644 search_agent/search_agent/agent/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/agent/__pycache__/prompts.cpython-312.pyc create mode 100644 search_agent/search_agent/agent/__pycache__/search_agent.cpython-312.pyc create mode 100644 search_agent/search_agent/agent/prompts.py create mode 100644 search_agent/search_agent/agent/search_agent.py create mode 100644 search_agent/search_agent/config.py create mode 100644 search_agent/search_agent/main.py create mode 100644 search_agent/search_agent/models/__init__.py create mode 100644 search_agent/search_agent/models/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/models/__pycache__/schemas.cpython-312.pyc create mode 100644 search_agent/search_agent/models/schemas.py create mode 100644 search_agent/search_agent/modules/__init__.py create mode 100644 search_agent/search_agent/modules/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/modules/__pycache__/answer_generator.cpython-312.pyc create mode 100644 search_agent/search_agent/modules/__pycache__/content_extractor.cpython-312.pyc create mode 100644 search_agent/search_agent/modules/__pycache__/query_analyzer.cpython-312.pyc create mode 100644 search_agent/search_agent/modules/__pycache__/reflector.cpython-312.pyc create mode 100644 search_agent/search_agent/modules/__pycache__/result_processor.cpython-312.pyc create mode 100644 search_agent/search_agent/modules/__pycache__/search_executor.cpython-312.pyc create mode 100644 search_agent/search_agent/modules/__pycache__/search_planner.cpython-312.pyc create mode 100644 search_agent/search_agent/modules/answer_generator.py create mode 100644 search_agent/search_agent/modules/content_extractor.py create mode 100644 search_agent/search_agent/modules/query_analyzer.py create mode 100644 search_agent/search_agent/modules/reflector.py create mode 100644 search_agent/search_agent/modules/result_processor.py create mode 100644 search_agent/search_agent/modules/search_executor.py create mode 100644 search_agent/search_agent/modules/search_planner.py create mode 100644 search_agent/search_agent/requirements.txt create mode 100644 search_agent/search_agent/search.py create mode 100644 search_agent/search_agent/tools/__init__.py create mode 100644 search_agent/search_agent/tools/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/tools/__pycache__/jina_reader.cpython-312.pyc create mode 100644 search_agent/search_agent/tools/__pycache__/jina_reranker.cpython-312.pyc create mode 100644 search_agent/search_agent/tools/__pycache__/serper.cpython-312.pyc create mode 100644 search_agent/search_agent/tools/jina_reader.py create mode 100644 search_agent/search_agent/tools/jina_reranker.py create mode 100644 search_agent/search_agent/tools/serper.py create mode 100644 search_agent/search_agent/utils/__init__.py create mode 100644 search_agent/search_agent/utils/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent/utils/__pycache__/helpers.cpython-312.pyc create mode 100644 search_agent/search_agent/utils/__pycache__/llm_client.cpython-312.pyc create mode 100644 search_agent/search_agent/utils/helpers.py create mode 100644 search_agent/search_agent/utils/llm_client.py create mode 100644 search_agent/search_agent_A2A/USER_GUIDE.md create mode 100644 search_agent/search_agent_A2A/__init__.py create mode 100644 search_agent/search_agent_A2A/__pycache__/a2a_server.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/__pycache__/agent.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/__pycache__/config.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/__pycache__/main.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/a2a_server.py create mode 100644 search_agent/search_agent_A2A/agent.py create mode 100644 search_agent/search_agent_A2A/config.py create mode 100644 search_agent/search_agent_A2A/main.py create mode 100644 search_agent/search_agent_A2A/requirements.txt create mode 100644 search_agent/search_agent_A2A/search_agent/__init__.py create mode 100644 search_agent/search_agent_A2A/search_agent/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/search_agent/__pycache__/config.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/search_agent/agent/__init__.py create mode 100644 search_agent/search_agent_A2A/search_agent/agent/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/search_agent/agent/__pycache__/prompts.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/search_agent/agent/__pycache__/search_agent.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/search_agent/agent/prompts.py create mode 100644 search_agent/search_agent_A2A/search_agent/agent/search_agent.py create mode 100644 search_agent/search_agent_A2A/search_agent/config.py create mode 100644 search_agent/search_agent_A2A/search_agent/models/__init__.py create mode 100644 search_agent/search_agent_A2A/search_agent/models/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/search_agent/models/__pycache__/schemas.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/search_agent/models/schemas.py create mode 100644 search_agent/search_agent_A2A/search_agent/modules/__init__.py create mode 100644 search_agent/search_agent_A2A/search_agent/modules/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/search_agent/modules/__pycache__/answer_generator.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/search_agent/modules/__pycache__/content_extractor.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/search_agent/modules/__pycache__/query_analyzer.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/search_agent/modules/__pycache__/reflector.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/search_agent/modules/__pycache__/result_processor.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/search_agent/modules/__pycache__/search_executor.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/search_agent/modules/__pycache__/search_planner.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/search_agent/modules/answer_generator.py create mode 100644 search_agent/search_agent_A2A/search_agent/modules/content_extractor.py create mode 100644 search_agent/search_agent_A2A/search_agent/modules/query_analyzer.py create mode 100644 search_agent/search_agent_A2A/search_agent/modules/reflector.py create mode 100644 search_agent/search_agent_A2A/search_agent/modules/result_processor.py create mode 100644 search_agent/search_agent_A2A/search_agent/modules/search_executor.py create mode 100644 search_agent/search_agent_A2A/search_agent/modules/search_planner.py create mode 100644 search_agent/search_agent_A2A/search_agent/tools/__init__.py create mode 100644 search_agent/search_agent_A2A/search_agent/tools/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/search_agent/tools/__pycache__/jina_reader.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/search_agent/tools/__pycache__/jina_reranker.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/search_agent/tools/__pycache__/serper.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/search_agent/tools/jina_reader.py create mode 100644 search_agent/search_agent_A2A/search_agent/tools/jina_reranker.py create mode 100644 search_agent/search_agent_A2A/search_agent/tools/serper.py create mode 100644 search_agent/search_agent_A2A/search_agent/utils/__init__.py create mode 100644 search_agent/search_agent_A2A/search_agent/utils/__pycache__/__init__.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/search_agent/utils/__pycache__/helpers.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/search_agent/utils/__pycache__/llm_client.cpython-312.pyc create mode 100644 search_agent/search_agent_A2A/search_agent/utils/helpers.py create mode 100644 search_agent/search_agent_A2A/search_agent/utils/llm_client.py create mode 100644 search_agent/search_agent_A2A/search_agent_A2A.Dockerfile create mode 100644 search_agent/search_agent_A2A/test_a2a.py create mode 100644 search_agent/search_agent_MCP/README.md create mode 100644 search_agent/search_agent_MCP/USER_GUIDE.md create mode 100644 search_agent/search_agent_MCP/__init__.py create mode 100644 search_agent/search_agent_MCP/__pycache__/agent.cpython-312.pyc create mode 100644 search_agent/search_agent_MCP/__pycache__/config.cpython-312.pyc create mode 100644 search_agent/search_agent_MCP/__pycache__/main.cpython-312.pyc create mode 100644 search_agent/search_agent_MCP/__pycache__/mcp_config.cpython-312.pyc create mode 100644 search_agent/search_agent_MCP/__pycache__/mcp_server.cpython-312.pyc create mode 100644 search_agent/search_agent_MCP/agent.py create mode 100644 search_agent/search_agent_MCP/main.py create mode 100644 search_agent/search_agent_MCP/mcp_config.py create mode 100644 search_agent/search_agent_MCP/mcp_server.py create mode 100644 search_agent/search_agent_MCP/requirements.txt create mode 120000 search_agent/search_agent_MCP/search_agent create mode 100644 search_agent/search_agent_MCP/search_agent_MCP.Dockerfile create mode 100644 search_agent/search_agent_MCP/test_mcp.py create mode 100644 search_agent/search_agent_MCP/test_mcp_structure.py create mode 100644 search_agent/search_agent_main.py diff --git a/a2a_litellm_agent/__init__.py b/a2a_litellm_agent/__init__.py new file mode 100644 index 0000000..be466b1 --- /dev/null +++ b/a2a_litellm_agent/__init__.py @@ -0,0 +1,16 @@ +""" +A2A LiteLLM Agent Package +""" +from .agent import LiteLLMAgent +from .config import get_config, LiteLLMConfig, AgentConfig, A2AConfig +from .a2a_server import A2AAgentServer, create_app + +__all__ = [ + "LiteLLMAgent", + "get_config", + "LiteLLMConfig", + "AgentConfig", + "A2AConfig", + "A2AAgentServer", + "create_app" +] diff --git a/a2a_litellm_agent/a2a_litellm_agent.Dockerfile b/a2a_litellm_agent/a2a_litellm_agent.Dockerfile new file mode 100644 index 0000000..f364ab0 --- /dev/null +++ b/a2a_litellm_agent/a2a_litellm_agent.Dockerfile @@ -0,0 +1,43 @@ +# A2A LiteLLM Agent Dockerfile +FROM python:3.11-slim + +WORKDIR /app + +# 安装系统依赖 +RUN apt-get update && apt-get install -y --no-install-recommends \ + gcc \ + curl \ + && rm -rf /var/lib/apt/lists/* + +# 复制依赖文件 +COPY agents/a2a_litellm_agent/requirements.txt . + +# 安装Python依赖 +RUN pip install --no-cache-dir -r requirements.txt requests + +# 复制 common 模块(回调工具) +COPY common/agent_callback_utils.py /app/common/ +RUN touch /app/common/__init__.py + +# 复制应用代码 +COPY agents/a2a_litellm_agent/*.py /app/ + +# 设置环境变量 +ENV SERVICE_HOST=0.0.0.0 +ENV SERVICE_PORT=8080 +ENV POD_NAME=a2a-litellm-agent +ENV TEMPLATE_TYPE=a2a_litellm_agent +ENV PYTHONUNBUFFERED=1 + +# 回调配置 +ENV AGENT_CALLBACK_URL=http://mcp-server.taiji-ai.svc.cluster.local:8002/api/v1/billing/agent-callback + +# 健康检查 +HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \ + CMD python3 -c "import urllib.request; urllib.request.urlopen('http://localhost:8080/health').read()" || exit 1 + +# 暴露端口 +EXPOSE 8080 + +# 启动命令 +CMD ["python", "main.py"] diff --git a/a2a_litellm_agent/a2a_server.py b/a2a_litellm_agent/a2a_server.py new file mode 100644 index 0000000..67df7a9 --- /dev/null +++ b/a2a_litellm_agent/a2a_server.py @@ -0,0 +1,539 @@ +""" +A2A协议兼容的Agent服务 + +实现Google Agent2Agent协议规范 +支持从请求传入 API key,也支持从环境变量获取 +""" +import asyncio +import json +import uuid +import os +from typing import Optional, Dict, Any, AsyncGenerator +from datetime import datetime +from contextlib import asynccontextmanager + +from fastapi import FastAPI, HTTPException, Request, Response +from fastapi.responses import StreamingResponse, JSONResponse +from fastapi.middleware.cors import CORSMiddleware +from pydantic import BaseModel, Field +import structlog + +from agent import LiteLLMAgent +from config import get_config, AgentConfig, A2AConfig + +# 配置日志 +logger = structlog.get_logger() + +# 环境变量配置 +SERVICE_HOST = os.getenv("SERVICE_HOST", "0.0.0.0") +SERVICE_PORT = int(os.getenv("SERVICE_PORT", "8080")) +POD_NAME = os.getenv("POD_NAME", "a2a-litellm-agent") +TEMPLATE_TYPE = os.getenv("TEMPLATE_TYPE", "a2a_litellm_agent") + +# ============== A2A 协议数据模型 ============== + + +class A2APart(BaseModel): + """A2A消息部分""" + kind: str = "text" + text: Optional[str] = None + data: Optional[Dict[str, Any]] = None + mime_type: Optional[str] = None + + +class A2AMessage(BaseModel): + """A2A消息""" + role: str + parts: list[A2APart] + messageId: str = Field(default_factory=lambda: uuid.uuid4().hex) + + +class A2AMessageSendParams(BaseModel): + """A2A发送消息参数""" + message: A2AMessage + configuration: Optional[Dict[str, Any]] = None + api_key: Optional[str] = Field(None, description="LiteLLM API密钥(可选,优先使用,否则从环境变量获取)") + model: Optional[str] = Field(None, description="模型名称(可选,优先使用,否则从环境变量获取)") + + +class A2ARequest(BaseModel): + """A2A JSON-RPC请求""" + jsonrpc: str = "2.0" + id: str + method: str + params: Optional[Dict[str, Any]] = None + + +class A2AArtifact(BaseModel): + """A2A响应工件""" + artifactId: str = Field(default_factory=lambda: uuid.uuid4().hex) + name: str = "response" + parts: list[A2APart] + + +class A2ATaskStatus(BaseModel): + """A2A任务状态""" + state: str # submitted, working, input-required, completed, failed, canceled + timestamp: str = Field(default_factory=lambda: datetime.utcnow().isoformat() + "Z") + message: Optional[str] = None + + +class A2ATask(BaseModel): + """A2A任务""" + kind: str = "task" + id: str = Field(default_factory=lambda: uuid.uuid4().hex) + contextId: str = Field(default_factory=lambda: uuid.uuid4().hex) + status: A2ATaskStatus + artifacts: Optional[list[A2AArtifact]] = None + + +class A2AResponse(BaseModel): + """A2A JSON-RPC响应""" + jsonrpc: str = "2.0" + id: str + result: Optional[A2ATask] = None + error: Optional[Dict[str, Any]] = None + + +class A2AStreamEvent(BaseModel): + """A2A流式事件""" + kind: str + taskId: str + contextId: str + data: Optional[Dict[str, Any]] = None + + +# ============== Agent Card ============== + + +class AgentSkill(BaseModel): + """Agent技能""" + id: str + name: str + description: str + inputSchema: Optional[Dict[str, Any]] = None + outputSchema: Optional[Dict[str, Any]] = None + + +class AgentCapabilities(BaseModel): + """Agent能力""" + text: bool = True + streaming: bool = True + push_notifications: bool = False + forms: bool = False + files: bool = False + + +class AgentCard(BaseModel): + """A2A Agent Card - 描述Agent能力""" + name: str + description: str + version: str + url: str + capabilities: AgentCapabilities + skills: list[AgentSkill] + authentication: Optional[Dict[str, Any]] = None + + +# ============== A2A Server ============== + + +class A2AAgentServer: + """A2A协议Agent服务器""" + + def __init__( + self, + api_key: Optional[str] = None, + model: Optional[str] = None + ): + """ + 初始化A2A Agent服务器 + + Args: + api_key: LiteLLM API密钥(可选,优先使用,否则从环境变量获取) + model: 模型名称(可选,优先使用,否则从环境变量获取) + """ + # 获取配置 + self.llm_config, self.agent_config, self.a2a_config = get_config(api_key, model) + + # 创建Agent(使用默认配置) + self.default_agent = LiteLLMAgent( + litellm_config=self.llm_config, + agent_config=self.agent_config + ) + + # 任务存储 + self.tasks: Dict[str, A2ATask] = {} + + # 创建FastAPI应用 + self.app = self._create_app() + + def _create_app(self) -> FastAPI: + """创建FastAPI应用""" + + @asynccontextmanager + async def lifespan(app: FastAPI): + logger.info("A2A Agent服务启动", agent_name=self.agent_config.name) + yield + await self.default_agent.close() + logger.info("A2A Agent服务关闭") + + app = FastAPI( + title=f"{self.agent_config.name} - A2A Agent", + description=self.agent_config.description, + version=self.agent_config.version, + lifespan=lifespan + ) + + # CORS中间件 + app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], + ) + + # 注册路由 + self._register_routes(app) + + return app + + def _get_agent(self, api_key: Optional[str] = None, model: Optional[str] = None) -> LiteLLMAgent: + """ + 获取Agent实例 + + 如果提供了api_key或model,创建新的Agent实例 + 否则使用默认Agent + """ + if api_key or model: + # 创建新的配置和Agent + llm_config, agent_config, _ = get_config(api_key, model) + return LiteLLMAgent(litellm_config=llm_config, agent_config=agent_config) + return self.default_agent + + def _register_routes(self, app: FastAPI): + """注册A2A协议路由""" + + @app.get("/") + async def root(): + """服务根路径""" + return { + "name": self.agent_config.name, + "version": self.agent_config.version, + "protocol": "A2A", + "status": "running", + "pod_name": POD_NAME, + "template_type": TEMPLATE_TYPE + } + + @app.get("/health") + async def health_check(): + """健康检查""" + return { + "status": "healthy", + "pod_name": POD_NAME, + "template_type": TEMPLATE_TYPE, + "configured": self.llm_config.api_key is not None, + "timestamp": datetime.utcnow().isoformat() + } + + @app.get("/.well-known/agent.json") + async def get_agent_card(request: Request): + """获取Agent Card (A2A发现协议)""" + base_url = str(request.base_url).rstrip("/") + + card = AgentCard( + name=self.agent_config.name, + description=self.agent_config.description, + version=self.agent_config.version, + url=base_url, + capabilities=AgentCapabilities( + text=True, + streaming=self.agent_config.enable_streaming, + push_notifications=False + ), + skills=[ + AgentSkill( + id="general-assistant", + name="通用助手", + description="回答问题、提供建议、协助完成各种任务" + ), + AgentSkill( + id="code-helper", + name="代码助手", + description="编写、解释和调试代码" + ) + ] + ) + return card.model_dump() + + @app.post("/message/send") + async def send_message(request: Request): + """A2A message/send 端点""" + body = await request.json() + + # 解析JSON-RPC请求 + try: + rpc_request = A2ARequest(**body) + except Exception as e: + return JSONResponse({ + "jsonrpc": "2.0", + "id": body.get("id", "unknown"), + "error": { + "code": -32600, + "message": f"Invalid Request: {str(e)}" + } + }) + + # 处理 message/send 方法 + if rpc_request.method == "message/send": + return await self._handle_message_send(rpc_request) + elif rpc_request.method == "message/stream": + return await self._handle_message_stream(rpc_request) + else: + return JSONResponse({ + "jsonrpc": "2.0", + "id": rpc_request.id, + "error": { + "code": -32601, + "message": f"Method not found: {rpc_request.method}" + } + }) + + @app.post("/message/stream") + async def stream_message(request: Request): + """A2A message/stream 端点 (SSE流式响应)""" + body = await request.json() + + try: + rpc_request = A2ARequest(**body) + except Exception as e: + return JSONResponse({ + "jsonrpc": "2.0", + "id": body.get("id", "unknown"), + "error": { + "code": -32600, + "message": f"Invalid Request: {str(e)}" + } + }) + + return await self._handle_message_stream(rpc_request) + + @app.get("/tasks/{task_id}") + async def get_task(task_id: str): + """获取任务状态""" + if task_id not in self.tasks: + raise HTTPException(status_code=404, detail="Task not found") + return self.tasks[task_id].model_dump() + + async def _handle_message_send(self, request: A2ARequest) -> JSONResponse: + """处理 message/send 请求""" + params = request.params or {} + message_data = params.get("message", {}) + + # 提取API key和model(如果提供) + api_key = params.get("api_key") or os.getenv("LITELLM_API_KEY") + model = params.get("model") or os.getenv("MODEL_NAME") or os.getenv("LITELLM_MODEL") + + # 提取用户消息文本 + user_text = "" + parts = message_data.get("parts", []) + for part in parts: + if part.get("kind") == "text": + user_text += part.get("text", "") + + if not user_text: + return JSONResponse({ + "jsonrpc": "2.0", + "id": request.id, + "error": { + "code": -32602, + "message": "Invalid params: no text content found" + } + }) + + # 创建任务 + task_id = uuid.uuid4().hex + context_id = params.get("contextId", uuid.uuid4().hex) + + task = A2ATask( + id=task_id, + contextId=context_id, + status=A2ATaskStatus(state="working") + ) + self.tasks[task_id] = task + + try: + # 获取Agent实例(如果提供了api_key或model,使用新的实例) + agent = self._get_agent(api_key, model) + + # 调用Agent获取响应 + logger.info("处理消息", task_id=task_id, message_preview=user_text[:50]) + + response_text = await agent.chat( + message=user_text, + conversation_id=context_id + ) + + # 如果创建了新Agent,关闭它 + if api_key or model: + await agent.close() + + # 更新任务状态 + task.status = A2ATaskStatus(state="completed") + task.artifacts = [ + A2AArtifact( + name="response", + parts=[A2APart(kind="text", text=response_text)] + ) + ] + self.tasks[task_id] = task + + return JSONResponse({ + "jsonrpc": "2.0", + "id": request.id, + "result": task.model_dump() + }) + + except Exception as e: + logger.error("处理消息失败", error=str(e)) + task.status = A2ATaskStatus(state="failed", message=str(e)) + self.tasks[task_id] = task + + return JSONResponse({ + "jsonrpc": "2.0", + "id": request.id, + "error": { + "code": -32000, + "message": f"Agent error: {str(e)}" + } + }) + + async def _handle_message_stream(self, request: A2ARequest) -> StreamingResponse: + """处理 message/stream 请求 (SSE)""" + params = request.params or {} + message_data = params.get("message", {}) + + # 提取API key和model(如果提供) + api_key = params.get("api_key") or os.getenv("LITELLM_API_KEY") + model = params.get("model") or os.getenv("MODEL_NAME") or os.getenv("LITELLM_MODEL") + + # 提取用户消息 + user_text = "" + parts = message_data.get("parts", []) + for part in parts: + if part.get("kind") == "text": + user_text += part.get("text", "") + + task_id = uuid.uuid4().hex + context_id = params.get("contextId", uuid.uuid4().hex) + + async def event_generator() -> AsyncGenerator[str, None]: + """生成SSE事件流""" + agent = None + try: + # 获取Agent实例 + agent = self._get_agent(api_key, model) + + # 发送任务开始事件 + start_event = { + "kind": "task-start", + "taskId": task_id, + "contextId": context_id + } + yield f"data: {json.dumps(start_event)}\n\n" + + # 获取流式响应 + stream = await agent.chat( + message=user_text, + conversation_id=context_id, + stream=True + ) + + full_response = "" + async for chunk in stream: + full_response += chunk + # 发送文本增量事件 + delta_event = { + "kind": "artifact-delta", + "taskId": task_id, + "contextId": context_id, + "data": { + "kind": "text", + "text": chunk + } + } + yield f"data: {json.dumps(delta_event)}\n\n" + + # 发送完成事件 + complete_event = { + "kind": "task-complete", + "taskId": task_id, + "contextId": context_id, + "data": { + "status": "completed", + "artifacts": [{ + "name": "response", + "parts": [{"kind": "text", "text": full_response}] + }] + } + } + yield f"data: {json.dumps(complete_event)}\n\n" + + except Exception as e: + # 发送错误事件 + error_event = { + "kind": "task-error", + "taskId": task_id, + "contextId": context_id, + "data": { + "error": str(e) + } + } + yield f"data: {json.dumps(error_event)}\n\n" + finally: + # 如果创建了新Agent,关闭它 + if agent and (api_key or model): + await agent.close() + + return StreamingResponse( + event_generator(), + media_type="text/event-stream", + headers={ + "Cache-Control": "no-cache", + "Connection": "keep-alive", + "X-Accel-Buffering": "no" + } + ) + + def run(self, host: Optional[str] = None, port: Optional[int] = None): + """运行服务器""" + import uvicorn + + host = host or self.agent_config.host + port = port or self.agent_config.port + + logger.info(f"启动A2A Agent服务", host=host, port=port) + uvicorn.run(self.app, host=host, port=port) + + +def create_app(api_key: Optional[str] = None, model: Optional[str] = None) -> FastAPI: + """ + 创建FastAPI应用(用于uvicorn启动) + + 使用方式: + uvicorn a2a_server:app --host 0.0.0.0 --port 8080 + + 或设置环境变量后: + export LITELLM_API_KEY="your-key" + export MODEL_NAME="your-model" + uvicorn a2a_server:app --host 0.0.0.0 --port 8080 + """ + server = A2AAgentServer(api_key=api_key, model=model) + return server.app + + +# uvicorn 启动入口 +# 环境变量: LITELLM_API_KEY, MODEL_NAME (或 LITELLM_MODEL) +app = create_app() diff --git a/a2a_litellm_agent/agent.py b/a2a_litellm_agent/agent.py new file mode 100644 index 0000000..efdd611 --- /dev/null +++ b/a2a_litellm_agent/agent.py @@ -0,0 +1,282 @@ +""" +LiteLLM Agent 核心模块 + +基于LiteLLM框架的Agent实现,支持A2A协议 +""" +import asyncio +import json +import uuid +from typing import AsyncGenerator, Optional, Dict, Any, List +from dataclasses import dataclass, field +from datetime import datetime + +import httpx +import structlog + +from config import LiteLLMConfig, AgentConfig, get_config + +# 配置日志 +logger = structlog.get_logger() + + +@dataclass +class Message: + """消息数据结构""" + role: str # user, assistant, system + content: str + message_id: str = field(default_factory=lambda: uuid.uuid4().hex) + timestamp: datetime = field(default_factory=datetime.now) + metadata: Dict[str, Any] = field(default_factory=dict) + + +@dataclass +class Conversation: + """对话上下文""" + conversation_id: str = field(default_factory=lambda: uuid.uuid4().hex) + messages: List[Message] = field(default_factory=list) + created_at: datetime = field(default_factory=datetime.now) + + def add_message(self, role: str, content: str) -> Message: + """添加消息到对话""" + msg = Message(role=role, content=content) + self.messages.append(msg) + return msg + + def to_openai_format(self) -> List[Dict[str, str]]: + """转换为OpenAI格式的消息列表""" + return [{"role": m.role, "content": m.content} for m in self.messages] + + +class LiteLLMAgent: + """ + 基于LiteLLM的Agent实现 + + 支持功能: + - 多轮对话 + - 流式响应 + - 工具调用 + - A2A协议兼容 + """ + + def __init__( + self, + api_key: Optional[str] = None, + model: Optional[str] = None, + litellm_config: Optional[LiteLLMConfig] = None, + agent_config: Optional[AgentConfig] = None + ): + """ + 初始化Agent + + Args: + api_key: LiteLLM API密钥(可选,优先使用,否则从环境变量获取) + model: 模型名称(可选,优先使用,否则从环境变量获取) + litellm_config: LiteLLM配置对象 + agent_config: Agent配置对象 + """ + if litellm_config: + self.llm_config = litellm_config + else: + self.llm_config = LiteLLMConfig(api_key=api_key, model=model) + + if agent_config: + self.agent_config = agent_config + else: + self.agent_config = AgentConfig() + + # 验证配置 + self.llm_config.validate() + + # HTTP客户端 + self._client: Optional[httpx.AsyncClient] = None + + # 对话管理 + self.conversations: Dict[str, Conversation] = {} + + # 工具注册 + self.tools: Dict[str, callable] = {} + + logger.info( + "Agent初始化完成", + agent_name=self.agent_config.name, + model=self.llm_config.model, + base_url=self.llm_config.base_url + ) + + async def _get_client(self) -> httpx.AsyncClient: + """获取或创建HTTP客户端""" + if self._client is None or self._client.is_closed: + self._client = httpx.AsyncClient( + timeout=httpx.Timeout(self.llm_config.timeout), + headers={ + "Authorization": f"Bearer {self.llm_config.api_key}", + "Content-Type": "application/json" + } + ) + return self._client + + async def close(self): + """关闭资源""" + if self._client and not self._client.is_closed: + await self._client.aclose() + + def register_tool(self, name: str, func: callable, description: str = ""): + """注册工具函数""" + self.tools[name] = { + "function": func, + "description": description + } + logger.info(f"注册工具: {name}") + + def get_or_create_conversation(self, conversation_id: Optional[str] = None) -> Conversation: + """获取或创建对话""" + if conversation_id and conversation_id in self.conversations: + return self.conversations[conversation_id] + + conv = Conversation(conversation_id=conversation_id or uuid.uuid4().hex) + # 添加系统提示 + conv.add_message("system", self.agent_config.system_prompt) + self.conversations[conv.conversation_id] = conv + return conv + + async def chat( + self, + message: str, + conversation_id: Optional[str] = None, + stream: bool = False + ) -> str | AsyncGenerator[str, None]: + """ + 发送消息并获取回复 + + Args: + message: 用户消息 + conversation_id: 对话ID(用于多轮对话) + stream: 是否流式响应 + + Returns: + 如果stream=False,返回完整回复字符串 + 如果stream=True,返回异步生成器 + """ + # 获取对话上下文 + conversation = self.get_or_create_conversation(conversation_id) + conversation.add_message("user", message) + + if stream: + return self._stream_chat(conversation) + else: + return await self._simple_chat(conversation) + + async def _simple_chat(self, conversation: Conversation) -> str: + """非流式对话""" + client = await self._get_client() + + request_body = { + "model": self.llm_config.model, + "messages": conversation.to_openai_format(), + "temperature": self.llm_config.temperature, + "max_tokens": self.llm_config.max_tokens + } + + logger.debug("发送请求", endpoint=self.llm_config.chat_endpoint) + + try: + response = await client.post( + self.llm_config.chat_endpoint, + json=request_body + ) + response.raise_for_status() + + result = response.json() + assistant_message = result["choices"][0]["message"]["content"] + + # 保存助手回复到对话 + conversation.add_message("assistant", assistant_message) + + logger.info("收到回复", length=len(assistant_message)) + return assistant_message + + except httpx.HTTPStatusError as e: + logger.error("HTTP错误", status_code=e.response.status_code, detail=e.response.text) + raise + except Exception as e: + logger.error("请求失败", error=str(e)) + raise + + async def _stream_chat(self, conversation: Conversation) -> AsyncGenerator[str, None]: + """流式对话""" + client = await self._get_client() + + request_body = { + "model": self.llm_config.model, + "messages": conversation.to_openai_format(), + "temperature": self.llm_config.temperature, + "max_tokens": self.llm_config.max_tokens, + "stream": True + } + + full_response = "" + + try: + async with client.stream( + "POST", + self.llm_config.chat_endpoint, + json=request_body + ) as response: + response.raise_for_status() + + async for line in response.aiter_lines(): + if line.startswith("data: "): + data = line[6:] + if data == "[DONE]": + break + + try: + chunk = json.loads(data) + delta = chunk.get("choices", [{}])[0].get("delta", {}) + content = delta.get("content", "") + if content: + full_response += content + yield content + except json.JSONDecodeError: + continue + + # 保存完整回复到对话 + conversation.add_message("assistant", full_response) + + except Exception as e: + logger.error("流式请求失败", error=str(e)) + raise + + async def invoke_tool(self, tool_name: str, **kwargs) -> Any: + """调用注册的工具""" + if tool_name not in self.tools: + raise ValueError(f"未找到工具: {tool_name}") + + tool = self.tools[tool_name] + func = tool["function"] + + logger.info(f"调用工具: {tool_name}", kwargs=kwargs) + + if asyncio.iscoroutinefunction(func): + return await func(**kwargs) + else: + return func(**kwargs) + + +# 示例工具函数 +def tool_get_current_time() -> str: + """获取当前时间""" + return datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + +def tool_calculate(expression: str) -> str: + """计算数学表达式""" + try: + # 安全的数学计算 + allowed_chars = set("0123456789+-*/.() ") + if not all(c in allowed_chars for c in expression): + return "错误: 不支持的字符" + result = eval(expression) + return str(result) + except Exception as e: + return f"计算错误: {str(e)}" diff --git a/a2a_litellm_agent/config.py b/a2a_litellm_agent/config.py new file mode 100644 index 0000000..877202a --- /dev/null +++ b/a2a_litellm_agent/config.py @@ -0,0 +1,145 @@ +""" +LiteLLM Agent 配置模块 + +支持用户传入密钥和模型名称,同时支持从环境变量获取 +""" +import os +from dataclasses import dataclass, field +from typing import Optional +from dotenv import load_dotenv + +# 加载环境变量 +load_dotenv() + + +@dataclass +class LiteLLMConfig: + """LiteLLM 配置""" + # 基础URL - 用户提供的LiteLLM服务地址 + base_url: str = "https://litellm.graystone-fb459c5d.southeastasia.azurecontainerapps.io" + + # 完整的chat completions端点 + chat_endpoint: str = field(init=False) + + # API密钥 - 优先使用传入的,否则从环境变量获取 + api_key: Optional[str] = None + + # 模型名称 - 优先使用传入的,否则从环境变量获取 + model: Optional[str] = None + + # 请求超时时间(秒) + timeout: int = 120 + + # 最大重试次数 + max_retries: int = 3 + + # 温度参数 + temperature: float = 0.7 + + # 最大token数 + max_tokens: int = 4096 + + def __post_init__(self): + self.chat_endpoint = f"{self.base_url}/chat/completions" + + # 从环境变量读取(如果未直接提供) + if self.api_key is None: + self.api_key = os.getenv("LITELLM_API_KEY") + if self.model is None: + self.model = os.getenv("MODEL_NAME") or os.getenv("LITELLM_MODEL", "gpt-4") + + def validate(self) -> bool: + """验证配置是否完整""" + if not self.api_key: + raise ValueError("API密钥未设置! 请设置 LITELLM_API_KEY 环境变量或直接传入 api_key") + if not self.model: + raise ValueError("模型名称未设置! 请设置 MODEL_NAME 环境变量或直接传入 model") + return True + + +@dataclass +class AgentConfig: + """Agent 配置""" + # Agent名称 + name: str = "xiaohei-agent" + + # Agent描述 + description: str = "一个基于LiteLLM的智能Agent,支持A2A协议" + + # Agent版本 + version: str = "1.0.0" + + # 服务端口 + port: int = 8080 + + # 服务主机 + host: str = "0.0.0.0" + + # 是否启用流式响应 + enable_streaming: bool = True + + # 系统提示词 + system_prompt: str = """你是小黑Agent,一个智能助手。 +你可以帮助用户完成各种任务,包括: + +- 回答问题 + +- 代码编写和解释 + +- 文档分析 + +- 任务规划 + +请用中文回答用户的问题,保持友好和专业。""" + + +@dataclass +class A2AConfig: + """A2A协议配置""" + # A2A协议版本 + protocol_version: str = "1.0" + + # Agent Card配置 + agent_card: dict = field(default_factory=lambda: { + "name": "xiaohei-agent", + "description": "基于LiteLLM的智能Agent,支持A2A协议通信", + "version": "1.0.0", + "capabilities": { + "text": True, + "streaming": True, + "push_notifications": False + }, + "skills": [ + { + "id": "general-assistant", + "name": "通用助手", + "description": "回答问题、提供建议、协助任务" + }, + { + "id": "code-helper", + "name": "代码助手", + "description": "编写、解释和调试代码" + } + ] + }) + + +def get_config( + api_key: Optional[str] = None, + model: Optional[str] = None +) -> tuple[LiteLLMConfig, AgentConfig, A2AConfig]: + """ + 获取完整配置 + + Args: + api_key: LiteLLM API密钥(可选,优先使用,否则从环境变量获取) + model: 模型名称(可选,优先使用,否则从环境变量获取) + + Returns: + (LiteLLMConfig, AgentConfig, A2AConfig) 配置元组 + """ + litellm_config = LiteLLMConfig(api_key=api_key, model=model) + agent_config = AgentConfig() + a2a_config = A2AConfig() + + return litellm_config, agent_config, a2a_config diff --git a/a2a_litellm_agent/main.py b/a2a_litellm_agent/main.py new file mode 100644 index 0000000..0510322 --- /dev/null +++ b/a2a_litellm_agent/main.py @@ -0,0 +1,43 @@ +""" +A2A LiteLLM Agent 主入口 +支持从环境变量或请求传入 API key +""" +import os +import uvicorn +from a2a_server import create_app + +# 环境变量配置 +SERVICE_HOST = os.getenv("SERVICE_HOST", "0.0.0.0") +SERVICE_PORT = int(os.getenv("SERVICE_PORT", "8080")) +POD_NAME = os.getenv("POD_NAME", "a2a-litellm-agent") +TEMPLATE_TYPE = os.getenv("TEMPLATE_TYPE", "a2a_litellm_agent") + +# 从环境变量获取默认配置(可选) +default_api_key = os.getenv("LITELLM_API_KEY") +default_model = os.getenv("MODEL_NAME") or os.getenv("LITELLM_MODEL") + +# 创建应用 +app = create_app(api_key=default_api_key, model=default_model) + + +def main(): + """主函数""" + print(f"🚀 启动 A2A LiteLLM Agent") + print(f" - Pod名称: {POD_NAME}") + print(f" - 模板类型: {TEMPLATE_TYPE}") + print(f" - 服务地址: http://{SERVICE_HOST}:{SERVICE_PORT}") + if default_api_key: + print(f" - 已配置默认 API key(可通过请求覆盖)") + else: + print(f" - 未配置默认 API key,需在请求中传入") + + uvicorn.run( + app, + host=SERVICE_HOST, + port=SERVICE_PORT, + log_level="info" + ) + + +if __name__ == "__main__": + main() diff --git a/a2a_litellm_agent/requirements.txt b/a2a_litellm_agent/requirements.txt new file mode 100644 index 0000000..8f44ea1 --- /dev/null +++ b/a2a_litellm_agent/requirements.txt @@ -0,0 +1,7 @@ +# LiteLLM Agent API服务依赖 +httpx>=0.27.0 +fastapi>=0.115.0 +uvicorn[standard]>=0.32.0 +pydantic>=2.0.0 +python-dotenv>=1.0.0 +structlog>=24.0.0 diff --git a/azure_blob_agent/azure_blob_agent.Dockerfile b/azure_blob_agent/azure_blob_agent.Dockerfile new file mode 100644 index 0000000..36fa495 --- /dev/null +++ b/azure_blob_agent/azure_blob_agent.Dockerfile @@ -0,0 +1,36 @@ +FROM python:3.11-slim + +WORKDIR /app + +# 安装系统依赖 +RUN apt-get update && apt-get install -y \ + curl \ + && rm -rf /var/lib/apt/lists/* + +# 安装Python依赖 +RUN pip install --no-cache-dir \ + fastapi==0.109.0 \ + uvicorn[standard]==0.27.0 \ + pydantic==2.5.3 \ + langchain==0.1.0 \ + langchain-community==0.0.10 \ + litellm==1.17.0 \ + azure-storage-blob==12.19.0 \ + azure-identity==1.15.0 + +# 复制agent代码和共享工具 +COPY agents/azure_blob_agent/azure_blob_agent.py . +COPY common/agent_callback_utils.py /app/common/ +COPY common/api_key_utils.py /app/common/ + +# 设置环境变量 +ENV PYTHONUNBUFFERED=1 +ENV SERVICE_HOST=0.0.0.0 +ENV SERVICE_PORT=8080 + +# 健康检查 - 使用Python避免僵尸进程 +HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ + CMD python3 -c "import urllib.request; urllib.request.urlopen('http://localhost:8080/health').read()" || exit 1 + +# 运行agent (直接使用Python,避免shell) +CMD ["python3", "-u", "azure_blob_agent.py"] diff --git a/azure_blob_agent/azure_blob_agent.py b/azure_blob_agent/azure_blob_agent.py new file mode 100644 index 0000000..8efdc0f --- /dev/null +++ b/azure_blob_agent/azure_blob_agent.py @@ -0,0 +1,536 @@ +""" +Azure Blob Storage AI Agent - 使用LangChain + LiteLLM实现 +通过HTTP API接收连接字符串,并提供智能文件操作功能 +""" +import os +import logging +import time +from typing import Optional, Dict, Any, List +from datetime import datetime +from fastapi import FastAPI, HTTPException +from pydantic import BaseModel, Field +from azure.storage.blob import BlobServiceClient, ContainerClient +from langchain.agents import Tool, AgentExecutor, create_react_agent +from langchain.prompts import PromptTemplate +from langchain_community.chat_models import ChatLiteLLM +import uvicorn +from agent_callback_utils import AgentCallbackHandler, CallbackContextManager + +# 配置日志 +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' +) +logger = logging.getLogger(__name__) + +# 环境变量配置 +SERVICE_HOST = os.getenv("SERVICE_HOST", "0.0.0.0") +SERVICE_PORT = int(os.getenv("SERVICE_PORT", "8080")) +POD_NAME = os.getenv("POD_NAME", "azure-blob-agent") +TEMPLATE_TYPE = os.getenv("TEMPLATE_TYPE", "azure_blob_agent") + +# LiteLLM配置(从环境变量获取) +LITELLM_API_BASE = os.getenv("LITELLM_API_BASE", "http://localhost:4000") +MODEL_NAME = os.getenv("MODEL_NAME") or os.getenv("LITELLM_MODEL", "gpt-3.5-turbo") + +# Azure Storage 连接字符串(从环境变量获取) +AZURE_STORAGE_CONNECTION_STRING = os.getenv("AZURE_STORAGE_CONNECTION_STRING", "") + +# 全局变量 +blob_service_client: Optional[BlobServiceClient] = None +connection_string: Optional[str] = None +callback_handler: Optional[AgentCallbackHandler] = None + +# FastAPI应用 +app = FastAPI( + title="Azure Blob Storage AI Agent", + description="智能Azure Blob存储管理代理", + version="1.0.0" +) + + +# ==================== 请求/响应模型 ==================== + +class ConnectRequest(BaseModel): + """连接请求""" + connection_string: str = Field(..., description="Azure Storage连接字符串") + + +class QueryRequest(BaseModel): + """查询请求""" + query: str = Field(..., description="自然语言查询或操作指令") + litellm_api_key: str = Field(..., description="LiteLLM API密钥") + user_id: Optional[str] = Field(None, description="用户ID(用于计费回调)") + container_name: Optional[str] = Field(None, description="指定容器名称") + + +class HealthResponse(BaseModel): + """健康检查响应""" + status: str + connected: bool + connection_info: Optional[Dict] = None + + +# ==================== Azure Blob Storage 工具函数 ==================== + +def list_containers_tool() -> str: + """列出所有容器""" + global blob_service_client + + if not blob_service_client: + return "错误: 未连接到Azure Blob Storage" + + try: + containers = blob_service_client.list_containers() + container_list = [] + for container in containers: + container_list.append({ + "name": container.name, + "last_modified": str(container.last_modified) + }) + + if not container_list: + return "当前没有容器" + + result = "容器列表:\n" + for i, c in enumerate(container_list, 1): + result += f"{i}. {c['name']} (最后修改: {c['last_modified']})\n" + + return result + except Exception as e: + logger.error(f"列出容器失败: {str(e)}") + return f"错误: {str(e)}" + + +def list_blobs_in_container(container_name: str) -> str: + """列出指定容器中的所有blob""" + global blob_service_client + + if not blob_service_client: + return "错误: 未连接到Azure Blob Storage" + + try: + container_client = blob_service_client.get_container_client(container_name) + blobs = container_client.list_blobs() + + blob_list = [] + for blob in blobs: + blob_list.append({ + "name": blob.name, + "size": blob.size, + "content_type": blob.content_settings.content_type if blob.content_settings else "unknown", + "last_modified": str(blob.last_modified) + }) + + if not blob_list: + return f"容器 '{container_name}' 中没有文件" + + result = f"容器 '{container_name}' 中的文件列表:\n" + total_size = 0 + for i, b in enumerate(blob_list, 1): + size_mb = b['size'] / (1024 * 1024) + result += f"{i}. {b['name']} ({size_mb:.2f}MB, {b['content_type']})\n" + total_size += b['size'] + + result += f"\n总计: {len(blob_list)} 个文件, {total_size / (1024 * 1024):.2f}MB" + + return result + except Exception as e: + logger.error(f"列出blob失败: {str(e)}") + return f"错误: {str(e)}" + + +def get_blob_info(container_name: str, blob_name: str) -> str: + """获取blob的详细信息""" + global blob_service_client + + if not blob_service_client: + return "错误: 未连接到Azure Blob Storage" + + try: + blob_client = blob_service_client.get_blob_client(container_name, blob_name) + properties = blob_client.get_blob_properties() + + info = f"文件信息: {blob_name}\n" + info += f"- 容器: {container_name}\n" + info += f"- 大小: {properties.size / (1024 * 1024):.2f}MB\n" + info += f"- 类型: {properties.content_settings.content_type if properties.content_settings else 'unknown'}\n" + info += f"- 创建时间: {properties.creation_time}\n" + info += f"- 最后修改: {properties.last_modified}\n" + info += f"- ETag: {properties.etag}\n" + + if properties.metadata: + info += f"- 元数据: {properties.metadata}\n" + + return info + except Exception as e: + logger.error(f"获取blob信息失败: {str(e)}") + return f"错误: {str(e)}" + + +def search_blobs(container_name: str, keyword: str) -> str: + """在容器中搜索包含关键字的blob""" + global blob_service_client + + if not blob_service_client: + return "错误: 未连接到Azure Blob Storage" + + try: + container_client = blob_service_client.get_container_client(container_name) + blobs = container_client.list_blobs() + + matched_blobs = [] + for blob in blobs: + if keyword.lower() in blob.name.lower(): + matched_blobs.append({ + "name": blob.name, + "size": blob.size, + "last_modified": str(blob.last_modified) + }) + + if not matched_blobs: + return f"在容器 '{container_name}' 中没有找到包含 '{keyword}' 的文件" + + result = f"搜索结果 (关键字: '{keyword}'):\n" + for i, b in enumerate(matched_blobs, 1): + result += f"{i}. {b['name']} ({b['size'] / 1024:.2f}KB)\n" + + return result + except Exception as e: + logger.error(f"搜索blob失败: {str(e)}") + return f"错误: {str(e)}" + + +def get_storage_stats() -> str: + """获取存储统计信息""" + global blob_service_client + + if not blob_service_client: + return "错误: 未连接到Azure Blob Storage" + + try: + containers = list(blob_service_client.list_containers()) + total_containers = len(containers) + total_blobs = 0 + total_size = 0 + + container_stats = [] + for container in containers: + container_client = blob_service_client.get_container_client(container.name) + blobs = list(container_client.list_blobs()) + blob_count = len(blobs) + container_size = sum(blob.size for blob in blobs) + + total_blobs += blob_count + total_size += container_size + + container_stats.append({ + "name": container.name, + "blobs": blob_count, + "size_mb": container_size / (1024 * 1024) + }) + + result = "存储统计信息:\n" + result += f"- 总容器数: {total_containers}\n" + result += f"- 总文件数: {total_blobs}\n" + result += f"- 总大小: {total_size / (1024 * 1024):.2f}MB\n\n" + + if container_stats: + result += "各容器详情:\n" + for stat in container_stats: + result += f" • {stat['name']}: {stat['blobs']} 个文件, {stat['size_mb']:.2f}MB\n" + + return result + except Exception as e: + logger.error(f"获取统计信息失败: {str(e)}") + return f"错误: {str(e)}" + + +# ==================== 创建LangChain Agent ==================== + +def create_blob_agent(litellm_api_key: str) -> Optional[AgentExecutor]: + """创建Azure Blob Storage Agent""" + global blob_service_client + + if not blob_service_client: + logger.warning("尚未连接到Azure Blob Storage") + return None + + # 初始化LiteLLM + try: + llm = ChatLiteLLM( + model=MODEL_NAME, + api_base=LITELLM_API_BASE, + api_key=litellm_api_key, + temperature=0 + ) + logger.info(f"✅ LiteLLM初始化成功: {MODEL_NAME} @ {LITELLM_API_BASE}") + except Exception as e: + logger.error(f"❌ LiteLLM初始化失败: {str(e)}") + return None + + # 定义工具 + tools = [ + Tool( + name="list_containers", + func=list_containers_tool, + description="列出所有Azure Blob Storage容器。当用户询问'有哪些容器'、'显示容器列表'时使用此工具。" + ), + Tool( + name="list_blobs", + func=lambda input_str: list_blobs_in_container(input_str), + description="列出指定容器中的所有文件。输入参数是容器名称。当用户询问'容器X中有什么文件'、'列出XXX容器的文件'时使用此工具。" + ), + Tool( + name="get_blob_info", + func=lambda input_str: get_blob_info(*input_str.split(",")), + description="获取特定文件的详细信息。输入格式: '容器名,文件名'。当用户询问'文件XXX的详细信息'、'XXX文件的属性'时使用此工具。" + ), + Tool( + name="search_blobs", + func=lambda input_str: search_blobs(*input_str.split(",", 1)), + description="在容器中搜索文件。输入格式: '容器名,关键字'。当用户询问'搜索包含XXX的文件'、'查找XXX'时使用此工具。" + ), + Tool( + name="get_storage_stats", + func=get_storage_stats, + description="获取存储的统计信息,包括容器数量、文件数量、总大小等。当用户询问'存储统计'、'有多少文件'、'占用多少空间'时使用此工具。" + ), + ] + + # 定义Agent Prompt + template = """你是一个Azure Blob Storage管理助手。你可以帮助用户管理和查询Azure存储中的文件。 + +可用工具: +{tools} + +工具名称: {tool_names} + +回答问题时请使用以下格式: + +Question: 用户的输入问题 +Thought: 你应该思考如何回答这个问题 +Action: 要使用的工具名称,必须是以下之一: [{tool_names}] +Action Input: 传递给工具的输入 +Observation: 工具返回的结果 +... (这个 Thought/Action/Action Input/Observation 可以重复N次) +Thought: 我现在知道最终答案了 +Final Answer: 对用户问题的最终回答 + +重要提示: +- 如果用户只是说"列出容器"或"显示容器",使用 list_containers 工具 +- 如果用户说"显示XXX容器的文件",使用 list_blobs 工具,传入容器名 +- 搜索时需要同时提供容器名和关键字 +- 获取文件信息时需要提供容器名和文件名,用逗号分隔 +- 始终用中文回答 + +开始! + +Question: {input} +Thought: {agent_scratchpad}""" + + prompt = PromptTemplate( + template=template, + input_variables=["input", "agent_scratchpad"], + partial_variables={ + "tools": "\n".join([f"- {tool.name}: {tool.description}" for tool in tools]), + "tool_names": ", ".join([tool.name for tool in tools]) + } + ) + + # 创建Agent + agent = create_react_agent(llm, tools, prompt) + + # 创建Agent执行器 + agent_executor = AgentExecutor( + agent=agent, + tools=tools, + verbose=True, + handle_parsing_errors=True, + max_iterations=5 + ) + + logger.info("✅ Azure Blob Storage Agent创建成功") + return agent_executor + + +# ==================== API端点 ==================== + +@app.get("/health", response_model=HealthResponse) +async def health_check(): + """健康检查""" + global blob_service_client, connection_string + + connected = blob_service_client is not None + + connection_info = None + if connected: + try: + # 获取账户信息 + account_info = blob_service_client.get_account_information() + connection_info = { + "account_kind": account_info.get('account_kind', 'unknown'), + "sku_name": account_info.get('sku_name', 'unknown'), + "connected_at": str(datetime.now()) + } + except Exception as e: + logger.error(f"获取账户信息失败: {str(e)}") + + return HealthResponse( + status="healthy" if connected else "not_connected", + connected=connected, + connection_info=connection_info + ) + + +@app.post("/connect") +async def connect_to_storage(request: ConnectRequest): + """连接到Azure Blob Storage""" + global blob_service_client, connection_string + + try: + # 创建BlobServiceClient + blob_service_client = BlobServiceClient.from_connection_string( + request.connection_string + ) + + # 测试连接 + account_info = blob_service_client.get_account_information() + + connection_string = request.connection_string + + logger.info(f"✅ 成功连接到Azure Blob Storage") + + return { + "status": "connected", + "message": "成功连接到Azure Blob Storage", + "account_info": { + "account_kind": account_info.get('account_kind'), + "sku_name": account_info.get('sku_name') + } + } + except Exception as e: + logger.error(f"❌ 连接失败: {str(e)}") + blob_service_client = None + connection_string = None + raise HTTPException(status_code=400, detail=f"连接失败: {str(e)}") + + +@app.post("/query") +async def query_storage(request: QueryRequest): + """使用自然语言查询存储""" + global blob_service_client, callback_handler + + if not blob_service_client: + raise HTTPException( + status_code=400, + detail="未连接到Azure Blob Storage,请先调用 /connect" + ) + + # 初始化回调处理器 + if not callback_handler: + callback_handler = AgentCallbackHandler() + + # 使用上下文管理器自动处理回调 + with CallbackContextManager( + handler=callback_handler, + user_id=request.user_id, + request_id=f"blob-{int(time.time())}" + ) as ctx: + try: + ctx.add_tool("azure_blob_storage") + + # 创建Agent + agent = create_blob_agent(request.litellm_api_key) + + if not agent: + raise HTTPException(status_code=500, detail="Agent创建失败") + + # 执行查询 + logger.info(f"收到查询: {request.query}") + result = agent.invoke({"input": request.query}) + + return { + "status": "success", + "query": request.query, + "answer": result.get("output", "无法生成答案"), + "intermediate_steps": str(result.get("intermediate_steps", [])) + } + except Exception as e: + logger.error(f"查询执行失败: {str(e)}") + raise HTTPException(status_code=500, detail=f"查询失败: {str(e)}") + + +@app.get("/") +async def root(): + """根端点""" + return { + "service": "Azure Blob Storage AI Agent", + "version": "1.0.0", + "pod_name": POD_NAME, + "template": TEMPLATE_TYPE, + "connected": blob_service_client is not None, + "endpoints": { + "health": "/health", + "connect": "POST /connect", + "query": "POST /query" + } + } + + +# ==================== 主函数 ==================== + +def init_storage_connection(): + """启动时初始化存储连接""" + global blob_service_client, connection_string + + if AZURE_STORAGE_CONNECTION_STRING: + try: + logger.info("检测到环境变量中的连接字符串,尝试连接...") + blob_service_client = BlobServiceClient.from_connection_string( + AZURE_STORAGE_CONNECTION_STRING + ) + + # 测试连接 + account_info = blob_service_client.get_account_information() + connection_string = AZURE_STORAGE_CONNECTION_STRING + + logger.info(f"✅ 成功连接到Azure Blob Storage") + logger.info(f" - Account Kind: {account_info.get('account_kind')}") + logger.info(f" - SKU: {account_info.get('sku_name')}") + except Exception as e: + logger.error(f"❌ 启动时连接失败: {str(e)}") + logger.info("💡 提示: 可以稍后通过 /connect API 手动连接") + blob_service_client = None + connection_string = None + else: + logger.info("💡 未设置 AZURE_STORAGE_CONNECTION_STRING,需通过 /connect API 手动连接") + + +def main(): + """启动服务""" + global callback_handler + + logger.info(f"🚀 启动 Azure Blob Storage AI Agent") + logger.info(f" - Pod名称: {POD_NAME}") + logger.info(f" - 模板类型: {TEMPLATE_TYPE}") + logger.info(f" - LiteLLM: {MODEL_NAME} @ {LITELLM_API_BASE}") + logger.info(f" - 服务地址: http://{SERVICE_HOST}:{SERVICE_PORT}") + logger.info(f" ℹ️ API key 将从请求中获取") + + # 初始化存储连接 + init_storage_connection() + + # 初始化回调处理器 + callback_handler = AgentCallbackHandler() + + uvicorn.run( + app, + host=SERVICE_HOST, + port=SERVICE_PORT, + log_level="info" + ) + + +if __name__ == "__main__": + main() diff --git a/azure_blob_agent_a2a/azure_blob_agent_a2a.Dockerfile b/azure_blob_agent_a2a/azure_blob_agent_a2a.Dockerfile new file mode 100644 index 0000000..5193672 --- /dev/null +++ b/azure_blob_agent_a2a/azure_blob_agent_a2a.Dockerfile @@ -0,0 +1,29 @@ +# Azure Blob Agent - A2A 版本 Dockerfile +FROM python:3.11-slim + +WORKDIR /app + +# 安装系统依赖 +RUN apt-get update && apt-get install -y \ + gcc \ + && rm -rf /var/lib/apt/lists/* + +# 复制requirements文件 +COPY common/requirements_a2a.txt /app/ + +# 安装Python依赖 +RUN pip install --no-cache-dir -r requirements_a2a.txt + +# 复制应用代码和共享工具 +COPY agents/azure_blob_agent_a2a/azure_blob_agent_a2a.py /app/ +COPY common/api_key_utils.py /app/common/ + +# 暴露端口 +EXPOSE 8080 + +# 健康检查 +HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ + CMD python -c "import requests; requests.get('http://localhost:8080/health', timeout=5)" + +# 启动应用 +CMD ["python", "azure_blob_agent_a2a.py"] diff --git a/azure_blob_agent_a2a/azure_blob_agent_a2a.py b/azure_blob_agent_a2a/azure_blob_agent_a2a.py new file mode 100644 index 0000000..6343c5c --- /dev/null +++ b/azure_blob_agent_a2a/azure_blob_agent_a2a.py @@ -0,0 +1,663 @@ +""" +Azure Blob Storage AI Agent - A2A (Agent-to-Agent) 版本 +支持 Agent 之间的协作和通信 +""" +import os +import logging +import json +import httpx +from typing import Optional, Dict, Any, List +from datetime import datetime +from fastapi import FastAPI, HTTPException, Header +from pydantic import BaseModel, Field +from azure.storage.blob import BlobServiceClient, ContainerClient +import uvicorn +from api_key_utils import get_api_key + +# 配置日志 +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' +) +logger = logging.getLogger(__name__) + +# 环境变量配置 +SERVICE_HOST = os.getenv("SERVICE_HOST", "0.0.0.0") +SERVICE_PORT = int(os.getenv("SERVICE_PORT", "8080")) +POD_NAME = os.getenv("POD_NAME", "azure-blob-agent-a2a") +TEMPLATE_TYPE = os.getenv("TEMPLATE_TYPE", "azure_blob_agent_a2a") +AGENT_FRAMEWORK = os.getenv("AGENT_FRAMEWORK", "a2a") + +# 工具配置 +TOOLS_CONFIG = json.loads(os.getenv("TOOLS_CONFIG", "{}")) +TOOL_ENDPOINT = os.getenv("TOOL_ENDPOINT", "") +TOOL_API_KEY = os.getenv("TOOL_API_KEY", "") + +# 模型配置 +MODEL_PROVIDER = os.getenv("MODEL_PROVIDER", "openai") +MODEL_NAME = os.getenv("MODEL_NAME", "gpt-4") +MODEL_API_KEY = os.getenv("MODEL_API_KEY", "") +MODEL_ENDPOINT = os.getenv("MODEL_ENDPOINT", "https://api.openai.com/v1") + +# 存储配置 +AZURE_STORAGE_CONNECTION_STRING = os.getenv("AZURE_STORAGE_CONNECTION_STRING", "") +STORAGE_ACCOUNT_NAME = os.getenv("STORAGE_ACCOUNT_NAME", "") + +# 用户标识 +USER_ID = os.getenv("USER_ID", "") +TENANT_ID = os.getenv("TENANT_ID", "") +NAMESPACE = os.getenv("NAMESPACE", "ai-agents") + +# A2A Agent 配置 +AGENT_ID = os.getenv("AGENT_ID", POD_NAME) +AGENT_ROLE = os.getenv("AGENT_ROLE", "storage_manager") +AGENT_CAPABILITIES = json.loads(os.getenv("AGENT_CAPABILITIES", '["blob_storage", "file_operations"]')) + +# 全局存储客户端 +blob_service_client: Optional[BlobServiceClient] = None +connection_string: Optional[str] = None + +# A2A Agent 注册表 (其他可协作的 Agent) +registered_agents: Dict[str, Dict] = {} + +# FastAPI应用 +app = FastAPI( + title="Azure Blob Storage AI Agent (A2A)", + description="支持 Agent-to-Agent 协作的智能 Azure Blob 存储管理代理", + version="1.0.0" +) + + +# ==================== 请求/响应模型 ==================== + +class ConnectRequest(BaseModel): + """连接请求""" + connection_string: str = Field(..., description="Azure Storage连接字符串") + + +class A2AMessage(BaseModel): + """A2A 消息格式""" + message_id: str = Field(..., description="消息ID") + from_agent: str = Field(..., description="发送者 Agent ID") + to_agent: str = Field(..., description="接收者 Agent ID") + message_type: str = Field(..., description="消息类型: request/response/notification") + action: str = Field(..., description="请求的动作") + parameters: Dict[str, Any] = Field(default_factory=dict, description="参数") + context: Optional[Dict] = Field(default_factory=dict, description="上下文") + timestamp: Optional[str] = None + model_api_key: Optional[str] = Field(None, description="模型 API 密钥(可选,优先使用,否则从环境变量获取)") + + +class A2AQueryRequest(BaseModel): + """A2A 查询请求""" + query: str = Field(..., description="自然语言查询") + container_name: Optional[str] = None + requester_agent: Optional[str] = Field(None, description="请求者 Agent ID") + context: Optional[Dict] = Field(default_factory=dict) + model_api_key: Optional[str] = Field(None, description="模型 API 密钥(可选,优先使用,否则从环境变量获取)") + + +class A2ARegisterRequest(BaseModel): + """A2A Agent 注册请求""" + agent_id: str + agent_role: str + capabilities: List[str] + endpoint: str + + +class HealthResponse(BaseModel): + """健康检查响应""" + status: str + connected: bool + framework: str + agent_id: str + agent_role: str + capabilities: List[str] + user_id: Optional[str] = None + namespace: Optional[str] = None + registered_agents_count: int = 0 + connection_info: Optional[Dict] = None + + +# ==================== A2A 操作处理器 ==================== + +class A2AActionHandler: + """A2A 动作处理器""" + + @staticmethod + async def handle_list_containers(parameters: Dict) -> Dict: + """处理列出容器请求""" + global blob_service_client + + if not blob_service_client: + return {"error": "未连接到 Azure Blob Storage"} + + try: + containers = blob_service_client.list_containers() + container_list = [] + for container in containers: + container_list.append({ + "name": container.name, + "last_modified": str(container.last_modified) + }) + + return { + "success": True, + "containers": container_list, + "count": len(container_list) + } + except Exception as e: + logger.error(f"列出容器失败: {str(e)}") + return {"error": str(e)} + + @staticmethod + async def handle_list_blobs(parameters: Dict) -> Dict: + """处理列出 blob 请求""" + global blob_service_client + + if not blob_service_client: + return {"error": "未连接到 Azure Blob Storage"} + + container_name = parameters.get("container_name") + if not container_name: + return {"error": "缺少参数: container_name"} + + try: + container_client = blob_service_client.get_container_client(container_name) + blobs = container_client.list_blobs() + + blob_list = [] + total_size = 0 + for blob in blobs: + blob_info = { + "name": blob.name, + "size": blob.size, + "size_mb": round(blob.size / (1024 * 1024), 2), + "content_type": blob.content_settings.content_type if blob.content_settings else "unknown", + "last_modified": str(blob.last_modified) + } + blob_list.append(blob_info) + total_size += blob.size + + return { + "success": True, + "container": container_name, + "blobs": blob_list, + "count": len(blob_list), + "total_size_mb": round(total_size / (1024 * 1024), 2) + } + except Exception as e: + logger.error(f"列出 blob 失败: {str(e)}") + return {"error": str(e)} + + @staticmethod + async def handle_get_blob_info(parameters: Dict) -> Dict: + """处理获取 blob 信息请求""" + global blob_service_client + + if not blob_service_client: + return {"error": "未连接到 Azure Blob Storage"} + + container_name = parameters.get("container_name") + blob_name = parameters.get("blob_name") + + if not container_name or not blob_name: + return {"error": "缺少参数: container_name 或 blob_name"} + + try: + blob_client = blob_service_client.get_blob_client(container_name, blob_name) + properties = blob_client.get_blob_properties() + + return { + "success": True, + "blob_name": blob_name, + "container": container_name, + "size": properties.size, + "size_mb": round(properties.size / (1024 * 1024), 2), + "content_type": properties.content_settings.content_type if properties.content_settings else "unknown", + "creation_time": str(properties.creation_time), + "last_modified": str(properties.last_modified), + "etag": properties.etag, + "metadata": properties.metadata if properties.metadata else {} + } + except Exception as e: + logger.error(f"获取 blob 信息失败: {str(e)}") + return {"error": str(e)} + + @staticmethod + async def handle_search_blobs(parameters: Dict) -> Dict: + """处理搜索 blob 请求""" + global blob_service_client + + if not blob_service_client: + return {"error": "未连接到 Azure Blob Storage"} + + container_name = parameters.get("container_name") + keyword = parameters.get("keyword") + + if not container_name or not keyword: + return {"error": "缺少参数: container_name 或 keyword"} + + try: + container_client = blob_service_client.get_container_client(container_name) + blobs = container_client.list_blobs() + + matched_blobs = [] + for blob in blobs: + if keyword.lower() in blob.name.lower(): + matched_blobs.append({ + "name": blob.name, + "size": blob.size, + "size_kb": round(blob.size / 1024, 2), + "last_modified": str(blob.last_modified) + }) + + return { + "success": True, + "container": container_name, + "keyword": keyword, + "results": matched_blobs, + "count": len(matched_blobs) + } + except Exception as e: + logger.error(f"搜索 blob 失败: {str(e)}") + return {"error": str(e)} + + @staticmethod + async def handle_get_stats(parameters: Dict) -> Dict: + """处理获取统计信息请求""" + global blob_service_client + + if not blob_service_client: + return {"error": "未连接到 Azure Blob Storage"} + + try: + containers = list(blob_service_client.list_containers()) + total_containers = len(containers) + total_blobs = 0 + total_size = 0 + + container_stats = [] + for container in containers: + container_client = blob_service_client.get_container_client(container.name) + blobs = list(container_client.list_blobs()) + blob_count = len(blobs) + container_size = sum(blob.size for blob in blobs) + + total_blobs += blob_count + total_size += container_size + + container_stats.append({ + "name": container.name, + "blobs": blob_count, + "size_mb": round(container_size / (1024 * 1024), 2) + }) + + return { + "success": True, + "total_containers": total_containers, + "total_blobs": total_blobs, + "total_size_mb": round(total_size / (1024 * 1024), 2), + "container_stats": container_stats + } + except Exception as e: + logger.error(f"获取统计信息失败: {str(e)}") + return {"error": str(e)} + + +# 动作路由表 +ACTION_HANDLERS = { + "list_containers": A2AActionHandler.handle_list_containers, + "list_blobs": A2AActionHandler.handle_list_blobs, + "get_blob_info": A2AActionHandler.handle_get_blob_info, + "search_blobs": A2AActionHandler.handle_search_blobs, + "get_stats": A2AActionHandler.handle_get_stats, +} + + +# ==================== API 端点 ==================== + +@app.get("/health", response_model=HealthResponse) +async def health_check(): + """健康检查""" + global blob_service_client, connection_string + + connected = blob_service_client is not None + + connection_info = None + if connected: + try: + account_info = blob_service_client.get_account_information() + connection_info = { + "account_kind": account_info.get('account_kind', 'unknown'), + "sku_name": account_info.get('sku_name', 'unknown'), + "connected_at": str(datetime.now()) + } + except Exception as e: + logger.error(f"获取账户信息失败: {str(e)}") + + return HealthResponse( + status="healthy" if connected else "not_connected", + connected=connected, + framework=AGENT_FRAMEWORK, + agent_id=AGENT_ID, + agent_role=AGENT_ROLE, + capabilities=AGENT_CAPABILITIES, + user_id=USER_ID, + namespace=NAMESPACE, + registered_agents_count=len(registered_agents), + connection_info=connection_info + ) + + +@app.post("/connect") +async def connect_to_storage(request: ConnectRequest): + """连接到 Azure Blob Storage""" + global blob_service_client, connection_string + + try: + blob_service_client = BlobServiceClient.from_connection_string( + request.connection_string + ) + + account_info = blob_service_client.get_account_information() + connection_string = request.connection_string + + logger.info(f"✅ 成功连接到 Azure Blob Storage (Agent: {AGENT_ID}, User: {USER_ID})") + + return { + "status": "connected", + "message": "成功连接到 Azure Blob Storage", + "framework": AGENT_FRAMEWORK, + "agent_id": AGENT_ID, + "user_id": USER_ID, + "account_info": { + "account_kind": account_info.get('account_kind'), + "sku_name": account_info.get('sku_name') + } + } + except Exception as e: + logger.error(f"❌ 连接失败: {str(e)}") + blob_service_client = None + connection_string = None + raise HTTPException(status_code=400, detail=f"连接失败: {str(e)}") + + +@app.get("/a2a/capabilities") +async def get_capabilities(): + """获取 Agent 能力""" + return { + "agent_id": AGENT_ID, + "agent_role": AGENT_ROLE, + "capabilities": AGENT_CAPABILITIES, + "supported_actions": list(ACTION_HANDLERS.keys()), + "framework": AGENT_FRAMEWORK + } + + +@app.post("/a2a/register") +async def register_agent(request: A2ARegisterRequest): + """注册其他 Agent""" + global registered_agents + + registered_agents[request.agent_id] = { + "agent_id": request.agent_id, + "agent_role": request.agent_role, + "capabilities": request.capabilities, + "endpoint": request.endpoint, + "registered_at": str(datetime.now()) + } + + logger.info(f"✅ Agent '{request.agent_id}' 注册成功") + + return { + "status": "registered", + "agent_id": request.agent_id, + "message": f"Agent '{request.agent_id}' 已注册" + } + + +@app.get("/a2a/agents") +async def list_registered_agents(): + """列出已注册的 Agent""" + return { + "agents": list(registered_agents.values()), + "count": len(registered_agents) + } + + +@app.post("/a2a/message") +async def handle_a2a_message(message: A2AMessage): + """处理 A2A 消息""" + if not blob_service_client: + raise HTTPException( + status_code=400, + detail="未连接到 Azure Blob Storage,请先调用 /connect" + ) + + # 获取 API key(优先使用请求传入的,否则从环境变量获取) + api_key = get_api_key(message.model_api_key, "MODEL_API_KEY", MODEL_API_KEY) + + # 验证消息目标 + if message.to_agent != AGENT_ID: + raise HTTPException( + status_code=400, + detail=f"消息目标不匹配: 期望 {AGENT_ID}, 收到 {message.to_agent}" + ) + + # 处理消息 + if message.message_type == "request": + action = message.action + + if action not in ACTION_HANDLERS: + return { + "message_id": message.message_id, + "status": "error", + "error": f"不支持的动作: {action}", + "supported_actions": list(ACTION_HANDLERS.keys()) + } + + try: + handler = ACTION_HANDLERS[action] + result = await handler(message.parameters) + + return { + "message_id": message.message_id, + "from_agent": AGENT_ID, + "to_agent": message.from_agent, + "message_type": "response", + "action": action, + "result": result, + "timestamp": str(datetime.now()), + "api_key_used": "request" if message.model_api_key else ("env" if MODEL_API_KEY else "none") + } + except Exception as e: + logger.error(f"处理 A2A 消息失败: {str(e)}") + return { + "message_id": message.message_id, + "status": "error", + "error": str(e) + } + + return { + "message_id": message.message_id, + "status": "info", + "message": f"收到消息类型: {message.message_type}" + } + + +@app.post("/query") +async def query_storage(request: A2AQueryRequest): + """查询存储(支持 A2A 上下文)""" + if not blob_service_client: + raise HTTPException( + status_code=400, + detail="未连接到 Azure Blob Storage,请先调用 /connect" + ) + + # 获取 API key(优先使用请求传入的,否则从环境变量获取) + api_key = get_api_key(request.model_api_key, "MODEL_API_KEY", MODEL_API_KEY) + + try: + query = request.query.lower() + result = None + action_used = None + + # 简单的规则匹配 + if "容器" in query and ("列出" in query or "显示" in query or "有哪些" in query): + result = await A2AActionHandler.handle_list_containers({}) + action_used = "list_containers" + elif "统计" in query or "有多少" in query or "占用" in query: + result = await A2AActionHandler.handle_get_stats({}) + action_used = "get_stats" + elif request.container_name: + if "文件" in query or "blob" in query.lower(): + result = await A2AActionHandler.handle_list_blobs({"container_name": request.container_name}) + action_used = "list_blobs" + + return { + "status": "success" if result else "info", + "query": request.query, + "action": action_used, + "result": result, + "agent_id": AGENT_ID, + "requester": request.requester_agent, + "framework": AGENT_FRAMEWORK, + "api_key_used": "request" if request.model_api_key else ("env" if MODEL_API_KEY else "none") + } + except Exception as e: + logger.error(f"查询执行失败: {str(e)}") + raise HTTPException(status_code=500, detail=f"查询失败: {str(e)}") + + +@app.post("/a2a/collaborate") +async def collaborate_with_agent( + target_agent_id: str, + action: str, + parameters: Dict[str, Any] +): + """与其他 Agent 协作""" + if target_agent_id not in registered_agents: + raise HTTPException( + status_code=404, + detail=f"Agent '{target_agent_id}' 未注册" + ) + + target_agent = registered_agents[target_agent_id] + + # 创建 A2A 消息 + message = A2AMessage( + message_id=f"{AGENT_ID}_{datetime.now().timestamp()}", + from_agent=AGENT_ID, + to_agent=target_agent_id, + message_type="request", + action=action, + parameters=parameters, + timestamp=str(datetime.now()) + ) + + try: + # 发送请求到目标 Agent + async with httpx.AsyncClient() as client: + response = await client.post( + f"{target_agent['endpoint']}/a2a/message", + json=message.dict(), + timeout=30.0 + ) + response.raise_for_status() + + return { + "status": "success", + "target_agent": target_agent_id, + "action": action, + "response": response.json() + } + except Exception as e: + logger.error(f"协作失败: {str(e)}") + raise HTTPException(status_code=500, detail=f"协作失败: {str(e)}") + + +@app.get("/") +async def root(): + """根端点""" + return { + "service": "Azure Blob Storage AI Agent", + "version": "1.0.0", + "framework": AGENT_FRAMEWORK, + "agent_id": AGENT_ID, + "agent_role": AGENT_ROLE, + "capabilities": AGENT_CAPABILITIES, + "pod_name": POD_NAME, + "template": TEMPLATE_TYPE, + "user_id": USER_ID, + "namespace": NAMESPACE, + "connected": blob_service_client is not None, + "registered_agents": len(registered_agents), + "endpoints": { + "health": "/health", + "connect": "POST /connect", + "capabilities": "GET /a2a/capabilities", + "register_agent": "POST /a2a/register", + "list_agents": "GET /a2a/agents", + "handle_message": "POST /a2a/message", + "collaborate": "POST /a2a/collaborate", + "query": "POST /query" + } + } + + +# ==================== 主函数 ==================== + +def init_storage_connection(): + """启动时初始化存储连接""" + global blob_service_client, connection_string + + if AZURE_STORAGE_CONNECTION_STRING: + try: + logger.info("检测到环境变量中的连接字符串,尝试连接...") + blob_service_client = BlobServiceClient.from_connection_string( + AZURE_STORAGE_CONNECTION_STRING + ) + + account_info = blob_service_client.get_account_information() + connection_string = AZURE_STORAGE_CONNECTION_STRING + + logger.info(f"✅ 成功连接到 Azure Blob Storage") + logger.info(f" - Account Kind: {account_info.get('account_kind')}") + logger.info(f" - SKU: {account_info.get('sku_name')}") + except Exception as e: + logger.error(f"❌ 启动时连接失败: {str(e)}") + logger.info("💡 提示: 可以稍后通过 /connect API 手动连接") + blob_service_client = None + connection_string = None + else: + logger.info("💡 未设置 AZURE_STORAGE_CONNECTION_STRING,需通过 /connect API 手动连接") + + +def main(): + """启动服务""" + logger.info(f"🚀 启动 Azure Blob Storage AI Agent (A2A)") + logger.info(f" - Framework: {AGENT_FRAMEWORK}") + logger.info(f" - Agent ID: {AGENT_ID}") + logger.info(f" - Agent Role: {AGENT_ROLE}") + logger.info(f" - Capabilities: {AGENT_CAPABILITIES}") + logger.info(f" - Pod名称: {POD_NAME}") + logger.info(f" - 模板类型: {TEMPLATE_TYPE}") + logger.info(f" - User ID: {USER_ID}") + logger.info(f" - Namespace: {NAMESPACE}") + logger.info(f" - 模型: {MODEL_NAME} @ {MODEL_PROVIDER}") + logger.info(f" - 服务地址: http://{SERVICE_HOST}:{SERVICE_PORT}") + + # 初始化存储连接 + init_storage_connection() + + uvicorn.run( + app, + host=SERVICE_HOST, + port=SERVICE_PORT, + log_level="info" + ) + + +if __name__ == "__main__": + main() diff --git a/azure_blob_agent_mcp/azure_blob_agent_mcp.Dockerfile b/azure_blob_agent_mcp/azure_blob_agent_mcp.Dockerfile new file mode 100644 index 0000000..5f72baa --- /dev/null +++ b/azure_blob_agent_mcp/azure_blob_agent_mcp.Dockerfile @@ -0,0 +1,28 @@ +# Azure Blob Agent - MCP 版本 Dockerfile +FROM python:3.11-slim + +WORKDIR /app + +# 安装系统依赖 +RUN apt-get update && apt-get install -y \ + gcc \ + && rm -rf /var/lib/apt/lists/* + +# 复制requirements文件 +COPY common/requirements_mcp.txt /app/ + +# 安装Python依赖 +RUN pip install --no-cache-dir -r requirements_mcp.txt + +# 复制应用代码 +COPY agents/azure_blob_agent_mcp/azure_blob_agent_mcp.py /app/ + +# 暴露端口 +EXPOSE 8080 + +# 健康检查 +HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ + CMD python -c "import requests; requests.get('http://localhost:8080/health', timeout=5)" + +# 启动应用 +CMD ["python", "azure_blob_agent_mcp.py"] diff --git a/azure_blob_agent_mcp/azure_blob_agent_mcp.py b/azure_blob_agent_mcp/azure_blob_agent_mcp.py new file mode 100644 index 0000000..06b98fa --- /dev/null +++ b/azure_blob_agent_mcp/azure_blob_agent_mcp.py @@ -0,0 +1,622 @@ +""" +Azure Blob Storage AI Agent - MCP (Model Context Protocol) 版本 +使用 MCP 协议实现智能文件操作功能 +""" +import os +import logging +import json +from typing import Optional, Dict, Any, List +from datetime import datetime +from fastapi import FastAPI, HTTPException +from pydantic import BaseModel, Field +from azure.storage.blob import BlobServiceClient, ContainerClient +import uvicorn +import asyncio + +# 配置日志 +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' +) +logger = logging.getLogger(__name__) + +# 环境变量配置 +SERVICE_HOST = os.getenv("SERVICE_HOST", "0.0.0.0") +SERVICE_PORT = int(os.getenv("SERVICE_PORT", "8080")) +POD_NAME = os.getenv("POD_NAME", "azure-blob-agent-mcp") +TEMPLATE_TYPE = os.getenv("TEMPLATE_TYPE", "azure_blob_agent_mcp") +AGENT_FRAMEWORK = os.getenv("AGENT_FRAMEWORK", "mcp") + +# 工具配置 (从环境变量传入的 JSON) +TOOLS_CONFIG = json.loads(os.getenv("TOOLS_CONFIG", "{}")) +TOOL_ENDPOINT = os.getenv("TOOL_ENDPOINT", "") +TOOL_API_KEY = os.getenv("TOOL_API_KEY", "") + +# 模型配置 +MODEL_PROVIDER = os.getenv("MODEL_PROVIDER", "openai") +MODEL_NAME = os.getenv("MODEL_NAME", "gpt-4") +MODEL_API_KEY = os.getenv("MODEL_API_KEY", "") +MODEL_ENDPOINT = os.getenv("MODEL_ENDPOINT", "https://api.openai.com/v1") + +# 存储配置 +AZURE_STORAGE_CONNECTION_STRING = os.getenv("AZURE_STORAGE_CONNECTION_STRING", "") +STORAGE_ACCOUNT_NAME = os.getenv("STORAGE_ACCOUNT_NAME", "") + +# 用户标识 +USER_ID = os.getenv("USER_ID", "") +TENANT_ID = os.getenv("TENANT_ID", "") +NAMESPACE = os.getenv("NAMESPACE", "ai-agents") + +# 全局存储客户端 +blob_service_client: Optional[BlobServiceClient] = None +connection_string: Optional[str] = None + +# MCP 工具注册表 +mcp_tools: Dict[str, Any] = {} + +# FastAPI应用 +app = FastAPI( + title="Azure Blob Storage AI Agent (MCP)", + description="基于 MCP 协议的智能 Azure Blob 存储管理代理", + version="1.0.0" +) + + +# ==================== 请求/响应模型 ==================== + +class ConnectRequest(BaseModel): + """连接请求""" + connection_string: str = Field(..., description="Azure Storage连接字符串") + + +class MCPToolRequest(BaseModel): + """MCP 工具调用请求""" + tool_name: str = Field(..., description="工具名称") + parameters: Dict[str, Any] = Field(default_factory=dict, description="工具参数") + + +class MCPQueryRequest(BaseModel): + """MCP 查询请求""" + query: str = Field(..., description="自然语言查询或操作指令") + container_name: Optional[str] = Field(None, description="指定容器名称") + context: Optional[Dict] = Field(default_factory=dict, description="上下文信息") + + +class HealthResponse(BaseModel): + """健康检查响应""" + status: str + connected: bool + framework: str + user_id: Optional[str] = None + namespace: Optional[str] = None + connection_info: Optional[Dict] = None + + +# ==================== MCP 工具定义 ==================== + +class MCPTool: + """MCP 工具基类""" + + def __init__(self, name: str, description: str, parameters_schema: Dict): + self.name = name + self.description = description + self.parameters_schema = parameters_schema + + async def execute(self, parameters: Dict[str, Any]) -> Dict[str, Any]: + """执行工具""" + raise NotImplementedError + + def to_mcp_spec(self) -> Dict: + """转换为 MCP 工具规范""" + return { + "name": self.name, + "description": self.description, + "inputSchema": { + "type": "object", + "properties": self.parameters_schema, + "required": list(self.parameters_schema.keys()) + } + } + + +class ListContainersTool(MCPTool): + """列出所有容器工具""" + + def __init__(self): + super().__init__( + name="list_containers", + description="列出 Azure Blob Storage 中的所有容器", + parameters_schema={} + ) + + async def execute(self, parameters: Dict[str, Any]) -> Dict[str, Any]: + global blob_service_client + + if not blob_service_client: + return {"error": "未连接到 Azure Blob Storage"} + + try: + containers = blob_service_client.list_containers() + container_list = [] + for container in containers: + container_list.append({ + "name": container.name, + "last_modified": str(container.last_modified) + }) + + return { + "success": True, + "containers": container_list, + "count": len(container_list) + } + except Exception as e: + logger.error(f"列出容器失败: {str(e)}") + return {"error": str(e)} + + +class ListBlobsTool(MCPTool): + """列出容器中的 blob 工具""" + + def __init__(self): + super().__init__( + name="list_blobs", + description="列出指定容器中的所有文件", + parameters_schema={ + "container_name": { + "type": "string", + "description": "容器名称" + } + } + ) + + async def execute(self, parameters: Dict[str, Any]) -> Dict[str, Any]: + global blob_service_client + + if not blob_service_client: + return {"error": "未连接到 Azure Blob Storage"} + + container_name = parameters.get("container_name") + if not container_name: + return {"error": "缺少参数: container_name"} + + try: + container_client = blob_service_client.get_container_client(container_name) + blobs = container_client.list_blobs() + + blob_list = [] + total_size = 0 + for blob in blobs: + blob_info = { + "name": blob.name, + "size": blob.size, + "size_mb": round(blob.size / (1024 * 1024), 2), + "content_type": blob.content_settings.content_type if blob.content_settings else "unknown", + "last_modified": str(blob.last_modified) + } + blob_list.append(blob_info) + total_size += blob.size + + return { + "success": True, + "container": container_name, + "blobs": blob_list, + "count": len(blob_list), + "total_size_mb": round(total_size / (1024 * 1024), 2) + } + except Exception as e: + logger.error(f"列出 blob 失败: {str(e)}") + return {"error": str(e)} + + +class GetBlobInfoTool(MCPTool): + """获取 blob 信息工具""" + + def __init__(self): + super().__init__( + name="get_blob_info", + description="获取特定文件的详细信息", + parameters_schema={ + "container_name": { + "type": "string", + "description": "容器名称" + }, + "blob_name": { + "type": "string", + "description": "文件名称" + } + } + ) + + async def execute(self, parameters: Dict[str, Any]) -> Dict[str, Any]: + global blob_service_client + + if not blob_service_client: + return {"error": "未连接到 Azure Blob Storage"} + + container_name = parameters.get("container_name") + blob_name = parameters.get("blob_name") + + if not container_name or not blob_name: + return {"error": "缺少参数: container_name 或 blob_name"} + + try: + blob_client = blob_service_client.get_blob_client(container_name, blob_name) + properties = blob_client.get_blob_properties() + + return { + "success": True, + "blob_name": blob_name, + "container": container_name, + "size": properties.size, + "size_mb": round(properties.size / (1024 * 1024), 2), + "content_type": properties.content_settings.content_type if properties.content_settings else "unknown", + "creation_time": str(properties.creation_time), + "last_modified": str(properties.last_modified), + "etag": properties.etag, + "metadata": properties.metadata if properties.metadata else {} + } + except Exception as e: + logger.error(f"获取 blob 信息失败: {str(e)}") + return {"error": str(e)} + + +class SearchBlobsTool(MCPTool): + """搜索 blob 工具""" + + def __init__(self): + super().__init__( + name="search_blobs", + description="在容器中搜索包含关键字的文件", + parameters_schema={ + "container_name": { + "type": "string", + "description": "容器名称" + }, + "keyword": { + "type": "string", + "description": "搜索关键字" + } + } + ) + + async def execute(self, parameters: Dict[str, Any]) -> Dict[str, Any]: + global blob_service_client + + if not blob_service_client: + return {"error": "未连接到 Azure Blob Storage"} + + container_name = parameters.get("container_name") + keyword = parameters.get("keyword") + + if not container_name or not keyword: + return {"error": "缺少参数: container_name 或 keyword"} + + try: + container_client = blob_service_client.get_container_client(container_name) + blobs = container_client.list_blobs() + + matched_blobs = [] + for blob in blobs: + if keyword.lower() in blob.name.lower(): + matched_blobs.append({ + "name": blob.name, + "size": blob.size, + "size_kb": round(blob.size / 1024, 2), + "last_modified": str(blob.last_modified) + }) + + return { + "success": True, + "container": container_name, + "keyword": keyword, + "results": matched_blobs, + "count": len(matched_blobs) + } + except Exception as e: + logger.error(f"搜索 blob 失败: {str(e)}") + return {"error": str(e)} + + +class GetStorageStatsTool(MCPTool): + """获取存储统计工具""" + + def __init__(self): + super().__init__( + name="get_storage_stats", + description="获取存储的统计信息,包括容器数量、文件数量、总大小等", + parameters_schema={} + ) + + async def execute(self, parameters: Dict[str, Any]) -> Dict[str, Any]: + global blob_service_client + + if not blob_service_client: + return {"error": "未连接到 Azure Blob Storage"} + + try: + containers = list(blob_service_client.list_containers()) + total_containers = len(containers) + total_blobs = 0 + total_size = 0 + + container_stats = [] + for container in containers: + container_client = blob_service_client.get_container_client(container.name) + blobs = list(container_client.list_blobs()) + blob_count = len(blobs) + container_size = sum(blob.size for blob in blobs) + + total_blobs += blob_count + total_size += container_size + + container_stats.append({ + "name": container.name, + "blobs": blob_count, + "size_mb": round(container_size / (1024 * 1024), 2) + }) + + return { + "success": True, + "total_containers": total_containers, + "total_blobs": total_blobs, + "total_size_mb": round(total_size / (1024 * 1024), 2), + "container_stats": container_stats + } + except Exception as e: + logger.error(f"获取统计信息失败: {str(e)}") + return {"error": str(e)} + + +# ==================== MCP 工具注册 ==================== + +def register_tools(): + """注册所有 MCP 工具""" + global mcp_tools + + tools = [ + ListContainersTool(), + ListBlobsTool(), + GetBlobInfoTool(), + SearchBlobsTool(), + GetStorageStatsTool() + ] + + for tool in tools: + mcp_tools[tool.name] = tool + + logger.info(f"✅ 注册了 {len(mcp_tools)} 个 MCP 工具") + + +# ==================== API 端点 ==================== + +@app.get("/health", response_model=HealthResponse) +async def health_check(): + """健康检查""" + global blob_service_client, connection_string + + connected = blob_service_client is not None + + connection_info = None + if connected: + try: + account_info = blob_service_client.get_account_information() + connection_info = { + "account_kind": account_info.get('account_kind', 'unknown'), + "sku_name": account_info.get('sku_name', 'unknown'), + "connected_at": str(datetime.now()) + } + except Exception as e: + logger.error(f"获取账户信息失败: {str(e)}") + + return HealthResponse( + status="healthy" if connected else "not_connected", + connected=connected, + framework=AGENT_FRAMEWORK, + user_id=USER_ID, + namespace=NAMESPACE, + connection_info=connection_info + ) + + +@app.post("/connect") +async def connect_to_storage(request: ConnectRequest): + """连接到 Azure Blob Storage""" + global blob_service_client, connection_string + + try: + blob_service_client = BlobServiceClient.from_connection_string( + request.connection_string + ) + + account_info = blob_service_client.get_account_information() + connection_string = request.connection_string + + logger.info(f"✅ 成功连接到 Azure Blob Storage (User: {USER_ID})") + + return { + "status": "connected", + "message": "成功连接到 Azure Blob Storage", + "framework": AGENT_FRAMEWORK, + "user_id": USER_ID, + "account_info": { + "account_kind": account_info.get('account_kind'), + "sku_name": account_info.get('sku_name') + } + } + except Exception as e: + logger.error(f"❌ 连接失败: {str(e)}") + blob_service_client = None + connection_string = None + raise HTTPException(status_code=400, detail=f"连接失败: {str(e)}") + + +@app.get("/mcp/tools") +async def list_mcp_tools(): + """列出所有可用的 MCP 工具""" + if not blob_service_client: + raise HTTPException( + status_code=400, + detail="未连接到 Azure Blob Storage,请先调用 /connect" + ) + + tools_spec = [tool.to_mcp_spec() for tool in mcp_tools.values()] + + return { + "tools": tools_spec, + "count": len(tools_spec), + "framework": AGENT_FRAMEWORK + } + + +@app.post("/mcp/call") +async def call_mcp_tool(request: MCPToolRequest): + """调用 MCP 工具""" + if not blob_service_client: + raise HTTPException( + status_code=400, + detail="未连接到 Azure Blob Storage,请先调用 /connect" + ) + + tool_name = request.tool_name + if tool_name not in mcp_tools: + raise HTTPException( + status_code=404, + detail=f"工具 '{tool_name}' 不存在" + ) + + try: + tool = mcp_tools[tool_name] + result = await tool.execute(request.parameters) + + return { + "tool": tool_name, + "result": result, + "timestamp": str(datetime.now()) + } + except Exception as e: + logger.error(f"工具调用失败: {str(e)}") + raise HTTPException(status_code=500, detail=f"工具调用失败: {str(e)}") + + +@app.post("/query") +async def query_storage(request: MCPQueryRequest): + """使用自然语言查询存储 (简化版 - 实际应集成 LLM)""" + if not blob_service_client: + raise HTTPException( + status_code=400, + detail="未连接到 Azure Blob Storage,请先调用 /connect" + ) + + try: + query = request.query.lower() + result = None + + # 简单的规则匹配 (实际应使用 LLM 进行意图识别) + if "容器" in query and ("列出" in query or "显示" in query or "有哪些" in query): + tool = mcp_tools["list_containers"] + result = await tool.execute({}) + elif "统计" in query or "有多少" in query or "占用" in query: + tool = mcp_tools["get_storage_stats"] + result = await tool.execute({}) + elif request.container_name: + if "文件" in query or "blob" in query.lower(): + tool = mcp_tools["list_blobs"] + result = await tool.execute({"container_name": request.container_name}) + + if result: + return { + "status": "success", + "query": request.query, + "result": result, + "framework": AGENT_FRAMEWORK + } + else: + return { + "status": "info", + "query": request.query, + "message": "未能匹配到合适的工具,请使用 /mcp/tools 查看可用工具", + "available_tools": list(mcp_tools.keys()) + } + except Exception as e: + logger.error(f"查询执行失败: {str(e)}") + raise HTTPException(status_code=500, detail=f"查询失败: {str(e)}") + + +@app.get("/") +async def root(): + """根端点""" + return { + "service": "Azure Blob Storage AI Agent", + "version": "1.0.0", + "framework": AGENT_FRAMEWORK, + "pod_name": POD_NAME, + "template": TEMPLATE_TYPE, + "user_id": USER_ID, + "namespace": NAMESPACE, + "connected": blob_service_client is not None, + "tools_count": len(mcp_tools), + "endpoints": { + "health": "/health", + "connect": "POST /connect", + "list_tools": "GET /mcp/tools", + "call_tool": "POST /mcp/call", + "query": "POST /query" + } + } + + +# ==================== 主函数 ==================== + +def init_storage_connection(): + """启动时初始化存储连接""" + global blob_service_client, connection_string + + if AZURE_STORAGE_CONNECTION_STRING: + try: + logger.info("检测到环境变量中的连接字符串,尝试连接...") + blob_service_client = BlobServiceClient.from_connection_string( + AZURE_STORAGE_CONNECTION_STRING + ) + + account_info = blob_service_client.get_account_information() + connection_string = AZURE_STORAGE_CONNECTION_STRING + + logger.info(f"✅ 成功连接到 Azure Blob Storage") + logger.info(f" - Account Kind: {account_info.get('account_kind')}") + logger.info(f" - SKU: {account_info.get('sku_name')}") + except Exception as e: + logger.error(f"❌ 启动时连接失败: {str(e)}") + logger.info("💡 提示: 可以稍后通过 /connect API 手动连接") + blob_service_client = None + connection_string = None + else: + logger.info("💡 未设置 AZURE_STORAGE_CONNECTION_STRING,需通过 /connect API 手动连接") + + +def main(): + """启动服务""" + logger.info(f"🚀 启动 Azure Blob Storage AI Agent (MCP)") + logger.info(f" - Framework: {AGENT_FRAMEWORK}") + logger.info(f" - Pod名称: {POD_NAME}") + logger.info(f" - 模板类型: {TEMPLATE_TYPE}") + logger.info(f" - User ID: {USER_ID}") + logger.info(f" - Namespace: {NAMESPACE}") + logger.info(f" - 模型: {MODEL_NAME} @ {MODEL_PROVIDER}") + logger.info(f" - 服务地址: http://{SERVICE_HOST}:{SERVICE_PORT}") + + # 注册 MCP 工具 + register_tools() + + # 初始化存储连接 + init_storage_connection() + + uvicorn.run( + app, + host=SERVICE_HOST, + port=SERVICE_PORT, + log_level="info" + ) + + +if __name__ == "__main__": + main() diff --git a/echo_agent/echo_agent.Dockerfile b/echo_agent/echo_agent.Dockerfile new file mode 100644 index 0000000..7e9d4a2 --- /dev/null +++ b/echo_agent/echo_agent.Dockerfile @@ -0,0 +1,38 @@ +FROM python:3.11-slim + +WORKDIR /app + +# 安装系统依赖 +RUN apt-get update && apt-get install -y \ + curl \ + && rm -rf /var/lib/apt/lists/* + +# 安装 Python 依赖 +RUN pip install --no-cache-dir \ + fastapi==0.109.0 \ + uvicorn[standard]==0.27.0 \ + pydantic==2.5.3 \ + requests>=2.31.0 + +# 复制 common 模块(回调工具) +COPY common/agent_callback_utils.py /app/common/ +RUN touch /app/common/__init__.py + +# 复制应用代码 +COPY agents/echo_agent/echo_agent.py /app/ + +# 环境变量 +ENV PYTHONUNBUFFERED=1 +ENV SERVICE_HOST=0.0.0.0 +ENV SERVICE_PORT=8000 + +# 回调配置 +ENV AGENT_CALLBACK_URL=http://mcp-server:8002/api/v1/billing/agent-callback + +# 健康检查 +HEALTHCHECK --interval=30s --timeout=10s --start-period=10s --retries=3 \ + CMD python3 -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health').read()" || exit 1 + +EXPOSE 8000 + +CMD ["python3", "-u", "echo_agent.py"] diff --git a/echo_agent/echo_agent.py b/echo_agent/echo_agent.py new file mode 100644 index 0000000..c3d00a2 --- /dev/null +++ b/echo_agent/echo_agent.py @@ -0,0 +1,185 @@ +""" +Echo Agent - 简单的回显测试代理 +用于测试 Agent Manager 的部署功能 +""" +import os +import sys +import logging +from datetime import datetime +from typing import Optional, Any + +from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware +from pydantic import BaseModel, Field +import uvicorn + +# 添加 common 模块路径 +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +# 导入回调工具 +try: + from common.agent_callback_utils import AgentCallbackHandler, CallbackContextManager + CALLBACK_ENABLED = True +except ImportError: + CALLBACK_ENABLED = False + AgentCallbackHandler = None + CallbackContextManager = None + +# 配置日志 +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') +logger = logging.getLogger(__name__) + +# 环境变量 +SERVICE_HOST = os.getenv("SERVICE_HOST", "0.0.0.0") +SERVICE_PORT = int(os.getenv("SERVICE_PORT", "8000")) +POD_NAME = os.getenv("POD_NAME", "echo-agent") +USER_ID = os.getenv("USER_ID", "") + +# FastAPI 应用 +app = FastAPI( + title="Echo Agent", + description="简单的回显测试代理,用于验证 Agent Manager 部署功能", + version="1.0.0" +) + +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +# 回调处理器 +callback_handler: Optional[AgentCallbackHandler] = None + + +# ==================== 请求/响应模型 ==================== + +class EchoRequest(BaseModel): + """回显请求""" + message: str = Field(..., description="要回显的消息") + user_id: Optional[str] = Field(None, description="用户ID(用于计费回调)") + metadata: Optional[dict] = Field(None, description="附加元数据") + + +class EchoResponse(BaseModel): + """回显响应""" + message: str + echo: str + pod_name: str + metadata: Optional[dict] = None + timestamp: str + + +class HealthResponse(BaseModel): + """健康检查响应""" + status: str + pod_name: str + version: str + callback_enabled: bool + timestamp: str + + +# ==================== 生命周期 ==================== + +@app.on_event("startup") +async def startup_event(): + """应用启动时初始化回调处理器""" + global callback_handler + + if CALLBACK_ENABLED: + callback_handler = AgentCallbackHandler( + agent_name=POD_NAME, + user_id=USER_ID + ) + logger.info(f"回调处理器已初始化: callback_url={callback_handler.callback_url}") + else: + logger.warning("回调模块未加载,计费回调功能不可用") + + +# ==================== API 端点 ==================== + +@app.get("/health", response_model=HealthResponse) +@app.get("/", response_model=HealthResponse) +async def health_check(): + """健康检查""" + return HealthResponse( + status="healthy", + pod_name=POD_NAME, + version="1.0.0", + callback_enabled=CALLBACK_ENABLED, + timestamp=datetime.utcnow().isoformat() + ) + + +@app.post("/echo", response_model=EchoResponse) +async def echo(request: EchoRequest): + """回显消息""" + logger.info(f"Echo: {request.message}") + + # 使用回调上下文管理器 + if CALLBACK_ENABLED and callback_handler and request.user_id: + with CallbackContextManager( + handler=callback_handler, + user_id=request.user_id, + request_id=f"echo-{int(datetime.utcnow().timestamp())}" + ) as ctx: + ctx.add_tool("echo") + + response = EchoResponse( + message=request.message, + echo=f"[Echo from {POD_NAME}] {request.message}", + pod_name=POD_NAME, + metadata=request.metadata, + timestamp=datetime.utcnow().isoformat() + ) + else: + response = EchoResponse( + message=request.message, + echo=f"[Echo from {POD_NAME}] {request.message}", + pod_name=POD_NAME, + metadata=request.metadata, + timestamp=datetime.utcnow().isoformat() + ) + + return response + + +@app.get("/echo") +async def echo_get(message: str = "Hello", user_id: Optional[str] = None): + """GET 方式回显""" + return await echo(EchoRequest(message=message, user_id=user_id)) + + +@app.get("/info") +async def get_info(): + """获取 Agent 信息""" + return { + "agent_name": "Echo Agent", + "pod_name": POD_NAME, + "version": "1.0.0", + "callback_enabled": CALLBACK_ENABLED, + "callback_url": callback_handler.callback_url if callback_handler else None, + "capabilities": ["echo", "health_check"], + "environment": { + "SERVICE_HOST": SERVICE_HOST, + "SERVICE_PORT": SERVICE_PORT + }, + "timestamp": datetime.utcnow().isoformat() + } + + +# ==================== 主入口 ==================== + +def main(): + """主函数""" + logger.info(f"启动 Echo Agent - {POD_NAME}") + logger.info(f"服务地址: {SERVICE_HOST}:{SERVICE_PORT}") + logger.info(f"回调功能: {'已启用' if CALLBACK_ENABLED else '未启用'}") + + uvicorn.run(app, host=SERVICE_HOST, port=SERVICE_PORT, log_level="info") + + +if __name__ == "__main__": + main() diff --git a/jina_search_agent/jina_search_agent.Dockerfile b/jina_search_agent/jina_search_agent.Dockerfile new file mode 100644 index 0000000..0bb36a8 --- /dev/null +++ b/jina_search_agent/jina_search_agent.Dockerfile @@ -0,0 +1,42 @@ +FROM python:3.11-slim + +WORKDIR /app + +# 安装系统依赖 +RUN apt-get update && apt-get install -y \ + curl \ + && rm -rf /var/lib/apt/lists/* + +# 安装 Python 依赖 +RUN pip install --no-cache-dir \ + fastapi==0.109.0 \ + uvicorn[standard]==0.27.0 \ + pydantic==2.5.3 \ + requests>=2.31.0 \ + aiohttp>=3.9.0 + +# 复制 common 模块(回调工具) +COPY common/agent_callback_utils.py /app/common/ +RUN touch /app/common/__init__.py + +# 复制应用代码 +COPY agents/jina_search_agent/jina_search_agent.py /app/ + +# 环境变量 +ENV PYTHONUNBUFFERED=1 +ENV SERVICE_HOST=0.0.0.0 +ENV SERVICE_PORT=8080 + +# 默认 Jina API Key (硬编码) +ENV JINA_API_KEY=jina_e26dc30420a44a1e859216528065b203TkMRmsoz-FgMDQC5FZX9jr5oF2CI + +# 回调配置 +ENV AGENT_CALLBACK_URL=http://mcp-server:8002/api/v1/billing/agent-callback + +# 健康检查 +HEALTHCHECK --interval=30s --timeout=10s --start-period=20s --retries=3 \ + CMD python3 -c "import urllib.request; urllib.request.urlopen('http://localhost:8080/health').read()" || exit 1 + +EXPOSE 8080 + +CMD ["python3", "-u", "jina_search_agent.py"] diff --git a/jina_search_agent/jina_search_agent.py b/jina_search_agent/jina_search_agent.py new file mode 100644 index 0000000..0596641 --- /dev/null +++ b/jina_search_agent/jina_search_agent.py @@ -0,0 +1,320 @@ +""" +Jina Search Agent - 使用 Jina Reader API 提取网页内容 +""" +import os +import sys +import logging +import aiohttp +from typing import Optional, List +from datetime import datetime + +from fastapi import FastAPI, HTTPException, Query +from fastapi.middleware.cors import CORSMiddleware +from pydantic import BaseModel, Field +import uvicorn + +# 添加 common 模块路径 +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +# 导入回调工具 +try: + from common.agent_callback_utils import AgentCallbackHandler, CallbackContextManager + CALLBACK_ENABLED = True +except ImportError: + CALLBACK_ENABLED = False + AgentCallbackHandler = None + CallbackContextManager = None + +# 配置日志 +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') +logger = logging.getLogger(__name__) + +# 环境变量 +SERVICE_HOST = os.getenv("SERVICE_HOST", "0.0.0.0") +SERVICE_PORT = int(os.getenv("SERVICE_PORT", "8080")) +POD_NAME = os.getenv("POD_NAME", "jina-search-agent") +USER_ID = os.getenv("USER_ID", "") +JINA_API_KEY = os.getenv("JINA_API_KEY", "") + +# Jina Reader API +JINA_READER_URL = "https://r.jina.ai/" + +# FastAPI 应用 +app = FastAPI( + title="Jina Search Agent", + description="使用 Jina Reader API 提取网页内容", + version="1.0.0" +) + +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +# 回调处理器 +callback_handler: Optional[AgentCallbackHandler] = None + + +# ==================== 请求/响应模型 ==================== + +class SearchRequest(BaseModel): + """搜索/提取请求""" + url: str = Field(..., description="要提取内容的 URL") + user_id: Optional[str] = Field(None, description="用户ID(用于计费回调)") + jina_api_key: Optional[str] = Field(None, description="Jina API 密钥(可选,覆盖环境变量)") + + +class SearchResponse(BaseModel): + """搜索/提取响应""" + url: str + title: Optional[str] = None + content: str + timestamp: str + + +class BatchSearchRequest(BaseModel): + """批量搜索请求""" + urls: List[str] = Field(..., description="要提取内容的 URL 列表") + user_id: Optional[str] = Field(None, description="用户ID(用于计费回调)") + jina_api_key: Optional[str] = Field(None, description="Jina API 密钥(可选)") + + +class BatchSearchResponse(BaseModel): + """批量搜索响应""" + results: List[SearchResponse] + success_count: int + failed_count: int + timestamp: str + + +class HealthResponse(BaseModel): + """健康检查响应""" + status: str + pod_name: str + jina_api_configured: bool + callback_enabled: bool + timestamp: str + + +# ==================== 生命周期 ==================== + +@app.on_event("startup") +async def startup_event(): + """应用启动时初始化回调处理器""" + global callback_handler + + if CALLBACK_ENABLED: + callback_handler = AgentCallbackHandler( + agent_name=POD_NAME, + user_id=USER_ID + ) + logger.info(f"回调处理器已初始化: callback_url={callback_handler.callback_url}") + else: + logger.warning("回调模块未加载,计费回调功能不可用") + + +# ==================== 辅助函数 ==================== + +async def fetch_url_content(url: str, api_key: str) -> dict: + """使用 Jina Reader API 提取 URL 内容""" + headers = { + "Authorization": f"Bearer {api_key}", + "Accept": "application/json" + } + + jina_url = f"{JINA_READER_URL}{url}" + + try: + async with aiohttp.ClientSession() as session: + async with session.get(jina_url, headers=headers, timeout=30) as response: + if response.status == 200: + text = await response.text() + return { + "success": True, + "url": url, + "content": text, + "title": None # Jina Reader 返回的是纯文本 + } + else: + error_text = await response.text() + logger.warning(f"Jina Reader 请求失败 [{response.status}]: {url}") + return { + "success": False, + "url": url, + "error": f"HTTP {response.status}: {error_text[:200]}" + } + except Exception as e: + logger.error(f"提取内容失败: {url} - {e}") + return { + "success": False, + "url": url, + "error": str(e) + } + + +# ==================== API 端点 ==================== + +@app.get("/health", response_model=HealthResponse) +@app.get("/", response_model=HealthResponse) +async def health_check(): + """健康检查""" + return HealthResponse( + status="healthy", + pod_name=POD_NAME, + jina_api_configured=bool(JINA_API_KEY), + callback_enabled=CALLBACK_ENABLED, + timestamp=datetime.utcnow().isoformat() + ) + + +@app.post("/search", response_model=SearchResponse) +@app.post("/fetch", response_model=SearchResponse) +async def fetch_content(request: SearchRequest): + """提取单个 URL 的内容""" + api_key = request.jina_api_key or JINA_API_KEY + + if not api_key: + raise HTTPException( + status_code=400, + detail="Jina API key 未设置。请在请求中传入 jina_api_key 或设置环境变量 JINA_API_KEY" + ) + + # 使用回调上下文管理器 + if CALLBACK_ENABLED and callback_handler and request.user_id: + with CallbackContextManager( + handler=callback_handler, + user_id=request.user_id, + request_id=f"jina-fetch-{int(datetime.utcnow().timestamp())}" + ) as ctx: + ctx.add_tool("jina_reader") + ctx.add_tool("web_content_extraction") + + result = await fetch_url_content(request.url, api_key) + + if not result["success"]: + raise HTTPException( + status_code=500, + detail=f"提取内容失败: {result.get('error', '未知错误')}" + ) + + return SearchResponse( + url=result["url"], + title=result.get("title"), + content=result["content"], + timestamp=datetime.utcnow().isoformat() + ) + else: + result = await fetch_url_content(request.url, api_key) + + if not result["success"]: + raise HTTPException( + status_code=500, + detail=f"提取内容失败: {result.get('error', '未知错误')}" + ) + + return SearchResponse( + url=result["url"], + title=result.get("title"), + content=result["content"], + timestamp=datetime.utcnow().isoformat() + ) + + +@app.get("/search") +@app.get("/fetch") +async def fetch_content_get( + url: str = Query(..., description="要提取内容的 URL"), + user_id: Optional[str] = Query(None, description="用户ID(用于计费回调)"), + jina_api_key: Optional[str] = Query(None, description="Jina API 密钥") +): + """GET 方式提取内容""" + request = SearchRequest(url=url, user_id=user_id, jina_api_key=jina_api_key) + return await fetch_content(request) + + +@app.post("/batch", response_model=BatchSearchResponse) +async def batch_fetch_content(request: BatchSearchRequest): + """批量提取多个 URL 的内容""" + api_key = request.jina_api_key or JINA_API_KEY + + if not api_key: + raise HTTPException( + status_code=400, + detail="Jina API key 未设置" + ) + + # 使用回调上下文管理器 + if CALLBACK_ENABLED and callback_handler and request.user_id: + with CallbackContextManager( + handler=callback_handler, + user_id=request.user_id, + request_id=f"jina-batch-{int(datetime.utcnow().timestamp())}" + ) as ctx: + ctx.add_tool("jina_reader") + ctx.add_tool("batch_web_extraction") + + results = [] + success_count = 0 + failed_count = 0 + + for url in request.urls: + result = await fetch_url_content(url, api_key) + if result["success"]: + results.append(SearchResponse( + url=result["url"], + title=result.get("title"), + content=result["content"], + timestamp=datetime.utcnow().isoformat() + )) + success_count += 1 + else: + failed_count += 1 + + return BatchSearchResponse( + results=results, + success_count=success_count, + failed_count=failed_count, + timestamp=datetime.utcnow().isoformat() + ) + else: + results = [] + success_count = 0 + failed_count = 0 + + for url in request.urls: + result = await fetch_url_content(url, api_key) + if result["success"]: + results.append(SearchResponse( + url=result["url"], + title=result.get("title"), + content=result["content"], + timestamp=datetime.utcnow().isoformat() + )) + success_count += 1 + else: + failed_count += 1 + + return BatchSearchResponse( + results=results, + success_count=success_count, + failed_count=failed_count, + timestamp=datetime.utcnow().isoformat() + ) + + +# ==================== 主入口 ==================== + +def main(): + """主函数""" + logger.info(f"启动 Jina Search Agent - {POD_NAME}") + logger.info(f"Jina API Key: {'已配置' if JINA_API_KEY else '未配置'}") + logger.info(f"回调功能: {'已启用' if CALLBACK_ENABLED else '未启用'}") + + uvicorn.run(app, host=SERVICE_HOST, port=SERVICE_PORT, log_level="info") + + +if __name__ == "__main__": + main() diff --git a/mysql_agent/mysql_agent.Dockerfile b/mysql_agent/mysql_agent.Dockerfile new file mode 100644 index 0000000..f426bf2 --- /dev/null +++ b/mysql_agent/mysql_agent.Dockerfile @@ -0,0 +1,46 @@ +FROM python:3.11-slim + +WORKDIR /app + +# 安装系统依赖 +RUN apt-get update && apt-get install -y \ + curl \ + default-libmysqlclient-dev \ + build-essential \ + pkg-config \ + && rm -rf /var/lib/apt/lists/* + +# 安装 Python 依赖 +RUN pip install --no-cache-dir \ + fastapi==0.109.0 \ + uvicorn[standard]==0.27.0 \ + pydantic==2.5.3 \ + requests>=2.31.0 \ + langchain>=0.1.0 \ + langchain-community>=0.0.10 \ + langchain-openai>=0.0.2 \ + pymysql>=1.1.0 \ + cryptography>=41.0.0 + +# 复制 common 模块(回调工具) +COPY common/agent_callback_utils.py /app/common/ +RUN touch /app/common/__init__.py + +# 复制应用代码 +COPY agents/mysql_agent/mysql_agent.py /app/ + +# 环境变量 +ENV PYTHONUNBUFFERED=1 +ENV SERVICE_HOST=0.0.0.0 +ENV SERVICE_PORT=8000 + +# 回调配置 +ENV AGENT_CALLBACK_URL=http://mcp-server:8002/api/v1/billing/agent-callback + +# 健康检查 +HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \ + CMD python3 -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health').read()" || exit 1 + +EXPOSE 8000 + +CMD ["python3", "-u", "mysql_agent.py"] diff --git a/mysql_agent/mysql_agent.py b/mysql_agent/mysql_agent.py new file mode 100644 index 0000000..f3586d2 --- /dev/null +++ b/mysql_agent/mysql_agent.py @@ -0,0 +1,289 @@ +""" +MySQL Database Agent - 基于 LangChain 的 MySQL 数据库查询代理 +""" +import os +import sys +import logging +from typing import Optional +from datetime import datetime + +from fastapi import FastAPI, HTTPException +from fastapi.middleware.cors import CORSMiddleware +from pydantic import BaseModel, Field +import uvicorn + +# 添加 common 模块路径 +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +# 导入回调工具 +try: + from common.agent_callback_utils import AgentCallbackHandler, CallbackContextManager + CALLBACK_ENABLED = True +except ImportError: + CALLBACK_ENABLED = False + AgentCallbackHandler = None + CallbackContextManager = None + +# 配置日志 +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') +logger = logging.getLogger(__name__) + +# 环境变量 +SERVICE_HOST = os.getenv("SERVICE_HOST", "0.0.0.0") +SERVICE_PORT = int(os.getenv("SERVICE_PORT", "8000")) +POD_NAME = os.getenv("POD_NAME", "mysql-agent") +USER_ID = os.getenv("USER_ID", "") + +# MySQL 配置 +MYSQL_HOST = os.getenv("MYSQL_HOST", "") +MYSQL_PORT = int(os.getenv("MYSQL_PORT", "3306")) +MYSQL_USER = os.getenv("MYSQL_USER", "") +MYSQL_PASSWORD = os.getenv("MYSQL_PASSWORD", "") +MYSQL_DATABASE = os.getenv("MYSQL_DATABASE", "") +OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "") +MODEL_NAME = os.getenv("MODEL_NAME", "gpt-3.5-turbo") + +# FastAPI 应用 +app = FastAPI( + title="MySQL Database Agent", + description="基于 LangChain 的 MySQL 数据库查询代理", + version="1.0.0" +) + +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + + +# ==================== 请求/响应模型 ==================== + +class QueryRequest(BaseModel): + """查询请求""" + query: str = Field(..., description="自然语言查询") + user_id: Optional[str] = Field(None, description="用户ID(用于计费回调)") + openai_api_key: Optional[str] = Field(None, description="OpenAI API 密钥(可选,覆盖环境变量)") + + +class QueryResponse(BaseModel): + """查询响应""" + query: str + result: str + sql: Optional[str] = None + timestamp: str + + +class ConnectRequest(BaseModel): + """连接请求""" + host: str = Field(..., description="MySQL 主机地址") + port: int = Field(default=3306, description="MySQL 端口") + user: str = Field(..., description="MySQL 用户名") + password: str = Field(..., description="MySQL 密码") + database: str = Field(..., description="数据库名") + + +class HealthResponse(BaseModel): + """健康检查响应""" + status: str + pod_name: str + connected: bool + callback_enabled: bool + database: Optional[str] = None + timestamp: str + + +# ==================== 全局变量 ==================== + +db_agent = None +db_connection_info = None +callback_handler: Optional[AgentCallbackHandler] = None + + +# ==================== 生命周期 ==================== + +@app.on_event("startup") +async def startup_event(): + """应用启动时初始化""" + global callback_handler + + if CALLBACK_ENABLED: + callback_handler = AgentCallbackHandler( + agent_name=POD_NAME, + user_id=USER_ID + ) + logger.info(f"回调处理器已初始化: callback_url={callback_handler.callback_url}") + else: + logger.warning("回调模块未加载,计费回调功能不可用") + + # 尝试自动连接 + if all([MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, OPENAI_API_KEY]): + try: + create_db_agent( + host=MYSQL_HOST, + port=MYSQL_PORT, + user=MYSQL_USER, + password=MYSQL_PASSWORD, + database=MYSQL_DATABASE, + api_key=OPENAI_API_KEY + ) + except Exception as e: + logger.warning(f"自动连接失败: {e}") + + +# ==================== 辅助函数 ==================== + +def create_db_agent(host: str, port: int, user: str, password: str, database: str, api_key: str): + """创建数据库 Agent""" + global db_agent, db_connection_info + + try: + from langchain_community.utilities import SQLDatabase + from langchain_community.agent_toolkits import create_sql_agent + from langchain_openai import ChatOpenAI + + # 创建数据库连接 + db_uri = f"mysql+pymysql://{user}:{password}@{host}:{port}/{database}" + db = SQLDatabase.from_uri(db_uri) + + # 创建 LLM + llm = ChatOpenAI( + model=MODEL_NAME, + temperature=0, + openai_api_key=api_key + ) + + # 创建 SQL Agent + db_agent = create_sql_agent(llm, db=db, agent_type="openai-tools", verbose=True) + db_connection_info = {"host": host, "port": port, "database": database} + + logger.info(f"MySQL Agent 连接成功: {host}:{port}/{database}") + return True + except Exception as e: + logger.error(f"创建 MySQL Agent 失败: {e}") + raise + + +# ==================== API 端点 ==================== + +@app.get("/health", response_model=HealthResponse) +@app.get("/", response_model=HealthResponse) +async def health_check(): + """健康检查""" + return HealthResponse( + status="healthy", + pod_name=POD_NAME, + connected=db_agent is not None, + callback_enabled=CALLBACK_ENABLED, + database=db_connection_info.get("database") if db_connection_info else None, + timestamp=datetime.utcnow().isoformat() + ) + + +@app.post("/connect") +async def connect_database(request: ConnectRequest): + """连接数据库""" + api_key = OPENAI_API_KEY + if not api_key: + raise HTTPException(status_code=400, detail="OPENAI_API_KEY 未设置") + + try: + create_db_agent( + host=request.host, + port=request.port, + user=request.user, + password=request.password, + database=request.database, + api_key=api_key + ) + return { + "status": "connected", + "database": request.database, + "timestamp": datetime.utcnow().isoformat() + } + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + +@app.post("/query", response_model=QueryResponse) +async def query_database(request: QueryRequest): + """执行自然语言查询""" + global db_agent + + # 获取 API key - 优先使用请求中的 + api_key = request.openai_api_key or OPENAI_API_KEY + if not api_key: + raise HTTPException(status_code=400, detail="OPENAI_API_KEY 未设置,请在请求中传入 openai_api_key 或设置环境变量") + + # 如果未连接,尝试使用环境变量连接 + if db_agent is None: + if not all([MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE]): + raise HTTPException( + status_code=400, + detail="数据库未连接。请先调用 /connect 或设置环境变量" + ) + + create_db_agent( + host=MYSQL_HOST, + port=MYSQL_PORT, + user=MYSQL_USER, + password=MYSQL_PASSWORD, + database=MYSQL_DATABASE, + api_key=api_key + ) + elif request.openai_api_key: + # 如果请求中提供了新的 API key,重新创建 agent + logger.info(f"使用请求中的 OpenAI API Key 重新初始化 Agent...") + create_db_agent( + host=db_connection_info["host"], + port=db_connection_info["port"], + user=MYSQL_USER, + password=MYSQL_PASSWORD, + database=db_connection_info["database"], + api_key=api_key + ) + + try: + # 使用回调上下文管理器 + if CALLBACK_ENABLED and callback_handler and request.user_id: + with CallbackContextManager( + handler=callback_handler, + user_id=request.user_id, + request_id=f"mysql-query-{int(datetime.utcnow().timestamp())}" + ) as ctx: + ctx.add_tool("mysql_query") + ctx.add_tool("sql_agent") + + result = db_agent.invoke({"input": request.query}) + + return QueryResponse( + query=request.query, + result=result.get("output", str(result)), + timestamp=datetime.utcnow().isoformat() + ) + else: + result = db_agent.invoke({"input": request.query}) + return QueryResponse( + query=request.query, + result=result.get("output", str(result)), + timestamp=datetime.utcnow().isoformat() + ) + except Exception as e: + logger.error(f"查询失败: {e}") + raise HTTPException(status_code=500, detail=str(e)) + + +# ==================== 主入口 ==================== + +def main(): + """主函数""" + logger.info(f"启动 MySQL Agent - {POD_NAME}") + logger.info(f"回调功能: {'已启用' if CALLBACK_ENABLED else '未启用'}") + + uvicorn.run(app, host=SERVICE_HOST, port=SERVICE_PORT, log_level="info") + + +if __name__ == "__main__": + main() diff --git a/postgresql_agent/postgresql_agent.Dockerfile b/postgresql_agent/postgresql_agent.Dockerfile new file mode 100644 index 0000000..7d678b9 --- /dev/null +++ b/postgresql_agent/postgresql_agent.Dockerfile @@ -0,0 +1,44 @@ +FROM python:3.11-slim + +WORKDIR /app + +# 安装系统依赖 +RUN apt-get update && apt-get install -y \ + curl \ + libpq-dev \ + build-essential \ + && rm -rf /var/lib/apt/lists/* + +# 安装 Python 依赖 +RUN pip install --no-cache-dir \ + fastapi==0.109.0 \ + uvicorn[standard]==0.27.0 \ + pydantic==2.5.3 \ + requests>=2.31.0 \ + langchain>=0.1.0 \ + langchain-community>=0.0.10 \ + langchain-openai>=0.0.2 \ + psycopg2-binary>=2.9.9 + +# 复制 common 模块(回调工具) +COPY common/agent_callback_utils.py /app/common/ +RUN touch /app/common/__init__.py + +# 复制应用代码 +COPY agents/postgresql_agent/postgresql_agent.py /app/ + +# 环境变量 +ENV PYTHONUNBUFFERED=1 +ENV SERVICE_HOST=0.0.0.0 +ENV SERVICE_PORT=8000 + +# 回调配置 +ENV AGENT_CALLBACK_URL=http://mcp-server:8002/api/v1/billing/agent-callback + +# 健康检查 +HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \ + CMD python3 -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health').read()" || exit 1 + +EXPOSE 8000 + +CMD ["python3", "-u", "postgresql_agent.py"] diff --git a/postgresql_agent/postgresql_agent.py b/postgresql_agent/postgresql_agent.py new file mode 100644 index 0000000..794aba1 --- /dev/null +++ b/postgresql_agent/postgresql_agent.py @@ -0,0 +1,289 @@ +""" +PostgreSQL Database Agent - 基于 LangChain 的 PostgreSQL 数据库查询代理 +""" +import os +import sys +import logging +from typing import Optional +from datetime import datetime + +from fastapi import FastAPI, HTTPException +from fastapi.middleware.cors import CORSMiddleware +from pydantic import BaseModel, Field +import uvicorn + +# 添加 common 模块路径 +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +# 导入回调工具 +try: + from common.agent_callback_utils import AgentCallbackHandler, CallbackContextManager + CALLBACK_ENABLED = True +except ImportError: + CALLBACK_ENABLED = False + AgentCallbackHandler = None + CallbackContextManager = None + +# 配置日志 +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') +logger = logging.getLogger(__name__) + +# 环境变量 +SERVICE_HOST = os.getenv("SERVICE_HOST", "0.0.0.0") +SERVICE_PORT = int(os.getenv("SERVICE_PORT", "8000")) +POD_NAME = os.getenv("POD_NAME", "postgresql-agent") +USER_ID = os.getenv("USER_ID", "") + +# PostgreSQL 配置 +POSTGRES_HOST = os.getenv("POSTGRES_HOST", "") +POSTGRES_PORT = int(os.getenv("POSTGRES_PORT", "5432")) +POSTGRES_USER = os.getenv("POSTGRES_USER", "") +POSTGRES_PASSWORD = os.getenv("POSTGRES_PASSWORD", "") +POSTGRES_DATABASE = os.getenv("POSTGRES_DATABASE", "") +OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "") +MODEL_NAME = os.getenv("MODEL_NAME", "gpt-3.5-turbo") + +# FastAPI 应用 +app = FastAPI( + title="PostgreSQL Database Agent", + description="基于 LangChain 的 PostgreSQL 数据库查询代理", + version="1.0.0" +) + +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + + +# ==================== 请求/响应模型 ==================== + +class QueryRequest(BaseModel): + """查询请求""" + query: str = Field(..., description="自然语言查询") + user_id: Optional[str] = Field(None, description="用户ID(用于计费回调)") + openai_api_key: Optional[str] = Field(None, description="OpenAI API 密钥(可选,覆盖环境变量)") + + +class QueryResponse(BaseModel): + """查询响应""" + query: str + result: str + sql: Optional[str] = None + timestamp: str + + +class ConnectRequest(BaseModel): + """连接请求""" + host: str = Field(..., description="PostgreSQL 主机地址") + port: int = Field(default=5432, description="PostgreSQL 端口") + user: str = Field(..., description="PostgreSQL 用户名") + password: str = Field(..., description="PostgreSQL 密码") + database: str = Field(..., description="数据库名") + + +class HealthResponse(BaseModel): + """健康检查响应""" + status: str + pod_name: str + connected: bool + callback_enabled: bool + database: Optional[str] = None + timestamp: str + + +# ==================== 全局变量 ==================== + +db_agent = None +db_connection_info = None +callback_handler: Optional[AgentCallbackHandler] = None + + +# ==================== 生命周期 ==================== + +@app.on_event("startup") +async def startup_event(): + """应用启动时初始化""" + global callback_handler + + if CALLBACK_ENABLED: + callback_handler = AgentCallbackHandler( + agent_name=POD_NAME, + user_id=USER_ID + ) + logger.info(f"回调处理器已初始化: callback_url={callback_handler.callback_url}") + else: + logger.warning("回调模块未加载,计费回调功能不可用") + + # 尝试自动连接 + if all([POSTGRES_HOST, POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DATABASE, OPENAI_API_KEY]): + try: + create_db_agent( + host=POSTGRES_HOST, + port=POSTGRES_PORT, + user=POSTGRES_USER, + password=POSTGRES_PASSWORD, + database=POSTGRES_DATABASE, + api_key=OPENAI_API_KEY + ) + except Exception as e: + logger.warning(f"自动连接失败: {e}") + + +# ==================== 辅助函数 ==================== + +def create_db_agent(host: str, port: int, user: str, password: str, database: str, api_key: str): + """创建数据库 Agent""" + global db_agent, db_connection_info + + try: + from langchain_community.utilities import SQLDatabase + from langchain_community.agent_toolkits import create_sql_agent + from langchain_openai import ChatOpenAI + + # 创建数据库连接 + db_uri = f"postgresql+psycopg2://{user}:{password}@{host}:{port}/{database}" + db = SQLDatabase.from_uri(db_uri) + + # 创建 LLM + llm = ChatOpenAI( + model=MODEL_NAME, + temperature=0, + openai_api_key=api_key + ) + + # 创建 SQL Agent + db_agent = create_sql_agent(llm, db=db, agent_type="openai-tools", verbose=True) + db_connection_info = {"host": host, "port": port, "database": database} + + logger.info(f"PostgreSQL Agent 连接成功: {host}:{port}/{database}") + return True + except Exception as e: + logger.error(f"创建 PostgreSQL Agent 失败: {e}") + raise + + +# ==================== API 端点 ==================== + +@app.get("/health", response_model=HealthResponse) +@app.get("/", response_model=HealthResponse) +async def health_check(): + """健康检查""" + return HealthResponse( + status="healthy", + pod_name=POD_NAME, + connected=db_agent is not None, + callback_enabled=CALLBACK_ENABLED, + database=db_connection_info.get("database") if db_connection_info else None, + timestamp=datetime.utcnow().isoformat() + ) + + +@app.post("/connect") +async def connect_database(request: ConnectRequest): + """连接数据库""" + api_key = OPENAI_API_KEY + if not api_key: + raise HTTPException(status_code=400, detail="OPENAI_API_KEY 未设置") + + try: + create_db_agent( + host=request.host, + port=request.port, + user=request.user, + password=request.password, + database=request.database, + api_key=api_key + ) + return { + "status": "connected", + "database": request.database, + "timestamp": datetime.utcnow().isoformat() + } + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + +@app.post("/query", response_model=QueryResponse) +async def query_database(request: QueryRequest): + """执行自然语言查询""" + global db_agent + + # 获取 API key - 优先使用请求中的 + api_key = request.openai_api_key or OPENAI_API_KEY + if not api_key: + raise HTTPException(status_code=400, detail="OPENAI_API_KEY 未设置,请在请求中传入 openai_api_key 或设置环境变量") + + # 如果未连接,尝试使用环境变量连接 + if db_agent is None: + if not all([POSTGRES_HOST, POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DATABASE]): + raise HTTPException( + status_code=400, + detail="数据库未连接。请先调用 /connect 或设置环境变量" + ) + + create_db_agent( + host=POSTGRES_HOST, + port=POSTGRES_PORT, + user=POSTGRES_USER, + password=POSTGRES_PASSWORD, + database=POSTGRES_DATABASE, + api_key=api_key + ) + elif request.openai_api_key: + # 如果请求中提供了新的 API key,重新创建 agent + logger.info(f"使用请求中的 OpenAI API Key 重新初始化 Agent...") + create_db_agent( + host=db_connection_info["host"], + port=db_connection_info["port"], + user=POSTGRES_USER, + password=POSTGRES_PASSWORD, + database=db_connection_info["database"], + api_key=api_key + ) + + try: + # 使用回调上下文管理器 + if CALLBACK_ENABLED and callback_handler and request.user_id: + with CallbackContextManager( + handler=callback_handler, + user_id=request.user_id, + request_id=f"postgresql-query-{int(datetime.utcnow().timestamp())}" + ) as ctx: + ctx.add_tool("postgresql_query") + ctx.add_tool("sql_agent") + + result = db_agent.invoke({"input": request.query}) + + return QueryResponse( + query=request.query, + result=result.get("output", str(result)), + timestamp=datetime.utcnow().isoformat() + ) + else: + result = db_agent.invoke({"input": request.query}) + return QueryResponse( + query=request.query, + result=result.get("output", str(result)), + timestamp=datetime.utcnow().isoformat() + ) + except Exception as e: + logger.error(f"查询失败: {e}") + raise HTTPException(status_code=500, detail=str(e)) + + +# ==================== 主入口 ==================== + +def main(): + """主函数""" + logger.info(f"启动 PostgreSQL Agent - {POD_NAME}") + logger.info(f"回调功能: {'已启用' if CALLBACK_ENABLED else '未启用'}") + + uvicorn.run(app, host=SERVICE_HOST, port=SERVICE_PORT, log_level="info") + + +if __name__ == "__main__": + main() diff --git a/search_agent/API_DOCUMENTATION.md b/search_agent/API_DOCUMENTATION.md new file mode 100644 index 0000000..cc52674 --- /dev/null +++ b/search_agent/API_DOCUMENTATION.md @@ -0,0 +1,185 @@ +# 智能搜索AI Agent API接口文档 + +## 基础信息 + +- **服务名称**: Intelligent Search AI Agent +- **版本**: 1.0.0 +- **基础URL**: `域名` +- **Content-Type**: `application/json` + +--- + +## 核心接口 + +### 执行搜索 + +#### POST /search + +执行智能搜索,根据查询返回答案和相关来源。 + +**请求参数**: + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| query | string | 是 | 搜索查询 | +| llm_api_key | string | 是 | LLM API密钥(用户的API密钥) | +| user_id | string | 否 | 用户ID(用于计费回调) | + +**请求示例**: +```json +{ + "query": "什么是人工智能?", + "llm_api_key": "your-llm-api-key", + "user_id": "user123" +} +``` + +**响应示例**: +```json +{ + "query": "什么是人工智能?", + "answer": "人工智能(AI)是计算机科学的一个分支,致力于创建能够执行通常需要人类智能的任务的系统...", + "sources": [ + { + "index": 1, + "title": "人工智能 - 维基百科", + "url": "https://zh.wikipedia.org/wiki/人工智能" + }, + { + "index": 2, + "title": "什么是AI?", + "url": "https://example.com/ai-introduction" + } + ], + "confidence": "high", + "iterations": 2, + "total_sources": 5, + "search_queries": [ + "什么是人工智能", + "AI定义" + ], + "timestamp": "2024-01-01T00:00:00.000000" +} +``` + +**响应字段说明**: + +| 字段 | 类型 | 说明 | +|------|------|------| +| query | string | 原始查询 | +| answer | string | 生成的答案内容(Markdown格式) | +| sources | array | 来源列表 | +| sources[].index | integer | 来源索引 | +| sources[].title | string | 来源标题 | +| sources[].url | string | 来源URL | +| confidence | string | 置信度:"high" / "medium" / "low" | +| iterations | integer | 迭代次数 | +| total_sources | integer | 参考来源总数 | +| search_queries | array[string] | 使用的搜索查询列表 | +| timestamp | string | 时间戳(ISO格式) | + +**错误响应**: + +400 Bad Request(参数错误): +```json +{ + "detail": "llm_api_key 是必须的参数" +} +``` + +500 Internal Server Error(服务器错误): +```json +{ + "detail": "搜索失败: {错误详情}" +} +``` + +--- + +### 聊天接口 + +#### POST /chat + +聊天接口,是 `/search` 接口的别名,功能和参数完全相同。 + +**请求参数**: 与 `/search` 接口相同 + +**请求示例**: 与 `/search` 接口相同 + +**响应示例**: 与 `/search` 接口相同 + +--- + +## 其他接口 + +### 健康检查 + +#### GET /health + +检查服务健康状态。 + +**请求示例**: +``` +GET /health +``` + +**响应示例**: +```json +{ + "status": "healthy", + "pod_name": "search-agent", + "template_type": "search_agent", + "configured": true, + "llm_base_url": "https://api.example.com", + "llm_model": "xchat52", + "timestamp": "2024-01-01T00:00:00.000000" +} +``` + +--- + +### 获取状态 + +#### GET /status + +获取服务状态信息。 + +**请求示例**: +``` +GET /status +``` + +**响应示例**: +```json +{ + "status": "running", + "pod_name": "search-agent", + "template_type": "search_agent", + "configured": true, + "timestamp": "2024-01-01T00:00:00.000000" +} +``` + +--- + +## 使用说明 + +**重要提示**: +- 用户只需要传递 `query` 和 `llm_api_key` 参数 +- `llm_base_url`、`llm_model` 等配置参数已通过环境变量在部署时配置,**不需要**在请求中传递 +- `user_id` 为可选参数,用于计费回调 + +**请求参数说明**: +- `query` - 搜索查询内容(必填) +- `llm_api_key` - 用户的LLM API密钥(必填) +- `user_id` - 用户ID(可选) + +--- + +## 错误码说明 + +| HTTP状态码 | 说明 | +|-----------|------| +| 200 | 请求成功 | +| 400 | 请求参数错误 | +| 500 | 服务器内部错误 | diff --git a/search_agent/k8s-test-deployment.yaml b/search_agent/k8s-test-deployment.yaml new file mode 100644 index 0000000..b10ad95 --- /dev/null +++ b/search_agent/k8s-test-deployment.yaml @@ -0,0 +1,137 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: agent-search-test +--- +apiVersion: v1 +kind: Secret +metadata: + name: search-agent-secrets + namespace: agent-search-test +type: Opaque +stringData: + # LLM API Key 在请求中传入,环境变量可以留空 + LLM_API_KEY: "" + # Serper 搜索 API Key (必须) + SERPER_API_KEY: "8253b4f240b520194065312f90e85f9be0fa205f" + # Jina Reader API Key (必须) + JINA_API_KEY: "jina_e26dc30420a44a1e859216528065b203TkMRmsoz-FgMDQC5FZX9jr5oF2CI" +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: search-agent + namespace: agent-search-test + labels: + app: search-agent + managed-by: manual-test +spec: + replicas: 1 + selector: + matchLabels: + app: search-agent + template: + metadata: + labels: + app: search-agent + managed-by: manual-test + spec: + nodeSelector: + kubernetes.io/arch: arm64 + + imagePullSecrets: + - name: acr-secret + + containers: + - name: search-agent + image: agnettaiji.azurecr.io/ai-agents/search-agent:latest + imagePullPolicy: Always + ports: + - containerPort: 8080 + name: http + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: TEMPLATE_TYPE + value: "search_agent" + - name: SERVICE_HOST + value: "0.0.0.0" + - name: SERVICE_PORT + value: "8080" + - name: LOG_LEVEL + value: "INFO" + # LLM 配置 (必须) + - name: LLM_BASE_URL + value: "https://litellm.graystone-fb459c5d.southeastasia.azurecontainerapps.io/" + - name: LLM_MODEL + value: "taiji/gpt-4o-mini" + # LLM_API_KEY 可选,在请求中传入 + - name: LLM_API_KEY + valueFrom: + secretKeyRef: + name: search-agent-secrets + key: LLM_API_KEY + # Serper API Key (必须) + - name: SERPER_API_KEY + valueFrom: + secretKeyRef: + name: search-agent-secrets + key: SERPER_API_KEY + # Jina API Key (必须) + - name: JINA_API_KEY + valueFrom: + secretKeyRef: + name: search-agent-secrets + key: JINA_API_KEY + # 搜索配置 + - name: MAX_ITERATIONS + value: "3" + - name: MAX_RESULTS_PER_QUERY + value: "10" + - name: CONTENT_MAX_LENGTH + value: "5000" + - name: TIMEOUT + value: "60" + resources: + requests: + cpu: "500m" + memory: "512Mi" + limits: + cpu: "1000m" + memory: "1Gi" + livenessProbe: + httpGet: + path: /health + port: 8080 + initialDelaySeconds: 60 + periodSeconds: 30 + timeoutSeconds: 10 + failureThreshold: 3 + readinessProbe: + httpGet: + path: /health + port: 8080 + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 3 +--- +apiVersion: v1 +kind: Service +metadata: + name: search-agent + namespace: agent-search-test + labels: + app: search-agent + managed-by: manual-test +spec: + type: LoadBalancer + selector: + app: search-agent + ports: + - port: 80 + targetPort: 8080 + protocol: TCP + name: http diff --git a/search_agent/search_agent.Dockerfile b/search_agent/search_agent.Dockerfile new file mode 100644 index 0000000..632ef5c --- /dev/null +++ b/search_agent/search_agent.Dockerfile @@ -0,0 +1,43 @@ +FROM python:3.11-slim + +WORKDIR /app + +# 安装系统依赖 +RUN apt-get update && apt-get install -y \ + curl \ + && rm -rf /var/lib/apt/lists/* + +# 复制requirements文件 +COPY agents/search_agent/search_agent/requirements.txt /app/search_agent_requirements.txt + +# 安装Python依赖 +RUN pip install --no-cache-dir \ + fastapi==0.109.0 \ + uvicorn[standard]==0.27.0 \ + pydantic==2.5.3 \ + && pip install --no-cache-dir -r /app/search_agent_requirements.txt + +# 复制search_agent目录 +COPY agents/search_agent/search_agent/ /app/search_agent/ + +# 复制主agent文件和共享工具 +COPY agents/search_agent/search_agent_main.py /app/ +COPY common/agent_callback_utils.py /app/common/ +COPY common/api_key_utils.py /app/common/ + +# 设置环境变量 +ENV PYTHONUNBUFFERED=1 +ENV SERVICE_HOST=0.0.0.0 +ENV SERVICE_PORT=8080 +ENV PYTHONPATH=/app + +# 默认 API 密钥(硬编码) +ENV JINA_API_KEY=jina_e26dc30420a44a1e859216528065b203TkMRmsoz-FgMDQC5FZX9jr5oF2CI +ENV SERPER_API_KEY=8253b4f240b520194065312f90e85f9be0fa205f + +# 健康检查 - 使用Python避免僵尸进程 +HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ + CMD python3 -c "import urllib.request; urllib.request.urlopen('http://localhost:8080/health').read()" || exit 1 + +# 运行agent (直接使用Python,避免shell) +CMD ["python3", "-u", "search_agent_main.py"] diff --git a/search_agent/search_agent/.env b/search_agent/search_agent/.env new file mode 100644 index 0000000..e87e4db --- /dev/null +++ b/search_agent/search_agent/.env @@ -0,0 +1,19 @@ +# LLM配置 (xchat52) +LLM_BASE_URL=https://apis.openroutex.com/openai/deployments/xchat52 +LLM_API_KEY=a76ef8d69da64ad99c4bf9739f09585b +LLM_MODEL=xchat52 + +# Serper配置 +SERPER_API_KEY=8253b4f240b520194065312f90e85f9be0fa205f + +# Jina配置 +JINA_API_KEY=jina_e26dc30420a44a1e859216528065b203TkMRmsoz-FgMDQC5FZX9jr5oF2CI + +# Agent配置 +MAX_ITERATIONS=3 +MAX_RESULTS_PER_QUERY=10 +CONTENT_MAX_LENGTH=5000 + +# 日志配置 +LOG_LEVEL=INFO +TIMEOUT=30 diff --git a/search_agent/search_agent/.venv/bin/Activate.ps1 b/search_agent/search_agent/.venv/bin/Activate.ps1 new file mode 100644 index 0000000..b49d77b --- /dev/null +++ b/search_agent/search_agent/.venv/bin/Activate.ps1 @@ -0,0 +1,247 @@ +<# +.Synopsis +Activate a Python virtual environment for the current PowerShell session. + +.Description +Pushes the python executable for a virtual environment to the front of the +$Env:PATH environment variable and sets the prompt to signify that you are +in a Python virtual environment. Makes use of the command line switches as +well as the `pyvenv.cfg` file values present in the virtual environment. + +.Parameter VenvDir +Path to the directory that contains the virtual environment to activate. The +default value for this is the parent of the directory that the Activate.ps1 +script is located within. + +.Parameter Prompt +The prompt prefix to display when this virtual environment is activated. By +default, this prompt is the name of the virtual environment folder (VenvDir) +surrounded by parentheses and followed by a single space (ie. '(.venv) '). + +.Example +Activate.ps1 +Activates the Python virtual environment that contains the Activate.ps1 script. + +.Example +Activate.ps1 -Verbose +Activates the Python virtual environment that contains the Activate.ps1 script, +and shows extra information about the activation as it executes. + +.Example +Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv +Activates the Python virtual environment located in the specified location. + +.Example +Activate.ps1 -Prompt "MyPython" +Activates the Python virtual environment that contains the Activate.ps1 script, +and prefixes the current prompt with the specified string (surrounded in +parentheses) while the virtual environment is active. + +.Notes +On Windows, it may be required to enable this Activate.ps1 script by setting the +execution policy for the user. You can do this by issuing the following PowerShell +command: + +PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser + +For more information on Execution Policies: +https://go.microsoft.com/fwlink/?LinkID=135170 + +#> +Param( + [Parameter(Mandatory = $false)] + [String] + $VenvDir, + [Parameter(Mandatory = $false)] + [String] + $Prompt +) + +<# Function declarations --------------------------------------------------- #> + +<# +.Synopsis +Remove all shell session elements added by the Activate script, including the +addition of the virtual environment's Python executable from the beginning of +the PATH variable. + +.Parameter NonDestructive +If present, do not remove this function from the global namespace for the +session. + +#> +function global:deactivate ([switch]$NonDestructive) { + # Revert to original values + + # The prior prompt: + if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { + Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt + Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT + } + + # The prior PYTHONHOME: + if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { + Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME + Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME + } + + # The prior PATH: + if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { + Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH + Remove-Item -Path Env:_OLD_VIRTUAL_PATH + } + + # Just remove the VIRTUAL_ENV altogether: + if (Test-Path -Path Env:VIRTUAL_ENV) { + Remove-Item -Path env:VIRTUAL_ENV + } + + # Just remove VIRTUAL_ENV_PROMPT altogether. + if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) { + Remove-Item -Path env:VIRTUAL_ENV_PROMPT + } + + # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: + if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { + Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force + } + + # Leave deactivate function in the global namespace if requested: + if (-not $NonDestructive) { + Remove-Item -Path function:deactivate + } +} + +<# +.Description +Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the +given folder, and returns them in a map. + +For each line in the pyvenv.cfg file, if that line can be parsed into exactly +two strings separated by `=` (with any amount of whitespace surrounding the =) +then it is considered a `key = value` line. The left hand string is the key, +the right hand is the value. + +If the value starts with a `'` or a `"` then the first and last character is +stripped from the value before being captured. + +.Parameter ConfigDir +Path to the directory that contains the `pyvenv.cfg` file. +#> +function Get-PyVenvConfig( + [String] + $ConfigDir +) { + Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" + + # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). + $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue + + # An empty map will be returned if no config file is found. + $pyvenvConfig = @{ } + + if ($pyvenvConfigPath) { + + Write-Verbose "File exists, parse `key = value` lines" + $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath + + $pyvenvConfigContent | ForEach-Object { + $keyval = $PSItem -split "\s*=\s*", 2 + if ($keyval[0] -and $keyval[1]) { + $val = $keyval[1] + + # Remove extraneous quotations around a string value. + if ("'""".Contains($val.Substring(0, 1))) { + $val = $val.Substring(1, $val.Length - 2) + } + + $pyvenvConfig[$keyval[0]] = $val + Write-Verbose "Adding Key: '$($keyval[0])'='$val'" + } + } + } + return $pyvenvConfig +} + + +<# Begin Activate script --------------------------------------------------- #> + +# Determine the containing directory of this script +$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition +$VenvExecDir = Get-Item -Path $VenvExecPath + +Write-Verbose "Activation script is located in path: '$VenvExecPath'" +Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" +Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" + +# Set values required in priority: CmdLine, ConfigFile, Default +# First, get the location of the virtual environment, it might not be +# VenvExecDir if specified on the command line. +if ($VenvDir) { + Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" +} +else { + Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." + $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") + Write-Verbose "VenvDir=$VenvDir" +} + +# Next, read the `pyvenv.cfg` file to determine any required value such +# as `prompt`. +$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir + +# Next, set the prompt from the command line, or the config file, or +# just use the name of the virtual environment folder. +if ($Prompt) { + Write-Verbose "Prompt specified as argument, using '$Prompt'" +} +else { + Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" + if ($pyvenvCfg -and $pyvenvCfg['prompt']) { + Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" + $Prompt = $pyvenvCfg['prompt']; + } + else { + Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)" + Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" + $Prompt = Split-Path -Path $venvDir -Leaf + } +} + +Write-Verbose "Prompt = '$Prompt'" +Write-Verbose "VenvDir='$VenvDir'" + +# Deactivate any currently active virtual environment, but leave the +# deactivate function in place. +deactivate -nondestructive + +# Now set the environment variable VIRTUAL_ENV, used by many tools to determine +# that there is an activated venv. +$env:VIRTUAL_ENV = $VenvDir + +if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { + + Write-Verbose "Setting prompt to '$Prompt'" + + # Set the prompt to include the env name + # Make sure _OLD_VIRTUAL_PROMPT is global + function global:_OLD_VIRTUAL_PROMPT { "" } + Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT + New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt + + function global:prompt { + Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " + _OLD_VIRTUAL_PROMPT + } + $env:VIRTUAL_ENV_PROMPT = $Prompt +} + +# Clear PYTHONHOME +if (Test-Path -Path Env:PYTHONHOME) { + Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME + Remove-Item -Path Env:PYTHONHOME +} + +# Add the venv to the PATH +Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH +$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/search_agent/search_agent/.venv/bin/activate b/search_agent/search_agent/.venv/bin/activate new file mode 100644 index 0000000..5786f40 --- /dev/null +++ b/search_agent/search_agent/.venv/bin/activate @@ -0,0 +1,70 @@ +# This file must be used with "source bin/activate" *from bash* +# You cannot run it directly + +deactivate () { + # reset old environment variables + if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then + PATH="${_OLD_VIRTUAL_PATH:-}" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then + PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # Call hash to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + hash -r 2> /dev/null + + if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then + PS1="${_OLD_VIRTUAL_PS1:-}" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + unset VIRTUAL_ENV_PROMPT + if [ ! "${1:-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +# on Windows, a path can contain colons and backslashes and has to be converted: +if [ "${OSTYPE:-}" = "cygwin" ] || [ "${OSTYPE:-}" = "msys" ] ; then + # transform D:\path\to\venv to /d/path/to/venv on MSYS + # and to /cygdrive/d/path/to/venv on Cygwin + export VIRTUAL_ENV=$(cygpath /home/taiji/tools/aks_agent/.venv) +else + # use the path as-is + export VIRTUAL_ENV=/home/taiji/tools/aks_agent/.venv +fi + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/"bin":$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + PS1='(.venv) '"${PS1:-}" + export PS1 + VIRTUAL_ENV_PROMPT='(.venv) ' + export VIRTUAL_ENV_PROMPT +fi + +# Call hash to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +hash -r 2> /dev/null diff --git a/search_agent/search_agent/.venv/bin/activate.csh b/search_agent/search_agent/.venv/bin/activate.csh new file mode 100644 index 0000000..4df2873 --- /dev/null +++ b/search_agent/search_agent/.venv/bin/activate.csh @@ -0,0 +1,27 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. + +# Created by Davide Di Blasi . +# Ported to Python 3.3 venv by Andrew Svetlov + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV /home/taiji/tools/aks_agent/.venv + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/"bin":$PATH" + + +set _OLD_VIRTUAL_PROMPT="$prompt" + +if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then + set prompt = '(.venv) '"$prompt" + setenv VIRTUAL_ENV_PROMPT '(.venv) ' +endif + +alias pydoc python -m pydoc + +rehash diff --git a/search_agent/search_agent/.venv/bin/activate.fish b/search_agent/search_agent/.venv/bin/activate.fish new file mode 100644 index 0000000..3ec809a --- /dev/null +++ b/search_agent/search_agent/.venv/bin/activate.fish @@ -0,0 +1,69 @@ +# This file must be used with "source /bin/activate.fish" *from fish* +# (https://fishshell.com/). You cannot run it directly. + +function deactivate -d "Exit virtual environment and return to normal shell environment" + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + set -gx PATH $_OLD_VIRTUAL_PATH + set -e _OLD_VIRTUAL_PATH + end + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + set -e _OLD_FISH_PROMPT_OVERRIDE + # prevents error when using nested fish instances (Issue #93858) + if functions -q _old_fish_prompt + functions -e fish_prompt + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + end + end + + set -e VIRTUAL_ENV + set -e VIRTUAL_ENV_PROMPT + if test "$argv[1]" != "nondestructive" + # Self-destruct! + functions -e deactivate + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV /home/taiji/tools/aks_agent/.venv + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/"bin $PATH + +# Unset PYTHONHOME if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # fish uses a function instead of an env var to generate the prompt. + + # Save the current fish_prompt function as the function _old_fish_prompt. + functions -c fish_prompt _old_fish_prompt + + # With the original prompt function renamed, we can override with our own. + function fish_prompt + # Save the return status of the last command. + set -l old_status $status + + # Output the venv prompt; color taken from the blue of the Python logo. + printf "%s%s%s" (set_color 4B8BBE) '(.venv) ' (set_color normal) + + # Restore the return status of the previous command. + echo "exit $old_status" | . + # Output the original/"old" prompt. + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" + set -gx VIRTUAL_ENV_PROMPT '(.venv) ' +end diff --git a/search_agent/search_agent/.venv/bin/dotenv b/search_agent/search_agent/.venv/bin/dotenv new file mode 100755 index 0000000..6f9b021 --- /dev/null +++ b/search_agent/search_agent/.venv/bin/dotenv @@ -0,0 +1,8 @@ +#!/home/taiji/tools/aks_agent/.venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from dotenv.__main__ import cli +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(cli()) diff --git a/search_agent/search_agent/.venv/bin/normalizer b/search_agent/search_agent/.venv/bin/normalizer new file mode 100755 index 0000000..81dce35 --- /dev/null +++ b/search_agent/search_agent/.venv/bin/normalizer @@ -0,0 +1,8 @@ +#!/home/taiji/tools/aks_agent/.venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from charset_normalizer.cli import cli_detect +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(cli_detect()) diff --git a/search_agent/search_agent/.venv/bin/pip b/search_agent/search_agent/.venv/bin/pip new file mode 100755 index 0000000..f37c927 --- /dev/null +++ b/search_agent/search_agent/.venv/bin/pip @@ -0,0 +1,8 @@ +#!/home/taiji/tools/aks_agent/.venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/search_agent/search_agent/.venv/bin/pip3 b/search_agent/search_agent/.venv/bin/pip3 new file mode 100755 index 0000000..f37c927 --- /dev/null +++ b/search_agent/search_agent/.venv/bin/pip3 @@ -0,0 +1,8 @@ +#!/home/taiji/tools/aks_agent/.venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/search_agent/search_agent/.venv/bin/pip3.12 b/search_agent/search_agent/.venv/bin/pip3.12 new file mode 100755 index 0000000..f37c927 --- /dev/null +++ b/search_agent/search_agent/.venv/bin/pip3.12 @@ -0,0 +1,8 @@ +#!/home/taiji/tools/aks_agent/.venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/search_agent/search_agent/.venv/bin/python b/search_agent/search_agent/.venv/bin/python new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/search_agent/search_agent/.venv/bin/python @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/search_agent/search_agent/.venv/bin/python3 b/search_agent/search_agent/.venv/bin/python3 new file mode 120000 index 0000000..ae65fda --- /dev/null +++ b/search_agent/search_agent/.venv/bin/python3 @@ -0,0 +1 @@ +/usr/bin/python3 \ No newline at end of file diff --git a/search_agent/search_agent/.venv/bin/python3.12 b/search_agent/search_agent/.venv/bin/python3.12 new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/search_agent/search_agent/.venv/bin/python3.12 @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4f34be11113a710a6955f6b3bba19eddeaa3bea GIT binary patch literal 163747 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 U{>bwH$-fe;wTjGt6&Qge0HU_V9RL6T literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/INSTALLER b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/LICENSE b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/LICENSE new file mode 100644 index 0000000..f26bcf4 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/LICENSE @@ -0,0 +1,279 @@ +A. HISTORY OF THE SOFTWARE +========================== + +Python was created in the early 1990s by Guido van Rossum at Stichting +Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands +as a successor of a language called ABC. Guido remains Python's +principal author, although it includes many contributions from others. + +In 1995, Guido continued his work on Python at the Corporation for +National Research Initiatives (CNRI, see https://www.cnri.reston.va.us) +in Reston, Virginia where he released several versions of the +software. + +In May 2000, Guido and the Python core development team moved to +BeOpen.com to form the BeOpen PythonLabs team. In October of the same +year, the PythonLabs team moved to Digital Creations, which became +Zope Corporation. In 2001, the Python Software Foundation (PSF, see +https://www.python.org/psf/) was formed, a non-profit organization +created specifically to own Python-related Intellectual Property. +Zope Corporation was a sponsoring member of the PSF. + +All Python releases are Open Source (see https://opensource.org for +the Open Source Definition). Historically, most, but not all, Python +releases have also been GPL-compatible; the table below summarizes +the various releases. + + Release Derived Year Owner GPL- + from compatible? (1) + + 0.9.0 thru 1.2 1991-1995 CWI yes + 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes + 1.6 1.5.2 2000 CNRI no + 2.0 1.6 2000 BeOpen.com no + 1.6.1 1.6 2001 CNRI yes (2) + 2.1 2.0+1.6.1 2001 PSF no + 2.0.1 2.0+1.6.1 2001 PSF yes + 2.1.1 2.1+2.0.1 2001 PSF yes + 2.1.2 2.1.1 2002 PSF yes + 2.1.3 2.1.2 2002 PSF yes + 2.2 and above 2.1.1 2001-now PSF yes + +Footnotes: + +(1) GPL-compatible doesn't mean that we're distributing Python under + the GPL. All Python licenses, unlike the GPL, let you distribute + a modified version without making your changes open source. The + GPL-compatible licenses make it possible to combine Python with + other software that is released under the GPL; the others don't. + +(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, + because its license has a choice of law clause. According to + CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 + is "not incompatible" with the GPL. + +Thanks to the many outside volunteers who have worked under Guido's +direction to make these releases possible. + + +B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON +=============================================================== + +Python software and documentation are licensed under the +Python Software Foundation License Version 2. + +Starting with Python 3.8.6, examples, recipes, and other code in +the documentation are dual licensed under the PSF License Version 2 +and the Zero-Clause BSD license. + +Some software incorporated into Python is under different licenses. +The licenses are listed with code falling under that license. + + +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation; +All Rights Reserved" are retained in Python alone or in any derivative version +prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 +------------------------------------------- + +BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 + +1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an +office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the +Individual or Organization ("Licensee") accessing and otherwise using +this software in source or binary form and its associated +documentation ("the Software"). + +2. Subject to the terms and conditions of this BeOpen Python License +Agreement, BeOpen hereby grants Licensee a non-exclusive, +royalty-free, world-wide license to reproduce, analyze, test, perform +and/or display publicly, prepare derivative works, distribute, and +otherwise use the Software alone or in any derivative version, +provided, however, that the BeOpen Python License is retained in the +Software, alone or in any derivative version prepared by Licensee. + +3. BeOpen is making the Software available to Licensee on an "AS IS" +basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE +SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS +AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY +DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +5. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +6. This License Agreement shall be governed by and interpreted in all +respects by the law of the State of California, excluding conflict of +law provisions. Nothing in this License Agreement shall be deemed to +create any relationship of agency, partnership, or joint venture +between BeOpen and Licensee. This License Agreement does not grant +permission to use BeOpen trademarks or trade names in a trademark +sense to endorse or promote products or services of Licensee, or any +third party. As an exception, the "BeOpen Python" logos available at +http://www.pythonlabs.com/logos.html may be used according to the +permissions granted on that web page. + +7. By copying, installing or otherwise using the software, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 +--------------------------------------- + +1. This LICENSE AGREEMENT is between the Corporation for National +Research Initiatives, having an office at 1895 Preston White Drive, +Reston, VA 20191 ("CNRI"), and the Individual or Organization +("Licensee") accessing and otherwise using Python 1.6.1 software in +source or binary form and its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, CNRI +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python 1.6.1 +alone or in any derivative version, provided, however, that CNRI's +License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) +1995-2001 Corporation for National Research Initiatives; All Rights +Reserved" are retained in Python 1.6.1 alone or in any derivative +version prepared by Licensee. Alternately, in lieu of CNRI's License +Agreement, Licensee may substitute the following text (omitting the +quotes): "Python 1.6.1 is made available subject to the terms and +conditions in CNRI's License Agreement. This Agreement together with +Python 1.6.1 may be located on the internet using the following +unique, persistent identifier (known as a handle): 1895.22/1013. This +Agreement may also be obtained from a proxy server on the internet +using the following URL: http://hdl.handle.net/1895.22/1013". + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python 1.6.1 or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python 1.6.1. + +4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" +basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. This License Agreement shall be governed by the federal +intellectual property law of the United States, including without +limitation the federal copyright law, and, to the extent such +U.S. federal law does not apply, by the law of the Commonwealth of +Virginia, excluding Virginia's conflict of law provisions. +Notwithstanding the foregoing, with regard to derivative works based +on Python 1.6.1 that incorporate non-separable material that was +previously distributed under the GNU General Public License (GPL), the +law of the Commonwealth of Virginia shall govern this License +Agreement only as to issues arising under or with respect to +Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this +License Agreement shall be deemed to create any relationship of +agency, partnership, or joint venture between CNRI and Licensee. This +License Agreement does not grant permission to use CNRI trademarks or +trade name in a trademark sense to endorse or promote products or +services of Licensee, or any third party. + +8. By clicking on the "ACCEPT" button where indicated, or by copying, +installing or otherwise using Python 1.6.1, Licensee agrees to be +bound by the terms and conditions of this License Agreement. + + ACCEPT + + +CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 +-------------------------------------------------- + +Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, +The Netherlands. All rights reserved. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION +---------------------------------------------------------------------- + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/METADATA b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/METADATA new file mode 100644 index 0000000..c632040 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/METADATA @@ -0,0 +1,123 @@ +Metadata-Version: 2.3 +Name: aiohappyeyeballs +Version: 2.6.1 +Summary: Happy Eyeballs for asyncio +License: PSF-2.0 +Author: J. Nick Koston +Author-email: nick@koston.org +Requires-Python: >=3.9 +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Natural Language :: English +Classifier: Operating System :: OS Independent +Classifier: Topic :: Software Development :: Libraries +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: License :: OSI Approved :: Python Software Foundation License +Project-URL: Bug Tracker, https://github.com/aio-libs/aiohappyeyeballs/issues +Project-URL: Changelog, https://github.com/aio-libs/aiohappyeyeballs/blob/main/CHANGELOG.md +Project-URL: Documentation, https://aiohappyeyeballs.readthedocs.io +Project-URL: Repository, https://github.com/aio-libs/aiohappyeyeballs +Description-Content-Type: text/markdown + +# aiohappyeyeballs + +

+ + CI Status + + + Documentation Status + + + Test coverage percentage + +

+

+ + Poetry + + + Ruff + + + pre-commit + +

+

+ + PyPI Version + + Supported Python versions + License +

+ +--- + +**Documentation**: https://aiohappyeyeballs.readthedocs.io + +**Source Code**: https://github.com/aio-libs/aiohappyeyeballs + +--- + +[Happy Eyeballs](https://en.wikipedia.org/wiki/Happy_Eyeballs) +([RFC 8305](https://www.rfc-editor.org/rfc/rfc8305.html)) + +## Use case + +This library exists to allow connecting with +[Happy Eyeballs](https://en.wikipedia.org/wiki/Happy_Eyeballs) +([RFC 8305](https://www.rfc-editor.org/rfc/rfc8305.html)) +when you +already have a list of addrinfo and not a DNS name. + +The stdlib version of `loop.create_connection()` +will only work when you pass in an unresolved name which +is not a good fit when using DNS caching or resolving +names via another method such as `zeroconf`. + +## Installation + +Install this via pip (or your favourite package manager): + +`pip install aiohappyeyeballs` + +## License + +[aiohappyeyeballs is licensed under the same terms as cpython itself.](https://github.com/python/cpython/blob/main/LICENSE) + +## Example usage + +```python + +addr_infos = await loop.getaddrinfo("example.org", 80) + +socket = await start_connection(addr_infos) +socket = await start_connection(addr_infos, local_addr_infos=local_addr_infos, happy_eyeballs_delay=0.2) + +transport, protocol = await loop.create_connection( + MyProtocol, sock=socket, ...) + +# Remove the first address for each family from addr_info +pop_addr_infos_interleave(addr_info, 1) + +# Remove all matching address from addr_info +remove_addr_infos(addr_info, "dead::beef::") + +# Convert a local_addr to local_addr_infos +local_addr_infos = addr_to_addr_infos(("127.0.0.1",0)) +``` + +## Credits + +This package contains code from cpython and is licensed under the same terms as cpython itself. + +This package was created with +[Copier](https://copier.readthedocs.io/) and the +[browniebroke/pypackage-template](https://github.com/browniebroke/pypackage-template) +project template. + diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/RECORD b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/RECORD new file mode 100644 index 0000000..9e0e202 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/RECORD @@ -0,0 +1,16 @@ +aiohappyeyeballs-2.6.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +aiohappyeyeballs-2.6.1.dist-info/LICENSE,sha256=Oy-B_iHRgcSZxZolbI4ZaEVdZonSaaqFNzv7avQdo78,13936 +aiohappyeyeballs-2.6.1.dist-info/METADATA,sha256=NSXlhJwAfi380eEjAo7BQ4P_TVal9xi0qkyZWibMsVM,5915 +aiohappyeyeballs-2.6.1.dist-info/RECORD,, +aiohappyeyeballs-2.6.1.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88 +aiohappyeyeballs/__init__.py,sha256=x7kktHEtaD9quBcWDJPuLeKyjuVAI-Jj14S9B_5hcTs,361 +aiohappyeyeballs/__pycache__/__init__.cpython-312.pyc,, +aiohappyeyeballs/__pycache__/_staggered.cpython-312.pyc,, +aiohappyeyeballs/__pycache__/impl.cpython-312.pyc,, +aiohappyeyeballs/__pycache__/types.cpython-312.pyc,, +aiohappyeyeballs/__pycache__/utils.cpython-312.pyc,, +aiohappyeyeballs/_staggered.py,sha256=edfVowFx-P-ywJjIEF3MdPtEMVODujV6CeMYr65otac,6900 +aiohappyeyeballs/impl.py,sha256=Dlcm2mTJ28ucrGnxkb_fo9CZzLAkOOBizOt7dreBbXE,9681 +aiohappyeyeballs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +aiohappyeyeballs/types.py,sha256=YZJIAnyoV4Dz0WFtlaf_OyE4EW7Xus1z7aIfNI6tDDQ,425 +aiohappyeyeballs/utils.py,sha256=on9GxIR0LhEfZu8P6Twi9hepX9zDanuZM20MWsb3xlQ,3028 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/WHEEL b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/WHEEL new file mode 100644 index 0000000..0582547 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs-2.6.1.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: poetry-core 2.1.1 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/__init__.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/__init__.py new file mode 100644 index 0000000..71c689c --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/__init__.py @@ -0,0 +1,14 @@ +__version__ = "2.6.1" + +from .impl import start_connection +from .types import AddrInfoType, SocketFactoryType +from .utils import addr_to_addr_infos, pop_addr_infos_interleave, remove_addr_infos + +__all__ = ( + "AddrInfoType", + "SocketFactoryType", + "addr_to_addr_infos", + "pop_addr_infos_interleave", + "remove_addr_infos", + "start_connection", +) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/__pycache__/__init__.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a76e966e09fe639344f78081999ae7b3990a4fe GIT binary patch literal 504 zcmZ8dJx?4l5cPiD?r~fQky235&~3q5cSxxa5>2EuG?!{qSiW5+XU<+*wr`_N1;2vd zz;ECuP|-zhC=dl565UmqJp~12isv^o&u_-Q9gnvV#LpYXd4SMEpS(u+m%JPUxk5E6 zQ61Ew2xM4>LC+%*$+(PVQYM=`76X}bt?$+6{RP{=*6SE7m`p>od0MAhn1i#;X aycj*AgL^c+N3%OLdydmlc$u0VQ2YT&9FI!? literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/__pycache__/_staggered.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/__pycache__/_staggered.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b55892bcbe69503a37200b9486bc682153729cca GIT binary patch literal 8006 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 VvnMa$l*Nj54spUaUOXhp{ts6-r1Ag& literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/_staggered.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/_staggered.py new file mode 100644 index 0000000..9a4ba72 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/_staggered.py @@ -0,0 +1,207 @@ +import asyncio +import contextlib + +# PY3.9: Import Callable from typing until we drop Python 3.9 support +# https://github.com/python/cpython/issues/87131 +from typing import ( + TYPE_CHECKING, + Any, + Awaitable, + Callable, + Iterable, + List, + Optional, + Set, + Tuple, + TypeVar, + Union, +) + +_T = TypeVar("_T") + +RE_RAISE_EXCEPTIONS = (SystemExit, KeyboardInterrupt) + + +def _set_result(wait_next: "asyncio.Future[None]") -> None: + """Set the result of a future if it is not already done.""" + if not wait_next.done(): + wait_next.set_result(None) + + +async def _wait_one( + futures: "Iterable[asyncio.Future[Any]]", + loop: asyncio.AbstractEventLoop, +) -> _T: + """Wait for the first future to complete.""" + wait_next = loop.create_future() + + def _on_completion(fut: "asyncio.Future[Any]") -> None: + if not wait_next.done(): + wait_next.set_result(fut) + + for f in futures: + f.add_done_callback(_on_completion) + + try: + return await wait_next + finally: + for f in futures: + f.remove_done_callback(_on_completion) + + +async def staggered_race( + coro_fns: Iterable[Callable[[], Awaitable[_T]]], + delay: Optional[float], + *, + loop: Optional[asyncio.AbstractEventLoop] = None, +) -> Tuple[Optional[_T], Optional[int], List[Optional[BaseException]]]: + """ + Run coroutines with staggered start times and take the first to finish. + + This method takes an iterable of coroutine functions. The first one is + started immediately. From then on, whenever the immediately preceding one + fails (raises an exception), or when *delay* seconds has passed, the next + coroutine is started. This continues until one of the coroutines complete + successfully, in which case all others are cancelled, or until all + coroutines fail. + + The coroutines provided should be well-behaved in the following way: + + * They should only ``return`` if completed successfully. + + * They should always raise an exception if they did not complete + successfully. In particular, if they handle cancellation, they should + probably reraise, like this:: + + try: + # do work + except asyncio.CancelledError: + # undo partially completed work + raise + + Args: + ---- + coro_fns: an iterable of coroutine functions, i.e. callables that + return a coroutine object when called. Use ``functools.partial`` or + lambdas to pass arguments. + + delay: amount of time, in seconds, between starting coroutines. If + ``None``, the coroutines will run sequentially. + + loop: the event loop to use. If ``None``, the running loop is used. + + Returns: + ------- + tuple *(winner_result, winner_index, exceptions)* where + + - *winner_result*: the result of the winning coroutine, or ``None`` + if no coroutines won. + + - *winner_index*: the index of the winning coroutine in + ``coro_fns``, or ``None`` if no coroutines won. If the winning + coroutine may return None on success, *winner_index* can be used + to definitively determine whether any coroutine won. + + - *exceptions*: list of exceptions returned by the coroutines. + ``len(exceptions)`` is equal to the number of coroutines actually + started, and the order is the same as in ``coro_fns``. The winning + coroutine's entry is ``None``. + + """ + loop = loop or asyncio.get_running_loop() + exceptions: List[Optional[BaseException]] = [] + tasks: Set[asyncio.Task[Optional[Tuple[_T, int]]]] = set() + + async def run_one_coro( + coro_fn: Callable[[], Awaitable[_T]], + this_index: int, + start_next: "asyncio.Future[None]", + ) -> Optional[Tuple[_T, int]]: + """ + Run a single coroutine. + + If the coroutine fails, set the exception in the exceptions list and + start the next coroutine by setting the result of the start_next. + + If the coroutine succeeds, return the result and the index of the + coroutine in the coro_fns list. + + If SystemExit or KeyboardInterrupt is raised, re-raise it. + """ + try: + result = await coro_fn() + except RE_RAISE_EXCEPTIONS: + raise + except BaseException as e: + exceptions[this_index] = e + _set_result(start_next) # Kickstart the next coroutine + return None + + return result, this_index + + start_next_timer: Optional[asyncio.TimerHandle] = None + start_next: Optional[asyncio.Future[None]] + task: asyncio.Task[Optional[Tuple[_T, int]]] + done: Union[asyncio.Future[None], asyncio.Task[Optional[Tuple[_T, int]]]] + coro_iter = iter(coro_fns) + this_index = -1 + try: + while True: + if coro_fn := next(coro_iter, None): + this_index += 1 + exceptions.append(None) + start_next = loop.create_future() + task = loop.create_task(run_one_coro(coro_fn, this_index, start_next)) + tasks.add(task) + start_next_timer = ( + loop.call_later(delay, _set_result, start_next) if delay else None + ) + elif not tasks: + # We exhausted the coro_fns list and no tasks are running + # so we have no winner and all coroutines failed. + break + + while tasks or start_next: + done = await _wait_one( + (*tasks, start_next) if start_next else tasks, loop + ) + if done is start_next: + # The current task has failed or the timer has expired + # so we need to start the next task. + start_next = None + if start_next_timer: + start_next_timer.cancel() + start_next_timer = None + + # Break out of the task waiting loop to start the next + # task. + break + + if TYPE_CHECKING: + assert isinstance(done, asyncio.Task) + + tasks.remove(done) + if winner := done.result(): + return *winner, exceptions + finally: + # We either have: + # - a winner + # - all tasks failed + # - a KeyboardInterrupt or SystemExit. + + # + # If the timer is still running, cancel it. + # + if start_next_timer: + start_next_timer.cancel() + + # + # If there are any tasks left, cancel them and than + # wait them so they fill the exceptions list. + # + for task in tasks: + task.cancel() + with contextlib.suppress(asyncio.CancelledError): + await task + + return None, None, exceptions diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/impl.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/impl.py new file mode 100644 index 0000000..8f3919a --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/impl.py @@ -0,0 +1,259 @@ +"""Base implementation.""" + +import asyncio +import collections +import contextlib +import functools +import itertools +import socket +from typing import List, Optional, Sequence, Set, Union + +from . import _staggered +from .types import AddrInfoType, SocketFactoryType + + +async def start_connection( + addr_infos: Sequence[AddrInfoType], + *, + local_addr_infos: Optional[Sequence[AddrInfoType]] = None, + happy_eyeballs_delay: Optional[float] = None, + interleave: Optional[int] = None, + loop: Optional[asyncio.AbstractEventLoop] = None, + socket_factory: Optional[SocketFactoryType] = None, +) -> socket.socket: + """ + Connect to a TCP server. + + Create a socket connection to a specified destination. The + destination is specified as a list of AddrInfoType tuples as + returned from getaddrinfo(). + + The arguments are, in order: + + * ``family``: the address family, e.g. ``socket.AF_INET`` or + ``socket.AF_INET6``. + * ``type``: the socket type, e.g. ``socket.SOCK_STREAM`` or + ``socket.SOCK_DGRAM``. + * ``proto``: the protocol, e.g. ``socket.IPPROTO_TCP`` or + ``socket.IPPROTO_UDP``. + * ``canonname``: the canonical name of the address, e.g. + ``"www.python.org"``. + * ``sockaddr``: the socket address + + This method is a coroutine which will try to establish the connection + in the background. When successful, the coroutine returns a + socket. + + The expected use case is to use this method in conjunction with + loop.create_connection() to establish a connection to a server:: + + socket = await start_connection(addr_infos) + transport, protocol = await loop.create_connection( + MyProtocol, sock=socket, ...) + """ + if not (current_loop := loop): + current_loop = asyncio.get_running_loop() + + single_addr_info = len(addr_infos) == 1 + + if happy_eyeballs_delay is not None and interleave is None: + # If using happy eyeballs, default to interleave addresses by family + interleave = 1 + + if interleave and not single_addr_info: + addr_infos = _interleave_addrinfos(addr_infos, interleave) + + sock: Optional[socket.socket] = None + # uvloop can raise RuntimeError instead of OSError + exceptions: List[List[Union[OSError, RuntimeError]]] = [] + if happy_eyeballs_delay is None or single_addr_info: + # not using happy eyeballs + for addrinfo in addr_infos: + try: + sock = await _connect_sock( + current_loop, + exceptions, + addrinfo, + local_addr_infos, + None, + socket_factory, + ) + break + except (RuntimeError, OSError): + continue + else: # using happy eyeballs + open_sockets: Set[socket.socket] = set() + try: + sock, _, _ = await _staggered.staggered_race( + ( + functools.partial( + _connect_sock, + current_loop, + exceptions, + addrinfo, + local_addr_infos, + open_sockets, + socket_factory, + ) + for addrinfo in addr_infos + ), + happy_eyeballs_delay, + ) + finally: + # If we have a winner, staggered_race will + # cancel the other tasks, however there is a + # small race window where any of the other tasks + # can be done before they are cancelled which + # will leave the socket open. To avoid this problem + # we pass a set to _connect_sock to keep track of + # the open sockets and close them here if there + # are any "runner up" sockets. + for s in open_sockets: + if s is not sock: + with contextlib.suppress(OSError): + s.close() + open_sockets = None # type: ignore[assignment] + + if sock is None: + all_exceptions = [exc for sub in exceptions for exc in sub] + try: + first_exception = all_exceptions[0] + if len(all_exceptions) == 1: + raise first_exception + else: + # If they all have the same str(), raise one. + model = str(first_exception) + if all(str(exc) == model for exc in all_exceptions): + raise first_exception + # Raise a combined exception so the user can see all + # the various error messages. + msg = "Multiple exceptions: {}".format( + ", ".join(str(exc) for exc in all_exceptions) + ) + # If the errno is the same for all exceptions, raise + # an OSError with that errno. + if isinstance(first_exception, OSError): + first_errno = first_exception.errno + if all( + isinstance(exc, OSError) and exc.errno == first_errno + for exc in all_exceptions + ): + raise OSError(first_errno, msg) + elif isinstance(first_exception, RuntimeError) and all( + isinstance(exc, RuntimeError) for exc in all_exceptions + ): + raise RuntimeError(msg) + # We have a mix of OSError and RuntimeError + # so we have to pick which one to raise. + # and we raise OSError for compatibility + raise OSError(msg) + finally: + all_exceptions = None # type: ignore[assignment] + exceptions = None # type: ignore[assignment] + + return sock + + +async def _connect_sock( + loop: asyncio.AbstractEventLoop, + exceptions: List[List[Union[OSError, RuntimeError]]], + addr_info: AddrInfoType, + local_addr_infos: Optional[Sequence[AddrInfoType]] = None, + open_sockets: Optional[Set[socket.socket]] = None, + socket_factory: Optional[SocketFactoryType] = None, +) -> socket.socket: + """ + Create, bind and connect one socket. + + If open_sockets is passed, add the socket to the set of open sockets. + Any failure caught here will remove the socket from the set and close it. + + Callers can use this set to close any sockets that are not the winner + of all staggered tasks in the result there are runner up sockets aka + multiple winners. + """ + my_exceptions: List[Union[OSError, RuntimeError]] = [] + exceptions.append(my_exceptions) + family, type_, proto, _, address = addr_info + sock = None + try: + if socket_factory is not None: + sock = socket_factory(addr_info) + else: + sock = socket.socket(family=family, type=type_, proto=proto) + if open_sockets is not None: + open_sockets.add(sock) + sock.setblocking(False) + if local_addr_infos is not None: + for lfamily, _, _, _, laddr in local_addr_infos: + # skip local addresses of different family + if lfamily != family: + continue + try: + sock.bind(laddr) + break + except OSError as exc: + msg = ( + f"error while attempting to bind on " + f"address {laddr!r}: " + f"{(exc.strerror or '').lower()}" + ) + exc = OSError(exc.errno, msg) + my_exceptions.append(exc) + else: # all bind attempts failed + if my_exceptions: + raise my_exceptions.pop() + else: + raise OSError(f"no matching local address with {family=} found") + await loop.sock_connect(sock, address) + return sock + except (RuntimeError, OSError) as exc: + my_exceptions.append(exc) + if sock is not None: + if open_sockets is not None: + open_sockets.remove(sock) + try: + sock.close() + except OSError as e: + my_exceptions.append(e) + raise + raise + except: + if sock is not None: + if open_sockets is not None: + open_sockets.remove(sock) + try: + sock.close() + except OSError as e: + my_exceptions.append(e) + raise + raise + finally: + exceptions = my_exceptions = None # type: ignore[assignment] + + +def _interleave_addrinfos( + addrinfos: Sequence[AddrInfoType], first_address_family_count: int = 1 +) -> List[AddrInfoType]: + """Interleave list of addrinfo tuples by family.""" + # Group addresses by family + addrinfos_by_family: collections.OrderedDict[int, List[AddrInfoType]] = ( + collections.OrderedDict() + ) + for addr in addrinfos: + family = addr[0] + if family not in addrinfos_by_family: + addrinfos_by_family[family] = [] + addrinfos_by_family[family].append(addr) + addrinfos_lists = list(addrinfos_by_family.values()) + + reordered: List[AddrInfoType] = [] + if first_address_family_count > 1: + reordered.extend(addrinfos_lists[0][: first_address_family_count - 1]) + del addrinfos_lists[0][: first_address_family_count - 1] + reordered.extend( + a + for a in itertools.chain.from_iterable(itertools.zip_longest(*addrinfos_lists)) + if a is not None + ) + return reordered diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/py.typed b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/types.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/types.py new file mode 100644 index 0000000..e8c7507 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/types.py @@ -0,0 +1,17 @@ +"""Types for aiohappyeyeballs.""" + +import socket + +# PY3.9: Import Callable from typing until we drop Python 3.9 support +# https://github.com/python/cpython/issues/87131 +from typing import Callable, Tuple, Union + +AddrInfoType = Tuple[ + Union[int, socket.AddressFamily], + Union[int, socket.SocketKind], + int, + str, + Tuple, # type: ignore[type-arg] +] + +SocketFactoryType = Callable[[AddrInfoType], socket.socket] diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/utils.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/utils.py new file mode 100644 index 0000000..ea29adb --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohappyeyeballs/utils.py @@ -0,0 +1,97 @@ +"""Utility functions for aiohappyeyeballs.""" + +import ipaddress +import socket +from typing import Dict, List, Optional, Tuple, Union + +from .types import AddrInfoType + + +def addr_to_addr_infos( + addr: Optional[ + Union[Tuple[str, int, int, int], Tuple[str, int, int], Tuple[str, int]] + ], +) -> Optional[List[AddrInfoType]]: + """Convert an address tuple to a list of addr_info tuples.""" + if addr is None: + return None + host = addr[0] + port = addr[1] + is_ipv6 = ":" in host + if is_ipv6: + flowinfo = 0 + scopeid = 0 + addr_len = len(addr) + if addr_len >= 4: + scopeid = addr[3] # type: ignore[misc] + if addr_len >= 3: + flowinfo = addr[2] # type: ignore[misc] + addr = (host, port, flowinfo, scopeid) + family = socket.AF_INET6 + else: + addr = (host, port) + family = socket.AF_INET + return [(family, socket.SOCK_STREAM, socket.IPPROTO_TCP, "", addr)] + + +def pop_addr_infos_interleave( + addr_infos: List[AddrInfoType], interleave: Optional[int] = None +) -> None: + """ + Pop addr_info from the list of addr_infos by family up to interleave times. + + The interleave parameter is used to know how many addr_infos for + each family should be popped of the top of the list. + """ + seen: Dict[int, int] = {} + if interleave is None: + interleave = 1 + to_remove: List[AddrInfoType] = [] + for addr_info in addr_infos: + family = addr_info[0] + if family not in seen: + seen[family] = 0 + if seen[family] < interleave: + to_remove.append(addr_info) + seen[family] += 1 + for addr_info in to_remove: + addr_infos.remove(addr_info) + + +def _addr_tuple_to_ip_address( + addr: Union[Tuple[str, int], Tuple[str, int, int, int]], +) -> Union[ + Tuple[ipaddress.IPv4Address, int], Tuple[ipaddress.IPv6Address, int, int, int] +]: + """Convert an address tuple to an IPv4Address.""" + return (ipaddress.ip_address(addr[0]), *addr[1:]) + + +def remove_addr_infos( + addr_infos: List[AddrInfoType], + addr: Union[Tuple[str, int], Tuple[str, int, int, int]], +) -> None: + """ + Remove an address from the list of addr_infos. + + The addr value is typically the return value of + sock.getpeername(). + """ + bad_addrs_infos: List[AddrInfoType] = [] + for addr_info in addr_infos: + if addr_info[-1] == addr: + bad_addrs_infos.append(addr_info) + if bad_addrs_infos: + for bad_addr_info in bad_addrs_infos: + addr_infos.remove(bad_addr_info) + return + # Slow path in case addr is formatted differently + match_addr = _addr_tuple_to_ip_address(addr) + for addr_info in addr_infos: + if match_addr == _addr_tuple_to_ip_address(addr_info[-1]): + bad_addrs_infos.append(addr_info) + if bad_addrs_infos: + for bad_addr_info in bad_addrs_infos: + addr_infos.remove(bad_addr_info) + return + raise ValueError(f"Address {addr} not found in addr_infos") diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/INSTALLER b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/METADATA b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/METADATA new file mode 100644 index 0000000..078765d --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/METADATA @@ -0,0 +1,262 @@ +Metadata-Version: 2.4 +Name: aiohttp +Version: 3.13.3 +Summary: Async http client/server framework (asyncio) +Maintainer-email: aiohttp team +License: Apache-2.0 AND MIT +Project-URL: Homepage, https://github.com/aio-libs/aiohttp +Project-URL: Chat: Matrix, https://matrix.to/#/#aio-libs:matrix.org +Project-URL: Chat: Matrix Space, https://matrix.to/#/#aio-libs-space:matrix.org +Project-URL: CI: GitHub Actions, https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI +Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/aiohttp +Project-URL: Docs: Changelog, https://docs.aiohttp.org/en/stable/changes.html +Project-URL: Docs: RTD, https://docs.aiohttp.org +Project-URL: GitHub: issues, https://github.com/aio-libs/aiohttp/issues +Project-URL: GitHub: repo, https://github.com/aio-libs/aiohttp +Classifier: Development Status :: 5 - Production/Stable +Classifier: Framework :: AsyncIO +Classifier: Intended Audience :: Developers +Classifier: Operating System :: POSIX +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Operating System :: Microsoft :: Windows +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 +Classifier: Topic :: Internet :: WWW/HTTP +Requires-Python: >=3.9 +Description-Content-Type: text/x-rst +License-File: LICENSE.txt +License-File: vendor/llhttp/LICENSE +Requires-Dist: aiohappyeyeballs>=2.5.0 +Requires-Dist: aiosignal>=1.4.0 +Requires-Dist: async-timeout<6.0,>=4.0; python_version < "3.11" +Requires-Dist: attrs>=17.3.0 +Requires-Dist: frozenlist>=1.1.1 +Requires-Dist: multidict<7.0,>=4.5 +Requires-Dist: propcache>=0.2.0 +Requires-Dist: yarl<2.0,>=1.17.0 +Provides-Extra: speedups +Requires-Dist: aiodns>=3.3.0; extra == "speedups" +Requires-Dist: Brotli>=1.2; platform_python_implementation == "CPython" and extra == "speedups" +Requires-Dist: brotlicffi>=1.2; platform_python_implementation != "CPython" and extra == "speedups" +Requires-Dist: backports.zstd; (platform_python_implementation == "CPython" and python_version < "3.14") and extra == "speedups" +Dynamic: license-file + +================================== +Async http client/server framework +================================== + +.. image:: https://raw.githubusercontent.com/aio-libs/aiohttp/master/docs/aiohttp-plain.svg + :height: 64px + :width: 64px + :alt: aiohttp logo + +| + +.. image:: https://github.com/aio-libs/aiohttp/workflows/CI/badge.svg + :target: https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI + :alt: GitHub Actions status for master branch + +.. image:: https://codecov.io/gh/aio-libs/aiohttp/branch/master/graph/badge.svg + :target: https://codecov.io/gh/aio-libs/aiohttp + :alt: codecov.io status for master branch + +.. image:: https://badge.fury.io/py/aiohttp.svg + :target: https://pypi.org/project/aiohttp + :alt: Latest PyPI package version + +.. image:: https://img.shields.io/pypi/dm/aiohttp + :target: https://pypistats.org/packages/aiohttp + :alt: Downloads count + +.. image:: https://readthedocs.org/projects/aiohttp/badge/?version=latest + :target: https://docs.aiohttp.org/ + :alt: Latest Read The Docs + +.. image:: https://img.shields.io/endpoint?url=https://codspeed.io/badge.json + :target: https://codspeed.io/aio-libs/aiohttp + :alt: Codspeed.io status for aiohttp + + +Key Features +============ + +- Supports both client and server side of HTTP protocol. +- Supports both client and server Web-Sockets out-of-the-box and avoids + Callback Hell. +- Provides Web-server with middleware and pluggable routing. + + +Getting started +=============== + +Client +------ + +To get something from the web: + +.. code-block:: python + + import aiohttp + import asyncio + + async def main(): + + async with aiohttp.ClientSession() as session: + async with session.get('http://python.org') as response: + + print("Status:", response.status) + print("Content-type:", response.headers['content-type']) + + html = await response.text() + print("Body:", html[:15], "...") + + asyncio.run(main()) + +This prints: + +.. code-block:: + + Status: 200 + Content-type: text/html; charset=utf-8 + Body: ... + +Coming from `requests `_ ? Read `why we need so many lines `_. + +Server +------ + +An example using a simple server: + +.. code-block:: python + + # examples/server_simple.py + from aiohttp import web + + async def handle(request): + name = request.match_info.get('name', "Anonymous") + text = "Hello, " + name + return web.Response(text=text) + + async def wshandle(request): + ws = web.WebSocketResponse() + await ws.prepare(request) + + async for msg in ws: + if msg.type == web.WSMsgType.text: + await ws.send_str("Hello, {}".format(msg.data)) + elif msg.type == web.WSMsgType.binary: + await ws.send_bytes(msg.data) + elif msg.type == web.WSMsgType.close: + break + + return ws + + + app = web.Application() + app.add_routes([web.get('/', handle), + web.get('/echo', wshandle), + web.get('/{name}', handle)]) + + if __name__ == '__main__': + web.run_app(app) + + +Documentation +============= + +https://aiohttp.readthedocs.io/ + + +Demos +===== + +https://github.com/aio-libs/aiohttp-demos + + +External links +============== + +* `Third party libraries + `_ +* `Built with aiohttp + `_ +* `Powered by aiohttp + `_ + +Feel free to make a Pull Request for adding your link to these pages! + + +Communication channels +====================== + +*aio-libs Discussions*: https://github.com/aio-libs/aiohttp/discussions + +*Matrix*: `#aio-libs:matrix.org `_ + +We support `Stack Overflow +`_. +Please add *aiohttp* tag to your question there. + +Requirements +============ + +- attrs_ +- multidict_ +- yarl_ +- frozenlist_ + +Optionally you may install the aiodns_ library (highly recommended for sake of speed). + +.. _aiodns: https://pypi.python.org/pypi/aiodns +.. _attrs: https://github.com/python-attrs/attrs +.. _multidict: https://pypi.python.org/pypi/multidict +.. _frozenlist: https://pypi.org/project/frozenlist/ +.. _yarl: https://pypi.python.org/pypi/yarl +.. _async-timeout: https://pypi.python.org/pypi/async_timeout + +License +======= + +``aiohttp`` is offered under the Apache 2 license. + + +Keepsafe +======== + +The aiohttp community would like to thank Keepsafe +(https://www.getkeepsafe.com) for its support in the early days of +the project. + + +Source code +=========== + +The latest developer version is available in a GitHub repository: +https://github.com/aio-libs/aiohttp + +Benchmarks +========== + +If you are interested in efficiency, the AsyncIO community maintains a +list of benchmarks on the official wiki: +https://github.com/python/asyncio/wiki/Benchmarks + +-------- + +.. image:: https://img.shields.io/matrix/aio-libs:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat + :target: https://matrix.to/#/%23aio-libs:matrix.org + :alt: Matrix Room — #aio-libs:matrix.org + +.. image:: https://img.shields.io/matrix/aio-libs-space:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs-space%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat + :target: https://matrix.to/#/%23aio-libs-space:matrix.org + :alt: Matrix Space — #aio-libs-space:matrix.org + +.. image:: https://insights.linuxfoundation.org/api/badge/health-score?project=aiohttp + :target: https://insights.linuxfoundation.org/project/aiohttp + :alt: LFX Health Score diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/RECORD b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/RECORD new file mode 100644 index 0000000..e3b00ef --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/RECORD @@ -0,0 +1,139 @@ +aiohttp-3.13.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +aiohttp-3.13.3.dist-info/METADATA,sha256=CQROZCStho-eb7xiFIuAzj30JuupEU_jHpYDFiG_HhM,8145 +aiohttp-3.13.3.dist-info/RECORD,, +aiohttp-3.13.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +aiohttp-3.13.3.dist-info/WHEEL,sha256=DxRnWQz-Kp9-4a4hdDHsSv0KUC3H7sN9Nbef3-8RjXU,190 +aiohttp-3.13.3.dist-info/licenses/LICENSE.txt,sha256=n4DQ2311WpQdtFchcsJw7L2PCCuiFd3QlZhZQu2Uqes,588 +aiohttp-3.13.3.dist-info/licenses/vendor/llhttp/LICENSE,sha256=68qFTgE0zSVtZzYnwgSZ9CV363S6zwi58ltianPJEnc,1105 +aiohttp-3.13.3.dist-info/top_level.txt,sha256=iv-JIaacmTl-hSho3QmphcKnbRRYx1st47yjz_178Ro,8 +aiohttp/.hash/_cparser.pxd.hash,sha256=pjs-sEXNw_eijXGAedwG-BHnlFp8B7sOCgUagIWaU2A,121 +aiohttp/.hash/_find_header.pxd.hash,sha256=_mbpD6vM-CVCKq3ulUvsOAz5Wdo88wrDzfpOsMQaMNA,125 +aiohttp/.hash/_http_parser.pyx.hash,sha256=RKkD9x-EhXksvXrpCaTNWYtffb52urLvuTnxbTN2Lmw,125 +aiohttp/.hash/_http_writer.pyx.hash,sha256=9txOh7t7c3y-vLmiuEY5dltmXvEo0CYyU4U853yyv9E,125 +aiohttp/.hash/hdrs.py.hash,sha256=v6IaKbsxjsdQxBzhb5AjP0x_9G3rUe84D7avf7AI4cs,116 +aiohttp/__init__.py,sha256=QWssFaD-DaFFcwP36lLUQzRmlSZ5KxivJBU-yg5C1wg,8302 +aiohttp/__pycache__/__init__.cpython-312.pyc,, +aiohttp/__pycache__/_cookie_helpers.cpython-312.pyc,, +aiohttp/__pycache__/abc.cpython-312.pyc,, +aiohttp/__pycache__/base_protocol.cpython-312.pyc,, +aiohttp/__pycache__/client.cpython-312.pyc,, +aiohttp/__pycache__/client_exceptions.cpython-312.pyc,, +aiohttp/__pycache__/client_middleware_digest_auth.cpython-312.pyc,, +aiohttp/__pycache__/client_middlewares.cpython-312.pyc,, +aiohttp/__pycache__/client_proto.cpython-312.pyc,, +aiohttp/__pycache__/client_reqrep.cpython-312.pyc,, +aiohttp/__pycache__/client_ws.cpython-312.pyc,, +aiohttp/__pycache__/compression_utils.cpython-312.pyc,, +aiohttp/__pycache__/connector.cpython-312.pyc,, +aiohttp/__pycache__/cookiejar.cpython-312.pyc,, +aiohttp/__pycache__/formdata.cpython-312.pyc,, +aiohttp/__pycache__/hdrs.cpython-312.pyc,, +aiohttp/__pycache__/helpers.cpython-312.pyc,, +aiohttp/__pycache__/http.cpython-312.pyc,, +aiohttp/__pycache__/http_exceptions.cpython-312.pyc,, +aiohttp/__pycache__/http_parser.cpython-312.pyc,, +aiohttp/__pycache__/http_websocket.cpython-312.pyc,, +aiohttp/__pycache__/http_writer.cpython-312.pyc,, +aiohttp/__pycache__/log.cpython-312.pyc,, +aiohttp/__pycache__/multipart.cpython-312.pyc,, +aiohttp/__pycache__/payload.cpython-312.pyc,, +aiohttp/__pycache__/payload_streamer.cpython-312.pyc,, +aiohttp/__pycache__/pytest_plugin.cpython-312.pyc,, +aiohttp/__pycache__/resolver.cpython-312.pyc,, +aiohttp/__pycache__/streams.cpython-312.pyc,, +aiohttp/__pycache__/tcp_helpers.cpython-312.pyc,, +aiohttp/__pycache__/test_utils.cpython-312.pyc,, +aiohttp/__pycache__/tracing.cpython-312.pyc,, +aiohttp/__pycache__/typedefs.cpython-312.pyc,, +aiohttp/__pycache__/web.cpython-312.pyc,, +aiohttp/__pycache__/web_app.cpython-312.pyc,, +aiohttp/__pycache__/web_exceptions.cpython-312.pyc,, +aiohttp/__pycache__/web_fileresponse.cpython-312.pyc,, +aiohttp/__pycache__/web_log.cpython-312.pyc,, +aiohttp/__pycache__/web_middlewares.cpython-312.pyc,, +aiohttp/__pycache__/web_protocol.cpython-312.pyc,, +aiohttp/__pycache__/web_request.cpython-312.pyc,, +aiohttp/__pycache__/web_response.cpython-312.pyc,, +aiohttp/__pycache__/web_routedef.cpython-312.pyc,, +aiohttp/__pycache__/web_runner.cpython-312.pyc,, +aiohttp/__pycache__/web_server.cpython-312.pyc,, +aiohttp/__pycache__/web_urldispatcher.cpython-312.pyc,, +aiohttp/__pycache__/web_ws.cpython-312.pyc,, +aiohttp/__pycache__/worker.cpython-312.pyc,, +aiohttp/_cookie_helpers.py,sha256=_p7y-B8OCAk7FLjByiuwFIpDLGuNoJn3_vixzymAFnE,13659 +aiohttp/_cparser.pxd,sha256=UnbUYCHg4NdXfgyRVYAMv2KTLWClB4P-xCrvtj_r7ew,4295 +aiohttp/_find_header.pxd,sha256=0GfwFCPN2zxEKTO1_MA5sYq2UfzsG8kcV3aTqvwlz3g,68 +aiohttp/_headers.pxi,sha256=n701k28dVPjwRnx5j6LpJhLTfj7dqu2vJt7f0O60Oyg,2007 +aiohttp/_http_parser.cpython-312-x86_64-linux-gnu.so,sha256=WZP45rtTvKwOq_1uXO_1L84Kz6I0AnqYZn0b5L-6HkA,2833152 +aiohttp/_http_parser.pyx,sha256=-YI8YIY4uKd_7Bwr0o3FwEPwjHdexZ5-Ji3XS067c4Q,28261 +aiohttp/_http_writer.cpython-312-x86_64-linux-gnu.so,sha256=mWC-4rsbntVD1V5ZEKEpSW_sm63V0XRe1fDR0lygipo,539144 +aiohttp/_http_writer.pyx,sha256=VlFEBM6HoVv8a0AAJtc6JwFlsv2-cDE8-gB94p3dfhQ,4664 +aiohttp/_websocket/.hash/mask.pxd.hash,sha256=Y0zBddk_ck3pi9-BFzMcpkcvCKvwvZ4GTtZFb9u1nxQ,128 +aiohttp/_websocket/.hash/mask.pyx.hash,sha256=90owpXYM8_kIma4KUcOxhWSk-Uv4NVMBoCYeFM1B3d0,128 +aiohttp/_websocket/.hash/reader_c.pxd.hash,sha256=5xf3oobk6vx4xbJm-xtZ1_QufB8fYFtLQV2MNdqUc1w,132 +aiohttp/_websocket/__init__.py,sha256=Mar3R9_vBN_Ea4lsW7iTAVXD7OKswKPGqF5xgSyt77k,44 +aiohttp/_websocket/__pycache__/__init__.cpython-312.pyc,, +aiohttp/_websocket/__pycache__/helpers.cpython-312.pyc,, +aiohttp/_websocket/__pycache__/models.cpython-312.pyc,, +aiohttp/_websocket/__pycache__/reader.cpython-312.pyc,, +aiohttp/_websocket/__pycache__/reader_c.cpython-312.pyc,, +aiohttp/_websocket/__pycache__/reader_py.cpython-312.pyc,, +aiohttp/_websocket/__pycache__/writer.cpython-312.pyc,, +aiohttp/_websocket/helpers.py,sha256=P-XLv8IUaihKzDenVUqfKU5DJbWE5HvG8uhvUZK8Ic4,5038 +aiohttp/_websocket/mask.cpython-312-x86_64-linux-gnu.so,sha256=EpRwPJm1K1yavMCd9llAWdT4AsqKx_QEN0rb0eJH_Kc,263512 +aiohttp/_websocket/mask.pxd,sha256=sBmZ1Amym9kW4Ge8lj1fLZ7mPPya4LzLdpkQExQXv5M,112 +aiohttp/_websocket/mask.pyx,sha256=BHjOtV0O0w7xp9p0LNADRJvGmgfPn9sGeJvSs0fL__4,1397 +aiohttp/_websocket/models.py,sha256=XAzjs_8JYszWXIgZ6R3ZRrF-tX9Q_6LiD49WRYojopM,2121 +aiohttp/_websocket/reader.py,sha256=eC4qS0c5sOeQ2ebAHLaBpIaTVFaSKX79pY2xvh3Pqyw,1030 +aiohttp/_websocket/reader_c.cpython-312-x86_64-linux-gnu.so,sha256=GYd-y-IkGkOIp3vmma5BmZgmG9Py9fLTybcmMWyHNf0,1822128 +aiohttp/_websocket/reader_c.pxd,sha256=nl_njtDrzlQU0rjgGGjZDB-swguE0tX_bCPobkShVa4,2625 +aiohttp/_websocket/reader_c.py,sha256=V5YtZ2gj2BjE2Q-W9sR_MdAl1VAm1pB7ZjozVJcOpbg,18868 +aiohttp/_websocket/reader_py.py,sha256=V5YtZ2gj2BjE2Q-W9sR_MdAl1VAm1pB7ZjozVJcOpbg,18868 +aiohttp/_websocket/writer.py,sha256=2OvSktPmNh_g20h1cXJt2Xu8u6IvswnPjdur7OwBbJk,11261 +aiohttp/abc.py,sha256=M66F4S6m00bIEn7y4ha_XLTMDmVQ9dPihfOVB0pGfOo,7149 +aiohttp/base_protocol.py,sha256=Tp8cxUPQvv9kUPk3w6lAzk6d2MAzV3scwI_3Go3C47c,3025 +aiohttp/client.py,sha256=fOQfwcIUL1NGAVRV4DDj6-wipBzeD8KZpmzhO-LLKp4,58357 +aiohttp/client_exceptions.py,sha256=uyKbxI2peZhKl7lELBMx3UeusNkfpemPWpGFq0r6JeM,11367 +aiohttp/client_middleware_digest_auth.py,sha256=G5JM9YtzL9AWklz6NP28xEOBeAvrAZgDzU657JqO4qs,17627 +aiohttp/client_middlewares.py,sha256=kP5N9CMzQPMGPIEydeVUiLUTLsw8Vl8Gr4qAWYdu3vM,1918 +aiohttp/client_proto.py,sha256=56_WtLStZGBFPYKzgEgY6v24JkhV1y6JEmmuxeJT2So,12110 +aiohttp/client_reqrep.py,sha256=eEREDrZ0M8ZFTt1wjHduR-P8_sm40K65gNz-iMGYask,53391 +aiohttp/client_ws.py,sha256=1CIjIXwyzOMIYw6AjUES4-qUwbyVHW1seJKQfg_Rta8,15109 +aiohttp/compression_utils.py,sha256=hJ2LXhN2OWukFHm5b78TJFGKcAiL2kthi9Sf5PRYO-U,11738 +aiohttp/connector.py,sha256=vT22BNuCDtbadE1Uq7HC7zpOWCHMxI4n3PtCz7zZZkw,69004 +aiohttp/cookiejar.py,sha256=e28ZMQwJ5P0vbPX1OX4Se7-k3zeGvocFEqzGhwpG53k,18922 +aiohttp/formdata.py,sha256=xqYMbUo1qoLYPuzY92XeR4pyEe-w-DNcToARDF3GUhA,6384 +aiohttp/hdrs.py,sha256=2rj5MyA-6yRdYPhW5UKkW4iNWhEAlGIOSBH5D4FmKNE,5111 +aiohttp/helpers.py,sha256=Q1307PCEnWz4RP8crUw8dk58c0YF2Ei3JywkKfRxz5E,30629 +aiohttp/http.py,sha256=8o8j8xH70OWjnfTWA9V44NR785QPxEPrUtzMXiAVpwc,1842 +aiohttp/http_exceptions.py,sha256=BjIxD4LtrQgytqoR5lOI9zAttNmSygRgksUsMRy7sss,3069 +aiohttp/http_parser.py,sha256=z6djZDOUs7hdPzplTEsAVyz0of-rQAwT7xz8OpXhnuY,38177 +aiohttp/http_websocket.py,sha256=8VXFKw6KQUEmPg48GtRMB37v0gTK7A0inoxXuDxMZEc,842 +aiohttp/http_writer.py,sha256=fbRtKPYSqRbtAdr_gqpjF2-4sI1ESL8dPDF-xY_mAMY,12446 +aiohttp/log.py,sha256=BbNKx9e3VMIm0xYjZI0IcBBoS7wjdeIeSaiJE7-qK2g,325 +aiohttp/multipart.py,sha256=326npYdWxYI3raoRfmpBeUV_ef3-LRn8sV9WqcIOoPk,40482 +aiohttp/payload.py,sha256=O6nsYNULL7AeM2cyJ6TYX73ncVnL5xJwt5AegxwMKqw,40874 +aiohttp/payload_streamer.py,sha256=ZzEYyfzcjGWkVkK3XR2pBthSCSIykYvY3Wr5cGQ2eTc,2211 +aiohttp/py.typed,sha256=sow9soTwP9T_gEAQSVh7Gb8855h04Nwmhs2We-JRgZM,7 +aiohttp/pytest_plugin.py,sha256=z4XwqmsKdyJCKxbGiA5kFf90zcedvomqk4RqjZbhKNk,12901 +aiohttp/resolver.py,sha256=gsrfUpFf8iHlcHfJvY-1fiBHW3PRvRVNb5lNZBg3zlY,10031 +aiohttp/streams.py,sha256=rlwL7ek6CkMMYil_e_EokWv26uHmtzi3lKqlnLNrXCc,23666 +aiohttp/tcp_helpers.py,sha256=BSadqVWaBpMFDRWnhaaR941N9MiDZ7bdTrxgCb0CW-M,961 +aiohttp/test_utils.py,sha256=ZJSzZWjC76KSbtwddTKcP6vHpUl_ozfAf3F93ewmHRU,23016 +aiohttp/tracing.py,sha256=-6aaW6l0J9uJD45LzR4cijYH0j62pt0U_nn_aVzFku4,14558 +aiohttp/typedefs.py,sha256=wUlqwe9Mw9W8jT3HsYJcYk00qP3EMPz3nTkYXmeNN48,1657 +aiohttp/web.py,sha256=JzSNmejg5G6YeFAnkIgZfytqbU86sNu844yYKmoUpqs,17852 +aiohttp/web_app.py,sha256=lGU_aAMN-h3wy-LTTHi6SeKH8ydt1G51BXcCspgD5ZA,19452 +aiohttp/web_exceptions.py,sha256=7nIuiwhZ39vJJ9KrWqArA5QcWbUdqkz2CLwEpJapeN8,10360 +aiohttp/web_fileresponse.py,sha256=Xzau8EMrWNrFg3u46h4UEteg93G4zYq94CU6vy0HiqE,16362 +aiohttp/web_log.py,sha256=rX5D7xLOX2B6BMdiZ-chme_KfJfW5IXEoFwLfkfkajs,7865 +aiohttp/web_middlewares.py,sha256=sFI0AgeNjdyAjuz92QtMIpngmJSOxrqe2Jfbs4BNUu0,4165 +aiohttp/web_protocol.py,sha256=6s9dMzmaqW77bzM1T111uGNSLFo6gNmfDg7XzYnA8xk,27010 +aiohttp/web_request.py,sha256=KqrOp6AeWB5e6tKrG55Lo7Zbwq49DxdrKniuW2t2u04,29849 +aiohttp/web_response.py,sha256=PKcziNU4LmftXqKVvoRMrAbOeVClpSN-iznHsiWezmU,29341 +aiohttp/web_routedef.py,sha256=VT1GAx6BrawoDh5RwBwBu5wSABSqgWwAe74AUCyZAEo,6110 +aiohttp/web_runner.py,sha256=v1G1nKiOOQgFnTSR4IMc6I9ReEFDMaHtMLvO_roDM-A,11786 +aiohttp/web_server.py,sha256=-9WDKUAiR9ll-rSdwXSqG6YjaoW79d1R4y0BGSqgUMA,2888 +aiohttp/web_urldispatcher.py,sha256=JM-TlriKCNbTLNL43Ra9sdZ0zChxZmIEYQM6ZpbyjI4,44290 +aiohttp/web_ws.py,sha256=lItgmyatkXh0M6EY7JoZnSZkUl6R0wv8B88X4ILqQbU,22739 +aiohttp/worker.py,sha256=zT0iWN5Xze194bO6_VjHou0x7lR_k0MviN6Kadnk22g,8152 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/REQUESTED b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/WHEEL b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/WHEEL new file mode 100644 index 0000000..f3e8a97 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/WHEEL @@ -0,0 +1,7 @@ +Wheel-Version: 1.0 +Generator: setuptools (80.9.0) +Root-Is-Purelib: false +Tag: cp312-cp312-manylinux_2_17_x86_64 +Tag: cp312-cp312-manylinux2014_x86_64 +Tag: cp312-cp312-manylinux_2_28_x86_64 + diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/licenses/LICENSE.txt b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/licenses/LICENSE.txt new file mode 100644 index 0000000..e497a32 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/licenses/LICENSE.txt @@ -0,0 +1,13 @@ + Copyright aio-libs contributors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/licenses/vendor/llhttp/LICENSE b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/licenses/vendor/llhttp/LICENSE new file mode 100644 index 0000000..6c1512d --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/licenses/vendor/llhttp/LICENSE @@ -0,0 +1,22 @@ +This software is licensed under the MIT License. + +Copyright Fedor Indutny, 2018. + +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/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/top_level.txt b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/top_level.txt new file mode 100644 index 0000000..ee4ba4f --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp-3.13.3.dist-info/top_level.txt @@ -0,0 +1 @@ +aiohttp diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/.hash/_cparser.pxd.hash b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/.hash/_cparser.pxd.hash new file mode 100644 index 0000000..3f5cd0e --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/.hash/_cparser.pxd.hash @@ -0,0 +1 @@ +5276d46021e0e0d7577e0c9155800cbf62932d60a50783fec42aefb63febedec /home/runner/work/aiohttp/aiohttp/aiohttp/_cparser.pxd diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/.hash/_find_header.pxd.hash b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/.hash/_find_header.pxd.hash new file mode 100644 index 0000000..f006c2d --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/.hash/_find_header.pxd.hash @@ -0,0 +1 @@ +d067f01423cddb3c442933b5fcc039b18ab651fcec1bc91c577693aafc25cf78 /home/runner/work/aiohttp/aiohttp/aiohttp/_find_header.pxd diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/.hash/_http_parser.pyx.hash b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/.hash/_http_parser.pyx.hash new file mode 100644 index 0000000..1099b5e --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/.hash/_http_parser.pyx.hash @@ -0,0 +1 @@ +f9823c608638b8a77fec1c2bd28dc5c043f08c775ec59e7e262dd74b4ebb7384 /home/runner/work/aiohttp/aiohttp/aiohttp/_http_parser.pyx diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/.hash/_http_writer.pyx.hash b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/.hash/_http_writer.pyx.hash new file mode 100644 index 0000000..ad351fe --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/.hash/_http_writer.pyx.hash @@ -0,0 +1 @@ +56514404ce87a15bfc6b400026d73a270165b2fdbe70313cfa007de29ddd7e14 /home/runner/work/aiohttp/aiohttp/aiohttp/_http_writer.pyx diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/.hash/hdrs.py.hash b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/.hash/hdrs.py.hash new file mode 100644 index 0000000..c8d5524 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/.hash/hdrs.py.hash @@ -0,0 +1 @@ +dab8f933203eeb245d60f856e542a45b888d5a110094620e4811f90f816628d1 /home/runner/work/aiohttp/aiohttp/aiohttp/hdrs.py diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__init__.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__init__.py new file mode 100644 index 0000000..357baf0 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__init__.py @@ -0,0 +1,278 @@ +__version__ = "3.13.3" + +from typing import TYPE_CHECKING, Tuple + +from . import hdrs as hdrs +from .client import ( + BaseConnector, + ClientConnectionError, + ClientConnectionResetError, + ClientConnectorCertificateError, + ClientConnectorDNSError, + ClientConnectorError, + ClientConnectorSSLError, + ClientError, + ClientHttpProxyError, + ClientOSError, + ClientPayloadError, + ClientProxyConnectionError, + ClientRequest, + ClientResponse, + ClientResponseError, + ClientSession, + ClientSSLError, + ClientTimeout, + ClientWebSocketResponse, + ClientWSTimeout, + ConnectionTimeoutError, + ContentTypeError, + Fingerprint, + InvalidURL, + InvalidUrlClientError, + InvalidUrlRedirectClientError, + NamedPipeConnector, + NonHttpUrlClientError, + NonHttpUrlRedirectClientError, + RedirectClientError, + RequestInfo, + ServerConnectionError, + ServerDisconnectedError, + ServerFingerprintMismatch, + ServerTimeoutError, + SocketTimeoutError, + TCPConnector, + TooManyRedirects, + UnixConnector, + WSMessageTypeError, + WSServerHandshakeError, + request, +) +from .client_middleware_digest_auth import DigestAuthMiddleware +from .client_middlewares import ClientHandlerType, ClientMiddlewareType +from .compression_utils import set_zlib_backend +from .connector import ( + AddrInfoType as AddrInfoType, + SocketFactoryType as SocketFactoryType, +) +from .cookiejar import CookieJar as CookieJar, DummyCookieJar as DummyCookieJar +from .formdata import FormData as FormData +from .helpers import BasicAuth, ChainMapProxy, ETag +from .http import ( + HttpVersion as HttpVersion, + HttpVersion10 as HttpVersion10, + HttpVersion11 as HttpVersion11, + WebSocketError as WebSocketError, + WSCloseCode as WSCloseCode, + WSMessage as WSMessage, + WSMsgType as WSMsgType, +) +from .multipart import ( + BadContentDispositionHeader as BadContentDispositionHeader, + BadContentDispositionParam as BadContentDispositionParam, + BodyPartReader as BodyPartReader, + MultipartReader as MultipartReader, + MultipartWriter as MultipartWriter, + content_disposition_filename as content_disposition_filename, + parse_content_disposition as parse_content_disposition, +) +from .payload import ( + PAYLOAD_REGISTRY as PAYLOAD_REGISTRY, + AsyncIterablePayload as AsyncIterablePayload, + BufferedReaderPayload as BufferedReaderPayload, + BytesIOPayload as BytesIOPayload, + BytesPayload as BytesPayload, + IOBasePayload as IOBasePayload, + JsonPayload as JsonPayload, + Payload as Payload, + StringIOPayload as StringIOPayload, + StringPayload as StringPayload, + TextIOPayload as TextIOPayload, + get_payload as get_payload, + payload_type as payload_type, +) +from .payload_streamer import streamer as streamer +from .resolver import ( + AsyncResolver as AsyncResolver, + DefaultResolver as DefaultResolver, + ThreadedResolver as ThreadedResolver, +) +from .streams import ( + EMPTY_PAYLOAD as EMPTY_PAYLOAD, + DataQueue as DataQueue, + EofStream as EofStream, + FlowControlDataQueue as FlowControlDataQueue, + StreamReader as StreamReader, +) +from .tracing import ( + TraceConfig as TraceConfig, + TraceConnectionCreateEndParams as TraceConnectionCreateEndParams, + TraceConnectionCreateStartParams as TraceConnectionCreateStartParams, + TraceConnectionQueuedEndParams as TraceConnectionQueuedEndParams, + TraceConnectionQueuedStartParams as TraceConnectionQueuedStartParams, + TraceConnectionReuseconnParams as TraceConnectionReuseconnParams, + TraceDnsCacheHitParams as TraceDnsCacheHitParams, + TraceDnsCacheMissParams as TraceDnsCacheMissParams, + TraceDnsResolveHostEndParams as TraceDnsResolveHostEndParams, + TraceDnsResolveHostStartParams as TraceDnsResolveHostStartParams, + TraceRequestChunkSentParams as TraceRequestChunkSentParams, + TraceRequestEndParams as TraceRequestEndParams, + TraceRequestExceptionParams as TraceRequestExceptionParams, + TraceRequestHeadersSentParams as TraceRequestHeadersSentParams, + TraceRequestRedirectParams as TraceRequestRedirectParams, + TraceRequestStartParams as TraceRequestStartParams, + TraceResponseChunkReceivedParams as TraceResponseChunkReceivedParams, +) + +if TYPE_CHECKING: + # At runtime these are lazy-loaded at the bottom of the file. + from .worker import ( + GunicornUVLoopWebWorker as GunicornUVLoopWebWorker, + GunicornWebWorker as GunicornWebWorker, + ) + +__all__: Tuple[str, ...] = ( + "hdrs", + # client + "AddrInfoType", + "BaseConnector", + "ClientConnectionError", + "ClientConnectionResetError", + "ClientConnectorCertificateError", + "ClientConnectorDNSError", + "ClientConnectorError", + "ClientConnectorSSLError", + "ClientError", + "ClientHttpProxyError", + "ClientOSError", + "ClientPayloadError", + "ClientProxyConnectionError", + "ClientResponse", + "ClientRequest", + "ClientResponseError", + "ClientSSLError", + "ClientSession", + "ClientTimeout", + "ClientWebSocketResponse", + "ClientWSTimeout", + "ConnectionTimeoutError", + "ContentTypeError", + "Fingerprint", + "FlowControlDataQueue", + "InvalidURL", + "InvalidUrlClientError", + "InvalidUrlRedirectClientError", + "NonHttpUrlClientError", + "NonHttpUrlRedirectClientError", + "RedirectClientError", + "RequestInfo", + "ServerConnectionError", + "ServerDisconnectedError", + "ServerFingerprintMismatch", + "ServerTimeoutError", + "SocketFactoryType", + "SocketTimeoutError", + "TCPConnector", + "TooManyRedirects", + "UnixConnector", + "NamedPipeConnector", + "WSServerHandshakeError", + "request", + # client_middleware + "ClientMiddlewareType", + "ClientHandlerType", + # cookiejar + "CookieJar", + "DummyCookieJar", + # formdata + "FormData", + # helpers + "BasicAuth", + "ChainMapProxy", + "DigestAuthMiddleware", + "ETag", + "set_zlib_backend", + # http + "HttpVersion", + "HttpVersion10", + "HttpVersion11", + "WSMsgType", + "WSCloseCode", + "WSMessage", + "WebSocketError", + # multipart + "BadContentDispositionHeader", + "BadContentDispositionParam", + "BodyPartReader", + "MultipartReader", + "MultipartWriter", + "content_disposition_filename", + "parse_content_disposition", + # payload + "AsyncIterablePayload", + "BufferedReaderPayload", + "BytesIOPayload", + "BytesPayload", + "IOBasePayload", + "JsonPayload", + "PAYLOAD_REGISTRY", + "Payload", + "StringIOPayload", + "StringPayload", + "TextIOPayload", + "get_payload", + "payload_type", + # payload_streamer + "streamer", + # resolver + "AsyncResolver", + "DefaultResolver", + "ThreadedResolver", + # streams + "DataQueue", + "EMPTY_PAYLOAD", + "EofStream", + "StreamReader", + # tracing + "TraceConfig", + "TraceConnectionCreateEndParams", + "TraceConnectionCreateStartParams", + "TraceConnectionQueuedEndParams", + "TraceConnectionQueuedStartParams", + "TraceConnectionReuseconnParams", + "TraceDnsCacheHitParams", + "TraceDnsCacheMissParams", + "TraceDnsResolveHostEndParams", + "TraceDnsResolveHostStartParams", + "TraceRequestChunkSentParams", + "TraceRequestEndParams", + "TraceRequestExceptionParams", + "TraceRequestHeadersSentParams", + "TraceRequestRedirectParams", + "TraceRequestStartParams", + "TraceResponseChunkReceivedParams", + # workers (imported lazily with __getattr__) + "GunicornUVLoopWebWorker", + "GunicornWebWorker", + "WSMessageTypeError", +) + + +def __dir__() -> Tuple[str, ...]: + return __all__ + ("__doc__",) + + +def __getattr__(name: str) -> object: + global GunicornUVLoopWebWorker, GunicornWebWorker + + # Importing gunicorn takes a long time (>100ms), so only import if actually needed. + if name in ("GunicornUVLoopWebWorker", "GunicornWebWorker"): + try: + from .worker import GunicornUVLoopWebWorker as guv, GunicornWebWorker as gw + except ImportError: + return None + + GunicornUVLoopWebWorker = guv # type: ignore[misc] + GunicornWebWorker = gw # type: ignore[misc] + return guv if name == "GunicornUVLoopWebWorker" else gw + + raise AttributeError(f"module {__name__} has no attribute {name}") diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/__init__.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3a3794198560b09ebd8b7f2beceb7783d82c423 GIT binary patch literal 5315 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 r<@+<(x6dAW_k(+@2icb^lv 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
  • 82hbp>sko`Pg&GH8@}ADIiXWPGc5Ly4-g^b zyEO+(F>5xeBF~^XL}@rZ8t}=j^n`;026r?|RI?Oc#lZu2$1wGm!^q@KQ;}M0zcM8_biy=*!-m=^KC@9OoptIZ;jhwG6SF(G~ z^CZ|Z`|1<7XSVxOpo_Ebd1t$y_$y~Gdij?>d=PltJ@3j@?pyfo!sK%0;kC-9Y-Q6*W%Il(SN+_=n?IZL z*R1&)vi^n~U-#EzkJ1m5A4%EjD~OdUDnU`jzWaUm`apB#;^|d?8{X6&CFc7l-E@Ip6NP=Wd^y7v6h) z&hiD;S^o2uwVIY}P0J(OYE5U(w`a}AXMOx)`Kqt}6Q3WHmsS6ydd>+*<|$co@6EdR z=KNKE)wp!*S1ljbXMNuReV(FqH|Ht6TYS5C!M1R1erDBOzYb&ulrP+=|6;_#xhp<( zSFO4CXWjdAzOKg?%uc@Y**+c5xs0>4O@NMo6+8#`^p5~#_Zg7OaIXNS4J9~k1`tcJ z+;IWg*$SXt9t_ObMeB@1w9Pn?ud+p~H?0%cWwJA4CrE{!hZ1n-cN)G1@WK6=?ra7i z4gFrqxVD9S_J>AfxkJ6fte^1!zPYvoZUqp+mT`}JvGy%j9!wQw+!(Ep z+d|R&jLIH055&f+%|08yBDiEq56}(zka$U@L<_s}yabRRrwq%M3sh|Y(+$c!qIU~0 zC8N3J%7DX#z!b32nIH%i-lUCgT^kv=>P2nB0`0zY-LB^3|IwrJoAW3D-ufiD*y<7yw*_U7N#U17_&Qba0ls`)1C3Q(UWi zzOm$uO#|q@H4k7E9j1 z9CTQ<1*5j}jTEQrv#=EzGX>a**)u&lo7aWcH}MVn zCOBQodNhDl5kcPw+W<pIY`M!&9^o0Q&FZXL@=F68a zUVPnnw=1e#)<0+w&r4GbBg$Pg8Uu%}8-h&7=>;hA1ylkpzDko7Gb17z8D@n+Nckn| z-OZ};)rt&W8lTE&UL6wxJ4y+iZk8Qqc+tb?4pU0Km;x|-po4YL^9~S_yr@jK|Hi-a zTLvN54|B(!pY3~6w&yALip5bm=lrCk0ssoIYFF``whu+nZIt$AISOxONSpFT=93#^?p)b{iL+w$)4xl-}_+i;?EWV;4WARUggz zkLIe+eq=LY>ER>y`T!CSH~s2+^L+q`6=>9w^|$N*Vok<%JStv3a%R>4Qm*#!z4HK~ zyDQhz7OtdJ=keX~+vDpMB$)Nrt(>oB*}jLt#K3c!D;yS+k#JbE;yWi_Vd7OkJaMX1 zDbhpA?aGwFlPN7I6O=R#Tkt`bp|jyIj68;-kDyYp5lo*o4~~VV;pA{8bDny=j+^GX z)_eKoi~YTtqr1Q7+&Q+RG#er+b~=JmdRV3p`ZUJ{3XfTSRNo^kf+6+$fYa062T}gY zeMUB7u+ICf0m$~vU_HmU5a`wPeo3#?pW$VTHF6-9) z4)^*g&f)seYj3|cUv|IxUNsJCo}S^$t+OTTXDxdz{-tY=dOjFj=TLln?Zckm4L+qJ zI+fPU$#Y=3<9!;X)fA1VLjUGC}6p1zVjarH}9#W?$aJ%~3o literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/abc.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/abc.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9317149cdc713d4fd757760efe6a5f5b1be7c8d5 GIT binary patch literal 12479 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 H=f?j7K>y#K;j4S6 z*iz|0ag2fvTsSU*%IHU-_NO+CqWuieqNw{@pdkGK*{g#ZXbUudMC1U0zdEz`peRd5 zKf8ivXLn|I=VoSSX8D&;sED z3V--ruUmOZCn2is!0u*J8{1omua?**+zz_+U){dO!3*==-1#K_7rVtOVh_UA<@F2$c)x zg@8v?!fI5F4RmKCFdK&*MCkh$1u13(PvkW9JG7!#@|B|GG2C*oQmGnVxtd$hRK*C% z3e6SD^2J<1SE(V&c}Iu9sp&>UrfN%hP#&owSIf z3D;f+utI8FjmQpJ!4aB{HHE;)S<7ga@!@NcW?O|Uk~{qL8Ocq-F$oPK2qB0d5CMRP z2%1`)rBN7YxMwo??0jafQc^Q|t}tK7=#@%Q%jDkCpLC>L~DUP`Rj^0+-6MRpM=+dmE;}0z`)TWIs#~s;Kke6 z6mEh0E`0jZOJ|uOlIQ4xnk>vF^*J@!HD|J*B`a06JU%UPOj&n0nt;7DJTOVO0W|y; zyQ(a0>-i*SekZQL4_hW34-xxsym#%r)pL!A)bL64D=^<9KW@#uU+WvX#8rCh~&2IM)i6TJ17dEN>CyVBN5Nz#K%|pgBa-^^sfQ#|57USLFxZHn`J8Z} z#NWjJjtlx{YnT9jzGIU7v41Mzy4TME?1@AFlL_hns|neqT5m%8o>=;&d*Sox*AVPO zupu_l3`}kaoYq~kHaG$d+IawApg^P*7``7EUOn~e>0eGa(v!Ug8f%JU55)``NU{yI z`*Szy!NkKLBKf=uSA&o$E4>JR4e#yKB)e^STq3YEY%w^Bk%1 zy>)|m4crvBGrT!%v79ed4F5U1l%aT?%o4)I;uFISUZ)yLm`qv;GSbbbaw(^%OM^Xu zegpLcEY)@cSSF7{(U14EVyR{K$=ypFXQYhW46wqQH_7HF6^Km#My+LTC!OX&M0<+gP{2EbuLZ zeFHgO0hSXPay#fGAh=C!f)xuVCX$NENo}5yj#HpbXvycl!Z%ka9xPA=h z0^#}u^sV4fGdOfhc@#|jD>wk@=CL^3NbY|i9%zg4FT6s?G;x}`^`ksa+`fuymS)h&N;k_T*VH7o{}M_`qcPHYMx^NuaMbGA?5I`BhBhOVvW z!(DD01FKv1{{TGiN3iN={EF+xZa4FS!{oaAH!et3hk;-6ndV1X*ZBa7VubP#uXI(O zU4Zw7O84WON1H3CMTO!m>!~H|hs~T?tg3WFda@opChaX;Is@Q82qgj6FzX>Sx*`dswOQIGngqzE-~Vy$9iR%a^|I zOFz?MaLkpdeN%_Hd*j^HLE&D;1GvOfBuq;Qd{dNjPy)$DpDdRu%0dzGpe+AzAy>30 zep%Lv65Jm_iSvMdaL;~8^B%HRN&-4`}90PENu!zMnWG})9UI|K%Qf+L{o^u^ra)oH@B%7 zj4NGjJ@XwkO*={700Q0(Z4>}hGaUDK68;An`8RpxQ}WeMN&2bhEsop$(cxA+)r_aU JAUI+>{TF2j#nu1- literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/client.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/client.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a42672bc84fa1e9bba2c693a2205e3e92e5d9120 GIT binary patch literal 56389 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 Ik}uZ(1CbNuivR!s literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/client_exceptions.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/client_exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..defdeead6d4c53b9bd1f46c41e58e71f187400aa GIT binary patch literal 17975 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

    oS&%;Y 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 atDorPJpKLJ6MpGEf8~jG=X-53!v6(X9Ccd& literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/client_middleware_digest_auth.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/client_middleware_digest_auth.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d1f04179d414680748a8f4a26a281eeec6f50319 GIT binary patch literal 16471 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 Zf4{xE+M}(s=V}U^KsAL0t5Vr~Ec literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/client_proto.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/client_proto.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b84eae353b07ce5ed666ae0cddbf38861f5c640 GIT binary patch literal 13380 zcmdU0eQaCTb$^fF6iJbyzNl|XqAXLED1SF`Y`2aj+evLDjg_Qf)3LPPQ$&Ry+Ivs2 zrBJQid6<+rjRSOxjJAjh45)(?SPBeShGD=~AVYx-0~yN@`=+icmi^KFF))^c1SzoX zckbhRq$t`!{~53=^M0Ot-@WIabM86kUjLKFQ^z4(`CBnDG0JiOP6a(UOPTF|M&>O} z-~>L&MJY8U`IISY;wf)Vnp2jjC1s6TQ?{rrWsllXZxO6XN6Hy>vb-%>mvTj2DR=Q&8*FlY)Q37TT_8(fR&xewp4qx zo#pG29jVS}XR0gOmFkXm^PGu0%L%UQoZuFnVwY$W17i2IsSR_d-@6uVHPN00KJ57| z6(+*G>X7H><|I*;!xq(iD!rgOo|;nyTHjVOcd2|50`|-FeJ}qUG z%v2^BwyMpilL;}coX(`v;uLipm!yoOdbH}NE^0-;R(v|Xkj%sdt*-T=D7_*|V+nam z>nxTU{1-D*FN?}#A|+<#6$XqCd1B*VKOMU`J~8>k#Q1r&b^OB9lP|;`e`@T7*u}|H zlh0m^oqlR;{G#fk2~uAPb5g`Bit3R?B_>{(64}DkIx1qt^GPLaQvK%?W$qbKp39`M zuDB$NlInjZep#=&0Mx`^60!0|g2c+FP?Jc%q|M8$dbEi=ed>ktPn{Z5onvt&{t=p(|RMdKeQNf9? z)g!G#>P6~8>ch8b1UK>xf=Bd=jr2Wje#_i6FVtUmN1Fic1w^wj%IbWmYboU$kZ%XPwW=@#V#R)bO1jZu}Ro--4^Y^3HO8 zC@ns6PE5{;QgA96m*t?63C4x^oD#ewDwjnu9n?862=HJfokdhjGLxB8ZIYEAOAB1s z3YjQ%qT|8TLu^S=AAXCDI8c7Lx*0^u*+u%zRRaO(iq3h}Jnxx>3W+i8-U_ z)pJOhc(KJ45>Ki%rosQ3k(h-P;J^#jLk3_QCs!)*p!$^ z#*`TdwV6zkhGA0@08tXHkjpX5Qi)B)lSxs4+_T7Ha+Dp@<`M@u`;q1K>nv1`={~ ziX8~CIXWXEa|=>0hF=U+(RW10CE;4Wj_4}4>1f(;bmbjgtHSN3yN<}FqhZ6*o_Dmb z9$sr&ckJ2f>RYy~JKDGQA6~ZH@DxhLLQg+ccW$+`quRCA96(Z6XzNB&UpVq868Bc* zAnRHJ7Rt_nI{*yj-VCXwaikS^H~{7kvCEK6hpw94-cxnYa>6$Uz)y!OJs{4a$rd zEblutY2*;8s|%LGaNDKKl}U@W&|Y&UE3 zmFx7}yM%Iti=6Z&Bw?p&xrBp5>O(>5N2J;ka!kxjvt3f_%38QIK&|%JrTOV;QIZC! zL-i)QE6>-(&T7)DY<&{_IQE-JaHw79ak?REI-ik!n)x0{^klwjmUYCB9yzEa*VaPOEV zCPC8-f7R%4fu*NJ?Py=@sK!P`<8y=zqJ*nlp{th;w)Tfi$U|d6i)9WhxE^rGaO0r7F0iZe+DV~OHCMl|w zi5iWnJTU=hm#+T2V`B13I*lGBWrj&DX$%#M&DEG<XN*o}!oXAsE+gSPIvgGDFj?)`s?T81sv8ovbGGNel5 zz=p)6A`xj≪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 Y@R?t@bB8DMk!SOv=RV=6g(3HU0Y$7&-~a#s literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/client_reqrep.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/client_reqrep.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf668b204ed71d903bdfc41ba23465db116ec5a6 GIT binary patch literal 64555 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 literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/client_ws.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/client_ws.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf8aabebc51041b7baa52fe75a17e5ef550dc88d GIT binary patch literal 22507 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 literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/compression_utils.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/compression_utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06a1ee85b3f7463d47130bdf5a4dfd429db32c11 GIT binary patch literal 17744 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 Mtv}=7vl;XM0M>9pSO5S3 literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/formdata.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/formdata.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca9b0d0d39464747b333d4c3b78e2bf5ee68efb1 GIT binary patch literal 7617 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 AcmMzZ literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/helpers.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/helpers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7334ff470ccb31bb9a91e2a14add85afd640f62a GIT binary patch literal 43204 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 L%Q<2GFkKb^C~u^z literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/http.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/http.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0b9c4313649d41f47a726bf10de998048dca2da GIT binary patch literal 1682 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 LX+GJhg8TmhJQL-D literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/http_websocket.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/http_websocket.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94b5cfb97db2c9621438c677437d1214190e9880 GIT binary patch literal 970 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 literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/log.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/log.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ef94333decba5260d4f7ed5853a2d71bda811cd GIT binary patch literal 719 zcmZ{hJx>BL9L9UR$ctAv*&#tp3s+!)#PD;Ph5 zAHfB}0KvsX7dI0&CVPP%4%~lepQruh|McY@!YJT%|Axth1i+VLMEN&j`OU=>sDYYf zfHLp_3>rQGZReWrm3MHe?DJ&&F5~xP0xlEqWP&ae^knv2X3vuexlE`hWy3$t@o)Mu zl~{Gg+IdyeFr{0s83dcGuZVqOGHjcwu_Y+BJJ{~;3!;mw{eypoT3QpcYhQsS8LHum_c5f9vYgx5B1E1S5 z-rf0l+T+8oUy`H`5c^cpqtHxAPn7idusBsp132HYl*o*ZXNk-tkr^MIOcSSr_$~^j lhPN}An!wca!xZKQ(Yc%)Ue4s?L{5%Vg{fS8jMy?y{{t?$xBdVC literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/multipart.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/multipart.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a357a62b1f41767dce1bcc42e542dde630a45d45 GIT binary patch literal 53262 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 z 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 Ws-EzfHHGQ=C3}||c%VRtH~4?sNt)0A literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/payload.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/payload.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4dc051bde87d8c1015edf9a3f27e52882a2a3bb GIT binary patch literal 48839 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 z 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 XldDn>j`yu}4WK|D3iPfchb!j4?#tnl literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/pytest_plugin.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/pytest_plugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d9dc3504f0528996997a8d2d777865a2de6b458a GIT binary patch literal 18493 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 literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/resolver.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/resolver.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f5326a1ace2717e1c0910bbc1b906ab02cbf282 GIT binary patch literal 10929 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 literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/streams.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/streams.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38654efe9bd537cea9a9622ef217e387e7ba12e6 GIT binary patch literal 31944 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

    4t63Z#zr!=TCgt5Mmx4wUhOWk zW5sIJqClZZdq@riw_s?F4K~!rKrczJy+k-g?v_9xz2v4~L%^s0SxL2GTH4OSpFi{8 z{QdvGKl4i@5<)OGe2soWExF;Pv@)MeE>17ZeUfxL7*$QjwkUHY zO4tT9bND1*dFv~KWgu3o1>MAi=VysBaV#3g` zChQUrWWGB#K9O*AMn-Klw+(&}$c7hjt%_GwpvrCkh(Gw9+oDV=$&_T4f79FZa zhkgj|N5^ma4&>+~x&I*Cbvu14y**nS7_APB?iOo_nQCI@!St`;*}90r1BY-Jy}}XS z@HpZH-s084se2&2^c-HE7<~=oNfc*bF4yb|-(laPPvSzVp?F9U&hc( zx1+bB+fuD}xY|3sJ6ju>s*X%O@IMaDz7#p)rH5;vkDV}t@NnSVOpo|;kALRPKs@3G z6h*UgisA-Tr)1`It9g0h@ndki;qo;qBC(RKo2!)fJU^rw20yf>Ix1t-?Z~vAwMN(X z0nAICayq?^_wK}T@WXegO5lZr zeDcl7J5!Ivx9dI;Qo8#_?d(ML>_i>$)gC+Y=6WagM@~$z*kgx~e54+X;LG^i_iOzl V)&7w>;;X$(W4^B)d227eKLJ>wYw7?1 literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/test_utils.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/test_utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f0f1a17568c2b84cc87f060781767bc7aba8d19 GIT binary patch literal 34823 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 literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/tracing.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/tracing.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39d7a28745ab71af5ca07c257ab0746e48a58283 GIT binary patch literal 21898 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 literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_app.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_app.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..240aa798aff44047ea712bab40190170408da224 GIT binary patch literal 27272 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 B!Jz;E literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_fileresponse.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_fileresponse.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4516574227639152cc9b86f92473f11ae7ba6dbc GIT binary patch literal 17203 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 F{{etrO8Ec) literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_request.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_request.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b020a94b92c5f8f96a1abeccf6b4eb1a4f724d65 GIT binary patch literal 38726 zcmd75d2}0BdM8>~2?8KN65LmCCn#>(_l4pjQ46(@a@(+M7-AJAQdr~yXo(c*$ZmI< zN;DDmy3>N5Ju#i`98+UYtj_BQ;#3{u4bYmsR#W zD$;Y@P3{!ObG*jOxum+)w=X+axt*%z)H+$QB?XGs_w|F~zPM6cy>FV^YbFK4rxw?Gau5MqCtH;;t>h<-x z`h4qM>wOzs8+;pG8(A8wcav|kYcul~c(?ery0$WZp?8~ayKB2|hieCWwt08@cDZ)> zcDr`7=OXVO-(J^V-#*tqU%#v0x8JqjH{cpzVa47--;isF`AfXRz5}iU@Y`Jn1&dgM zx|DiHe1}|zSa_NDuv!0}bD zaeVbVS_$%w9NBeTFiihpI;G+R^m~dweV>DuuOZhpCKL+eRqzR?_}X0ruM@^z=lJ@6 zsdGK03Tt3tj_LOhCF|lFr@x;C!Xw{=ayFx8&*10cTlm&gnKe>udjBA&)ZiT%s@z@A zs@~ql-rnvyt%7whm@`+2glC1*?{+Hhb3La@wT`9g%9-jZ;kkFaQ>mU;rRt$nsE2O) z&!w`fUA{L}<`qV$ka}BrO9YM`ygDDfY4=)dMSD zGCv)N_sQ|3AS-*8-;Qi`r%oRE1)&Z6`g6P(#N95vY9bIgKP9-&2_9Y$0WR%76AX!- ziO^U`6ge@JUVr0%Ad4JMK~7^fwdosSA5cQ@ucwLj1UYR6@o#}Sph)HLFDk1AO_KtPHnPq ze}JDo?h!*L*~^kP)*5)13_z6PA>W12tW-rgmR0?P)-N3#8ty-JWZZpd?AWM#aA@Gz z;LypWg`Nh5i2zzFX+07M1O>TDNi&M3_)W;{n21(K>8cKnj~|!IJcN3MX2%18BOZ|z zy-;~;@It^J6r8%GWxppV$kCJe!&6>icuMf{$vhcG_3giK!8#lV~ZR1A6pq2L4!0_Bp)DEG(( z$W2b*Xo_@cPhnsSdR{{Vj`_6AXP8zdSS3A$>v>%&o}T&g1RWccdfq_Kvqop0xCx%5 z-tX}VNz)`M%Y1tBC9M+ye+Zc14q+rF^CT1vjyg?AliN-4-0q~=?e+!u887**Zug5b z9p`&F%L1{eci`svzQMrvku_naN2(6nLrU#S#?ZHunfF_xY*ba{-^w8}dv| zPxXcZ0dKI^b3W(>p7}$)JueCVmwLTZXL>KphRy~28++Do=nZ0kbYJjHoJSl)o(d2; z_g)mvxJ3z1doIkfS~BMdUJ`V|`3CpET=4agL}BsQk0#94xVa{3u8HYu5+!9ZeOaQQ zE<6z}Xu79w5)UCZOFL(4Y;I|7Ywujw^St|o`IozsM)&x@!Tyt>Z=bp21+=3>QiZ`!O$n1ACH#HjWTCtv+ z<^HwqqUN@S=%a4poQTn*?deNuCW17xIvnC*+&<6Wg%%PnT@d$(r||qNe!)^W|AqVY z74Adp;jre~*i!NJr=r%wp9QHbua;G4oVs7+!}|*dIgR8{34ifhaFTiM6NBSJPmj-; zPoIAFbjZ=z{ql3@VVTGr?;kliSJ%|BcgN)yX96LCcVF;Ki3{_WU*to=rO<-2vkB!i zN>53PDo(Oc$zyE%BnbLkU&rN8;Jn~paPC%o$VSQ(D1_Ny!P&9nG=KT>`mRk23(mdB z*uYXG3o@bs*@lmu{96CXK~O#-k_1Em{jbXK>{U=IQdaA(-#2XTeeb zVG4cb@-X9Cc&)1dv$ahq!kkDZ^7sl?1Ba9wUx}wiL3ygeQ&Z}xI3s3B#*;nciCU#5m9CWMCX4uL zyuVp!;h*PgUehc5o~soQH(#rQv;k6zvR6%yW>p`LRL4mzU#E)S!Qxi}TCajS8MFq_ z1{JhZSckmJ0d=ULT@2a{Xrl_+!=O3)0Wq6YF?;!Dp&0qrP3rlU*YvJF_S`De@znB0 zz74STQXD+%`F1>SKzu4)2mBl1-z4=PAWlFwvv+U7Q>W@ZTN!klupPZ$Ece$s>5iCP zs+c=iOvK^4RnVO&XpaiIi$QlIZm$ZuCl$9(1>MV_GOi)TdR5py7DlbOK?Utk<+D)* z-JgPPQb7k&(9J67AfPYsTU3ytRJ^S!=rDsGNVVfORoFomHiEKkS3wUkXrXX;`a6%s zv>mGWN4`M(ovQdpg;9PN!;DSBF^0K%ezz+8xNw5slOCn;Z4-|1a*xXK_p0Kbl;58n zOUv(5#Tt8TtbSFj@h?!9{i^t6=UsUA@y`l=`S~=S11RTnxL=snI(cy;aL-u`w$CT={8)`# z5CfsWM8Jz#_kw5E8}RV%i)^ieSTX=UnP&ty;S<2I@c_LftrOrA1+RNX^d=4N3xQxL zX#oJaoS6*?;EmluFpUE46P}54Sedv(p5Xapk$b{BMJ%b$bIBc?nxg=3AaEgB=EkDQ z4<=p=xr0G3<6JL=l6DpNf`D}&xYkk8kLrj4I8z)~#9^&rTa&B&_8{I3&RBnr3TPAs zA9$T)p3(|=sfsGCA#O#k$-=A_(Noz!FYyFt{S#Axo^d=qI~wo{&n5L#c<~~Y=Mp)y zQybOol7@86N6PV4}Wq?ad1NuF>2mTLCq-LITvp{m@b$Cj%lX^VK@)v|@@kA-v zHLuCVyC4R=Ly3`NS%DZzY4Gk`dow z7-2POnBtqyR~TiaHnUiDN?7_nZ&t;!&U4em5ocY}VhV4m&kDffV^Xk17g9LBa0<2% zLyG3LDHJXP?L_M!cKMz2C~f)~?O>bFe@tnlyv>MVeoPFhyrwJKDbBB%Hz8-c@}_wM zo>HwcpNFTiRG1M@ss5VRP4_4v={sVidJZvYZIg8&MzsQ(x4cp`Z+T298Q(dJ<&M)Z zn$&?VNaKKw2pSB|8gUXg@hmy#$ie94#C~$7;UtX`i4o7!L!L}#L@$NENX|D1Zt|Q7 z2D~#E#g>axp>u9|fakLZ8s+J?CQTqvShyl5AEm!Qjz~_BoDiI(1+>O36B}`cASQ*( zh%e#MS&-BR1@ELdPe~TYd6^tqVu@GCd6k^U5dc=^U;&~y)E8Uwfq=TF{8J&fd#+R^ zvglEuVWbL?#KY#le4Z^g(UI;^4KT^7}e^mh?9*H!R_U(V|xQeQljGY&crf z{GhfmeDubdl^Is(vMSun2}dtgxh^3+K4|TZw{DNNZYN+OV*wX%CvGsP{K<~1Q%uF7#U8qt7Rz{E@AT$>S6A4*eeZHgM^gPNG6 z)n6z@tJ5?UVQe(c>oW4%9kM883=vMUYhI`1s@##9iI+kUZb%nze2pV0@r%>N3N(FJ zXy95IJ5uG5s7gz;I7J`RDRWYED`p+j_cXt!SumrmEc5z|S{UZ_^A_Gjxy~E1LJSDW zXCcO{5F_f#7N%} zw<-Ok_$G}+)u&sO=k$HLJ?&R~N>A{XH?;E>YQr(mFi#1{$bc6di(@K8`e(jkjb z9f32`!bGUYF*51!2ON+YgJFXJJebPPBMOeQpvnF&k7%Y#2??DXcN%nJ zL9?I*2ZgT4zIg5(89J|ha`>cH7A&rVU{OPYMW^<2!%S$hdmG6Yje?&f>rS0GhIb@2 z=aZV3f<%PSnQYQw!o|53^?buB-?PgbnDBUmdwNoG$p4CDL8=TBK|bVk?S=obv~sC` z=|vFJ68p`{8|GC0yXd*7tRk|wW2aU% zZ;s$a&QiwIC#@%EAm;Z8L!uZEMZ$cMhNw714iOQNXb^;m(hd;h$G#xrE!dib;WV4# zvC6@6132S$OT0#!^}!632R%Fv;^G}jwgE6)|LY52cI^q>d5k6FHnvlhiIH6L1P?w8a@8ji(Ejz_G= zAJjW!NGHSuJ+O#;ZWV(7ZVJUf|BWh{7UsE5x`1-EJ0|{^l151XhhwfL`h0ng; zg$Lu+!%DP|>$=}Pf44o>vp-fhfS~-VqxT!zKA}#<u^B~7uCmQRW)q=d7TePSmcXU;dX z**`UlquDtcb8HqTa!%s>T(kHXC!RpCQ^Q!t+Zu)=K}sr*s4MW!6{$OxR*PoDV7PFF zdtkF)pSwC2F;#u#A}|F0BfL;u0AffpSx99yTbNl0G;PFG_k=}+MiIPFV?f?@Q&<)C5@6eWUfSAHVFnr6E0XN70hOj+nS@c=7_2JE0=?Oy1*J8H8^(-O6{L`*GfOJhJz4Bt<}bCXMNTjlCOUd5sE+IMxzj=zSmz=#a8 zF7O%p(YZRA59pCaEHrcT!Ua*lW~;#eg5G{xlQe^Gm^kkhUJ|@cebNNN>Bm$XOzO#( zEE$v&V0ZRwQjoNA%x;-^r;OXBFFIa`z#Cy#H@-H_(6*^iY`{1KIlvQfAi6pI(Uxr>zw*ha;Yh$YS2Bt+1GM_4=d zQjOQe3Y8{LXhe145lWZBGN-1Rqz>8-l9VS4H6gxsBMg0=K`mt9&U8QDx0Nhyy1Dbl z&RDviGgyYNTt+=wOUzwJk_RC$hdhWu_o$0$UmCo5_{QOw%@Hv<);1+I7sEpbJdf*N zUUR;KMvPNCx4GYO2D%zp(eX?zhSoikYz?I>ia^KDG4&W;T04%79qCCLNL2&6P!f-v z-RQ=kfEAdKIe|*B0ji4~WdqmC#y<_Nvr$`X#MH`a)05HaBm!a8*#-9|cNR;j+yg5Y zo=g)x&ALLV2`rZo9l{zJ-v+rQ&2vv<>84GKPUh2M7#*)&fR@gJ0b&XxmUbzjO8Rwa zAxchByHUYn;L+pjUygEdsq# z_JzFpyjNbEH;8sDDl5`)6d$jjPsi2!@6G2;69vt>6oJBNwETi;A%DR3#m*)Vs{=T@chQKxmZ;Z%Bn( zUZNgOhm?Ggp31-vlY}3lc1d%s5WlB2z}Rcg>bX#}(n4vSBn)+{Cyb8lcd(^1lWRc7 zki;Awh*6j}A@3Lth~UF`fp-1N*tmU1TDa8h7zsH%JRf9|n~o`;Pg4AJIzWh+%BMK%0CS?s zy&c(k`EEA(wnG*qm}!|UT@(}C%%#~L$2g=xf>#o5O+btwkb)rIgYuG~2LpY@sRER6a!L$B5=Ad@khBG&3Q~om`cbgNoA)?|uP#^Qgu-PsjlV8qLF60@OK3zA4^;UCNN>5><{= z%0!Phqa#weIVc9mF}1Q|(+-CKks#jcakMk#tae9$JxD5A-I69(dsbm){M|xu!gB!_ zF^QJo9nurBrMgb6DLfxQ%+X`xQb|!uNBf!Cb|zYE2R5}UlC~_|Nf%UA`Yl;y$&okh z2dVPxIEZIQ|NhZoAaq8f=19xd(5l2Jp4`5tPL4RFZ6^n9N2_I}CsXp#H3N(!lgPps zfc!Is<_yczvQd$wU?R;u!=G!qKG!tOX-}^giFW_uzvCMJT(fgd>&SPONb8|~1SE}M zWHER}5>-RpRZ*Z5f6M}*jt#W{h{~V=8Wb_~IgzITgOAi&lh6}IsPU{An7I%XCn!V* zR81PZfs4@3HLw8jb-v_yU~r2;ANLE;_Wh6CQAgM$Fdkf>>R zbN8*?@tVG9O<%lbYqVzTpXvXi@JEFoXk#^pA91bun->q?FRKjK#L6I|N|e|a2NHEn zi=&BVY-=T~#n+EqJ@Q6bys9@^)q6)DtJ-|ex&^V8g7-?A!%zKPN%Q^6&Uj^Cw6gC` z&E1Ju<^Cl@!d@A%xBRT4^+CNeUf&a~?^y}n8Hm+yyQO>3wf?;$w~xFt8m)AO^{`CMs**2rh4ad*@p_S6=+?o>;?%Xyt~mF5&FHRhTGqEZd`Htt<8q z%eoS+olB#Mn!2UIL}}H{BR7tGuPolUHQKoKu0Gbd`(EjuL}^8M{f&b+267}@6I2#0 z>%rC^+KnXvqgK-vukMUicdl%_ql;B8c0g1U+ zO-X2!(Pjwt3;Z%+rRfoRD?1#d#6Ct`buch-UcfXEbbyEMVsJ-*Nbkj|prD#)+ljem zRG9gKD%vallno+^0Op&vt+S<9j3dwDyqPM@H)!<8oOd~sH@ALhX-(LxAK3r#;z_4w zZkBYxF^PLIT`S@QBAK90IEipps;0ETud3rX`b?U>&>S|a-fIM-45^6dCU(7 zhQ=|=w;w+?Cf!esw>yN;M7r700_StJ0EzK4TR?jK?^6p%>(Ny!$sXpf{suICvJerK zzw|{aFDo<Z2@`nhzjm1P0gS&e5O5~s%a zKLZsYmV(g$@~ou*2Z5#%u1mbLip`M5eGdl2D^?C|ERQoL_j@vq-wvKm8->bS^6|-$z)MM8uVyS_AACtAMj3oSzlfux7o*^fR z%N~cE*s#!~6)oPVRX2Xl~`GBEsRkt&&wlW6BK;zP4eBikKM8qUm2dHM8qby7banDR@i zZ`rN?4P-HAQ_H=vkNs0>dXl|f;XXBUMfU5nS7(>?Z(H87+zI_~_WQHo8}n>OD<;npxs1k5C1 zq~`HA)GnlB2@=K_21ddfqqfF~sc~)nQ#0q66=S3JPp_>#Ro+dNXRBnYHLXts0pwjnc?v}3h+NM2B~b=zN16*ss|V6AQY~WKK13&kcoXNaa-Dzx zCYYXLQyAr&ZQU?TEz`PnfOM!@H>@Yksn!jf(H|cFS@<@kGswidN$P-Hcn3vQD9KQ+ zncMgZ^#4#HU{PugeJlcgwLaL|@9@!KXp+B4qJ9z$65hS!5vS--b`WEe0WuI#9#}~O zgRU7`|BZ%LhWZPO_g_?1V;cc%Y&At~O%aoHax-Hi;Hy<_2ceg`&`L$n?U@4!h%;()MoiANbR<>R-?;qP)Q^>DQ0N9O z3w|7@g?62)53!VhsFErCQBTSzI(o2dqOHj_b?B!$WGo%z6u(4)9?9z_rK_I2hyIV6 z09yJ}(nFg2=vXQV7a@yO7hWrIthaL2fPk5sx+)#C&sCkE)I#D!Bc_hEonSy-jMJpS zt5%u7JWg`Dtn16~H7PT{a%Yp^EFr42E=CiKOm-g)@Jx!{J%(vfP%kjLXa=OSC@KUV z$7(?CXNgagWhUU?ASCuUULacmq+s{L8kI<}a!sg{q!j(1$;af1#UsP+qsInEhDUHT zcWh*IU?>}JlEqV#bdsDE6DNC6%(*)CNLUm6->D~B@CvXS7!D2L(3|tO=Hm^$(T3h1 z=;M9E(Z1nW!-1IXV8nFrf0mxPoZU00{7R+&NA-;zeRFE`H}sAj%|DYWs@y*fS^bk8 z0Xoo6?4g6vzJsxbk(ljJ#B_-DP|^Zn^jTToGlOyyquh+&qX%#l%~(<+kuJ7TR+?U} zLHkGv;@(Xy$Ryp@S!0NXCA)Gl;PWZffI;rL&5~Rp7c0)|co0o(LoP{cSr>S^a5;}&J+ zBssgDd`!-sch)1GA-f9HU`*653E8b~)=!MY1T$wWb%>1+;3AST6<`Q}trc%{dc_|My|BxXQfpimsj7fbu3rBel$_tfb1$tkX>=fCpIMiEJ#@MYJXRM zk0xoA8cf=9$WRYT(P-Ky#)3l=gsNhCJqJpi>PSS8uk@~Hn(|7Do?2<_(#D#1;Nc+lX^tuj?+SI>OfvsxKB)6Q7zWBAKOZo z#^PnI5aTa|2 zp1CUZfXN8jOg+^3wP&^`xEFm|j6ObaxMa+;_4miAhyo}18ttx0J|jUlZ@ zhFv7(zoXLTlOke-T!bu|snr_#X;XpkX1jZ7y_{~gK_?&hGBfT1j(7}Zg|JHo8abwIO(~-~MV;s|;SM=AJGuYS^ukpt~^T#504t^uO(~yg0P4_mhN%g7b zl~?j%5_3VH-c`sYJH~NHO^7g)T{$<*o&KG?2g&A|+~e@p(#3U)2!KlAhxX z4q;xgs^XZ^aWq`0Oi4@ed85Lvk6|?tB54G>T960grr%>o=W&s{qO?9m}D`fuA+Ce|sQo`1YZd@x`GBw$jCg zW&3i&gR0uF9&3^E>Lne35u0OqY}x$)vg{Xcm;ka@h6nzaUH7Y7BCY#k)%}sue#8pv z?%A5}mpdYjL$UJVNYOA(Jr=cm3YifUTfzg&#W8l~=hvUE<4WrvavBtv#qN)l?~fGi zU)2%hbEf0;C*Aw^azEKyHc+a|ASS7q@;6HOsudEAg`;engf;+RUy|f_Q)t{Z6Cmg% zJG7cjFC`%QMEsnR9fFfls1${x0~BhBS1x(impvquYZT(R@*ebMcLW%~>T#Iskh>i-=!QdXmmu=I)u%)AULto!! zX_@`Us3UOx4z)!3bPKg-(&&NV%)sQDb~QoK(tQT`WU@{Q^tTAx*CPYWL`E*Zm<}H$ ztQ+oa8jg&OD+gW_UZXu~Z;#oXk;h1Yk(I+)u7pjF@#bzeiPTEQ10}MIYWooHFH~XV+PZFCG9E);l^5g zfZ0wxDP~FarxnGT`dg?!VI~z@*1=54u`1vi)t$H+*0V*WIDv8W#?hFq>0al~h;3)Y zv~%rXqH2E~zen%GQKVi(v9qsSA_}D!gL|;1&rX2nT>~zp8GwGNNyg_|3fbvTMDjZa=`AXm!S0cSKuve31XCPTNqu%4w^rA)KwOg9`C#83xLy<(vZxs@E?s4&KAj zemd{mARU8Tt>CJ*e9n#>zPfpTm*$6>{hj)|{Tt!U7&1g-*pRsbPin}ZC9|)`B0L@U zLX%`)moz~vWwHDqyBfr}WL@b2!O*HzMyvJmM8bFp?1+)YTQCZwYr^bjkcY|XduS^k z=PP?g#otHPAXqTH57R+1IBDdWA#3^YX41?MfH4P2laf>BK~6orE3>}|^2gNQG(EEZ zegJ*;?YFkSzB69dwrEBt-rRL#*N67b<*kdRgsm!Wb40o|d5mV=?fh%wSoS7PU zwRDf>JDOekn{9hEFa`o8eh(iMp^Kg7@Tk#K-7$)Xe^hs9VH^kJT$!m^<67k@qBN^< z$=-JlY?FwG@owdqE0syy4=1a2rlGl***XOI0kuwZs&&e$Za#D4nQuLdc39N^46^g_ z-@P0$RTF>Ss5C??8lqW$v!FE-6H~ttxCT#1#-RHM@R z3wa?zCU(smL$!)uLH8xC7{ohi8#3#k(V~V) z{#-__u*yV>%i*1hFMU@^m)%M*vu2#`PRCPxyz$+X9BNG(oJSS^4C#86*y(%Pz*>$} zU!pcR?MkxotP8mlWyY1AJGePRXrmMcE-z&|lgZf(bdHyu7sgn`xmv?{y6>UW!v39K zrj1dmP0Bmc_s6v@q-|T3Sdc&(-Zd#PS)c!7T3vJP&%R`NX~xXDc>NPvG4F~Nr-AcA zJC#JaaXB~6hUoYjyFz;u-}FAkm%h)ZS^|dKa*oe;WL5=dskPGs>6D7^F{LsqEsUQ1 zQ^Xlk;-~Mt`CW@L_Oh`EhV=4aXf<#8KsvtSim(27QuwFQt6^O?WZNRW=zF_)<;!od|cRsmSc=NpV-6CZyDJ_6e zpIWD;`M)nRXK%%fdF|`WeF3iaT7AJ^L}II$@Kj6@=Yk|AB2IOB&o zTL{r$^n=d*nsChh0{aY2!8m*Y(Id{%$9R%vD!-epi&@Jg4U$o#0IFT>UExr? zp)ZPmOW*yf_ILB&vBau2!G!K1S`11tA5_%DD>|YT9gEh4rDB!SJItSOdaIcfu{v_5 z_;~BS|LyXk?t!HuQqvc+^pW_$f6E`M?}=CTEJ8GZ47;KgU5f`F*h?W`Xj=Dn&s#mQ zrVa7h4H5f>rOnZjy*SA%9kuR?)^xo)9`D{0?cNis*}G)=*j^VFzW4k`_DzY3+M9DX z<{}l&`}G|W=fPP0NThNEYBrU1H(&nN%MV&Q$X0N?WlywaPomcGy^eU(wrJC~M>=h5 z^{+U{Ai_HA$G3OI+qOj8w%i?xv~7vC?T!TDqz2 z?asG4<4wDwO}p-nzrXRP+kd?M10mKl9^7=CE|zV+_c zVtqp&)egfTq&nzc?UqDk?e}!cL*F&yFnU;@sHqKKx>wV)((+MF&;6#I3FrE|Av98R zJsPR5{!++{yZp!|L@b&=gD**>9R}nD3X?p$KnUZdqP0h*x$+E4yHBv~qKzvnSEm@oApEto&1* zvA6_V|K%;q1F@&1n5`kaD0k}lCqjEn94 zG!2nDEq3821CnS?IUwywS(e1?e-_cj6*$R4nhR)3^I%e%49NT1=_*N9+$n0-j<)DU zh3Bf(8bg^`)uHmiy+{b7lpw}?ZtQ_j&SGaLSF0CCAC%U{OWUHQZHxH{OKHRc{Z4|~ zDkW=`EBckQG251iY0KKpB3c!&mi@Qze3|V&9&!(*wQ{v)+W7baq!+n%8qkX-yfo{| zC1pWOYgRNoLc&ia$A#X~k0uSC;KbBavgi!VJO*Kb_nd5Mdd{-z@`6M9-vcF~Zy|;F z9dd|A!Uy#v&4@oB$bNE&hr!k*Q%WdhnYtMZM|u?O#FY97GFj9o0}*R2s7X*Kb=??p zgn>Me>e*Yf(rJS`d6DghV+}{*4P()UF<74k>2jEHwgpt8s7^BPNv7*yi8gL+j#`@~ z^`gke1Bgi0WnspUb!XDRwxKh$lT+h`mi+4d^t76~N(7nOlOY+CV%biEukP`3D~Kc> z%&4@{?G|1{l{4&=O0e}*VcOQZ!riwOFSY#cr8hQ&h1a(~&Oj()N*G9mz6k@^*EY2T-9&FDgl4uArN+VM7^IIhX0#8D@~`9fh|o%sLrP!FlMD~i zQdFt>Y}G=tA?LT4>=-#Q~`D-|anSuw^dVNxtqYxVdhA3l$nQKBdGST0%y z+?Od84h_i0g0*5RUdFbJl)}$v7d{VP#=$8WZ|26P4BSBlCe9T-XTqsx_BDpFk8+(8 zOOcJgL-fay4SZcBr?3__03pVKt(C{w_NCmjE@c6U(-pvJ#j?42VVG7&Qmv#p;_Z{-wP?eerp3CYA3AmfO;(6o_R8~0ly5&-dSBq>p{9)tagtY|hZTI^3 z4&6Q!@7fjZ+7;{C^AKdAH)`!z9EntP+_zOls@J{y%tyAZiK51MQCqaAEnd_WE$aHH zsOJ*{VzMy;WTCMjz5++_lbB8R&lR(Esr+TqXR)MtP7WDWVsx<>gE+i-oX-6{%RY}w zF}tMQQRqjYS%ztO^W1aNfrl3*QaeB|9wes{PSQ+kMtp`5%JukCF7uN)2$SSJH7-XO zKZ%bpCM^s)ICNxad`Nr>ogg++9)|w$@snfd3HF^-Y@|uuXQ7v{r6`HRCHnyVl!$fY zFu?-kw2`xp98x(+=E>h*N){`h*d4-W1VTsX3rua4+(=OgVa4m@w2(vMY>`N>*h9{D z;ouW5vV|J)3c+3`SpGOv>)7X~7y}{xD+;+tPBS_4t{;7jCeps1HAtbll~A>~uW;>#5JDmgR-u+hQR*6dqm%y|j$Ad#JKkp6al!FAhJ zTf$_$UU;>TZlrjHn*@xTDx;>#Rg1CIc;(1y5m!(Zx7Ne9{aaNJwI%uHN4nA`<0o8c zf$_@FY9}|O8PQxBTHLlYy1aSCz9QUtCgR)^ZQdI#-50g=$Mgpi&FxnXFI9$HZ#2a8 z?W^USqn#Ebjuxz`;XbU{Y*_c8xM|gZJIYp4znVur6K8K;%_pCktLk30kk885U^I(- zP>w8*7q&+W+gEM$T*6h?t=h>~$`w_@BG}k+bNK07g)n-)T1MbgqN6X-)|??77z&aDP0-} zS1pZ33!7JM1S-miRZJk%vLPH?9tpo3t?F52#VF;>6_3g&5O`uNe5lnJsvqg#TO}V# zDZ%PfuzCht)#?l#;cd$Y;w_t__^;W5k5(8ucT9U5(I#pOmC=OIvX$Vjh6R5SV;V{n9nt9YAZIrxZft458XQ35rtY^0FJJDVt^kwWUEkhQRicv~A6&N6v zdC1`=hrx$6G6fls6M}G)gWyBwOF?zv8VXX{1wJ{b$lzF-c*x-le99K3Qcd_ZH$RBw1nvouDH`IJTuBri} zrIO-e7)vdEL=)}+g)ChOu2e;vH%6;BQ8|vJ%W))K;1ingr4_>pe`jE2D%!Cv+OVDC zo=C?%k&e5M^4%tV(koiMnIi5>N8G1G)EXerqn7MRwImrVq_X8B=Wqp-zbBR}qcmy> zAjcvvXeUK$G_*i^$KfW2!M8drVLUoAT$`f{L4~OMTc}j5`y~MN418Jyg(#I01fN_c ztzlPqoPu_xio5HP$%ybGI|lO5BM!IKPQ77Wc;FGRo92cM!x|!DHOo6!>GnZ0PRAN* zR?S+&?&XF@$ZPi_)AJyTpX}3_4O^E%GH|ipDbHc0HMxDiwE1b(TjSoS?4 z(fc>C98rJyK9`IEpT0KmnzN~OFZ=Md9-p)}3VFPa)NKWm^od6yU$pXi!OR;33vZ;4 z9xrl}8b0qetIH}BsQ-8qJ~^F_Pu-dYoBRo5GoFf4PZs(hZtBUJ5tBZ+olaMn@npkO zNh+O@$0w&*8H!#jblHVczML;seJZvLAKk9tOH_~wK#T%?M%u1|R^hX*)vQK(d_Y_8 zs#)YNXWrG!SA-x5h5;kgR+n19hoqNKFwj~3MQRgvy7*@~pR z19o|#2QsA8*UHGq1wR#pEoKpC-FcO2f4;a#9ONBpvhR~~fgaQ1r9S}-=Uir>9WH-k zfiiWwWhG8YUikY;8bx>Wio}S90iUy8#X9@nQwqF+sYM` zTs?q~D=zDoCqA-vN-Xda)q<@aZji5^9JZoJFCl2vlG48fd(6?=gJA@5%!Cmk+@&fT73%W9)e_VMgh2Ett}_7Sbm2(kc!x-=0%+IG^v zpZJxk9bd36x#VO_j$hWF-kMLJse|x>s)psM^u<0mcGE>>s+1&a$_Y>%pmP?bW_X|j z4#D={Sf#kFRrO_wj83BEIx^uN{W+X3(n+~02BpB9I-+!lGAI2^eQ{HLv{QA=SIcww zD1e4WG(MYvhM`NjFBnuR{3%5{X@pfE9%N*!E%j)ip!gOws{!W#g-hc9jZpd~E}4P_ zm29BMMrl8skOrSmftZLT&`t4|l6f!$PDUJ=5e^5tq|I#$^ynw2&bsL&aGL(9fUi=& zoJRK8A}OoNiD-qD*8^7rIQLgra{b)ZbL1($K6P~}tovR6q7L>&zI|y~w>+{uvC{w6 z+2z7mMQ^O6Z!zz_tv39%7(-Wy9Fj;lLwHN#pReQh=nvsMNv##Vre)tW)8^_^$TlH( zqHU~P^CHwQ^^j}@O(smzrrgGI@P$;q!#_qb3vNf@r`Axjy3 zIM-T|u-C=y%~3m6MB4nlFqYotjJNHMw(XAC@DJ;3yA$P3$q?sC=+4uz@;&h)n0DDi zg3P@SiuQaSBvIL`-TgMroiaE-HfZ__j6XJ-;FkrJjEzzJTM*k>mo0`Q=2Du!uTp&p zt3@U{9HxL;a)!vEE*EJsmLz^mrkEx6W8%T@QoLqz2;IeNxHZ zdTerl_7c;;HbC}Cvp<`+$T>vKNqRTG{s#BJS`oL_MXhyj<*)2s>5VydM6Eln3_aMm zmBdAn>fUH^UrfLCKjv9i^``uF%LA(%ZYvY)c8C8ZJwbGnTS8NAsDMl%LqbEKYzYm) zvL!SG%aYI#C`&>^pezXufwCkt1cHRd{>w7*^|3W_rd$IHaR_bnlF$KbBKT-=4qu+3 zE&LoUvza_X0<4x84SQ+Pf!p2CujnR?ZE9R6Fa8d7%9Fkm`ql1$x(PmPmp1sKTkg5?Y{ zBMH!EIx`_lxD_}A4J%6s#n9 zGZV{Vb5WAgg32>BwV>EZAQHAia|@>>p`R91iFKLqoXMQ~C`#c);S9Fd=|nre9uk!F zwX6hG2p1bl^xZ8SKzF;7c@zffCelz(vY5&azDOG!$zqCt1_vLHqvkMGFER>|)CAeC z0FK&BoyDhklLgWyuonvgYQQ5%D^USP6o|2tc>Mo|e6Lf^26kp%e3k$-DT!`!&QK7} zNc%2eJA{4tf_)f+t!UY*D@*MBxoH;+z0G)qJ>pM+Z}{heW)OLt^VVqYbA^A;+5Vo( zXa5C%&*2}BR=7Xsntr7%&}e_fDb6GE{j!$RH2){g@+++o4;(p#oTltQb0t6L`hL!} z{z_}5G>Y>H`F>f=Y1aLmYxxIm%Rg|NGE;8(IoI*Py#5N=)zTOLT;K9@eb>+RTR<U0d1sM{T{ z8;sTs;>)$mR-EanAJQOVz4l5W&ihZ?FiWY-oMBsBzbC5SlPD}*9z{IEUJ{2G;nNf? zl`REtAb&l}zi-Ei_}<*@xx2lw-a`?tB3u@}xE#DSAFb+&afeW=b(>e3-s`;GdB+{= z9ExxyOGDxI<>p&m(bD!9H}q-Y35%w8sYezjm2|Eg`IIBjr{~HKYBYNn&;OF6J0n{E EAE8_mKL7v# literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_response.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ae2473699dc8bff97a69cc82374340fa519891d GIT binary patch literal 39149 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 XLHh0on-~1w`bIhKF!zwKhOPTw1>jLg literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_urldispatcher.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_urldispatcher.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aef3e4441abcfe820b5c220635eb129d815b5254 GIT binary patch literal 68896 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

    ?|dKL~$y d`B7MD;_lov5${|^V9K_~zK literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_ws.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/web_ws.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1460d767b1e8b7fa387fdd01528f842738bed215 GIT binary patch literal 31576 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 literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/worker.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/__pycache__/worker.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a4d1552be40d24cca5bcdd289c2120c6a821ff99 GIT binary patch literal 12067 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 literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_cookie_helpers.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_cookie_helpers.py new file mode 100644 index 0000000..10e2e0e --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_cookie_helpers.py @@ -0,0 +1,338 @@ +""" +Internal cookie handling helpers. + +This module contains internal utilities for cookie parsing and manipulation. +These are not part of the public API and may change without notice. +""" + +import re +from http.cookies import Morsel +from typing import List, Optional, Sequence, Tuple, cast + +from .log import internal_logger + +__all__ = ( + "parse_set_cookie_headers", + "parse_cookie_header", + "preserve_morsel_with_coded_value", +) + +# Cookie parsing constants +# Allow more characters in cookie names to handle real-world cookies +# that don't strictly follow RFC standards (fixes #2683) +# RFC 6265 defines cookie-name token as per RFC 2616 Section 2.2, +# but many servers send cookies with characters like {} [] () etc. +# This makes the cookie parser more tolerant of real-world cookies +# while still providing some validation to catch obviously malformed names. +_COOKIE_NAME_RE = re.compile(r"^[!#$%&\'()*+\-./0-9:<=>?@A-Z\[\]^_`a-z{|}~]+$") +_COOKIE_KNOWN_ATTRS = frozenset( # AKA Morsel._reserved + ( + "path", + "domain", + "max-age", + "expires", + "secure", + "httponly", + "samesite", + "partitioned", + "version", + "comment", + ) +) +_COOKIE_BOOL_ATTRS = frozenset( # AKA Morsel._flags + ("secure", "httponly", "partitioned") +) + +# SimpleCookie's pattern for parsing cookies with relaxed validation +# Based on http.cookies pattern but extended to allow more characters in cookie names +# to handle real-world cookies (fixes #2683) +_COOKIE_PATTERN = re.compile( + r""" + \s* # Optional whitespace at start of cookie + (?P # Start of group 'key' + # aiohttp has extended to include [] for compatibility with real-world cookies + [\w\d!#%&'~_`><@,:/\$\*\+\-\.\^\|\)\(\?\}\{\[\]]+ # Any word of at least one letter + ) # End of group 'key' + ( # Optional group: there may not be a value. + \s*=\s* # Equal Sign + (?P # Start of group 'val' + "(?:[^\\"]|\\.)*" # Any double-quoted string (properly closed) + | # or + "[^";]* # Unmatched opening quote (differs from SimpleCookie - issue #7993) + | # or + # Special case for "expires" attr - RFC 822, RFC 850, RFC 1036, RFC 1123 + (\w{3,6}day|\w{3}),\s # Day of the week or abbreviated day (with comma) + [\w\d\s-]{9,11}\s[\d:]{8}\s # Date and time in specific format + (GMT|[+-]\d{4}) # Timezone: GMT or RFC 2822 offset like -0000, +0100 + # NOTE: RFC 2822 timezone support is an aiohttp extension + # for issue #4493 - SimpleCookie does NOT support this + | # or + # ANSI C asctime() format: "Wed Jun 9 10:18:14 2021" + # NOTE: This is an aiohttp extension for issue #4327 - SimpleCookie does NOT support this format + \w{3}\s+\w{3}\s+[\s\d]\d\s+\d{2}:\d{2}:\d{2}\s+\d{4} + | # or + [\w\d!#%&'~_`><@,:/\$\*\+\-\.\^\|\)\(\?\}\{\=\[\]]* # Any word or empty string + ) # End of group 'val' + )? # End of optional value group + \s* # Any number of spaces. + (\s+|;|$) # Ending either at space, semicolon, or EOS. + """, + re.VERBOSE | re.ASCII, +) + + +def preserve_morsel_with_coded_value(cookie: Morsel[str]) -> Morsel[str]: + """ + Preserve a Morsel's coded_value exactly as received from the server. + + This function ensures that cookie encoding is preserved exactly as sent by + the server, which is critical for compatibility with old servers that have + strict requirements about cookie formats. + + This addresses the issue described in https://github.com/aio-libs/aiohttp/pull/1453 + where Python's SimpleCookie would re-encode cookies, breaking authentication + with certain servers. + + Args: + cookie: A Morsel object from SimpleCookie + + Returns: + A Morsel object with preserved coded_value + + """ + mrsl_val = cast("Morsel[str]", cookie.get(cookie.key, Morsel())) + # We use __setstate__ instead of the public set() API because it allows us to + # bypass validation and set already validated state. This is more stable than + # setting protected attributes directly and unlikely to change since it would + # break pickling. + mrsl_val.__setstate__( # type: ignore[attr-defined] + {"key": cookie.key, "value": cookie.value, "coded_value": cookie.coded_value} + ) + return mrsl_val + + +_unquote_sub = re.compile(r"\\(?:([0-3][0-7][0-7])|(.))").sub + + +def _unquote_replace(m: re.Match[str]) -> str: + """ + Replace function for _unquote_sub regex substitution. + + Handles escaped characters in cookie values: + - Octal sequences are converted to their character representation + - Other escaped characters are unescaped by removing the backslash + """ + if m[1]: + return chr(int(m[1], 8)) + return m[2] + + +def _unquote(value: str) -> str: + """ + Unquote a cookie value. + + Vendored from http.cookies._unquote to ensure compatibility. + + Note: The original implementation checked for None, but we've removed + that check since all callers already ensure the value is not None. + """ + # If there aren't any doublequotes, + # then there can't be any special characters. See RFC 2109. + if len(value) < 2: + return value + if value[0] != '"' or value[-1] != '"': + return value + + # We have to assume that we must decode this string. + # Down to work. + + # Remove the "s + value = value[1:-1] + + # Check for special sequences. Examples: + # \012 --> \n + # \" --> " + # + return _unquote_sub(_unquote_replace, value) + + +def parse_cookie_header(header: str) -> List[Tuple[str, Morsel[str]]]: + """ + Parse a Cookie header according to RFC 6265 Section 5.4. + + Cookie headers contain only name-value pairs separated by semicolons. + There are no attributes in Cookie headers - even names that match + attribute names (like 'path' or 'secure') should be treated as cookies. + + This parser uses the same regex-based approach as parse_set_cookie_headers + to properly handle quoted values that may contain semicolons. When the + regex fails to match a malformed cookie, it falls back to simple parsing + to ensure subsequent cookies are not lost + https://github.com/aio-libs/aiohttp/issues/11632 + + Args: + header: The Cookie header value to parse + + Returns: + List of (name, Morsel) tuples for compatibility with SimpleCookie.update() + """ + if not header: + return [] + + cookies: List[Tuple[str, Morsel[str]]] = [] + morsel: Morsel[str] + i = 0 + n = len(header) + + invalid_names = [] + while i < n: + # Use the same pattern as parse_set_cookie_headers to find cookies + match = _COOKIE_PATTERN.match(header, i) + if not match: + # Fallback for malformed cookies https://github.com/aio-libs/aiohttp/issues/11632 + # Find next semicolon to skip or attempt simple key=value parsing + next_semi = header.find(";", i) + eq_pos = header.find("=", i) + + # Try to extract key=value if '=' comes before ';' + if eq_pos != -1 and (next_semi == -1 or eq_pos < next_semi): + end_pos = next_semi if next_semi != -1 else n + key = header[i:eq_pos].strip() + value = header[eq_pos + 1 : end_pos].strip() + + # Validate the name (same as regex path) + if not _COOKIE_NAME_RE.match(key): + invalid_names.append(key) + else: + morsel = Morsel() + morsel.__setstate__( # type: ignore[attr-defined] + {"key": key, "value": _unquote(value), "coded_value": value} + ) + cookies.append((key, morsel)) + + # Move to next cookie or end + i = next_semi + 1 if next_semi != -1 else n + continue + + key = match.group("key") + value = match.group("val") or "" + i = match.end(0) + + # Validate the name + if not key or not _COOKIE_NAME_RE.match(key): + invalid_names.append(key) + continue + + # Create new morsel + morsel = Morsel() + # Preserve the original value as coded_value (with quotes if present) + # We use __setstate__ instead of the public set() API because it allows us to + # bypass validation and set already validated state. This is more stable than + # setting protected attributes directly and unlikely to change since it would + # break pickling. + morsel.__setstate__( # type: ignore[attr-defined] + {"key": key, "value": _unquote(value), "coded_value": value} + ) + + cookies.append((key, morsel)) + + if invalid_names: + internal_logger.debug( + "Cannot load cookie. Illegal cookie names: %r", invalid_names + ) + + return cookies + + +def parse_set_cookie_headers(headers: Sequence[str]) -> List[Tuple[str, Morsel[str]]]: + """ + Parse cookie headers using a vendored version of SimpleCookie parsing. + + This implementation is based on SimpleCookie.__parse_string to ensure + compatibility with how SimpleCookie parses cookies, including handling + of malformed cookies with missing semicolons. + + This function is used for both Cookie and Set-Cookie headers in order to be + forgiving. Ideally we would have followed RFC 6265 Section 5.2 (for Cookie + headers) and RFC 6265 Section 4.2.1 (for Set-Cookie headers), but the + real world data makes it impossible since we need to be a bit more forgiving. + + NOTE: This implementation differs from SimpleCookie in handling unmatched quotes. + SimpleCookie will stop parsing when it encounters a cookie value with an unmatched + quote (e.g., 'cookie="value'), causing subsequent cookies to be silently dropped. + This implementation handles unmatched quotes more gracefully to prevent cookie loss. + See https://github.com/aio-libs/aiohttp/issues/7993 + """ + parsed_cookies: List[Tuple[str, Morsel[str]]] = [] + + for header in headers: + if not header: + continue + + # Parse cookie string using SimpleCookie's algorithm + i = 0 + n = len(header) + current_morsel: Optional[Morsel[str]] = None + morsel_seen = False + + while 0 <= i < n: + # Start looking for a cookie + match = _COOKIE_PATTERN.match(header, i) + if not match: + # No more cookies + break + + key, value = match.group("key"), match.group("val") + i = match.end(0) + lower_key = key.lower() + + if key[0] == "$": + if not morsel_seen: + # We ignore attributes which pertain to the cookie + # mechanism as a whole, such as "$Version". + continue + # Process as attribute + if current_morsel is not None: + attr_lower_key = lower_key[1:] + if attr_lower_key in _COOKIE_KNOWN_ATTRS: + current_morsel[attr_lower_key] = value or "" + elif lower_key in _COOKIE_KNOWN_ATTRS: + if not morsel_seen: + # Invalid cookie string - attribute before cookie + break + if lower_key in _COOKIE_BOOL_ATTRS: + # Boolean attribute with any value should be True + if current_morsel is not None and current_morsel.isReservedKey(key): + current_morsel[lower_key] = True + elif value is None: + # Invalid cookie string - non-boolean attribute without value + break + elif current_morsel is not None: + # Regular attribute with value + current_morsel[lower_key] = _unquote(value) + elif value is not None: + # This is a cookie name=value pair + # Validate the name + if key in _COOKIE_KNOWN_ATTRS or not _COOKIE_NAME_RE.match(key): + internal_logger.warning( + "Can not load cookies: Illegal cookie name %r", key + ) + current_morsel = None + else: + # Create new morsel + current_morsel = Morsel() + # Preserve the original value as coded_value (with quotes if present) + # We use __setstate__ instead of the public set() API because it allows us to + # bypass validation and set already validated state. This is more stable than + # setting protected attributes directly and unlikely to change since it would + # break pickling. + current_morsel.__setstate__( # type: ignore[attr-defined] + {"key": key, "value": _unquote(value), "coded_value": value} + ) + parsed_cookies.append((key, current_morsel)) + morsel_seen = True + else: + # Invalid cookie string - no value for non-attribute + break + + return parsed_cookies diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_cparser.pxd b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_cparser.pxd new file mode 100644 index 0000000..1b3be6d --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_cparser.pxd @@ -0,0 +1,158 @@ +from libc.stdint cimport int32_t, uint8_t, uint16_t, uint64_t + + +cdef extern from "llhttp.h": + + struct llhttp__internal_s: + int32_t _index + void* _span_pos0 + void* _span_cb0 + int32_t error + const char* reason + const char* error_pos + void* data + void* _current + uint64_t content_length + uint8_t type + uint8_t method + uint8_t http_major + uint8_t http_minor + uint8_t header_state + uint8_t lenient_flags + uint8_t upgrade + uint8_t finish + uint16_t flags + uint16_t status_code + void* settings + + ctypedef llhttp__internal_s llhttp__internal_t + ctypedef llhttp__internal_t llhttp_t + + ctypedef int (*llhttp_data_cb)(llhttp_t*, const char *at, size_t length) except -1 + ctypedef int (*llhttp_cb)(llhttp_t*) except -1 + + struct llhttp_settings_s: + llhttp_cb on_message_begin + llhttp_data_cb on_url + llhttp_data_cb on_status + llhttp_data_cb on_header_field + llhttp_data_cb on_header_value + llhttp_cb on_headers_complete + llhttp_data_cb on_body + llhttp_cb on_message_complete + llhttp_cb on_chunk_header + llhttp_cb on_chunk_complete + + llhttp_cb on_url_complete + llhttp_cb on_status_complete + llhttp_cb on_header_field_complete + llhttp_cb on_header_value_complete + + ctypedef llhttp_settings_s llhttp_settings_t + + enum llhttp_errno: + HPE_OK, + HPE_INTERNAL, + HPE_STRICT, + HPE_LF_EXPECTED, + HPE_UNEXPECTED_CONTENT_LENGTH, + HPE_CLOSED_CONNECTION, + HPE_INVALID_METHOD, + HPE_INVALID_URL, + HPE_INVALID_CONSTANT, + HPE_INVALID_VERSION, + HPE_INVALID_HEADER_TOKEN, + HPE_INVALID_CONTENT_LENGTH, + HPE_INVALID_CHUNK_SIZE, + HPE_INVALID_STATUS, + HPE_INVALID_EOF_STATE, + HPE_INVALID_TRANSFER_ENCODING, + HPE_CB_MESSAGE_BEGIN, + HPE_CB_HEADERS_COMPLETE, + HPE_CB_MESSAGE_COMPLETE, + HPE_CB_CHUNK_HEADER, + HPE_CB_CHUNK_COMPLETE, + HPE_PAUSED, + HPE_PAUSED_UPGRADE, + HPE_USER + + ctypedef llhttp_errno llhttp_errno_t + + enum llhttp_flags: + F_CHUNKED, + F_CONTENT_LENGTH + + enum llhttp_type: + HTTP_REQUEST, + HTTP_RESPONSE, + HTTP_BOTH + + enum llhttp_method: + HTTP_DELETE, + HTTP_GET, + HTTP_HEAD, + HTTP_POST, + HTTP_PUT, + HTTP_CONNECT, + HTTP_OPTIONS, + HTTP_TRACE, + HTTP_COPY, + HTTP_LOCK, + HTTP_MKCOL, + HTTP_MOVE, + HTTP_PROPFIND, + HTTP_PROPPATCH, + HTTP_SEARCH, + HTTP_UNLOCK, + HTTP_BIND, + HTTP_REBIND, + HTTP_UNBIND, + HTTP_ACL, + HTTP_REPORT, + HTTP_MKACTIVITY, + HTTP_CHECKOUT, + HTTP_MERGE, + HTTP_MSEARCH, + HTTP_NOTIFY, + HTTP_SUBSCRIBE, + HTTP_UNSUBSCRIBE, + HTTP_PATCH, + HTTP_PURGE, + HTTP_MKCALENDAR, + HTTP_LINK, + HTTP_UNLINK, + HTTP_SOURCE, + HTTP_PRI, + HTTP_DESCRIBE, + HTTP_ANNOUNCE, + HTTP_SETUP, + HTTP_PLAY, + HTTP_PAUSE, + HTTP_TEARDOWN, + HTTP_GET_PARAMETER, + HTTP_SET_PARAMETER, + HTTP_REDIRECT, + HTTP_RECORD, + HTTP_FLUSH + + ctypedef llhttp_method llhttp_method_t; + + void llhttp_settings_init(llhttp_settings_t* settings) + void llhttp_init(llhttp_t* parser, llhttp_type type, + const llhttp_settings_t* settings) + + llhttp_errno_t llhttp_execute(llhttp_t* parser, const char* data, size_t len) + + int llhttp_should_keep_alive(const llhttp_t* parser) + + void llhttp_resume_after_upgrade(llhttp_t* parser) + + llhttp_errno_t llhttp_get_errno(const llhttp_t* parser) + const char* llhttp_get_error_reason(const llhttp_t* parser) + const char* llhttp_get_error_pos(const llhttp_t* parser) + + const char* llhttp_method_name(llhttp_method_t method) + + void llhttp_set_lenient_headers(llhttp_t* parser, int enabled) + void llhttp_set_lenient_optional_cr_before_lf(llhttp_t* parser, int enabled) + void llhttp_set_lenient_spaces_after_chunk_size(llhttp_t* parser, int enabled) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_find_header.pxd b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_find_header.pxd new file mode 100644 index 0000000..37a6c37 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_find_header.pxd @@ -0,0 +1,2 @@ +cdef extern from "_find_header.h": + int find_header(char *, int) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_headers.pxi b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_headers.pxi new file mode 100644 index 0000000..3744721 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_headers.pxi @@ -0,0 +1,83 @@ +# The file is autogenerated from aiohttp/hdrs.py +# Run ./tools/gen.py to update it after the origin changing. + +from . import hdrs +cdef tuple headers = ( + hdrs.ACCEPT, + hdrs.ACCEPT_CHARSET, + hdrs.ACCEPT_ENCODING, + hdrs.ACCEPT_LANGUAGE, + hdrs.ACCEPT_RANGES, + hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, + hdrs.ACCESS_CONTROL_ALLOW_HEADERS, + hdrs.ACCESS_CONTROL_ALLOW_METHODS, + hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, + hdrs.ACCESS_CONTROL_EXPOSE_HEADERS, + hdrs.ACCESS_CONTROL_MAX_AGE, + hdrs.ACCESS_CONTROL_REQUEST_HEADERS, + hdrs.ACCESS_CONTROL_REQUEST_METHOD, + hdrs.AGE, + hdrs.ALLOW, + hdrs.AUTHORIZATION, + hdrs.CACHE_CONTROL, + hdrs.CONNECTION, + hdrs.CONTENT_DISPOSITION, + hdrs.CONTENT_ENCODING, + hdrs.CONTENT_LANGUAGE, + hdrs.CONTENT_LENGTH, + hdrs.CONTENT_LOCATION, + hdrs.CONTENT_MD5, + hdrs.CONTENT_RANGE, + hdrs.CONTENT_TRANSFER_ENCODING, + hdrs.CONTENT_TYPE, + hdrs.COOKIE, + hdrs.DATE, + hdrs.DESTINATION, + hdrs.DIGEST, + hdrs.ETAG, + hdrs.EXPECT, + hdrs.EXPIRES, + hdrs.FORWARDED, + hdrs.FROM, + hdrs.HOST, + hdrs.IF_MATCH, + hdrs.IF_MODIFIED_SINCE, + hdrs.IF_NONE_MATCH, + hdrs.IF_RANGE, + hdrs.IF_UNMODIFIED_SINCE, + hdrs.KEEP_ALIVE, + hdrs.LAST_EVENT_ID, + hdrs.LAST_MODIFIED, + hdrs.LINK, + hdrs.LOCATION, + hdrs.MAX_FORWARDS, + hdrs.ORIGIN, + hdrs.PRAGMA, + hdrs.PROXY_AUTHENTICATE, + hdrs.PROXY_AUTHORIZATION, + hdrs.RANGE, + hdrs.REFERER, + hdrs.RETRY_AFTER, + hdrs.SEC_WEBSOCKET_ACCEPT, + hdrs.SEC_WEBSOCKET_EXTENSIONS, + hdrs.SEC_WEBSOCKET_KEY, + hdrs.SEC_WEBSOCKET_KEY1, + hdrs.SEC_WEBSOCKET_PROTOCOL, + hdrs.SEC_WEBSOCKET_VERSION, + hdrs.SERVER, + hdrs.SET_COOKIE, + hdrs.TE, + hdrs.TRAILER, + hdrs.TRANSFER_ENCODING, + hdrs.URI, + hdrs.UPGRADE, + hdrs.USER_AGENT, + hdrs.VARY, + hdrs.VIA, + hdrs.WWW_AUTHENTICATE, + hdrs.WANT_DIGEST, + hdrs.WARNING, + hdrs.X_FORWARDED_FOR, + hdrs.X_FORWARDED_HOST, + hdrs.X_FORWARDED_PROTO, +) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_http_parser.cpython-312-x86_64-linux-gnu.so b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_http_parser.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..de27b95d0d284537d3d9bfc4c14c8253c305e548 GIT binary patch literal 2833152 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�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

    V3ql8@dC94@`vn;sHgQ1!#Xfplh22=s-N6(ai#M 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%0Dveu3SE+>cSBE2E&4 z8n%8Dm04yg5k$ZlOoYW)*aHB0bn{-u!M#LOO6^m$G3K7r+0wZFxM|33n>-mvM{&=R zG71&8MSfFd{|Tp4LCZo}XzjtPTF8#lwi^gnAp1;WD@?K%QlPZSKgomG&N38JFJeS@ zWAzeslAinZ9pFSPBu4sNVR!9hcfw{bQwLNzk!^TuA+Hn=GMSmmfe?lKcQ{}VuSyRH z9VkRffjqM}(L2~Y@)Q#XnLzJbt~^~GjWp~aN70|&TA3S`h3G8L1vAL$cprA7-K^cN3!ry%7J^fA2H2YIKC>5=}i5-W)JIh0`UG1(q z4Dedh;azTj3j>SEEYCEs$K}kiKErl78>z97$V(YqxmtI>A~h~=yBY>4gjw6phg5Wz zi_v0c45QxQa{EtP0{p`(#+k~@Fb-X>^kI)d%7t9{3ob3u@7Nyacd-7UZcLnDk`UhG zCm}oqAD*+YA@zOPg>zj32jtXw)n%m^2vF#4 zup?tf)q8UahhB?*h@$PV`_lGTD1oD9IATjrC&Iy)Y7qR5DIfK*Ejy|qmJEai*?k;-nG~ACn zQ7YVzvMM#k-o##{?xZ?8{Mr+qQ80x=*%G1aKB|s}QGZWSpBj()J%9n5<;Fk5D22z^ zEG2GLy>ZjC#<~dVjqWo3VYS%1s!&dOwpz6ZH`FjfpDomH1u~&&Roj$5T9Kzkh|>E| z+O;hALTo$fL_fo==|(+Z4BsSBT1<83lj<+L-^uFmfWunJlXIvFXPVt)$|Y?*{-ydk zp~~({Y{?PtD+6`{e@aitgIrW%cj{-iKTZE-vdMnnS^!k1IcGOH@Qk5CRyGy@$;~7b zA?$A!gtl@6007Xx14tKnP&*I(>yD83w}6%yH7@e?VU1PL2}Sq@BrcR4BoVnLM=r(g z0@eqh7lg1thEN^{+dpAl%@SB)pG+FL+{H(x_0xD3xx7)uxm^`Nw&#w?Fc{tL)D>5^@nzhvv$^!8vdY>;$qXtS(S9*O`Rj8-J>0x8$A${y5W=%&oA|e2cR8fnSv=_=-9ENg77JSDn*b8*ec+E6rti?$+0o*_}9$$Tg|&Kxs3b=&l@dg|se*k#rR|^Y<$IW4=)_-aFeca8J2e zcYHyAs4UOk3M{d6Wb!tRX~yTBvzgk~OHyK3Xwo(yWULFbtjfhsgPaGF`aXyXw2t3_ zEivx+Xm@v}>Mkg_p54{VJe(vDdcqCj9Lyj34l94nK)6G>WjMO3d^M8%z5oAA%3D}LD+_f!jYDYYdwYbuovvoH?&{+6-a9pNUW4`I=AHiO zmKAkjk;h0HFF=!RJIWF(W1s7>H{(vX>p|?Q_DF*p!f(?EWYjDeq ztQ(wxJxL`b8k~)_P%K^#?d%E?^0pWuAIhGPjq$_ueh~WYG3X1jhrT`@`g=j>Q)AHQ zXAgZtJoI;i(C>&rpO-!Kjq%Xm2|~X!2E9H*=nNjQ7 zUKL>xp3$)qRQ-WNcnpWYV+RPdb2`EpT*YgT@gB!wQgF=-oeSI0m)|-%22CUD)iJhJ zTSVhv(bZVza0OT(yE2)Qs04E49)C)DbvDnUcvF)3dKagpTxY#PeLodcoiJ=?zFLoF zKD!&0Q4s|C=j>|q(gPj)ijJ+v6gLRch#CD~FxwS{XS*ubY`(^|`7Qa0rMZq*jKZoe zI0gOzQy|v@unu6Z=rABVGyJl&zuG(hU_WJ>63FW&!)iq8%%nb2?J}%r=HjkFPI>w8 ziS~LILp~Bw5hzI~05nscX%>27=_tB6nL`QhFHv6T!*Wp*rCn+k+hxvlyZxhTkF-T8 z8h;&~AJKMU5Lq#-P|kmS;Ud5<=kI6yhD2`A>wEAPSPB@yfNL40*%keHnqAo6{ubbgv%;-m+vjTk=(1%5+R>*09ODcl zjy$zMCyvgtg5ifC9bOm9BD_VPy{#0y*KA!3%d=!TTpg8604A4W=R&a^gRGRqx}S~w z+5D?e2s;1;nYm-3XTS5-O?LyDmY(=fc;+ClB#8+_3l&C}FiCf%hPlX?hpJ1MNUpuy zgO{X=lp-+DxCmp3<(bLs7?8Hta4^+KT^sO05zj{ldZPpQt0--1+JQ=)^&MGEZ;u%c zpow@}2QHEwWDv&ew6CQUkGU$eA7-+_f4wY35`X^-5a5FY_Qi<*GYJ+gq#R^Mz}Xrr zXM&jMw8`qw8z8EMgX{o=+6xW^y%Ym$q^l9l1}zNF)$(d~3nr#~z(70g%1Yc^S2P%HD_BNv?STvx#NTEPEm|o>FF;q8*&2G%4g7 zr5HiZL6-69!~H>!<~<~M17xd;s257TThlOM_N2*^g#>8z1vy66yU|jwEUm6YI8@Y- zWF`ybc5$|pIs?$t9*#UX0>TcJ)PvhJR7w3bWX(uap^Vj?!^0RZM3!T7O8Yk^6Ie-h z58ZgiZ62&>Ca{voo0-f%0jP3!Hm`j`6ZBzxKQ;~Iiua0dO0^hY6;)w^2Q`(sE&1>% zNG93F0x?yQpGlU1qF?L=y(ZupmJ`|aq|YzOavJv{5o80&X zQ5|6NqcWe9MyOfI5#s2ypRC}YQhxw>aZ#B zCPm-s>r!CavKR$k^eM0|Ed@5mQvkYsoL3s+&D*SPlIAPA#l z6+>& zj~(cTTg-<_@b(}QR=Sm_DTi%NtbcZ2h0_&X3U&YQN~}9NNG^{=VVwczH%qtk&tyPS zOw#1**6A2>p+?Id0`$cS*BHN3LoxgX0MBIWp%IoVl;^Pd&P{WGU4}?3&y-*9?#bgz zL{@Fk{qaIsyTmMm+ObBV%+){>Pigm!Gx@^tKWO1iK-HRa+?omO#1MX{^OjfV!Q^$& zlOFQHQte1YCL_koU!Qn8eC!XGwY2fLa^+uml%1azx-RX0;19)ZwrK}2VavS4pc++3 z^&7AapU_}WVYOi#mU{T#7ot}77A|Pf2v`QmNtpmkftV%R0jm-l>!x=z*H_cZgra!O z;F~LWWfqBeQ;L`X7Uatk`g!*7e^dZc51;}p=&sl!Kp+G?^oG78mA+T`^z~N5VKRFR zx6Kf`P+T(UkUqb~YDA-L;503g7uq2_5Jw_`2a<%FV~s3@Gxf-uj<;>)!&%ihqZ(ML zD0D|{&Ivn#W-EAIaJW)49@AlzL68}mz$os=(NQKE^^c{_S8ps7svb-I7H~vCUHi+E zuQDIGGZ-H`fz$GJ{puen)noJUdDJ=bGjqaqiGqrqS#67OqA?`Bdu$c(=qYHa{{SG+ zd2|#zTr3TG+%=<3Eu(qn7|&F$Y{fQ=ua6$w#!WTsNA0XGGUrlFgAOcwyv6>Xe^{07 z8k{S^z6OTFEGZeac_hxJddjOcIvYEls=FBXAeDX(8O|Yaj~2f*E5W3t!)>Olg)bRT zG|pThNaQ6T+vMOW8o@qGcm9#70FPsmFFW9Ywm!=-=zr5?Ds+A_xQ2eFDUQ$NPHXWMrACG(BAVAZq413xLA&eL)$pA}-|oSGYmVwSk_uFXq$)_K>}7 zU7jYn_z~FI!$zjr*{f{o>+GeYy!mWS${owG0|*hS>5EA5s5?hy=%u$VC2zF8XIsLdF9{$=%T1VNR4W3WfOC zXJT`?Cta;gZydmf1UC*~bUVny=Ke;wbDz_6{$234Sndd0%l_nRLcw39os268*tg&n z1UzHI#-Swte|ZN%E&8oQTd=e`Qbg}J=}H}i8%51GEVa~{PO8B<3pg@m1?EALDz6Yf z5k~x(-HtbBA_>N`Jnv2M!WqQtc5(@N`Z#4M2i38Brv)I^YuwR}tmDtGpZaiRELFjE9 zayJU15EVotf;#;@5oJ;R3S_sUi>h;BdhJ_d?!bjftI1AW@1v^;uTUJ=(;TTI4(b8s z8lVG$*%0GXiia`urK8a{@@ivsRFC{3j&7mBq^Imi+BcOSSwOfQ+-U!Unr$RxMtj$I z7za246nDesw(~nVm6YNOb^ZWe6*>a1wkRz}WSndDd>7Iqyi$;oNg)TS3T${w& zbaMu*CTTc40A))bbp?^OECcS=*ZOAh4QxI zl6-}h1TQsrb(N$m#^2%M1f0~4bi~FH#>h|cvD(roTGfl z{R&{Y3FUyNQwruYzU%=|o9FCdKySqLxUO3Vw=}J1u*?%EPbCd|Ix+*~0f>{yvVOmG z$=DTudFI8W^wJ8dPI|{^@?VbJ^;^v?Rbc-Y{Ml_M+pR{>G6OJd4y{I-KD5|YRwG}b ze{0!1ybWyYP;q-q{hvAxF!YvAP{A#ft(vISTkd7IfT;lyex|WwfVdVAVM-ah5#sHm zGbaOdR(R;Vc%;yIDu@mj|K4SG_h*34Di59Kjubi@g6L53dY9wP$^f0mJanEtQs_Jr zL?=j{=^3E2#zSZ0kwRy45S<|J)MbFqlO8&aM+%)6lA&`~JUU*g4qvhwJ#?Nt9CWCk zWGX;$BMs_f>1VDRC%Np_CU#^5wv4EfqJRt-r26-+Z zk%13n8SG_1vI0#uTb2S%P6;-dM0x^EHd|f-O_DPc zD*J$hI5_0vAmNwJb>N}fSjTb-$kF)l{%1%o6uhhmlV$LyVZ5=)8p@nc0qA!)<$67j z?;%NJ0e;0zq;KzcC(?Vy2PV?Zc$;n_y>+}hk$!Q2g^$2QIvo%b()O7Q(7DY+=fIId zXI2oMAVY7+0G&HLbUr&$=-eMfCn(ZSWq{7z9y*^MDRkxp(Fsy#Z3gH}^U(R|NTD+? zh)z%yJe~nMGdy&5A1QPmN`}s(8K85Yht7LP3Y|qkba+PCyYzcyJUVgn`U4(1I}ZmP zC?iV_-r&#cTlUB1^(3k!t9kt$fKI180&_vL)kR<~ct6-=Py_-BBG6>BRYIW24}wi5 zQ38P`n=ST%CO-}~8SG_1&;w02TeJgB?g=)TM3@6jHd}lHP3}w9WI$j8O*UIZ15HvG ze2z^blub>E{j3u+CB`4%1+Mi?42UK_jXm*Zu(cpf1Cwi@gNfvWBJ9XUx%*O&Hq#F#0F1~b6FFd%>LZ0SO(EYd|^e({p%R?_1QyT0O%l*`p@ZoflDhIgnlRny)k>}55+^jHVFNj81$#IhrTc# z`sg6^(VP5HU6(!dhvT7tg8*AFm+rsGwK3?3N6VIH7R5t96oej)L0_9a^u>T~=XQ1X z*!$Zjfs0Lg*+QANfX4($9pPS-x4a3C^d|?_wW#D@VI4U3LpWf*AfRQ< z0`z!1pry?Mv?dj=ijj^yQav! zC%)+SZZez?egk8gGt zcy)TEp@+(0cuKzpM1RJk_q>OT&Zilmv&Tc{t|NucXx>)kIc_0XK6O6I0G)jvI#Z7n zI%9(9aI3bfOC4T*mu|2Qdgx3!Qs`V4Lx)E`EF93F1EW}Y<6Js)zVy(UbfnN3A4G?_ zV!!30!)xBsp>xPX=awUd&P_pdXo#QaqVrY;=v<4+AZ4N4bfnO^C5R3stB;G$>lvUk z)HJMbi2byfQE)O*MY_Q2B+B?u>v-NeL$>)MiCehG=CY!C315LgdY%+-!4m8

    >DD%s!xKc!f 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 Te)b1e#Q{Z})s$M=YFOu)3*bf~b~{t<{V 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� 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 literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_http_parser.pyx b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_http_parser.pyx new file mode 100644 index 0000000..4a7101e --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_http_parser.pyx @@ -0,0 +1,835 @@ +# Based on https://github.com/MagicStack/httptools +# + +from cpython cimport ( + Py_buffer, + PyBUF_SIMPLE, + PyBuffer_Release, + PyBytes_AsString, + PyBytes_AsStringAndSize, + PyObject_GetBuffer, +) +from cpython.mem cimport PyMem_Free, PyMem_Malloc +from libc.limits cimport ULLONG_MAX +from libc.string cimport memcpy + +from multidict import CIMultiDict as _CIMultiDict, CIMultiDictProxy as _CIMultiDictProxy +from yarl import URL as _URL + +from aiohttp import hdrs +from aiohttp.helpers import DEBUG, set_exception + +from .http_exceptions import ( + BadHttpMessage, + BadHttpMethod, + BadStatusLine, + ContentLengthError, + InvalidHeader, + InvalidURLError, + LineTooLong, + PayloadEncodingError, + TransferEncodingError, +) +from .http_parser import DeflateBuffer as _DeflateBuffer +from .http_writer import ( + HttpVersion as _HttpVersion, + HttpVersion10 as _HttpVersion10, + HttpVersion11 as _HttpVersion11, +) +from .streams import EMPTY_PAYLOAD as _EMPTY_PAYLOAD, StreamReader as _StreamReader + +cimport cython + +from aiohttp cimport _cparser as cparser + +include "_headers.pxi" + +from aiohttp cimport _find_header + +ALLOWED_UPGRADES = frozenset({"websocket"}) +DEF DEFAULT_FREELIST_SIZE = 250 + +cdef extern from "Python.h": + int PyByteArray_Resize(object, Py_ssize_t) except -1 + Py_ssize_t PyByteArray_Size(object) except -1 + char* PyByteArray_AsString(object) + +__all__ = ('HttpRequestParser', 'HttpResponseParser', + 'RawRequestMessage', 'RawResponseMessage') + +cdef object URL = _URL +cdef object URL_build = URL.build +cdef object CIMultiDict = _CIMultiDict +cdef object CIMultiDictProxy = _CIMultiDictProxy +cdef object HttpVersion = _HttpVersion +cdef object HttpVersion10 = _HttpVersion10 +cdef object HttpVersion11 = _HttpVersion11 +cdef object SEC_WEBSOCKET_KEY1 = hdrs.SEC_WEBSOCKET_KEY1 +cdef object CONTENT_ENCODING = hdrs.CONTENT_ENCODING +cdef object EMPTY_PAYLOAD = _EMPTY_PAYLOAD +cdef object StreamReader = _StreamReader +cdef object DeflateBuffer = _DeflateBuffer +cdef bytes EMPTY_BYTES = b"" + +cdef inline object extend(object buf, const char* at, size_t length): + cdef Py_ssize_t s + cdef char* ptr + s = PyByteArray_Size(buf) + PyByteArray_Resize(buf, s + length) + ptr = PyByteArray_AsString(buf) + memcpy(ptr + s, at, length) + + +DEF METHODS_COUNT = 46; + +cdef list _http_method = [] + +for i in range(METHODS_COUNT): + _http_method.append( + cparser.llhttp_method_name( i).decode('ascii')) + + +cdef inline str http_method_str(int i): + if i < METHODS_COUNT: + return _http_method[i] + else: + return "" + +cdef inline object find_header(bytes raw_header): + cdef Py_ssize_t size + cdef char *buf + cdef int idx + PyBytes_AsStringAndSize(raw_header, &buf, &size) + idx = _find_header.find_header(buf, size) + if idx == -1: + return raw_header.decode('utf-8', 'surrogateescape') + return headers[idx] + + +@cython.freelist(DEFAULT_FREELIST_SIZE) +cdef class RawRequestMessage: + cdef readonly str method + cdef readonly str path + cdef readonly object version # HttpVersion + cdef readonly object headers # CIMultiDict + cdef readonly object raw_headers # tuple + cdef readonly object should_close + cdef readonly object compression + cdef readonly object upgrade + cdef readonly object chunked + cdef readonly object url # yarl.URL + + def __init__(self, method, path, version, headers, raw_headers, + should_close, compression, upgrade, chunked, url): + self.method = method + self.path = path + self.version = version + self.headers = headers + self.raw_headers = raw_headers + self.should_close = should_close + self.compression = compression + self.upgrade = upgrade + self.chunked = chunked + self.url = url + + def __repr__(self): + info = [] + info.append(("method", self.method)) + info.append(("path", self.path)) + info.append(("version", self.version)) + info.append(("headers", self.headers)) + info.append(("raw_headers", self.raw_headers)) + info.append(("should_close", self.should_close)) + info.append(("compression", self.compression)) + info.append(("upgrade", self.upgrade)) + info.append(("chunked", self.chunked)) + info.append(("url", self.url)) + sinfo = ', '.join(name + '=' + repr(val) for name, val in info) + return '' + + def _replace(self, **dct): + cdef RawRequestMessage ret + ret = _new_request_message(self.method, + self.path, + self.version, + self.headers, + self.raw_headers, + self.should_close, + self.compression, + self.upgrade, + self.chunked, + self.url) + if "method" in dct: + ret.method = dct["method"] + if "path" in dct: + ret.path = dct["path"] + if "version" in dct: + ret.version = dct["version"] + if "headers" in dct: + ret.headers = dct["headers"] + if "raw_headers" in dct: + ret.raw_headers = dct["raw_headers"] + if "should_close" in dct: + ret.should_close = dct["should_close"] + if "compression" in dct: + ret.compression = dct["compression"] + if "upgrade" in dct: + ret.upgrade = dct["upgrade"] + if "chunked" in dct: + ret.chunked = dct["chunked"] + if "url" in dct: + ret.url = dct["url"] + return ret + +cdef _new_request_message(str method, + str path, + object version, + object headers, + object raw_headers, + bint should_close, + object compression, + bint upgrade, + bint chunked, + object url): + cdef RawRequestMessage ret + ret = RawRequestMessage.__new__(RawRequestMessage) + ret.method = method + ret.path = path + ret.version = version + ret.headers = headers + ret.raw_headers = raw_headers + ret.should_close = should_close + ret.compression = compression + ret.upgrade = upgrade + ret.chunked = chunked + ret.url = url + return ret + + +@cython.freelist(DEFAULT_FREELIST_SIZE) +cdef class RawResponseMessage: + cdef readonly object version # HttpVersion + cdef readonly int code + cdef readonly str reason + cdef readonly object headers # CIMultiDict + cdef readonly object raw_headers # tuple + cdef readonly object should_close + cdef readonly object compression + cdef readonly object upgrade + cdef readonly object chunked + + def __init__(self, version, code, reason, headers, raw_headers, + should_close, compression, upgrade, chunked): + self.version = version + self.code = code + self.reason = reason + self.headers = headers + self.raw_headers = raw_headers + self.should_close = should_close + self.compression = compression + self.upgrade = upgrade + self.chunked = chunked + + def __repr__(self): + info = [] + info.append(("version", self.version)) + info.append(("code", self.code)) + info.append(("reason", self.reason)) + info.append(("headers", self.headers)) + info.append(("raw_headers", self.raw_headers)) + info.append(("should_close", self.should_close)) + info.append(("compression", self.compression)) + info.append(("upgrade", self.upgrade)) + info.append(("chunked", self.chunked)) + sinfo = ', '.join(name + '=' + repr(val) for name, val in info) + return '' + + +cdef _new_response_message(object version, + int code, + str reason, + object headers, + object raw_headers, + bint should_close, + object compression, + bint upgrade, + bint chunked): + cdef RawResponseMessage ret + ret = RawResponseMessage.__new__(RawResponseMessage) + ret.version = version + ret.code = code + ret.reason = reason + ret.headers = headers + ret.raw_headers = raw_headers + ret.should_close = should_close + ret.compression = compression + ret.upgrade = upgrade + ret.chunked = chunked + return ret + + +@cython.internal +cdef class HttpParser: + + cdef: + cparser.llhttp_t* _cparser + cparser.llhttp_settings_t* _csettings + + bytes _raw_name + object _name + bytes _raw_value + bint _has_value + + object _protocol + object _loop + object _timer + + size_t _max_line_size + size_t _max_field_size + size_t _max_headers + bint _response_with_body + bint _read_until_eof + + bint _started + object _url + bytearray _buf + str _path + str _reason + list _headers + list _raw_headers + bint _upgraded + list _messages + object _payload + bint _payload_error + object _payload_exception + object _last_error + bint _auto_decompress + int _limit + + str _content_encoding + + Py_buffer py_buf + + def __cinit__(self): + self._cparser = \ + PyMem_Malloc(sizeof(cparser.llhttp_t)) + if self._cparser is NULL: + raise MemoryError() + + self._csettings = \ + PyMem_Malloc(sizeof(cparser.llhttp_settings_t)) + if self._csettings is NULL: + raise MemoryError() + + def __dealloc__(self): + PyMem_Free(self._cparser) + PyMem_Free(self._csettings) + + cdef _init( + self, cparser.llhttp_type mode, + object protocol, object loop, int limit, + object timer=None, + size_t max_line_size=8190, size_t max_headers=32768, + size_t max_field_size=8190, payload_exception=None, + bint response_with_body=True, bint read_until_eof=False, + bint auto_decompress=True, + ): + cparser.llhttp_settings_init(self._csettings) + cparser.llhttp_init(self._cparser, mode, self._csettings) + self._cparser.data = self + self._cparser.content_length = 0 + + self._protocol = protocol + self._loop = loop + self._timer = timer + + self._buf = bytearray() + self._payload = None + self._payload_error = 0 + self._payload_exception = payload_exception + self._messages = [] + + self._raw_name = EMPTY_BYTES + self._raw_value = EMPTY_BYTES + self._has_value = False + + self._max_line_size = max_line_size + self._max_headers = max_headers + self._max_field_size = max_field_size + self._response_with_body = response_with_body + self._read_until_eof = read_until_eof + self._upgraded = False + self._auto_decompress = auto_decompress + self._content_encoding = None + + self._csettings.on_url = cb_on_url + self._csettings.on_status = cb_on_status + self._csettings.on_header_field = cb_on_header_field + self._csettings.on_header_value = cb_on_header_value + self._csettings.on_headers_complete = cb_on_headers_complete + self._csettings.on_body = cb_on_body + self._csettings.on_message_begin = cb_on_message_begin + self._csettings.on_message_complete = cb_on_message_complete + self._csettings.on_chunk_header = cb_on_chunk_header + self._csettings.on_chunk_complete = cb_on_chunk_complete + + self._last_error = None + self._limit = limit + + cdef _process_header(self): + cdef str value + if self._raw_name is not EMPTY_BYTES: + name = find_header(self._raw_name) + value = self._raw_value.decode('utf-8', 'surrogateescape') + + self._headers.append((name, value)) + + if name is CONTENT_ENCODING: + self._content_encoding = value + + self._has_value = False + self._raw_headers.append((self._raw_name, self._raw_value)) + self._raw_name = EMPTY_BYTES + self._raw_value = EMPTY_BYTES + + cdef _on_header_field(self, char* at, size_t length): + if self._has_value: + self._process_header() + + if self._raw_name is EMPTY_BYTES: + self._raw_name = at[:length] + else: + self._raw_name += at[:length] + + cdef _on_header_value(self, char* at, size_t length): + if self._raw_value is EMPTY_BYTES: + self._raw_value = at[:length] + else: + self._raw_value += at[:length] + self._has_value = True + + cdef _on_headers_complete(self): + self._process_header() + + should_close = not cparser.llhttp_should_keep_alive(self._cparser) + upgrade = self._cparser.upgrade + chunked = self._cparser.flags & cparser.F_CHUNKED + + raw_headers = tuple(self._raw_headers) + headers = CIMultiDictProxy(CIMultiDict(self._headers)) + + if self._cparser.type == cparser.HTTP_REQUEST: + h_upg = headers.get("upgrade", "") + allowed = upgrade and h_upg.isascii() and h_upg.lower() in ALLOWED_UPGRADES + if allowed or self._cparser.method == cparser.HTTP_CONNECT: + self._upgraded = True + else: + if upgrade and self._cparser.status_code == 101: + self._upgraded = True + + # do not support old websocket spec + if SEC_WEBSOCKET_KEY1 in headers: + raise InvalidHeader(SEC_WEBSOCKET_KEY1) + + encoding = None + enc = self._content_encoding + if enc is not None: + self._content_encoding = None + if enc.isascii() and enc.lower() in {"gzip", "deflate", "br", "zstd"}: + encoding = enc + + if self._cparser.type == cparser.HTTP_REQUEST: + method = http_method_str(self._cparser.method) + msg = _new_request_message( + method, self._path, + self.http_version(), headers, raw_headers, + should_close, encoding, upgrade, chunked, self._url) + else: + msg = _new_response_message( + self.http_version(), self._cparser.status_code, self._reason, + headers, raw_headers, should_close, encoding, + upgrade, chunked) + + if ( + ULLONG_MAX > self._cparser.content_length > 0 or chunked or + self._cparser.method == cparser.HTTP_CONNECT or + (self._cparser.status_code >= 199 and + self._cparser.content_length == 0 and + self._read_until_eof) + ): + payload = StreamReader( + self._protocol, timer=self._timer, loop=self._loop, + limit=self._limit) + else: + payload = EMPTY_PAYLOAD + + self._payload = payload + if encoding is not None and self._auto_decompress: + self._payload = DeflateBuffer(payload, encoding) + + if not self._response_with_body: + payload = EMPTY_PAYLOAD + + self._messages.append((msg, payload)) + + cdef _on_message_complete(self): + self._payload.feed_eof() + self._payload = None + + cdef _on_chunk_header(self): + self._payload.begin_http_chunk_receiving() + + cdef _on_chunk_complete(self): + self._payload.end_http_chunk_receiving() + + cdef object _on_status_complete(self): + pass + + cdef inline http_version(self): + cdef cparser.llhttp_t* parser = self._cparser + + if parser.http_major == 1: + if parser.http_minor == 0: + return HttpVersion10 + elif parser.http_minor == 1: + return HttpVersion11 + + return HttpVersion(parser.http_major, parser.http_minor) + + ### Public API ### + + def feed_eof(self): + cdef bytes desc + + if self._payload is not None: + if self._cparser.flags & cparser.F_CHUNKED: + raise TransferEncodingError( + "Not enough data to satisfy transfer length header.") + elif self._cparser.flags & cparser.F_CONTENT_LENGTH: + raise ContentLengthError( + "Not enough data to satisfy content length header.") + elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: + desc = cparser.llhttp_get_error_reason(self._cparser) + raise PayloadEncodingError(desc.decode('latin-1')) + else: + self._payload.feed_eof() + elif self._started: + self._on_headers_complete() + if self._messages: + return self._messages[-1][0] + + def feed_data(self, data): + cdef: + size_t data_len + size_t nb + cdef cparser.llhttp_errno_t errno + + PyObject_GetBuffer(data, &self.py_buf, PyBUF_SIMPLE) + data_len = self.py_buf.len + + errno = cparser.llhttp_execute( + self._cparser, + self.py_buf.buf, + data_len) + + if errno is cparser.HPE_PAUSED_UPGRADE: + cparser.llhttp_resume_after_upgrade(self._cparser) + + nb = cparser.llhttp_get_error_pos(self._cparser) - self.py_buf.buf + + PyBuffer_Release(&self.py_buf) + + if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): + if self._payload_error == 0: + if self._last_error is not None: + ex = self._last_error + self._last_error = None + else: + after = cparser.llhttp_get_error_pos(self._cparser) + before = data[:after - self.py_buf.buf] + after_b = after.split(b"\r\n", 1)[0] + before = before.rsplit(b"\r\n", 1)[-1] + data = before + after_b + pointer = " " * (len(repr(before))-1) + "^" + ex = parser_error_from_errno(self._cparser, data, pointer) + self._payload = None + raise ex + + if self._messages: + messages = self._messages + self._messages = [] + else: + messages = () + + if self._upgraded: + return messages, True, data[nb:] + else: + return messages, False, b"" + + def set_upgraded(self, val): + self._upgraded = val + + +cdef class HttpRequestParser(HttpParser): + + def __init__( + self, protocol, loop, int limit, timer=None, + size_t max_line_size=8190, size_t max_headers=32768, + size_t max_field_size=8190, payload_exception=None, + bint response_with_body=True, bint read_until_eof=False, + bint auto_decompress=True, + ): + self._init(cparser.HTTP_REQUEST, protocol, loop, limit, timer, + max_line_size, max_headers, max_field_size, + payload_exception, response_with_body, read_until_eof, + auto_decompress) + + cdef object _on_status_complete(self): + cdef int idx1, idx2 + if not self._buf: + return + self._path = self._buf.decode('utf-8', 'surrogateescape') + try: + idx3 = len(self._path) + if self._cparser.method == cparser.HTTP_CONNECT: + # authority-form, + # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.3 + self._url = URL.build(authority=self._path, encoded=True) + elif idx3 > 1 and self._path[0] == '/': + # origin-form, + # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.1 + idx1 = self._path.find("?") + if idx1 == -1: + query = "" + idx2 = self._path.find("#") + if idx2 == -1: + path = self._path + fragment = "" + else: + path = self._path[0: idx2] + fragment = self._path[idx2+1:] + + else: + path = self._path[0:idx1] + idx1 += 1 + idx2 = self._path.find("#", idx1+1) + if idx2 == -1: + query = self._path[idx1:] + fragment = "" + else: + query = self._path[idx1: idx2] + fragment = self._path[idx2+1:] + + self._url = URL.build( + path=path, + query_string=query, + fragment=fragment, + encoded=True, + ) + else: + # absolute-form for proxy maybe, + # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.2 + self._url = URL(self._path, encoded=True) + finally: + PyByteArray_Resize(self._buf, 0) + + +cdef class HttpResponseParser(HttpParser): + + def __init__( + self, protocol, loop, int limit, timer=None, + size_t max_line_size=8190, size_t max_headers=32768, + size_t max_field_size=8190, payload_exception=None, + bint response_with_body=True, bint read_until_eof=False, + bint auto_decompress=True + ): + self._init(cparser.HTTP_RESPONSE, protocol, loop, limit, timer, + max_line_size, max_headers, max_field_size, + payload_exception, response_with_body, read_until_eof, + auto_decompress) + # Use strict parsing on dev mode, so users are warned about broken servers. + if not DEBUG: + cparser.llhttp_set_lenient_headers(self._cparser, 1) + cparser.llhttp_set_lenient_optional_cr_before_lf(self._cparser, 1) + cparser.llhttp_set_lenient_spaces_after_chunk_size(self._cparser, 1) + + cdef object _on_status_complete(self): + if self._buf: + self._reason = self._buf.decode('utf-8', 'surrogateescape') + PyByteArray_Resize(self._buf, 0) + else: + self._reason = self._reason or '' + +cdef int cb_on_message_begin(cparser.llhttp_t* parser) except -1: + cdef HttpParser pyparser = parser.data + + pyparser._started = True + pyparser._headers = [] + pyparser._raw_headers = [] + PyByteArray_Resize(pyparser._buf, 0) + pyparser._path = None + pyparser._reason = None + return 0 + + +cdef int cb_on_url(cparser.llhttp_t* parser, + const char *at, size_t length) except -1: + cdef HttpParser pyparser = parser.data + try: + if length > pyparser._max_line_size: + raise LineTooLong( + 'Status line is too long', pyparser._max_line_size, length) + extend(pyparser._buf, at, length) + except BaseException as ex: + pyparser._last_error = ex + return -1 + else: + return 0 + + +cdef int cb_on_status(cparser.llhttp_t* parser, + const char *at, size_t length) except -1: + cdef HttpParser pyparser = parser.data + cdef str reason + try: + if length > pyparser._max_line_size: + raise LineTooLong( + 'Status line is too long', pyparser._max_line_size, length) + extend(pyparser._buf, at, length) + except BaseException as ex: + pyparser._last_error = ex + return -1 + else: + return 0 + + +cdef int cb_on_header_field(cparser.llhttp_t* parser, + const char *at, size_t length) except -1: + cdef HttpParser pyparser = parser.data + cdef Py_ssize_t size + try: + pyparser._on_status_complete() + size = len(pyparser._raw_name) + length + if size > pyparser._max_field_size: + raise LineTooLong( + 'Header name is too long', pyparser._max_field_size, size) + pyparser._on_header_field(at, length) + except BaseException as ex: + pyparser._last_error = ex + return -1 + else: + return 0 + + +cdef int cb_on_header_value(cparser.llhttp_t* parser, + const char *at, size_t length) except -1: + cdef HttpParser pyparser = parser.data + cdef Py_ssize_t size + try: + size = len(pyparser._raw_value) + length + if size > pyparser._max_field_size: + raise LineTooLong( + 'Header value is too long', pyparser._max_field_size, size) + pyparser._on_header_value(at, length) + except BaseException as ex: + pyparser._last_error = ex + return -1 + else: + return 0 + + +cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: + cdef HttpParser pyparser = parser.data + try: + pyparser._on_status_complete() + pyparser._on_headers_complete() + except BaseException as exc: + pyparser._last_error = exc + return -1 + else: + if pyparser._upgraded or pyparser._cparser.method == cparser.HTTP_CONNECT: + return 2 + else: + return 0 + + +cdef int cb_on_body(cparser.llhttp_t* parser, + const char *at, size_t length) except -1: + cdef HttpParser pyparser = parser.data + cdef bytes body = at[:length] + try: + pyparser._payload.feed_data(body, length) + except BaseException as underlying_exc: + reraised_exc = underlying_exc + if pyparser._payload_exception is not None: + reraised_exc = pyparser._payload_exception(str(underlying_exc)) + + set_exception(pyparser._payload, reraised_exc, underlying_exc) + + pyparser._payload_error = 1 + return -1 + else: + return 0 + + +cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: + cdef HttpParser pyparser = parser.data + try: + pyparser._started = False + pyparser._on_message_complete() + except BaseException as exc: + pyparser._last_error = exc + return -1 + else: + return 0 + + +cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: + cdef HttpParser pyparser = parser.data + try: + pyparser._on_chunk_header() + except BaseException as exc: + pyparser._last_error = exc + return -1 + else: + return 0 + + +cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: + cdef HttpParser pyparser = parser.data + try: + pyparser._on_chunk_complete() + except BaseException as exc: + pyparser._last_error = exc + return -1 + else: + return 0 + + +cdef parser_error_from_errno(cparser.llhttp_t* parser, data, pointer): + cdef cparser.llhttp_errno_t errno = cparser.llhttp_get_errno(parser) + cdef bytes desc = cparser.llhttp_get_error_reason(parser) + + err_msg = "{}:\n\n {!r}\n {}".format(desc.decode("latin-1"), data, pointer) + + if errno in {cparser.HPE_CB_MESSAGE_BEGIN, + cparser.HPE_CB_HEADERS_COMPLETE, + cparser.HPE_CB_MESSAGE_COMPLETE, + cparser.HPE_CB_CHUNK_HEADER, + cparser.HPE_CB_CHUNK_COMPLETE, + cparser.HPE_INVALID_CONSTANT, + cparser.HPE_INVALID_HEADER_TOKEN, + cparser.HPE_INVALID_CONTENT_LENGTH, + cparser.HPE_INVALID_CHUNK_SIZE, + cparser.HPE_INVALID_EOF_STATE, + cparser.HPE_INVALID_TRANSFER_ENCODING}: + return BadHttpMessage(err_msg) + elif errno == cparser.HPE_INVALID_METHOD: + return BadHttpMethod(error=err_msg) + elif errno in {cparser.HPE_INVALID_STATUS, + cparser.HPE_INVALID_VERSION}: + return BadStatusLine(error=err_msg) + elif errno == cparser.HPE_INVALID_URL: + return InvalidURLError(err_msg) + + return BadHttpMessage(err_msg) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_http_writer.cpython-312-x86_64-linux-gnu.so b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_http_writer.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..041ab59a2f66dc943d04485624a858b943205b6c GIT binary patch literal 539144 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ʷ*bWoF>!n(+sClV?%-c+}Jh-(wMolM&xV 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⋘6V-S}e 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 ZPyMem_Malloc(size) + if buf == NULL: + PyErr_NoMemory() + return -1 + memcpy(buf, writer.buf, writer.size) + else: + buf = PyMem_Realloc(writer.buf, size) + if buf == NULL: + PyErr_NoMemory() + return -1 + writer.buf = buf + writer.size = size + writer.heap_allocated = 1 + writer.buf[writer.pos] = ch + writer.pos += 1 + return 0 + + +cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): + cdef uint64_t utf = symbol + + if utf < 0x80: + return _write_byte(writer, utf) + elif utf < 0x800: + if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: + return -1 + return _write_byte(writer, (0x80 | (utf & 0x3f))) + elif 0xD800 <= utf <= 0xDFFF: + # surogate pair, ignored + return 0 + elif utf < 0x10000: + if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: + return -1 + if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: + return -1 + return _write_byte(writer, (0x80 | (utf & 0x3f))) + elif utf > 0x10FFFF: + # symbol is too large + return 0 + else: + if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: + return -1 + if _write_byte(writer, + (0x80 | ((utf >> 12) & 0x3f))) < 0: + return -1 + if _write_byte(writer, + (0x80 | ((utf >> 6) & 0x3f))) < 0: + return -1 + return _write_byte(writer, (0x80 | (utf & 0x3f))) + + +cdef inline int _write_str(Writer* writer, str s): + cdef Py_UCS4 ch + for ch in s: + if _write_utf8(writer, ch) < 0: + return -1 + + +cdef inline int _write_str_raise_on_nlcr(Writer* writer, object s): + cdef Py_UCS4 ch + cdef str out_str + if type(s) is str: + out_str = s + elif type(s) is _istr: + out_str = PyObject_Str(s) + elif not isinstance(s, str): + raise TypeError("Cannot serialize non-str key {!r}".format(s)) + else: + out_str = str(s) + + for ch in out_str: + if ch == 0x0D or ch == 0x0A: + raise ValueError( + "Newline or carriage return detected in headers. " + "Potential header injection attack." + ) + if _write_utf8(writer, ch) < 0: + return -1 + + +# --------------- _serialize_headers ---------------------- + +def _serialize_headers(str status_line, headers): + cdef Writer writer + cdef object key + cdef object val + cdef char buf[BUF_SIZE] + + _init_writer(&writer, buf) + + try: + if _write_str(&writer, status_line) < 0: + raise + if _write_byte(&writer, b'\r') < 0: + raise + if _write_byte(&writer, b'\n') < 0: + raise + + for key, val in headers.items(): + if _write_str_raise_on_nlcr(&writer, key) < 0: + raise + if _write_byte(&writer, b':') < 0: + raise + if _write_byte(&writer, b' ') < 0: + raise + if _write_str_raise_on_nlcr(&writer, val) < 0: + raise + if _write_byte(&writer, b'\r') < 0: + raise + if _write_byte(&writer, b'\n') < 0: + raise + + if _write_byte(&writer, b'\r') < 0: + raise + if _write_byte(&writer, b'\n') < 0: + raise + + return PyBytes_FromStringAndSize(writer.buf, writer.pos) + finally: + _release_writer(&writer) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/.hash/mask.pxd.hash b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/.hash/mask.pxd.hash new file mode 100644 index 0000000..eadfed3 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/.hash/mask.pxd.hash @@ -0,0 +1 @@ +b01999d409b29bd916e067bc963d5f2d9ee63cfc9ae0bccb769910131417bf93 /home/runner/work/aiohttp/aiohttp/aiohttp/_websocket/mask.pxd diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/.hash/mask.pyx.hash b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/.hash/mask.pyx.hash new file mode 100644 index 0000000..5cd7ae6 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/.hash/mask.pyx.hash @@ -0,0 +1 @@ +0478ceb55d0ed30ef1a7da742cd003449bc69a07cf9fdb06789bd2b347cbfffe /home/runner/work/aiohttp/aiohttp/aiohttp/_websocket/mask.pyx diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/.hash/reader_c.pxd.hash b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/.hash/reader_c.pxd.hash new file mode 100644 index 0000000..f2feb6a --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/.hash/reader_c.pxd.hash @@ -0,0 +1 @@ +9e5fe78ed0ebce5414d2b8e01868d90c1facc20b84d2d5ff6c23e86e44a155ae /home/runner/work/aiohttp/aiohttp/aiohttp/_websocket/reader_c.pxd diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/__init__.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/__init__.py new file mode 100644 index 0000000..836257c --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/__init__.py @@ -0,0 +1 @@ +"""WebSocket protocol versions 13 and 8.""" diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/__init__.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..17ab1007938339c33cc3b14a252aef94cbd0deb4 GIT binary patch literal 242 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 literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/models.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6cf128200e2347c2b156b0d6ac4a82e24b164ad5 GIT binary patch literal 3452 zcmb7GU2Gd!6~1H7*yDdE&QDulYwea6SJdtws4Tmsj^k$CIy1p`n$5s6ay&PQQ~!jS zNn1yK@M?qDN{f_ApkyT^B6un43q0|_OCOPVNr_O+)gp@ag@6RvjSH)Nfpe~Zng#^o zO7q=w&%JYh&iU>+_t$}dmq5AmOIpszgnWpNUU7AW{j5O92AL)X(TE`!j*6fOP&+G* zs#9|cs1qw!)&mY?ux#eZKSGL8M_CS~_`9(~%8_ z;h1+mbaYzU(0}>+^#A;OgzqQ-I||a#{*I1tZ3wjC1KOhvM{HpA>}1`b6)QSlH={Fj zE?+O*q;_=KtlRZcy%N1eO{-k5SGzfL)N^8 zNAnq8&2RX$fZ^AIMnDTSg0T?u&E!*+x42fE8QN4dYySER5+WSoJr2I;8ad6 zs3|q8r*kx;I% zoX~I6Ig9fz0hR+&#+Msr09N3D1hFOn)=0|}XpXf8hMU(~!$+G+YxFbQ;!qbOqs?qr z968ohTgP777Dqe7c$>rE$lKS=?F20l@*F#D>fusLc>U z7=Zaxs#3@((;bJ4oCvP5jFQaFGI0vn1*if_$eA>AV})85Z;vyn<8#rbcWmaGgDYz` zn7CZ7EdbU5r4n8Z=Ee%OF5WhnL`}19nlIr_xDlf$z1)LiAXu{iYvgHU1iax3Hpg3m zaPw+M;!S_3ncj1e&`@)t6&Qpr|3EYS)EB~$5gdsU2kdAChjAQs_y^ujcUHv(UvQlS z3M~7J0MA`FO{kNKhJeAHN+3D7bf|>5vW)T9VRH+vY%lsPr%UmY4SIk-o-Hruo z2p#;}$Lz2H3FxkHmn?yNxb%`%p2URJWRA}iT`rmyHKNz@suIO@<6dvHTjKFv{4N>> zHC}x+dNzLke7`#;n6JYUF$WVZTAAk?w2+F?s2PQdiAz?!wi*P+c8(Xv_9f`CA^=VD zk(Y#r*9#l7_h)xP$G7F<+%ZbbcZjN-8!V*j#agXy7cmi7x^9XviHTfiPRlmU6gJUF zCOYyky}pV%g!AxOD13*sypea*r{2IjnU*iIp1Sw?j(Fth#Y?}q_Va5W6G@70zPV*> z(FgghrN^H;w}+ZX7ur~L2!xZoK%o9R0}1in0~G4y7od)lLVhu%dDpvSUNBs1e#kW< z5(DTUYVLQ*9YK@9Ju(aSlW7`n%j$nhuH1EIlwYSfBt{5&%w6r++PngLP)f*+UO{_d zd;cQ94}=ZQ6TR08YSj5-+(bpvQ{7hVY({U%C@dU zLLLJ>?=&+w!lUb@O3?yGS-3Dzs>xYlW}&q@`r`58y?L%fr-irVlO|~m9eG!L&+~yC zxaWQ>AK4t*y!~7G6t{h!|1grEyZO1$>>I@H-Hih$g8P7*I8+P)SL&S*%rK1Yf`O?75F= z<9S>}Qo|F_$-*=FH{fk&Ef#Om4q0F6o8Oj1pdNCfWS?30|qu+YockqH+M9nVlr4cb`dS0`-GkJ-*Dk9n6!yQ=_!8B-Y>n8wvPC*bD`SORv_j_{W4PTVHw5c#^pCIC16CiC>A^@yVTGWt$APU9xa$eYQ=Y QYL5s)e7*6EK*ingFMxnD!2kdN literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/reader.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/reader.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..588d5da1f4fdef1f05c551f55fa87fcb709f79d8 GIT binary patch literal 738 zcmZ{hzi-n(6vyvu$98^UKq5dK_s})6HEaDBqGTbJ;{_Hz(Ocsi55`?$!^AzO~q5qEZ4K9iWO6i zlq^VDj9&vbTa{_@B4rpCcRM?EtM;H?d)R2+p9)L0*|O@-cI(Y{ zqt$FrVWJB0`Bm~go7sjS?&`i>0 zX}Yi#L{v%oORJn!_D;n5#HVV4FRbul%!0-0GNt!Fe=YT&urB3%!wU#ybxH~S1djO- zFn@0JiH8klJFgsr5#ol1JqRs(5BtohjIcj4T&HUUY4BF1dcz1EhOY;9Z@};H%MR%? z78uqTcf<4-7>flfK{Quydjt(#e213!tmKo1FZeMNA%s7`_7TvJz{XGU?E6Q*1u-Mf za^T{%H?7I#>VZ_6Nm^!`%h?>4uWY{6ChIp3)U`j8eCZcZPN47V+Dzl}Jkqe*si5*uek* literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/reader_c.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/reader_c.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a65c522e0d52ff89f9633c0a78e1809f8e6de1c GIT binary patch literal 17613 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 literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/reader_py.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/__pycache__/reader_py.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87d065e6cdc7136a2856706716c680dd444224b5 GIT binary patch literal 17614 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 List[bytes]: + return [bytes(a ^ b for a in range(256)) for b in range(256)] + + +def _websocket_mask_python(mask: bytes, data: bytearray) -> None: + """Websocket masking function. + + `mask` is a `bytes` object of length 4; `data` is a `bytearray` + object of any length. The contents of `data` are masked with `mask`, + as specified in section 5.3 of RFC 6455. + + Note that this function mutates the `data` argument. + + This pure-python implementation may be replaced by an optimized + version when available. + + """ + assert isinstance(data, bytearray), data + assert len(mask) == 4, mask + + if data: + _XOR_TABLE = _xor_table() + a, b, c, d = (_XOR_TABLE[n] for n in mask) + data[::4] = data[::4].translate(a) + data[1::4] = data[1::4].translate(b) + data[2::4] = data[2::4].translate(c) + data[3::4] = data[3::4].translate(d) + + +if TYPE_CHECKING or NO_EXTENSIONS: # pragma: no cover + websocket_mask = _websocket_mask_python +else: + try: + from .mask import _websocket_mask_cython # type: ignore[import-not-found] + + websocket_mask = _websocket_mask_cython + except ImportError: # pragma: no cover + websocket_mask = _websocket_mask_python + + +_WS_EXT_RE: Final[Pattern[str]] = re.compile( + r"^(?:;\s*(?:" + r"(server_no_context_takeover)|" + r"(client_no_context_takeover)|" + r"(server_max_window_bits(?:=(\d+))?)|" + r"(client_max_window_bits(?:=(\d+))?)))*$" +) + +_WS_EXT_RE_SPLIT: Final[Pattern[str]] = re.compile(r"permessage-deflate([^,]+)?") + + +def ws_ext_parse(extstr: Optional[str], isserver: bool = False) -> Tuple[int, bool]: + if not extstr: + return 0, False + + compress = 0 + notakeover = False + for ext in _WS_EXT_RE_SPLIT.finditer(extstr): + defext = ext.group(1) + # Return compress = 15 when get `permessage-deflate` + if not defext: + compress = 15 + break + match = _WS_EXT_RE.match(defext) + if match: + compress = 15 + if isserver: + # Server never fail to detect compress handshake. + # Server does not need to send max wbit to client + if match.group(4): + compress = int(match.group(4)) + # Group3 must match if group4 matches + # Compress wbit 8 does not support in zlib + # If compress level not support, + # CONTINUE to next extension + if compress > 15 or compress < 9: + compress = 0 + continue + if match.group(1): + notakeover = True + # Ignore regex group 5 & 6 for client_max_window_bits + break + else: + if match.group(6): + compress = int(match.group(6)) + # Group5 must match if group6 matches + # Compress wbit 8 does not support in zlib + # If compress level not support, + # FAIL the parse progress + if compress > 15 or compress < 9: + raise WSHandshakeError("Invalid window size") + if match.group(2): + notakeover = True + # Ignore regex group 5 & 6 for client_max_window_bits + break + # Return Fail if client side and not match + elif not isserver: + raise WSHandshakeError("Extension for deflate not supported" + ext.group(1)) + + return compress, notakeover + + +def ws_ext_gen( + compress: int = 15, isserver: bool = False, server_notakeover: bool = False +) -> str: + # client_notakeover=False not used for server + # compress wbit 8 does not support in zlib + if compress < 9 or compress > 15: + raise ValueError( + "Compress wbits must between 9 and 15, zlib does not support wbits=8" + ) + enabledext = ["permessage-deflate"] + if not isserver: + enabledext.append("client_max_window_bits") + + if compress < 15: + enabledext.append("server_max_window_bits=" + str(compress)) + if server_notakeover: + enabledext.append("server_no_context_takeover") + # if client_notakeover: + # enabledext.append('client_no_context_takeover') + return "; ".join(enabledext) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/mask.cpython-312-x86_64-linux-gnu.so b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/mask.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..3fdd1844a119c3fc75bbb4c063bed9643520b286 GIT binary patch literal 263512 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

    CI?z#rRJ0cevv8q?vj*=>+}}hP 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 W;wQ9kx>NE$`MssC3Iu{?_J0BWCeQ-_ literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/mask.pxd b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/mask.pxd new file mode 100644 index 0000000..90983de --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/mask.pxd @@ -0,0 +1,3 @@ +"""Cython declarations for websocket masking.""" + +cpdef void _websocket_mask_cython(bytes mask, bytearray data) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/mask.pyx b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/mask.pyx new file mode 100644 index 0000000..2d956c8 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/mask.pyx @@ -0,0 +1,48 @@ +from cpython cimport PyBytes_AsString + + +#from cpython cimport PyByteArray_AsString # cython still not exports that +cdef extern from "Python.h": + char* PyByteArray_AsString(bytearray ba) except NULL + +from libc.stdint cimport uint32_t, uint64_t, uintmax_t + + +cpdef void _websocket_mask_cython(bytes mask, bytearray data): + """Note, this function mutates its `data` argument + """ + cdef: + Py_ssize_t data_len, i + # bit operations on signed integers are implementation-specific + unsigned char * in_buf + const unsigned char * mask_buf + uint32_t uint32_msk + uint64_t uint64_msk + + assert len(mask) == 4 + + data_len = len(data) + in_buf = PyByteArray_AsString(data) + mask_buf = PyBytes_AsString(mask) + uint32_msk = (mask_buf)[0] + + # TODO: align in_data ptr to achieve even faster speeds + # does it need in python ?! malloc() always aligns to sizeof(long) bytes + + if sizeof(size_t) >= 8: + uint64_msk = uint32_msk + uint64_msk = (uint64_msk << 32) | uint32_msk + + while data_len >= 8: + (in_buf)[0] ^= uint64_msk + in_buf += 8 + data_len -= 8 + + + while data_len >= 4: + (in_buf)[0] ^= uint32_msk + in_buf += 4 + data_len -= 4 + + for i in range(0, data_len): + in_buf[i] ^= mask_buf[i] diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/models.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/models.py new file mode 100644 index 0000000..7e89b96 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/models.py @@ -0,0 +1,84 @@ +"""Models for WebSocket protocol versions 13 and 8.""" + +import json +from enum import IntEnum +from typing import Any, Callable, Final, NamedTuple, Optional, cast + +WS_DEFLATE_TRAILING: Final[bytes] = bytes([0x00, 0x00, 0xFF, 0xFF]) + + +class WSCloseCode(IntEnum): + OK = 1000 + GOING_AWAY = 1001 + PROTOCOL_ERROR = 1002 + UNSUPPORTED_DATA = 1003 + ABNORMAL_CLOSURE = 1006 + INVALID_TEXT = 1007 + POLICY_VIOLATION = 1008 + MESSAGE_TOO_BIG = 1009 + MANDATORY_EXTENSION = 1010 + INTERNAL_ERROR = 1011 + SERVICE_RESTART = 1012 + TRY_AGAIN_LATER = 1013 + BAD_GATEWAY = 1014 + + +class WSMsgType(IntEnum): + # websocket spec types + CONTINUATION = 0x0 + TEXT = 0x1 + BINARY = 0x2 + PING = 0x9 + PONG = 0xA + CLOSE = 0x8 + + # aiohttp specific types + CLOSING = 0x100 + CLOSED = 0x101 + ERROR = 0x102 + + text = TEXT + binary = BINARY + ping = PING + pong = PONG + close = CLOSE + closing = CLOSING + closed = CLOSED + error = ERROR + + +class WSMessage(NamedTuple): + type: WSMsgType + # To type correctly, this would need some kind of tagged union for each type. + data: Any + extra: Optional[str] + + def json(self, *, loads: Callable[[Any], Any] = json.loads) -> Any: + """Return parsed JSON data. + + .. versionadded:: 0.22 + """ + return loads(self.data) + + +# Constructing the tuple directly to avoid the overhead of +# the lambda and arg processing since NamedTuples are constructed +# with a run time built lambda +# https://github.com/python/cpython/blob/d83fcf8371f2f33c7797bc8f5423a8bca8c46e5c/Lib/collections/__init__.py#L441 +WS_CLOSED_MESSAGE = tuple.__new__(WSMessage, (WSMsgType.CLOSED, None, None)) +WS_CLOSING_MESSAGE = tuple.__new__(WSMessage, (WSMsgType.CLOSING, None, None)) + + +class WebSocketError(Exception): + """WebSocket protocol parser error.""" + + def __init__(self, code: int, message: str) -> None: + self.code = code + super().__init__(code, message) + + def __str__(self) -> str: + return cast(str, self.args[1]) + + +class WSHandshakeError(Exception): + """WebSocket protocol handshake error.""" diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/reader.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/reader.py new file mode 100644 index 0000000..23f3226 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/reader.py @@ -0,0 +1,31 @@ +"""Reader for WebSocket protocol versions 13 and 8.""" + +from typing import TYPE_CHECKING + +from ..helpers import NO_EXTENSIONS + +if TYPE_CHECKING or NO_EXTENSIONS: # pragma: no cover + from .reader_py import ( + WebSocketDataQueue as WebSocketDataQueuePython, + WebSocketReader as WebSocketReaderPython, + ) + + WebSocketReader = WebSocketReaderPython + WebSocketDataQueue = WebSocketDataQueuePython +else: + try: + from .reader_c import ( # type: ignore[import-not-found] + WebSocketDataQueue as WebSocketDataQueueCython, + WebSocketReader as WebSocketReaderCython, + ) + + WebSocketReader = WebSocketReaderCython + WebSocketDataQueue = WebSocketDataQueueCython + except ImportError: # pragma: no cover + from .reader_py import ( + WebSocketDataQueue as WebSocketDataQueuePython, + WebSocketReader as WebSocketReaderPython, + ) + + WebSocketReader = WebSocketReaderPython + WebSocketDataQueue = WebSocketDataQueuePython diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/reader_c.cpython-312-x86_64-linux-gnu.so b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/reader_c.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..e12a92da4ee7893203012fdf39f1c493f1d7658a GIT binary patch literal 1822128 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%0DF5vZ3 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

    H>xy)@p?i(K5 zY{=7ETvWO_p&*Yb2nstyCLh^4O!1_NYf@P zcKpATc6%U~F}dX>w<*p^d8ut;{mjius-oYL%MYM?-d9uUm2C`KJZ>nSt>}6yA4#GO z;f2hLnwghoTSIqcjF(As>^Qnurnh-XD4)*3oR3R$J{WaFS={9Q$J zlhQR`Ua_u zUBuQjZ(~hw5`Jqkt<*NXxO8ND0=jvA(_1iW>*iS@%QR=|^DN6FmT7_4MBk2iHJev` z`#~RG=g#X?`1&eM&c}S+dP-cFqZE@mc+WjgC5q|%`=1eh;TrYVJ4-QN6~DsOB4|dS}HCvY|p4D;BqO)Knn82AlY>V~Xh&W_=iS(0>6 zQ2FY#po+i~vr_q1v8PbDa!(x=uG~{xqMDFRM=Q=pHJqv)47$5cHM2st#D$D5l^(gy~w8CRxBnptI%HdLsF88Fy~pvucvXiTO?!|=0P}}TBE8uRuXcWgCd_%X>o$)L3Uf&FL`v>)H=6pG<);3R@wZpz zi`43zTK<>iCQ@8sPH;($4ho&yZDY695wAKqF6X;n-R{SyFz;N5NV(@i#L6#7UBt^d z7m}LCiA$IhS4=9Zg+zqz50vKA!Y%L@@!HARXU~oFRI{e(6NBCD@}45{Y+bU}G$;Rb zqqSb$lChR~H(&Xtl{j^&mtK#mG{8E|`4U=sJMbQsUx8^s)Xr)ie!SQki{QWSo-KW-_ zuQ*(GSGPYyhX>1?ySmsit+F-EJC)OaH%MMr2`-vsdMHEfcQf%KSeCQ$k(c8%CV7F2+DRt99U_*jsivr3}(YHXV zbN^Od_g|Kbo~%pBNiZ%6ayik8bZRlFDv?4~v1kXX38X86Qbejs9_FCdWZrr1m%Nxd z#kz8~W!3VnwtGCj1-=V@0$P6ky?$gfa7%D|gFDinXwd43HvnD}IMm=U`nMbWn7+{J z%We;N`+)l!Jdpk*gP+s?0<`+FJDB5#fujr_P5)klR!_WR;kAON8a$o;WP?^uyffjQ z4UPpLF=*|@y8zzh;8oxg2CaSH`~1jS;JV;O1~;L9u|caR-lp)j0CzChK>u=s&(jxL zec26!*9`7za0vbJ24AB83TX9Zw;RXz1cw{^6a8xqT0QX&fHwjhY4Aw;6AW5C@s5Ib z9C#9VlR;}Q-l_1;1pfj~G-&PHIR0O7!TUX^pnXbfHh!ua6WJaa13}En3$h>#y1DI2mb^n=4bN<{lM1XcHoZS0B|s9%#+Cv z`H|N><``qTKgu(cLIlkdl&HcV|;(`Q1GY%{zS%~ z1z$Eeo&GzZjqh&8?*$(L=eC}7t^e=vx8xLmWJPc_(DJJouLb7==hR+0*54rXTfhtdxE{EdPZN+^0$JwEjVy4*-OXzQ(R}@M{(5`#CHI^ zgTW)gIklILjZeCN$B*J_D2VS|c;|zcgL7&x9UGr?pTzTU#WfQ@ifcweeAD5*3BC``sl9Y; ze9~Q-ctTwNvP|DE!K(r11?SXWI@YUnH^WatT)hh7`yITMz%{`+wU>^KPrCc!M{)Ho zi0_Z^b^x2fIklILjZeCx@uRr<7Q{CK-eKS|;GEh^$Hph!+we0L)Ol?A*KoX2{$I%R zHgMt-UU4#L^)G^VDR}iKLB~To9a7d+FHtq`MV{00$ag3wU>_d*F>H621kG+ z3+gxU0IzT`cqn)a_#pT&X#L%9c(2ia3;YoL9Q+2H3H|`Cc%W7G{r-&CgIj=u3;0(u z{#Wn@@Sg?z?GN&Pggeo{60}i0{G=bLdCFrg*b|%|>;+o;y%|3mJRWQ<;J?85`{2jm zi~{}^PkWC$fxCjkKpW41F7h9MzsWORsUF-C+y-m_tv}fbyJ~+3x?{k};KK#}UOd=G zFdcjwd>^#&-8jOJ+ydSKJ_cI;v}t}s_yYY`K+FG#@tNSy-~!KDrtcT=YYX^GFup1{ z0z4fY1KtQ)ulq1AyNUD%J!hG|uj6g-7KPUvTp8S|))E^ar4`yU}}*zOBcvkMJWWf~SCEK+7-Uoe%$F@a8Vs z7y0XPq>o@ea0#$CxGJ~-XyeuRh8*7t+`fRX@c|s)6WqUm-|(XMxDz-GJOZ@wjA48% zcma5M0l)7{Ug0QkJU9WI2DX9L-)4-@uKkwS?+bS3Z>KKurCSuA&8PV&KQaUy16~bU z{thqukwFFr(?1A26g(9?6YQ#<3}y}$#&5#UJhXz&E^Wbh2|Y;Y`i zA$S=$9{ekK19&rd8#oEP7km($0;;~Y9;Z^*OTaT;_l(itb>LL6$o|Yu?4@JvCt~*u zI327n@F%|TcKDOP1iM9M*WLu!jLx6H8Q@O^`t@&k0paHKw+07*lfjGM^!&#_<38C1 z-c1$qPk}cUoY;xJc;k(}>}))3@ZJGG1sjc@>GWrSwQW|(_rJrwVK(iT$8PNcd+Sxa zP2qPIUoYYoE<=A=(CUk~l;N#RzaHEI9ADc(By8!VhuC{{sz9OD)z@Nc6wU>^KPrChxM{#{r5Z@AvF9r4i z=hR+0Ha_V#;b)k^-RX}2t^G!f*MnPwb6Zck*8jQh`jJP$Hn979mg)Ofb9^$Gz$@af z&hbBj!wl|4{{YZ>U6=9Mwg3Gb+E2j#39t>E0or))>>~f4UF0wSzW2BR*b0sTZ9FS? zkuTi=M)%SJ{Y@CJlrP>s*o`oFIQ=8Rqd?_p^K0h#+|qjhz3Jcw;7ri^f2@oAC%ees z#$AQ;^%G2g|G{@(b-U6R^537Rx!L32-fAKEzf89m? zRQNB0AAsM3Hl7VW^&|U&BfulT6TwqKYkw)@*Be~qbIdUgXp{nT6@c{ z|ICjFx1_%5l@B1zW-M!13S>;4R=C;6302;3MEv@G0;)@Fnmyunl|{{0RIE z{0f{2{sfk&TOHUFRK0C|&gb|=;APb_?-cyl2pt&SL0Vz3J#k??mj1^os1? zL`U|gpkw*+^A-Fbz;5u*H)!p}>uq?~(pTO|LB8|Cll>+1yK27xcCx>mzKvIY`fz+r zaDDJra1vOYpjC{{T9&uPN{+KhMK|4SXM51Uump-}{J#Hh$S9 z)Jb;Bp)(C^1EupjbgkYe#38+3VOOMAWdAujvi~(YmM=fm#NQKK99$JUp|uyUuiyO3wW{BDPx?6<+L ztM)shBm3`2FxDUdAzg4|v-TzQR*LTknZo{XC&4ZMM11N9mYTKxmzod))WC+tUmJ#bS{x^^B;C$7;2@f|vc{%rh{@gsbM z{?r2h?=#-OpFbT2wt|xk-b?=h@L_NoXyaL$@gjZ8m){$V?#u%Hq*U?}U=6qu*uUBz z-x{?3=7ZM@Tw*TSOUL?CTsz=LaSbkrZ!LK1fE$5xYA+odpL7qykK!6$5Z_Mlb^-SQ z=hR+0Ha_WIj331{svy2&;hg}U4$i5)bZmUmy$?T%>x_c*ngZS`c4LOpd$6}{AUM`4dIJ`>v;$4rObU!H2KM!7| zeDR*cPP#J-^zVmPDPO#wu#;|84c9d@!5_k_lrP?Ih<8PBwSxHT7@r4R5S&wc>6mnq zUy7Jz6Pjx{zTu#Bi^PQ7th9X6vq|MJr(LHpRU@kZT#I-;7@U@p7L`te4*;8xGSxv z^fxzpr_r~1w!UA&`v&aY&94)o<=58v(;z@NbCdGHSw z`R`-&&NX^p8@*lydh??rRD43~UwK@PT|aau6zI3YI~5!Y%HHbtB5u|HobJ9JGeOH2 zPx1DK*IK|=-LJyW1h7qglg~}`ZwK!I9{_DUPci-+_#(Ja51&T^I1IG*Rg724?+1TN zaH7Fm=-&?B1x^O7{{tDn2D}!$9=s8hAL&eI-0B_6__?6?j~4Jx>>^*fmBuT-(+d1| zRnO-88M-sUX+8bC3oSq4_~u~$c|E@gwERQhJq(VAH?e?!6})>YodQPcVn;t{1EKBfIq$;co29DXyaei z=rtL8%P;aLyUzR_fxn}{Q^3+eFwZv>TJeL+6A!FvwuEFSURfiK;L0)5qeQ~1KI z=%0t()dlub82?bmd-?f#5&Q_82`;>#KYj;j>yyBnAFPMBZ2^B_c%AvPIz|3hMsG4$ z6#ptFu7UJhz#{#f=1||(>n~l@v-Ve3Xuo7Z{Z*$&(GhAstiNgKEW40j2P=WAfR_I) z{O`b@!P)};{ESzszjznkO8HF%{G%EF52(2JDTse8 zyuTU#h6VhKy2zLA6zrtCO@aPIc$M)unukomq1tR!p_&#UF6>d z|1t0bQ0vg@kHEk1c>1Rm<0 z*;#$X-Ot2*M?w7CFn%6*5qLTHC^!SGU)c7ZdIyPU`X>t76I$8dY@VfuX*L4YSTW~PAJ2(Pda4FBXdcRu2k1q}W4x9)| zZwNZpeoJ`Uf&;-;(DHX;d>3$!+2qU4>MQQa=>C?tRiDZ9CoSpoo(>k($Lg&JU-sYA zuPLan?C&6+(~W&m{Nj)4guf=ohk~8OBmO$@H|nDOX7INFx1US)(y{f>e5vl5FPrDQ z1@)i7e9x}^*K^6f2X#{XGw9oV#Z$cERhsW2=*nK}vZy{fPaa`?>O9x}VdHxmUY$9Q zCKu%MTo?HtbdmpM7x~%`FCzYFW?pQ*Yp|}~0cU`J__g0ZwgR^U2ZPUm&x0?6ZQyxJ z=kLdVKz}Q+0c-=MzdJfM-u>Vm2#y5DgO-0Z{^Y+X zAMtnUgs*shB(GZd%YvQdC;P8w)4m6O<^vb)qW>a$>Dc;co^^g{o$7qDe9e2&`K5VK zovi&~%-gkKZ|c+sTpsKTZVhVP+4I=ykD5dMBE7TGRXjTpm*tCBX@1gCepYX67xS_9 zH?e-M`z`w?IRCP~-y2*X+!{QuPyYUR2YP!I==C*vd(*!Qyc>KFoCX&8dmMjHfiHps z@GpPspkwp@9R63}4`6TXEk9wr8te&nl`lK1uegVy`yi8)m`&$?GIy~t_5{I_n}_PgE~)ieruiC^U&&#nnV2}y|d9(JUbDm<%?Hoe$r8X zR&Q(<^Rf2#vVI;0r+~wj^ZRB0-+9~)yl5rgp8&oFz71Oa7tz}oy{_6{gWWCQ-Qd08 z%f$7b!H?;G1%3m*yn>JaLvZ+tzJCOGJa{5#^LYrrOD^y2zC>pw`1gbFgCnTRSq1g^ zH+r9fKclw{_Ai64gEpR5jD0tFUA3Q%j_i9B_*0xE@}C0F#;N>myq(!wzWk`(%FEVU zaaj90;+$Q3+1c}8N7mCY=4+~12U=HmQ6IZ5)@42DJi5PNee@;%Ye4zi4}Vs_Grbjw zyC@%9za#N;DR@12GZ^vFKO39~J_@Q%(>k#~#@OFZ-};lEt2q8VsC{8DepEO4)jlw% zde;6&{4avv)0zLVpyqv3voC00EYkZ0UFn@=^wuv}KZ;{T;!zx0H;Q9-?6nTHuiJQ} zx46-}fOw?0xzT&DAU?&Vc~TtOH?9BbmHock1Ked*-`^Xw{6*od1dd zpm>uD_~H$NzZbYaX!SLIC&yn#_k#lcOW^&zLcVn0gFgmc`O-ZQzUnfAzSS4+IF4(cgpV-(82AjRx=UAiY)0M<1^LgZKO4X5 z{A>IPS2l5IomXlv9m_ug-Q&O$z%#%r!Rx?(fb*>8&zq;fbJy_w$!mH1FSzj9zW)Na zZ$IBZ7+iTB-=6^{{e6E4(8l{of&b(2e=;~4oZJ4tAm0rN^t+nRf6@CH?76zn-|F|J zezqRszl+@h#8s*Ng4itv4g~iD4+KYm)_*JG*8j@Hu{yY>saH`xr=oW~I1zja)O;4% zEB_+@Hh$@7eRg&JWWOHsBb;5mVd#tkj|E%7v7q#AK5KXJeA>5*`~%=00*>vXz4-TF zr}MqG;C$CQK8p2Y_Ya%Dct!hxg@nudIuQ2vu0Co0Cv(ln7;JRrf>7Rnt9oQ{a)+R&eP}Y_wzFEI?q;H*Y9^)2io^v zDOeBkcO8Cj2JZrGeA5{JH~1#FRA2A+DB?N|R6N@f*WTbL@O0w3q9DE^fAVYN`=FC} ztbc3&GxiqeB|pnwj`0-@9!~#L_LuFbhw3nl{53ze4n^}-e2d_BU2qC@F4AAM zi~OSa<;TV&em!v<3LXb)9Xv?i+Mh^W$AZrh@0+0Ii+2J1OTeo@%l|9mcY{;Wl^@F& zZ!-KR!I!|-z}G>Y&qAvw-WTv+Vg0-V>ON2BS&@C4v7e5;<;%}k@V^Cr20y?~>)6^? zt?AGE#lZWim+EHuzlFCAsC{5M=fh3w&ANYC`{UqM%0C7E%|`!A`7sW5A+CME{lIac z)|vL-U!${EfnFFy5kD;`@!29l&-FKCcUJQ^|urFXYg`R^Q62gwU>_NzsI`L zI#3>A9UFu0ivrG6~R@(H9+YJt-W}gz~2kp9~=cL zo+A6TjQzg!Enj{%TxiA`L*_aHt=;D^?Q$Fz^}mJ8~XA6!2`h~L94eidadAi zbZ!PMU%Zpxp9Y={TE50@yz*1TKOen`;64TMXuMMW|DZFw^-8GY{9rF|y@L8)!}!q6 z{JcyAM{Vx=|GveDSQGf1_jdUuS$K_#;@_ zXx6w!6vX$9u~!~N{31W|;Lpal0^^&3TY%ewnvZGBi?y#e_MP#I{0v0L>Oao-)8Gr> zD+TqK91 zSl%YsZEMi_v+-})317OFHvl`UuW^gb1^nF@|C7N(3iuiq9s%$8PWYB5{z=%KSzv!1 zTjPmP@zr`j#|6Rc`#HBdxdJ^wY_^t3|SHwTKLjEK0gj4B11zPU=+_x{g9$_fPk8AGI*+UAP$ir9c~x z^e3P%y$R@9zT$Wbeu#s36qn)<%CFGs^+Bgd&+^6F3A_II zR~+&qwDy0%uE^f<#XA(c74av(@*}kNE!Y*=TfTVbVRtcj9k>Mk6^Hx^t=`etRjOz0 zi|igiw>$ADF2y0VdVj;N$lmhBdl|c#oTu_@`H#S>lrP>l*nNP${8;_B;8n^OZ$b9y zm(iCWtN#P~mGZCWx+1)h{yz$?H$}X=3i!`4{u1~asOy@Izlc}FAItu912_@9AGG?{ zcagvG)_&jK9h?UC+{TYv{Z$#i0-OL&1N(04?Y0K3{d(|@11A^QOUK&p0srsf!p`!SV!YCL#2bU%jO}L4qnb7*h<$>fh>1 zZ!-E;?@h+-Jm|c#{14!N0?ssO`GvfK`JRvQO5?c@{uSUj@J4V7_%!$uxaA;>KlJ_SAt{u{LOp?X;V9}&lA;1{6k zRTR$_@b(2qfEQJ0ul$Sr+xQhnFX}BUT7UKM27@i&Fz_Jo7SQ_pmhm6KwOHpx{&aj7 zco&0L6r3O3S?@*b-^Ozv=kJ5&eAanw`NKKS4`}l1a{}kP&O@DN_B`*+d3`H54SWmK zy0HF^#NVGm?Hkj`)AIib?-}rQc<&eR#d{I{tKj>f)z|pyjXr{afHY3QG5z0)6qO!har|4z_`BgIYgA>tDQY z;UA0N)4_R(UwIVSzh~@ED2QKvzK6dU>;5<3HP~srTYt;LTOX_wj|MLR z7u(YxxAFag|2q6wwEP9&brx@%c*OYuIE{E$GV$%UhmWtCIE&(4Rk~nNy{!L9#(!xp z`&S&cUK-z&cy|Ep{B||oTZ!NLt5pBoPU_K_{vh($6&w!U2|f-!1x^EPyjssTp7&WN zAA_HPTF*uCtwUaa1RKEsS0om_K2q_Puxa=ShEXBXCo2NAMuf z#yghrO8q@KoBU_7`?8Dn;xB3TgYE_U*MjVeM}XRAK4!kPKWbjJKkh;OZ5?dAbo?*G z^C&nCd=>l|wDu1WR~z^)m=K@kKVtYFRmgt~p7@{2&N$F@V_D88dz~=!B=F$d>x|{E z0Iwe00vu7H{i?=(huO4W13TFdpl{>-1M8}7Z+~9R0FU06>*a8dgTY~7-#_{BdT_l1 z;Ts3iABG?4_u40)e?7cg4c<-P$R`@NcwYhkCC1+}_+bHG;}$%L2Z}&*Hf1-b(!&_Ve+M2hU(WF9vPAJE3!;(HnwZXZG^{+Y0#y z!7GZ_#%K9^nf!|QvOA*_{!`@rEciP36=?N~__DKn>CDS{sCk)4Tt)nOD&#K=ZzE9i z{4Vpo)d8#rum|V$^5Du~(fNJ_I&(|!TJ)Ya@tsF}oyDVk23N=*NnM1a=pP5#`WNv| zE#P0lxNtoEYdhhKHv!(n0=~wDx5Jy%3E%Sm1%Df^1KWd5;Ba$&n9p1%biH_+@t?sq z)^RW9Q`ZsU$&70sxpaTlBX}G0_yTC>qbTp$&F6zo;-B4kG#^FvRh{Mk6H~u;sH6Pf zRZtJ*t?RqyP1kqLTW|C=Z$iymFZ^kqgqnxxv+3W?-)~u0!sY0%r1fSDig;@l@KtZ2 z*7bk_zUop>eRThGIQ>@e46rwK>TlNh60BCO;5y)@p!V6%=zj&)a=j?Jj@W!Ui_gYWWWONsE5F@MK1&gw zwJ)02OR1~Q13S;Uk5Zk5x>3lZOYpz8XQsq5U1|Nm6Hqo}XW zqtWzr9&O0_SA3hBdR|N2RL|E;J%6Ha>!o?s`J(%*srb`83N?@W;(rGC3s{36tz*rz zu(R_>^DNZ)Bh-DE(B?DFoc}hT&f@JXz9N6u;8*@`qki)D74@<9yC3AQ?|Xx-hx@+J z^3R8N9XQ3Hd9{5gT39G*L(a1wESjxyMu=twEVj`F1(-q zL!jk<&G-=`d>k`R^!NkV{UqP-362@<`;)*i=llMZ;CS#F@NeMlp!L5Nem4ZS0Cxt* z8-GRi>lyp4>07>Z59GM=ksr&y72Xrz=g0YcdmZoblhZwRJHz9!vpkLfSG?Hw`+~b( z>ic_w_b~4d6wH5T{=ewNzx7v?-<>AEugFvS|HY5BU*`~?&o*GI)&*$!JHu-McL({xzWGi?+f3p zOai69aY1|!!g~o6?~et1@n*mmPx0G$x{>G7pm=*1=)VB(M{pYF@e82U?>W-fYcX(H zgO)#zzIe=p-ZAL0E>zQ|)6xbqdhe>iv=cpmuD&HnhC;9KBl;NtiC<4c0p z{}T9J6P#xJTmA;{8ce*hv;14&t$L)7V{LFlaK&@|_>;HTh#8~yRaz}Ii{{l0g4 zTnF3$yyreY{up@B1HOL~csDo&Y?|zkp9gOFknisc+I*fRpU*(WcM$Ov@n!b{cCUa% ze9J51YrN8U1{3El;BH`1{72mG>v0x%26Y<;+W4=5*Y6H*cMLq)+4@`iAFyAfz~1tg zg0}|Pnf@Q(?F=dptq-feKfFrUo3(!x`_DkTJ}rMF>u_|1>rwnOE96h&yt@y4415B# z@x06Up`-kKu5z`eUzA2vi+) zA1*xaZ@!)rKwH1A#xpN*R2omE{$HjZ%716_m%jx}{tJ`0&1b2je7;MA%Yv(cmcJI` z>w>=rcL(Qy=9`yZ%KpWrF#P=bn_}Yli^1p=FlYGQeK9;Y%FNLq? z(9_Z1fag#>C$2iq$GbDQ{RH3N4eW83?=K8mf4|4ivBuwU{B>sEXzV-V%a8KwEPfkr zk^S1_FD$A@XL|k7sR#c6R;qUb^-z9xKCJ(fsdLf%cE;c0Qa`_151sM1>4ZOl`0oY3 zyTt3)VQ2L}fw#;to;PER$AtTT%U=OrJ-EHQhqIn}F2XKv|jf!?1?e9MrZQ2BS3?~x`xTQ6ImqmkNj5TIdC&j&xN1Sf0X;?d6?%V9`bRn z0or`7B%i6^Q{XgE@xM+U*8bj3>@EK-_Ec>PwMbN&nV`m-PJ z4O)M)7oLya#h~Ti!MJddPV~jI@wE}3)nAG{`Wal0e(zI#KK(&!FWx5bHwSkBEq^D* zcL(<+&T-5CY?AHx%VN&g$r>aTR7uje&juQPpLpKIy4u8RBS zZeR~^A#gd+>hFQ>F<@__Z~5Y#YvPfekIOx-2(ANKy(6#_ z9!38=uu}eU1^g!%e-UgmX!U!Z?Bf>BPk&*sh;MmI74S7KTo&F61^itZe;1s{e9i!0 zt}8v+e^pn#N3{HUc!z+!$N2Tq7qt8{;GG4Y16~SR z{u_)7-=+Uy0l)4v?_b!H{sN%Y@5lI!;6(6I@Nw`3@IT-T@NcY>M+?@=!SK!iCw0O< z7oOsgzU*xLibHr1b^kLs5u5}*3{D00xni%ezHTk!X2tn#^8H_d%Y!R|Hl7jaR_cFt z_2uU%{2d2MZ^452ex$yO^1gi{?}c9mXWrxU725nt*cI7ZzIdx+CqFarXZcIQtCTO^ zcGyW*_k~u!KfFr$;_Z#y2;y!nh<^aQO8MfQjGc7H6zCreuTs8vS79gJ@df&4!>g1p z-aXh!cVdD5b?_?XYu^^`$v!?D90`sB?R+1}{red3B=-Gt3ikhp;q@Es&w~R&eXmK^ z4e4BVo#$N--VELX-UUtu9|vCqZM;9?e_tx6H4@@Mt0 zMdxPlE^r!nBhNjmN0I#v#$G!2GX4N)?d9hkj;sFiYx!Tp>;4x%Z+cI<|CPRP`KQ4f z2cFHmj4PO*PvF&_n>i32B82Byt6F5KDE!{W0f{xYgbB*`2F5mar4BQgj z4jc&X3ho6S0^0ZvC5}IX%41&qS-yBz!52^QS^kai?gwptmj430k3sDdZx`$r2XNnV zDk$E!1^hM7^L5-7)c2@PztNA|c*Gk9U%V>|_@m+VIp6DT1?~tA1e?HN;GW<}@OV&u zUc_JB-Cp-M;Bw$fppE}&;&~sG-mL}ki}w?J@g6VWi?<;0il=yOJZr*JUGzPJJN}km z|7q}hU*M1Hyu7pE{QNikm%%oJHXiX_GrSMzTmF9;uQVR<=czFMDe&F|M_%vqJ{`32 zta_n8z6E&P4ZeR4X!#@Hb>sa_J=g$_z|QLEd%Zv3<@J+E9;?7b!KJ|7p!I(%{+|F9 z=QRcKiuWJ*;wc`h{}H^OL7R`|FG}94fL|$&g7v=EB|h(i!TI4YFFWI)aW?sbu^Td% z?4@JEOLQNo_a;A)w?4oc8a#=)1f$^RC+ALo+&FX))? zlD)_K^W!K`-<$vRZuSjh&<5{oaKb&F_c&LY}OU z^4l4IDEvLaeLx$pbkF9v;ya}vo(tjK2#TkCto{^u)4|$*`uga57nVPo`?|k^1BgR$ zS^jGk!!B+LI9Ue9YiZ+>uju-E;5yaCkr%FlSnk6S(Qd&3u2YQHje{lN9W zuG+6*?4`3IrDT?34T6x-=uv_`@W6;mD%Kfi{1a%+~UsLY%|eOtY`)s_Nb`XFg6C;7`yMN z!*8Fnzw74SmF&6q2HyAozkcM&dCs%eUVH6&&OIkd*R5c_43#*>W{-NYb)7{ADypL|6%8ktHEo*o52sj??G)p8-6ZWsZi@hSE_V%9BX|& zyu_C%9?_qV-9=l;Ui|3z8n~_&Y~*;Q<9fRV{vGf=(LHY4p#f|Jb$MdHu8Z~`VfRn) z%M{CZ*+>28fT>3xa1mJVs9zrZ6j1Vz_JqyPTJY5;?XfOy1$MWAO$xRC5zaS*FDTS{ zIsY~~i6@hICV(@+8qgK*2I?dB%M$26M1M58M0$x+@+WbfioKx3sq6b8^%VOsb}qf> z@`-af_yDN=i~a!4uS}qy$NAqYowS4Yzs*y&pY#ItSCE&H--(=VHGI)bWe16@5Lr28UjB60i6byC<>J@eg#w|0Cu0#7_Hr z+2OB;!{09n{JqsheRjcuQSJ}mE|edloU!1x z_;L9YeXk_-yHn1Cs=m)sZ>jHF3F^C&dVT>)oVvbJUOMF+@_$_Z0Ls(lOB_00;p?%J z_AaEJS}!`ur}PKOk4t|w{uAk?Jr>d)XMxf_iSjRTt){#+;5ty+{YBdURq!iN%8~vr z_0s+Q74p-n`h~8)D;|l<6_3Ov@oXRu63?BE_K|VDk@{{{xD)l`#$*5`5mg_*X^YB6I0aZr>H-e`RfqS1LuG`p4;H>23LXGy=dpt zrk5->gP~XKaXP5|t;b&QZH~VJJNQ!$#7pGhemGy4*j! zVfn~alGTeYnt%LDIokgm{3ok_9DgP2Z2qO+{6hbc_FF_dK12I`1KvyfwSm%p zcRSke%M{Dg^*e|-UGZxDtB&|Cam05!{_g>$91A9P27 zqWir=e;m33P;|>3`cu(WgJaQ2J;ZKB0(MLuWhyTOjlZ{{Wqp?d=U%5_sgMHuz@JnzS?NaP$pI^|`x7c}7_W7@~-_KzGCi{M! z@4c}T9GawFm)A^r+W+nN{}J@K?h(}bz3_7cDD{?ot=5Z9t}DjlU+_;HKMa1rc=-wZ z4|sqhzuNz;Tj)>hZ&&ebBo19aX~$2=hr~JD5wFx+Q1W~O<;gs8FXg=fN?v4K%5{N` zNBg@P`z`fXN_^t)S{2`09P4;=J*AyL!=Kg*zc>9{?^CpXdvvMldtlddE7^-59p4(( z^=H8M!9nlZ`Cuq`8aNyL3C!GJbx(nd-m}NAfjhL?w8dcqWD_3 zQhWoqQhB!}nGaWa(hfQw!jB}*6G7cxIvqU1s`swIPL9O2tU9x&<_fN2sc~;`m{+~nlHrNU#Yu~bk_Mg)(KPc?=fn5(G z|Fn2BSpSJVZUA+CmZYe^Bt?B6;yMUy{>aAD0_u1~cNqF3z%gJG<$nZ9y&4_$Tb-i5 zB}Ki&wLs#dUQ$n8zq8R@1#a4C^YJ67^`g5L{f*##;E%*Rbd&X??H@$wM@4t@cSqnz^{<$Z;2`wwkAQcizId7|41eJ}7pa5?3ybCh>1x=EmvGtg0<=nBx! z0IR@s`q2!q?K4}CUqGF&!&B5}r>L(XuHS-Eui=jRiSAoHL3HO^5#(LI5FE%+W7`qb8AI4Jen!%@GUDe4bMQU4)v{Q#yj{xTfn zU35Q7eV9-70P`q+87TESz)`2vPI0clr);r3ZgYGO)@^~Tnly*Me(cY(`OI9CAQ7>_QO?(ey z-wet=L*~(R>Y3-L?+W}p25Nhi-jL{CMKAs{@SmBWJh5M+?Du!XC*^#CUYDceyOcbv z08e9{E(H72Z)F{oek&;bqSXEaY#FfUs<Z$#YqTl9% zMc|#_z2FA$190gVcKrVcF8r509{;7q+raO@m%g&RE`JgJ&UT>IFGH6ozQU~(-^#62 z-kC|}!&RQNgU*NWtBLbjP`6j2eCYUkwRPTJ$@-tF`a`Pz*HMo*9rf7+e+=!M3r+y@ zK%Fn?uR6YB+Gj3!x@s?1K7OH`-Kg&Xa4abO-(@f3#Z|tJU;G?M`v^M67rF-UN^m)N z3-~0c%iDu-I{=&ly2_LD3(!3VJ^^a~GLN*7N0~>?B7ePUhr>XbS3cud`@0iA&7j!# zb?8MW<%>?r)BZ*G5&lIt(&1m~aWnOixTRlc|L38*0$dIzYrkv@?O&&z-UZ(SH%a?_ zZRdp^;I7~T@GS6Z@LKTDZ>`;9U<;V`o#n3quLo}i_xZt|UjmN!AA4L2t^>aUkNUSg z{}lKM*!q*@5BS+){x24<0e|?9J=X0pg!qR$Q0ueMCCW$W8(Ur@m?%HP$j5Qu0&oa< z34^KT<2dRs`Ox*L-opAw`%3)(SMf5%9r+k zJ@MZRz7Bo@egU?D+FtsfF8^Tq*J0pbP`97^O?5Krr$_Et*0Me3d;I0NX>(Ky_m)NAoKqSHUBSR{;vmJ>%mOo@jxAq zjz3j>DSj^j6V*?bC+nlGugALgJopBv?L~Jh=Uc&lgTH{?$ltEukt(0FlFX-+Cn)88 zLOD9V2>b$2bP`{(`X3$s&w#%k6u*Lr>aWWeJ3*KIugRabm;K2LoF7A8CxdIi4?t}% zcKdK%`nTBq6W-O|Kcd`E!8_55y)MtCU+swRTm1G_@ku$_zw}G#$BFVP{Zhue^h+7< zF8{Zy_Sfwu{a^f@>Zsoltm}E;R4@Y8feoOJXDGbb&*E6@mn3OF44v4Y%CXp=$+0fq zwJ-ns_jdm(^XzY#e=h@X1XqGGFV$}4eS5O;-o|>N_4mO41AGE}$)R`YTG8u#=<;0l zuJXQ@LTu0O4~vzd!lT0Pj<%%tM2)%XHXl{Ze$7f>MsOx7J^aPVoI7Z9n=S zaBt!hyoO`JmpB$2%zjBQjd8m>SjYUb1iVsVqWEqgUg__;e@mQ_XNmJh6{qZbB~ICQ zN<1>p>v$5Cuk|l7-d+J;1J{FEzY+cu@H=n^+C%Db2lYwTUi@hNS@=B{{5^Oxn5x3qlmE10Z*si)Wp>UgAHf>JL*xen3y zNxo-)FZTteF>Ypnr-HgX@h2$PB_H8W>*c=9cI16~m4B_5aVY!ZMC*>We}M7)GWa_9 zrNUn^4pQ~MTKRul`TddOE%o1wAMw9|WAXnp$GZMIY_{`lPp~)mD{ug~FL*4N1&#r~ z2yGj%Y;XDPcCeTWmVzsGw7jlQE%7XMpw`!; zYXrA6{^7)30+xbOABlgz9yb2VsfVjR|4cET9m*$PTUws9qt2i3KNIJUw5zMVUGbeu zoZ7$3-@BC4Re!y(?+5M$P65MUDOe8b`0C+xJdvQ2R24%jT+|A}ajeaWqXdvw(^Y2>b ztx`vQPQz~rSgFd>@woJ7VyE>IZ{H;2)%Ftq57grj>M<0|1WO$CYb34@!3c4@0B%%q z$@(REJce>54#}hR6CLk;l=Cq7q$)pI{W|QlUgB>^GJb6@^_fq-{s!I;O8qWzX@Z9P9X2(eGD-kAY8s?|>OQ+4*-kI1QW${(5J7 zzOkpp`d${F0P}j=<2vv%aF1OrzoC!ClXkOs8mQylOguYKu12lzjV@9At>`5FJQe@m z#5)k&TJ;&!#rO_V@qNc}s`+%4FYT=JDSQ@jPXu*;(D_Uh?-BF^U0$;OH`DK=zv+A= z@}EyVP6p?JtH5W#7r+)!$1D9u$MZJr^B(wtYA;uOE2!5~;7i~aptQHkUh?58U&k+g zk{yqt&!qhXleKTaZY6jp*aSWbz6;PUM!#^) zH@g1+LqF`s{Hsyxd!p+P7EqoCYW)y&SL|Zv<-5>HzjDokBh##YDJcEamG?SFKBWAi z#Bm&$4eEHu!Jh(3y!SimSAwnrly#@f5zi8I4WRgyeCT*YcRl*~+TlN{A4)x4`G05&?f-%OXP}fnhWsWfU-UaCso#;j_5=3> zPX;B=vJZJ!^-rD8Nm9; z{3mN)gT2;Y1%DfO)vs;5*MeIA5W0h=L^!HwW&;4TBLPUrsz+R2swMEU;zI=_u=`^iFYdT zB^&R<#Qh}LBgy$~OZ%I|FR0_y?K6aWjsUY2YQ0NWfn6T;oeFCEh3I|{%6xq}<4Nm9 z_ZRdspa0^}H=s*azm|UX0@wn61nTzC@ku=wQD3Qt%nvU8Ec7MdTt~j7A3jCB1mENM z6R-{JP#*pEZ18;Wx1iR`xRZHSQ07~$mw9JC^Uzt~IiS|RLb=mFv&k5{x`QqOV*FVKT_ul?zG zB#t`lq}(>j@5y{4sO^iebJ=UX=>CA6l#@pLOF4ZU^Xn4qT=u#=(cOxjlq3CE>#snU zto|PK)xWa)9l7rQnfeT59?ArDc`sxC7AX3|9s2Ll^`^Y9DM!lF{(nkQ-xt4!gPZU# z-3vbw0}NyfQuhd_3QhyzPJ#i$f zZ;`l}kMCF4>DvG6=)VL-{~C5$|8|Oc@!NxV#P3dy{`4*Wlhun()?M){*X26?KE#o% z-eW$i0Y9UC<+@n=zaHHxP}U{6uGRXBn73~L<-Xg8jB~A*c|x$;A$DHr32OayhuZVE zfPYn}^{;V$$HT1MZs1sOQ-ZLqKgWsZJGSnUm z&OF*43w}Mq9t(D(|8@s^f+N9E;E4*Sb36}>fO;GZ&a~wT)^RMjl;dUK*I8D-^C*kQ zfX9L-fCb=5j3dEqv#p)rc#Z|V9D82yYK{e;<5)0ljMWS3_SX5|+WC|`32te=QjK4? zyTlEvq#*p?T^8(0Bk$b z=3P+oo=N_-eWtQcq?d9QsPcZKThZI+{C$JJ?uXlQ zUt>L#eSj{10lK@vM&_xzK$l+ZmSA@lsP*FaNzNaFUm15=|1G-BU@z7QL9KV``eSz> zDD$4SAHw-j;1!Is+a3EI(XBxLH-%#N0roQPH2#V4_cr(;sN*Zg|9r3(Tn0*c&pF~1 z-Sy~2C-Ld>T=lva`-6_K{pv7K=8@MN@&Ab3F6iemPn`|w@_2sN*&rOW2fUnd zc%5TBHsJRbhkspPiQ_r+vd@!!wAN2%-Jb@|1Wy6aVIOlLcoBFp_}gP_`&|bFCebp!*KofqLx%uEkFL=^=Ku@gVq{s-*S(AOr=i|zpBU+lF1Vd!*R zay_H<3(+@#Zz|l0ev<+IhIj=pV;))o%5}6{56HgcWA-zjfo+cc%^4~lUH<=8d1q6u z_`g!s=l72FSn?*>Tk@1i-Xt%#;!pDMog*Jt5tqxq_NUud?3b%{eTQSMf0TCK zn{{IpDEGDQq#iPFY5UKy-yXXM6X->^CwlQOcG~|S6<2iKpd77#iFN2hP}a>u9qZ@# zW9|H02sWX6*`YrV-4|eQ;`kLPc5M#(RoJZqMgL&}{ln;+!N);efAPDC^WxVP&rj&2 z9tY7+<^GxWe+T;mxext4dfBIG{k`ZP03TPV^)B7B*lGQ1@X5yW756!R0%e~e*R^ur zrNnVPG+?CdFH1nV&wdc&S?mSHPnE;pN%)xx&H^hP{&oGuK2O=7%CXi<+<)M_d@pc@ zV?KHk-J76X=lsWUz4IBm?-Xw9*k2q=zn=h31!p+M!)fr}L9Lhj zc5=T_=4rV;)cQ&E|5WwG*d_9R4>}oVa-UGH!*x6@UDSVsT_XQ-9d--*cDWC5sbha$ zk1kdHl}Y*+zaOH%pE#ay#PcM&Wc8=e&*i>aJ>yvJ2kHDT>7xD**d_A6nR<;N4!Q5! zpZmXigZn$~2aCPncKGS;n4d=BCl@RN?*#7!H-I02OUK%IvK5>&&K~#AwO9wP1OIlC z<#j$6;qPn*YW*^FiQ+5VO7X4SO6BDynGaWa(hfQw!mlRIXF=UwIv<{DFCE_(#H-6o z*8j*Y^uLaJyy>XVCir7$=Ui|CmS=%J~WGM!k;!rT@F^ zWxTk`*YQic$#@gLuJPs4cRSIJN5N$6o3Tq)|3d=3oc|f!k<1e=|8jmBx|_hiIOdlb z_>F+I;3Dusa0RIIeKGC&5O|;J7g{g67t#MfKiCmFt(SJZ2%XHEXFK#|=$3-@V6yg+ zEwq1;Jin>1jpK|0+pp$=1=H+t5vc1wB1Qe=6!j8U|M51C9#bst2I_c3H(2!fR^K1g zdeI$)egrrfTtvK0pyZ*_k&g>f)L);XK1^IoL8;e3NBu-skN$k{8gM=3_nT_-r1R5= z?p`pData;giS9x4&EOm0K*}j`l(zxh2jIsFb$oLED|A1CLnqk!)YDJybM%+t=*ELm zuZW|5qMM9LXKf1aZLUE=x*3{kH%NBu-rs@qCPuC z{ei^w8?ce~Ym#`~eoskJUx$7P zc;;5Jug8zhkJRfc>L>HsQb&G7*L{+0KgnaOLod2r(5Hb1gC7ys-m|Q~o5|x}9r^q! zMSTzaChPw<#5Ea|dbK&~C%S3qXMyv<36%d^Q0n!tqkgke)Xz^*e-m;21zZU}2HuCi zFToFp^Gip(Yf{v|nWFw*#PtpM1K2B%`TAswBf##b+2g*T?(aQQ)E|(dUg8=_d}*ws zvQNGpfA50Q4+F zQGa2I`fG{nuV94rq#o4y5Z&L=-w(bFen9yHSa+megB|tzGDZCk_)XUT$Hes$*h;-* z-PH9PG}-p|QQ%F?kFu_6{bF>NfEkR(5un!JkM22eIl4bN^rCwS{i_PK{|xrsCxSnN zJ(zC~VxK2?8U0xL^@Zg3_uypOZJML~q?|m;5x;U>yMDUO=O!?X{Pzd9$FIyYx;}~Q zwf=tU)0^^SpLR6!t?VnVR`amLq5ZAJ-`AknU*wp-e@alk_CKCD?*e7tEc;BYKMUQJ zU_at;=|#6v`4>CwU)t$A^dZ_wx0~$yUH0Nf+S#SQoPH+zROx5)9sTWG_=~`s!Oy{O z!M#1(@Ad;928S0~{(kV{B76J^c=T+0+`Gi0uHOUrf6ReezZPAh_!_rTe4DmXd8?Dm zhpRkk2b~Y$e<9ADsJCvfMETJ1O{Cp)dCB^}O7(|S{r9CFdphbf5Pku85qJsM0P6Uq zzv}q@O#9pl-mcoqm5-6sGaoz!{4FT`-(@f3#Z|tJU;Kn=A3^8%Le~PW1J{Ea!R?DX zAD`3VPXR9nUFFI7Rp>T@-5ldz=8-h=CG*Im98aPh%0QV{4kK=zpU?r(|XYzfSu^hboiHgypLYumVTlAKaTEIa6Oo;{n{+9@E!1d&?~jNhrlIe_V`|~Z@E1l0@i>#R9OBHFul?q zmw;DP+2c3CVe{>=ZjbrIzsP}Fe-64t`N$00@>;<}`B_Ll&Hz_|^U2E!Fx7mVLH#8k zx<2=8VSS{1CI0`b_@p1|`Uw9t^;!q&{_1L{S$pUx)I<=FdLiPDo}J1 zU$Xk)4*!qf_Z?9D3MQ(*E??{fUG}Fs;*oszB%c?8mx0@|Z`seWe-S%RwTIXpjGe2$ zAAsGV;ODAbU0;{}7woitD0~4Z<4?-bdg+(aj}zrp`sEVxEB#W&yUYKls{M7lN&gpr zH#q87#k$u3UIjLR_kk^-j;9u0?62im>>oeCJE4Qjnhm+r_%vi7d>j>d1M!m*C{gujUM z#jJY~@H>S%zH;p99rjxPFuIpODM#8{>)%2rxG(V>3!bL%O^yY7vwsq-F>IKOT3b2iE{&SOPsRrl{jVJDe=fWuj5HnzSj3T-HyvX;O=05 zQ0otZKLk7)90N){KBGR#+KV5pe-yuKz~{jC!DRJfr}de{nGHS&t^uVUdK}2{H2RaE z^drGp^efp%ZfW`AS1?)sQctlH)bU8Y1f^bravh@YlN>`m<-Wil88^$p8$ey2_!E@- zE(hRG>*c=9X!4$;@~`zW4rO1QXx-8FKQf+oWnJnA9-(j+$Eo`NMfu-L`5n&jmiiCj zNBr;2vG_lZV_pAD_IrYpIiBg*Ki0s13>H?~`6U7_0~^6su)fyn8o;@W?6Hn#8GbJV z#lE1%>hrKKRsR0M@q`6dR|jhUTif3O#3k`1DqrfAZ2olo*N~SRz((*Mu#kL9dn9Ww zezacvzK4Hl-%BXRrC){qQ7~Ei$I(9pzPOd_#gC4+n)cg|{*y_+k#_to$5$-0{VJV) zJK52H#oq<^y%@Y1ybZh)6#p+e`s>5!b|k)e#3At z>Yt$A5?`YBcmw_Cpy;PL=970))Qew$Hd=enq?g z1a1a*SZwF_Uf?XS9IOPjzpLPz!TK|-p9?^(--K?!680x&TFd~oz6ZKw^`fiAE)Bow zU<23)W}IcqKMp(rECh8t$KiJhsQpddLVI1FlrzUsAFaO(-CLm4vxWMGh%XIn09(Mf z!B)YuZGL_Mw>!rk_W*VIk5leb;3~?Emahy%C-Lg|lsqIl!QsT!3XUbN8Q>@2zrdfs z+2`7NG=R^68^N8=v*)wH$zTci0jT2}O&nvuNnoKPzGUsikJev~-v_~K6VylIpHKWN z!PSoXT&Mi&{3Nn(BcA^OMc?EoPjowQ{@w)fNqzr{e_cPFuU}~Y-O%gy)q2qlLGQ|& zt3NCy{(4o9Cpp&TiB9tL0y>xf3pp?PHxlS&+#I&l_U{bF=LKLZ*apfxxPbXU#??mh zDC1-(o*a< zy={jOG52%f8|Vjs>@;UeS7z&%?pD!FRzAz&7wVp*lc@YM{B5cKvD8ESRjPR3 zpyY9p%44I-qvTccC@A%meSywb3+*TSqz_elNkeN!6cOB^dX zepsQ*1G3NBnfBfbOjqqM^RS?6pCkR`Ir1!+YW)(`#}$8n;uh>`eO&RrN;^n=A@Zu@ z(dA3t1hs!@N7-k}ydvX9`k9PdY1byzuF}rZ4uaASGHzv^|Ju?26P4dpe;LFp_Ak;; zB%Y5Q@uZ(`*Dt}r9FGL^zzr9$&Zz{8ouJqcSN4S*EA!Ao_`dj`0G9%b-S4{g66=S5$gK)+$B^&t2m$D2Uy|10==&#-4+2j2#@ z{vh}xz+$k*p?@4+@ClBe2G@emg3p03fG>j*myTz^S(X_Io}f_cpXK~#;1>$DzM$fdcsuwM zsLONd-gM~OF0>xL1%Cp2{8oFm$2AvQyyFs!PlFpkZFN8TN5D_PZ$Yj9aJgkZ1-}FT z4QlCaV`at#885ec&VDKOFwQxz>6Za-GFf?y*=3)`I7Ny1X9Pb=7{y z>#fH=;Bnx1P?z_2_(#C^!LJp<;)+Z!#jGnfHpf?9tod=vN<_^Crb z`6laO7I-#zDX9IQ^k>UV01Lobpw>4&WEokX3QO(r0}5|F-SUFRl-Xm!2RIfyy~3Us ze3oOu36=J|;Dc56Snv~$qZqO0KLKA_V2=fVv&bF`u3v1A1;;G0$AXu$&IrEAvEart ztX}ZOv+c3qvk%&1!PhyqY!d%&V>I1DUv1XXT@0~pXy=eLOn(GN!Z*`kd%@?yx5D>? z_uI?&(+0mQ{4)5ohbgwR|2Yp1@CNwH3aJzT39ePoDCVWB4E*^i$FM&-MCz z=A)K45xyQ?2FMKftKl2ae+Pe`@Q+#IF!*)w&G37excyHXd~0)X82UT>E~c7(JdJBC z|7#1OgW#Ltv*9!0(;l~k-=F-?9Qbtj*_IBS4c`F2JN#AfG7)?UzY<<1f=l5af^Wjl z`S9<;XFg#GAoMkS+LM--`8chct#1?jZ}4*%d>i~2_;K)=Pg&w+_}TF3Pg|mdeBKG) zu-5YH;J<*6JR8ps+1|z@6WzJ^KM_9fc}pA!KNVgk!h7&P2VN$`Li7vZWnw%Jz5!k) z$a4Jr+3?$h`h^+~FbOmt85a)){2rkhs-LgHPd#y7h5zn5*m|YEV2Ln%E_{RHuY?c1 z7_YwzJ_7$Sex8Oee902U@NdA&M4tiwCA>`drjo&DyY4p57Ud@wKC{K@Sf4^3d=tEk zmum3?e;)oXgfD!>`uWhNHS`yFS#UO*Jo=xthTkUCGqmveZG&SIcJO%xz7SsK;dkLf zivJY8agFse5M)Jj#`Mpcp~s>+iI@kp-WA@EI!3{oq?4 zwfb4;bK&dZXTnDe@6VI6A&~KM8GPFNRw(oHz3>gKmOm3epNL-Zd+cQW=e=%)Qtk=x zP4E{`-)Zo&A-Ms5DSYO7>t`P2J|%t>zuV4?Qx-H?uTO)|RQw(AvhiV`6tc{9uVc66ZDW8UKdI&nozqpDh0}^VJ&o zCU)W{q5lFtw2dXUMc*yW#+la5@`n)5ui-P{FT&4Y_?GQ0@g;ty!8h+{`2pz9fp6W( z5<60_E8*LAvAoPI|GJI2S%ggxM2;aP`RLoz2AJ=Re|a)Xj(IYD4?M zx3N*(7yWVY>3hZNXTUf9+VbB>{}Dbtp8u`z`&)iA3+gTKZHHK%=i)-&z()pIzSN9o z|MQzZHvZP(mX~~<2Ok)&7J{7<)jmd~uP{J5!>A8&ZS+yTnZIq>}z{{Vct z;=hCMtN6qAu>R8&UkJa8;;(|=lw~`n>?@vzZ&m#Nz^_;QVf}5nEs8IJZ&Un@@Xd;U z3x2KQci+?IGql;}a|L|Px(Tux4!8fh7yhp=74&VBu<)_=`3bn## zK4tl@Erh-m9zS!@_xqKNGmVA%E;A4MpIL_Y<7`rK{sDdSJJxY;_Q~teuT=V8ds+W2 z?^}H(c_@a@{M_=F;^%(Re`WcD&HCqmwlf=Jzuz`7K|Z;oVS z(>Bn~1LL`1XhEN${On@R`~C+hehmCT#V>{bQI-2Q_~GcK-+l@oQhxT^+m_o+@h2PJ z&qL-I8-Epf`xAWANtXYIneY71xA66+Szhv-vk&cFVtL8)AK>K$sDqi8?uL)>K<8rX zKJ+wv8~i!&AHdi1KxQ@VJ|x|i8{&(s4Yrv>Q{d$W-B|oo!pn_1mc7sw@N&cM0b7mG zE%0*VZqNwpsM+w_g!+VV-*`y8{sj2ULGk>l0l!D+0o6|$;Tsjd9zLD>U}oA0KK=Kz@w6Uk{Wor7`Dp=f zCO@UW0)2Bvy#7V_^dsW=KKtW;nB~*0`_L@-X2q|7Z&duZ@b!v6{s8O0Q1QQm&s6-& z@ac*_@IdP)r1+)qt;fX2zXrZp@jD%4{WL0m8hpLtZ-OsWd>eeG;zu8B{iiGbGWd|< z-+?b2Y~!Ct{yz`+o*{jG{Vn=d`e!5h-UDs9^#@u%neYSQo8i~OXTdl6Hy+LB$8GJ2 zS@5CZmT$Cls20BdFv~Z?Uo3tOwftK6Tj84-FTy_tU&wfAK)(S##CR0{Kf$-EaXP?k z)ctW9B5!&4IX>Xcbu0H_%yujI%!1E&%2t$RFf*;T%M+ToSM6cU%kgZpv@;^{`m7kIDKTzN8@qZ$G{oOXsd*N%~ z(^P->9ek7O&yDcu#4q()4d0;Re@%Fm=TG756~7riqWHdt+dQN(?sg>p1K}J0Ve2L9 zU^e{MDi4$4zfk;X@FA6lI`}-*Z!dz+RQwI_g)07ggje&-i{eN1|4r~A+G{`RyX#<^ zhvp_*U(;=Z&j|Q|+(+fIAT$Pkld5k%e5M*lVfcFdAB+D#z~`xY{Tcp4<-bY%!^`~k zD15rA?|S$QmCw)NL+EAR+u;bChk7+1?h8Lcm3stytLi5c;4`VO*-iwX1@Ix-%j}$j z&lT|LD$ZNsGgLkwgillY7sQX!zXzYG`pHl5g{r>&GHf2&$d9ZSN5E$){fY1)>T9+= z!KVhk`ERygnQcSxxn6j_7ciG6!RH_Fjf&q0U&wrAE~A3aPD5;*A@Xl74};Gj_(Ih# z8-F47HJ4Gr z=Xm&5^ir=v_;l)JF1LfvIq)s2y{?5{!1!f(39W#yg}1c`g__{275^}NMDb6-ht&M} z27IP!ub+gczUJ~R`0RI-&BJQ7{}}>54!#HaEckTQ4^M&5V4TW2emZ=kT6gNi2$ z68JX8k*o_h!q=038NaLH4^i{ObMX5s{!RFhivL^qUn~8#L+R&gy!V4|RdF5+--Lc= z@-{;Bl-mcs0KP%x=XCf+<>yTJOf_#`4*#ag=S}ddRQvuFKBC6gQ}BDJJgkFnftPl9 zAHE6yvM#j2XR7`aI@;#*85L(w_}f&R1KC1PQ`gOd;`3+*DdhNmH)rP_b2}{zdZ(jiHh@i_;XdcZ^O@1BA_@1i&41gb~{0xF`QvGlwd>-Rk=9#JRjjCVGfo~&zS$~(pH_+~q|3ARD!0$po zY!p5ICI5HBXL7wM>-Bp0dbJ+?B0T;jp0wdMZ}lqvec^Yey`;Y#0l!SO<8knQv``H_4sf^Q~H8IQk%Z^6IBe=~eowR;o%c`DA;@MkIhS@=xV-&)}#DnDNd zPn=S(ZstP3p9cz+es}l`;_plQ9uB`)#WMmv0x#>rSorPXrCp}Nr>p)PhHq8-YfsPJl^GY&qJ>qoP#4Lh`rCV-zK4*i)9{&x=kS_gl(gMY!nzvJM)aPZq5-+4ZJJNREY_<;_7goB^x z;7@k&)eim=2Yy{JfC|z`0LE_+F3st;?QRqzO%d)IP_r$f0l#4)WKip;Q#92A93(6I{5b;{ALH= zdvxdP?B0g&ET4xu_)!kNz`<8I_;Vb5gW)@CuRl5Te|7MWI{22r|IQ(K;Y_ZhTOInZ z9DFFd^St$P@CP{f;~o4I2S3lj*E{&j9Q-W~{%!~Vn1f&E;6HTmKREdAIi2UTpMxLf z;By@OOb5Tv!Cz?jUCs4QGyD8*tN{-?^v^l?*B$)79DKJio#!FV!4GiogB|=h2Vdae z3myDI2Y<1HzuCdx<>1#i_*WhLza0FoV>{31{to^~2S3`u&v5Xw9elNeKhMEm?cncl z@XZeXMF;b>fkFJ{1ONMM+bkagMYyA=`s64 z`SBHpexrl`*}?bB?L40Y9Q@%9{&)vJ$-$rM;7@n(OAWuDR6Yj(=+OVg!QbuRA93){ zJNQ-y|Gk6nbzaQPfLvv^EhWpQn3Rb}9QeqB*{Wl=@cF8=J? z@~YWIpeaXQVzh(#k5YGQ3b+%DGO1i91P@5tE_Xi0{H1R#aLw zuhtw4$?z72XV+8}mzjhOmxOxL!?W`PZc311Q>1Uaptfjsq_(sxB@nFZU*4)ZS6&6qS~H)!~x5;;2ZpGH)4w-PZMR-n;v5KCRu5ZUoae25% zqKanSo+=5O{Iyp^?1IYAskS4V-ib6}&$r#Nrnt&f-ZWXAX$sT0MSlCF=&AD&Xhv+Z zp+p_%zV79RYjbPE6_bKS&-QzA-ePY?cFyQ2Ib)(tGuq5T-o)r^V{E3G(I4#(riP2X znn<|VtF7{)J;kqMWU)E)icPI+!=Z|z(n_zi(#*Y)>ah9OD=is3pG(^3 zrO`oe@Vk_qpK1mdo2j)nQe71poIx)r^Rl8p)eedNIK+!N$nvthaarC(Z|qSe-q<1D z5O01|Xn1obdN{;8vB(>5sG$pId*iab?C6;SLzQ^7-ppyUX3d^GXHIqX0&k(0WB$uE z|4okSGGd&M@!BIYF6Vo5CwoVGLl;cX@{aL__$ALPii;-88|GDdL$kbv#a@ZO6RFJd z=9{V*da@Bth?X+n_f}dv%p2n!RW#o?svUk*k$3E<)4iGIur#VG@Cv-zqq4KT+I+91 z#Kt_<8|$59{wwiHLM7pv;_AWX(KOr2W!~gD?fIN%l50x!>*wpodov~%nMj6a9etuV zV`kI@*)(sOH^cll)0hl1{~wt>aY}xWfS_-;PxxkfPz|XBF)QE1Nm*0I=9{A2k}+BN z1*5aZkM~Z>nK^yZlc@x+v&&f!F9z z%@0?WaneEzbBW9S_go7@eaMBtwyyLXxd9&;0%!y7uTjt6P zq}r{9vmsEu5ItV?Ss+u zpw72t{)vto+V=5bHeKOb6<54l_mz(CJN6nVT3P>uHj6tMYZYHw*}@XFql-VU&YD&* zH830OaBgM3e}y55S61yi_S_183GLA8K~JfxtSOya88%b4>N3#{T+oaOhgNjJN4FS$ z7xPCzw6nygyuJ4YahM%hO-<>NuovHPZBK1)yZnVkk=UNCeab>zZWe53&oN`%i%WXM zglcx0Db`f)GuyWbu}LNEQ;JHXSKPL@NAtoUqBY}d6tjPd+t|0ab^JiGP3>ni+T2_r z`4fu2Q}K6Mu^B{XE?sKtsw=0L*3QeXt%{gESaonc*qPK^q4}3A1*R8@wQ1)G!R6D~ z;A(fG^EQFm85GO7z}VQ1sw*uww=rVO@)nN`S9)HsEX4&ht*AV>4EDQM`*f03;jd;m zjMDb9XJUAf#Hr47Ze^|)T&`lyWR;W@R2LP8XPfIgl_bAA%}F?7I$tEK!{+*}ChYk; z(&%CtNqhsNQ*T2&Gpx-WAI~Jl52~wvj-3-WGeo$`-;-~NpCLz?eX(2{&Yj)06b%_V zH(crW&MN;hH`#EGRuhyr#3YB?5XFnl*4=cr6x?;T!8ywG?JdvI(P7!gr4UYs+8w1@ ztc%?-@KR!KKBW*#XQ>%7q${2})Jpf~1qpl5l$@+=Z=CrjX9`tFY%?j(8$BsI$D25* zz{}4mNZM}nqzQRba`N+YvXyC9hux54TwOGY=IoF>bH!F!Vs@6XcY2afMnTSuWMC12L)NfQflCr-^O$ekqDw<#EppOl}Ibel<}dASqErfxJT1*3wgdE-r= z%9);YG1K!W)C3D{Di-0InxeV>me8LV6K8F@x#r9t>lMt*%kffb;;9q!vPPfejrOx0 z440&fG#9*+rkgR+Zt7npryg!x=SpUXbr=!DIvWzR?N-F&dMZ2YUsahscd**z#ceu9 zn{PGZuCz@(I#Kw0DYdJU9gr8eFc*Ze_l}|`OTzvIZk$KEqfu6V?z%D~=s7uYcgdNM zS1{8XGbL++46!aH{^%_#*~^(SWs*$iiR*3qR$XPJw7ASnf6;wFbo=i4_cem=XJp(Y zQ>jjux#58?`@K&Wb`=RjWuSC5zF~ev_5Q+q{SmGXzWVXPmHr*?5^qj<(Oim>;gBUN z846wPbYALhA1vZ|Su@8^GK=~6oQY!##t~iO9vf#nAuIo+E?FjR#I$IFlpB+-4mz}= zsHV(|`7$y%ww)&F;$pTO1yiQVm`t3N7`ri9j}bk@>>RzvlCwTHuViqv$`OV7^@IK$r>0thVN?e_PbgMEectnD1)+Z{g&8^gc-N z^=s@INxJhyu$1bviHFVvv%}9CYj#U!%ard;&n*~dwm%aKawf|5c$j~Ax+qd@YmnHX zeC6RkY+%->q@PrXu3zM$*8c*!%hsuu9vuXJGo@B^>ZUf8&TpA3%pKB%HShEWN&F>y z*Zp+3Xz#kKPS@zJyVJLBy6&mtHT)L%ioFrE1#X-d$Xnp^zwF_X^V(q{(l=we=%&N2 zxr=@}z3l0tua1j<7ah58$92`=e_8#LbLm?D^~9T$x5T>%eGqw;pqsxfl{UXZE6HgLy^pvBJ znDw`_lI)ePs#0fwDcm8absU%^U2Lqh$7?B z-%FR-n;cPzW7}B>veh)EpRi*iMr7rkF$KL<* z=2TUir|c^I%iiFt!FFMFRXLhS(c;L(?urWe97TH}hzi*=tj zWm3VU(UZoj-k2BMK8hb#9lu>D^I~r}L^Bdg#^1q+H}GQaP?$5};;?z#!rYIkE}B~r zHcu6rv1o>}jL>%XF~SP--J$ssHyGSY!qrvg@=NCTGXF`)s8L+{^xf$)b2S_Gsv^N7 zCFYSvf2x>cFzB29<6Z52sGzhWY#u_7&rCse%&?coLu^-a-8nAvI^H}noPRB49*H$o zx6wr7@AL*OMO2!{pkjq4`q_(X!!^ObMb*_s?LFJL>3G%*-ioT~#S2P<=Rsqf`j1I? z+}SffM$4FamWC%l%h*%rtABm9|fo#0brwrCwFf66oO4F#|3P_#+4*$d36Gfx4DVod{mvrl)qJ}V`?J}**2Uz_|L()zqL!Cd z1P^>$fBGAdvJQ8&W0;t@I*bdmLPiUpV_uz#9?XsTkx4UpuG2v}FI*mJzhWy39^)xB zJIp2K=4jN?Om)R_l@&|I4psBinf+2HDmdLf>}jhWpNR6Rsz_AlzseAEU@lH;=K6d4 z_TFKxR>Lt}$X>igO?cqZmSY~*Z$Dw5$Fe8Xq8{;^E4X7ETTw1Vq8{v5dF_WWQAeuG z)3bBh7v>Iw*DtoSy`0Y%7e(Z5Y+11Jm8*mHqKwLHsLbm(aa6Dj#xeda(Kw>x_Xx5a zCy?36JWgb9)<&tA=T2=>%{5od_RF6{qgwyKzx^I0I+pfd$cj+~?`Oq*8&zg1-u~8> zEyz!W*>K`C#@v6FFnY)IM=%yH&BQZrx93l^woVP=cj-Z5(Z?}OS;Esn%? z>AHxSGuspH_j;*8)TFLB@rvpeh5V(l z+`K4O5Dcj;MrDonCXE?mo`~}b zvPPL_nL%U^7=Q(a z2~byEV{QZZ4{sY;P)}+&AzWeJ_XzvJ`A!+KfxROyM?dhA_{6*BEm@)Bc@Bvrq63N0|%kEdSD4@@2m| z_KbU5H8eHBD=M~0vnosSgZVkyNlZP=`^CkC;XjVHhk3Cl+xg3Ec5D1(6%NB zw!nFd$*M^Z9mb}oJzl@3ml3g11uq_$_q=#H%s*iU;FLOZN4SFL+M;p#Z%>G2XYcuN z&g6*^8S`wx=nkXK6dpV3Btko+i9^Q~Jl${S1+xHG7tgEC96LUD)M)R>!AA~08l!CU z-gUS*xSQ>_w(Y2Xt^D3$jZL1~U&4*f5xLpML%x6AVQ!Ph_FX%)O~C%Ury+CmrzTvh z3iijES+wX-es?fw2yUj@!AH;ZPed!ln;oXmAQ7WX!^q&6l<(D4M$EKUJ16e+I5QO) zf@B4q%DhFyon%Ic9(2&o`swdYC03%U+7N&q=v8LH{=gO_TJ`@wh9_Enm?OH=2(-$VCAGQ zdnZ*^Evy_@R5Q<5$8;+Dqv5>qVe`7EUSv?Vzs|}e933b5<)vm@9A6f5g7Im7MMRB% z2R2${Fv+(!u7B^SBy7GbF}qtM_eT+J8ntLIy4_1|jlHc*md96BmDNSeY5GxY9>#|k zgv+Cqq&lR*pDE(M!i!zJ{J~;t60QF1go`wCp>uNKYCv(W+xuou(F#m z%e()(8zgh_eRZ_i42)s4$F%lTUeTk~16Ry8!Oy|_O{NOwUKJJPY=>5~E4V2<=tro` z5|t? zMwGGee=MC{R~ua{jNad;7>6c+CE-f{*tU(otEn;H3r9OQ6$pNPLGZgnh$8MKH8@t; z_C*TgDgG}GiN?mpP7*=0_%#b=FaJfSoJGObS+;dHG+$_XjQkpf_Eg&8<;M_hO>-c| zCiQvd7Lb`z4H=B%_LbZ7Cw9rC|J=Ga+W&sk2qn7q29n_syDs>>!-(6H7*r@=( zK~MCZ`ajUaW6PRUZEjbXul3p^Fk4Qu_8TI)r7bbPM<$w0Q$1RGbaXpLN~3=5rrmUR z+q%K)&!!q?g`W_+!29jS^^E5gFDmjcpn|11I_29viTI^ig3E;9*S^?2GNnr=&Z&sh z`a3}x38T$-T(Nt$>D8sR;i;9?=7mwNLV{6lM@)r31f+q2ORT_qXmHKq3jc}9!8Ntj z7U#)N{yp}=b1Ulx`!}Xb4lgYU1xNGzHDPec;!0y_(TwWgj9K!6**o^YGv~~!iABBv zKSj(mHrQNInt%Q8yF-J6%ge#lRc32j6dD|!$F=Fa5@Rbz*1}%TS_}EvxAKcH4uWus zD$H+78a%hkI5z(b4ob70XV=t(%tNRZ{+`)J9Mo)Zk&J3{x+FZiZmw}%R5{mNdvjP? zImh>HPtBfP9bO0 ze>N@j{pQV8VqeG)f&&q52lfy{(EJ$)^V|2^%U_1Q-~+o_p>-txkbH4p3Ut~UQlj3nL_4n;}H~(vU|L-RFRoub+ zAAAbq(eEFzAHS^FPmMW<*e%ilu~{8=ST9flgU{ma(V zGBEQ%BZ&D(`w4Zs`N97iFVa8c??yCiwtlo;js;g4TmNsth`s!siseb#uQ9fM{l#AX zencbo{Z#{`8*S|8C3E2SJ+YU+Gx5MKmTB>wn~&s8;+Foi-kggqf7#yFZdosj-8`%)wMLp9i^g94wMAADb^qklJ}aiC?I z)%ZylL+~queidb&k<()D&(E None: + self._size = 0 + self._protocol = protocol + self._limit = limit * 2 + self._loop = loop + self._eof = False + self._waiter: Optional[asyncio.Future[None]] = None + self._exception: Union[BaseException, None] = None + self._buffer: Deque[Tuple[WSMessage, int]] = deque() + self._get_buffer = self._buffer.popleft + self._put_buffer = self._buffer.append + + def is_eof(self) -> bool: + return self._eof + + def exception(self) -> Optional[BaseException]: + return self._exception + + def set_exception( + self, + exc: BaseException, + exc_cause: builtins.BaseException = _EXC_SENTINEL, + ) -> None: + self._eof = True + self._exception = exc + if (waiter := self._waiter) is not None: + self._waiter = None + set_exception(waiter, exc, exc_cause) + + def _release_waiter(self) -> None: + if (waiter := self._waiter) is None: + return + self._waiter = None + if not waiter.done(): + waiter.set_result(None) + + def feed_eof(self) -> None: + self._eof = True + self._release_waiter() + self._exception = None # Break cyclic references + + def feed_data(self, data: "WSMessage", size: "cython_int") -> None: + self._size += size + self._put_buffer((data, size)) + self._release_waiter() + if self._size > self._limit and not self._protocol._reading_paused: + self._protocol.pause_reading() + + async def read(self) -> WSMessage: + if not self._buffer and not self._eof: + assert not self._waiter + self._waiter = self._loop.create_future() + try: + await self._waiter + except (asyncio.CancelledError, asyncio.TimeoutError): + self._waiter = None + raise + return self._read_from_buffer() + + def _read_from_buffer(self) -> WSMessage: + if self._buffer: + data, size = self._get_buffer() + self._size -= size + if self._size < self._limit and self._protocol._reading_paused: + self._protocol.resume_reading() + return data + if self._exception is not None: + raise self._exception + raise EofStream + + +class WebSocketReader: + def __init__( + self, queue: WebSocketDataQueue, max_msg_size: int, compress: bool = True + ) -> None: + self.queue = queue + self._max_msg_size = max_msg_size + + self._exc: Optional[Exception] = None + self._partial = bytearray() + self._state = READ_HEADER + + self._opcode: int = OP_CODE_NOT_SET + self._frame_fin = False + self._frame_opcode: int = OP_CODE_NOT_SET + self._payload_fragments: list[bytes] = [] + self._frame_payload_len = 0 + + self._tail: bytes = b"" + self._has_mask = False + self._frame_mask: Optional[bytes] = None + self._payload_bytes_to_read = 0 + self._payload_len_flag = 0 + self._compressed: int = COMPRESSED_NOT_SET + self._decompressobj: Optional[ZLibDecompressor] = None + self._compress = compress + + def feed_eof(self) -> None: + self.queue.feed_eof() + + # data can be bytearray on Windows because proactor event loop uses bytearray + # and asyncio types this to Union[bytes, bytearray, memoryview] so we need + # coerce data to bytes if it is not + def feed_data( + self, data: Union[bytes, bytearray, memoryview] + ) -> Tuple[bool, bytes]: + if type(data) is not bytes: + data = bytes(data) + + if self._exc is not None: + return True, data + + try: + self._feed_data(data) + except Exception as exc: + self._exc = exc + set_exception(self.queue, exc) + return EMPTY_FRAME_ERROR + + return EMPTY_FRAME + + def _handle_frame( + self, + fin: bool, + opcode: Union[int, cython_int], # Union intended: Cython pxd uses C int + payload: Union[bytes, bytearray], + compressed: Union[int, cython_int], # Union intended: Cython pxd uses C int + ) -> None: + msg: WSMessage + if opcode in {OP_CODE_TEXT, OP_CODE_BINARY, OP_CODE_CONTINUATION}: + # Validate continuation frames before processing + if opcode == OP_CODE_CONTINUATION and self._opcode == OP_CODE_NOT_SET: + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, + "Continuation frame for non started message", + ) + + # load text/binary + if not fin: + # got partial frame payload + if opcode != OP_CODE_CONTINUATION: + self._opcode = opcode + self._partial += payload + if self._max_msg_size and len(self._partial) >= self._max_msg_size: + raise WebSocketError( + WSCloseCode.MESSAGE_TOO_BIG, + f"Message size {len(self._partial)} " + f"exceeds limit {self._max_msg_size}", + ) + return + + has_partial = bool(self._partial) + if opcode == OP_CODE_CONTINUATION: + opcode = self._opcode + self._opcode = OP_CODE_NOT_SET + # previous frame was non finished + # we should get continuation opcode + elif has_partial: + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, + "The opcode in non-fin frame is expected " + f"to be zero, got {opcode!r}", + ) + + assembled_payload: Union[bytes, bytearray] + if has_partial: + assembled_payload = self._partial + payload + self._partial.clear() + else: + assembled_payload = payload + + if self._max_msg_size and len(assembled_payload) >= self._max_msg_size: + raise WebSocketError( + WSCloseCode.MESSAGE_TOO_BIG, + f"Message size {len(assembled_payload)} " + f"exceeds limit {self._max_msg_size}", + ) + + # Decompress process must to be done after all packets + # received. + if compressed: + if not self._decompressobj: + self._decompressobj = ZLibDecompressor(suppress_deflate_header=True) + # XXX: It's possible that the zlib backend (isal is known to + # do this, maybe others too?) will return max_length bytes, + # but internally buffer more data such that the payload is + # >max_length, so we return one extra byte and if we're able + # to do that, then the message is too big. + payload_merged = self._decompressobj.decompress_sync( + assembled_payload + WS_DEFLATE_TRAILING, + ( + self._max_msg_size + 1 + if self._max_msg_size + else self._max_msg_size + ), + ) + if self._max_msg_size and len(payload_merged) > self._max_msg_size: + raise WebSocketError( + WSCloseCode.MESSAGE_TOO_BIG, + f"Decompressed message exceeds size limit {self._max_msg_size}", + ) + elif type(assembled_payload) is bytes: + payload_merged = assembled_payload + else: + payload_merged = bytes(assembled_payload) + + if opcode == OP_CODE_TEXT: + try: + text = payload_merged.decode("utf-8") + except UnicodeDecodeError as exc: + raise WebSocketError( + WSCloseCode.INVALID_TEXT, "Invalid UTF-8 text message" + ) from exc + + # XXX: The Text and Binary messages here can be a performance + # bottleneck, so we use tuple.__new__ to improve performance. + # This is not type safe, but many tests should fail in + # test_client_ws_functional.py if this is wrong. + self.queue.feed_data( + TUPLE_NEW(WSMessage, (WS_MSG_TYPE_TEXT, text, "")), + len(payload_merged), + ) + else: + self.queue.feed_data( + TUPLE_NEW(WSMessage, (WS_MSG_TYPE_BINARY, payload_merged, "")), + len(payload_merged), + ) + elif opcode == OP_CODE_CLOSE: + if len(payload) >= 2: + close_code = UNPACK_CLOSE_CODE(payload[:2])[0] + if close_code < 3000 and close_code not in ALLOWED_CLOSE_CODES: + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, + f"Invalid close code: {close_code}", + ) + try: + close_message = payload[2:].decode("utf-8") + except UnicodeDecodeError as exc: + raise WebSocketError( + WSCloseCode.INVALID_TEXT, "Invalid UTF-8 text message" + ) from exc + msg = TUPLE_NEW(WSMessage, (WSMsgType.CLOSE, close_code, close_message)) + elif payload: + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, + f"Invalid close frame: {fin} {opcode} {payload!r}", + ) + else: + msg = TUPLE_NEW(WSMessage, (WSMsgType.CLOSE, 0, "")) + + self.queue.feed_data(msg, 0) + elif opcode == OP_CODE_PING: + msg = TUPLE_NEW(WSMessage, (WSMsgType.PING, payload, "")) + self.queue.feed_data(msg, len(payload)) + elif opcode == OP_CODE_PONG: + msg = TUPLE_NEW(WSMessage, (WSMsgType.PONG, payload, "")) + self.queue.feed_data(msg, len(payload)) + else: + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, f"Unexpected opcode={opcode!r}" + ) + + def _feed_data(self, data: bytes) -> None: + """Return the next frame from the socket.""" + if self._tail: + data, self._tail = self._tail + data, b"" + + start_pos: int = 0 + data_len = len(data) + data_cstr = data + + while True: + # read header + if self._state == READ_HEADER: + if data_len - start_pos < 2: + break + first_byte = data_cstr[start_pos] + second_byte = data_cstr[start_pos + 1] + start_pos += 2 + + fin = (first_byte >> 7) & 1 + rsv1 = (first_byte >> 6) & 1 + rsv2 = (first_byte >> 5) & 1 + rsv3 = (first_byte >> 4) & 1 + opcode = first_byte & 0xF + + # frame-fin = %x0 ; more frames of this message follow + # / %x1 ; final frame of this message + # frame-rsv1 = %x0 ; + # 1 bit, MUST be 0 unless negotiated otherwise + # frame-rsv2 = %x0 ; + # 1 bit, MUST be 0 unless negotiated otherwise + # frame-rsv3 = %x0 ; + # 1 bit, MUST be 0 unless negotiated otherwise + # + # Remove rsv1 from this test for deflate development + if rsv2 or rsv3 or (rsv1 and not self._compress): + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, + "Received frame with non-zero reserved bits", + ) + + if opcode > 0x7 and fin == 0: + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, + "Received fragmented control frame", + ) + + has_mask = (second_byte >> 7) & 1 + length = second_byte & 0x7F + + # Control frames MUST have a payload + # length of 125 bytes or less + if opcode > 0x7 and length > 125: + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, + "Control frame payload cannot be larger than 125 bytes", + ) + + # Set compress status if last package is FIN + # OR set compress status if this is first fragment + # Raise error if not first fragment with rsv1 = 0x1 + if self._frame_fin or self._compressed == COMPRESSED_NOT_SET: + self._compressed = COMPRESSED_TRUE if rsv1 else COMPRESSED_FALSE + elif rsv1: + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, + "Received frame with non-zero reserved bits", + ) + + self._frame_fin = bool(fin) + self._frame_opcode = opcode + self._has_mask = bool(has_mask) + self._payload_len_flag = length + self._state = READ_PAYLOAD_LENGTH + + # read payload length + if self._state == READ_PAYLOAD_LENGTH: + len_flag = self._payload_len_flag + if len_flag == 126: + if data_len - start_pos < 2: + break + first_byte = data_cstr[start_pos] + second_byte = data_cstr[start_pos + 1] + start_pos += 2 + self._payload_bytes_to_read = first_byte << 8 | second_byte + elif len_flag > 126: + if data_len - start_pos < 8: + break + self._payload_bytes_to_read = UNPACK_LEN3(data, start_pos)[0] + start_pos += 8 + else: + self._payload_bytes_to_read = len_flag + + self._state = READ_PAYLOAD_MASK if self._has_mask else READ_PAYLOAD + + # read payload mask + if self._state == READ_PAYLOAD_MASK: + if data_len - start_pos < 4: + break + self._frame_mask = data_cstr[start_pos : start_pos + 4] + start_pos += 4 + self._state = READ_PAYLOAD + + if self._state == READ_PAYLOAD: + chunk_len = data_len - start_pos + if self._payload_bytes_to_read >= chunk_len: + f_end_pos = data_len + self._payload_bytes_to_read -= chunk_len + else: + f_end_pos = start_pos + self._payload_bytes_to_read + self._payload_bytes_to_read = 0 + + had_fragments = self._frame_payload_len + self._frame_payload_len += f_end_pos - start_pos + f_start_pos = start_pos + start_pos = f_end_pos + + if self._payload_bytes_to_read != 0: + # If we don't have a complete frame, we need to save the + # data for the next call to feed_data. + self._payload_fragments.append(data_cstr[f_start_pos:f_end_pos]) + break + + payload: Union[bytes, bytearray] + if had_fragments: + # We have to join the payload fragments get the payload + self._payload_fragments.append(data_cstr[f_start_pos:f_end_pos]) + if self._has_mask: + assert self._frame_mask is not None + payload_bytearray = bytearray(b"".join(self._payload_fragments)) + websocket_mask(self._frame_mask, payload_bytearray) + payload = payload_bytearray + else: + payload = b"".join(self._payload_fragments) + self._payload_fragments.clear() + elif self._has_mask: + assert self._frame_mask is not None + payload_bytearray = data_cstr[f_start_pos:f_end_pos] # type: ignore[assignment] + if type(payload_bytearray) is not bytearray: # pragma: no branch + # Cython will do the conversion for us + # but we need to do it for Python and we + # will always get here in Python + payload_bytearray = bytearray(payload_bytearray) + websocket_mask(self._frame_mask, payload_bytearray) + payload = payload_bytearray + else: + payload = data_cstr[f_start_pos:f_end_pos] + + self._handle_frame( + self._frame_fin, self._frame_opcode, payload, self._compressed + ) + self._frame_payload_len = 0 + self._state = READ_HEADER + + # XXX: Cython needs slices to be bounded, so we can't omit the slice end here. + self._tail = data_cstr[start_pos:data_len] if start_pos < data_len else b"" diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/reader_py.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/reader_py.py new file mode 100644 index 0000000..5166d7e --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/reader_py.py @@ -0,0 +1,478 @@ +"""Reader for WebSocket protocol versions 13 and 8.""" + +import asyncio +import builtins +from collections import deque +from typing import Deque, Final, Optional, Set, Tuple, Union + +from ..base_protocol import BaseProtocol +from ..compression_utils import ZLibDecompressor +from ..helpers import _EXC_SENTINEL, set_exception +from ..streams import EofStream +from .helpers import UNPACK_CLOSE_CODE, UNPACK_LEN3, websocket_mask +from .models import ( + WS_DEFLATE_TRAILING, + WebSocketError, + WSCloseCode, + WSMessage, + WSMsgType, +) + +ALLOWED_CLOSE_CODES: Final[Set[int]] = {int(i) for i in WSCloseCode} + +# States for the reader, used to parse the WebSocket frame +# integer values are used so they can be cythonized +READ_HEADER = 1 +READ_PAYLOAD_LENGTH = 2 +READ_PAYLOAD_MASK = 3 +READ_PAYLOAD = 4 + +WS_MSG_TYPE_BINARY = WSMsgType.BINARY +WS_MSG_TYPE_TEXT = WSMsgType.TEXT + +# WSMsgType values unpacked so they can by cythonized to ints +OP_CODE_NOT_SET = -1 +OP_CODE_CONTINUATION = WSMsgType.CONTINUATION.value +OP_CODE_TEXT = WSMsgType.TEXT.value +OP_CODE_BINARY = WSMsgType.BINARY.value +OP_CODE_CLOSE = WSMsgType.CLOSE.value +OP_CODE_PING = WSMsgType.PING.value +OP_CODE_PONG = WSMsgType.PONG.value + +EMPTY_FRAME_ERROR = (True, b"") +EMPTY_FRAME = (False, b"") + +COMPRESSED_NOT_SET = -1 +COMPRESSED_FALSE = 0 +COMPRESSED_TRUE = 1 + +TUPLE_NEW = tuple.__new__ + +cython_int = int # Typed to int in Python, but cython with use a signed int in the pxd + + +class WebSocketDataQueue: + """WebSocketDataQueue resumes and pauses an underlying stream. + + It is a destination for WebSocket data. + """ + + def __init__( + self, protocol: BaseProtocol, limit: int, *, loop: asyncio.AbstractEventLoop + ) -> None: + self._size = 0 + self._protocol = protocol + self._limit = limit * 2 + self._loop = loop + self._eof = False + self._waiter: Optional[asyncio.Future[None]] = None + self._exception: Union[BaseException, None] = None + self._buffer: Deque[Tuple[WSMessage, int]] = deque() + self._get_buffer = self._buffer.popleft + self._put_buffer = self._buffer.append + + def is_eof(self) -> bool: + return self._eof + + def exception(self) -> Optional[BaseException]: + return self._exception + + def set_exception( + self, + exc: BaseException, + exc_cause: builtins.BaseException = _EXC_SENTINEL, + ) -> None: + self._eof = True + self._exception = exc + if (waiter := self._waiter) is not None: + self._waiter = None + set_exception(waiter, exc, exc_cause) + + def _release_waiter(self) -> None: + if (waiter := self._waiter) is None: + return + self._waiter = None + if not waiter.done(): + waiter.set_result(None) + + def feed_eof(self) -> None: + self._eof = True + self._release_waiter() + self._exception = None # Break cyclic references + + def feed_data(self, data: "WSMessage", size: "cython_int") -> None: + self._size += size + self._put_buffer((data, size)) + self._release_waiter() + if self._size > self._limit and not self._protocol._reading_paused: + self._protocol.pause_reading() + + async def read(self) -> WSMessage: + if not self._buffer and not self._eof: + assert not self._waiter + self._waiter = self._loop.create_future() + try: + await self._waiter + except (asyncio.CancelledError, asyncio.TimeoutError): + self._waiter = None + raise + return self._read_from_buffer() + + def _read_from_buffer(self) -> WSMessage: + if self._buffer: + data, size = self._get_buffer() + self._size -= size + if self._size < self._limit and self._protocol._reading_paused: + self._protocol.resume_reading() + return data + if self._exception is not None: + raise self._exception + raise EofStream + + +class WebSocketReader: + def __init__( + self, queue: WebSocketDataQueue, max_msg_size: int, compress: bool = True + ) -> None: + self.queue = queue + self._max_msg_size = max_msg_size + + self._exc: Optional[Exception] = None + self._partial = bytearray() + self._state = READ_HEADER + + self._opcode: int = OP_CODE_NOT_SET + self._frame_fin = False + self._frame_opcode: int = OP_CODE_NOT_SET + self._payload_fragments: list[bytes] = [] + self._frame_payload_len = 0 + + self._tail: bytes = b"" + self._has_mask = False + self._frame_mask: Optional[bytes] = None + self._payload_bytes_to_read = 0 + self._payload_len_flag = 0 + self._compressed: int = COMPRESSED_NOT_SET + self._decompressobj: Optional[ZLibDecompressor] = None + self._compress = compress + + def feed_eof(self) -> None: + self.queue.feed_eof() + + # data can be bytearray on Windows because proactor event loop uses bytearray + # and asyncio types this to Union[bytes, bytearray, memoryview] so we need + # coerce data to bytes if it is not + def feed_data( + self, data: Union[bytes, bytearray, memoryview] + ) -> Tuple[bool, bytes]: + if type(data) is not bytes: + data = bytes(data) + + if self._exc is not None: + return True, data + + try: + self._feed_data(data) + except Exception as exc: + self._exc = exc + set_exception(self.queue, exc) + return EMPTY_FRAME_ERROR + + return EMPTY_FRAME + + def _handle_frame( + self, + fin: bool, + opcode: Union[int, cython_int], # Union intended: Cython pxd uses C int + payload: Union[bytes, bytearray], + compressed: Union[int, cython_int], # Union intended: Cython pxd uses C int + ) -> None: + msg: WSMessage + if opcode in {OP_CODE_TEXT, OP_CODE_BINARY, OP_CODE_CONTINUATION}: + # Validate continuation frames before processing + if opcode == OP_CODE_CONTINUATION and self._opcode == OP_CODE_NOT_SET: + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, + "Continuation frame for non started message", + ) + + # load text/binary + if not fin: + # got partial frame payload + if opcode != OP_CODE_CONTINUATION: + self._opcode = opcode + self._partial += payload + if self._max_msg_size and len(self._partial) >= self._max_msg_size: + raise WebSocketError( + WSCloseCode.MESSAGE_TOO_BIG, + f"Message size {len(self._partial)} " + f"exceeds limit {self._max_msg_size}", + ) + return + + has_partial = bool(self._partial) + if opcode == OP_CODE_CONTINUATION: + opcode = self._opcode + self._opcode = OP_CODE_NOT_SET + # previous frame was non finished + # we should get continuation opcode + elif has_partial: + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, + "The opcode in non-fin frame is expected " + f"to be zero, got {opcode!r}", + ) + + assembled_payload: Union[bytes, bytearray] + if has_partial: + assembled_payload = self._partial + payload + self._partial.clear() + else: + assembled_payload = payload + + if self._max_msg_size and len(assembled_payload) >= self._max_msg_size: + raise WebSocketError( + WSCloseCode.MESSAGE_TOO_BIG, + f"Message size {len(assembled_payload)} " + f"exceeds limit {self._max_msg_size}", + ) + + # Decompress process must to be done after all packets + # received. + if compressed: + if not self._decompressobj: + self._decompressobj = ZLibDecompressor(suppress_deflate_header=True) + # XXX: It's possible that the zlib backend (isal is known to + # do this, maybe others too?) will return max_length bytes, + # but internally buffer more data such that the payload is + # >max_length, so we return one extra byte and if we're able + # to do that, then the message is too big. + payload_merged = self._decompressobj.decompress_sync( + assembled_payload + WS_DEFLATE_TRAILING, + ( + self._max_msg_size + 1 + if self._max_msg_size + else self._max_msg_size + ), + ) + if self._max_msg_size and len(payload_merged) > self._max_msg_size: + raise WebSocketError( + WSCloseCode.MESSAGE_TOO_BIG, + f"Decompressed message exceeds size limit {self._max_msg_size}", + ) + elif type(assembled_payload) is bytes: + payload_merged = assembled_payload + else: + payload_merged = bytes(assembled_payload) + + if opcode == OP_CODE_TEXT: + try: + text = payload_merged.decode("utf-8") + except UnicodeDecodeError as exc: + raise WebSocketError( + WSCloseCode.INVALID_TEXT, "Invalid UTF-8 text message" + ) from exc + + # XXX: The Text and Binary messages here can be a performance + # bottleneck, so we use tuple.__new__ to improve performance. + # This is not type safe, but many tests should fail in + # test_client_ws_functional.py if this is wrong. + self.queue.feed_data( + TUPLE_NEW(WSMessage, (WS_MSG_TYPE_TEXT, text, "")), + len(payload_merged), + ) + else: + self.queue.feed_data( + TUPLE_NEW(WSMessage, (WS_MSG_TYPE_BINARY, payload_merged, "")), + len(payload_merged), + ) + elif opcode == OP_CODE_CLOSE: + if len(payload) >= 2: + close_code = UNPACK_CLOSE_CODE(payload[:2])[0] + if close_code < 3000 and close_code not in ALLOWED_CLOSE_CODES: + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, + f"Invalid close code: {close_code}", + ) + try: + close_message = payload[2:].decode("utf-8") + except UnicodeDecodeError as exc: + raise WebSocketError( + WSCloseCode.INVALID_TEXT, "Invalid UTF-8 text message" + ) from exc + msg = TUPLE_NEW(WSMessage, (WSMsgType.CLOSE, close_code, close_message)) + elif payload: + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, + f"Invalid close frame: {fin} {opcode} {payload!r}", + ) + else: + msg = TUPLE_NEW(WSMessage, (WSMsgType.CLOSE, 0, "")) + + self.queue.feed_data(msg, 0) + elif opcode == OP_CODE_PING: + msg = TUPLE_NEW(WSMessage, (WSMsgType.PING, payload, "")) + self.queue.feed_data(msg, len(payload)) + elif opcode == OP_CODE_PONG: + msg = TUPLE_NEW(WSMessage, (WSMsgType.PONG, payload, "")) + self.queue.feed_data(msg, len(payload)) + else: + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, f"Unexpected opcode={opcode!r}" + ) + + def _feed_data(self, data: bytes) -> None: + """Return the next frame from the socket.""" + if self._tail: + data, self._tail = self._tail + data, b"" + + start_pos: int = 0 + data_len = len(data) + data_cstr = data + + while True: + # read header + if self._state == READ_HEADER: + if data_len - start_pos < 2: + break + first_byte = data_cstr[start_pos] + second_byte = data_cstr[start_pos + 1] + start_pos += 2 + + fin = (first_byte >> 7) & 1 + rsv1 = (first_byte >> 6) & 1 + rsv2 = (first_byte >> 5) & 1 + rsv3 = (first_byte >> 4) & 1 + opcode = first_byte & 0xF + + # frame-fin = %x0 ; more frames of this message follow + # / %x1 ; final frame of this message + # frame-rsv1 = %x0 ; + # 1 bit, MUST be 0 unless negotiated otherwise + # frame-rsv2 = %x0 ; + # 1 bit, MUST be 0 unless negotiated otherwise + # frame-rsv3 = %x0 ; + # 1 bit, MUST be 0 unless negotiated otherwise + # + # Remove rsv1 from this test for deflate development + if rsv2 or rsv3 or (rsv1 and not self._compress): + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, + "Received frame with non-zero reserved bits", + ) + + if opcode > 0x7 and fin == 0: + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, + "Received fragmented control frame", + ) + + has_mask = (second_byte >> 7) & 1 + length = second_byte & 0x7F + + # Control frames MUST have a payload + # length of 125 bytes or less + if opcode > 0x7 and length > 125: + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, + "Control frame payload cannot be larger than 125 bytes", + ) + + # Set compress status if last package is FIN + # OR set compress status if this is first fragment + # Raise error if not first fragment with rsv1 = 0x1 + if self._frame_fin or self._compressed == COMPRESSED_NOT_SET: + self._compressed = COMPRESSED_TRUE if rsv1 else COMPRESSED_FALSE + elif rsv1: + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, + "Received frame with non-zero reserved bits", + ) + + self._frame_fin = bool(fin) + self._frame_opcode = opcode + self._has_mask = bool(has_mask) + self._payload_len_flag = length + self._state = READ_PAYLOAD_LENGTH + + # read payload length + if self._state == READ_PAYLOAD_LENGTH: + len_flag = self._payload_len_flag + if len_flag == 126: + if data_len - start_pos < 2: + break + first_byte = data_cstr[start_pos] + second_byte = data_cstr[start_pos + 1] + start_pos += 2 + self._payload_bytes_to_read = first_byte << 8 | second_byte + elif len_flag > 126: + if data_len - start_pos < 8: + break + self._payload_bytes_to_read = UNPACK_LEN3(data, start_pos)[0] + start_pos += 8 + else: + self._payload_bytes_to_read = len_flag + + self._state = READ_PAYLOAD_MASK if self._has_mask else READ_PAYLOAD + + # read payload mask + if self._state == READ_PAYLOAD_MASK: + if data_len - start_pos < 4: + break + self._frame_mask = data_cstr[start_pos : start_pos + 4] + start_pos += 4 + self._state = READ_PAYLOAD + + if self._state == READ_PAYLOAD: + chunk_len = data_len - start_pos + if self._payload_bytes_to_read >= chunk_len: + f_end_pos = data_len + self._payload_bytes_to_read -= chunk_len + else: + f_end_pos = start_pos + self._payload_bytes_to_read + self._payload_bytes_to_read = 0 + + had_fragments = self._frame_payload_len + self._frame_payload_len += f_end_pos - start_pos + f_start_pos = start_pos + start_pos = f_end_pos + + if self._payload_bytes_to_read != 0: + # If we don't have a complete frame, we need to save the + # data for the next call to feed_data. + self._payload_fragments.append(data_cstr[f_start_pos:f_end_pos]) + break + + payload: Union[bytes, bytearray] + if had_fragments: + # We have to join the payload fragments get the payload + self._payload_fragments.append(data_cstr[f_start_pos:f_end_pos]) + if self._has_mask: + assert self._frame_mask is not None + payload_bytearray = bytearray(b"".join(self._payload_fragments)) + websocket_mask(self._frame_mask, payload_bytearray) + payload = payload_bytearray + else: + payload = b"".join(self._payload_fragments) + self._payload_fragments.clear() + elif self._has_mask: + assert self._frame_mask is not None + payload_bytearray = data_cstr[f_start_pos:f_end_pos] # type: ignore[assignment] + if type(payload_bytearray) is not bytearray: # pragma: no branch + # Cython will do the conversion for us + # but we need to do it for Python and we + # will always get here in Python + payload_bytearray = bytearray(payload_bytearray) + websocket_mask(self._frame_mask, payload_bytearray) + payload = payload_bytearray + else: + payload = data_cstr[f_start_pos:f_end_pos] + + self._handle_frame( + self._frame_fin, self._frame_opcode, payload, self._compressed + ) + self._frame_payload_len = 0 + self._state = READ_HEADER + + # XXX: Cython needs slices to be bounded, so we can't omit the slice end here. + self._tail = data_cstr[start_pos:data_len] if start_pos < data_len else b"" diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/writer.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/writer.py new file mode 100644 index 0000000..9604202 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/_websocket/writer.py @@ -0,0 +1,262 @@ +"""WebSocket protocol versions 13 and 8.""" + +import asyncio +import random +import sys +from functools import partial +from typing import Final, Optional, Set, Union + +from ..base_protocol import BaseProtocol +from ..client_exceptions import ClientConnectionResetError +from ..compression_utils import ZLibBackend, ZLibCompressor +from .helpers import ( + MASK_LEN, + MSG_SIZE, + PACK_CLOSE_CODE, + PACK_LEN1, + PACK_LEN2, + PACK_LEN3, + PACK_RANDBITS, + websocket_mask, +) +from .models import WS_DEFLATE_TRAILING, WSMsgType + +DEFAULT_LIMIT: Final[int] = 2**16 + +# WebSocket opcode boundary: opcodes 0-7 are data frames, 8-15 are control frames +# Control frames (ping, pong, close) are never compressed +WS_CONTROL_FRAME_OPCODE: Final[int] = 8 + +# For websockets, keeping latency low is extremely important as implementations +# generally expect to be able to send and receive messages quickly. We use a +# larger chunk size to reduce the number of executor calls and avoid task +# creation overhead, since both are significant sources of latency when chunks +# are small. A size of 16KiB was chosen as a balance between avoiding task +# overhead and not blocking the event loop too long with synchronous compression. + +WEBSOCKET_MAX_SYNC_CHUNK_SIZE = 16 * 1024 + + +class WebSocketWriter: + """WebSocket writer. + + The writer is responsible for sending messages to the client. It is + created by the protocol when a connection is established. The writer + should avoid implementing any application logic and should only be + concerned with the low-level details of the WebSocket protocol. + """ + + def __init__( + self, + protocol: BaseProtocol, + transport: asyncio.Transport, + *, + use_mask: bool = False, + limit: int = DEFAULT_LIMIT, + random: random.Random = random.Random(), + compress: int = 0, + notakeover: bool = False, + ) -> None: + """Initialize a WebSocket writer.""" + self.protocol = protocol + self.transport = transport + self.use_mask = use_mask + self.get_random_bits = partial(random.getrandbits, 32) + self.compress = compress + self.notakeover = notakeover + self._closing = False + self._limit = limit + self._output_size = 0 + self._compressobj: Optional[ZLibCompressor] = None + self._send_lock = asyncio.Lock() + self._background_tasks: Set[asyncio.Task[None]] = set() + + async def send_frame( + self, message: bytes, opcode: int, compress: Optional[int] = None + ) -> None: + """Send a frame over the websocket with message as its payload.""" + if self._closing and not (opcode & WSMsgType.CLOSE): + raise ClientConnectionResetError("Cannot write to closing transport") + + if not (compress or self.compress) or opcode >= WS_CONTROL_FRAME_OPCODE: + # Non-compressed frames don't need lock or shield + self._write_websocket_frame(message, opcode, 0) + elif len(message) <= WEBSOCKET_MAX_SYNC_CHUNK_SIZE: + # Small compressed payloads - compress synchronously in event loop + # We need the lock even though sync compression has no await points. + # This prevents small frames from interleaving with large frames that + # compress in the executor, avoiding compressor state corruption. + async with self._send_lock: + self._send_compressed_frame_sync(message, opcode, compress) + else: + # Large compressed frames need shield to prevent corruption + # For large compressed frames, the entire compress+send + # operation must be atomic. If cancelled after compression but + # before send, the compressor state would be advanced but data + # not sent, corrupting subsequent frames. + # Create a task to shield from cancellation + # The lock is acquired inside the shielded task so the entire + # operation (lock + compress + send) completes atomically. + # Use eager_start on Python 3.12+ to avoid scheduling overhead + loop = asyncio.get_running_loop() + coro = self._send_compressed_frame_async_locked(message, opcode, compress) + if sys.version_info >= (3, 12): + send_task = asyncio.Task(coro, loop=loop, eager_start=True) + else: + send_task = loop.create_task(coro) + # Keep a strong reference to prevent garbage collection + self._background_tasks.add(send_task) + send_task.add_done_callback(self._background_tasks.discard) + await asyncio.shield(send_task) + + # It is safe to return control to the event loop when using compression + # after this point as we have already sent or buffered all the data. + # Once we have written output_size up to the limit, we call the + # drain helper which waits for the transport to be ready to accept + # more data. This is a flow control mechanism to prevent the buffer + # from growing too large. The drain helper will return right away + # if the writer is not paused. + if self._output_size > self._limit: + self._output_size = 0 + if self.protocol._paused: + await self.protocol._drain_helper() + + def _write_websocket_frame(self, message: bytes, opcode: int, rsv: int) -> None: + """ + Write a websocket frame to the transport. + + This method handles frame header construction, masking, and writing to transport. + It does not handle compression or flow control - those are the responsibility + of the caller. + """ + msg_length = len(message) + + use_mask = self.use_mask + mask_bit = 0x80 if use_mask else 0 + + # Depending on the message length, the header is assembled differently. + # The first byte is reserved for the opcode and the RSV bits. + first_byte = 0x80 | rsv | opcode + if msg_length < 126: + header = PACK_LEN1(first_byte, msg_length | mask_bit) + header_len = 2 + elif msg_length < 65536: + header = PACK_LEN2(first_byte, 126 | mask_bit, msg_length) + header_len = 4 + else: + header = PACK_LEN3(first_byte, 127 | mask_bit, msg_length) + header_len = 10 + + if self.transport.is_closing(): + raise ClientConnectionResetError("Cannot write to closing transport") + + # https://datatracker.ietf.org/doc/html/rfc6455#section-5.3 + # If we are using a mask, we need to generate it randomly + # and apply it to the message before sending it. A mask is + # a 32-bit value that is applied to the message using a + # bitwise XOR operation. It is used to prevent certain types + # of attacks on the websocket protocol. The mask is only used + # when aiohttp is acting as a client. Servers do not use a mask. + if use_mask: + mask = PACK_RANDBITS(self.get_random_bits()) + message = bytearray(message) + websocket_mask(mask, message) + self.transport.write(header + mask + message) + self._output_size += MASK_LEN + elif msg_length > MSG_SIZE: + self.transport.write(header) + self.transport.write(message) + else: + self.transport.write(header + message) + + self._output_size += header_len + msg_length + + def _get_compressor(self, compress: Optional[int]) -> ZLibCompressor: + """Get or create a compressor object for the given compression level.""" + if compress: + # Do not set self._compress if compressing is for this frame + return ZLibCompressor( + level=ZLibBackend.Z_BEST_SPEED, + wbits=-compress, + max_sync_chunk_size=WEBSOCKET_MAX_SYNC_CHUNK_SIZE, + ) + if not self._compressobj: + self._compressobj = ZLibCompressor( + level=ZLibBackend.Z_BEST_SPEED, + wbits=-self.compress, + max_sync_chunk_size=WEBSOCKET_MAX_SYNC_CHUNK_SIZE, + ) + return self._compressobj + + def _send_compressed_frame_sync( + self, message: bytes, opcode: int, compress: Optional[int] + ) -> None: + """ + Synchronous send for small compressed frames. + + This is used for small compressed payloads that compress synchronously in the event loop. + Since there are no await points, this is inherently cancellation-safe. + """ + # RSV are the reserved bits in the frame header. They are used to + # indicate that the frame is using an extension. + # https://datatracker.ietf.org/doc/html/rfc6455#section-5.2 + compressobj = self._get_compressor(compress) + # (0x40) RSV1 is set for compressed frames + # https://datatracker.ietf.org/doc/html/rfc7692#section-7.2.3.1 + self._write_websocket_frame( + ( + compressobj.compress_sync(message) + + compressobj.flush( + ZLibBackend.Z_FULL_FLUSH + if self.notakeover + else ZLibBackend.Z_SYNC_FLUSH + ) + ).removesuffix(WS_DEFLATE_TRAILING), + opcode, + 0x40, + ) + + async def _send_compressed_frame_async_locked( + self, message: bytes, opcode: int, compress: Optional[int] + ) -> None: + """ + Async send for large compressed frames with lock. + + Acquires the lock and compresses large payloads asynchronously in + the executor. The lock is held for the entire operation to ensure + the compressor state is not corrupted by concurrent sends. + + MUST be run shielded from cancellation. If cancelled after + compression but before sending, the compressor state would be + advanced but data not sent, corrupting subsequent frames. + """ + async with self._send_lock: + # RSV are the reserved bits in the frame header. They are used to + # indicate that the frame is using an extension. + # https://datatracker.ietf.org/doc/html/rfc6455#section-5.2 + compressobj = self._get_compressor(compress) + # (0x40) RSV1 is set for compressed frames + # https://datatracker.ietf.org/doc/html/rfc7692#section-7.2.3.1 + self._write_websocket_frame( + ( + await compressobj.compress(message) + + compressobj.flush( + ZLibBackend.Z_FULL_FLUSH + if self.notakeover + else ZLibBackend.Z_SYNC_FLUSH + ) + ).removesuffix(WS_DEFLATE_TRAILING), + opcode, + 0x40, + ) + + async def close(self, code: int = 1000, message: Union[bytes, str] = b"") -> None: + """Close the websocket, sending the specified code and message.""" + if isinstance(message, str): + message = message.encode("utf-8") + try: + await self.send_frame( + PACK_CLOSE_CODE(code) + message, opcode=WSMsgType.CLOSE + ) + finally: + self._closing = True diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/abc.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/abc.py new file mode 100644 index 0000000..faf0957 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/abc.py @@ -0,0 +1,268 @@ +import asyncio +import logging +import socket +from abc import ABC, abstractmethod +from collections.abc import Sized +from http.cookies import BaseCookie, Morsel +from typing import ( + TYPE_CHECKING, + Any, + Awaitable, + Callable, + Dict, + Generator, + Iterable, + List, + Optional, + Sequence, + Tuple, + TypedDict, + Union, +) + +from multidict import CIMultiDict +from yarl import URL + +from ._cookie_helpers import parse_set_cookie_headers +from .typedefs import LooseCookies + +if TYPE_CHECKING: + from .web_app import Application + from .web_exceptions import HTTPException + from .web_request import BaseRequest, Request + from .web_response import StreamResponse +else: + BaseRequest = Request = Application = StreamResponse = None + HTTPException = None + + +class AbstractRouter(ABC): + def __init__(self) -> None: + self._frozen = False + + def post_init(self, app: Application) -> None: + """Post init stage. + + Not an abstract method for sake of backward compatibility, + but if the router wants to be aware of the application + it can override this. + """ + + @property + def frozen(self) -> bool: + return self._frozen + + def freeze(self) -> None: + """Freeze router.""" + self._frozen = True + + @abstractmethod + async def resolve(self, request: Request) -> "AbstractMatchInfo": + """Return MATCH_INFO for given request""" + + +class AbstractMatchInfo(ABC): + + __slots__ = () + + @property # pragma: no branch + @abstractmethod + def handler(self) -> Callable[[Request], Awaitable[StreamResponse]]: + """Execute matched request handler""" + + @property + @abstractmethod + def expect_handler( + self, + ) -> Callable[[Request], Awaitable[Optional[StreamResponse]]]: + """Expect handler for 100-continue processing""" + + @property # pragma: no branch + @abstractmethod + def http_exception(self) -> Optional[HTTPException]: + """HTTPException instance raised on router's resolving, or None""" + + @abstractmethod # pragma: no branch + def get_info(self) -> Dict[str, Any]: + """Return a dict with additional info useful for introspection""" + + @property # pragma: no branch + @abstractmethod + def apps(self) -> Tuple[Application, ...]: + """Stack of nested applications. + + Top level application is left-most element. + + """ + + @abstractmethod + def add_app(self, app: Application) -> None: + """Add application to the nested apps stack.""" + + @abstractmethod + def freeze(self) -> None: + """Freeze the match info. + + The method is called after route resolution. + + After the call .add_app() is forbidden. + + """ + + +class AbstractView(ABC): + """Abstract class based view.""" + + def __init__(self, request: Request) -> None: + self._request = request + + @property + def request(self) -> Request: + """Request instance.""" + return self._request + + @abstractmethod + def __await__(self) -> Generator[None, None, StreamResponse]: + """Execute the view handler.""" + + +class ResolveResult(TypedDict): + """Resolve result. + + This is the result returned from an AbstractResolver's + resolve method. + + :param hostname: The hostname that was provided. + :param host: The IP address that was resolved. + :param port: The port that was resolved. + :param family: The address family that was resolved. + :param proto: The protocol that was resolved. + :param flags: The flags that were resolved. + """ + + hostname: str + host: str + port: int + family: int + proto: int + flags: int + + +class AbstractResolver(ABC): + """Abstract DNS resolver.""" + + @abstractmethod + async def resolve( + self, host: str, port: int = 0, family: socket.AddressFamily = socket.AF_INET + ) -> List[ResolveResult]: + """Return IP address for given hostname""" + + @abstractmethod + async def close(self) -> None: + """Release resolver""" + + +if TYPE_CHECKING: + IterableBase = Iterable[Morsel[str]] +else: + IterableBase = Iterable + + +ClearCookiePredicate = Callable[["Morsel[str]"], bool] + + +class AbstractCookieJar(Sized, IterableBase): + """Abstract Cookie Jar.""" + + def __init__(self, *, loop: Optional[asyncio.AbstractEventLoop] = None) -> None: + self._loop = loop or asyncio.get_running_loop() + + @property + @abstractmethod + def quote_cookie(self) -> bool: + """Return True if cookies should be quoted.""" + + @abstractmethod + def clear(self, predicate: Optional[ClearCookiePredicate] = None) -> None: + """Clear all cookies if no predicate is passed.""" + + @abstractmethod + def clear_domain(self, domain: str) -> None: + """Clear all cookies for domain and all subdomains.""" + + @abstractmethod + def update_cookies(self, cookies: LooseCookies, response_url: URL = URL()) -> None: + """Update cookies.""" + + def update_cookies_from_headers( + self, headers: Sequence[str], response_url: URL + ) -> None: + """Update cookies from raw Set-Cookie headers.""" + if headers and (cookies_to_update := parse_set_cookie_headers(headers)): + self.update_cookies(cookies_to_update, response_url) + + @abstractmethod + def filter_cookies(self, request_url: URL) -> "BaseCookie[str]": + """Return the jar's cookies filtered by their attributes.""" + + +class AbstractStreamWriter(ABC): + """Abstract stream writer.""" + + buffer_size: int = 0 + output_size: int = 0 + length: Optional[int] = 0 + + @abstractmethod + async def write(self, chunk: Union[bytes, bytearray, memoryview]) -> None: + """Write chunk into stream.""" + + @abstractmethod + async def write_eof(self, chunk: bytes = b"") -> None: + """Write last chunk.""" + + @abstractmethod + async def drain(self) -> None: + """Flush the write buffer.""" + + @abstractmethod + def enable_compression( + self, encoding: str = "deflate", strategy: Optional[int] = None + ) -> None: + """Enable HTTP body compression""" + + @abstractmethod + def enable_chunking(self) -> None: + """Enable HTTP chunked mode""" + + @abstractmethod + async def write_headers( + self, status_line: str, headers: "CIMultiDict[str]" + ) -> None: + """Write HTTP headers""" + + def send_headers(self) -> None: + """Force sending buffered headers if not already sent. + + Required only if write_headers() buffers headers instead of sending immediately. + For backwards compatibility, this method does nothing by default. + """ + + +class AbstractAccessLogger(ABC): + """Abstract writer to access log.""" + + __slots__ = ("logger", "log_format") + + def __init__(self, logger: logging.Logger, log_format: str) -> None: + self.logger = logger + self.log_format = log_format + + @abstractmethod + def log(self, request: BaseRequest, response: StreamResponse, time: float) -> None: + """Emit log to logger.""" + + @property + def enabled(self) -> bool: + """Check if logger is enabled.""" + return True diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/base_protocol.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/base_protocol.py new file mode 100644 index 0000000..b0a67ed --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/base_protocol.py @@ -0,0 +1,100 @@ +import asyncio +from typing import Optional, cast + +from .client_exceptions import ClientConnectionResetError +from .helpers import set_exception +from .tcp_helpers import tcp_nodelay + + +class BaseProtocol(asyncio.Protocol): + __slots__ = ( + "_loop", + "_paused", + "_drain_waiter", + "_connection_lost", + "_reading_paused", + "transport", + ) + + def __init__(self, loop: asyncio.AbstractEventLoop) -> None: + self._loop: asyncio.AbstractEventLoop = loop + self._paused = False + self._drain_waiter: Optional[asyncio.Future[None]] = None + self._reading_paused = False + + self.transport: Optional[asyncio.Transport] = None + + @property + def connected(self) -> bool: + """Return True if the connection is open.""" + return self.transport is not None + + @property + def writing_paused(self) -> bool: + return self._paused + + def pause_writing(self) -> None: + assert not self._paused + self._paused = True + + def resume_writing(self) -> None: + assert self._paused + self._paused = False + + waiter = self._drain_waiter + if waiter is not None: + self._drain_waiter = None + if not waiter.done(): + waiter.set_result(None) + + def pause_reading(self) -> None: + if not self._reading_paused and self.transport is not None: + try: + self.transport.pause_reading() + except (AttributeError, NotImplementedError, RuntimeError): + pass + self._reading_paused = True + + def resume_reading(self) -> None: + if self._reading_paused and self.transport is not None: + try: + self.transport.resume_reading() + except (AttributeError, NotImplementedError, RuntimeError): + pass + self._reading_paused = False + + def connection_made(self, transport: asyncio.BaseTransport) -> None: + tr = cast(asyncio.Transport, transport) + tcp_nodelay(tr, True) + self.transport = tr + + def connection_lost(self, exc: Optional[BaseException]) -> None: + # Wake up the writer if currently paused. + self.transport = None + if not self._paused: + return + waiter = self._drain_waiter + if waiter is None: + return + self._drain_waiter = None + if waiter.done(): + return + if exc is None: + waiter.set_result(None) + else: + set_exception( + waiter, + ConnectionError("Connection lost"), + exc, + ) + + async def _drain_helper(self) -> None: + if self.transport is None: + raise ClientConnectionResetError("Connection lost") + if not self._paused: + return + waiter = self._drain_waiter + if waiter is None: + waiter = self._loop.create_future() + self._drain_waiter = waiter + await asyncio.shield(waiter) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client.py new file mode 100644 index 0000000..bc4ee17 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client.py @@ -0,0 +1,1635 @@ +"""HTTP Client for asyncio.""" + +import asyncio +import base64 +import hashlib +import json +import os +import sys +import traceback +import warnings +from contextlib import suppress +from types import TracebackType +from typing import ( + TYPE_CHECKING, + Any, + Awaitable, + Callable, + Coroutine, + Final, + FrozenSet, + Generator, + Generic, + Iterable, + List, + Mapping, + Optional, + Sequence, + Set, + Tuple, + Type, + TypedDict, + TypeVar, + Union, +) + +import attr +from multidict import CIMultiDict, MultiDict, MultiDictProxy, istr +from yarl import URL + +from . import hdrs, http, payload +from ._websocket.reader import WebSocketDataQueue +from .abc import AbstractCookieJar +from .client_exceptions import ( + ClientConnectionError, + ClientConnectionResetError, + ClientConnectorCertificateError, + ClientConnectorDNSError, + ClientConnectorError, + ClientConnectorSSLError, + ClientError, + ClientHttpProxyError, + ClientOSError, + ClientPayloadError, + ClientProxyConnectionError, + ClientResponseError, + ClientSSLError, + ConnectionTimeoutError, + ContentTypeError, + InvalidURL, + InvalidUrlClientError, + InvalidUrlRedirectClientError, + NonHttpUrlClientError, + NonHttpUrlRedirectClientError, + RedirectClientError, + ServerConnectionError, + ServerDisconnectedError, + ServerFingerprintMismatch, + ServerTimeoutError, + SocketTimeoutError, + TooManyRedirects, + WSMessageTypeError, + WSServerHandshakeError, +) +from .client_middlewares import ClientMiddlewareType, build_client_middlewares +from .client_reqrep import ( + ClientRequest as ClientRequest, + ClientResponse as ClientResponse, + Fingerprint as Fingerprint, + RequestInfo as RequestInfo, + _merge_ssl_params, +) +from .client_ws import ( + DEFAULT_WS_CLIENT_TIMEOUT, + ClientWebSocketResponse as ClientWebSocketResponse, + ClientWSTimeout as ClientWSTimeout, +) +from .connector import ( + HTTP_AND_EMPTY_SCHEMA_SET, + BaseConnector as BaseConnector, + NamedPipeConnector as NamedPipeConnector, + TCPConnector as TCPConnector, + UnixConnector as UnixConnector, +) +from .cookiejar import CookieJar +from .helpers import ( + _SENTINEL, + DEBUG, + EMPTY_BODY_METHODS, + BasicAuth, + TimeoutHandle, + basicauth_from_netrc, + get_env_proxy_for_url, + netrc_from_env, + sentinel, + strip_auth_from_url, +) +from .http import WS_KEY, HttpVersion, WebSocketReader, WebSocketWriter +from .http_websocket import WSHandshakeError, ws_ext_gen, ws_ext_parse +from .tracing import Trace, TraceConfig +from .typedefs import JSONEncoder, LooseCookies, LooseHeaders, Query, StrOrURL + +__all__ = ( + # client_exceptions + "ClientConnectionError", + "ClientConnectionResetError", + "ClientConnectorCertificateError", + "ClientConnectorDNSError", + "ClientConnectorError", + "ClientConnectorSSLError", + "ClientError", + "ClientHttpProxyError", + "ClientOSError", + "ClientPayloadError", + "ClientProxyConnectionError", + "ClientResponseError", + "ClientSSLError", + "ConnectionTimeoutError", + "ContentTypeError", + "InvalidURL", + "InvalidUrlClientError", + "RedirectClientError", + "NonHttpUrlClientError", + "InvalidUrlRedirectClientError", + "NonHttpUrlRedirectClientError", + "ServerConnectionError", + "ServerDisconnectedError", + "ServerFingerprintMismatch", + "ServerTimeoutError", + "SocketTimeoutError", + "TooManyRedirects", + "WSServerHandshakeError", + # client_reqrep + "ClientRequest", + "ClientResponse", + "Fingerprint", + "RequestInfo", + # connector + "BaseConnector", + "TCPConnector", + "UnixConnector", + "NamedPipeConnector", + # client_ws + "ClientWebSocketResponse", + # client + "ClientSession", + "ClientTimeout", + "ClientWSTimeout", + "request", + "WSMessageTypeError", +) + + +if TYPE_CHECKING: + from ssl import SSLContext +else: + SSLContext = None + +if sys.version_info >= (3, 11) and TYPE_CHECKING: + from typing import Unpack + + +class _RequestOptions(TypedDict, total=False): + params: Query + data: Any + json: Any + cookies: Union[LooseCookies, None] + headers: Union[LooseHeaders, None] + skip_auto_headers: Union[Iterable[str], None] + auth: Union[BasicAuth, None] + allow_redirects: bool + max_redirects: int + compress: Union[str, bool, None] + chunked: Union[bool, None] + expect100: bool + raise_for_status: Union[None, bool, Callable[[ClientResponse], Awaitable[None]]] + read_until_eof: bool + proxy: Union[StrOrURL, None] + proxy_auth: Union[BasicAuth, None] + timeout: "Union[ClientTimeout, _SENTINEL, None]" + ssl: Union[SSLContext, bool, Fingerprint] + server_hostname: Union[str, None] + proxy_headers: Union[LooseHeaders, None] + trace_request_ctx: Union[Mapping[str, Any], None] + read_bufsize: Union[int, None] + auto_decompress: Union[bool, None] + max_line_size: Union[int, None] + max_field_size: Union[int, None] + middlewares: Optional[Sequence[ClientMiddlewareType]] + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class ClientTimeout: + total: Optional[float] = None + connect: Optional[float] = None + sock_read: Optional[float] = None + sock_connect: Optional[float] = None + ceil_threshold: float = 5 + + # pool_queue_timeout: Optional[float] = None + # dns_resolution_timeout: Optional[float] = None + # socket_connect_timeout: Optional[float] = None + # connection_acquiring_timeout: Optional[float] = None + # new_connection_timeout: Optional[float] = None + # http_header_timeout: Optional[float] = None + # response_body_timeout: Optional[float] = None + + # to create a timeout specific for a single request, either + # - create a completely new one to overwrite the default + # - or use http://www.attrs.org/en/stable/api.html#attr.evolve + # to overwrite the defaults + + +# 5 Minute default read timeout +DEFAULT_TIMEOUT: Final[ClientTimeout] = ClientTimeout(total=5 * 60, sock_connect=30) + +# https://www.rfc-editor.org/rfc/rfc9110#section-9.2.2 +IDEMPOTENT_METHODS = frozenset({"GET", "HEAD", "OPTIONS", "TRACE", "PUT", "DELETE"}) + +_RetType = TypeVar("_RetType", ClientResponse, ClientWebSocketResponse) +_CharsetResolver = Callable[[ClientResponse, bytes], str] + + +class ClientSession: + """First-class interface for making HTTP requests.""" + + ATTRS = frozenset( + [ + "_base_url", + "_base_url_origin", + "_source_traceback", + "_connector", + "_loop", + "_cookie_jar", + "_connector_owner", + "_default_auth", + "_version", + "_json_serialize", + "_requote_redirect_url", + "_timeout", + "_raise_for_status", + "_auto_decompress", + "_trust_env", + "_default_headers", + "_skip_auto_headers", + "_request_class", + "_response_class", + "_ws_response_class", + "_trace_configs", + "_read_bufsize", + "_max_line_size", + "_max_field_size", + "_resolve_charset", + "_default_proxy", + "_default_proxy_auth", + "_retry_connection", + "_middlewares", + "requote_redirect_url", + ] + ) + + _source_traceback: Optional[traceback.StackSummary] = None + _connector: Optional[BaseConnector] = None + + def __init__( + self, + base_url: Optional[StrOrURL] = None, + *, + connector: Optional[BaseConnector] = None, + loop: Optional[asyncio.AbstractEventLoop] = None, + cookies: Optional[LooseCookies] = None, + headers: Optional[LooseHeaders] = None, + proxy: Optional[StrOrURL] = None, + proxy_auth: Optional[BasicAuth] = None, + skip_auto_headers: Optional[Iterable[str]] = None, + auth: Optional[BasicAuth] = None, + json_serialize: JSONEncoder = json.dumps, + request_class: Type[ClientRequest] = ClientRequest, + response_class: Type[ClientResponse] = ClientResponse, + ws_response_class: Type[ClientWebSocketResponse] = ClientWebSocketResponse, + version: HttpVersion = http.HttpVersion11, + cookie_jar: Optional[AbstractCookieJar] = None, + connector_owner: bool = True, + raise_for_status: Union[ + bool, Callable[[ClientResponse], Awaitable[None]] + ] = False, + read_timeout: Union[float, _SENTINEL] = sentinel, + conn_timeout: Optional[float] = None, + timeout: Union[object, ClientTimeout] = sentinel, + auto_decompress: bool = True, + trust_env: bool = False, + requote_redirect_url: bool = True, + trace_configs: Optional[List[TraceConfig]] = None, + read_bufsize: int = 2**16, + max_line_size: int = 8190, + max_field_size: int = 8190, + fallback_charset_resolver: _CharsetResolver = lambda r, b: "utf-8", + middlewares: Sequence[ClientMiddlewareType] = (), + ssl_shutdown_timeout: Union[_SENTINEL, None, float] = sentinel, + ) -> None: + # We initialise _connector to None immediately, as it's referenced in __del__() + # and could cause issues if an exception occurs during initialisation. + self._connector: Optional[BaseConnector] = None + + if loop is None: + if connector is not None: + loop = connector._loop + + loop = loop or asyncio.get_running_loop() + + if base_url is None or isinstance(base_url, URL): + self._base_url: Optional[URL] = base_url + self._base_url_origin = None if base_url is None else base_url.origin() + else: + self._base_url = URL(base_url) + self._base_url_origin = self._base_url.origin() + assert self._base_url.absolute, "Only absolute URLs are supported" + if self._base_url is not None and not self._base_url.path.endswith("/"): + raise ValueError("base_url must have a trailing '/'") + + if timeout is sentinel or timeout is None: + self._timeout = DEFAULT_TIMEOUT + if read_timeout is not sentinel: + warnings.warn( + "read_timeout is deprecated, use timeout argument instead", + DeprecationWarning, + stacklevel=2, + ) + self._timeout = attr.evolve(self._timeout, total=read_timeout) + if conn_timeout is not None: + self._timeout = attr.evolve(self._timeout, connect=conn_timeout) + warnings.warn( + "conn_timeout is deprecated, use timeout argument instead", + DeprecationWarning, + stacklevel=2, + ) + else: + if not isinstance(timeout, ClientTimeout): + raise ValueError( + f"timeout parameter cannot be of {type(timeout)} type, " + "please use 'timeout=ClientTimeout(...)'", + ) + self._timeout = timeout + if read_timeout is not sentinel: + raise ValueError( + "read_timeout and timeout parameters " + "conflict, please setup " + "timeout.read" + ) + if conn_timeout is not None: + raise ValueError( + "conn_timeout and timeout parameters " + "conflict, please setup " + "timeout.connect" + ) + + if ssl_shutdown_timeout is not sentinel: + warnings.warn( + "The ssl_shutdown_timeout parameter is deprecated and will be removed in aiohttp 4.0", + DeprecationWarning, + stacklevel=2, + ) + + if connector is None: + connector = TCPConnector( + loop=loop, ssl_shutdown_timeout=ssl_shutdown_timeout + ) + + if connector._loop is not loop: + raise RuntimeError("Session and connector has to use same event loop") + + self._loop = loop + + if loop.get_debug(): + self._source_traceback = traceback.extract_stack(sys._getframe(1)) + + if cookie_jar is None: + cookie_jar = CookieJar(loop=loop) + self._cookie_jar = cookie_jar + + if cookies: + self._cookie_jar.update_cookies(cookies) + + self._connector = connector + self._connector_owner = connector_owner + self._default_auth = auth + self._version = version + self._json_serialize = json_serialize + self._raise_for_status = raise_for_status + self._auto_decompress = auto_decompress + self._trust_env = trust_env + self._requote_redirect_url = requote_redirect_url + self._read_bufsize = read_bufsize + self._max_line_size = max_line_size + self._max_field_size = max_field_size + + # Convert to list of tuples + if headers: + real_headers: CIMultiDict[str] = CIMultiDict(headers) + else: + real_headers = CIMultiDict() + self._default_headers: CIMultiDict[str] = real_headers + if skip_auto_headers is not None: + self._skip_auto_headers = frozenset(istr(i) for i in skip_auto_headers) + else: + self._skip_auto_headers = frozenset() + + self._request_class = request_class + self._response_class = response_class + self._ws_response_class = ws_response_class + + self._trace_configs = trace_configs or [] + for trace_config in self._trace_configs: + trace_config.freeze() + + self._resolve_charset = fallback_charset_resolver + + self._default_proxy = proxy + self._default_proxy_auth = proxy_auth + self._retry_connection: bool = True + self._middlewares = middlewares + + def __init_subclass__(cls: Type["ClientSession"]) -> None: + warnings.warn( + "Inheritance class {} from ClientSession " + "is discouraged".format(cls.__name__), + DeprecationWarning, + stacklevel=2, + ) + + if DEBUG: + + def __setattr__(self, name: str, val: Any) -> None: + if name not in self.ATTRS: + warnings.warn( + "Setting custom ClientSession.{} attribute " + "is discouraged".format(name), + DeprecationWarning, + stacklevel=2, + ) + super().__setattr__(name, val) + + def __del__(self, _warnings: Any = warnings) -> None: + if not self.closed: + kwargs = {"source": self} + _warnings.warn( + f"Unclosed client session {self!r}", ResourceWarning, **kwargs + ) + context = {"client_session": self, "message": "Unclosed client session"} + if self._source_traceback is not None: + context["source_traceback"] = self._source_traceback + self._loop.call_exception_handler(context) + + if sys.version_info >= (3, 11) and TYPE_CHECKING: + + def request( + self, + method: str, + url: StrOrURL, + **kwargs: Unpack[_RequestOptions], + ) -> "_RequestContextManager": ... + + else: + + def request( + self, method: str, url: StrOrURL, **kwargs: Any + ) -> "_RequestContextManager": + """Perform HTTP request.""" + return _RequestContextManager(self._request(method, url, **kwargs)) + + def _build_url(self, str_or_url: StrOrURL) -> URL: + url = URL(str_or_url) + if self._base_url and not url.absolute: + return self._base_url.join(url) + return url + + async def _request( + self, + method: str, + str_or_url: StrOrURL, + *, + params: Query = None, + data: Any = None, + json: Any = None, + cookies: Optional[LooseCookies] = None, + headers: Optional[LooseHeaders] = None, + skip_auto_headers: Optional[Iterable[str]] = None, + auth: Optional[BasicAuth] = None, + allow_redirects: bool = True, + max_redirects: int = 10, + compress: Union[str, bool, None] = None, + chunked: Optional[bool] = None, + expect100: bool = False, + raise_for_status: Union[ + None, bool, Callable[[ClientResponse], Awaitable[None]] + ] = None, + read_until_eof: bool = True, + proxy: Optional[StrOrURL] = None, + proxy_auth: Optional[BasicAuth] = None, + timeout: Union[ClientTimeout, _SENTINEL] = sentinel, + verify_ssl: Optional[bool] = None, + fingerprint: Optional[bytes] = None, + ssl_context: Optional[SSLContext] = None, + ssl: Union[SSLContext, bool, Fingerprint] = True, + server_hostname: Optional[str] = None, + proxy_headers: Optional[LooseHeaders] = None, + trace_request_ctx: Optional[Mapping[str, Any]] = None, + read_bufsize: Optional[int] = None, + auto_decompress: Optional[bool] = None, + max_line_size: Optional[int] = None, + max_field_size: Optional[int] = None, + middlewares: Optional[Sequence[ClientMiddlewareType]] = None, + ) -> ClientResponse: + + # NOTE: timeout clamps existing connect and read timeouts. We cannot + # set the default to None because we need to detect if the user wants + # to use the existing timeouts by setting timeout to None. + + if self.closed: + raise RuntimeError("Session is closed") + + ssl = _merge_ssl_params(ssl, verify_ssl, ssl_context, fingerprint) + + if data is not None and json is not None: + raise ValueError( + "data and json parameters can not be used at the same time" + ) + elif json is not None: + data = payload.JsonPayload(json, dumps=self._json_serialize) + + if not isinstance(chunked, bool) and chunked is not None: + warnings.warn("Chunk size is deprecated #1615", DeprecationWarning) + + redirects = 0 + history: List[ClientResponse] = [] + version = self._version + params = params or {} + + # Merge with default headers and transform to CIMultiDict + headers = self._prepare_headers(headers) + + try: + url = self._build_url(str_or_url) + except ValueError as e: + raise InvalidUrlClientError(str_or_url) from e + + assert self._connector is not None + if url.scheme not in self._connector.allowed_protocol_schema_set: + raise NonHttpUrlClientError(url) + + skip_headers: Optional[Iterable[istr]] + if skip_auto_headers is not None: + skip_headers = { + istr(i) for i in skip_auto_headers + } | self._skip_auto_headers + elif self._skip_auto_headers: + skip_headers = self._skip_auto_headers + else: + skip_headers = None + + if proxy is None: + proxy = self._default_proxy + if proxy_auth is None: + proxy_auth = self._default_proxy_auth + + if proxy is None: + proxy_headers = None + else: + proxy_headers = self._prepare_headers(proxy_headers) + try: + proxy = URL(proxy) + except ValueError as e: + raise InvalidURL(proxy) from e + + if timeout is sentinel: + real_timeout: ClientTimeout = self._timeout + else: + if not isinstance(timeout, ClientTimeout): + real_timeout = ClientTimeout(total=timeout) + else: + real_timeout = timeout + # timeout is cumulative for all request operations + # (request, redirects, responses, data consuming) + tm = TimeoutHandle( + self._loop, real_timeout.total, ceil_threshold=real_timeout.ceil_threshold + ) + handle = tm.start() + + if read_bufsize is None: + read_bufsize = self._read_bufsize + + if auto_decompress is None: + auto_decompress = self._auto_decompress + + if max_line_size is None: + max_line_size = self._max_line_size + + if max_field_size is None: + max_field_size = self._max_field_size + + traces = [ + Trace( + self, + trace_config, + trace_config.trace_config_ctx(trace_request_ctx=trace_request_ctx), + ) + for trace_config in self._trace_configs + ] + + for trace in traces: + await trace.send_request_start(method, url.update_query(params), headers) + + timer = tm.timer() + try: + with timer: + # https://www.rfc-editor.org/rfc/rfc9112.html#name-retrying-requests + retry_persistent_connection = ( + self._retry_connection and method in IDEMPOTENT_METHODS + ) + while True: + url, auth_from_url = strip_auth_from_url(url) + if not url.raw_host: + # NOTE: Bail early, otherwise, causes `InvalidURL` through + # NOTE: `self._request_class()` below. + err_exc_cls = ( + InvalidUrlRedirectClientError + if redirects + else InvalidUrlClientError + ) + raise err_exc_cls(url) + # If `auth` was passed for an already authenticated URL, + # disallow only if this is the initial URL; this is to avoid issues + # with sketchy redirects that are not the caller's responsibility + if not history and (auth and auth_from_url): + raise ValueError( + "Cannot combine AUTH argument with " + "credentials encoded in URL" + ) + + # Override the auth with the one from the URL only if we + # have no auth, or if we got an auth from a redirect URL + if auth is None or (history and auth_from_url is not None): + auth = auth_from_url + + if ( + auth is None + and self._default_auth + and ( + not self._base_url or self._base_url_origin == url.origin() + ) + ): + auth = self._default_auth + + # Try netrc if auth is still None and trust_env is enabled. + if auth is None and self._trust_env and url.host is not None: + auth = await self._loop.run_in_executor( + None, self._get_netrc_auth, url.host + ) + + # It would be confusing if we support explicit + # Authorization header with auth argument + if ( + headers is not None + and auth is not None + and hdrs.AUTHORIZATION in headers + ): + raise ValueError( + "Cannot combine AUTHORIZATION header " + "with AUTH argument or credentials " + "encoded in URL" + ) + + all_cookies = self._cookie_jar.filter_cookies(url) + + if cookies is not None: + tmp_cookie_jar = CookieJar( + quote_cookie=self._cookie_jar.quote_cookie + ) + tmp_cookie_jar.update_cookies(cookies) + req_cookies = tmp_cookie_jar.filter_cookies(url) + if req_cookies: + all_cookies.load(req_cookies) + + proxy_: Optional[URL] = None + if proxy is not None: + proxy_ = URL(proxy) + elif self._trust_env: + with suppress(LookupError): + proxy_, proxy_auth = await asyncio.to_thread( + get_env_proxy_for_url, url + ) + + req = self._request_class( + method, + url, + params=params, + headers=headers, + skip_auto_headers=skip_headers, + data=data, + cookies=all_cookies, + auth=auth, + version=version, + compress=compress, + chunked=chunked, + expect100=expect100, + loop=self._loop, + response_class=self._response_class, + proxy=proxy_, + proxy_auth=proxy_auth, + timer=timer, + session=self, + ssl=ssl if ssl is not None else True, + server_hostname=server_hostname, + proxy_headers=proxy_headers, + traces=traces, + trust_env=self.trust_env, + ) + + async def _connect_and_send_request( + req: ClientRequest, + ) -> ClientResponse: + # connection timeout + assert self._connector is not None + try: + conn = await self._connector.connect( + req, traces=traces, timeout=real_timeout + ) + except asyncio.TimeoutError as exc: + raise ConnectionTimeoutError( + f"Connection timeout to host {req.url}" + ) from exc + + assert conn.protocol is not None + conn.protocol.set_response_params( + timer=timer, + skip_payload=req.method in EMPTY_BODY_METHODS, + read_until_eof=read_until_eof, + auto_decompress=auto_decompress, + read_timeout=real_timeout.sock_read, + read_bufsize=read_bufsize, + timeout_ceil_threshold=self._connector._timeout_ceil_threshold, + max_line_size=max_line_size, + max_field_size=max_field_size, + ) + try: + resp = await req.send(conn) + try: + await resp.start(conn) + except BaseException: + resp.close() + raise + except BaseException: + conn.close() + raise + return resp + + # Apply middleware (if any) - per-request middleware overrides session middleware + effective_middlewares = ( + self._middlewares if middlewares is None else middlewares + ) + + if effective_middlewares: + handler = build_client_middlewares( + _connect_and_send_request, effective_middlewares + ) + else: + handler = _connect_and_send_request + + try: + resp = await handler(req) + # Client connector errors should not be retried + except ( + ConnectionTimeoutError, + ClientConnectorError, + ClientConnectorCertificateError, + ClientConnectorSSLError, + ): + raise + except (ClientOSError, ServerDisconnectedError): + if retry_persistent_connection: + retry_persistent_connection = False + continue + raise + except ClientError: + raise + except OSError as exc: + if exc.errno is None and isinstance(exc, asyncio.TimeoutError): + raise + raise ClientOSError(*exc.args) from exc + + # Update cookies from raw headers to preserve duplicates + if resp._raw_cookie_headers: + self._cookie_jar.update_cookies_from_headers( + resp._raw_cookie_headers, resp.url + ) + + # redirects + if resp.status in (301, 302, 303, 307, 308) and allow_redirects: + + for trace in traces: + await trace.send_request_redirect( + method, url.update_query(params), headers, resp + ) + + redirects += 1 + history.append(resp) + if max_redirects and redirects >= max_redirects: + if req._body is not None: + await req._body.close() + resp.close() + raise TooManyRedirects( + history[0].request_info, tuple(history) + ) + + # For 301 and 302, mimic IE, now changed in RFC + # https://github.com/kennethreitz/requests/pull/269 + if (resp.status == 303 and resp.method != hdrs.METH_HEAD) or ( + resp.status in (301, 302) and resp.method == hdrs.METH_POST + ): + method = hdrs.METH_GET + data = None + if headers.get(hdrs.CONTENT_LENGTH): + headers.pop(hdrs.CONTENT_LENGTH) + else: + # For 307/308, always preserve the request body + # For 301/302 with non-POST methods, preserve the request body + # https://www.rfc-editor.org/rfc/rfc9110#section-15.4.3-3.1 + # Use the existing payload to avoid recreating it from a potentially consumed file + data = req._body + + r_url = resp.headers.get(hdrs.LOCATION) or resp.headers.get( + hdrs.URI + ) + if r_url is None: + # see github.com/aio-libs/aiohttp/issues/2022 + break + else: + # reading from correct redirection + # response is forbidden + resp.release() + + try: + parsed_redirect_url = URL( + r_url, encoded=not self._requote_redirect_url + ) + except ValueError as e: + if req._body is not None: + await req._body.close() + resp.close() + raise InvalidUrlRedirectClientError( + r_url, + "Server attempted redirecting to a location that does not look like a URL", + ) from e + + scheme = parsed_redirect_url.scheme + if scheme not in HTTP_AND_EMPTY_SCHEMA_SET: + if req._body is not None: + await req._body.close() + resp.close() + raise NonHttpUrlRedirectClientError(r_url) + elif not scheme: + parsed_redirect_url = url.join(parsed_redirect_url) + + try: + redirect_origin = parsed_redirect_url.origin() + except ValueError as origin_val_err: + if req._body is not None: + await req._body.close() + resp.close() + raise InvalidUrlRedirectClientError( + parsed_redirect_url, + "Invalid redirect URL origin", + ) from origin_val_err + + if url.origin() != redirect_origin: + auth = None + headers.pop(hdrs.AUTHORIZATION, None) + + url = parsed_redirect_url + params = {} + resp.release() + continue + + break + + if req._body is not None: + await req._body.close() + # check response status + if raise_for_status is None: + raise_for_status = self._raise_for_status + + if raise_for_status is None: + pass + elif callable(raise_for_status): + await raise_for_status(resp) + elif raise_for_status: + resp.raise_for_status() + + # register connection + if handle is not None: + if resp.connection is not None: + resp.connection.add_callback(handle.cancel) + else: + handle.cancel() + + resp._history = tuple(history) + + for trace in traces: + await trace.send_request_end( + method, url.update_query(params), headers, resp + ) + return resp + + except BaseException as e: + # cleanup timer + tm.close() + if handle: + handle.cancel() + handle = None + + for trace in traces: + await trace.send_request_exception( + method, url.update_query(params), headers, e + ) + raise + + def ws_connect( + self, + url: StrOrURL, + *, + method: str = hdrs.METH_GET, + protocols: Iterable[str] = (), + timeout: Union[ClientWSTimeout, _SENTINEL] = sentinel, + receive_timeout: Optional[float] = None, + autoclose: bool = True, + autoping: bool = True, + heartbeat: Optional[float] = None, + auth: Optional[BasicAuth] = None, + origin: Optional[str] = None, + params: Query = None, + headers: Optional[LooseHeaders] = None, + proxy: Optional[StrOrURL] = None, + proxy_auth: Optional[BasicAuth] = None, + ssl: Union[SSLContext, bool, Fingerprint] = True, + verify_ssl: Optional[bool] = None, + fingerprint: Optional[bytes] = None, + ssl_context: Optional[SSLContext] = None, + server_hostname: Optional[str] = None, + proxy_headers: Optional[LooseHeaders] = None, + compress: int = 0, + max_msg_size: int = 4 * 1024 * 1024, + ) -> "_WSRequestContextManager": + """Initiate websocket connection.""" + return _WSRequestContextManager( + self._ws_connect( + url, + method=method, + protocols=protocols, + timeout=timeout, + receive_timeout=receive_timeout, + autoclose=autoclose, + autoping=autoping, + heartbeat=heartbeat, + auth=auth, + origin=origin, + params=params, + headers=headers, + proxy=proxy, + proxy_auth=proxy_auth, + ssl=ssl, + verify_ssl=verify_ssl, + fingerprint=fingerprint, + ssl_context=ssl_context, + server_hostname=server_hostname, + proxy_headers=proxy_headers, + compress=compress, + max_msg_size=max_msg_size, + ) + ) + + async def _ws_connect( + self, + url: StrOrURL, + *, + method: str = hdrs.METH_GET, + protocols: Iterable[str] = (), + timeout: Union[ClientWSTimeout, _SENTINEL] = sentinel, + receive_timeout: Optional[float] = None, + autoclose: bool = True, + autoping: bool = True, + heartbeat: Optional[float] = None, + auth: Optional[BasicAuth] = None, + origin: Optional[str] = None, + params: Query = None, + headers: Optional[LooseHeaders] = None, + proxy: Optional[StrOrURL] = None, + proxy_auth: Optional[BasicAuth] = None, + ssl: Union[SSLContext, bool, Fingerprint] = True, + verify_ssl: Optional[bool] = None, + fingerprint: Optional[bytes] = None, + ssl_context: Optional[SSLContext] = None, + server_hostname: Optional[str] = None, + proxy_headers: Optional[LooseHeaders] = None, + compress: int = 0, + max_msg_size: int = 4 * 1024 * 1024, + ) -> ClientWebSocketResponse: + if timeout is not sentinel: + if isinstance(timeout, ClientWSTimeout): + ws_timeout = timeout + else: + warnings.warn( + "parameter 'timeout' of type 'float' " + "is deprecated, please use " + "'timeout=ClientWSTimeout(ws_close=...)'", + DeprecationWarning, + stacklevel=2, + ) + ws_timeout = ClientWSTimeout(ws_close=timeout) + else: + ws_timeout = DEFAULT_WS_CLIENT_TIMEOUT + if receive_timeout is not None: + warnings.warn( + "float parameter 'receive_timeout' " + "is deprecated, please use parameter " + "'timeout=ClientWSTimeout(ws_receive=...)'", + DeprecationWarning, + stacklevel=2, + ) + ws_timeout = attr.evolve(ws_timeout, ws_receive=receive_timeout) + + if headers is None: + real_headers: CIMultiDict[str] = CIMultiDict() + else: + real_headers = CIMultiDict(headers) + + default_headers = { + hdrs.UPGRADE: "websocket", + hdrs.CONNECTION: "Upgrade", + hdrs.SEC_WEBSOCKET_VERSION: "13", + } + + for key, value in default_headers.items(): + real_headers.setdefault(key, value) + + sec_key = base64.b64encode(os.urandom(16)) + real_headers[hdrs.SEC_WEBSOCKET_KEY] = sec_key.decode() + + if protocols: + real_headers[hdrs.SEC_WEBSOCKET_PROTOCOL] = ",".join(protocols) + if origin is not None: + real_headers[hdrs.ORIGIN] = origin + if compress: + extstr = ws_ext_gen(compress=compress) + real_headers[hdrs.SEC_WEBSOCKET_EXTENSIONS] = extstr + + # For the sake of backward compatibility, if user passes in None, convert it to True + if ssl is None: + warnings.warn( + "ssl=None is deprecated, please use ssl=True", + DeprecationWarning, + stacklevel=2, + ) + ssl = True + ssl = _merge_ssl_params(ssl, verify_ssl, ssl_context, fingerprint) + + # send request + resp = await self.request( + method, + url, + params=params, + headers=real_headers, + read_until_eof=False, + auth=auth, + proxy=proxy, + proxy_auth=proxy_auth, + ssl=ssl, + server_hostname=server_hostname, + proxy_headers=proxy_headers, + ) + + try: + # check handshake + if resp.status != 101: + raise WSServerHandshakeError( + resp.request_info, + resp.history, + message="Invalid response status", + status=resp.status, + headers=resp.headers, + ) + + if resp.headers.get(hdrs.UPGRADE, "").lower() != "websocket": + raise WSServerHandshakeError( + resp.request_info, + resp.history, + message="Invalid upgrade header", + status=resp.status, + headers=resp.headers, + ) + + if resp.headers.get(hdrs.CONNECTION, "").lower() != "upgrade": + raise WSServerHandshakeError( + resp.request_info, + resp.history, + message="Invalid connection header", + status=resp.status, + headers=resp.headers, + ) + + # key calculation + r_key = resp.headers.get(hdrs.SEC_WEBSOCKET_ACCEPT, "") + match = base64.b64encode(hashlib.sha1(sec_key + WS_KEY).digest()).decode() + if r_key != match: + raise WSServerHandshakeError( + resp.request_info, + resp.history, + message="Invalid challenge response", + status=resp.status, + headers=resp.headers, + ) + + # websocket protocol + protocol = None + if protocols and hdrs.SEC_WEBSOCKET_PROTOCOL in resp.headers: + resp_protocols = [ + proto.strip() + for proto in resp.headers[hdrs.SEC_WEBSOCKET_PROTOCOL].split(",") + ] + + for proto in resp_protocols: + if proto in protocols: + protocol = proto + break + + # websocket compress + notakeover = False + if compress: + compress_hdrs = resp.headers.get(hdrs.SEC_WEBSOCKET_EXTENSIONS) + if compress_hdrs: + try: + compress, notakeover = ws_ext_parse(compress_hdrs) + except WSHandshakeError as exc: + raise WSServerHandshakeError( + resp.request_info, + resp.history, + message=exc.args[0], + status=resp.status, + headers=resp.headers, + ) from exc + else: + compress = 0 + notakeover = False + + conn = resp.connection + assert conn is not None + conn_proto = conn.protocol + assert conn_proto is not None + + # For WS connection the read_timeout must be either receive_timeout or greater + # None == no timeout, i.e. infinite timeout, so None is the max timeout possible + if ws_timeout.ws_receive is None: + # Reset regardless + conn_proto.read_timeout = None + elif conn_proto.read_timeout is not None: + conn_proto.read_timeout = max( + ws_timeout.ws_receive, conn_proto.read_timeout + ) + + transport = conn.transport + assert transport is not None + reader = WebSocketDataQueue(conn_proto, 2**16, loop=self._loop) + conn_proto.set_parser(WebSocketReader(reader, max_msg_size), reader) + writer = WebSocketWriter( + conn_proto, + transport, + use_mask=True, + compress=compress, + notakeover=notakeover, + ) + except BaseException: + resp.close() + raise + else: + return self._ws_response_class( + reader, + writer, + protocol, + resp, + ws_timeout, + autoclose, + autoping, + self._loop, + heartbeat=heartbeat, + compress=compress, + client_notakeover=notakeover, + ) + + def _prepare_headers(self, headers: Optional[LooseHeaders]) -> "CIMultiDict[str]": + """Add default headers and transform it to CIMultiDict""" + # Convert headers to MultiDict + result = CIMultiDict(self._default_headers) + if headers: + if not isinstance(headers, (MultiDictProxy, MultiDict)): + headers = CIMultiDict(headers) + added_names: Set[str] = set() + for key, value in headers.items(): + if key in added_names: + result.add(key, value) + else: + result[key] = value + added_names.add(key) + return result + + def _get_netrc_auth(self, host: str) -> Optional[BasicAuth]: + """ + Get auth from netrc for the given host. + + This method is designed to be called in an executor to avoid + blocking I/O in the event loop. + """ + netrc_obj = netrc_from_env() + try: + return basicauth_from_netrc(netrc_obj, host) + except LookupError: + return None + + if sys.version_info >= (3, 11) and TYPE_CHECKING: + + def get( + self, + url: StrOrURL, + **kwargs: Unpack[_RequestOptions], + ) -> "_RequestContextManager": ... + + def options( + self, + url: StrOrURL, + **kwargs: Unpack[_RequestOptions], + ) -> "_RequestContextManager": ... + + def head( + self, + url: StrOrURL, + **kwargs: Unpack[_RequestOptions], + ) -> "_RequestContextManager": ... + + def post( + self, + url: StrOrURL, + **kwargs: Unpack[_RequestOptions], + ) -> "_RequestContextManager": ... + + def put( + self, + url: StrOrURL, + **kwargs: Unpack[_RequestOptions], + ) -> "_RequestContextManager": ... + + def patch( + self, + url: StrOrURL, + **kwargs: Unpack[_RequestOptions], + ) -> "_RequestContextManager": ... + + def delete( + self, + url: StrOrURL, + **kwargs: Unpack[_RequestOptions], + ) -> "_RequestContextManager": ... + + else: + + def get( + self, url: StrOrURL, *, allow_redirects: bool = True, **kwargs: Any + ) -> "_RequestContextManager": + """Perform HTTP GET request.""" + return _RequestContextManager( + self._request( + hdrs.METH_GET, url, allow_redirects=allow_redirects, **kwargs + ) + ) + + def options( + self, url: StrOrURL, *, allow_redirects: bool = True, **kwargs: Any + ) -> "_RequestContextManager": + """Perform HTTP OPTIONS request.""" + return _RequestContextManager( + self._request( + hdrs.METH_OPTIONS, url, allow_redirects=allow_redirects, **kwargs + ) + ) + + def head( + self, url: StrOrURL, *, allow_redirects: bool = False, **kwargs: Any + ) -> "_RequestContextManager": + """Perform HTTP HEAD request.""" + return _RequestContextManager( + self._request( + hdrs.METH_HEAD, url, allow_redirects=allow_redirects, **kwargs + ) + ) + + def post( + self, url: StrOrURL, *, data: Any = None, **kwargs: Any + ) -> "_RequestContextManager": + """Perform HTTP POST request.""" + return _RequestContextManager( + self._request(hdrs.METH_POST, url, data=data, **kwargs) + ) + + def put( + self, url: StrOrURL, *, data: Any = None, **kwargs: Any + ) -> "_RequestContextManager": + """Perform HTTP PUT request.""" + return _RequestContextManager( + self._request(hdrs.METH_PUT, url, data=data, **kwargs) + ) + + def patch( + self, url: StrOrURL, *, data: Any = None, **kwargs: Any + ) -> "_RequestContextManager": + """Perform HTTP PATCH request.""" + return _RequestContextManager( + self._request(hdrs.METH_PATCH, url, data=data, **kwargs) + ) + + def delete(self, url: StrOrURL, **kwargs: Any) -> "_RequestContextManager": + """Perform HTTP DELETE request.""" + return _RequestContextManager( + self._request(hdrs.METH_DELETE, url, **kwargs) + ) + + async def close(self) -> None: + """Close underlying connector. + + Release all acquired resources. + """ + if not self.closed: + if self._connector is not None and self._connector_owner: + await self._connector.close() + self._connector = None + + @property + def closed(self) -> bool: + """Is client session closed. + + A readonly property. + """ + return self._connector is None or self._connector.closed + + @property + def connector(self) -> Optional[BaseConnector]: + """Connector instance used for the session.""" + return self._connector + + @property + def cookie_jar(self) -> AbstractCookieJar: + """The session cookies.""" + return self._cookie_jar + + @property + def version(self) -> Tuple[int, int]: + """The session HTTP protocol version.""" + return self._version + + @property + def requote_redirect_url(self) -> bool: + """Do URL requoting on redirection handling.""" + return self._requote_redirect_url + + @requote_redirect_url.setter + def requote_redirect_url(self, val: bool) -> None: + """Do URL requoting on redirection handling.""" + warnings.warn( + "session.requote_redirect_url modification is deprecated #2778", + DeprecationWarning, + stacklevel=2, + ) + self._requote_redirect_url = val + + @property + def loop(self) -> asyncio.AbstractEventLoop: + """Session's loop.""" + warnings.warn( + "client.loop property is deprecated", DeprecationWarning, stacklevel=2 + ) + return self._loop + + @property + def timeout(self) -> ClientTimeout: + """Timeout for the session.""" + return self._timeout + + @property + def headers(self) -> "CIMultiDict[str]": + """The default headers of the client session.""" + return self._default_headers + + @property + def skip_auto_headers(self) -> FrozenSet[istr]: + """Headers for which autogeneration should be skipped""" + return self._skip_auto_headers + + @property + def auth(self) -> Optional[BasicAuth]: + """An object that represents HTTP Basic Authorization""" + return self._default_auth + + @property + def json_serialize(self) -> JSONEncoder: + """Json serializer callable""" + return self._json_serialize + + @property + def connector_owner(self) -> bool: + """Should connector be closed on session closing""" + return self._connector_owner + + @property + def raise_for_status( + self, + ) -> Union[bool, Callable[[ClientResponse], Awaitable[None]]]: + """Should `ClientResponse.raise_for_status()` be called for each response.""" + return self._raise_for_status + + @property + def auto_decompress(self) -> bool: + """Should the body response be automatically decompressed.""" + return self._auto_decompress + + @property + def trust_env(self) -> bool: + """ + Should proxies information from environment or netrc be trusted. + + Information is from HTTP_PROXY / HTTPS_PROXY environment variables + or ~/.netrc file if present. + """ + return self._trust_env + + @property + def trace_configs(self) -> List[TraceConfig]: + """A list of TraceConfig instances used for client tracing""" + return self._trace_configs + + def detach(self) -> None: + """Detach connector from session without closing the former. + + Session is switched to closed state anyway. + """ + self._connector = None + + def __enter__(self) -> None: + raise TypeError("Use async with instead") + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + # __exit__ should exist in pair with __enter__ but never executed + pass # pragma: no cover + + async def __aenter__(self) -> "ClientSession": + return self + + async def __aexit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + await self.close() + + +class _BaseRequestContextManager(Coroutine[Any, Any, _RetType], Generic[_RetType]): + + __slots__ = ("_coro", "_resp") + + def __init__(self, coro: Coroutine["asyncio.Future[Any]", None, _RetType]) -> None: + self._coro: Coroutine["asyncio.Future[Any]", None, _RetType] = coro + + def send(self, arg: None) -> "asyncio.Future[Any]": + return self._coro.send(arg) + + def throw(self, *args: Any, **kwargs: Any) -> "asyncio.Future[Any]": + return self._coro.throw(*args, **kwargs) + + def close(self) -> None: + return self._coro.close() + + def __await__(self) -> Generator[Any, None, _RetType]: + ret = self._coro.__await__() + return ret + + def __iter__(self) -> Generator[Any, None, _RetType]: + return self.__await__() + + async def __aenter__(self) -> _RetType: + self._resp: _RetType = await self._coro + return await self._resp.__aenter__() + + async def __aexit__( + self, + exc_type: Optional[Type[BaseException]], + exc: Optional[BaseException], + tb: Optional[TracebackType], + ) -> None: + await self._resp.__aexit__(exc_type, exc, tb) + + +_RequestContextManager = _BaseRequestContextManager[ClientResponse] +_WSRequestContextManager = _BaseRequestContextManager[ClientWebSocketResponse] + + +class _SessionRequestContextManager: + + __slots__ = ("_coro", "_resp", "_session") + + def __init__( + self, + coro: Coroutine["asyncio.Future[Any]", None, ClientResponse], + session: ClientSession, + ) -> None: + self._coro = coro + self._resp: Optional[ClientResponse] = None + self._session = session + + async def __aenter__(self) -> ClientResponse: + try: + self._resp = await self._coro + except BaseException: + await self._session.close() + raise + else: + return self._resp + + async def __aexit__( + self, + exc_type: Optional[Type[BaseException]], + exc: Optional[BaseException], + tb: Optional[TracebackType], + ) -> None: + assert self._resp is not None + self._resp.close() + await self._session.close() + + +if sys.version_info >= (3, 11) and TYPE_CHECKING: + + def request( + method: str, + url: StrOrURL, + *, + version: HttpVersion = http.HttpVersion11, + connector: Optional[BaseConnector] = None, + loop: Optional[asyncio.AbstractEventLoop] = None, + **kwargs: Unpack[_RequestOptions], + ) -> _SessionRequestContextManager: ... + +else: + + def request( + method: str, + url: StrOrURL, + *, + version: HttpVersion = http.HttpVersion11, + connector: Optional[BaseConnector] = None, + loop: Optional[asyncio.AbstractEventLoop] = None, + **kwargs: Any, + ) -> _SessionRequestContextManager: + """Constructs and sends a request. + + Returns response object. + method - HTTP method + url - request url + params - (optional) Dictionary or bytes to be sent in the query + string of the new request + data - (optional) Dictionary, bytes, or file-like object to + send in the body of the request + json - (optional) Any json compatible python object + headers - (optional) Dictionary of HTTP Headers to send with + the request + cookies - (optional) Dict object to send with the request + auth - (optional) BasicAuth named tuple represent HTTP Basic Auth + auth - aiohttp.helpers.BasicAuth + allow_redirects - (optional) If set to False, do not follow + redirects + version - Request HTTP version. + compress - Set to True if request has to be compressed + with deflate encoding. + chunked - Set to chunk size for chunked transfer encoding. + expect100 - Expect 100-continue response from server. + connector - BaseConnector sub-class instance to support + connection pooling. + read_until_eof - Read response until eof if response + does not have Content-Length header. + loop - Optional event loop. + timeout - Optional ClientTimeout settings structure, 5min + total timeout by default. + Usage:: + >>> import aiohttp + >>> async with aiohttp.request('GET', 'http://python.org/') as resp: + ... print(resp) + ... data = await resp.read() + + """ + connector_owner = False + if connector is None: + connector_owner = True + connector = TCPConnector(loop=loop, force_close=True) + + session = ClientSession( + loop=loop, + cookies=kwargs.pop("cookies", None), + version=version, + timeout=kwargs.pop("timeout", sentinel), + connector=connector, + connector_owner=connector_owner, + ) + + return _SessionRequestContextManager( + session._request(method, url, **kwargs), + session, + ) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client_exceptions.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client_exceptions.py new file mode 100644 index 0000000..1d298e9 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client_exceptions.py @@ -0,0 +1,421 @@ +"""HTTP related errors.""" + +import asyncio +import warnings +from typing import TYPE_CHECKING, Optional, Tuple, Union + +from multidict import MultiMapping + +from .typedefs import StrOrURL + +if TYPE_CHECKING: + import ssl + + SSLContext = ssl.SSLContext +else: + try: + import ssl + + SSLContext = ssl.SSLContext + except ImportError: # pragma: no cover + ssl = SSLContext = None # type: ignore[assignment] + +if TYPE_CHECKING: + from .client_reqrep import ClientResponse, ConnectionKey, Fingerprint, RequestInfo + from .http_parser import RawResponseMessage +else: + RequestInfo = ClientResponse = ConnectionKey = RawResponseMessage = None + +__all__ = ( + "ClientError", + "ClientConnectionError", + "ClientConnectionResetError", + "ClientOSError", + "ClientConnectorError", + "ClientProxyConnectionError", + "ClientSSLError", + "ClientConnectorDNSError", + "ClientConnectorSSLError", + "ClientConnectorCertificateError", + "ConnectionTimeoutError", + "SocketTimeoutError", + "ServerConnectionError", + "ServerTimeoutError", + "ServerDisconnectedError", + "ServerFingerprintMismatch", + "ClientResponseError", + "ClientHttpProxyError", + "WSServerHandshakeError", + "ContentTypeError", + "ClientPayloadError", + "InvalidURL", + "InvalidUrlClientError", + "RedirectClientError", + "NonHttpUrlClientError", + "InvalidUrlRedirectClientError", + "NonHttpUrlRedirectClientError", + "WSMessageTypeError", +) + + +class ClientError(Exception): + """Base class for client connection errors.""" + + +class ClientResponseError(ClientError): + """Base class for exceptions that occur after getting a response. + + request_info: An instance of RequestInfo. + history: A sequence of responses, if redirects occurred. + status: HTTP status code. + message: Error message. + headers: Response headers. + """ + + def __init__( + self, + request_info: RequestInfo, + history: Tuple[ClientResponse, ...], + *, + code: Optional[int] = None, + status: Optional[int] = None, + message: str = "", + headers: Optional[MultiMapping[str]] = None, + ) -> None: + self.request_info = request_info + if code is not None: + if status is not None: + raise ValueError( + "Both code and status arguments are provided; " + "code is deprecated, use status instead" + ) + warnings.warn( + "code argument is deprecated, use status instead", + DeprecationWarning, + stacklevel=2, + ) + if status is not None: + self.status = status + elif code is not None: + self.status = code + else: + self.status = 0 + self.message = message + self.headers = headers + self.history = history + self.args = (request_info, history) + + def __str__(self) -> str: + return "{}, message={!r}, url={!r}".format( + self.status, + self.message, + str(self.request_info.real_url), + ) + + def __repr__(self) -> str: + args = f"{self.request_info!r}, {self.history!r}" + if self.status != 0: + args += f", status={self.status!r}" + if self.message != "": + args += f", message={self.message!r}" + if self.headers is not None: + args += f", headers={self.headers!r}" + return f"{type(self).__name__}({args})" + + @property + def code(self) -> int: + warnings.warn( + "code property is deprecated, use status instead", + DeprecationWarning, + stacklevel=2, + ) + return self.status + + @code.setter + def code(self, value: int) -> None: + warnings.warn( + "code property is deprecated, use status instead", + DeprecationWarning, + stacklevel=2, + ) + self.status = value + + +class ContentTypeError(ClientResponseError): + """ContentType found is not valid.""" + + +class WSServerHandshakeError(ClientResponseError): + """websocket server handshake error.""" + + +class ClientHttpProxyError(ClientResponseError): + """HTTP proxy error. + + Raised in :class:`aiohttp.connector.TCPConnector` if + proxy responds with status other than ``200 OK`` + on ``CONNECT`` request. + """ + + +class TooManyRedirects(ClientResponseError): + """Client was redirected too many times.""" + + +class ClientConnectionError(ClientError): + """Base class for client socket errors.""" + + +class ClientConnectionResetError(ClientConnectionError, ConnectionResetError): + """ConnectionResetError""" + + +class ClientOSError(ClientConnectionError, OSError): + """OSError error.""" + + +class ClientConnectorError(ClientOSError): + """Client connector error. + + Raised in :class:`aiohttp.connector.TCPConnector` if + a connection can not be established. + """ + + def __init__(self, connection_key: ConnectionKey, os_error: OSError) -> None: + self._conn_key = connection_key + self._os_error = os_error + super().__init__(os_error.errno, os_error.strerror) + self.args = (connection_key, os_error) + + @property + def os_error(self) -> OSError: + return self._os_error + + @property + def host(self) -> str: + return self._conn_key.host + + @property + def port(self) -> Optional[int]: + return self._conn_key.port + + @property + def ssl(self) -> Union[SSLContext, bool, "Fingerprint"]: + return self._conn_key.ssl + + def __str__(self) -> str: + return "Cannot connect to host {0.host}:{0.port} ssl:{1} [{2}]".format( + self, "default" if self.ssl is True else self.ssl, self.strerror + ) + + # OSError.__reduce__ does too much black magick + __reduce__ = BaseException.__reduce__ + + +class ClientConnectorDNSError(ClientConnectorError): + """DNS resolution failed during client connection. + + Raised in :class:`aiohttp.connector.TCPConnector` if + DNS resolution fails. + """ + + +class ClientProxyConnectionError(ClientConnectorError): + """Proxy connection error. + + Raised in :class:`aiohttp.connector.TCPConnector` if + connection to proxy can not be established. + """ + + +class UnixClientConnectorError(ClientConnectorError): + """Unix connector error. + + Raised in :py:class:`aiohttp.connector.UnixConnector` + if connection to unix socket can not be established. + """ + + def __init__( + self, path: str, connection_key: ConnectionKey, os_error: OSError + ) -> None: + self._path = path + super().__init__(connection_key, os_error) + + @property + def path(self) -> str: + return self._path + + def __str__(self) -> str: + return "Cannot connect to unix socket {0.path} ssl:{1} [{2}]".format( + self, "default" if self.ssl is True else self.ssl, self.strerror + ) + + +class ServerConnectionError(ClientConnectionError): + """Server connection errors.""" + + +class ServerDisconnectedError(ServerConnectionError): + """Server disconnected.""" + + def __init__(self, message: Union[RawResponseMessage, str, None] = None) -> None: + if message is None: + message = "Server disconnected" + + self.args = (message,) + self.message = message + + +class ServerTimeoutError(ServerConnectionError, asyncio.TimeoutError): + """Server timeout error.""" + + +class ConnectionTimeoutError(ServerTimeoutError): + """Connection timeout error.""" + + +class SocketTimeoutError(ServerTimeoutError): + """Socket timeout error.""" + + +class ServerFingerprintMismatch(ServerConnectionError): + """SSL certificate does not match expected fingerprint.""" + + def __init__(self, expected: bytes, got: bytes, host: str, port: int) -> None: + self.expected = expected + self.got = got + self.host = host + self.port = port + self.args = (expected, got, host, port) + + def __repr__(self) -> str: + return "<{} expected={!r} got={!r} host={!r} port={!r}>".format( + self.__class__.__name__, self.expected, self.got, self.host, self.port + ) + + +class ClientPayloadError(ClientError): + """Response payload error.""" + + +class InvalidURL(ClientError, ValueError): + """Invalid URL. + + URL used for fetching is malformed, e.g. it doesn't contains host + part. + """ + + # Derive from ValueError for backward compatibility + + def __init__(self, url: StrOrURL, description: Union[str, None] = None) -> None: + # The type of url is not yarl.URL because the exception can be raised + # on URL(url) call + self._url = url + self._description = description + + if description: + super().__init__(url, description) + else: + super().__init__(url) + + @property + def url(self) -> StrOrURL: + return self._url + + @property + def description(self) -> "str | None": + return self._description + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} {self}>" + + def __str__(self) -> str: + if self._description: + return f"{self._url} - {self._description}" + return str(self._url) + + +class InvalidUrlClientError(InvalidURL): + """Invalid URL client error.""" + + +class RedirectClientError(ClientError): + """Client redirect error.""" + + +class NonHttpUrlClientError(ClientError): + """Non http URL client error.""" + + +class InvalidUrlRedirectClientError(InvalidUrlClientError, RedirectClientError): + """Invalid URL redirect client error.""" + + +class NonHttpUrlRedirectClientError(NonHttpUrlClientError, RedirectClientError): + """Non http URL redirect client error.""" + + +class ClientSSLError(ClientConnectorError): + """Base error for ssl.*Errors.""" + + +if ssl is not None: + cert_errors = (ssl.CertificateError,) + cert_errors_bases = ( + ClientSSLError, + ssl.CertificateError, + ) + + ssl_errors = (ssl.SSLError,) + ssl_error_bases = (ClientSSLError, ssl.SSLError) +else: # pragma: no cover + cert_errors = tuple() + cert_errors_bases = ( + ClientSSLError, + ValueError, + ) + + ssl_errors = tuple() + ssl_error_bases = (ClientSSLError,) + + +class ClientConnectorSSLError(*ssl_error_bases): # type: ignore[misc] + """Response ssl error.""" + + +class ClientConnectorCertificateError(*cert_errors_bases): # type: ignore[misc] + """Response certificate error.""" + + def __init__( + self, connection_key: ConnectionKey, certificate_error: Exception + ) -> None: + self._conn_key = connection_key + self._certificate_error = certificate_error + self.args = (connection_key, certificate_error) + + @property + def certificate_error(self) -> Exception: + return self._certificate_error + + @property + def host(self) -> str: + return self._conn_key.host + + @property + def port(self) -> Optional[int]: + return self._conn_key.port + + @property + def ssl(self) -> bool: + return self._conn_key.is_ssl + + def __str__(self) -> str: + return ( + "Cannot connect to host {0.host}:{0.port} ssl:{0.ssl} " + "[{0.certificate_error.__class__.__name__}: " + "{0.certificate_error.args}]".format(self) + ) + + +class WSMessageTypeError(TypeError): + """WebSocket message type is not valid.""" diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client_middleware_digest_auth.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client_middleware_digest_auth.py new file mode 100644 index 0000000..5aab5ac --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client_middleware_digest_auth.py @@ -0,0 +1,480 @@ +""" +Digest authentication middleware for aiohttp client. + +This middleware implements HTTP Digest Authentication according to RFC 7616, +providing a more secure alternative to Basic Authentication. It supports all +standard hash algorithms including MD5, SHA, SHA-256, SHA-512 and their session +variants, as well as both 'auth' and 'auth-int' quality of protection (qop) options. +""" + +import hashlib +import os +import re +import sys +import time +from typing import ( + Callable, + Dict, + Final, + FrozenSet, + List, + Literal, + Tuple, + TypedDict, + Union, +) + +from yarl import URL + +from . import hdrs +from .client_exceptions import ClientError +from .client_middlewares import ClientHandlerType +from .client_reqrep import ClientRequest, ClientResponse +from .payload import Payload + + +class DigestAuthChallenge(TypedDict, total=False): + realm: str + nonce: str + qop: str + algorithm: str + opaque: str + domain: str + stale: str + + +DigestFunctions: Dict[str, Callable[[bytes], "hashlib._Hash"]] = { + "MD5": hashlib.md5, + "MD5-SESS": hashlib.md5, + "SHA": hashlib.sha1, + "SHA-SESS": hashlib.sha1, + "SHA256": hashlib.sha256, + "SHA256-SESS": hashlib.sha256, + "SHA-256": hashlib.sha256, + "SHA-256-SESS": hashlib.sha256, + "SHA512": hashlib.sha512, + "SHA512-SESS": hashlib.sha512, + "SHA-512": hashlib.sha512, + "SHA-512-SESS": hashlib.sha512, +} + + +# Compile the regex pattern once at module level for performance +_HEADER_PAIRS_PATTERN = re.compile( + r'(?:^|\s|,\s*)(\w+)\s*=\s*(?:"((?:[^"\\]|\\.)*)"|([^\s,]+))' + if sys.version_info < (3, 11) + else r'(?:^|\s|,\s*)((?>\w+))\s*=\s*(?:"((?:[^"\\]|\\.)*)"|([^\s,]+))' + # +------------|--------|--|-|-|--|----|------|----|--||-----|-> Match valid start/sep + # +--------|--|-|-|--|----|------|----|--||-----|-> alphanumeric key (atomic + # | | | | | | | | || | group reduces backtracking) + # +--|-|-|--|----|------|----|--||-----|-> maybe whitespace + # | | | | | | | || | + # +-|-|--|----|------|----|--||-----|-> = (delimiter) + # +-|--|----|------|----|--||-----|-> maybe whitespace + # | | | | | || | + # +--|----|------|----|--||-----|-> group quoted or unquoted + # | | | | || | + # +----|------|----|--||-----|-> if quoted... + # +------|----|--||-----|-> anything but " or \ + # +----|--||-----|-> escaped characters allowed + # +--||-----|-> or can be empty string + # || | + # +|-----|-> if unquoted... + # +-----|-> anything but , or + # +-> at least one char req'd +) + + +# RFC 7616: Challenge parameters to extract +CHALLENGE_FIELDS: Final[ + Tuple[ + Literal["realm", "nonce", "qop", "algorithm", "opaque", "domain", "stale"], ... + ] +] = ( + "realm", + "nonce", + "qop", + "algorithm", + "opaque", + "domain", + "stale", +) + +# Supported digest authentication algorithms +# Use a tuple of sorted keys for predictable documentation and error messages +SUPPORTED_ALGORITHMS: Final[Tuple[str, ...]] = tuple(sorted(DigestFunctions.keys())) + +# RFC 7616: Fields that require quoting in the Digest auth header +# These fields must be enclosed in double quotes in the Authorization header. +# Algorithm, qop, and nc are never quoted per RFC specifications. +# This frozen set is used by the template-based header construction to +# automatically determine which fields need quotes. +QUOTED_AUTH_FIELDS: Final[FrozenSet[str]] = frozenset( + {"username", "realm", "nonce", "uri", "response", "opaque", "cnonce"} +) + + +def escape_quotes(value: str) -> str: + """Escape double quotes for HTTP header values.""" + return value.replace('"', '\\"') + + +def unescape_quotes(value: str) -> str: + """Unescape double quotes in HTTP header values.""" + return value.replace('\\"', '"') + + +def parse_header_pairs(header: str) -> Dict[str, str]: + """ + Parse key-value pairs from WWW-Authenticate or similar HTTP headers. + + This function handles the complex format of WWW-Authenticate header values, + supporting both quoted and unquoted values, proper handling of commas in + quoted values, and whitespace variations per RFC 7616. + + Examples of supported formats: + - key1="value1", key2=value2 + - key1 = "value1" , key2="value, with, commas" + - key1=value1,key2="value2" + - realm="example.com", nonce="12345", qop="auth" + + Args: + header: The header value string to parse + + Returns: + Dictionary mapping parameter names to their values + """ + return { + stripped_key: unescape_quotes(quoted_val) if quoted_val else unquoted_val + for key, quoted_val, unquoted_val in _HEADER_PAIRS_PATTERN.findall(header) + if (stripped_key := key.strip()) + } + + +class DigestAuthMiddleware: + """ + HTTP digest authentication middleware for aiohttp client. + + This middleware intercepts 401 Unauthorized responses containing a Digest + authentication challenge, calculates the appropriate digest credentials, + and automatically retries the request with the proper Authorization header. + + Features: + - Handles all aspects of Digest authentication handshake automatically + - Supports all standard hash algorithms: + - MD5, MD5-SESS + - SHA, SHA-SESS + - SHA256, SHA256-SESS, SHA-256, SHA-256-SESS + - SHA512, SHA512-SESS, SHA-512, SHA-512-SESS + - Supports 'auth' and 'auth-int' quality of protection modes + - Properly handles quoted strings and parameter parsing + - Includes replay attack protection with client nonce count tracking + - Supports preemptive authentication per RFC 7616 Section 3.6 + + Standards compliance: + - RFC 7616: HTTP Digest Access Authentication (primary reference) + - RFC 2617: HTTP Authentication (deprecated by RFC 7616) + - RFC 1945: Section 11.1 (username restrictions) + + Implementation notes: + The core digest calculation is inspired by the implementation in + https://github.com/requests/requests/blob/v2.18.4/requests/auth.py + with added support for modern digest auth features and error handling. + """ + + def __init__( + self, + login: str, + password: str, + preemptive: bool = True, + ) -> None: + if login is None: + raise ValueError("None is not allowed as login value") + + if password is None: + raise ValueError("None is not allowed as password value") + + if ":" in login: + raise ValueError('A ":" is not allowed in username (RFC 1945#section-11.1)') + + self._login_str: Final[str] = login + self._login_bytes: Final[bytes] = login.encode("utf-8") + self._password_bytes: Final[bytes] = password.encode("utf-8") + + self._last_nonce_bytes = b"" + self._nonce_count = 0 + self._challenge: DigestAuthChallenge = {} + self._preemptive: bool = preemptive + # Set of URLs defining the protection space + self._protection_space: List[str] = [] + + async def _encode( + self, method: str, url: URL, body: Union[Payload, Literal[b""]] + ) -> str: + """ + Build digest authorization header for the current challenge. + + Args: + method: The HTTP method (GET, POST, etc.) + url: The request URL + body: The request body (used for qop=auth-int) + + Returns: + A fully formatted Digest authorization header string + + Raises: + ClientError: If the challenge is missing required parameters or + contains unsupported values + + """ + challenge = self._challenge + if "realm" not in challenge: + raise ClientError( + "Malformed Digest auth challenge: Missing 'realm' parameter" + ) + + if "nonce" not in challenge: + raise ClientError( + "Malformed Digest auth challenge: Missing 'nonce' parameter" + ) + + # Empty realm values are allowed per RFC 7616 (SHOULD, not MUST, contain host name) + realm = challenge["realm"] + nonce = challenge["nonce"] + + # Empty nonce values are not allowed as they are security-critical for replay protection + if not nonce: + raise ClientError( + "Security issue: Digest auth challenge contains empty 'nonce' value" + ) + + qop_raw = challenge.get("qop", "") + # Preserve original algorithm case for response while using uppercase for processing + algorithm_original = challenge.get("algorithm", "MD5") + algorithm = algorithm_original.upper() + opaque = challenge.get("opaque", "") + + # Convert string values to bytes once + nonce_bytes = nonce.encode("utf-8") + realm_bytes = realm.encode("utf-8") + path = URL(url).path_qs + + # Process QoP + qop = "" + qop_bytes = b"" + if qop_raw: + valid_qops = {"auth", "auth-int"}.intersection( + {q.strip() for q in qop_raw.split(",") if q.strip()} + ) + if not valid_qops: + raise ClientError( + f"Digest auth error: Unsupported Quality of Protection (qop) value(s): {qop_raw}" + ) + + qop = "auth-int" if "auth-int" in valid_qops else "auth" + qop_bytes = qop.encode("utf-8") + + if algorithm not in DigestFunctions: + raise ClientError( + f"Digest auth error: Unsupported hash algorithm: {algorithm}. " + f"Supported algorithms: {', '.join(SUPPORTED_ALGORITHMS)}" + ) + hash_fn: Final = DigestFunctions[algorithm] + + def H(x: bytes) -> bytes: + """RFC 7616 Section 3: Hash function H(data) = hex(hash(data)).""" + return hash_fn(x).hexdigest().encode() + + def KD(s: bytes, d: bytes) -> bytes: + """RFC 7616 Section 3: KD(secret, data) = H(concat(secret, ":", data)).""" + return H(b":".join((s, d))) + + # Calculate A1 and A2 + A1 = b":".join((self._login_bytes, realm_bytes, self._password_bytes)) + A2 = f"{method.upper()}:{path}".encode() + if qop == "auth-int": + if isinstance(body, Payload): # will always be empty bytes unless Payload + entity_bytes = await body.as_bytes() # Get bytes from Payload + else: + entity_bytes = body + entity_hash = H(entity_bytes) + A2 = b":".join((A2, entity_hash)) + + HA1 = H(A1) + HA2 = H(A2) + + # Nonce count handling + if nonce_bytes == self._last_nonce_bytes: + self._nonce_count += 1 + else: + self._nonce_count = 1 + + self._last_nonce_bytes = nonce_bytes + ncvalue = f"{self._nonce_count:08x}" + ncvalue_bytes = ncvalue.encode("utf-8") + + # Generate client nonce + cnonce = hashlib.sha1( + b"".join( + [ + str(self._nonce_count).encode("utf-8"), + nonce_bytes, + time.ctime().encode("utf-8"), + os.urandom(8), + ] + ) + ).hexdigest()[:16] + cnonce_bytes = cnonce.encode("utf-8") + + # Special handling for session-based algorithms + if algorithm.upper().endswith("-SESS"): + HA1 = H(b":".join((HA1, nonce_bytes, cnonce_bytes))) + + # Calculate the response digest + if qop: + noncebit = b":".join( + (nonce_bytes, ncvalue_bytes, cnonce_bytes, qop_bytes, HA2) + ) + response_digest = KD(HA1, noncebit) + else: + response_digest = KD(HA1, b":".join((nonce_bytes, HA2))) + + # Define a dict mapping of header fields to their values + # Group fields into always-present, optional, and qop-dependent + header_fields = { + # Always present fields + "username": escape_quotes(self._login_str), + "realm": escape_quotes(realm), + "nonce": escape_quotes(nonce), + "uri": path, + "response": response_digest.decode(), + "algorithm": algorithm_original, + } + + # Optional fields + if opaque: + header_fields["opaque"] = escape_quotes(opaque) + + # QoP-dependent fields + if qop: + header_fields["qop"] = qop + header_fields["nc"] = ncvalue + header_fields["cnonce"] = cnonce + + # Build header using templates for each field type + pairs: List[str] = [] + for field, value in header_fields.items(): + if field in QUOTED_AUTH_FIELDS: + pairs.append(f'{field}="{value}"') + else: + pairs.append(f"{field}={value}") + + return f"Digest {', '.join(pairs)}" + + def _in_protection_space(self, url: URL) -> bool: + """ + Check if the given URL is within the current protection space. + + According to RFC 7616, a URI is in the protection space if any URI + in the protection space is a prefix of it (after both have been made absolute). + """ + request_str = str(url) + for space_str in self._protection_space: + # Check if request starts with space URL + if not request_str.startswith(space_str): + continue + # Exact match or space ends with / (proper directory prefix) + if len(request_str) == len(space_str) or space_str[-1] == "/": + return True + # Check next char is / to ensure proper path boundary + if request_str[len(space_str)] == "/": + return True + return False + + def _authenticate(self, response: ClientResponse) -> bool: + """ + Takes the given response and tries digest-auth, if needed. + + Returns true if the original request must be resent. + """ + if response.status != 401: + return False + + auth_header = response.headers.get("www-authenticate", "") + if not auth_header: + return False # No authentication header present + + method, sep, headers = auth_header.partition(" ") + if not sep: + # No space found in www-authenticate header + return False # Malformed auth header, missing scheme separator + + if method.lower() != "digest": + # Not a digest auth challenge (could be Basic, Bearer, etc.) + return False + + if not headers: + # We have a digest scheme but no parameters + return False # Malformed digest header, missing parameters + + # We have a digest auth header with content + if not (header_pairs := parse_header_pairs(headers)): + # Failed to parse any key-value pairs + return False # Malformed digest header, no valid parameters + + # Extract challenge parameters + self._challenge = {} + for field in CHALLENGE_FIELDS: + if value := header_pairs.get(field): + self._challenge[field] = value + + # Update protection space based on domain parameter or default to origin + origin = response.url.origin() + + if domain := self._challenge.get("domain"): + # Parse space-separated list of URIs + self._protection_space = [] + for uri in domain.split(): + # Remove quotes if present + uri = uri.strip('"') + if uri.startswith("/"): + # Path-absolute, relative to origin + self._protection_space.append(str(origin.join(URL(uri)))) + else: + # Absolute URI + self._protection_space.append(str(URL(uri))) + else: + # No domain specified, protection space is entire origin + self._protection_space = [str(origin)] + + # Return True only if we found at least one challenge parameter + return bool(self._challenge) + + async def __call__( + self, request: ClientRequest, handler: ClientHandlerType + ) -> ClientResponse: + """Run the digest auth middleware.""" + response = None + for retry_count in range(2): + # Apply authorization header if: + # 1. This is a retry after 401 (retry_count > 0), OR + # 2. Preemptive auth is enabled AND we have a challenge AND the URL is in protection space + if retry_count > 0 or ( + self._preemptive + and self._challenge + and self._in_protection_space(request.url) + ): + request.headers[hdrs.AUTHORIZATION] = await self._encode( + request.method, request.url, request.body + ) + + # Send the request + response = await handler(request) + + # Check if we need to authenticate + if not self._authenticate(response): + break + + # At this point, response is guaranteed to be defined + assert response is not None + return response diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client_middlewares.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client_middlewares.py new file mode 100644 index 0000000..3ca2cb2 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client_middlewares.py @@ -0,0 +1,55 @@ +"""Client middleware support.""" + +from collections.abc import Awaitable, Callable, Sequence + +from .client_reqrep import ClientRequest, ClientResponse + +__all__ = ("ClientMiddlewareType", "ClientHandlerType", "build_client_middlewares") + +# Type alias for client request handlers - functions that process requests and return responses +ClientHandlerType = Callable[[ClientRequest], Awaitable[ClientResponse]] + +# Type for client middleware - similar to server but uses ClientRequest/ClientResponse +ClientMiddlewareType = Callable[ + [ClientRequest, ClientHandlerType], Awaitable[ClientResponse] +] + + +def build_client_middlewares( + handler: ClientHandlerType, + middlewares: Sequence[ClientMiddlewareType], +) -> ClientHandlerType: + """ + Apply middlewares to request handler. + + The middlewares are applied in reverse order, so the first middleware + in the list wraps all subsequent middlewares and the handler. + + This implementation avoids using partial/update_wrapper to minimize overhead + and doesn't cache to avoid holding references to stateful middleware. + """ + # Optimize for single middleware case + if len(middlewares) == 1: + middleware = middlewares[0] + + async def single_middleware_handler(req: ClientRequest) -> ClientResponse: + return await middleware(req, handler) + + return single_middleware_handler + + # Build the chain for multiple middlewares + current_handler = handler + + for middleware in reversed(middlewares): + # Create a new closure that captures the current state + def make_wrapper( + mw: ClientMiddlewareType, next_h: ClientHandlerType + ) -> ClientHandlerType: + async def wrapped(req: ClientRequest) -> ClientResponse: + return await mw(req, next_h) + + return wrapped + + current_handler = make_wrapper(middleware, current_handler) + + return current_handler diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client_proto.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client_proto.py new file mode 100644 index 0000000..e2fb1ce --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client_proto.py @@ -0,0 +1,359 @@ +import asyncio +from contextlib import suppress +from typing import Any, Optional, Tuple, Union + +from .base_protocol import BaseProtocol +from .client_exceptions import ( + ClientConnectionError, + ClientOSError, + ClientPayloadError, + ServerDisconnectedError, + SocketTimeoutError, +) +from .helpers import ( + _EXC_SENTINEL, + EMPTY_BODY_STATUS_CODES, + BaseTimerContext, + set_exception, + set_result, +) +from .http import HttpResponseParser, RawResponseMessage +from .http_exceptions import HttpProcessingError +from .streams import EMPTY_PAYLOAD, DataQueue, StreamReader + + +class ResponseHandler(BaseProtocol, DataQueue[Tuple[RawResponseMessage, StreamReader]]): + """Helper class to adapt between Protocol and StreamReader.""" + + def __init__(self, loop: asyncio.AbstractEventLoop) -> None: + BaseProtocol.__init__(self, loop=loop) + DataQueue.__init__(self, loop) + + self._should_close = False + + self._payload: Optional[StreamReader] = None + self._skip_payload = False + self._payload_parser = None + + self._timer = None + + self._tail = b"" + self._upgraded = False + self._parser: Optional[HttpResponseParser] = None + + self._read_timeout: Optional[float] = None + self._read_timeout_handle: Optional[asyncio.TimerHandle] = None + + self._timeout_ceil_threshold: Optional[float] = 5 + + self._closed: Union[None, asyncio.Future[None]] = None + self._connection_lost_called = False + + @property + def closed(self) -> Union[None, asyncio.Future[None]]: + """Future that is set when the connection is closed. + + This property returns a Future that will be completed when the connection + is closed. The Future is created lazily on first access to avoid creating + futures that will never be awaited. + + Returns: + - A Future[None] if the connection is still open or was closed after + this property was accessed + - None if connection_lost() was already called before this property + was ever accessed (indicating no one is waiting for the closure) + """ + if self._closed is None and not self._connection_lost_called: + self._closed = self._loop.create_future() + return self._closed + + @property + def upgraded(self) -> bool: + return self._upgraded + + @property + def should_close(self) -> bool: + return bool( + self._should_close + or (self._payload is not None and not self._payload.is_eof()) + or self._upgraded + or self._exception is not None + or self._payload_parser is not None + or self._buffer + or self._tail + ) + + def force_close(self) -> None: + self._should_close = True + + def close(self) -> None: + self._exception = None # Break cyclic references + transport = self.transport + if transport is not None: + transport.close() + self.transport = None + self._payload = None + self._drop_timeout() + + def abort(self) -> None: + self._exception = None # Break cyclic references + transport = self.transport + if transport is not None: + transport.abort() + self.transport = None + self._payload = None + self._drop_timeout() + + def is_connected(self) -> bool: + return self.transport is not None and not self.transport.is_closing() + + def connection_lost(self, exc: Optional[BaseException]) -> None: + self._connection_lost_called = True + self._drop_timeout() + + original_connection_error = exc + reraised_exc = original_connection_error + + connection_closed_cleanly = original_connection_error is None + + if self._closed is not None: + # If someone is waiting for the closed future, + # we should set it to None or an exception. If + # self._closed is None, it means that + # connection_lost() was called already + # or nobody is waiting for it. + if connection_closed_cleanly: + set_result(self._closed, None) + else: + assert original_connection_error is not None + set_exception( + self._closed, + ClientConnectionError( + f"Connection lost: {original_connection_error !s}", + ), + original_connection_error, + ) + + if self._payload_parser is not None: + with suppress(Exception): # FIXME: log this somehow? + self._payload_parser.feed_eof() + + uncompleted = None + if self._parser is not None: + try: + uncompleted = self._parser.feed_eof() + except Exception as underlying_exc: + if self._payload is not None: + client_payload_exc_msg = ( + f"Response payload is not completed: {underlying_exc !r}" + ) + if not connection_closed_cleanly: + client_payload_exc_msg = ( + f"{client_payload_exc_msg !s}. " + f"{original_connection_error !r}" + ) + set_exception( + self._payload, + ClientPayloadError(client_payload_exc_msg), + underlying_exc, + ) + + if not self.is_eof(): + if isinstance(original_connection_error, OSError): + reraised_exc = ClientOSError(*original_connection_error.args) + if connection_closed_cleanly: + reraised_exc = ServerDisconnectedError(uncompleted) + # assigns self._should_close to True as side effect, + # we do it anyway below + underlying_non_eof_exc = ( + _EXC_SENTINEL + if connection_closed_cleanly + else original_connection_error + ) + assert underlying_non_eof_exc is not None + assert reraised_exc is not None + self.set_exception(reraised_exc, underlying_non_eof_exc) + + self._should_close = True + self._parser = None + self._payload = None + self._payload_parser = None + self._reading_paused = False + + super().connection_lost(reraised_exc) + + def eof_received(self) -> None: + # should call parser.feed_eof() most likely + self._drop_timeout() + + def pause_reading(self) -> None: + super().pause_reading() + self._drop_timeout() + + def resume_reading(self) -> None: + super().resume_reading() + self._reschedule_timeout() + + def set_exception( + self, + exc: BaseException, + exc_cause: BaseException = _EXC_SENTINEL, + ) -> None: + self._should_close = True + self._drop_timeout() + super().set_exception(exc, exc_cause) + + def set_parser(self, parser: Any, payload: Any) -> None: + # TODO: actual types are: + # parser: WebSocketReader + # payload: WebSocketDataQueue + # but they are not generi enough + # Need an ABC for both types + self._payload = payload + self._payload_parser = parser + + self._drop_timeout() + + if self._tail: + data, self._tail = self._tail, b"" + self.data_received(data) + + def set_response_params( + self, + *, + timer: Optional[BaseTimerContext] = None, + skip_payload: bool = False, + read_until_eof: bool = False, + auto_decompress: bool = True, + read_timeout: Optional[float] = None, + read_bufsize: int = 2**16, + timeout_ceil_threshold: float = 5, + max_line_size: int = 8190, + max_field_size: int = 8190, + ) -> None: + self._skip_payload = skip_payload + + self._read_timeout = read_timeout + + self._timeout_ceil_threshold = timeout_ceil_threshold + + self._parser = HttpResponseParser( + self, + self._loop, + read_bufsize, + timer=timer, + payload_exception=ClientPayloadError, + response_with_body=not skip_payload, + read_until_eof=read_until_eof, + auto_decompress=auto_decompress, + max_line_size=max_line_size, + max_field_size=max_field_size, + ) + + if self._tail: + data, self._tail = self._tail, b"" + self.data_received(data) + + def _drop_timeout(self) -> None: + if self._read_timeout_handle is not None: + self._read_timeout_handle.cancel() + self._read_timeout_handle = None + + def _reschedule_timeout(self) -> None: + timeout = self._read_timeout + if self._read_timeout_handle is not None: + self._read_timeout_handle.cancel() + + if timeout: + self._read_timeout_handle = self._loop.call_later( + timeout, self._on_read_timeout + ) + else: + self._read_timeout_handle = None + + def start_timeout(self) -> None: + self._reschedule_timeout() + + @property + def read_timeout(self) -> Optional[float]: + return self._read_timeout + + @read_timeout.setter + def read_timeout(self, read_timeout: Optional[float]) -> None: + self._read_timeout = read_timeout + + def _on_read_timeout(self) -> None: + exc = SocketTimeoutError("Timeout on reading data from socket") + self.set_exception(exc) + if self._payload is not None: + set_exception(self._payload, exc) + + def data_received(self, data: bytes) -> None: + self._reschedule_timeout() + + if not data: + return + + # custom payload parser - currently always WebSocketReader + if self._payload_parser is not None: + eof, tail = self._payload_parser.feed_data(data) + if eof: + self._payload = None + self._payload_parser = None + + if tail: + self.data_received(tail) + return + + if self._upgraded or self._parser is None: + # i.e. websocket connection, websocket parser is not set yet + self._tail += data + return + + # parse http messages + try: + messages, upgraded, tail = self._parser.feed_data(data) + except BaseException as underlying_exc: + if self.transport is not None: + # connection.release() could be called BEFORE + # data_received(), the transport is already + # closed in this case + self.transport.close() + # should_close is True after the call + if isinstance(underlying_exc, HttpProcessingError): + exc = HttpProcessingError( + code=underlying_exc.code, + message=underlying_exc.message, + headers=underlying_exc.headers, + ) + else: + exc = HttpProcessingError() + self.set_exception(exc, underlying_exc) + return + + self._upgraded = upgraded + + payload: Optional[StreamReader] = None + for message, payload in messages: + if message.should_close: + self._should_close = True + + self._payload = payload + + if self._skip_payload or message.code in EMPTY_BODY_STATUS_CODES: + self.feed_data((message, EMPTY_PAYLOAD), 0) + else: + self.feed_data((message, payload), 0) + + if payload is not None: + # new message(s) was processed + # register timeout handler unsubscribing + # either on end-of-stream or immediately for + # EMPTY_PAYLOAD + if payload is not EMPTY_PAYLOAD: + payload.on_eof(self._drop_timeout) + else: + self._drop_timeout() + + if upgraded and tail: + self.data_received(tail) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client_reqrep.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client_reqrep.py new file mode 100644 index 0000000..a9e0795 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client_reqrep.py @@ -0,0 +1,1536 @@ +import asyncio +import codecs +import contextlib +import functools +import io +import re +import sys +import traceback +import warnings +from collections.abc import Mapping +from hashlib import md5, sha1, sha256 +from http.cookies import Morsel, SimpleCookie +from types import MappingProxyType, TracebackType +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Dict, + Iterable, + List, + Literal, + NamedTuple, + Optional, + Tuple, + Type, + Union, +) + +import attr +from multidict import CIMultiDict, CIMultiDictProxy, MultiDict, MultiDictProxy +from yarl import URL + +from . import hdrs, helpers, http, multipart, payload +from ._cookie_helpers import ( + parse_cookie_header, + parse_set_cookie_headers, + preserve_morsel_with_coded_value, +) +from .abc import AbstractStreamWriter +from .client_exceptions import ( + ClientConnectionError, + ClientOSError, + ClientResponseError, + ContentTypeError, + InvalidURL, + ServerFingerprintMismatch, +) +from .compression_utils import HAS_BROTLI, HAS_ZSTD +from .formdata import FormData +from .helpers import ( + _SENTINEL, + BaseTimerContext, + BasicAuth, + HeadersMixin, + TimerNoop, + noop, + reify, + sentinel, + set_exception, + set_result, +) +from .http import ( + SERVER_SOFTWARE, + HttpVersion, + HttpVersion10, + HttpVersion11, + StreamWriter, +) +from .streams import StreamReader +from .typedefs import ( + DEFAULT_JSON_DECODER, + JSONDecoder, + LooseCookies, + LooseHeaders, + Query, + RawHeaders, +) + +if TYPE_CHECKING: + import ssl + from ssl import SSLContext +else: + try: + import ssl + from ssl import SSLContext + except ImportError: # pragma: no cover + ssl = None # type: ignore[assignment] + SSLContext = object # type: ignore[misc,assignment] + + +__all__ = ("ClientRequest", "ClientResponse", "RequestInfo", "Fingerprint") + + +if TYPE_CHECKING: + from .client import ClientSession + from .connector import Connection + from .tracing import Trace + + +_CONNECTION_CLOSED_EXCEPTION = ClientConnectionError("Connection closed") +_CONTAINS_CONTROL_CHAR_RE = re.compile(r"[^-!#$%&'*+.^_`|~0-9a-zA-Z]") +json_re = re.compile(r"^application/(?:[\w.+-]+?\+)?json") + + +def _gen_default_accept_encoding() -> str: + encodings = [ + "gzip", + "deflate", + ] + if HAS_BROTLI: + encodings.append("br") + if HAS_ZSTD: + encodings.append("zstd") + return ", ".join(encodings) + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class ContentDisposition: + type: Optional[str] + parameters: "MappingProxyType[str, str]" + filename: Optional[str] + + +class _RequestInfo(NamedTuple): + url: URL + method: str + headers: "CIMultiDictProxy[str]" + real_url: URL + + +class RequestInfo(_RequestInfo): + + def __new__( + cls, + url: URL, + method: str, + headers: "CIMultiDictProxy[str]", + real_url: Union[URL, _SENTINEL] = sentinel, + ) -> "RequestInfo": + """Create a new RequestInfo instance. + + For backwards compatibility, the real_url parameter is optional. + """ + return tuple.__new__( + cls, (url, method, headers, url if real_url is sentinel else real_url) + ) + + +class Fingerprint: + HASHFUNC_BY_DIGESTLEN = { + 16: md5, + 20: sha1, + 32: sha256, + } + + def __init__(self, fingerprint: bytes) -> None: + digestlen = len(fingerprint) + hashfunc = self.HASHFUNC_BY_DIGESTLEN.get(digestlen) + if not hashfunc: + raise ValueError("fingerprint has invalid length") + elif hashfunc is md5 or hashfunc is sha1: + raise ValueError("md5 and sha1 are insecure and not supported. Use sha256.") + self._hashfunc = hashfunc + self._fingerprint = fingerprint + + @property + def fingerprint(self) -> bytes: + return self._fingerprint + + def check(self, transport: asyncio.Transport) -> None: + if not transport.get_extra_info("sslcontext"): + return + sslobj = transport.get_extra_info("ssl_object") + cert = sslobj.getpeercert(binary_form=True) + got = self._hashfunc(cert).digest() + if got != self._fingerprint: + host, port, *_ = transport.get_extra_info("peername") + raise ServerFingerprintMismatch(self._fingerprint, got, host, port) + + +if ssl is not None: + SSL_ALLOWED_TYPES = (ssl.SSLContext, bool, Fingerprint, type(None)) +else: # pragma: no cover + SSL_ALLOWED_TYPES = (bool, type(None)) + + +def _merge_ssl_params( + ssl: Union["SSLContext", bool, Fingerprint], + verify_ssl: Optional[bool], + ssl_context: Optional["SSLContext"], + fingerprint: Optional[bytes], +) -> Union["SSLContext", bool, Fingerprint]: + if ssl is None: + ssl = True # Double check for backwards compatibility + if verify_ssl is not None and not verify_ssl: + warnings.warn( + "verify_ssl is deprecated, use ssl=False instead", + DeprecationWarning, + stacklevel=3, + ) + if ssl is not True: + raise ValueError( + "verify_ssl, ssl_context, fingerprint and ssl " + "parameters are mutually exclusive" + ) + else: + ssl = False + if ssl_context is not None: + warnings.warn( + "ssl_context is deprecated, use ssl=context instead", + DeprecationWarning, + stacklevel=3, + ) + if ssl is not True: + raise ValueError( + "verify_ssl, ssl_context, fingerprint and ssl " + "parameters are mutually exclusive" + ) + else: + ssl = ssl_context + if fingerprint is not None: + warnings.warn( + "fingerprint is deprecated, use ssl=Fingerprint(fingerprint) instead", + DeprecationWarning, + stacklevel=3, + ) + if ssl is not True: + raise ValueError( + "verify_ssl, ssl_context, fingerprint and ssl " + "parameters are mutually exclusive" + ) + else: + ssl = Fingerprint(fingerprint) + if not isinstance(ssl, SSL_ALLOWED_TYPES): + raise TypeError( + "ssl should be SSLContext, bool, Fingerprint or None, " + "got {!r} instead.".format(ssl) + ) + return ssl + + +_SSL_SCHEMES = frozenset(("https", "wss")) + + +# ConnectionKey is a NamedTuple because it is used as a key in a dict +# and a set in the connector. Since a NamedTuple is a tuple it uses +# the fast native tuple __hash__ and __eq__ implementation in CPython. +class ConnectionKey(NamedTuple): + # the key should contain an information about used proxy / TLS + # to prevent reusing wrong connections from a pool + host: str + port: Optional[int] + is_ssl: bool + ssl: Union[SSLContext, bool, Fingerprint] + proxy: Optional[URL] + proxy_auth: Optional[BasicAuth] + proxy_headers_hash: Optional[int] # hash(CIMultiDict) + + +def _is_expected_content_type( + response_content_type: str, expected_content_type: str +) -> bool: + if expected_content_type == "application/json": + return json_re.match(response_content_type) is not None + return expected_content_type in response_content_type + + +def _warn_if_unclosed_payload(payload: payload.Payload, stacklevel: int = 2) -> None: + """Warn if the payload is not closed. + + Callers must check that the body is a Payload before calling this method. + + Args: + payload: The payload to check + stacklevel: Stack level for the warning (default 2 for direct callers) + """ + if not payload.autoclose and not payload.consumed: + warnings.warn( + "The previous request body contains unclosed resources. " + "Use await request.update_body() instead of setting request.body " + "directly to properly close resources and avoid leaks.", + ResourceWarning, + stacklevel=stacklevel, + ) + + +class ClientResponse(HeadersMixin): + + # Some of these attributes are None when created, + # but will be set by the start() method. + # As the end user will likely never see the None values, we cheat the types below. + # from the Status-Line of the response + version: Optional[HttpVersion] = None # HTTP-Version + status: int = None # type: ignore[assignment] # Status-Code + reason: Optional[str] = None # Reason-Phrase + + content: StreamReader = None # type: ignore[assignment] # Payload stream + _body: Optional[bytes] = None + _headers: CIMultiDictProxy[str] = None # type: ignore[assignment] + _history: Tuple["ClientResponse", ...] = () + _raw_headers: RawHeaders = None # type: ignore[assignment] + + _connection: Optional["Connection"] = None # current connection + _cookies: Optional[SimpleCookie] = None + _raw_cookie_headers: Optional[Tuple[str, ...]] = None + _continue: Optional["asyncio.Future[bool]"] = None + _source_traceback: Optional[traceback.StackSummary] = None + _session: Optional["ClientSession"] = None + # set up by ClientRequest after ClientResponse object creation + # post-init stage allows to not change ctor signature + _closed = True # to allow __del__ for non-initialized properly response + _released = False + _in_context = False + + _resolve_charset: Callable[["ClientResponse", bytes], str] = lambda *_: "utf-8" + + __writer: Optional["asyncio.Task[None]"] = None + + def __init__( + self, + method: str, + url: URL, + *, + writer: "Optional[asyncio.Task[None]]", + continue100: Optional["asyncio.Future[bool]"], + timer: BaseTimerContext, + request_info: RequestInfo, + traces: List["Trace"], + loop: asyncio.AbstractEventLoop, + session: "ClientSession", + ) -> None: + # URL forbids subclasses, so a simple type check is enough. + assert type(url) is URL + + self.method = method + + self._real_url = url + self._url = url.with_fragment(None) if url.raw_fragment else url + if writer is not None: + self._writer = writer + if continue100 is not None: + self._continue = continue100 + self._request_info = request_info + self._timer = timer if timer is not None else TimerNoop() + self._cache: Dict[str, Any] = {} + self._traces = traces + self._loop = loop + # Save reference to _resolve_charset, so that get_encoding() will still + # work after the response has finished reading the body. + # TODO: Fix session=None in tests (see ClientRequest.__init__). + if session is not None: + # store a reference to session #1985 + self._session = session + self._resolve_charset = session._resolve_charset + if loop.get_debug(): + self._source_traceback = traceback.extract_stack(sys._getframe(1)) + + def __reset_writer(self, _: object = None) -> None: + self.__writer = None + + @property + def _writer(self) -> Optional["asyncio.Task[None]"]: + """The writer task for streaming data. + + _writer is only provided for backwards compatibility + for subclasses that may need to access it. + """ + return self.__writer + + @_writer.setter + def _writer(self, writer: Optional["asyncio.Task[None]"]) -> None: + """Set the writer task for streaming data.""" + if self.__writer is not None: + self.__writer.remove_done_callback(self.__reset_writer) + self.__writer = writer + if writer is None: + return + if writer.done(): + # The writer is already done, so we can clear it immediately. + self.__writer = None + else: + writer.add_done_callback(self.__reset_writer) + + @property + def cookies(self) -> SimpleCookie: + if self._cookies is None: + if self._raw_cookie_headers is not None: + # Parse cookies for response.cookies (SimpleCookie for backward compatibility) + cookies = SimpleCookie() + # Use parse_set_cookie_headers for more lenient parsing that handles + # malformed cookies better than SimpleCookie.load + cookies.update(parse_set_cookie_headers(self._raw_cookie_headers)) + self._cookies = cookies + else: + self._cookies = SimpleCookie() + return self._cookies + + @cookies.setter + def cookies(self, cookies: SimpleCookie) -> None: + self._cookies = cookies + # Generate raw cookie headers from the SimpleCookie + if cookies: + self._raw_cookie_headers = tuple( + morsel.OutputString() for morsel in cookies.values() + ) + else: + self._raw_cookie_headers = None + + @reify + def url(self) -> URL: + return self._url + + @reify + def url_obj(self) -> URL: + warnings.warn("Deprecated, use .url #1654", DeprecationWarning, stacklevel=2) + return self._url + + @reify + def real_url(self) -> URL: + return self._real_url + + @reify + def host(self) -> str: + assert self._url.host is not None + return self._url.host + + @reify + def headers(self) -> "CIMultiDictProxy[str]": + return self._headers + + @reify + def raw_headers(self) -> RawHeaders: + return self._raw_headers + + @reify + def request_info(self) -> RequestInfo: + return self._request_info + + @reify + def content_disposition(self) -> Optional[ContentDisposition]: + raw = self._headers.get(hdrs.CONTENT_DISPOSITION) + if raw is None: + return None + disposition_type, params_dct = multipart.parse_content_disposition(raw) + params = MappingProxyType(params_dct) + filename = multipart.content_disposition_filename(params) + return ContentDisposition(disposition_type, params, filename) + + def __del__(self, _warnings: Any = warnings) -> None: + if self._closed: + return + + if self._connection is not None: + self._connection.release() + self._cleanup_writer() + + if self._loop.get_debug(): + kwargs = {"source": self} + _warnings.warn(f"Unclosed response {self!r}", ResourceWarning, **kwargs) + context = {"client_response": self, "message": "Unclosed response"} + if self._source_traceback: + context["source_traceback"] = self._source_traceback + self._loop.call_exception_handler(context) + + def __repr__(self) -> str: + out = io.StringIO() + ascii_encodable_url = str(self.url) + if self.reason: + ascii_encodable_reason = self.reason.encode( + "ascii", "backslashreplace" + ).decode("ascii") + else: + ascii_encodable_reason = "None" + print( + "".format( + ascii_encodable_url, self.status, ascii_encodable_reason + ), + file=out, + ) + print(self.headers, file=out) + return out.getvalue() + + @property + def connection(self) -> Optional["Connection"]: + return self._connection + + @reify + def history(self) -> Tuple["ClientResponse", ...]: + """A sequence of of responses, if redirects occurred.""" + return self._history + + @reify + def links(self) -> "MultiDictProxy[MultiDictProxy[Union[str, URL]]]": + links_str = ", ".join(self.headers.getall("link", [])) + + if not links_str: + return MultiDictProxy(MultiDict()) + + links: MultiDict[MultiDictProxy[Union[str, URL]]] = MultiDict() + + for val in re.split(r",(?=\s*<)", links_str): + match = re.match(r"\s*<(.*)>(.*)", val) + if match is None: # pragma: no cover + # the check exists to suppress mypy error + continue + url, params_str = match.groups() + params = params_str.split(";")[1:] + + link: MultiDict[Union[str, URL]] = MultiDict() + + for param in params: + match = re.match(r"^\s*(\S*)\s*=\s*(['\"]?)(.*?)(\2)\s*$", param, re.M) + if match is None: # pragma: no cover + # the check exists to suppress mypy error + continue + key, _, value, _ = match.groups() + + link.add(key, value) + + key = link.get("rel", url) + + link.add("url", self.url.join(URL(url))) + + links.add(str(key), MultiDictProxy(link)) + + return MultiDictProxy(links) + + async def start(self, connection: "Connection") -> "ClientResponse": + """Start response processing.""" + self._closed = False + self._protocol = connection.protocol + self._connection = connection + + with self._timer: + while True: + # read response + try: + protocol = self._protocol + message, payload = await protocol.read() # type: ignore[union-attr] + except http.HttpProcessingError as exc: + raise ClientResponseError( + self.request_info, + self.history, + status=exc.code, + message=exc.message, + headers=exc.headers, + ) from exc + + if message.code < 100 or message.code > 199 or message.code == 101: + break + + if self._continue is not None: + set_result(self._continue, True) + self._continue = None + + # payload eof handler + payload.on_eof(self._response_eof) + + # response status + self.version = message.version + self.status = message.code + self.reason = message.reason + + # headers + self._headers = message.headers # type is CIMultiDictProxy + self._raw_headers = message.raw_headers # type is Tuple[bytes, bytes] + + # payload + self.content = payload + + # cookies + if cookie_hdrs := self.headers.getall(hdrs.SET_COOKIE, ()): + # Store raw cookie headers for CookieJar + self._raw_cookie_headers = tuple(cookie_hdrs) + return self + + def _response_eof(self) -> None: + if self._closed: + return + + # protocol could be None because connection could be detached + protocol = self._connection and self._connection.protocol + if protocol is not None and protocol.upgraded: + return + + self._closed = True + self._cleanup_writer() + self._release_connection() + + @property + def closed(self) -> bool: + return self._closed + + def close(self) -> None: + if not self._released: + self._notify_content() + + self._closed = True + if self._loop is None or self._loop.is_closed(): + return + + self._cleanup_writer() + if self._connection is not None: + self._connection.close() + self._connection = None + + def release(self) -> Any: + if not self._released: + self._notify_content() + + self._closed = True + + self._cleanup_writer() + self._release_connection() + return noop() + + @property + def ok(self) -> bool: + """Returns ``True`` if ``status`` is less than ``400``, ``False`` if not. + + This is **not** a check for ``200 OK`` but a check that the response + status is under 400. + """ + return 400 > self.status + + def raise_for_status(self) -> None: + if not self.ok: + # reason should always be not None for a started response + assert self.reason is not None + + # If we're in a context we can rely on __aexit__() to release as the + # exception propagates. + if not self._in_context: + self.release() + + raise ClientResponseError( + self.request_info, + self.history, + status=self.status, + message=self.reason, + headers=self.headers, + ) + + def _release_connection(self) -> None: + if self._connection is not None: + if self.__writer is None: + self._connection.release() + self._connection = None + else: + self.__writer.add_done_callback(lambda f: self._release_connection()) + + async def _wait_released(self) -> None: + if self.__writer is not None: + try: + await self.__writer + except asyncio.CancelledError: + if ( + sys.version_info >= (3, 11) + and (task := asyncio.current_task()) + and task.cancelling() + ): + raise + self._release_connection() + + def _cleanup_writer(self) -> None: + if self.__writer is not None: + self.__writer.cancel() + self._session = None + + def _notify_content(self) -> None: + content = self.content + if content and content.exception() is None: + set_exception(content, _CONNECTION_CLOSED_EXCEPTION) + self._released = True + + async def wait_for_close(self) -> None: + if self.__writer is not None: + try: + await self.__writer + except asyncio.CancelledError: + if ( + sys.version_info >= (3, 11) + and (task := asyncio.current_task()) + and task.cancelling() + ): + raise + self.release() + + async def read(self) -> bytes: + """Read response payload.""" + if self._body is None: + try: + self._body = await self.content.read() + for trace in self._traces: + await trace.send_response_chunk_received( + self.method, self.url, self._body + ) + except BaseException: + self.close() + raise + elif self._released: # Response explicitly released + raise ClientConnectionError("Connection closed") + + protocol = self._connection and self._connection.protocol + if protocol is None or not protocol.upgraded: + await self._wait_released() # Underlying connection released + return self._body + + def get_encoding(self) -> str: + ctype = self.headers.get(hdrs.CONTENT_TYPE, "").lower() + mimetype = helpers.parse_mimetype(ctype) + + encoding = mimetype.parameters.get("charset") + if encoding: + with contextlib.suppress(LookupError, ValueError): + return codecs.lookup(encoding).name + + if mimetype.type == "application" and ( + mimetype.subtype == "json" or mimetype.subtype == "rdap" + ): + # RFC 7159 states that the default encoding is UTF-8. + # RFC 7483 defines application/rdap+json + return "utf-8" + + if self._body is None: + raise RuntimeError( + "Cannot compute fallback encoding of a not yet read body" + ) + + return self._resolve_charset(self, self._body) + + async def text(self, encoding: Optional[str] = None, errors: str = "strict") -> str: + """Read response payload and decode.""" + if self._body is None: + await self.read() + + if encoding is None: + encoding = self.get_encoding() + + return self._body.decode(encoding, errors=errors) # type: ignore[union-attr] + + async def json( + self, + *, + encoding: Optional[str] = None, + loads: JSONDecoder = DEFAULT_JSON_DECODER, + content_type: Optional[str] = "application/json", + ) -> Any: + """Read and decodes JSON response.""" + if self._body is None: + await self.read() + + if content_type: + ctype = self.headers.get(hdrs.CONTENT_TYPE, "").lower() + if not _is_expected_content_type(ctype, content_type): + raise ContentTypeError( + self.request_info, + self.history, + status=self.status, + message=( + "Attempt to decode JSON with unexpected mimetype: %s" % ctype + ), + headers=self.headers, + ) + + stripped = self._body.strip() # type: ignore[union-attr] + if not stripped: + return None + + if encoding is None: + encoding = self.get_encoding() + + return loads(stripped.decode(encoding)) + + async def __aenter__(self) -> "ClientResponse": + self._in_context = True + return self + + async def __aexit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + self._in_context = False + # similar to _RequestContextManager, we do not need to check + # for exceptions, response object can close connection + # if state is broken + self.release() + await self.wait_for_close() + + +class ClientRequest: + GET_METHODS = { + hdrs.METH_GET, + hdrs.METH_HEAD, + hdrs.METH_OPTIONS, + hdrs.METH_TRACE, + } + POST_METHODS = {hdrs.METH_PATCH, hdrs.METH_POST, hdrs.METH_PUT} + ALL_METHODS = GET_METHODS.union(POST_METHODS).union({hdrs.METH_DELETE}) + + DEFAULT_HEADERS = { + hdrs.ACCEPT: "*/*", + hdrs.ACCEPT_ENCODING: _gen_default_accept_encoding(), + } + + # Type of body depends on PAYLOAD_REGISTRY, which is dynamic. + _body: Union[None, payload.Payload] = None + auth = None + response = None + + __writer: Optional["asyncio.Task[None]"] = None # async task for streaming data + + # These class defaults help create_autospec() work correctly. + # If autospec is improved in future, maybe these can be removed. + url = URL() + method = "GET" + + _continue = None # waiter future for '100 Continue' response + + _skip_auto_headers: Optional["CIMultiDict[None]"] = None + + # N.B. + # Adding __del__ method with self._writer closing doesn't make sense + # because _writer is instance method, thus it keeps a reference to self. + # Until writer has finished finalizer will not be called. + + def __init__( + self, + method: str, + url: URL, + *, + params: Query = None, + headers: Optional[LooseHeaders] = None, + skip_auto_headers: Optional[Iterable[str]] = None, + data: Any = None, + cookies: Optional[LooseCookies] = None, + auth: Optional[BasicAuth] = None, + version: http.HttpVersion = http.HttpVersion11, + compress: Union[str, bool, None] = None, + chunked: Optional[bool] = None, + expect100: bool = False, + loop: Optional[asyncio.AbstractEventLoop] = None, + response_class: Optional[Type["ClientResponse"]] = None, + proxy: Optional[URL] = None, + proxy_auth: Optional[BasicAuth] = None, + timer: Optional[BaseTimerContext] = None, + session: Optional["ClientSession"] = None, + ssl: Union[SSLContext, bool, Fingerprint] = True, + proxy_headers: Optional[LooseHeaders] = None, + traces: Optional[List["Trace"]] = None, + trust_env: bool = False, + server_hostname: Optional[str] = None, + ): + if loop is None: + loop = asyncio.get_event_loop() + if match := _CONTAINS_CONTROL_CHAR_RE.search(method): + raise ValueError( + f"Method cannot contain non-token characters {method!r} " + f"(found at least {match.group()!r})" + ) + # URL forbids subclasses, so a simple type check is enough. + assert type(url) is URL, url + if proxy is not None: + assert type(proxy) is URL, proxy + # FIXME: session is None in tests only, need to fix tests + # assert session is not None + if TYPE_CHECKING: + assert session is not None + self._session = session + if params: + url = url.extend_query(params) + self.original_url = url + self.url = url.with_fragment(None) if url.raw_fragment else url + self.method = method.upper() + self.chunked = chunked + self.compress = compress + self.loop = loop + self.length = None + if response_class is None: + real_response_class = ClientResponse + else: + real_response_class = response_class + self.response_class: Type[ClientResponse] = real_response_class + self._timer = timer if timer is not None else TimerNoop() + self._ssl = ssl if ssl is not None else True + self.server_hostname = server_hostname + + if loop.get_debug(): + self._source_traceback = traceback.extract_stack(sys._getframe(1)) + + self.update_version(version) + self.update_host(url) + self.update_headers(headers) + self.update_auto_headers(skip_auto_headers) + self.update_cookies(cookies) + self.update_content_encoding(data) + self.update_auth(auth, trust_env) + self.update_proxy(proxy, proxy_auth, proxy_headers) + + self.update_body_from_data(data) + if data is not None or self.method not in self.GET_METHODS: + self.update_transfer_encoding() + self.update_expect_continue(expect100) + self._traces = [] if traces is None else traces + + def __reset_writer(self, _: object = None) -> None: + self.__writer = None + + def _get_content_length(self) -> Optional[int]: + """Extract and validate Content-Length header value. + + Returns parsed Content-Length value or None if not set. + Raises ValueError if header exists but cannot be parsed as an integer. + """ + if hdrs.CONTENT_LENGTH not in self.headers: + return None + + content_length_hdr = self.headers[hdrs.CONTENT_LENGTH] + try: + return int(content_length_hdr) + except ValueError: + raise ValueError( + f"Invalid Content-Length header: {content_length_hdr}" + ) from None + + @property + def skip_auto_headers(self) -> CIMultiDict[None]: + return self._skip_auto_headers or CIMultiDict() + + @property + def _writer(self) -> Optional["asyncio.Task[None]"]: + return self.__writer + + @_writer.setter + def _writer(self, writer: "asyncio.Task[None]") -> None: + if self.__writer is not None: + self.__writer.remove_done_callback(self.__reset_writer) + self.__writer = writer + writer.add_done_callback(self.__reset_writer) + + def is_ssl(self) -> bool: + return self.url.scheme in _SSL_SCHEMES + + @property + def ssl(self) -> Union["SSLContext", bool, Fingerprint]: + return self._ssl + + @property + def connection_key(self) -> ConnectionKey: + if proxy_headers := self.proxy_headers: + h: Optional[int] = hash(tuple(proxy_headers.items())) + else: + h = None + url = self.url + return tuple.__new__( + ConnectionKey, + ( + url.raw_host or "", + url.port, + url.scheme in _SSL_SCHEMES, + self._ssl, + self.proxy, + self.proxy_auth, + h, + ), + ) + + @property + def host(self) -> str: + ret = self.url.raw_host + assert ret is not None + return ret + + @property + def port(self) -> Optional[int]: + return self.url.port + + @property + def body(self) -> Union[payload.Payload, Literal[b""]]: + """Request body.""" + # empty body is represented as bytes for backwards compatibility + return self._body or b"" + + @body.setter + def body(self, value: Any) -> None: + """Set request body with warning for non-autoclose payloads. + + WARNING: This setter must be called from within an event loop and is not + thread-safe. Setting body outside of an event loop may raise RuntimeError + when closing file-based payloads. + + DEPRECATED: Direct assignment to body is deprecated and will be removed + in a future version. Use await update_body() instead for proper resource + management. + """ + # Close existing payload if present + if self._body is not None: + # Warn if the payload needs manual closing + # stacklevel=3: user code -> body setter -> _warn_if_unclosed_payload + _warn_if_unclosed_payload(self._body, stacklevel=3) + # NOTE: In the future, when we remove sync close support, + # this setter will need to be removed and only the async + # update_body() method will be available. For now, we call + # _close() for backwards compatibility. + self._body._close() + self._update_body(value) + + @property + def request_info(self) -> RequestInfo: + headers: CIMultiDictProxy[str] = CIMultiDictProxy(self.headers) + # These are created on every request, so we use a NamedTuple + # for performance reasons. We don't use the RequestInfo.__new__ + # method because it has a different signature which is provided + # for backwards compatibility only. + return tuple.__new__( + RequestInfo, (self.url, self.method, headers, self.original_url) + ) + + @property + def session(self) -> "ClientSession": + """Return the ClientSession instance. + + This property provides access to the ClientSession that initiated + this request, allowing middleware to make additional requests + using the same session. + """ + return self._session + + def update_host(self, url: URL) -> None: + """Update destination host, port and connection type (ssl).""" + # get host/port + if not url.raw_host: + raise InvalidURL(url) + + # basic auth info + if url.raw_user or url.raw_password: + self.auth = helpers.BasicAuth(url.user or "", url.password or "") + + def update_version(self, version: Union[http.HttpVersion, str]) -> None: + """Convert request version to two elements tuple. + + parser HTTP version '1.1' => (1, 1) + """ + if isinstance(version, str): + v = [part.strip() for part in version.split(".", 1)] + try: + version = http.HttpVersion(int(v[0]), int(v[1])) + except ValueError: + raise ValueError( + f"Can not parse http version number: {version}" + ) from None + self.version = version + + def update_headers(self, headers: Optional[LooseHeaders]) -> None: + """Update request headers.""" + self.headers: CIMultiDict[str] = CIMultiDict() + + # Build the host header + host = self.url.host_port_subcomponent + + # host_port_subcomponent is None when the URL is a relative URL. + # but we know we do not have a relative URL here. + assert host is not None + self.headers[hdrs.HOST] = host + + if not headers: + return + + if isinstance(headers, (dict, MultiDictProxy, MultiDict)): + headers = headers.items() + + for key, value in headers: # type: ignore[misc] + # A special case for Host header + if key in hdrs.HOST_ALL: + self.headers[key] = value + else: + self.headers.add(key, value) + + def update_auto_headers(self, skip_auto_headers: Optional[Iterable[str]]) -> None: + if skip_auto_headers is not None: + self._skip_auto_headers = CIMultiDict( + (hdr, None) for hdr in sorted(skip_auto_headers) + ) + used_headers = self.headers.copy() + used_headers.extend(self._skip_auto_headers) # type: ignore[arg-type] + else: + # Fast path when there are no headers to skip + # which is the most common case. + used_headers = self.headers + + for hdr, val in self.DEFAULT_HEADERS.items(): + if hdr not in used_headers: + self.headers[hdr] = val + + if hdrs.USER_AGENT not in used_headers: + self.headers[hdrs.USER_AGENT] = SERVER_SOFTWARE + + def update_cookies(self, cookies: Optional[LooseCookies]) -> None: + """Update request cookies header.""" + if not cookies: + return + + c = SimpleCookie() + if hdrs.COOKIE in self.headers: + # parse_cookie_header for RFC 6265 compliant Cookie header parsing + c.update(parse_cookie_header(self.headers.get(hdrs.COOKIE, ""))) + del self.headers[hdrs.COOKIE] + + if isinstance(cookies, Mapping): + iter_cookies = cookies.items() + else: + iter_cookies = cookies # type: ignore[assignment] + for name, value in iter_cookies: + if isinstance(value, Morsel): + # Use helper to preserve coded_value exactly as sent by server + c[name] = preserve_morsel_with_coded_value(value) + else: + c[name] = value # type: ignore[assignment] + + self.headers[hdrs.COOKIE] = c.output(header="", sep=";").strip() + + def update_content_encoding(self, data: Any) -> None: + """Set request content encoding.""" + if not data: + # Don't compress an empty body. + self.compress = None + return + + if self.headers.get(hdrs.CONTENT_ENCODING): + if self.compress: + raise ValueError( + "compress can not be set if Content-Encoding header is set" + ) + elif self.compress: + if not isinstance(self.compress, str): + self.compress = "deflate" + self.headers[hdrs.CONTENT_ENCODING] = self.compress + self.chunked = True # enable chunked, no need to deal with length + + def update_transfer_encoding(self) -> None: + """Analyze transfer-encoding header.""" + te = self.headers.get(hdrs.TRANSFER_ENCODING, "").lower() + + if "chunked" in te: + if self.chunked: + raise ValueError( + "chunked can not be set " + 'if "Transfer-Encoding: chunked" header is set' + ) + + elif self.chunked: + if hdrs.CONTENT_LENGTH in self.headers: + raise ValueError( + "chunked can not be set if Content-Length header is set" + ) + + self.headers[hdrs.TRANSFER_ENCODING] = "chunked" + + def update_auth(self, auth: Optional[BasicAuth], trust_env: bool = False) -> None: + """Set basic auth.""" + if auth is None: + auth = self.auth + if auth is None: + return + + if not isinstance(auth, helpers.BasicAuth): + raise TypeError("BasicAuth() tuple is required instead") + + self.headers[hdrs.AUTHORIZATION] = auth.encode() + + def update_body_from_data(self, body: Any, _stacklevel: int = 3) -> None: + """Update request body from data.""" + if self._body is not None: + _warn_if_unclosed_payload(self._body, stacklevel=_stacklevel) + + if body is None: + self._body = None + # Set Content-Length to 0 when body is None for methods that expect a body + if ( + self.method not in self.GET_METHODS + and not self.chunked + and hdrs.CONTENT_LENGTH not in self.headers + ): + self.headers[hdrs.CONTENT_LENGTH] = "0" + return + + # FormData + maybe_payload = body() if isinstance(body, FormData) else body + + try: + body_payload = payload.PAYLOAD_REGISTRY.get(maybe_payload, disposition=None) + except payload.LookupError: + body_payload = FormData(maybe_payload)() # type: ignore[arg-type] + + self._body = body_payload + # enable chunked encoding if needed + if not self.chunked and hdrs.CONTENT_LENGTH not in self.headers: + if (size := body_payload.size) is not None: + self.headers[hdrs.CONTENT_LENGTH] = str(size) + else: + self.chunked = True + + # copy payload headers + assert body_payload.headers + headers = self.headers + skip_headers = self._skip_auto_headers + for key, value in body_payload.headers.items(): + if key in headers or (skip_headers is not None and key in skip_headers): + continue + headers[key] = value + + def _update_body(self, body: Any) -> None: + """Update request body after its already been set.""" + # Remove existing Content-Length header since body is changing + if hdrs.CONTENT_LENGTH in self.headers: + del self.headers[hdrs.CONTENT_LENGTH] + + # Remove existing Transfer-Encoding header to avoid conflicts + if self.chunked and hdrs.TRANSFER_ENCODING in self.headers: + del self.headers[hdrs.TRANSFER_ENCODING] + + # Now update the body using the existing method + # Called from _update_body, add 1 to stacklevel from caller + self.update_body_from_data(body, _stacklevel=4) + + # Update transfer encoding headers if needed (same logic as __init__) + if body is not None or self.method not in self.GET_METHODS: + self.update_transfer_encoding() + + async def update_body(self, body: Any) -> None: + """ + Update request body and close previous payload if needed. + + This method safely updates the request body by first closing any existing + payload to prevent resource leaks, then setting the new body. + + IMPORTANT: Always use this method instead of setting request.body directly. + Direct assignment to request.body will leak resources if the previous body + contains file handles, streams, or other resources that need cleanup. + + Args: + body: The new body content. Can be: + - bytes/bytearray: Raw binary data + - str: Text data (will be encoded using charset from Content-Type) + - FormData: Form data that will be encoded as multipart/form-data + - Payload: A pre-configured payload object + - AsyncIterable: An async iterable of bytes chunks + - File-like object: Will be read and sent as binary data + - None: Clears the body + + Usage: + # CORRECT: Use update_body + await request.update_body(b"new request data") + + # WRONG: Don't set body directly + # request.body = b"new request data" # This will leak resources! + + # Update with form data + form_data = FormData() + form_data.add_field('field', 'value') + await request.update_body(form_data) + + # Clear body + await request.update_body(None) + + Note: + This method is async because it may need to close file handles or + other resources associated with the previous payload. Always await + this method to ensure proper cleanup. + + Warning: + Setting request.body directly is highly discouraged and can lead to: + - Resource leaks (unclosed file handles, streams) + - Memory leaks (unreleased buffers) + - Unexpected behavior with streaming payloads + + It is not recommended to change the payload type in middleware. If the + body was already set (e.g., as bytes), it's best to keep the same type + rather than converting it (e.g., to str) as this may result in unexpected + behavior. + + See Also: + - update_body_from_data: Synchronous body update without cleanup + - body property: Direct body access (STRONGLY DISCOURAGED) + + """ + # Close existing payload if it exists and needs closing + if self._body is not None: + await self._body.close() + self._update_body(body) + + def update_expect_continue(self, expect: bool = False) -> None: + if expect: + self.headers[hdrs.EXPECT] = "100-continue" + elif ( + hdrs.EXPECT in self.headers + and self.headers[hdrs.EXPECT].lower() == "100-continue" + ): + expect = True + + if expect: + self._continue = self.loop.create_future() + + def update_proxy( + self, + proxy: Optional[URL], + proxy_auth: Optional[BasicAuth], + proxy_headers: Optional[LooseHeaders], + ) -> None: + self.proxy = proxy + if proxy is None: + self.proxy_auth = None + self.proxy_headers = None + return + + if proxy_auth and not isinstance(proxy_auth, helpers.BasicAuth): + raise ValueError("proxy_auth must be None or BasicAuth() tuple") + self.proxy_auth = proxy_auth + + if proxy_headers is not None and not isinstance( + proxy_headers, (MultiDict, MultiDictProxy) + ): + proxy_headers = CIMultiDict(proxy_headers) + self.proxy_headers = proxy_headers + + async def write_bytes( + self, + writer: AbstractStreamWriter, + conn: "Connection", + content_length: Optional[int] = None, + ) -> None: + """ + Write the request body to the connection stream. + + This method handles writing different types of request bodies: + 1. Payload objects (using their specialized write_with_length method) + 2. Bytes/bytearray objects + 3. Iterable body content + + Args: + writer: The stream writer to write the body to + conn: The connection being used for this request + content_length: Optional maximum number of bytes to write from the body + (None means write the entire body) + + The method properly handles: + - Waiting for 100-Continue responses if required + - Content length constraints for chunked encoding + - Error handling for network issues, cancellation, and other exceptions + - Signaling EOF and timeout management + + Raises: + ClientOSError: When there's an OS-level error writing the body + ClientConnectionError: When there's a general connection error + asyncio.CancelledError: When the operation is cancelled + + """ + # 100 response + if self._continue is not None: + # Force headers to be sent before waiting for 100-continue + writer.send_headers() + await writer.drain() + await self._continue + + protocol = conn.protocol + assert protocol is not None + try: + # This should be a rare case but the + # self._body can be set to None while + # the task is being started or we wait above + # for the 100-continue response. + # The more likely case is we have an empty + # payload, but 100-continue is still expected. + if self._body is not None: + await self._body.write_with_length(writer, content_length) + except OSError as underlying_exc: + reraised_exc = underlying_exc + + # Distinguish between timeout and other OS errors for better error reporting + exc_is_not_timeout = underlying_exc.errno is not None or not isinstance( + underlying_exc, asyncio.TimeoutError + ) + if exc_is_not_timeout: + reraised_exc = ClientOSError( + underlying_exc.errno, + f"Can not write request body for {self.url !s}", + ) + + set_exception(protocol, reraised_exc, underlying_exc) + except asyncio.CancelledError: + # Body hasn't been fully sent, so connection can't be reused + conn.close() + raise + except Exception as underlying_exc: + set_exception( + protocol, + ClientConnectionError( + "Failed to send bytes into the underlying connection " + f"{conn !s}: {underlying_exc!r}", + ), + underlying_exc, + ) + else: + # Successfully wrote the body, signal EOF and start response timeout + await writer.write_eof() + protocol.start_timeout() + + async def send(self, conn: "Connection") -> "ClientResponse": + # Specify request target: + # - CONNECT request must send authority form URI + # - not CONNECT proxy must send absolute form URI + # - most common is origin form URI + if self.method == hdrs.METH_CONNECT: + connect_host = self.url.host_subcomponent + assert connect_host is not None + path = f"{connect_host}:{self.url.port}" + elif self.proxy and not self.is_ssl(): + path = str(self.url) + else: + path = self.url.raw_path_qs + + protocol = conn.protocol + assert protocol is not None + writer = StreamWriter( + protocol, + self.loop, + on_chunk_sent=( + functools.partial(self._on_chunk_request_sent, self.method, self.url) + if self._traces + else None + ), + on_headers_sent=( + functools.partial(self._on_headers_request_sent, self.method, self.url) + if self._traces + else None + ), + ) + + if self.compress: + writer.enable_compression(self.compress) # type: ignore[arg-type] + + if self.chunked is not None: + writer.enable_chunking() + + # set default content-type + if ( + self.method in self.POST_METHODS + and ( + self._skip_auto_headers is None + or hdrs.CONTENT_TYPE not in self._skip_auto_headers + ) + and hdrs.CONTENT_TYPE not in self.headers + ): + self.headers[hdrs.CONTENT_TYPE] = "application/octet-stream" + + v = self.version + if hdrs.CONNECTION not in self.headers: + if conn._connector.force_close: + if v == HttpVersion11: + self.headers[hdrs.CONNECTION] = "close" + elif v == HttpVersion10: + self.headers[hdrs.CONNECTION] = "keep-alive" + + # status + headers + status_line = f"{self.method} {path} HTTP/{v.major}.{v.minor}" + + # Buffer headers for potential coalescing with body + await writer.write_headers(status_line, self.headers) + + task: Optional["asyncio.Task[None]"] + if self._body or self._continue is not None or protocol.writing_paused: + coro = self.write_bytes(writer, conn, self._get_content_length()) + if sys.version_info >= (3, 12): + # Optimization for Python 3.12, try to write + # bytes immediately to avoid having to schedule + # the task on the event loop. + task = asyncio.Task(coro, loop=self.loop, eager_start=True) + else: + task = self.loop.create_task(coro) + if task.done(): + task = None + else: + self._writer = task + else: + # We have nothing to write because + # - there is no body + # - the protocol does not have writing paused + # - we are not waiting for a 100-continue response + protocol.start_timeout() + writer.set_eof() + task = None + response_class = self.response_class + assert response_class is not None + self.response = response_class( + self.method, + self.original_url, + writer=task, + continue100=self._continue, + timer=self._timer, + request_info=self.request_info, + traces=self._traces, + loop=self.loop, + session=self._session, + ) + return self.response + + async def close(self) -> None: + if self.__writer is not None: + try: + await self.__writer + except asyncio.CancelledError: + if ( + sys.version_info >= (3, 11) + and (task := asyncio.current_task()) + and task.cancelling() + ): + raise + + def terminate(self) -> None: + if self.__writer is not None: + if not self.loop.is_closed(): + self.__writer.cancel() + self.__writer.remove_done_callback(self.__reset_writer) + self.__writer = None + + async def _on_chunk_request_sent(self, method: str, url: URL, chunk: bytes) -> None: + for trace in self._traces: + await trace.send_request_chunk_sent(method, url, chunk) + + async def _on_headers_request_sent( + self, method: str, url: URL, headers: "CIMultiDict[str]" + ) -> None: + for trace in self._traces: + await trace.send_request_headers(method, url, headers) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client_ws.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client_ws.py new file mode 100644 index 0000000..daa57d1 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/client_ws.py @@ -0,0 +1,428 @@ +"""WebSocket client for asyncio.""" + +import asyncio +import sys +from types import TracebackType +from typing import Any, Optional, Type, cast + +import attr + +from ._websocket.reader import WebSocketDataQueue +from .client_exceptions import ClientError, ServerTimeoutError, WSMessageTypeError +from .client_reqrep import ClientResponse +from .helpers import calculate_timeout_when, set_result +from .http import ( + WS_CLOSED_MESSAGE, + WS_CLOSING_MESSAGE, + WebSocketError, + WSCloseCode, + WSMessage, + WSMsgType, +) +from .http_websocket import _INTERNAL_RECEIVE_TYPES, WebSocketWriter +from .streams import EofStream +from .typedefs import ( + DEFAULT_JSON_DECODER, + DEFAULT_JSON_ENCODER, + JSONDecoder, + JSONEncoder, +) + +if sys.version_info >= (3, 11): + import asyncio as async_timeout +else: + import async_timeout + + +@attr.s(frozen=True, slots=True) +class ClientWSTimeout: + ws_receive = attr.ib(type=Optional[float], default=None) + ws_close = attr.ib(type=Optional[float], default=None) + + +DEFAULT_WS_CLIENT_TIMEOUT = ClientWSTimeout(ws_receive=None, ws_close=10.0) + + +class ClientWebSocketResponse: + def __init__( + self, + reader: WebSocketDataQueue, + writer: WebSocketWriter, + protocol: Optional[str], + response: ClientResponse, + timeout: ClientWSTimeout, + autoclose: bool, + autoping: bool, + loop: asyncio.AbstractEventLoop, + *, + heartbeat: Optional[float] = None, + compress: int = 0, + client_notakeover: bool = False, + ) -> None: + self._response = response + self._conn = response.connection + + self._writer = writer + self._reader = reader + self._protocol = protocol + self._closed = False + self._closing = False + self._close_code: Optional[int] = None + self._timeout = timeout + self._autoclose = autoclose + self._autoping = autoping + self._heartbeat = heartbeat + self._heartbeat_cb: Optional[asyncio.TimerHandle] = None + self._heartbeat_when: float = 0.0 + if heartbeat is not None: + self._pong_heartbeat = heartbeat / 2.0 + self._pong_response_cb: Optional[asyncio.TimerHandle] = None + self._loop = loop + self._waiting: bool = False + self._close_wait: Optional[asyncio.Future[None]] = None + self._exception: Optional[BaseException] = None + self._compress = compress + self._client_notakeover = client_notakeover + self._ping_task: Optional[asyncio.Task[None]] = None + + self._reset_heartbeat() + + def _cancel_heartbeat(self) -> None: + self._cancel_pong_response_cb() + if self._heartbeat_cb is not None: + self._heartbeat_cb.cancel() + self._heartbeat_cb = None + if self._ping_task is not None: + self._ping_task.cancel() + self._ping_task = None + + def _cancel_pong_response_cb(self) -> None: + if self._pong_response_cb is not None: + self._pong_response_cb.cancel() + self._pong_response_cb = None + + def _reset_heartbeat(self) -> None: + if self._heartbeat is None: + return + self._cancel_pong_response_cb() + loop = self._loop + assert loop is not None + conn = self._conn + timeout_ceil_threshold = ( + conn._connector._timeout_ceil_threshold if conn is not None else 5 + ) + now = loop.time() + when = calculate_timeout_when(now, self._heartbeat, timeout_ceil_threshold) + self._heartbeat_when = when + if self._heartbeat_cb is None: + # We do not cancel the previous heartbeat_cb here because + # it generates a significant amount of TimerHandle churn + # which causes asyncio to rebuild the heap frequently. + # Instead _send_heartbeat() will reschedule the next + # heartbeat if it fires too early. + self._heartbeat_cb = loop.call_at(when, self._send_heartbeat) + + def _send_heartbeat(self) -> None: + self._heartbeat_cb = None + loop = self._loop + now = loop.time() + if now < self._heartbeat_when: + # Heartbeat fired too early, reschedule + self._heartbeat_cb = loop.call_at( + self._heartbeat_when, self._send_heartbeat + ) + return + + conn = self._conn + timeout_ceil_threshold = ( + conn._connector._timeout_ceil_threshold if conn is not None else 5 + ) + when = calculate_timeout_when(now, self._pong_heartbeat, timeout_ceil_threshold) + self._cancel_pong_response_cb() + self._pong_response_cb = loop.call_at(when, self._pong_not_received) + + coro = self._writer.send_frame(b"", WSMsgType.PING) + if sys.version_info >= (3, 12): + # Optimization for Python 3.12, try to send the ping + # immediately to avoid having to schedule + # the task on the event loop. + ping_task = asyncio.Task(coro, loop=loop, eager_start=True) + else: + ping_task = loop.create_task(coro) + + if not ping_task.done(): + self._ping_task = ping_task + ping_task.add_done_callback(self._ping_task_done) + else: + self._ping_task_done(ping_task) + + def _ping_task_done(self, task: "asyncio.Task[None]") -> None: + """Callback for when the ping task completes.""" + if not task.cancelled() and (exc := task.exception()): + self._handle_ping_pong_exception(exc) + self._ping_task = None + + def _pong_not_received(self) -> None: + self._handle_ping_pong_exception( + ServerTimeoutError(f"No PONG received after {self._pong_heartbeat} seconds") + ) + + def _handle_ping_pong_exception(self, exc: BaseException) -> None: + """Handle exceptions raised during ping/pong processing.""" + if self._closed: + return + self._set_closed() + self._close_code = WSCloseCode.ABNORMAL_CLOSURE + self._exception = exc + self._response.close() + if self._waiting and not self._closing: + self._reader.feed_data(WSMessage(WSMsgType.ERROR, exc, None), 0) + + def _set_closed(self) -> None: + """Set the connection to closed. + + Cancel any heartbeat timers and set the closed flag. + """ + self._closed = True + self._cancel_heartbeat() + + def _set_closing(self) -> None: + """Set the connection to closing. + + Cancel any heartbeat timers and set the closing flag. + """ + self._closing = True + self._cancel_heartbeat() + + @property + def closed(self) -> bool: + return self._closed + + @property + def close_code(self) -> Optional[int]: + return self._close_code + + @property + def protocol(self) -> Optional[str]: + return self._protocol + + @property + def compress(self) -> int: + return self._compress + + @property + def client_notakeover(self) -> bool: + return self._client_notakeover + + def get_extra_info(self, name: str, default: Any = None) -> Any: + """extra info from connection transport""" + conn = self._response.connection + if conn is None: + return default + transport = conn.transport + if transport is None: + return default + return transport.get_extra_info(name, default) + + def exception(self) -> Optional[BaseException]: + return self._exception + + async def ping(self, message: bytes = b"") -> None: + await self._writer.send_frame(message, WSMsgType.PING) + + async def pong(self, message: bytes = b"") -> None: + await self._writer.send_frame(message, WSMsgType.PONG) + + async def send_frame( + self, message: bytes, opcode: WSMsgType, compress: Optional[int] = None + ) -> None: + """Send a frame over the websocket.""" + await self._writer.send_frame(message, opcode, compress) + + async def send_str(self, data: str, compress: Optional[int] = None) -> None: + if not isinstance(data, str): + raise TypeError("data argument must be str (%r)" % type(data)) + await self._writer.send_frame( + data.encode("utf-8"), WSMsgType.TEXT, compress=compress + ) + + async def send_bytes(self, data: bytes, compress: Optional[int] = None) -> None: + if not isinstance(data, (bytes, bytearray, memoryview)): + raise TypeError("data argument must be byte-ish (%r)" % type(data)) + await self._writer.send_frame(data, WSMsgType.BINARY, compress=compress) + + async def send_json( + self, + data: Any, + compress: Optional[int] = None, + *, + dumps: JSONEncoder = DEFAULT_JSON_ENCODER, + ) -> None: + await self.send_str(dumps(data), compress=compress) + + async def close(self, *, code: int = WSCloseCode.OK, message: bytes = b"") -> bool: + # we need to break `receive()` cycle first, + # `close()` may be called from different task + if self._waiting and not self._closing: + assert self._loop is not None + self._close_wait = self._loop.create_future() + self._set_closing() + self._reader.feed_data(WS_CLOSING_MESSAGE, 0) + await self._close_wait + + if self._closed: + return False + + self._set_closed() + try: + await self._writer.close(code, message) + except asyncio.CancelledError: + self._close_code = WSCloseCode.ABNORMAL_CLOSURE + self._response.close() + raise + except Exception as exc: + self._close_code = WSCloseCode.ABNORMAL_CLOSURE + self._exception = exc + self._response.close() + return True + + if self._close_code: + self._response.close() + return True + + while True: + try: + async with async_timeout.timeout(self._timeout.ws_close): + msg = await self._reader.read() + except asyncio.CancelledError: + self._close_code = WSCloseCode.ABNORMAL_CLOSURE + self._response.close() + raise + except Exception as exc: + self._close_code = WSCloseCode.ABNORMAL_CLOSURE + self._exception = exc + self._response.close() + return True + + if msg.type is WSMsgType.CLOSE: + self._close_code = msg.data + self._response.close() + return True + + async def receive(self, timeout: Optional[float] = None) -> WSMessage: + receive_timeout = timeout or self._timeout.ws_receive + + while True: + if self._waiting: + raise RuntimeError("Concurrent call to receive() is not allowed") + + if self._closed: + return WS_CLOSED_MESSAGE + elif self._closing: + await self.close() + return WS_CLOSED_MESSAGE + + try: + self._waiting = True + try: + if receive_timeout: + # Entering the context manager and creating + # Timeout() object can take almost 50% of the + # run time in this loop so we avoid it if + # there is no read timeout. + async with async_timeout.timeout(receive_timeout): + msg = await self._reader.read() + else: + msg = await self._reader.read() + self._reset_heartbeat() + finally: + self._waiting = False + if self._close_wait: + set_result(self._close_wait, None) + except (asyncio.CancelledError, asyncio.TimeoutError): + self._close_code = WSCloseCode.ABNORMAL_CLOSURE + raise + except EofStream: + self._close_code = WSCloseCode.OK + await self.close() + return WSMessage(WSMsgType.CLOSED, None, None) + except ClientError: + # Likely ServerDisconnectedError when connection is lost + self._set_closed() + self._close_code = WSCloseCode.ABNORMAL_CLOSURE + return WS_CLOSED_MESSAGE + except WebSocketError as exc: + self._close_code = exc.code + await self.close(code=exc.code) + return WSMessage(WSMsgType.ERROR, exc, None) + except Exception as exc: + self._exception = exc + self._set_closing() + self._close_code = WSCloseCode.ABNORMAL_CLOSURE + await self.close() + return WSMessage(WSMsgType.ERROR, exc, None) + + if msg.type not in _INTERNAL_RECEIVE_TYPES: + # If its not a close/closing/ping/pong message + # we can return it immediately + return msg + + if msg.type is WSMsgType.CLOSE: + self._set_closing() + self._close_code = msg.data + if not self._closed and self._autoclose: + await self.close() + elif msg.type is WSMsgType.CLOSING: + self._set_closing() + elif msg.type is WSMsgType.PING and self._autoping: + await self.pong(msg.data) + continue + elif msg.type is WSMsgType.PONG and self._autoping: + continue + + return msg + + async def receive_str(self, *, timeout: Optional[float] = None) -> str: + msg = await self.receive(timeout) + if msg.type is not WSMsgType.TEXT: + raise WSMessageTypeError( + f"Received message {msg.type}:{msg.data!r} is not WSMsgType.TEXT" + ) + return cast(str, msg.data) + + async def receive_bytes(self, *, timeout: Optional[float] = None) -> bytes: + msg = await self.receive(timeout) + if msg.type is not WSMsgType.BINARY: + raise WSMessageTypeError( + f"Received message {msg.type}:{msg.data!r} is not WSMsgType.BINARY" + ) + return cast(bytes, msg.data) + + async def receive_json( + self, + *, + loads: JSONDecoder = DEFAULT_JSON_DECODER, + timeout: Optional[float] = None, + ) -> Any: + data = await self.receive_str(timeout=timeout) + return loads(data) + + def __aiter__(self) -> "ClientWebSocketResponse": + return self + + async def __anext__(self) -> WSMessage: + msg = await self.receive() + if msg.type in (WSMsgType.CLOSE, WSMsgType.CLOSING, WSMsgType.CLOSED): + raise StopAsyncIteration + return msg + + async def __aenter__(self) -> "ClientWebSocketResponse": + return self + + async def __aexit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + await self.close() diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/compression_utils.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/compression_utils.py new file mode 100644 index 0000000..e478d24 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/compression_utils.py @@ -0,0 +1,348 @@ +import asyncio +import sys +import zlib +from abc import ABC, abstractmethod +from concurrent.futures import Executor +from typing import Any, Final, Optional, Protocol, TypedDict, cast + +if sys.version_info >= (3, 12): + from collections.abc import Buffer +else: + from typing import Union + + Buffer = Union[bytes, bytearray, "memoryview[int]", "memoryview[bytes]"] + +try: + try: + import brotlicffi as brotli + except ImportError: + import brotli + + HAS_BROTLI = True +except ImportError: # pragma: no cover + HAS_BROTLI = False + +try: + if sys.version_info >= (3, 14): + from compression.zstd import ZstdDecompressor # noqa: I900 + else: # TODO(PY314): Remove mentions of backports.zstd across codebase + from backports.zstd import ZstdDecompressor + + HAS_ZSTD = True +except ImportError: + HAS_ZSTD = False + + +MAX_SYNC_CHUNK_SIZE = 4096 +DEFAULT_MAX_DECOMPRESS_SIZE = 2**25 # 32MiB + +# Unlimited decompression constants - different libraries use different conventions +ZLIB_MAX_LENGTH_UNLIMITED = 0 # zlib uses 0 to mean unlimited +ZSTD_MAX_LENGTH_UNLIMITED = -1 # zstd uses -1 to mean unlimited + + +class ZLibCompressObjProtocol(Protocol): + def compress(self, data: Buffer) -> bytes: ... + def flush(self, mode: int = ..., /) -> bytes: ... + + +class ZLibDecompressObjProtocol(Protocol): + def decompress(self, data: Buffer, max_length: int = ...) -> bytes: ... + def flush(self, length: int = ..., /) -> bytes: ... + + @property + def eof(self) -> bool: ... + + +class ZLibBackendProtocol(Protocol): + MAX_WBITS: int + Z_FULL_FLUSH: int + Z_SYNC_FLUSH: int + Z_BEST_SPEED: int + Z_FINISH: int + + def compressobj( + self, + level: int = ..., + method: int = ..., + wbits: int = ..., + memLevel: int = ..., + strategy: int = ..., + zdict: Optional[Buffer] = ..., + ) -> ZLibCompressObjProtocol: ... + def decompressobj( + self, wbits: int = ..., zdict: Buffer = ... + ) -> ZLibDecompressObjProtocol: ... + + def compress( + self, data: Buffer, /, level: int = ..., wbits: int = ... + ) -> bytes: ... + def decompress( + self, data: Buffer, /, wbits: int = ..., bufsize: int = ... + ) -> bytes: ... + + +class CompressObjArgs(TypedDict, total=False): + wbits: int + strategy: int + level: int + + +class ZLibBackendWrapper: + def __init__(self, _zlib_backend: ZLibBackendProtocol): + self._zlib_backend: ZLibBackendProtocol = _zlib_backend + + @property + def name(self) -> str: + return getattr(self._zlib_backend, "__name__", "undefined") + + @property + def MAX_WBITS(self) -> int: + return self._zlib_backend.MAX_WBITS + + @property + def Z_FULL_FLUSH(self) -> int: + return self._zlib_backend.Z_FULL_FLUSH + + @property + def Z_SYNC_FLUSH(self) -> int: + return self._zlib_backend.Z_SYNC_FLUSH + + @property + def Z_BEST_SPEED(self) -> int: + return self._zlib_backend.Z_BEST_SPEED + + @property + def Z_FINISH(self) -> int: + return self._zlib_backend.Z_FINISH + + def compressobj(self, *args: Any, **kwargs: Any) -> ZLibCompressObjProtocol: + return self._zlib_backend.compressobj(*args, **kwargs) + + def decompressobj(self, *args: Any, **kwargs: Any) -> ZLibDecompressObjProtocol: + return self._zlib_backend.decompressobj(*args, **kwargs) + + def compress(self, data: Buffer, *args: Any, **kwargs: Any) -> bytes: + return self._zlib_backend.compress(data, *args, **kwargs) + + def decompress(self, data: Buffer, *args: Any, **kwargs: Any) -> bytes: + return self._zlib_backend.decompress(data, *args, **kwargs) + + # Everything not explicitly listed in the Protocol we just pass through + def __getattr__(self, attrname: str) -> Any: + return getattr(self._zlib_backend, attrname) + + +ZLibBackend: ZLibBackendWrapper = ZLibBackendWrapper(zlib) + + +def set_zlib_backend(new_zlib_backend: ZLibBackendProtocol) -> None: + ZLibBackend._zlib_backend = new_zlib_backend + + +def encoding_to_mode( + encoding: Optional[str] = None, + suppress_deflate_header: bool = False, +) -> int: + if encoding == "gzip": + return 16 + ZLibBackend.MAX_WBITS + + return -ZLibBackend.MAX_WBITS if suppress_deflate_header else ZLibBackend.MAX_WBITS + + +class DecompressionBaseHandler(ABC): + def __init__( + self, + executor: Optional[Executor] = None, + max_sync_chunk_size: Optional[int] = MAX_SYNC_CHUNK_SIZE, + ): + """Base class for decompression handlers.""" + self._executor = executor + self._max_sync_chunk_size = max_sync_chunk_size + + @abstractmethod + def decompress_sync( + self, data: bytes, max_length: int = ZLIB_MAX_LENGTH_UNLIMITED + ) -> bytes: + """Decompress the given data.""" + + async def decompress( + self, data: bytes, max_length: int = ZLIB_MAX_LENGTH_UNLIMITED + ) -> bytes: + """Decompress the given data.""" + if ( + self._max_sync_chunk_size is not None + and len(data) > self._max_sync_chunk_size + ): + return await asyncio.get_event_loop().run_in_executor( + self._executor, self.decompress_sync, data, max_length + ) + return self.decompress_sync(data, max_length) + + +class ZLibCompressor: + def __init__( + self, + encoding: Optional[str] = None, + suppress_deflate_header: bool = False, + level: Optional[int] = None, + wbits: Optional[int] = None, + strategy: Optional[int] = None, + executor: Optional[Executor] = None, + max_sync_chunk_size: Optional[int] = MAX_SYNC_CHUNK_SIZE, + ): + self._executor = executor + self._max_sync_chunk_size = max_sync_chunk_size + self._mode = ( + encoding_to_mode(encoding, suppress_deflate_header) + if wbits is None + else wbits + ) + self._zlib_backend: Final = ZLibBackendWrapper(ZLibBackend._zlib_backend) + + kwargs: CompressObjArgs = {} + kwargs["wbits"] = self._mode + if strategy is not None: + kwargs["strategy"] = strategy + if level is not None: + kwargs["level"] = level + self._compressor = self._zlib_backend.compressobj(**kwargs) + + def compress_sync(self, data: bytes) -> bytes: + return self._compressor.compress(data) + + async def compress(self, data: bytes) -> bytes: + """Compress the data and returned the compressed bytes. + + Note that flush() must be called after the last call to compress() + + If the data size is large than the max_sync_chunk_size, the compression + will be done in the executor. Otherwise, the compression will be done + in the event loop. + + **WARNING: This method is NOT cancellation-safe when used with flush().** + If this operation is cancelled, the compressor state may be corrupted. + The connection MUST be closed after cancellation to avoid data corruption + in subsequent compress operations. + + For cancellation-safe compression (e.g., WebSocket), the caller MUST wrap + compress() + flush() + send operations in a shield and lock to ensure atomicity. + """ + # For large payloads, offload compression to executor to avoid blocking event loop + should_use_executor = ( + self._max_sync_chunk_size is not None + and len(data) > self._max_sync_chunk_size + ) + if should_use_executor: + return await asyncio.get_running_loop().run_in_executor( + self._executor, self._compressor.compress, data + ) + return self.compress_sync(data) + + def flush(self, mode: Optional[int] = None) -> bytes: + """Flush the compressor synchronously. + + **WARNING: This method is NOT cancellation-safe when called after compress().** + The flush() operation accesses shared compressor state. If compress() was + cancelled, calling flush() may result in corrupted data. The connection MUST + be closed after compress() cancellation. + + For cancellation-safe compression (e.g., WebSocket), the caller MUST wrap + compress() + flush() + send operations in a shield and lock to ensure atomicity. + """ + return self._compressor.flush( + mode if mode is not None else self._zlib_backend.Z_FINISH + ) + + +class ZLibDecompressor(DecompressionBaseHandler): + def __init__( + self, + encoding: Optional[str] = None, + suppress_deflate_header: bool = False, + executor: Optional[Executor] = None, + max_sync_chunk_size: Optional[int] = MAX_SYNC_CHUNK_SIZE, + ): + super().__init__(executor=executor, max_sync_chunk_size=max_sync_chunk_size) + self._mode = encoding_to_mode(encoding, suppress_deflate_header) + self._zlib_backend: Final = ZLibBackendWrapper(ZLibBackend._zlib_backend) + self._decompressor = self._zlib_backend.decompressobj(wbits=self._mode) + + def decompress_sync( + self, data: Buffer, max_length: int = ZLIB_MAX_LENGTH_UNLIMITED + ) -> bytes: + return self._decompressor.decompress(data, max_length) + + def flush(self, length: int = 0) -> bytes: + return ( + self._decompressor.flush(length) + if length > 0 + else self._decompressor.flush() + ) + + @property + def eof(self) -> bool: + return self._decompressor.eof + + +class BrotliDecompressor(DecompressionBaseHandler): + # Supports both 'brotlipy' and 'Brotli' packages + # since they share an import name. The top branches + # are for 'brotlipy' and bottom branches for 'Brotli' + def __init__( + self, + executor: Optional[Executor] = None, + max_sync_chunk_size: Optional[int] = MAX_SYNC_CHUNK_SIZE, + ) -> None: + """Decompress data using the Brotli library.""" + if not HAS_BROTLI: + raise RuntimeError( + "The brotli decompression is not available. " + "Please install `Brotli` module" + ) + self._obj = brotli.Decompressor() + super().__init__(executor=executor, max_sync_chunk_size=max_sync_chunk_size) + + def decompress_sync( + self, data: Buffer, max_length: int = ZLIB_MAX_LENGTH_UNLIMITED + ) -> bytes: + """Decompress the given data.""" + if hasattr(self._obj, "decompress"): + return cast(bytes, self._obj.decompress(data, max_length)) + return cast(bytes, self._obj.process(data, max_length)) + + def flush(self) -> bytes: + """Flush the decompressor.""" + if hasattr(self._obj, "flush"): + return cast(bytes, self._obj.flush()) + return b"" + + +class ZSTDDecompressor(DecompressionBaseHandler): + def __init__( + self, + executor: Optional[Executor] = None, + max_sync_chunk_size: Optional[int] = MAX_SYNC_CHUNK_SIZE, + ) -> None: + if not HAS_ZSTD: + raise RuntimeError( + "The zstd decompression is not available. " + "Please install `backports.zstd` module" + ) + self._obj = ZstdDecompressor() + super().__init__(executor=executor, max_sync_chunk_size=max_sync_chunk_size) + + def decompress_sync( + self, data: bytes, max_length: int = ZLIB_MAX_LENGTH_UNLIMITED + ) -> bytes: + # zstd uses -1 for unlimited, while zlib uses 0 for unlimited + # Convert the zlib convention (0=unlimited) to zstd convention (-1=unlimited) + zstd_max_length = ( + ZSTD_MAX_LENGTH_UNLIMITED + if max_length == ZLIB_MAX_LENGTH_UNLIMITED + else max_length + ) + return self._obj.decompress(data, zstd_max_length) + + def flush(self) -> bytes: + return b"" diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/connector.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/connector.py new file mode 100644 index 0000000..290a424 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/connector.py @@ -0,0 +1,1842 @@ +import asyncio +import functools +import random +import socket +import sys +import traceback +import warnings +from collections import OrderedDict, defaultdict, deque +from contextlib import suppress +from http import HTTPStatus +from itertools import chain, cycle, islice +from time import monotonic +from types import TracebackType +from typing import ( + TYPE_CHECKING, + Any, + Awaitable, + Callable, + DefaultDict, + Deque, + Dict, + Iterator, + List, + Literal, + Optional, + Sequence, + Set, + Tuple, + Type, + Union, + cast, +) + +import aiohappyeyeballs +from aiohappyeyeballs import AddrInfoType, SocketFactoryType + +from . import hdrs, helpers +from .abc import AbstractResolver, ResolveResult +from .client_exceptions import ( + ClientConnectionError, + ClientConnectorCertificateError, + ClientConnectorDNSError, + ClientConnectorError, + ClientConnectorSSLError, + ClientHttpProxyError, + ClientProxyConnectionError, + ServerFingerprintMismatch, + UnixClientConnectorError, + cert_errors, + ssl_errors, +) +from .client_proto import ResponseHandler +from .client_reqrep import ClientRequest, Fingerprint, _merge_ssl_params +from .helpers import ( + _SENTINEL, + ceil_timeout, + is_ip_address, + noop, + sentinel, + set_exception, + set_result, +) +from .log import client_logger +from .resolver import DefaultResolver + +if sys.version_info >= (3, 12): + from collections.abc import Buffer +else: + Buffer = Union[bytes, bytearray, "memoryview[int]", "memoryview[bytes]"] + +if TYPE_CHECKING: + import ssl + + SSLContext = ssl.SSLContext +else: + try: + import ssl + + SSLContext = ssl.SSLContext + except ImportError: # pragma: no cover + ssl = None # type: ignore[assignment] + SSLContext = object # type: ignore[misc,assignment] + +EMPTY_SCHEMA_SET = frozenset({""}) +HTTP_SCHEMA_SET = frozenset({"http", "https"}) +WS_SCHEMA_SET = frozenset({"ws", "wss"}) + +HTTP_AND_EMPTY_SCHEMA_SET = HTTP_SCHEMA_SET | EMPTY_SCHEMA_SET +HIGH_LEVEL_SCHEMA_SET = HTTP_AND_EMPTY_SCHEMA_SET | WS_SCHEMA_SET + +NEEDS_CLEANUP_CLOSED = (3, 13, 0) <= sys.version_info < ( + 3, + 13, + 1, +) or sys.version_info < (3, 12, 7) +# Cleanup closed is no longer needed after https://github.com/python/cpython/pull/118960 +# which first appeared in Python 3.12.7 and 3.13.1 + + +__all__ = ( + "BaseConnector", + "TCPConnector", + "UnixConnector", + "NamedPipeConnector", + "AddrInfoType", + "SocketFactoryType", +) + + +if TYPE_CHECKING: + from .client import ClientTimeout + from .client_reqrep import ConnectionKey + from .tracing import Trace + + +class _DeprecationWaiter: + __slots__ = ("_awaitable", "_awaited") + + def __init__(self, awaitable: Awaitable[Any]) -> None: + self._awaitable = awaitable + self._awaited = False + + def __await__(self) -> Any: + self._awaited = True + return self._awaitable.__await__() + + def __del__(self) -> None: + if not self._awaited: + warnings.warn( + "Connector.close() is a coroutine, " + "please use await connector.close()", + DeprecationWarning, + ) + + +async def _wait_for_close(waiters: List[Awaitable[object]]) -> None: + """Wait for all waiters to finish closing.""" + results = await asyncio.gather(*waiters, return_exceptions=True) + for res in results: + if isinstance(res, Exception): + client_logger.debug("Error while closing connector: %r", res) + + +class Connection: + + _source_traceback = None + + def __init__( + self, + connector: "BaseConnector", + key: "ConnectionKey", + protocol: ResponseHandler, + loop: asyncio.AbstractEventLoop, + ) -> None: + self._key = key + self._connector = connector + self._loop = loop + self._protocol: Optional[ResponseHandler] = protocol + self._callbacks: List[Callable[[], None]] = [] + + if loop.get_debug(): + self._source_traceback = traceback.extract_stack(sys._getframe(1)) + + def __repr__(self) -> str: + return f"Connection<{self._key}>" + + def __del__(self, _warnings: Any = warnings) -> None: + if self._protocol is not None: + kwargs = {"source": self} + _warnings.warn(f"Unclosed connection {self!r}", ResourceWarning, **kwargs) + if self._loop.is_closed(): + return + + self._connector._release(self._key, self._protocol, should_close=True) + + context = {"client_connection": self, "message": "Unclosed connection"} + if self._source_traceback is not None: + context["source_traceback"] = self._source_traceback + self._loop.call_exception_handler(context) + + def __bool__(self) -> Literal[True]: + """Force subclasses to not be falsy, to make checks simpler.""" + return True + + @property + def loop(self) -> asyncio.AbstractEventLoop: + warnings.warn( + "connector.loop property is deprecated", DeprecationWarning, stacklevel=2 + ) + return self._loop + + @property + def transport(self) -> Optional[asyncio.Transport]: + if self._protocol is None: + return None + return self._protocol.transport + + @property + def protocol(self) -> Optional[ResponseHandler]: + return self._protocol + + def add_callback(self, callback: Callable[[], None]) -> None: + if callback is not None: + self._callbacks.append(callback) + + def _notify_release(self) -> None: + callbacks, self._callbacks = self._callbacks[:], [] + + for cb in callbacks: + with suppress(Exception): + cb() + + def close(self) -> None: + self._notify_release() + + if self._protocol is not None: + self._connector._release(self._key, self._protocol, should_close=True) + self._protocol = None + + def release(self) -> None: + self._notify_release() + + if self._protocol is not None: + self._connector._release(self._key, self._protocol) + self._protocol = None + + @property + def closed(self) -> bool: + return self._protocol is None or not self._protocol.is_connected() + + +class _ConnectTunnelConnection(Connection): + """Special connection wrapper for CONNECT tunnels that must never be pooled. + + This connection wraps the proxy connection that will be upgraded with TLS. + It must never be released to the pool because: + 1. Its 'closed' future will never complete, causing session.close() to hang + 2. It represents an intermediate state, not a reusable connection + 3. The real connection (with TLS) will be created separately + """ + + def release(self) -> None: + """Do nothing - don't pool or close the connection. + + These connections are an intermediate state during the CONNECT tunnel + setup and will be cleaned up naturally after the TLS upgrade. If they + were to be pooled, they would never be properly closed, causing + session.close() to wait forever for their 'closed' future. + """ + + +class _TransportPlaceholder: + """placeholder for BaseConnector.connect function""" + + __slots__ = ("closed", "transport") + + def __init__(self, closed_future: asyncio.Future[Optional[Exception]]) -> None: + """Initialize a placeholder for a transport.""" + self.closed = closed_future + self.transport = None + + def close(self) -> None: + """Close the placeholder.""" + + def abort(self) -> None: + """Abort the placeholder (does nothing).""" + + +class BaseConnector: + """Base connector class. + + keepalive_timeout - (optional) Keep-alive timeout. + force_close - Set to True to force close and do reconnect + after each request (and between redirects). + limit - The total number of simultaneous connections. + limit_per_host - Number of simultaneous connections to one host. + enable_cleanup_closed - Enables clean-up closed ssl transports. + Disabled by default. + timeout_ceil_threshold - Trigger ceiling of timeout values when + it's above timeout_ceil_threshold. + loop - Optional event loop. + """ + + _closed = True # prevent AttributeError in __del__ if ctor was failed + _source_traceback = None + + # abort transport after 2 seconds (cleanup broken connections) + _cleanup_closed_period = 2.0 + + allowed_protocol_schema_set = HIGH_LEVEL_SCHEMA_SET + + def __init__( + self, + *, + keepalive_timeout: Union[object, None, float] = sentinel, + force_close: bool = False, + limit: int = 100, + limit_per_host: int = 0, + enable_cleanup_closed: bool = False, + loop: Optional[asyncio.AbstractEventLoop] = None, + timeout_ceil_threshold: float = 5, + ) -> None: + + if force_close: + if keepalive_timeout is not None and keepalive_timeout is not sentinel: + raise ValueError( + "keepalive_timeout cannot be set if force_close is True" + ) + else: + if keepalive_timeout is sentinel: + keepalive_timeout = 15.0 + + loop = loop or asyncio.get_running_loop() + self._timeout_ceil_threshold = timeout_ceil_threshold + + self._closed = False + if loop.get_debug(): + self._source_traceback = traceback.extract_stack(sys._getframe(1)) + + # Connection pool of reusable connections. + # We use a deque to store connections because it has O(1) popleft() + # and O(1) append() operations to implement a FIFO queue. + self._conns: DefaultDict[ + ConnectionKey, Deque[Tuple[ResponseHandler, float]] + ] = defaultdict(deque) + self._limit = limit + self._limit_per_host = limit_per_host + self._acquired: Set[ResponseHandler] = set() + self._acquired_per_host: DefaultDict[ConnectionKey, Set[ResponseHandler]] = ( + defaultdict(set) + ) + self._keepalive_timeout = cast(float, keepalive_timeout) + self._force_close = force_close + + # {host_key: FIFO list of waiters} + # The FIFO is implemented with an OrderedDict with None keys because + # python does not have an ordered set. + self._waiters: DefaultDict[ + ConnectionKey, OrderedDict[asyncio.Future[None], None] + ] = defaultdict(OrderedDict) + + self._loop = loop + self._factory = functools.partial(ResponseHandler, loop=loop) + + # start keep-alive connection cleanup task + self._cleanup_handle: Optional[asyncio.TimerHandle] = None + + # start cleanup closed transports task + self._cleanup_closed_handle: Optional[asyncio.TimerHandle] = None + + if enable_cleanup_closed and not NEEDS_CLEANUP_CLOSED: + warnings.warn( + "enable_cleanup_closed ignored because " + "https://github.com/python/cpython/pull/118960 is fixed " + f"in Python version {sys.version_info}", + DeprecationWarning, + stacklevel=2, + ) + enable_cleanup_closed = False + + self._cleanup_closed_disabled = not enable_cleanup_closed + self._cleanup_closed_transports: List[Optional[asyncio.Transport]] = [] + self._placeholder_future: asyncio.Future[Optional[Exception]] = ( + loop.create_future() + ) + self._placeholder_future.set_result(None) + self._cleanup_closed() + + def __del__(self, _warnings: Any = warnings) -> None: + if self._closed: + return + if not self._conns: + return + + conns = [repr(c) for c in self._conns.values()] + + self._close() + + kwargs = {"source": self} + _warnings.warn(f"Unclosed connector {self!r}", ResourceWarning, **kwargs) + context = { + "connector": self, + "connections": conns, + "message": "Unclosed connector", + } + if self._source_traceback is not None: + context["source_traceback"] = self._source_traceback + self._loop.call_exception_handler(context) + + def __enter__(self) -> "BaseConnector": + warnings.warn( + '"with Connector():" is deprecated, ' + 'use "async with Connector():" instead', + DeprecationWarning, + ) + return self + + def __exit__(self, *exc: Any) -> None: + self._close() + + async def __aenter__(self) -> "BaseConnector": + return self + + async def __aexit__( + self, + exc_type: Optional[Type[BaseException]] = None, + exc_value: Optional[BaseException] = None, + exc_traceback: Optional[TracebackType] = None, + ) -> None: + await self.close() + + @property + def force_close(self) -> bool: + """Ultimately close connection on releasing if True.""" + return self._force_close + + @property + def limit(self) -> int: + """The total number for simultaneous connections. + + If limit is 0 the connector has no limit. + The default limit size is 100. + """ + return self._limit + + @property + def limit_per_host(self) -> int: + """The limit for simultaneous connections to the same endpoint. + + Endpoints are the same if they are have equal + (host, port, is_ssl) triple. + """ + return self._limit_per_host + + def _cleanup(self) -> None: + """Cleanup unused transports.""" + if self._cleanup_handle: + self._cleanup_handle.cancel() + # _cleanup_handle should be unset, otherwise _release() will not + # recreate it ever! + self._cleanup_handle = None + + now = monotonic() + timeout = self._keepalive_timeout + + if self._conns: + connections = defaultdict(deque) + deadline = now - timeout + for key, conns in self._conns.items(): + alive: Deque[Tuple[ResponseHandler, float]] = deque() + for proto, use_time in conns: + if proto.is_connected() and use_time - deadline >= 0: + alive.append((proto, use_time)) + continue + transport = proto.transport + proto.close() + if not self._cleanup_closed_disabled and key.is_ssl: + self._cleanup_closed_transports.append(transport) + + if alive: + connections[key] = alive + + self._conns = connections + + if self._conns: + self._cleanup_handle = helpers.weakref_handle( + self, + "_cleanup", + timeout, + self._loop, + timeout_ceil_threshold=self._timeout_ceil_threshold, + ) + + def _cleanup_closed(self) -> None: + """Double confirmation for transport close. + + Some broken ssl servers may leave socket open without proper close. + """ + if self._cleanup_closed_handle: + self._cleanup_closed_handle.cancel() + + for transport in self._cleanup_closed_transports: + if transport is not None: + transport.abort() + + self._cleanup_closed_transports = [] + + if not self._cleanup_closed_disabled: + self._cleanup_closed_handle = helpers.weakref_handle( + self, + "_cleanup_closed", + self._cleanup_closed_period, + self._loop, + timeout_ceil_threshold=self._timeout_ceil_threshold, + ) + + def close(self, *, abort_ssl: bool = False) -> Awaitable[None]: + """Close all opened transports. + + :param abort_ssl: If True, SSL connections will be aborted immediately + without performing the shutdown handshake. This provides + faster cleanup at the cost of less graceful disconnection. + """ + if not (waiters := self._close(abort_ssl=abort_ssl)): + # If there are no connections to close, we can return a noop + # awaitable to avoid scheduling a task on the event loop. + return _DeprecationWaiter(noop()) + coro = _wait_for_close(waiters) + if sys.version_info >= (3, 12): + # Optimization for Python 3.12, try to close connections + # immediately to avoid having to schedule the task on the event loop. + task = asyncio.Task(coro, loop=self._loop, eager_start=True) + else: + task = self._loop.create_task(coro) + return _DeprecationWaiter(task) + + def _close(self, *, abort_ssl: bool = False) -> List[Awaitable[object]]: + waiters: List[Awaitable[object]] = [] + + if self._closed: + return waiters + + self._closed = True + + try: + if self._loop.is_closed(): + return waiters + + # cancel cleanup task + if self._cleanup_handle: + self._cleanup_handle.cancel() + + # cancel cleanup close task + if self._cleanup_closed_handle: + self._cleanup_closed_handle.cancel() + + for data in self._conns.values(): + for proto, _ in data: + if ( + abort_ssl + and proto.transport + and proto.transport.get_extra_info("sslcontext") is not None + ): + proto.abort() + else: + proto.close() + if closed := proto.closed: + waiters.append(closed) + + for proto in self._acquired: + if ( + abort_ssl + and proto.transport + and proto.transport.get_extra_info("sslcontext") is not None + ): + proto.abort() + else: + proto.close() + if closed := proto.closed: + waiters.append(closed) + + for transport in self._cleanup_closed_transports: + if transport is not None: + transport.abort() + + return waiters + + finally: + self._conns.clear() + self._acquired.clear() + for keyed_waiters in self._waiters.values(): + for keyed_waiter in keyed_waiters: + keyed_waiter.cancel() + self._waiters.clear() + self._cleanup_handle = None + self._cleanup_closed_transports.clear() + self._cleanup_closed_handle = None + + @property + def closed(self) -> bool: + """Is connector closed. + + A readonly property. + """ + return self._closed + + def _available_connections(self, key: "ConnectionKey") -> int: + """ + Return number of available connections. + + The limit, limit_per_host and the connection key are taken into account. + + If it returns less than 1 means that there are no connections + available. + """ + # check total available connections + # If there are no limits, this will always return 1 + total_remain = 1 + + if self._limit and (total_remain := self._limit - len(self._acquired)) <= 0: + return total_remain + + # check limit per host + if host_remain := self._limit_per_host: + if acquired := self._acquired_per_host.get(key): + host_remain -= len(acquired) + if total_remain > host_remain: + return host_remain + + return total_remain + + def _update_proxy_auth_header_and_build_proxy_req( + self, req: ClientRequest + ) -> ClientRequest: + """Set Proxy-Authorization header for non-SSL proxy requests and builds the proxy request for SSL proxy requests.""" + url = req.proxy + assert url is not None + headers: Dict[str, str] = {} + if req.proxy_headers is not None: + headers = req.proxy_headers # type: ignore[assignment] + headers[hdrs.HOST] = req.headers[hdrs.HOST] + proxy_req = ClientRequest( + hdrs.METH_GET, + url, + headers=headers, + auth=req.proxy_auth, + loop=self._loop, + ssl=req.ssl, + ) + auth = proxy_req.headers.pop(hdrs.AUTHORIZATION, None) + if auth is not None: + if not req.is_ssl(): + req.headers[hdrs.PROXY_AUTHORIZATION] = auth + else: + proxy_req.headers[hdrs.PROXY_AUTHORIZATION] = auth + return proxy_req + + async def connect( + self, req: ClientRequest, traces: List["Trace"], timeout: "ClientTimeout" + ) -> Connection: + """Get from pool or create new connection.""" + key = req.connection_key + if (conn := await self._get(key, traces)) is not None: + # If we do not have to wait and we can get a connection from the pool + # we can avoid the timeout ceil logic and directly return the connection + if req.proxy: + self._update_proxy_auth_header_and_build_proxy_req(req) + return conn + + async with ceil_timeout(timeout.connect, timeout.ceil_threshold): + if self._available_connections(key) <= 0: + await self._wait_for_available_connection(key, traces) + if (conn := await self._get(key, traces)) is not None: + if req.proxy: + self._update_proxy_auth_header_and_build_proxy_req(req) + return conn + + placeholder = cast( + ResponseHandler, _TransportPlaceholder(self._placeholder_future) + ) + self._acquired.add(placeholder) + if self._limit_per_host: + self._acquired_per_host[key].add(placeholder) + + try: + # Traces are done inside the try block to ensure that the + # that the placeholder is still cleaned up if an exception + # is raised. + if traces: + for trace in traces: + await trace.send_connection_create_start() + proto = await self._create_connection(req, traces, timeout) + if traces: + for trace in traces: + await trace.send_connection_create_end() + except BaseException: + self._release_acquired(key, placeholder) + raise + else: + if self._closed: + proto.close() + raise ClientConnectionError("Connector is closed.") + + # The connection was successfully created, drop the placeholder + # and add the real connection to the acquired set. There should + # be no awaits after the proto is added to the acquired set + # to ensure that the connection is not left in the acquired set + # on cancellation. + self._acquired.remove(placeholder) + self._acquired.add(proto) + if self._limit_per_host: + acquired_per_host = self._acquired_per_host[key] + acquired_per_host.remove(placeholder) + acquired_per_host.add(proto) + return Connection(self, key, proto, self._loop) + + async def _wait_for_available_connection( + self, key: "ConnectionKey", traces: List["Trace"] + ) -> None: + """Wait for an available connection slot.""" + # We loop here because there is a race between + # the connection limit check and the connection + # being acquired. If the connection is acquired + # between the check and the await statement, we + # need to loop again to check if the connection + # slot is still available. + attempts = 0 + while True: + fut: asyncio.Future[None] = self._loop.create_future() + keyed_waiters = self._waiters[key] + keyed_waiters[fut] = None + if attempts: + # If we have waited before, we need to move the waiter + # to the front of the queue as otherwise we might get + # starved and hit the timeout. + keyed_waiters.move_to_end(fut, last=False) + + try: + # Traces happen in the try block to ensure that the + # the waiter is still cleaned up if an exception is raised. + if traces: + for trace in traces: + await trace.send_connection_queued_start() + await fut + if traces: + for trace in traces: + await trace.send_connection_queued_end() + finally: + # pop the waiter from the queue if its still + # there and not already removed by _release_waiter + keyed_waiters.pop(fut, None) + if not self._waiters.get(key, True): + del self._waiters[key] + + if self._available_connections(key) > 0: + break + attempts += 1 + + async def _get( + self, key: "ConnectionKey", traces: List["Trace"] + ) -> Optional[Connection]: + """Get next reusable connection for the key or None. + + The connection will be marked as acquired. + """ + if (conns := self._conns.get(key)) is None: + return None + + t1 = monotonic() + while conns: + proto, t0 = conns.popleft() + # We will we reuse the connection if its connected and + # the keepalive timeout has not been exceeded + if proto.is_connected() and t1 - t0 <= self._keepalive_timeout: + if not conns: + # The very last connection was reclaimed: drop the key + del self._conns[key] + self._acquired.add(proto) + if self._limit_per_host: + self._acquired_per_host[key].add(proto) + if traces: + for trace in traces: + try: + await trace.send_connection_reuseconn() + except BaseException: + self._release_acquired(key, proto) + raise + return Connection(self, key, proto, self._loop) + + # Connection cannot be reused, close it + transport = proto.transport + proto.close() + # only for SSL transports + if not self._cleanup_closed_disabled and key.is_ssl: + self._cleanup_closed_transports.append(transport) + + # No more connections: drop the key + del self._conns[key] + return None + + def _release_waiter(self) -> None: + """ + Iterates over all waiters until one to be released is found. + + The one to be released is not finished and + belongs to a host that has available connections. + """ + if not self._waiters: + return + + # Having the dict keys ordered this avoids to iterate + # at the same order at each call. + queues = list(self._waiters) + random.shuffle(queues) + + for key in queues: + if self._available_connections(key) < 1: + continue + + waiters = self._waiters[key] + while waiters: + waiter, _ = waiters.popitem(last=False) + if not waiter.done(): + waiter.set_result(None) + return + + def _release_acquired(self, key: "ConnectionKey", proto: ResponseHandler) -> None: + """Release acquired connection.""" + if self._closed: + # acquired connection is already released on connector closing + return + + self._acquired.discard(proto) + if self._limit_per_host and (conns := self._acquired_per_host.get(key)): + conns.discard(proto) + if not conns: + del self._acquired_per_host[key] + self._release_waiter() + + def _release( + self, + key: "ConnectionKey", + protocol: ResponseHandler, + *, + should_close: bool = False, + ) -> None: + if self._closed: + # acquired connection is already released on connector closing + return + + self._release_acquired(key, protocol) + + if self._force_close or should_close or protocol.should_close: + transport = protocol.transport + protocol.close() + + if key.is_ssl and not self._cleanup_closed_disabled: + self._cleanup_closed_transports.append(transport) + return + + self._conns[key].append((protocol, monotonic())) + + if self._cleanup_handle is None: + self._cleanup_handle = helpers.weakref_handle( + self, + "_cleanup", + self._keepalive_timeout, + self._loop, + timeout_ceil_threshold=self._timeout_ceil_threshold, + ) + + async def _create_connection( + self, req: ClientRequest, traces: List["Trace"], timeout: "ClientTimeout" + ) -> ResponseHandler: + raise NotImplementedError() + + +class _DNSCacheTable: + def __init__(self, ttl: Optional[float] = None) -> None: + self._addrs_rr: Dict[Tuple[str, int], Tuple[Iterator[ResolveResult], int]] = {} + self._timestamps: Dict[Tuple[str, int], float] = {} + self._ttl = ttl + + def __contains__(self, host: object) -> bool: + return host in self._addrs_rr + + def add(self, key: Tuple[str, int], addrs: List[ResolveResult]) -> None: + self._addrs_rr[key] = (cycle(addrs), len(addrs)) + + if self._ttl is not None: + self._timestamps[key] = monotonic() + + def remove(self, key: Tuple[str, int]) -> None: + self._addrs_rr.pop(key, None) + + if self._ttl is not None: + self._timestamps.pop(key, None) + + def clear(self) -> None: + self._addrs_rr.clear() + self._timestamps.clear() + + def next_addrs(self, key: Tuple[str, int]) -> List[ResolveResult]: + loop, length = self._addrs_rr[key] + addrs = list(islice(loop, length)) + # Consume one more element to shift internal state of `cycle` + next(loop) + return addrs + + def expired(self, key: Tuple[str, int]) -> bool: + if self._ttl is None: + return False + + return self._timestamps[key] + self._ttl < monotonic() + + +def _make_ssl_context(verified: bool) -> SSLContext: + """Create SSL context. + + This method is not async-friendly and should be called from a thread + because it will load certificates from disk and do other blocking I/O. + """ + if ssl is None: + # No ssl support + return None + if verified: + sslcontext = ssl.create_default_context() + else: + sslcontext = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) + sslcontext.options |= ssl.OP_NO_SSLv2 + sslcontext.options |= ssl.OP_NO_SSLv3 + sslcontext.check_hostname = False + sslcontext.verify_mode = ssl.CERT_NONE + sslcontext.options |= ssl.OP_NO_COMPRESSION + sslcontext.set_default_verify_paths() + sslcontext.set_alpn_protocols(("http/1.1",)) + return sslcontext + + +# The default SSLContext objects are created at import time +# since they do blocking I/O to load certificates from disk, +# and imports should always be done before the event loop starts +# or in a thread. +_SSL_CONTEXT_VERIFIED = _make_ssl_context(True) +_SSL_CONTEXT_UNVERIFIED = _make_ssl_context(False) + + +class TCPConnector(BaseConnector): + """TCP connector. + + verify_ssl - Set to True to check ssl certifications. + fingerprint - Pass the binary sha256 + digest of the expected certificate in DER format to verify + that the certificate the server presents matches. See also + https://en.wikipedia.org/wiki/HTTP_Public_Key_Pinning + resolver - Enable DNS lookups and use this + resolver + use_dns_cache - Use memory cache for DNS lookups. + ttl_dns_cache - Max seconds having cached a DNS entry, None forever. + family - socket address family + local_addr - local tuple of (host, port) to bind socket to + + keepalive_timeout - (optional) Keep-alive timeout. + force_close - Set to True to force close and do reconnect + after each request (and between redirects). + limit - The total number of simultaneous connections. + limit_per_host - Number of simultaneous connections to one host. + enable_cleanup_closed - Enables clean-up closed ssl transports. + Disabled by default. + happy_eyeballs_delay - This is the “Connection Attempt Delay” + as defined in RFC 8305. To disable + the happy eyeballs algorithm, set to None. + interleave - “First Address Family Count” as defined in RFC 8305 + loop - Optional event loop. + socket_factory - A SocketFactoryType function that, if supplied, + will be used to create sockets given an + AddrInfoType. + ssl_shutdown_timeout - DEPRECATED. Will be removed in aiohttp 4.0. + Grace period for SSL shutdown handshake on TLS + connections. Default is 0 seconds (immediate abort). + This parameter allowed for a clean SSL shutdown by + notifying the remote peer of connection closure, + while avoiding excessive delays during connector cleanup. + Note: Only takes effect on Python 3.11+. + """ + + allowed_protocol_schema_set = HIGH_LEVEL_SCHEMA_SET | frozenset({"tcp"}) + + def __init__( + self, + *, + verify_ssl: bool = True, + fingerprint: Optional[bytes] = None, + use_dns_cache: bool = True, + ttl_dns_cache: Optional[int] = 10, + family: socket.AddressFamily = socket.AddressFamily.AF_UNSPEC, + ssl_context: Optional[SSLContext] = None, + ssl: Union[bool, Fingerprint, SSLContext] = True, + local_addr: Optional[Tuple[str, int]] = None, + resolver: Optional[AbstractResolver] = None, + keepalive_timeout: Union[None, float, object] = sentinel, + force_close: bool = False, + limit: int = 100, + limit_per_host: int = 0, + enable_cleanup_closed: bool = False, + loop: Optional[asyncio.AbstractEventLoop] = None, + timeout_ceil_threshold: float = 5, + happy_eyeballs_delay: Optional[float] = 0.25, + interleave: Optional[int] = None, + socket_factory: Optional[SocketFactoryType] = None, + ssl_shutdown_timeout: Union[_SENTINEL, None, float] = sentinel, + ): + super().__init__( + keepalive_timeout=keepalive_timeout, + force_close=force_close, + limit=limit, + limit_per_host=limit_per_host, + enable_cleanup_closed=enable_cleanup_closed, + loop=loop, + timeout_ceil_threshold=timeout_ceil_threshold, + ) + + self._ssl = _merge_ssl_params(ssl, verify_ssl, ssl_context, fingerprint) + + self._resolver: AbstractResolver + if resolver is None: + self._resolver = DefaultResolver(loop=self._loop) + self._resolver_owner = True + else: + self._resolver = resolver + self._resolver_owner = False + + self._use_dns_cache = use_dns_cache + self._cached_hosts = _DNSCacheTable(ttl=ttl_dns_cache) + self._throttle_dns_futures: Dict[ + Tuple[str, int], Set["asyncio.Future[None]"] + ] = {} + self._family = family + self._local_addr_infos = aiohappyeyeballs.addr_to_addr_infos(local_addr) + self._happy_eyeballs_delay = happy_eyeballs_delay + self._interleave = interleave + self._resolve_host_tasks: Set["asyncio.Task[List[ResolveResult]]"] = set() + self._socket_factory = socket_factory + self._ssl_shutdown_timeout: Optional[float] + # Handle ssl_shutdown_timeout with warning for Python < 3.11 + if ssl_shutdown_timeout is sentinel: + self._ssl_shutdown_timeout = 0 + else: + # Deprecation warning for ssl_shutdown_timeout parameter + warnings.warn( + "The ssl_shutdown_timeout parameter is deprecated and will be removed in aiohttp 4.0", + DeprecationWarning, + stacklevel=2, + ) + if ( + sys.version_info < (3, 11) + and ssl_shutdown_timeout is not None + and ssl_shutdown_timeout != 0 + ): + warnings.warn( + f"ssl_shutdown_timeout={ssl_shutdown_timeout} is ignored on Python < 3.11; " + "only ssl_shutdown_timeout=0 is supported. The timeout will be ignored.", + RuntimeWarning, + stacklevel=2, + ) + self._ssl_shutdown_timeout = ssl_shutdown_timeout + + def _close(self, *, abort_ssl: bool = False) -> List[Awaitable[object]]: + """Close all ongoing DNS calls.""" + for fut in chain.from_iterable(self._throttle_dns_futures.values()): + fut.cancel() + + waiters = super()._close(abort_ssl=abort_ssl) + + for t in self._resolve_host_tasks: + t.cancel() + waiters.append(t) + + return waiters + + async def close(self, *, abort_ssl: bool = False) -> None: + """ + Close all opened transports. + + :param abort_ssl: If True, SSL connections will be aborted immediately + without performing the shutdown handshake. If False (default), + the behavior is determined by ssl_shutdown_timeout: + - If ssl_shutdown_timeout=0: connections are aborted + - If ssl_shutdown_timeout>0: graceful shutdown is performed + """ + if self._resolver_owner: + await self._resolver.close() + # Use abort_ssl param if explicitly set, otherwise use ssl_shutdown_timeout default + await super().close(abort_ssl=abort_ssl or self._ssl_shutdown_timeout == 0) + + @property + def family(self) -> int: + """Socket family like AF_INET.""" + return self._family + + @property + def use_dns_cache(self) -> bool: + """True if local DNS caching is enabled.""" + return self._use_dns_cache + + def clear_dns_cache( + self, host: Optional[str] = None, port: Optional[int] = None + ) -> None: + """Remove specified host/port or clear all dns local cache.""" + if host is not None and port is not None: + self._cached_hosts.remove((host, port)) + elif host is not None or port is not None: + raise ValueError("either both host and port or none of them are allowed") + else: + self._cached_hosts.clear() + + async def _resolve_host( + self, host: str, port: int, traces: Optional[Sequence["Trace"]] = None + ) -> List[ResolveResult]: + """Resolve host and return list of addresses.""" + if is_ip_address(host): + return [ + { + "hostname": host, + "host": host, + "port": port, + "family": self._family, + "proto": 0, + "flags": 0, + } + ] + + if not self._use_dns_cache: + + if traces: + for trace in traces: + await trace.send_dns_resolvehost_start(host) + + res = await self._resolver.resolve(host, port, family=self._family) + + if traces: + for trace in traces: + await trace.send_dns_resolvehost_end(host) + + return res + + key = (host, port) + if key in self._cached_hosts and not self._cached_hosts.expired(key): + # get result early, before any await (#4014) + result = self._cached_hosts.next_addrs(key) + + if traces: + for trace in traces: + await trace.send_dns_cache_hit(host) + return result + + futures: Set["asyncio.Future[None]"] + # + # If multiple connectors are resolving the same host, we wait + # for the first one to resolve and then use the result for all of them. + # We use a throttle to ensure that we only resolve the host once + # and then use the result for all the waiters. + # + if key in self._throttle_dns_futures: + # get futures early, before any await (#4014) + futures = self._throttle_dns_futures[key] + future: asyncio.Future[None] = self._loop.create_future() + futures.add(future) + if traces: + for trace in traces: + await trace.send_dns_cache_hit(host) + try: + await future + finally: + futures.discard(future) + return self._cached_hosts.next_addrs(key) + + # update dict early, before any await (#4014) + self._throttle_dns_futures[key] = futures = set() + # In this case we need to create a task to ensure that we can shield + # the task from cancellation as cancelling this lookup should not cancel + # the underlying lookup or else the cancel event will get broadcast to + # all the waiters across all connections. + # + coro = self._resolve_host_with_throttle(key, host, port, futures, traces) + loop = asyncio.get_running_loop() + if sys.version_info >= (3, 12): + # Optimization for Python 3.12, try to send immediately + resolved_host_task = asyncio.Task(coro, loop=loop, eager_start=True) + else: + resolved_host_task = loop.create_task(coro) + + if not resolved_host_task.done(): + self._resolve_host_tasks.add(resolved_host_task) + resolved_host_task.add_done_callback(self._resolve_host_tasks.discard) + + try: + return await asyncio.shield(resolved_host_task) + except asyncio.CancelledError: + + def drop_exception(fut: "asyncio.Future[List[ResolveResult]]") -> None: + with suppress(Exception, asyncio.CancelledError): + fut.result() + + resolved_host_task.add_done_callback(drop_exception) + raise + + async def _resolve_host_with_throttle( + self, + key: Tuple[str, int], + host: str, + port: int, + futures: Set["asyncio.Future[None]"], + traces: Optional[Sequence["Trace"]], + ) -> List[ResolveResult]: + """Resolve host and set result for all waiters. + + This method must be run in a task and shielded from cancellation + to avoid cancelling the underlying lookup. + """ + try: + if traces: + for trace in traces: + await trace.send_dns_cache_miss(host) + + for trace in traces: + await trace.send_dns_resolvehost_start(host) + + addrs = await self._resolver.resolve(host, port, family=self._family) + if traces: + for trace in traces: + await trace.send_dns_resolvehost_end(host) + + self._cached_hosts.add(key, addrs) + for fut in futures: + set_result(fut, None) + except BaseException as e: + # any DNS exception is set for the waiters to raise the same exception. + # This coro is always run in task that is shielded from cancellation so + # we should never be propagating cancellation here. + for fut in futures: + set_exception(fut, e) + raise + finally: + self._throttle_dns_futures.pop(key) + + return self._cached_hosts.next_addrs(key) + + async def _create_connection( + self, req: ClientRequest, traces: List["Trace"], timeout: "ClientTimeout" + ) -> ResponseHandler: + """Create connection. + + Has same keyword arguments as BaseEventLoop.create_connection. + """ + if req.proxy: + _, proto = await self._create_proxy_connection(req, traces, timeout) + else: + _, proto = await self._create_direct_connection(req, traces, timeout) + + return proto + + def _get_ssl_context(self, req: ClientRequest) -> Optional[SSLContext]: + """Logic to get the correct SSL context + + 0. if req.ssl is false, return None + + 1. if ssl_context is specified in req, use it + 2. if _ssl_context is specified in self, use it + 3. otherwise: + 1. if verify_ssl is not specified in req, use self.ssl_context + (will generate a default context according to self.verify_ssl) + 2. if verify_ssl is True in req, generate a default SSL context + 3. if verify_ssl is False in req, generate a SSL context that + won't verify + """ + if not req.is_ssl(): + return None + + if ssl is None: # pragma: no cover + raise RuntimeError("SSL is not supported.") + sslcontext = req.ssl + if isinstance(sslcontext, ssl.SSLContext): + return sslcontext + if sslcontext is not True: + # not verified or fingerprinted + return _SSL_CONTEXT_UNVERIFIED + sslcontext = self._ssl + if isinstance(sslcontext, ssl.SSLContext): + return sslcontext + if sslcontext is not True: + # not verified or fingerprinted + return _SSL_CONTEXT_UNVERIFIED + return _SSL_CONTEXT_VERIFIED + + def _get_fingerprint(self, req: ClientRequest) -> Optional["Fingerprint"]: + ret = req.ssl + if isinstance(ret, Fingerprint): + return ret + ret = self._ssl + if isinstance(ret, Fingerprint): + return ret + return None + + async def _wrap_create_connection( + self, + *args: Any, + addr_infos: List[AddrInfoType], + req: ClientRequest, + timeout: "ClientTimeout", + client_error: Type[Exception] = ClientConnectorError, + **kwargs: Any, + ) -> Tuple[asyncio.Transport, ResponseHandler]: + try: + async with ceil_timeout( + timeout.sock_connect, ceil_threshold=timeout.ceil_threshold + ): + sock = await aiohappyeyeballs.start_connection( + addr_infos=addr_infos, + local_addr_infos=self._local_addr_infos, + happy_eyeballs_delay=self._happy_eyeballs_delay, + interleave=self._interleave, + loop=self._loop, + socket_factory=self._socket_factory, + ) + # Add ssl_shutdown_timeout for Python 3.11+ when SSL is used + if ( + kwargs.get("ssl") + and self._ssl_shutdown_timeout + and sys.version_info >= (3, 11) + ): + kwargs["ssl_shutdown_timeout"] = self._ssl_shutdown_timeout + return await self._loop.create_connection(*args, **kwargs, sock=sock) + except cert_errors as exc: + raise ClientConnectorCertificateError(req.connection_key, exc) from exc + except ssl_errors as exc: + raise ClientConnectorSSLError(req.connection_key, exc) from exc + except OSError as exc: + if exc.errno is None and isinstance(exc, asyncio.TimeoutError): + raise + raise client_error(req.connection_key, exc) from exc + + async def _wrap_existing_connection( + self, + *args: Any, + req: ClientRequest, + timeout: "ClientTimeout", + client_error: Type[Exception] = ClientConnectorError, + **kwargs: Any, + ) -> Tuple[asyncio.Transport, ResponseHandler]: + try: + async with ceil_timeout( + timeout.sock_connect, ceil_threshold=timeout.ceil_threshold + ): + return await self._loop.create_connection(*args, **kwargs) + except cert_errors as exc: + raise ClientConnectorCertificateError(req.connection_key, exc) from exc + except ssl_errors as exc: + raise ClientConnectorSSLError(req.connection_key, exc) from exc + except OSError as exc: + if exc.errno is None and isinstance(exc, asyncio.TimeoutError): + raise + raise client_error(req.connection_key, exc) from exc + + def _fail_on_no_start_tls(self, req: "ClientRequest") -> None: + """Raise a :py:exc:`RuntimeError` on missing ``start_tls()``. + + It is necessary for TLS-in-TLS so that it is possible to + send HTTPS queries through HTTPS proxies. + + This doesn't affect regular HTTP requests, though. + """ + if not req.is_ssl(): + return + + proxy_url = req.proxy + assert proxy_url is not None + if proxy_url.scheme != "https": + return + + self._check_loop_for_start_tls() + + def _check_loop_for_start_tls(self) -> None: + try: + self._loop.start_tls + except AttributeError as attr_exc: + raise RuntimeError( + "An HTTPS request is being sent through an HTTPS proxy. " + "This needs support for TLS in TLS but it is not implemented " + "in your runtime for the stdlib asyncio.\n\n" + "Please upgrade to Python 3.11 or higher. For more details, " + "please see:\n" + "* https://bugs.python.org/issue37179\n" + "* https://github.com/python/cpython/pull/28073\n" + "* https://docs.aiohttp.org/en/stable/" + "client_advanced.html#proxy-support\n" + "* https://github.com/aio-libs/aiohttp/discussions/6044\n", + ) from attr_exc + + def _loop_supports_start_tls(self) -> bool: + try: + self._check_loop_for_start_tls() + except RuntimeError: + return False + else: + return True + + def _warn_about_tls_in_tls( + self, + underlying_transport: asyncio.Transport, + req: ClientRequest, + ) -> None: + """Issue a warning if the requested URL has HTTPS scheme.""" + if req.request_info.url.scheme != "https": + return + + # Check if uvloop is being used, which supports TLS in TLS, + # otherwise assume that asyncio's native transport is being used. + if type(underlying_transport).__module__.startswith("uvloop"): + return + + # Support in asyncio was added in Python 3.11 (bpo-44011) + asyncio_supports_tls_in_tls = sys.version_info >= (3, 11) or getattr( + underlying_transport, + "_start_tls_compatible", + False, + ) + + if asyncio_supports_tls_in_tls: + return + + warnings.warn( + "An HTTPS request is being sent through an HTTPS proxy. " + "This support for TLS in TLS is known to be disabled " + "in the stdlib asyncio (Python <3.11). This is why you'll probably see " + "an error in the log below.\n\n" + "It is possible to enable it via monkeypatching. " + "For more details, see:\n" + "* https://bugs.python.org/issue37179\n" + "* https://github.com/python/cpython/pull/28073\n\n" + "You can temporarily patch this as follows:\n" + "* https://docs.aiohttp.org/en/stable/client_advanced.html#proxy-support\n" + "* https://github.com/aio-libs/aiohttp/discussions/6044\n", + RuntimeWarning, + source=self, + # Why `4`? At least 3 of the calls in the stack originate + # from the methods in this class. + stacklevel=3, + ) + + async def _start_tls_connection( + self, + underlying_transport: asyncio.Transport, + req: ClientRequest, + timeout: "ClientTimeout", + client_error: Type[Exception] = ClientConnectorError, + ) -> Tuple[asyncio.BaseTransport, ResponseHandler]: + """Wrap the raw TCP transport with TLS.""" + tls_proto = self._factory() # Create a brand new proto for TLS + sslcontext = self._get_ssl_context(req) + if TYPE_CHECKING: + # _start_tls_connection is unreachable in the current code path + # if sslcontext is None. + assert sslcontext is not None + + try: + async with ceil_timeout( + timeout.sock_connect, ceil_threshold=timeout.ceil_threshold + ): + try: + # ssl_shutdown_timeout is only available in Python 3.11+ + if sys.version_info >= (3, 11) and self._ssl_shutdown_timeout: + tls_transport = await self._loop.start_tls( + underlying_transport, + tls_proto, + sslcontext, + server_hostname=req.server_hostname or req.host, + ssl_handshake_timeout=timeout.total, + ssl_shutdown_timeout=self._ssl_shutdown_timeout, + ) + else: + tls_transport = await self._loop.start_tls( + underlying_transport, + tls_proto, + sslcontext, + server_hostname=req.server_hostname or req.host, + ssl_handshake_timeout=timeout.total, + ) + except BaseException: + # We need to close the underlying transport since + # `start_tls()` probably failed before it had a + # chance to do this: + if self._ssl_shutdown_timeout == 0: + underlying_transport.abort() + else: + underlying_transport.close() + raise + if isinstance(tls_transport, asyncio.Transport): + fingerprint = self._get_fingerprint(req) + if fingerprint: + try: + fingerprint.check(tls_transport) + except ServerFingerprintMismatch: + tls_transport.close() + if not self._cleanup_closed_disabled: + self._cleanup_closed_transports.append(tls_transport) + raise + except cert_errors as exc: + raise ClientConnectorCertificateError(req.connection_key, exc) from exc + except ssl_errors as exc: + raise ClientConnectorSSLError(req.connection_key, exc) from exc + except OSError as exc: + if exc.errno is None and isinstance(exc, asyncio.TimeoutError): + raise + raise client_error(req.connection_key, exc) from exc + except TypeError as type_err: + # Example cause looks like this: + # TypeError: transport is not supported by start_tls() + + raise ClientConnectionError( + "Cannot initialize a TLS-in-TLS connection to host " + f"{req.host!s}:{req.port:d} through an underlying connection " + f"to an HTTPS proxy {req.proxy!s} ssl:{req.ssl or 'default'} " + f"[{type_err!s}]" + ) from type_err + else: + if tls_transport is None: + msg = "Failed to start TLS (possibly caused by closing transport)" + raise client_error(req.connection_key, OSError(msg)) + tls_proto.connection_made( + tls_transport + ) # Kick the state machine of the new TLS protocol + + return tls_transport, tls_proto + + def _convert_hosts_to_addr_infos( + self, hosts: List[ResolveResult] + ) -> List[AddrInfoType]: + """Converts the list of hosts to a list of addr_infos. + + The list of hosts is the result of a DNS lookup. The list of + addr_infos is the result of a call to `socket.getaddrinfo()`. + """ + addr_infos: List[AddrInfoType] = [] + for hinfo in hosts: + host = hinfo["host"] + is_ipv6 = ":" in host + family = socket.AF_INET6 if is_ipv6 else socket.AF_INET + if self._family and self._family != family: + continue + addr = (host, hinfo["port"], 0, 0) if is_ipv6 else (host, hinfo["port"]) + addr_infos.append( + (family, socket.SOCK_STREAM, socket.IPPROTO_TCP, "", addr) + ) + return addr_infos + + async def _create_direct_connection( + self, + req: ClientRequest, + traces: List["Trace"], + timeout: "ClientTimeout", + *, + client_error: Type[Exception] = ClientConnectorError, + ) -> Tuple[asyncio.Transport, ResponseHandler]: + sslcontext = self._get_ssl_context(req) + fingerprint = self._get_fingerprint(req) + + host = req.url.raw_host + assert host is not None + # Replace multiple trailing dots with a single one. + # A trailing dot is only present for fully-qualified domain names. + # See https://github.com/aio-libs/aiohttp/pull/7364. + if host.endswith(".."): + host = host.rstrip(".") + "." + port = req.port + assert port is not None + try: + # Cancelling this lookup should not cancel the underlying lookup + # or else the cancel event will get broadcast to all the waiters + # across all connections. + hosts = await self._resolve_host(host, port, traces=traces) + except OSError as exc: + if exc.errno is None and isinstance(exc, asyncio.TimeoutError): + raise + # in case of proxy it is not ClientProxyConnectionError + # it is problem of resolving proxy ip itself + raise ClientConnectorDNSError(req.connection_key, exc) from exc + + last_exc: Optional[Exception] = None + addr_infos = self._convert_hosts_to_addr_infos(hosts) + while addr_infos: + # Strip trailing dots, certificates contain FQDN without dots. + # See https://github.com/aio-libs/aiohttp/issues/3636 + server_hostname = ( + (req.server_hostname or host).rstrip(".") if sslcontext else None + ) + + try: + transp, proto = await self._wrap_create_connection( + self._factory, + timeout=timeout, + ssl=sslcontext, + addr_infos=addr_infos, + server_hostname=server_hostname, + req=req, + client_error=client_error, + ) + except (ClientConnectorError, asyncio.TimeoutError) as exc: + last_exc = exc + aiohappyeyeballs.pop_addr_infos_interleave(addr_infos, self._interleave) + continue + + if req.is_ssl() and fingerprint: + try: + fingerprint.check(transp) + except ServerFingerprintMismatch as exc: + transp.close() + if not self._cleanup_closed_disabled: + self._cleanup_closed_transports.append(transp) + last_exc = exc + # Remove the bad peer from the list of addr_infos + sock: socket.socket = transp.get_extra_info("socket") + bad_peer = sock.getpeername() + aiohappyeyeballs.remove_addr_infos(addr_infos, bad_peer) + continue + + return transp, proto + else: + assert last_exc is not None + raise last_exc + + async def _create_proxy_connection( + self, req: ClientRequest, traces: List["Trace"], timeout: "ClientTimeout" + ) -> Tuple[asyncio.BaseTransport, ResponseHandler]: + self._fail_on_no_start_tls(req) + runtime_has_start_tls = self._loop_supports_start_tls() + proxy_req = self._update_proxy_auth_header_and_build_proxy_req(req) + + # create connection to proxy server + transport, proto = await self._create_direct_connection( + proxy_req, [], timeout, client_error=ClientProxyConnectionError + ) + + if req.is_ssl(): + if runtime_has_start_tls: + self._warn_about_tls_in_tls(transport, req) + + # For HTTPS requests over HTTP proxy + # we must notify proxy to tunnel connection + # so we send CONNECT command: + # CONNECT www.python.org:443 HTTP/1.1 + # Host: www.python.org + # + # next we must do TLS handshake and so on + # to do this we must wrap raw socket into secure one + # asyncio handles this perfectly + proxy_req.method = hdrs.METH_CONNECT + proxy_req.url = req.url + key = req.connection_key._replace( + proxy=None, proxy_auth=None, proxy_headers_hash=None + ) + conn = _ConnectTunnelConnection(self, key, proto, self._loop) + proxy_resp = await proxy_req.send(conn) + try: + protocol = conn._protocol + assert protocol is not None + + # read_until_eof=True will ensure the connection isn't closed + # once the response is received and processed allowing + # START_TLS to work on the connection below. + protocol.set_response_params( + read_until_eof=runtime_has_start_tls, + timeout_ceil_threshold=self._timeout_ceil_threshold, + ) + resp = await proxy_resp.start(conn) + except BaseException: + proxy_resp.close() + conn.close() + raise + else: + conn._protocol = None + try: + if resp.status != 200: + message = resp.reason + if message is None: + message = HTTPStatus(resp.status).phrase + raise ClientHttpProxyError( + proxy_resp.request_info, + resp.history, + status=resp.status, + message=message, + headers=resp.headers, + ) + if not runtime_has_start_tls: + rawsock = transport.get_extra_info("socket", default=None) + if rawsock is None: + raise RuntimeError( + "Transport does not expose socket instance" + ) + # Duplicate the socket, so now we can close proxy transport + rawsock = rawsock.dup() + except BaseException: + # It shouldn't be closed in `finally` because it's fed to + # `loop.start_tls()` and the docs say not to touch it after + # passing there. + transport.close() + raise + finally: + if not runtime_has_start_tls: + transport.close() + + if not runtime_has_start_tls: + # HTTP proxy with support for upgrade to HTTPS + sslcontext = self._get_ssl_context(req) + return await self._wrap_existing_connection( + self._factory, + timeout=timeout, + ssl=sslcontext, + sock=rawsock, + server_hostname=req.host, + req=req, + ) + + return await self._start_tls_connection( + # Access the old transport for the last time before it's + # closed and forgotten forever: + transport, + req=req, + timeout=timeout, + ) + finally: + proxy_resp.close() + + return transport, proto + + +class UnixConnector(BaseConnector): + """Unix socket connector. + + path - Unix socket path. + keepalive_timeout - (optional) Keep-alive timeout. + force_close - Set to True to force close and do reconnect + after each request (and between redirects). + limit - The total number of simultaneous connections. + limit_per_host - Number of simultaneous connections to one host. + loop - Optional event loop. + """ + + allowed_protocol_schema_set = HIGH_LEVEL_SCHEMA_SET | frozenset({"unix"}) + + def __init__( + self, + path: str, + force_close: bool = False, + keepalive_timeout: Union[object, float, None] = sentinel, + limit: int = 100, + limit_per_host: int = 0, + loop: Optional[asyncio.AbstractEventLoop] = None, + ) -> None: + super().__init__( + force_close=force_close, + keepalive_timeout=keepalive_timeout, + limit=limit, + limit_per_host=limit_per_host, + loop=loop, + ) + self._path = path + + @property + def path(self) -> str: + """Path to unix socket.""" + return self._path + + async def _create_connection( + self, req: ClientRequest, traces: List["Trace"], timeout: "ClientTimeout" + ) -> ResponseHandler: + try: + async with ceil_timeout( + timeout.sock_connect, ceil_threshold=timeout.ceil_threshold + ): + _, proto = await self._loop.create_unix_connection( + self._factory, self._path + ) + except OSError as exc: + if exc.errno is None and isinstance(exc, asyncio.TimeoutError): + raise + raise UnixClientConnectorError(self.path, req.connection_key, exc) from exc + + return proto + + +class NamedPipeConnector(BaseConnector): + """Named pipe connector. + + Only supported by the proactor event loop. + See also: https://docs.python.org/3/library/asyncio-eventloop.html + + path - Windows named pipe path. + keepalive_timeout - (optional) Keep-alive timeout. + force_close - Set to True to force close and do reconnect + after each request (and between redirects). + limit - The total number of simultaneous connections. + limit_per_host - Number of simultaneous connections to one host. + loop - Optional event loop. + """ + + allowed_protocol_schema_set = HIGH_LEVEL_SCHEMA_SET | frozenset({"npipe"}) + + def __init__( + self, + path: str, + force_close: bool = False, + keepalive_timeout: Union[object, float, None] = sentinel, + limit: int = 100, + limit_per_host: int = 0, + loop: Optional[asyncio.AbstractEventLoop] = None, + ) -> None: + super().__init__( + force_close=force_close, + keepalive_timeout=keepalive_timeout, + limit=limit, + limit_per_host=limit_per_host, + loop=loop, + ) + if not isinstance( + self._loop, + asyncio.ProactorEventLoop, # type: ignore[attr-defined] + ): + raise RuntimeError( + "Named Pipes only available in proactor loop under windows" + ) + self._path = path + + @property + def path(self) -> str: + """Path to the named pipe.""" + return self._path + + async def _create_connection( + self, req: ClientRequest, traces: List["Trace"], timeout: "ClientTimeout" + ) -> ResponseHandler: + try: + async with ceil_timeout( + timeout.sock_connect, ceil_threshold=timeout.ceil_threshold + ): + _, proto = await self._loop.create_pipe_connection( # type: ignore[attr-defined] + self._factory, self._path + ) + # the drain is required so that the connection_made is called + # and transport is set otherwise it is not set before the + # `assert conn.transport is not None` + # in client.py's _request method + await asyncio.sleep(0) + # other option is to manually set transport like + # `proto.transport = trans` + except OSError as exc: + if exc.errno is None and isinstance(exc, asyncio.TimeoutError): + raise + raise ClientConnectorError(req.connection_key, exc) from exc + + return cast(ResponseHandler, proto) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/cookiejar.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/cookiejar.py new file mode 100644 index 0000000..193648d --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/cookiejar.py @@ -0,0 +1,522 @@ +import asyncio +import calendar +import contextlib +import datetime +import heapq +import itertools +import os # noqa +import pathlib +import pickle +import re +import time +import warnings +from collections import defaultdict +from collections.abc import Mapping +from http.cookies import BaseCookie, Morsel, SimpleCookie +from typing import ( + DefaultDict, + Dict, + Iterable, + Iterator, + List, + Optional, + Set, + Tuple, + Union, +) + +from yarl import URL + +from ._cookie_helpers import preserve_morsel_with_coded_value +from .abc import AbstractCookieJar, ClearCookiePredicate +from .helpers import is_ip_address +from .typedefs import LooseCookies, PathLike, StrOrURL + +__all__ = ("CookieJar", "DummyCookieJar") + + +CookieItem = Union[str, "Morsel[str]"] + +# We cache these string methods here as their use is in performance critical code. +_FORMAT_PATH = "{}/{}".format +_FORMAT_DOMAIN_REVERSED = "{1}.{0}".format + +# The minimum number of scheduled cookie expirations before we start cleaning up +# the expiration heap. This is a performance optimization to avoid cleaning up the +# heap too often when there are only a few scheduled expirations. +_MIN_SCHEDULED_COOKIE_EXPIRATION = 100 +_SIMPLE_COOKIE = SimpleCookie() + + +class CookieJar(AbstractCookieJar): + """Implements cookie storage adhering to RFC 6265.""" + + DATE_TOKENS_RE = re.compile( + r"[\x09\x20-\x2F\x3B-\x40\x5B-\x60\x7B-\x7E]*" + r"(?P[\x00-\x08\x0A-\x1F\d:a-zA-Z\x7F-\xFF]+)" + ) + + DATE_HMS_TIME_RE = re.compile(r"(\d{1,2}):(\d{1,2}):(\d{1,2})") + + DATE_DAY_OF_MONTH_RE = re.compile(r"(\d{1,2})") + + DATE_MONTH_RE = re.compile( + "(jan)|(feb)|(mar)|(apr)|(may)|(jun)|(jul)|(aug)|(sep)|(oct)|(nov)|(dec)", + re.I, + ) + + DATE_YEAR_RE = re.compile(r"(\d{2,4})") + + # calendar.timegm() fails for timestamps after datetime.datetime.max + # Minus one as a loss of precision occurs when timestamp() is called. + MAX_TIME = ( + int(datetime.datetime.max.replace(tzinfo=datetime.timezone.utc).timestamp()) - 1 + ) + try: + calendar.timegm(time.gmtime(MAX_TIME)) + except (OSError, ValueError): + # Hit the maximum representable time on Windows + # https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/localtime-localtime32-localtime64 + # Throws ValueError on PyPy 3.9, OSError elsewhere + MAX_TIME = calendar.timegm((3000, 12, 31, 23, 59, 59, -1, -1, -1)) + except OverflowError: + # #4515: datetime.max may not be representable on 32-bit platforms + MAX_TIME = 2**31 - 1 + # Avoid minuses in the future, 3x faster + SUB_MAX_TIME = MAX_TIME - 1 + + def __init__( + self, + *, + unsafe: bool = False, + quote_cookie: bool = True, + treat_as_secure_origin: Union[StrOrURL, List[StrOrURL], None] = None, + loop: Optional[asyncio.AbstractEventLoop] = None, + ) -> None: + super().__init__(loop=loop) + self._cookies: DefaultDict[Tuple[str, str], SimpleCookie] = defaultdict( + SimpleCookie + ) + self._morsel_cache: DefaultDict[Tuple[str, str], Dict[str, Morsel[str]]] = ( + defaultdict(dict) + ) + self._host_only_cookies: Set[Tuple[str, str]] = set() + self._unsafe = unsafe + self._quote_cookie = quote_cookie + if treat_as_secure_origin is None: + treat_as_secure_origin = [] + elif isinstance(treat_as_secure_origin, URL): + treat_as_secure_origin = [treat_as_secure_origin.origin()] + elif isinstance(treat_as_secure_origin, str): + treat_as_secure_origin = [URL(treat_as_secure_origin).origin()] + else: + treat_as_secure_origin = [ + URL(url).origin() if isinstance(url, str) else url.origin() + for url in treat_as_secure_origin + ] + self._treat_as_secure_origin = treat_as_secure_origin + self._expire_heap: List[Tuple[float, Tuple[str, str, str]]] = [] + self._expirations: Dict[Tuple[str, str, str], float] = {} + + @property + def quote_cookie(self) -> bool: + return self._quote_cookie + + def save(self, file_path: PathLike) -> None: + file_path = pathlib.Path(file_path) + with file_path.open(mode="wb") as f: + pickle.dump(self._cookies, f, pickle.HIGHEST_PROTOCOL) + + def load(self, file_path: PathLike) -> None: + file_path = pathlib.Path(file_path) + with file_path.open(mode="rb") as f: + self._cookies = pickle.load(f) + + def clear(self, predicate: Optional[ClearCookiePredicate] = None) -> None: + if predicate is None: + self._expire_heap.clear() + self._cookies.clear() + self._morsel_cache.clear() + self._host_only_cookies.clear() + self._expirations.clear() + return + + now = time.time() + to_del = [ + key + for (domain, path), cookie in self._cookies.items() + for name, morsel in cookie.items() + if ( + (key := (domain, path, name)) in self._expirations + and self._expirations[key] <= now + ) + or predicate(morsel) + ] + if to_del: + self._delete_cookies(to_del) + + def clear_domain(self, domain: str) -> None: + self.clear(lambda x: self._is_domain_match(domain, x["domain"])) + + def __iter__(self) -> "Iterator[Morsel[str]]": + self._do_expiration() + for val in self._cookies.values(): + yield from val.values() + + def __len__(self) -> int: + """Return number of cookies. + + This function does not iterate self to avoid unnecessary expiration + checks. + """ + return sum(len(cookie.values()) for cookie in self._cookies.values()) + + def _do_expiration(self) -> None: + """Remove expired cookies.""" + if not (expire_heap_len := len(self._expire_heap)): + return + + # If the expiration heap grows larger than the number expirations + # times two, we clean it up to avoid keeping expired entries in + # the heap and consuming memory. We guard this with a minimum + # threshold to avoid cleaning up the heap too often when there are + # only a few scheduled expirations. + if ( + expire_heap_len > _MIN_SCHEDULED_COOKIE_EXPIRATION + and expire_heap_len > len(self._expirations) * 2 + ): + # Remove any expired entries from the expiration heap + # that do not match the expiration time in the expirations + # as it means the cookie has been re-added to the heap + # with a different expiration time. + self._expire_heap = [ + entry + for entry in self._expire_heap + if self._expirations.get(entry[1]) == entry[0] + ] + heapq.heapify(self._expire_heap) + + now = time.time() + to_del: List[Tuple[str, str, str]] = [] + # Find any expired cookies and add them to the to-delete list + while self._expire_heap: + when, cookie_key = self._expire_heap[0] + if when > now: + break + heapq.heappop(self._expire_heap) + # Check if the cookie hasn't been re-added to the heap + # with a different expiration time as it will be removed + # later when it reaches the top of the heap and its + # expiration time is met. + if self._expirations.get(cookie_key) == when: + to_del.append(cookie_key) + + if to_del: + self._delete_cookies(to_del) + + def _delete_cookies(self, to_del: List[Tuple[str, str, str]]) -> None: + for domain, path, name in to_del: + self._host_only_cookies.discard((domain, name)) + self._cookies[(domain, path)].pop(name, None) + self._morsel_cache[(domain, path)].pop(name, None) + self._expirations.pop((domain, path, name), None) + + def _expire_cookie(self, when: float, domain: str, path: str, name: str) -> None: + cookie_key = (domain, path, name) + if self._expirations.get(cookie_key) == when: + # Avoid adding duplicates to the heap + return + heapq.heappush(self._expire_heap, (when, cookie_key)) + self._expirations[cookie_key] = when + + def update_cookies(self, cookies: LooseCookies, response_url: URL = URL()) -> None: + """Update cookies.""" + hostname = response_url.raw_host + + if not self._unsafe and is_ip_address(hostname): + # Don't accept cookies from IPs + return + + if isinstance(cookies, Mapping): + cookies = cookies.items() + + for name, cookie in cookies: + if not isinstance(cookie, Morsel): + tmp = SimpleCookie() + tmp[name] = cookie # type: ignore[assignment] + cookie = tmp[name] + + domain = cookie["domain"] + + # ignore domains with trailing dots + if domain and domain[-1] == ".": + domain = "" + del cookie["domain"] + + if not domain and hostname is not None: + # Set the cookie's domain to the response hostname + # and set its host-only-flag + self._host_only_cookies.add((hostname, name)) + domain = cookie["domain"] = hostname + + if domain and domain[0] == ".": + # Remove leading dot + domain = domain[1:] + cookie["domain"] = domain + + if hostname and not self._is_domain_match(domain, hostname): + # Setting cookies for different domains is not allowed + continue + + path = cookie["path"] + if not path or path[0] != "/": + # Set the cookie's path to the response path + path = response_url.path + if not path.startswith("/"): + path = "/" + else: + # Cut everything from the last slash to the end + path = "/" + path[1 : path.rfind("/")] + cookie["path"] = path + path = path.rstrip("/") + + if max_age := cookie["max-age"]: + try: + delta_seconds = int(max_age) + max_age_expiration = min(time.time() + delta_seconds, self.MAX_TIME) + self._expire_cookie(max_age_expiration, domain, path, name) + except ValueError: + cookie["max-age"] = "" + + elif expires := cookie["expires"]: + if expire_time := self._parse_date(expires): + self._expire_cookie(expire_time, domain, path, name) + else: + cookie["expires"] = "" + + key = (domain, path) + if self._cookies[key].get(name) != cookie: + # Don't blow away the cache if the same + # cookie gets set again + self._cookies[key][name] = cookie + self._morsel_cache[key].pop(name, None) + + self._do_expiration() + + def filter_cookies(self, request_url: URL = URL()) -> "BaseCookie[str]": + """Returns this jar's cookies filtered by their attributes.""" + # We always use BaseCookie now since all + # cookies set on on filtered are fully constructed + # Morsels, not just names and values. + filtered: BaseCookie[str] = BaseCookie() + if not self._cookies: + # Skip do_expiration() if there are no cookies. + return filtered + self._do_expiration() + if not self._cookies: + # Skip rest of function if no non-expired cookies. + return filtered + if type(request_url) is not URL: + warnings.warn( + "filter_cookies expects yarl.URL instances only," + f"and will stop working in 4.x, got {type(request_url)}", + DeprecationWarning, + stacklevel=2, + ) + request_url = URL(request_url) + hostname = request_url.raw_host or "" + + is_not_secure = request_url.scheme not in ("https", "wss") + if is_not_secure and self._treat_as_secure_origin: + request_origin = URL() + with contextlib.suppress(ValueError): + request_origin = request_url.origin() + is_not_secure = request_origin not in self._treat_as_secure_origin + + # Send shared cookie + key = ("", "") + for c in self._cookies[key].values(): + # Check cache first + if c.key in self._morsel_cache[key]: + filtered[c.key] = self._morsel_cache[key][c.key] + continue + + # Build and cache the morsel + mrsl_val = self._build_morsel(c) + self._morsel_cache[key][c.key] = mrsl_val + filtered[c.key] = mrsl_val + + if is_ip_address(hostname): + if not self._unsafe: + return filtered + domains: Iterable[str] = (hostname,) + else: + # Get all the subdomains that might match a cookie (e.g. "foo.bar.com", "bar.com", "com") + domains = itertools.accumulate( + reversed(hostname.split(".")), _FORMAT_DOMAIN_REVERSED + ) + + # Get all the path prefixes that might match a cookie (e.g. "", "/foo", "/foo/bar") + paths = itertools.accumulate(request_url.path.split("/"), _FORMAT_PATH) + # Create every combination of (domain, path) pairs. + pairs = itertools.product(domains, paths) + + path_len = len(request_url.path) + # Point 2: https://www.rfc-editor.org/rfc/rfc6265.html#section-5.4 + for p in pairs: + if p not in self._cookies: + continue + for name, cookie in self._cookies[p].items(): + domain = cookie["domain"] + + if (domain, name) in self._host_only_cookies and domain != hostname: + continue + + # Skip edge case when the cookie has a trailing slash but request doesn't. + if len(cookie["path"]) > path_len: + continue + + if is_not_secure and cookie["secure"]: + continue + + # We already built the Morsel so reuse it here + if name in self._morsel_cache[p]: + filtered[name] = self._morsel_cache[p][name] + continue + + # Build and cache the morsel + mrsl_val = self._build_morsel(cookie) + self._morsel_cache[p][name] = mrsl_val + filtered[name] = mrsl_val + + return filtered + + def _build_morsel(self, cookie: Morsel[str]) -> Morsel[str]: + """Build a morsel for sending, respecting quote_cookie setting.""" + if self._quote_cookie and cookie.coded_value and cookie.coded_value[0] == '"': + return preserve_morsel_with_coded_value(cookie) + morsel: Morsel[str] = Morsel() + if self._quote_cookie: + value, coded_value = _SIMPLE_COOKIE.value_encode(cookie.value) + else: + coded_value = value = cookie.value + # We use __setstate__ instead of the public set() API because it allows us to + # bypass validation and set already validated state. This is more stable than + # setting protected attributes directly and unlikely to change since it would + # break pickling. + morsel.__setstate__({"key": cookie.key, "value": value, "coded_value": coded_value}) # type: ignore[attr-defined] + return morsel + + @staticmethod + def _is_domain_match(domain: str, hostname: str) -> bool: + """Implements domain matching adhering to RFC 6265.""" + if hostname == domain: + return True + + if not hostname.endswith(domain): + return False + + non_matching = hostname[: -len(domain)] + + if not non_matching.endswith("."): + return False + + return not is_ip_address(hostname) + + @classmethod + def _parse_date(cls, date_str: str) -> Optional[int]: + """Implements date string parsing adhering to RFC 6265.""" + if not date_str: + return None + + found_time = False + found_day = False + found_month = False + found_year = False + + hour = minute = second = 0 + day = 0 + month = 0 + year = 0 + + for token_match in cls.DATE_TOKENS_RE.finditer(date_str): + + token = token_match.group("token") + + if not found_time: + time_match = cls.DATE_HMS_TIME_RE.match(token) + if time_match: + found_time = True + hour, minute, second = (int(s) for s in time_match.groups()) + continue + + if not found_day: + day_match = cls.DATE_DAY_OF_MONTH_RE.match(token) + if day_match: + found_day = True + day = int(day_match.group()) + continue + + if not found_month: + month_match = cls.DATE_MONTH_RE.match(token) + if month_match: + found_month = True + assert month_match.lastindex is not None + month = month_match.lastindex + continue + + if not found_year: + year_match = cls.DATE_YEAR_RE.match(token) + if year_match: + found_year = True + year = int(year_match.group()) + + if 70 <= year <= 99: + year += 1900 + elif 0 <= year <= 69: + year += 2000 + + if False in (found_day, found_month, found_year, found_time): + return None + + if not 1 <= day <= 31: + return None + + if year < 1601 or hour > 23 or minute > 59 or second > 59: + return None + + return calendar.timegm((year, month, day, hour, minute, second, -1, -1, -1)) + + +class DummyCookieJar(AbstractCookieJar): + """Implements a dummy cookie storage. + + It can be used with the ClientSession when no cookie processing is needed. + + """ + + def __init__(self, *, loop: Optional[asyncio.AbstractEventLoop] = None) -> None: + super().__init__(loop=loop) + + def __iter__(self) -> "Iterator[Morsel[str]]": + while False: + yield None + + def __len__(self) -> int: + return 0 + + @property + def quote_cookie(self) -> bool: + return True + + def clear(self, predicate: Optional[ClearCookiePredicate] = None) -> None: + pass + + def clear_domain(self, domain: str) -> None: + pass + + def update_cookies(self, cookies: LooseCookies, response_url: URL = URL()) -> None: + pass + + def filter_cookies(self, request_url: URL) -> "BaseCookie[str]": + return SimpleCookie() diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/formdata.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/formdata.py new file mode 100644 index 0000000..a5a4f60 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/formdata.py @@ -0,0 +1,179 @@ +import io +import warnings +from typing import Any, Iterable, List, Optional +from urllib.parse import urlencode + +from multidict import MultiDict, MultiDictProxy + +from . import hdrs, multipart, payload +from .helpers import guess_filename +from .payload import Payload + +__all__ = ("FormData",) + + +class FormData: + """Helper class for form body generation. + + Supports multipart/form-data and application/x-www-form-urlencoded. + """ + + def __init__( + self, + fields: Iterable[Any] = (), + quote_fields: bool = True, + charset: Optional[str] = None, + *, + default_to_multipart: bool = False, + ) -> None: + self._writer = multipart.MultipartWriter("form-data") + self._fields: List[Any] = [] + self._is_multipart = default_to_multipart + self._quote_fields = quote_fields + self._charset = charset + + if isinstance(fields, dict): + fields = list(fields.items()) + elif not isinstance(fields, (list, tuple)): + fields = (fields,) + self.add_fields(*fields) + + @property + def is_multipart(self) -> bool: + return self._is_multipart + + def add_field( + self, + name: str, + value: Any, + *, + content_type: Optional[str] = None, + filename: Optional[str] = None, + content_transfer_encoding: Optional[str] = None, + ) -> None: + + if isinstance(value, io.IOBase): + self._is_multipart = True + elif isinstance(value, (bytes, bytearray, memoryview)): + msg = ( + "In v4, passing bytes will no longer create a file field. " + "Please explicitly use the filename parameter or pass a BytesIO object." + ) + if filename is None and content_transfer_encoding is None: + warnings.warn(msg, DeprecationWarning) + filename = name + + type_options: MultiDict[str] = MultiDict({"name": name}) + if filename is not None and not isinstance(filename, str): + raise TypeError("filename must be an instance of str. Got: %s" % filename) + if filename is None and isinstance(value, io.IOBase): + filename = guess_filename(value, name) + if filename is not None: + type_options["filename"] = filename + self._is_multipart = True + + headers = {} + if content_type is not None: + if not isinstance(content_type, str): + raise TypeError( + "content_type must be an instance of str. Got: %s" % content_type + ) + headers[hdrs.CONTENT_TYPE] = content_type + self._is_multipart = True + if content_transfer_encoding is not None: + if not isinstance(content_transfer_encoding, str): + raise TypeError( + "content_transfer_encoding must be an instance" + " of str. Got: %s" % content_transfer_encoding + ) + msg = ( + "content_transfer_encoding is deprecated. " + "To maintain compatibility with v4 please pass a BytesPayload." + ) + warnings.warn(msg, DeprecationWarning) + self._is_multipart = True + + self._fields.append((type_options, headers, value)) + + def add_fields(self, *fields: Any) -> None: + to_add = list(fields) + + while to_add: + rec = to_add.pop(0) + + if isinstance(rec, io.IOBase): + k = guess_filename(rec, "unknown") + self.add_field(k, rec) # type: ignore[arg-type] + + elif isinstance(rec, (MultiDictProxy, MultiDict)): + to_add.extend(rec.items()) + + elif isinstance(rec, (list, tuple)) and len(rec) == 2: + k, fp = rec + self.add_field(k, fp) + + else: + raise TypeError( + "Only io.IOBase, multidict and (name, file) " + "pairs allowed, use .add_field() for passing " + "more complex parameters, got {!r}".format(rec) + ) + + def _gen_form_urlencoded(self) -> payload.BytesPayload: + # form data (x-www-form-urlencoded) + data = [] + for type_options, _, value in self._fields: + data.append((type_options["name"], value)) + + charset = self._charset if self._charset is not None else "utf-8" + + if charset == "utf-8": + content_type = "application/x-www-form-urlencoded" + else: + content_type = "application/x-www-form-urlencoded; charset=%s" % charset + + return payload.BytesPayload( + urlencode(data, doseq=True, encoding=charset).encode(), + content_type=content_type, + ) + + def _gen_form_data(self) -> multipart.MultipartWriter: + """Encode a list of fields using the multipart/form-data MIME format""" + for dispparams, headers, value in self._fields: + try: + if hdrs.CONTENT_TYPE in headers: + part = payload.get_payload( + value, + content_type=headers[hdrs.CONTENT_TYPE], + headers=headers, + encoding=self._charset, + ) + else: + part = payload.get_payload( + value, headers=headers, encoding=self._charset + ) + except Exception as exc: + raise TypeError( + "Can not serialize value type: %r\n " + "headers: %r\n value: %r" % (type(value), headers, value) + ) from exc + + if dispparams: + part.set_content_disposition( + "form-data", quote_fields=self._quote_fields, **dispparams + ) + # FIXME cgi.FieldStorage doesn't likes body parts with + # Content-Length which were sent via chunked transfer encoding + assert part.headers is not None + part.headers.popall(hdrs.CONTENT_LENGTH, None) + + self._writer.append_payload(part) + + self._fields.clear() + return self._writer + + def __call__(self) -> Payload: + if self._is_multipart: + return self._gen_form_data() + else: + return self._gen_form_urlencoded() diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/hdrs.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/hdrs.py new file mode 100644 index 0000000..c8d6b35 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/hdrs.py @@ -0,0 +1,121 @@ +"""HTTP Headers constants.""" + +# After changing the file content call ./tools/gen.py +# to regenerate the headers parser +import itertools +from typing import Final, Set + +from multidict import istr + +METH_ANY: Final[str] = "*" +METH_CONNECT: Final[str] = "CONNECT" +METH_HEAD: Final[str] = "HEAD" +METH_GET: Final[str] = "GET" +METH_DELETE: Final[str] = "DELETE" +METH_OPTIONS: Final[str] = "OPTIONS" +METH_PATCH: Final[str] = "PATCH" +METH_POST: Final[str] = "POST" +METH_PUT: Final[str] = "PUT" +METH_TRACE: Final[str] = "TRACE" + +METH_ALL: Final[Set[str]] = { + METH_CONNECT, + METH_HEAD, + METH_GET, + METH_DELETE, + METH_OPTIONS, + METH_PATCH, + METH_POST, + METH_PUT, + METH_TRACE, +} + +ACCEPT: Final[istr] = istr("Accept") +ACCEPT_CHARSET: Final[istr] = istr("Accept-Charset") +ACCEPT_ENCODING: Final[istr] = istr("Accept-Encoding") +ACCEPT_LANGUAGE: Final[istr] = istr("Accept-Language") +ACCEPT_RANGES: Final[istr] = istr("Accept-Ranges") +ACCESS_CONTROL_MAX_AGE: Final[istr] = istr("Access-Control-Max-Age") +ACCESS_CONTROL_ALLOW_CREDENTIALS: Final[istr] = istr("Access-Control-Allow-Credentials") +ACCESS_CONTROL_ALLOW_HEADERS: Final[istr] = istr("Access-Control-Allow-Headers") +ACCESS_CONTROL_ALLOW_METHODS: Final[istr] = istr("Access-Control-Allow-Methods") +ACCESS_CONTROL_ALLOW_ORIGIN: Final[istr] = istr("Access-Control-Allow-Origin") +ACCESS_CONTROL_EXPOSE_HEADERS: Final[istr] = istr("Access-Control-Expose-Headers") +ACCESS_CONTROL_REQUEST_HEADERS: Final[istr] = istr("Access-Control-Request-Headers") +ACCESS_CONTROL_REQUEST_METHOD: Final[istr] = istr("Access-Control-Request-Method") +AGE: Final[istr] = istr("Age") +ALLOW: Final[istr] = istr("Allow") +AUTHORIZATION: Final[istr] = istr("Authorization") +CACHE_CONTROL: Final[istr] = istr("Cache-Control") +CONNECTION: Final[istr] = istr("Connection") +CONTENT_DISPOSITION: Final[istr] = istr("Content-Disposition") +CONTENT_ENCODING: Final[istr] = istr("Content-Encoding") +CONTENT_LANGUAGE: Final[istr] = istr("Content-Language") +CONTENT_LENGTH: Final[istr] = istr("Content-Length") +CONTENT_LOCATION: Final[istr] = istr("Content-Location") +CONTENT_MD5: Final[istr] = istr("Content-MD5") +CONTENT_RANGE: Final[istr] = istr("Content-Range") +CONTENT_TRANSFER_ENCODING: Final[istr] = istr("Content-Transfer-Encoding") +CONTENT_TYPE: Final[istr] = istr("Content-Type") +COOKIE: Final[istr] = istr("Cookie") +DATE: Final[istr] = istr("Date") +DESTINATION: Final[istr] = istr("Destination") +DIGEST: Final[istr] = istr("Digest") +ETAG: Final[istr] = istr("Etag") +EXPECT: Final[istr] = istr("Expect") +EXPIRES: Final[istr] = istr("Expires") +FORWARDED: Final[istr] = istr("Forwarded") +FROM: Final[istr] = istr("From") +HOST: Final[istr] = istr("Host") +IF_MATCH: Final[istr] = istr("If-Match") +IF_MODIFIED_SINCE: Final[istr] = istr("If-Modified-Since") +IF_NONE_MATCH: Final[istr] = istr("If-None-Match") +IF_RANGE: Final[istr] = istr("If-Range") +IF_UNMODIFIED_SINCE: Final[istr] = istr("If-Unmodified-Since") +KEEP_ALIVE: Final[istr] = istr("Keep-Alive") +LAST_EVENT_ID: Final[istr] = istr("Last-Event-ID") +LAST_MODIFIED: Final[istr] = istr("Last-Modified") +LINK: Final[istr] = istr("Link") +LOCATION: Final[istr] = istr("Location") +MAX_FORWARDS: Final[istr] = istr("Max-Forwards") +ORIGIN: Final[istr] = istr("Origin") +PRAGMA: Final[istr] = istr("Pragma") +PROXY_AUTHENTICATE: Final[istr] = istr("Proxy-Authenticate") +PROXY_AUTHORIZATION: Final[istr] = istr("Proxy-Authorization") +RANGE: Final[istr] = istr("Range") +REFERER: Final[istr] = istr("Referer") +RETRY_AFTER: Final[istr] = istr("Retry-After") +SEC_WEBSOCKET_ACCEPT: Final[istr] = istr("Sec-WebSocket-Accept") +SEC_WEBSOCKET_VERSION: Final[istr] = istr("Sec-WebSocket-Version") +SEC_WEBSOCKET_PROTOCOL: Final[istr] = istr("Sec-WebSocket-Protocol") +SEC_WEBSOCKET_EXTENSIONS: Final[istr] = istr("Sec-WebSocket-Extensions") +SEC_WEBSOCKET_KEY: Final[istr] = istr("Sec-WebSocket-Key") +SEC_WEBSOCKET_KEY1: Final[istr] = istr("Sec-WebSocket-Key1") +SERVER: Final[istr] = istr("Server") +SET_COOKIE: Final[istr] = istr("Set-Cookie") +TE: Final[istr] = istr("TE") +TRAILER: Final[istr] = istr("Trailer") +TRANSFER_ENCODING: Final[istr] = istr("Transfer-Encoding") +UPGRADE: Final[istr] = istr("Upgrade") +URI: Final[istr] = istr("URI") +USER_AGENT: Final[istr] = istr("User-Agent") +VARY: Final[istr] = istr("Vary") +VIA: Final[istr] = istr("Via") +WANT_DIGEST: Final[istr] = istr("Want-Digest") +WARNING: Final[istr] = istr("Warning") +WWW_AUTHENTICATE: Final[istr] = istr("WWW-Authenticate") +X_FORWARDED_FOR: Final[istr] = istr("X-Forwarded-For") +X_FORWARDED_HOST: Final[istr] = istr("X-Forwarded-Host") +X_FORWARDED_PROTO: Final[istr] = istr("X-Forwarded-Proto") + +# These are the upper/lower case variants of the headers/methods +# Example: {'hOst', 'host', 'HoST', 'HOSt', 'hOsT', 'HosT', 'hoSt', ...} +METH_HEAD_ALL: Final = frozenset( + map("".join, itertools.product(*zip(METH_HEAD.upper(), METH_HEAD.lower()))) +) +METH_CONNECT_ALL: Final = frozenset( + map("".join, itertools.product(*zip(METH_CONNECT.upper(), METH_CONNECT.lower()))) +) +HOST_ALL: Final = frozenset( + map("".join, itertools.product(*zip(HOST.upper(), HOST.lower()))) +) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/helpers.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/helpers.py new file mode 100644 index 0000000..dfab987 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/helpers.py @@ -0,0 +1,986 @@ +"""Various helper functions""" + +import asyncio +import base64 +import binascii +import contextlib +import datetime +import enum +import functools +import inspect +import netrc +import os +import platform +import re +import sys +import time +import weakref +from collections import namedtuple +from contextlib import suppress +from email.message import EmailMessage +from email.parser import HeaderParser +from email.policy import HTTP +from email.utils import parsedate +from math import ceil +from pathlib import Path +from types import MappingProxyType, TracebackType +from typing import ( + Any, + Callable, + ContextManager, + Dict, + Generator, + Generic, + Iterable, + Iterator, + List, + Mapping, + Optional, + Protocol, + Tuple, + Type, + TypeVar, + Union, + get_args, + overload, +) +from urllib.parse import quote +from urllib.request import getproxies, proxy_bypass + +import attr +from multidict import MultiDict, MultiDictProxy, MultiMapping +from propcache.api import under_cached_property as reify +from yarl import URL + +from . import hdrs +from .log import client_logger + +if sys.version_info >= (3, 11): + import asyncio as async_timeout +else: + import async_timeout + +__all__ = ("BasicAuth", "ChainMapProxy", "ETag", "reify") + +IS_MACOS = platform.system() == "Darwin" +IS_WINDOWS = platform.system() == "Windows" + +PY_310 = sys.version_info >= (3, 10) +PY_311 = sys.version_info >= (3, 11) + + +_T = TypeVar("_T") +_S = TypeVar("_S") + +_SENTINEL = enum.Enum("_SENTINEL", "sentinel") +sentinel = _SENTINEL.sentinel + +NO_EXTENSIONS = bool(os.environ.get("AIOHTTP_NO_EXTENSIONS")) + +# https://datatracker.ietf.org/doc/html/rfc9112#section-6.3-2.1 +EMPTY_BODY_STATUS_CODES = frozenset((204, 304, *range(100, 200))) +# https://datatracker.ietf.org/doc/html/rfc9112#section-6.3-2.1 +# https://datatracker.ietf.org/doc/html/rfc9112#section-6.3-2.2 +EMPTY_BODY_METHODS = hdrs.METH_HEAD_ALL + +DEBUG = sys.flags.dev_mode or ( + not sys.flags.ignore_environment and bool(os.environ.get("PYTHONASYNCIODEBUG")) +) + + +CHAR = {chr(i) for i in range(0, 128)} +CTL = {chr(i) for i in range(0, 32)} | { + chr(127), +} +SEPARATORS = { + "(", + ")", + "<", + ">", + "@", + ",", + ";", + ":", + "\\", + '"', + "/", + "[", + "]", + "?", + "=", + "{", + "}", + " ", + chr(9), +} +TOKEN = CHAR ^ CTL ^ SEPARATORS + + +class noop: + def __await__(self) -> Generator[None, None, None]: + yield + + +class BasicAuth(namedtuple("BasicAuth", ["login", "password", "encoding"])): + """Http basic authentication helper.""" + + def __new__( + cls, login: str, password: str = "", encoding: str = "latin1" + ) -> "BasicAuth": + if login is None: + raise ValueError("None is not allowed as login value") + + if password is None: + raise ValueError("None is not allowed as password value") + + if ":" in login: + raise ValueError('A ":" is not allowed in login (RFC 1945#section-11.1)') + + return super().__new__(cls, login, password, encoding) + + @classmethod + def decode(cls, auth_header: str, encoding: str = "latin1") -> "BasicAuth": + """Create a BasicAuth object from an Authorization HTTP header.""" + try: + auth_type, encoded_credentials = auth_header.split(" ", 1) + except ValueError: + raise ValueError("Could not parse authorization header.") + + if auth_type.lower() != "basic": + raise ValueError("Unknown authorization method %s" % auth_type) + + try: + decoded = base64.b64decode( + encoded_credentials.encode("ascii"), validate=True + ).decode(encoding) + except binascii.Error: + raise ValueError("Invalid base64 encoding.") + + try: + # RFC 2617 HTTP Authentication + # https://www.ietf.org/rfc/rfc2617.txt + # the colon must be present, but the username and password may be + # otherwise blank. + username, password = decoded.split(":", 1) + except ValueError: + raise ValueError("Invalid credentials.") + + return cls(username, password, encoding=encoding) + + @classmethod + def from_url(cls, url: URL, *, encoding: str = "latin1") -> Optional["BasicAuth"]: + """Create BasicAuth from url.""" + if not isinstance(url, URL): + raise TypeError("url should be yarl.URL instance") + # Check raw_user and raw_password first as yarl is likely + # to already have these values parsed from the netloc in the cache. + if url.raw_user is None and url.raw_password is None: + return None + return cls(url.user or "", url.password or "", encoding=encoding) + + def encode(self) -> str: + """Encode credentials.""" + creds = (f"{self.login}:{self.password}").encode(self.encoding) + return "Basic %s" % base64.b64encode(creds).decode(self.encoding) + + +def strip_auth_from_url(url: URL) -> Tuple[URL, Optional[BasicAuth]]: + """Remove user and password from URL if present and return BasicAuth object.""" + # Check raw_user and raw_password first as yarl is likely + # to already have these values parsed from the netloc in the cache. + if url.raw_user is None and url.raw_password is None: + return url, None + return url.with_user(None), BasicAuth(url.user or "", url.password or "") + + +def netrc_from_env() -> Optional[netrc.netrc]: + """Load netrc from file. + + Attempt to load it from the path specified by the env-var + NETRC or in the default location in the user's home directory. + + Returns None if it couldn't be found or fails to parse. + """ + netrc_env = os.environ.get("NETRC") + + if netrc_env is not None: + netrc_path = Path(netrc_env) + else: + try: + home_dir = Path.home() + except RuntimeError as e: # pragma: no cover + # if pathlib can't resolve home, it may raise a RuntimeError + client_logger.debug( + "Could not resolve home directory when " + "trying to look for .netrc file: %s", + e, + ) + return None + + netrc_path = home_dir / ("_netrc" if IS_WINDOWS else ".netrc") + + try: + return netrc.netrc(str(netrc_path)) + except netrc.NetrcParseError as e: + client_logger.warning("Could not parse .netrc file: %s", e) + except OSError as e: + netrc_exists = False + with contextlib.suppress(OSError): + netrc_exists = netrc_path.is_file() + # we couldn't read the file (doesn't exist, permissions, etc.) + if netrc_env or netrc_exists: + # only warn if the environment wanted us to load it, + # or it appears like the default file does actually exist + client_logger.warning("Could not read .netrc file: %s", e) + + return None + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class ProxyInfo: + proxy: URL + proxy_auth: Optional[BasicAuth] + + +def basicauth_from_netrc(netrc_obj: Optional[netrc.netrc], host: str) -> BasicAuth: + """ + Return :py:class:`~aiohttp.BasicAuth` credentials for ``host`` from ``netrc_obj``. + + :raises LookupError: if ``netrc_obj`` is :py:data:`None` or if no + entry is found for the ``host``. + """ + if netrc_obj is None: + raise LookupError("No .netrc file found") + auth_from_netrc = netrc_obj.authenticators(host) + + if auth_from_netrc is None: + raise LookupError(f"No entry for {host!s} found in the `.netrc` file.") + login, account, password = auth_from_netrc + + # TODO(PY311): username = login or account + # Up to python 3.10, account could be None if not specified, + # and login will be empty string if not specified. From 3.11, + # login and account will be empty string if not specified. + username = login if (login or account is None) else account + + # TODO(PY311): Remove this, as password will be empty string + # if not specified + if password is None: + password = "" + + return BasicAuth(username, password) + + +def proxies_from_env() -> Dict[str, ProxyInfo]: + proxy_urls = { + k: URL(v) + for k, v in getproxies().items() + if k in ("http", "https", "ws", "wss") + } + netrc_obj = netrc_from_env() + stripped = {k: strip_auth_from_url(v) for k, v in proxy_urls.items()} + ret = {} + for proto, val in stripped.items(): + proxy, auth = val + if proxy.scheme in ("https", "wss"): + client_logger.warning( + "%s proxies %s are not supported, ignoring", proxy.scheme.upper(), proxy + ) + continue + if netrc_obj and auth is None: + if proxy.host is not None: + try: + auth = basicauth_from_netrc(netrc_obj, proxy.host) + except LookupError: + auth = None + ret[proto] = ProxyInfo(proxy, auth) + return ret + + +def get_env_proxy_for_url(url: URL) -> Tuple[URL, Optional[BasicAuth]]: + """Get a permitted proxy for the given URL from the env.""" + if url.host is not None and proxy_bypass(url.host): + raise LookupError(f"Proxying is disallowed for `{url.host!r}`") + + proxies_in_env = proxies_from_env() + try: + proxy_info = proxies_in_env[url.scheme] + except KeyError: + raise LookupError(f"No proxies found for `{url!s}` in the env") + else: + return proxy_info.proxy, proxy_info.proxy_auth + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class MimeType: + type: str + subtype: str + suffix: str + parameters: "MultiDictProxy[str]" + + +@functools.lru_cache(maxsize=56) +def parse_mimetype(mimetype: str) -> MimeType: + """Parses a MIME type into its components. + + mimetype is a MIME type string. + + Returns a MimeType object. + + Example: + + >>> parse_mimetype('text/html; charset=utf-8') + MimeType(type='text', subtype='html', suffix='', + parameters={'charset': 'utf-8'}) + + """ + if not mimetype: + return MimeType( + type="", subtype="", suffix="", parameters=MultiDictProxy(MultiDict()) + ) + + parts = mimetype.split(";") + params: MultiDict[str] = MultiDict() + for item in parts[1:]: + if not item: + continue + key, _, value = item.partition("=") + params.add(key.lower().strip(), value.strip(' "')) + + fulltype = parts[0].strip().lower() + if fulltype == "*": + fulltype = "*/*" + + mtype, _, stype = fulltype.partition("/") + stype, _, suffix = stype.partition("+") + + return MimeType( + type=mtype, subtype=stype, suffix=suffix, parameters=MultiDictProxy(params) + ) + + +class EnsureOctetStream(EmailMessage): + def __init__(self) -> None: + super().__init__() + # https://www.rfc-editor.org/rfc/rfc9110#section-8.3-5 + self.set_default_type("application/octet-stream") + + def get_content_type(self) -> str: + """Re-implementation from Message + + Returns application/octet-stream in place of plain/text when + value is wrong. + + The way this class is used guarantees that content-type will + be present so simplify the checks wrt to the base implementation. + """ + value = self.get("content-type", "").lower() + + # Based on the implementation of _splitparam in the standard library + ctype, _, _ = value.partition(";") + ctype = ctype.strip() + if ctype.count("/") != 1: + return self.get_default_type() + return ctype + + +@functools.lru_cache(maxsize=56) +def parse_content_type(raw: str) -> Tuple[str, MappingProxyType[str, str]]: + """Parse Content-Type header. + + Returns a tuple of the parsed content type and a + MappingProxyType of parameters. The default returned value + is `application/octet-stream` + """ + msg = HeaderParser(EnsureOctetStream, policy=HTTP).parsestr(f"Content-Type: {raw}") + content_type = msg.get_content_type() + params = msg.get_params(()) + content_dict = dict(params[1:]) # First element is content type again + return content_type, MappingProxyType(content_dict) + + +def guess_filename(obj: Any, default: Optional[str] = None) -> Optional[str]: + name = getattr(obj, "name", None) + if name and isinstance(name, str) and name[0] != "<" and name[-1] != ">": + return Path(name).name + return default + + +not_qtext_re = re.compile(r"[^\041\043-\133\135-\176]") +QCONTENT = {chr(i) for i in range(0x20, 0x7F)} | {"\t"} + + +def quoted_string(content: str) -> str: + """Return 7-bit content as quoted-string. + + Format content into a quoted-string as defined in RFC5322 for + Internet Message Format. Notice that this is not the 8-bit HTTP + format, but the 7-bit email format. Content must be in usascii or + a ValueError is raised. + """ + if not (QCONTENT > set(content)): + raise ValueError(f"bad content for quoted-string {content!r}") + return not_qtext_re.sub(lambda x: "\\" + x.group(0), content) + + +def content_disposition_header( + disptype: str, quote_fields: bool = True, _charset: str = "utf-8", **params: str +) -> str: + """Sets ``Content-Disposition`` header for MIME. + + This is the MIME payload Content-Disposition header from RFC 2183 + and RFC 7579 section 4.2, not the HTTP Content-Disposition from + RFC 6266. + + disptype is a disposition type: inline, attachment, form-data. + Should be valid extension token (see RFC 2183) + + quote_fields performs value quoting to 7-bit MIME headers + according to RFC 7578. Set to quote_fields to False if recipient + can take 8-bit file names and field values. + + _charset specifies the charset to use when quote_fields is True. + + params is a dict with disposition params. + """ + if not disptype or not (TOKEN > set(disptype)): + raise ValueError(f"bad content disposition type {disptype!r}") + + value = disptype + if params: + lparams = [] + for key, val in params.items(): + if not key or not (TOKEN > set(key)): + raise ValueError(f"bad content disposition parameter {key!r}={val!r}") + if quote_fields: + if key.lower() == "filename": + qval = quote(val, "", encoding=_charset) + lparams.append((key, '"%s"' % qval)) + else: + try: + qval = quoted_string(val) + except ValueError: + qval = "".join( + (_charset, "''", quote(val, "", encoding=_charset)) + ) + lparams.append((key + "*", qval)) + else: + lparams.append((key, '"%s"' % qval)) + else: + qval = val.replace("\\", "\\\\").replace('"', '\\"') + lparams.append((key, '"%s"' % qval)) + sparams = "; ".join("=".join(pair) for pair in lparams) + value = "; ".join((value, sparams)) + return value + + +def is_ip_address(host: Optional[str]) -> bool: + """Check if host looks like an IP Address. + + This check is only meant as a heuristic to ensure that + a host is not a domain name. + """ + if not host: + return False + # For a host to be an ipv4 address, it must be all numeric. + # The host must contain a colon to be an IPv6 address. + return ":" in host or host.replace(".", "").isdigit() + + +_cached_current_datetime: Optional[int] = None +_cached_formatted_datetime = "" + + +def rfc822_formatted_time() -> str: + global _cached_current_datetime + global _cached_formatted_datetime + + now = int(time.time()) + if now != _cached_current_datetime: + # Weekday and month names for HTTP date/time formatting; + # always English! + # Tuples are constants stored in codeobject! + _weekdayname = ("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun") + _monthname = ( + "", # Dummy so we can use 1-based month numbers + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + ) + + year, month, day, hh, mm, ss, wd, *tail = time.gmtime(now) + _cached_formatted_datetime = "%s, %02d %3s %4d %02d:%02d:%02d GMT" % ( + _weekdayname[wd], + day, + _monthname[month], + year, + hh, + mm, + ss, + ) + _cached_current_datetime = now + return _cached_formatted_datetime + + +def _weakref_handle(info: "Tuple[weakref.ref[object], str]") -> None: + ref, name = info + ob = ref() + if ob is not None: + with suppress(Exception): + getattr(ob, name)() + + +def weakref_handle( + ob: object, + name: str, + timeout: float, + loop: asyncio.AbstractEventLoop, + timeout_ceil_threshold: float = 5, +) -> Optional[asyncio.TimerHandle]: + if timeout is not None and timeout > 0: + when = loop.time() + timeout + if timeout >= timeout_ceil_threshold: + when = ceil(when) + + return loop.call_at(when, _weakref_handle, (weakref.ref(ob), name)) + return None + + +def call_later( + cb: Callable[[], Any], + timeout: float, + loop: asyncio.AbstractEventLoop, + timeout_ceil_threshold: float = 5, +) -> Optional[asyncio.TimerHandle]: + if timeout is None or timeout <= 0: + return None + now = loop.time() + when = calculate_timeout_when(now, timeout, timeout_ceil_threshold) + return loop.call_at(when, cb) + + +def calculate_timeout_when( + loop_time: float, + timeout: float, + timeout_ceiling_threshold: float, +) -> float: + """Calculate when to execute a timeout.""" + when = loop_time + timeout + if timeout > timeout_ceiling_threshold: + return ceil(when) + return when + + +class TimeoutHandle: + """Timeout handle""" + + __slots__ = ("_timeout", "_loop", "_ceil_threshold", "_callbacks") + + def __init__( + self, + loop: asyncio.AbstractEventLoop, + timeout: Optional[float], + ceil_threshold: float = 5, + ) -> None: + self._timeout = timeout + self._loop = loop + self._ceil_threshold = ceil_threshold + self._callbacks: List[ + Tuple[Callable[..., None], Tuple[Any, ...], Dict[str, Any]] + ] = [] + + def register( + self, callback: Callable[..., None], *args: Any, **kwargs: Any + ) -> None: + self._callbacks.append((callback, args, kwargs)) + + def close(self) -> None: + self._callbacks.clear() + + def start(self) -> Optional[asyncio.TimerHandle]: + timeout = self._timeout + if timeout is not None and timeout > 0: + when = self._loop.time() + timeout + if timeout >= self._ceil_threshold: + when = ceil(when) + return self._loop.call_at(when, self.__call__) + else: + return None + + def timer(self) -> "BaseTimerContext": + if self._timeout is not None and self._timeout > 0: + timer = TimerContext(self._loop) + self.register(timer.timeout) + return timer + else: + return TimerNoop() + + def __call__(self) -> None: + for cb, args, kwargs in self._callbacks: + with suppress(Exception): + cb(*args, **kwargs) + + self._callbacks.clear() + + +class BaseTimerContext(ContextManager["BaseTimerContext"]): + + __slots__ = () + + def assert_timeout(self) -> None: + """Raise TimeoutError if timeout has been exceeded.""" + + +class TimerNoop(BaseTimerContext): + + __slots__ = () + + def __enter__(self) -> BaseTimerContext: + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + return + + +class TimerContext(BaseTimerContext): + """Low resolution timeout context manager""" + + __slots__ = ("_loop", "_tasks", "_cancelled", "_cancelling") + + def __init__(self, loop: asyncio.AbstractEventLoop) -> None: + self._loop = loop + self._tasks: List[asyncio.Task[Any]] = [] + self._cancelled = False + self._cancelling = 0 + + def assert_timeout(self) -> None: + """Raise TimeoutError if timer has already been cancelled.""" + if self._cancelled: + raise asyncio.TimeoutError from None + + def __enter__(self) -> BaseTimerContext: + task = asyncio.current_task(loop=self._loop) + if task is None: + raise RuntimeError("Timeout context manager should be used inside a task") + + if sys.version_info >= (3, 11): + # Remember if the task was already cancelling + # so when we __exit__ we can decide if we should + # raise asyncio.TimeoutError or let the cancellation propagate + self._cancelling = task.cancelling() + + if self._cancelled: + raise asyncio.TimeoutError from None + + self._tasks.append(task) + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> Optional[bool]: + enter_task: Optional[asyncio.Task[Any]] = None + if self._tasks: + enter_task = self._tasks.pop() + + if exc_type is asyncio.CancelledError and self._cancelled: + assert enter_task is not None + # The timeout was hit, and the task was cancelled + # so we need to uncancel the last task that entered the context manager + # since the cancellation should not leak out of the context manager + if sys.version_info >= (3, 11): + # If the task was already cancelling don't raise + # asyncio.TimeoutError and instead return None + # to allow the cancellation to propagate + if enter_task.uncancel() > self._cancelling: + return None + raise asyncio.TimeoutError from exc_val + return None + + def timeout(self) -> None: + if not self._cancelled: + for task in set(self._tasks): + task.cancel() + + self._cancelled = True + + +def ceil_timeout( + delay: Optional[float], ceil_threshold: float = 5 +) -> async_timeout.Timeout: + if delay is None or delay <= 0: + return async_timeout.timeout(None) + + loop = asyncio.get_running_loop() + now = loop.time() + when = now + delay + if delay > ceil_threshold: + when = ceil(when) + return async_timeout.timeout_at(when) + + +class HeadersMixin: + """Mixin for handling headers.""" + + ATTRS = frozenset(["_content_type", "_content_dict", "_stored_content_type"]) + + _headers: MultiMapping[str] + _content_type: Optional[str] = None + _content_dict: Optional[Dict[str, str]] = None + _stored_content_type: Union[str, None, _SENTINEL] = sentinel + + def _parse_content_type(self, raw: Optional[str]) -> None: + self._stored_content_type = raw + if raw is None: + # default value according to RFC 2616 + self._content_type = "application/octet-stream" + self._content_dict = {} + else: + content_type, content_mapping_proxy = parse_content_type(raw) + self._content_type = content_type + # _content_dict needs to be mutable so we can update it + self._content_dict = content_mapping_proxy.copy() + + @property + def content_type(self) -> str: + """The value of content part for Content-Type HTTP header.""" + raw = self._headers.get(hdrs.CONTENT_TYPE) + if self._stored_content_type != raw: + self._parse_content_type(raw) + assert self._content_type is not None + return self._content_type + + @property + def charset(self) -> Optional[str]: + """The value of charset part for Content-Type HTTP header.""" + raw = self._headers.get(hdrs.CONTENT_TYPE) + if self._stored_content_type != raw: + self._parse_content_type(raw) + assert self._content_dict is not None + return self._content_dict.get("charset") + + @property + def content_length(self) -> Optional[int]: + """The value of Content-Length HTTP header.""" + content_length = self._headers.get(hdrs.CONTENT_LENGTH) + return None if content_length is None else int(content_length) + + +def set_result(fut: "asyncio.Future[_T]", result: _T) -> None: + if not fut.done(): + fut.set_result(result) + + +_EXC_SENTINEL = BaseException() + + +class ErrorableProtocol(Protocol): + def set_exception( + self, + exc: BaseException, + exc_cause: BaseException = ..., + ) -> None: ... # pragma: no cover + + +def set_exception( + fut: "asyncio.Future[_T] | ErrorableProtocol", + exc: BaseException, + exc_cause: BaseException = _EXC_SENTINEL, +) -> None: + """Set future exception. + + If the future is marked as complete, this function is a no-op. + + :param exc_cause: An exception that is a direct cause of ``exc``. + Only set if provided. + """ + if asyncio.isfuture(fut) and fut.done(): + return + + exc_is_sentinel = exc_cause is _EXC_SENTINEL + exc_causes_itself = exc is exc_cause + if not exc_is_sentinel and not exc_causes_itself: + exc.__cause__ = exc_cause + + fut.set_exception(exc) + + +@functools.total_ordering +class AppKey(Generic[_T]): + """Keys for static typing support in Application.""" + + __slots__ = ("_name", "_t", "__orig_class__") + + # This may be set by Python when instantiating with a generic type. We need to + # support this, in order to support types that are not concrete classes, + # like Iterable, which can't be passed as the second parameter to __init__. + __orig_class__: Type[object] + + def __init__(self, name: str, t: Optional[Type[_T]] = None): + # Prefix with module name to help deduplicate key names. + frame = inspect.currentframe() + while frame: + if frame.f_code.co_name == "": + module: str = frame.f_globals["__name__"] + break + frame = frame.f_back + + self._name = module + "." + name + self._t = t + + def __lt__(self, other: object) -> bool: + if isinstance(other, AppKey): + return self._name < other._name + return True # Order AppKey above other types. + + def __repr__(self) -> str: + t = self._t + if t is None: + with suppress(AttributeError): + # Set to type arg. + t = get_args(self.__orig_class__)[0] + + if t is None: + t_repr = "<>" + elif isinstance(t, type): + if t.__module__ == "builtins": + t_repr = t.__qualname__ + else: + t_repr = f"{t.__module__}.{t.__qualname__}" + else: + t_repr = repr(t) + return f"" + + +class ChainMapProxy(Mapping[Union[str, AppKey[Any]], Any]): + __slots__ = ("_maps",) + + def __init__(self, maps: Iterable[Mapping[Union[str, AppKey[Any]], Any]]) -> None: + self._maps = tuple(maps) + + def __init_subclass__(cls) -> None: + raise TypeError( + "Inheritance class {} from ChainMapProxy " + "is forbidden".format(cls.__name__) + ) + + @overload # type: ignore[override] + def __getitem__(self, key: AppKey[_T]) -> _T: ... + + @overload + def __getitem__(self, key: str) -> Any: ... + + def __getitem__(self, key: Union[str, AppKey[_T]]) -> Any: + for mapping in self._maps: + try: + return mapping[key] + except KeyError: + pass + raise KeyError(key) + + @overload # type: ignore[override] + def get(self, key: AppKey[_T], default: _S) -> Union[_T, _S]: ... + + @overload + def get(self, key: AppKey[_T], default: None = ...) -> Optional[_T]: ... + + @overload + def get(self, key: str, default: Any = ...) -> Any: ... + + def get(self, key: Union[str, AppKey[_T]], default: Any = None) -> Any: + try: + return self[key] + except KeyError: + return default + + def __len__(self) -> int: + # reuses stored hash values if possible + return len(set().union(*self._maps)) + + def __iter__(self) -> Iterator[Union[str, AppKey[Any]]]: + d: Dict[Union[str, AppKey[Any]], Any] = {} + for mapping in reversed(self._maps): + # reuses stored hash values if possible + d.update(mapping) + return iter(d) + + def __contains__(self, key: object) -> bool: + return any(key in m for m in self._maps) + + def __bool__(self) -> bool: + return any(self._maps) + + def __repr__(self) -> str: + content = ", ".join(map(repr, self._maps)) + return f"ChainMapProxy({content})" + + +# https://tools.ietf.org/html/rfc7232#section-2.3 +_ETAGC = r"[!\x23-\x7E\x80-\xff]+" +_ETAGC_RE = re.compile(_ETAGC) +_QUOTED_ETAG = rf'(W/)?"({_ETAGC})"' +QUOTED_ETAG_RE = re.compile(_QUOTED_ETAG) +LIST_QUOTED_ETAG_RE = re.compile(rf"({_QUOTED_ETAG})(?:\s*,\s*|$)|(.)") + +ETAG_ANY = "*" + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class ETag: + value: str + is_weak: bool = False + + +def validate_etag_value(value: str) -> None: + if value != ETAG_ANY and not _ETAGC_RE.fullmatch(value): + raise ValueError( + f"Value {value!r} is not a valid etag. Maybe it contains '\"'?" + ) + + +def parse_http_date(date_str: Optional[str]) -> Optional[datetime.datetime]: + """Process a date string, return a datetime object""" + if date_str is not None: + timetuple = parsedate(date_str) + if timetuple is not None: + with suppress(ValueError): + return datetime.datetime(*timetuple[:6], tzinfo=datetime.timezone.utc) + return None + + +@functools.lru_cache +def must_be_empty_body(method: str, code: int) -> bool: + """Check if a request must return an empty body.""" + return ( + code in EMPTY_BODY_STATUS_CODES + or method in EMPTY_BODY_METHODS + or (200 <= code < 300 and method in hdrs.METH_CONNECT_ALL) + ) + + +def should_remove_content_length(method: str, code: int) -> bool: + """Check if a Content-Length header should be removed. + + This should always be a subset of must_be_empty_body + """ + # https://www.rfc-editor.org/rfc/rfc9110.html#section-8.6-8 + # https://www.rfc-editor.org/rfc/rfc9110.html#section-15.4.5-4 + return code in EMPTY_BODY_STATUS_CODES or ( + 200 <= code < 300 and method in hdrs.METH_CONNECT_ALL + ) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/http.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/http.py new file mode 100644 index 0000000..a1feae2 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/http.py @@ -0,0 +1,72 @@ +import sys +from http import HTTPStatus +from typing import Mapping, Tuple + +from . import __version__ +from .http_exceptions import HttpProcessingError as HttpProcessingError +from .http_parser import ( + HeadersParser as HeadersParser, + HttpParser as HttpParser, + HttpRequestParser as HttpRequestParser, + HttpResponseParser as HttpResponseParser, + RawRequestMessage as RawRequestMessage, + RawResponseMessage as RawResponseMessage, +) +from .http_websocket import ( + WS_CLOSED_MESSAGE as WS_CLOSED_MESSAGE, + WS_CLOSING_MESSAGE as WS_CLOSING_MESSAGE, + WS_KEY as WS_KEY, + WebSocketError as WebSocketError, + WebSocketReader as WebSocketReader, + WebSocketWriter as WebSocketWriter, + WSCloseCode as WSCloseCode, + WSMessage as WSMessage, + WSMsgType as WSMsgType, + ws_ext_gen as ws_ext_gen, + ws_ext_parse as ws_ext_parse, +) +from .http_writer import ( + HttpVersion as HttpVersion, + HttpVersion10 as HttpVersion10, + HttpVersion11 as HttpVersion11, + StreamWriter as StreamWriter, +) + +__all__ = ( + "HttpProcessingError", + "RESPONSES", + "SERVER_SOFTWARE", + # .http_writer + "StreamWriter", + "HttpVersion", + "HttpVersion10", + "HttpVersion11", + # .http_parser + "HeadersParser", + "HttpParser", + "HttpRequestParser", + "HttpResponseParser", + "RawRequestMessage", + "RawResponseMessage", + # .http_websocket + "WS_CLOSED_MESSAGE", + "WS_CLOSING_MESSAGE", + "WS_KEY", + "WebSocketReader", + "WebSocketWriter", + "ws_ext_gen", + "ws_ext_parse", + "WSMessage", + "WebSocketError", + "WSMsgType", + "WSCloseCode", +) + + +SERVER_SOFTWARE: str = "Python/{0[0]}.{0[1]} aiohttp/{1}".format( + sys.version_info, __version__ +) + +RESPONSES: Mapping[int, Tuple[str, str]] = { + v: (v.phrase, v.description) for v in HTTPStatus.__members__.values() +} diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/http_exceptions.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/http_exceptions.py new file mode 100644 index 0000000..0b5867c --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/http_exceptions.py @@ -0,0 +1,116 @@ +"""Low-level http related exceptions.""" + +from textwrap import indent +from typing import Optional, Union + +from .typedefs import _CIMultiDict + +__all__ = ("HttpProcessingError",) + + +class HttpProcessingError(Exception): + """HTTP error. + + Shortcut for raising HTTP errors with custom code, message and headers. + + code: HTTP Error code. + message: (optional) Error message. + headers: (optional) Headers to be sent in response, a list of pairs + """ + + code = 0 + message = "" + headers = None + + def __init__( + self, + *, + code: Optional[int] = None, + message: str = "", + headers: Optional[_CIMultiDict] = None, + ) -> None: + if code is not None: + self.code = code + self.headers = headers + self.message = message + + def __str__(self) -> str: + msg = indent(self.message, " ") + return f"{self.code}, message:\n{msg}" + + def __repr__(self) -> str: + return f"<{self.__class__.__name__}: {self.code}, message={self.message!r}>" + + +class BadHttpMessage(HttpProcessingError): + + code = 400 + message = "Bad Request" + + def __init__(self, message: str, *, headers: Optional[_CIMultiDict] = None) -> None: + super().__init__(message=message, headers=headers) + self.args = (message,) + + +class HttpBadRequest(BadHttpMessage): + + code = 400 + message = "Bad Request" + + +class PayloadEncodingError(BadHttpMessage): + """Base class for payload errors""" + + +class ContentEncodingError(PayloadEncodingError): + """Content encoding error.""" + + +class TransferEncodingError(PayloadEncodingError): + """transfer encoding error.""" + + +class ContentLengthError(PayloadEncodingError): + """Not enough data to satisfy content length header.""" + + +class DecompressSizeError(PayloadEncodingError): + """Decompressed size exceeds the configured limit.""" + + +class LineTooLong(BadHttpMessage): + def __init__( + self, line: str, limit: str = "Unknown", actual_size: str = "Unknown" + ) -> None: + super().__init__( + f"Got more than {limit} bytes ({actual_size}) when reading {line}." + ) + self.args = (line, limit, actual_size) + + +class InvalidHeader(BadHttpMessage): + def __init__(self, hdr: Union[bytes, str]) -> None: + hdr_s = hdr.decode(errors="backslashreplace") if isinstance(hdr, bytes) else hdr + super().__init__(f"Invalid HTTP header: {hdr!r}") + self.hdr = hdr_s + self.args = (hdr,) + + +class BadStatusLine(BadHttpMessage): + def __init__(self, line: str = "", error: Optional[str] = None) -> None: + if not isinstance(line, str): + line = repr(line) + super().__init__(error or f"Bad status line {line!r}") + self.args = (line,) + self.line = line + + +class BadHttpMethod(BadStatusLine): + """Invalid HTTP method in status line.""" + + def __init__(self, line: str = "", error: Optional[str] = None) -> None: + super().__init__(line, error or f"Bad HTTP method in status line {line!r}") + + +class InvalidURLError(BadHttpMessage): + pass diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/http_parser.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/http_parser.py new file mode 100644 index 0000000..393e76a --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/http_parser.py @@ -0,0 +1,1086 @@ +import abc +import asyncio +import re +import string +from contextlib import suppress +from enum import IntEnum +from typing import ( + Any, + ClassVar, + Final, + Generic, + List, + Literal, + NamedTuple, + Optional, + Pattern, + Set, + Tuple, + Type, + TypeVar, + Union, +) + +from multidict import CIMultiDict, CIMultiDictProxy, istr +from yarl import URL + +from . import hdrs +from .base_protocol import BaseProtocol +from .compression_utils import ( + DEFAULT_MAX_DECOMPRESS_SIZE, + HAS_BROTLI, + HAS_ZSTD, + BrotliDecompressor, + ZLibDecompressor, + ZSTDDecompressor, +) +from .helpers import ( + _EXC_SENTINEL, + DEBUG, + EMPTY_BODY_METHODS, + EMPTY_BODY_STATUS_CODES, + NO_EXTENSIONS, + BaseTimerContext, + set_exception, +) +from .http_exceptions import ( + BadHttpMessage, + BadHttpMethod, + BadStatusLine, + ContentEncodingError, + ContentLengthError, + DecompressSizeError, + InvalidHeader, + InvalidURLError, + LineTooLong, + TransferEncodingError, +) +from .http_writer import HttpVersion, HttpVersion10 +from .streams import EMPTY_PAYLOAD, StreamReader +from .typedefs import RawHeaders + +__all__ = ( + "HeadersParser", + "HttpParser", + "HttpRequestParser", + "HttpResponseParser", + "RawRequestMessage", + "RawResponseMessage", +) + +_SEP = Literal[b"\r\n", b"\n"] + +ASCIISET: Final[Set[str]] = set(string.printable) + +# See https://www.rfc-editor.org/rfc/rfc9110.html#name-overview +# and https://www.rfc-editor.org/rfc/rfc9110.html#name-tokens +# +# method = token +# tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." / +# "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA +# token = 1*tchar +_TCHAR_SPECIALS: Final[str] = re.escape("!#$%&'*+-.^_`|~") +TOKENRE: Final[Pattern[str]] = re.compile(f"[0-9A-Za-z{_TCHAR_SPECIALS}]+") +VERSRE: Final[Pattern[str]] = re.compile(r"HTTP/(\d)\.(\d)", re.ASCII) +DIGITS: Final[Pattern[str]] = re.compile(r"\d+", re.ASCII) +HEXDIGITS: Final[Pattern[bytes]] = re.compile(rb"[0-9a-fA-F]+") + + +class RawRequestMessage(NamedTuple): + method: str + path: str + version: HttpVersion + headers: "CIMultiDictProxy[str]" + raw_headers: RawHeaders + should_close: bool + compression: Optional[str] + upgrade: bool + chunked: bool + url: URL + + +class RawResponseMessage(NamedTuple): + version: HttpVersion + code: int + reason: str + headers: CIMultiDictProxy[str] + raw_headers: RawHeaders + should_close: bool + compression: Optional[str] + upgrade: bool + chunked: bool + + +_MsgT = TypeVar("_MsgT", RawRequestMessage, RawResponseMessage) + + +class ParseState(IntEnum): + + PARSE_NONE = 0 + PARSE_LENGTH = 1 + PARSE_CHUNKED = 2 + PARSE_UNTIL_EOF = 3 + + +class ChunkState(IntEnum): + PARSE_CHUNKED_SIZE = 0 + PARSE_CHUNKED_CHUNK = 1 + PARSE_CHUNKED_CHUNK_EOF = 2 + PARSE_MAYBE_TRAILERS = 3 + PARSE_TRAILERS = 4 + + +class HeadersParser: + def __init__( + self, + max_line_size: int = 8190, + max_headers: int = 32768, + max_field_size: int = 8190, + lax: bool = False, + ) -> None: + self.max_line_size = max_line_size + self.max_headers = max_headers + self.max_field_size = max_field_size + self._lax = lax + + def parse_headers( + self, lines: List[bytes] + ) -> Tuple["CIMultiDictProxy[str]", RawHeaders]: + headers: CIMultiDict[str] = CIMultiDict() + # note: "raw" does not mean inclusion of OWS before/after the field value + raw_headers = [] + + lines_idx = 0 + line = lines[lines_idx] + line_count = len(lines) + + while line: + # Parse initial header name : value pair. + try: + bname, bvalue = line.split(b":", 1) + except ValueError: + raise InvalidHeader(line) from None + + if len(bname) == 0: + raise InvalidHeader(bname) + + # https://www.rfc-editor.org/rfc/rfc9112.html#section-5.1-2 + if {bname[0], bname[-1]} & {32, 9}: # {" ", "\t"} + raise InvalidHeader(line) + + bvalue = bvalue.lstrip(b" \t") + if len(bname) > self.max_field_size: + raise LineTooLong( + "request header name {}".format( + bname.decode("utf8", "backslashreplace") + ), + str(self.max_field_size), + str(len(bname)), + ) + name = bname.decode("utf-8", "surrogateescape") + if not TOKENRE.fullmatch(name): + raise InvalidHeader(bname) + + header_length = len(bvalue) + + # next line + lines_idx += 1 + line = lines[lines_idx] + + # consume continuation lines + continuation = self._lax and line and line[0] in (32, 9) # (' ', '\t') + + # Deprecated: https://www.rfc-editor.org/rfc/rfc9112.html#name-obsolete-line-folding + if continuation: + bvalue_lst = [bvalue] + while continuation: + header_length += len(line) + if header_length > self.max_field_size: + raise LineTooLong( + "request header field {}".format( + bname.decode("utf8", "backslashreplace") + ), + str(self.max_field_size), + str(header_length), + ) + bvalue_lst.append(line) + + # next line + lines_idx += 1 + if lines_idx < line_count: + line = lines[lines_idx] + if line: + continuation = line[0] in (32, 9) # (' ', '\t') + else: + line = b"" + break + bvalue = b"".join(bvalue_lst) + else: + if header_length > self.max_field_size: + raise LineTooLong( + "request header field {}".format( + bname.decode("utf8", "backslashreplace") + ), + str(self.max_field_size), + str(header_length), + ) + + bvalue = bvalue.strip(b" \t") + value = bvalue.decode("utf-8", "surrogateescape") + + # https://www.rfc-editor.org/rfc/rfc9110.html#section-5.5-5 + if "\n" in value or "\r" in value or "\x00" in value: + raise InvalidHeader(bvalue) + + headers.add(name, value) + raw_headers.append((bname, bvalue)) + + return (CIMultiDictProxy(headers), tuple(raw_headers)) + + +def _is_supported_upgrade(headers: CIMultiDictProxy[str]) -> bool: + """Check if the upgrade header is supported.""" + u = headers.get(hdrs.UPGRADE, "") + # .lower() can transform non-ascii characters. + return u.isascii() and u.lower() in {"tcp", "websocket"} + + +class HttpParser(abc.ABC, Generic[_MsgT]): + lax: ClassVar[bool] = False + + def __init__( + self, + protocol: Optional[BaseProtocol] = None, + loop: Optional[asyncio.AbstractEventLoop] = None, + limit: int = 2**16, + max_line_size: int = 8190, + max_headers: int = 32768, + max_field_size: int = 8190, + timer: Optional[BaseTimerContext] = None, + code: Optional[int] = None, + method: Optional[str] = None, + payload_exception: Optional[Type[BaseException]] = None, + response_with_body: bool = True, + read_until_eof: bool = False, + auto_decompress: bool = True, + ) -> None: + self.protocol = protocol + self.loop = loop + self.max_line_size = max_line_size + self.max_headers = max_headers + self.max_field_size = max_field_size + self.timer = timer + self.code = code + self.method = method + self.payload_exception = payload_exception + self.response_with_body = response_with_body + self.read_until_eof = read_until_eof + + self._lines: List[bytes] = [] + self._tail = b"" + self._upgraded = False + self._payload = None + self._payload_parser: Optional[HttpPayloadParser] = None + self._auto_decompress = auto_decompress + self._limit = limit + self._headers_parser = HeadersParser( + max_line_size, max_headers, max_field_size, self.lax + ) + + @abc.abstractmethod + def parse_message(self, lines: List[bytes]) -> _MsgT: ... + + @abc.abstractmethod + def _is_chunked_te(self, te: str) -> bool: ... + + def feed_eof(self) -> Optional[_MsgT]: + if self._payload_parser is not None: + self._payload_parser.feed_eof() + self._payload_parser = None + else: + # try to extract partial message + if self._tail: + self._lines.append(self._tail) + + if self._lines: + if self._lines[-1] != "\r\n": + self._lines.append(b"") + with suppress(Exception): + return self.parse_message(self._lines) + return None + + def feed_data( + self, + data: bytes, + SEP: _SEP = b"\r\n", + EMPTY: bytes = b"", + CONTENT_LENGTH: istr = hdrs.CONTENT_LENGTH, + METH_CONNECT: str = hdrs.METH_CONNECT, + SEC_WEBSOCKET_KEY1: istr = hdrs.SEC_WEBSOCKET_KEY1, + ) -> Tuple[List[Tuple[_MsgT, StreamReader]], bool, bytes]: + + messages = [] + + if self._tail: + data, self._tail = self._tail + data, b"" + + data_len = len(data) + start_pos = 0 + loop = self.loop + + should_close = False + while start_pos < data_len: + + # read HTTP message (request/response line + headers), \r\n\r\n + # and split by lines + if self._payload_parser is None and not self._upgraded: + pos = data.find(SEP, start_pos) + # consume \r\n + if pos == start_pos and not self._lines: + start_pos = pos + len(SEP) + continue + + if pos >= start_pos: + if should_close: + raise BadHttpMessage("Data after `Connection: close`") + + # line found + line = data[start_pos:pos] + if SEP == b"\n": # For lax response parsing + line = line.rstrip(b"\r") + self._lines.append(line) + start_pos = pos + len(SEP) + + # \r\n\r\n found + if self._lines[-1] == EMPTY: + try: + msg: _MsgT = self.parse_message(self._lines) + finally: + self._lines.clear() + + def get_content_length() -> Optional[int]: + # payload length + length_hdr = msg.headers.get(CONTENT_LENGTH) + if length_hdr is None: + return None + + # Shouldn't allow +/- or other number formats. + # https://www.rfc-editor.org/rfc/rfc9110#section-8.6-2 + # msg.headers is already stripped of leading/trailing wsp + if not DIGITS.fullmatch(length_hdr): + raise InvalidHeader(CONTENT_LENGTH) + + return int(length_hdr) + + length = get_content_length() + # do not support old websocket spec + if SEC_WEBSOCKET_KEY1 in msg.headers: + raise InvalidHeader(SEC_WEBSOCKET_KEY1) + + self._upgraded = msg.upgrade and _is_supported_upgrade( + msg.headers + ) + + method = getattr(msg, "method", self.method) + # code is only present on responses + code = getattr(msg, "code", 0) + + assert self.protocol is not None + # calculate payload + empty_body = code in EMPTY_BODY_STATUS_CODES or bool( + method and method in EMPTY_BODY_METHODS + ) + if not empty_body and ( + ((length is not None and length > 0) or msg.chunked) + and not self._upgraded + ): + payload = StreamReader( + self.protocol, + timer=self.timer, + loop=loop, + limit=self._limit, + ) + payload_parser = HttpPayloadParser( + payload, + length=length, + chunked=msg.chunked, + method=method, + compression=msg.compression, + code=self.code, + response_with_body=self.response_with_body, + auto_decompress=self._auto_decompress, + lax=self.lax, + headers_parser=self._headers_parser, + ) + if not payload_parser.done: + self._payload_parser = payload_parser + elif method == METH_CONNECT: + assert isinstance(msg, RawRequestMessage) + payload = StreamReader( + self.protocol, + timer=self.timer, + loop=loop, + limit=self._limit, + ) + self._upgraded = True + self._payload_parser = HttpPayloadParser( + payload, + method=msg.method, + compression=msg.compression, + auto_decompress=self._auto_decompress, + lax=self.lax, + headers_parser=self._headers_parser, + ) + elif not empty_body and length is None and self.read_until_eof: + payload = StreamReader( + self.protocol, + timer=self.timer, + loop=loop, + limit=self._limit, + ) + payload_parser = HttpPayloadParser( + payload, + length=length, + chunked=msg.chunked, + method=method, + compression=msg.compression, + code=self.code, + response_with_body=self.response_with_body, + auto_decompress=self._auto_decompress, + lax=self.lax, + headers_parser=self._headers_parser, + ) + if not payload_parser.done: + self._payload_parser = payload_parser + else: + payload = EMPTY_PAYLOAD + + messages.append((msg, payload)) + should_close = msg.should_close + else: + self._tail = data[start_pos:] + data = EMPTY + break + + # no parser, just store + elif self._payload_parser is None and self._upgraded: + assert not self._lines + break + + # feed payload + elif data and start_pos < data_len: + assert not self._lines + assert self._payload_parser is not None + try: + eof, data = self._payload_parser.feed_data(data[start_pos:], SEP) + except BaseException as underlying_exc: + reraised_exc = underlying_exc + if self.payload_exception is not None: + reraised_exc = self.payload_exception(str(underlying_exc)) + + set_exception( + self._payload_parser.payload, + reraised_exc, + underlying_exc, + ) + + eof = True + data = b"" + if isinstance( + underlying_exc, (InvalidHeader, TransferEncodingError) + ): + raise + + if eof: + start_pos = 0 + data_len = len(data) + self._payload_parser = None + continue + else: + break + + if data and start_pos < data_len: + data = data[start_pos:] + else: + data = EMPTY + + return messages, self._upgraded, data + + def parse_headers( + self, lines: List[bytes] + ) -> Tuple[ + "CIMultiDictProxy[str]", RawHeaders, Optional[bool], Optional[str], bool, bool + ]: + """Parses RFC 5322 headers from a stream. + + Line continuations are supported. Returns list of header name + and value pairs. Header name is in upper case. + """ + headers, raw_headers = self._headers_parser.parse_headers(lines) + close_conn = None + encoding = None + upgrade = False + chunked = False + + # https://www.rfc-editor.org/rfc/rfc9110.html#section-5.5-6 + # https://www.rfc-editor.org/rfc/rfc9110.html#name-collected-abnf + singletons = ( + hdrs.CONTENT_LENGTH, + hdrs.CONTENT_LOCATION, + hdrs.CONTENT_RANGE, + hdrs.CONTENT_TYPE, + hdrs.ETAG, + hdrs.HOST, + hdrs.MAX_FORWARDS, + hdrs.SERVER, + hdrs.TRANSFER_ENCODING, + hdrs.USER_AGENT, + ) + bad_hdr = next((h for h in singletons if len(headers.getall(h, ())) > 1), None) + if bad_hdr is not None: + raise BadHttpMessage(f"Duplicate '{bad_hdr}' header found.") + + # keep-alive + conn = headers.get(hdrs.CONNECTION) + if conn: + v = conn.lower() + if v == "close": + close_conn = True + elif v == "keep-alive": + close_conn = False + # https://www.rfc-editor.org/rfc/rfc9110.html#name-101-switching-protocols + elif v == "upgrade" and headers.get(hdrs.UPGRADE): + upgrade = True + + # encoding + enc = headers.get(hdrs.CONTENT_ENCODING, "") + if enc.isascii() and enc.lower() in {"gzip", "deflate", "br", "zstd"}: + encoding = enc + + # chunking + te = headers.get(hdrs.TRANSFER_ENCODING) + if te is not None: + if self._is_chunked_te(te): + chunked = True + + if hdrs.CONTENT_LENGTH in headers: + raise BadHttpMessage( + "Transfer-Encoding can't be present with Content-Length", + ) + + return (headers, raw_headers, close_conn, encoding, upgrade, chunked) + + def set_upgraded(self, val: bool) -> None: + """Set connection upgraded (to websocket) mode. + + :param bool val: new state. + """ + self._upgraded = val + + +class HttpRequestParser(HttpParser[RawRequestMessage]): + """Read request status line. + + Exception .http_exceptions.BadStatusLine + could be raised in case of any errors in status line. + Returns RawRequestMessage. + """ + + def parse_message(self, lines: List[bytes]) -> RawRequestMessage: + # request line + line = lines[0].decode("utf-8", "surrogateescape") + try: + method, path, version = line.split(" ", maxsplit=2) + except ValueError: + raise BadHttpMethod(line) from None + + if len(path) > self.max_line_size: + raise LineTooLong( + "Status line is too long", str(self.max_line_size), str(len(path)) + ) + + # method + if not TOKENRE.fullmatch(method): + raise BadHttpMethod(method) + + # version + match = VERSRE.fullmatch(version) + if match is None: + raise BadStatusLine(line) + version_o = HttpVersion(int(match.group(1)), int(match.group(2))) + + if method == "CONNECT": + # authority-form, + # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.3 + url = URL.build(authority=path, encoded=True) + elif path.startswith("/"): + # origin-form, + # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.1 + path_part, _hash_separator, url_fragment = path.partition("#") + path_part, _question_mark_separator, qs_part = path_part.partition("?") + + # NOTE: `yarl.URL.build()` is used to mimic what the Cython-based + # NOTE: parser does, otherwise it results into the same + # NOTE: HTTP Request-Line input producing different + # NOTE: `yarl.URL()` objects + url = URL.build( + path=path_part, + query_string=qs_part, + fragment=url_fragment, + encoded=True, + ) + elif path == "*" and method == "OPTIONS": + # asterisk-form, + url = URL(path, encoded=True) + else: + # absolute-form for proxy maybe, + # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.2 + url = URL(path, encoded=True) + if url.scheme == "": + # not absolute-form + raise InvalidURLError( + path.encode(errors="surrogateescape").decode("latin1") + ) + + # read headers + ( + headers, + raw_headers, + close, + compression, + upgrade, + chunked, + ) = self.parse_headers(lines[1:]) + + if close is None: # then the headers weren't set in the request + if version_o <= HttpVersion10: # HTTP 1.0 must asks to not close + close = True + else: # HTTP 1.1 must ask to close. + close = False + + return RawRequestMessage( + method, + path, + version_o, + headers, + raw_headers, + close, + compression, + upgrade, + chunked, + url, + ) + + def _is_chunked_te(self, te: str) -> bool: + te = te.rsplit(",", maxsplit=1)[-1].strip(" \t") + # .lower() transforms some non-ascii chars, so must check first. + if te.isascii() and te.lower() == "chunked": + return True + # https://www.rfc-editor.org/rfc/rfc9112#section-6.3-2.4.3 + raise BadHttpMessage("Request has invalid `Transfer-Encoding`") + + +class HttpResponseParser(HttpParser[RawResponseMessage]): + """Read response status line and headers. + + BadStatusLine could be raised in case of any errors in status line. + Returns RawResponseMessage. + """ + + # Lax mode should only be enabled on response parser. + lax = not DEBUG + + def feed_data( + self, + data: bytes, + SEP: Optional[_SEP] = None, + *args: Any, + **kwargs: Any, + ) -> Tuple[List[Tuple[RawResponseMessage, StreamReader]], bool, bytes]: + if SEP is None: + SEP = b"\r\n" if DEBUG else b"\n" + return super().feed_data(data, SEP, *args, **kwargs) + + def parse_message(self, lines: List[bytes]) -> RawResponseMessage: + line = lines[0].decode("utf-8", "surrogateescape") + try: + version, status = line.split(maxsplit=1) + except ValueError: + raise BadStatusLine(line) from None + + try: + status, reason = status.split(maxsplit=1) + except ValueError: + status = status.strip() + reason = "" + + if len(reason) > self.max_line_size: + raise LineTooLong( + "Status line is too long", str(self.max_line_size), str(len(reason)) + ) + + # version + match = VERSRE.fullmatch(version) + if match is None: + raise BadStatusLine(line) + version_o = HttpVersion(int(match.group(1)), int(match.group(2))) + + # The status code is a three-digit ASCII number, no padding + if len(status) != 3 or not DIGITS.fullmatch(status): + raise BadStatusLine(line) + status_i = int(status) + + # read headers + ( + headers, + raw_headers, + close, + compression, + upgrade, + chunked, + ) = self.parse_headers(lines[1:]) + + if close is None: + if version_o <= HttpVersion10: + close = True + # https://www.rfc-editor.org/rfc/rfc9112.html#name-message-body-length + elif 100 <= status_i < 200 or status_i in {204, 304}: + close = False + elif hdrs.CONTENT_LENGTH in headers or hdrs.TRANSFER_ENCODING in headers: + close = False + else: + # https://www.rfc-editor.org/rfc/rfc9112.html#section-6.3-2.8 + close = True + + return RawResponseMessage( + version_o, + status_i, + reason.strip(), + headers, + raw_headers, + close, + compression, + upgrade, + chunked, + ) + + def _is_chunked_te(self, te: str) -> bool: + # https://www.rfc-editor.org/rfc/rfc9112#section-6.3-2.4.2 + return te.rsplit(",", maxsplit=1)[-1].strip(" \t").lower() == "chunked" + + +class HttpPayloadParser: + def __init__( + self, + payload: StreamReader, + length: Optional[int] = None, + chunked: bool = False, + compression: Optional[str] = None, + code: Optional[int] = None, + method: Optional[str] = None, + response_with_body: bool = True, + auto_decompress: bool = True, + lax: bool = False, + *, + headers_parser: HeadersParser, + ) -> None: + self._length = 0 + self._type = ParseState.PARSE_UNTIL_EOF + self._chunk = ChunkState.PARSE_CHUNKED_SIZE + self._chunk_size = 0 + self._chunk_tail = b"" + self._auto_decompress = auto_decompress + self._lax = lax + self._headers_parser = headers_parser + self._trailer_lines: list[bytes] = [] + self.done = False + + # payload decompression wrapper + if response_with_body and compression and self._auto_decompress: + real_payload: Union[StreamReader, DeflateBuffer] = DeflateBuffer( + payload, compression + ) + else: + real_payload = payload + + # payload parser + if not response_with_body: + # don't parse payload if it's not expected to be received + self._type = ParseState.PARSE_NONE + real_payload.feed_eof() + self.done = True + elif chunked: + self._type = ParseState.PARSE_CHUNKED + elif length is not None: + self._type = ParseState.PARSE_LENGTH + self._length = length + if self._length == 0: + real_payload.feed_eof() + self.done = True + + self.payload = real_payload + + def feed_eof(self) -> None: + if self._type == ParseState.PARSE_UNTIL_EOF: + self.payload.feed_eof() + elif self._type == ParseState.PARSE_LENGTH: + raise ContentLengthError( + "Not enough data to satisfy content length header." + ) + elif self._type == ParseState.PARSE_CHUNKED: + raise TransferEncodingError( + "Not enough data to satisfy transfer length header." + ) + + def feed_data( + self, chunk: bytes, SEP: _SEP = b"\r\n", CHUNK_EXT: bytes = b";" + ) -> Tuple[bool, bytes]: + # Read specified amount of bytes + if self._type == ParseState.PARSE_LENGTH: + required = self._length + chunk_len = len(chunk) + + if required >= chunk_len: + self._length = required - chunk_len + self.payload.feed_data(chunk, chunk_len) + if self._length == 0: + self.payload.feed_eof() + return True, b"" + else: + self._length = 0 + self.payload.feed_data(chunk[:required], required) + self.payload.feed_eof() + return True, chunk[required:] + + # Chunked transfer encoding parser + elif self._type == ParseState.PARSE_CHUNKED: + if self._chunk_tail: + chunk = self._chunk_tail + chunk + self._chunk_tail = b"" + + while chunk: + + # read next chunk size + if self._chunk == ChunkState.PARSE_CHUNKED_SIZE: + pos = chunk.find(SEP) + if pos >= 0: + i = chunk.find(CHUNK_EXT, 0, pos) + if i >= 0: + size_b = chunk[:i] # strip chunk-extensions + # Verify no LF in the chunk-extension + if b"\n" in (ext := chunk[i:pos]): + exc = TransferEncodingError( + f"Unexpected LF in chunk-extension: {ext!r}" + ) + set_exception(self.payload, exc) + raise exc + else: + size_b = chunk[:pos] + + if self._lax: # Allow whitespace in lax mode. + size_b = size_b.strip() + + if not re.fullmatch(HEXDIGITS, size_b): + exc = TransferEncodingError( + chunk[:pos].decode("ascii", "surrogateescape") + ) + set_exception(self.payload, exc) + raise exc + size = int(bytes(size_b), 16) + + chunk = chunk[pos + len(SEP) :] + if size == 0: # eof marker + self._chunk = ChunkState.PARSE_TRAILERS + if self._lax and chunk.startswith(b"\r"): + chunk = chunk[1:] + else: + self._chunk = ChunkState.PARSE_CHUNKED_CHUNK + self._chunk_size = size + self.payload.begin_http_chunk_receiving() + else: + self._chunk_tail = chunk + return False, b"" + + # read chunk and feed buffer + if self._chunk == ChunkState.PARSE_CHUNKED_CHUNK: + required = self._chunk_size + chunk_len = len(chunk) + + if required > chunk_len: + self._chunk_size = required - chunk_len + self.payload.feed_data(chunk, chunk_len) + return False, b"" + else: + self._chunk_size = 0 + self.payload.feed_data(chunk[:required], required) + chunk = chunk[required:] + self._chunk = ChunkState.PARSE_CHUNKED_CHUNK_EOF + self.payload.end_http_chunk_receiving() + + # toss the CRLF at the end of the chunk + if self._chunk == ChunkState.PARSE_CHUNKED_CHUNK_EOF: + if self._lax and chunk.startswith(b"\r"): + chunk = chunk[1:] + if chunk[: len(SEP)] == SEP: + chunk = chunk[len(SEP) :] + self._chunk = ChunkState.PARSE_CHUNKED_SIZE + else: + self._chunk_tail = chunk + return False, b"" + + if self._chunk == ChunkState.PARSE_TRAILERS: + pos = chunk.find(SEP) + if pos < 0: # No line found + self._chunk_tail = chunk + return False, b"" + + line = chunk[:pos] + chunk = chunk[pos + len(SEP) :] + if SEP == b"\n": # For lax response parsing + line = line.rstrip(b"\r") + self._trailer_lines.append(line) + + # \r\n\r\n found, end of stream + if self._trailer_lines[-1] == b"": + # Headers and trailers are defined the same way, + # so we reuse the HeadersParser here. + try: + trailers, raw_trailers = self._headers_parser.parse_headers( + self._trailer_lines + ) + finally: + self._trailer_lines.clear() + self.payload.feed_eof() + return True, chunk + + # Read all bytes until eof + elif self._type == ParseState.PARSE_UNTIL_EOF: + self.payload.feed_data(chunk, len(chunk)) + + return False, b"" + + +class DeflateBuffer: + """DeflateStream decompress stream and feed data into specified stream.""" + + decompressor: Any + + def __init__( + self, + out: StreamReader, + encoding: Optional[str], + max_decompress_size: int = DEFAULT_MAX_DECOMPRESS_SIZE, + ) -> None: + self.out = out + self.size = 0 + out.total_compressed_bytes = self.size + self.encoding = encoding + self._started_decoding = False + + self.decompressor: Union[BrotliDecompressor, ZLibDecompressor, ZSTDDecompressor] + if encoding == "br": + if not HAS_BROTLI: # pragma: no cover + raise ContentEncodingError( + "Can not decode content-encoding: brotli (br). " + "Please install `Brotli`" + ) + self.decompressor = BrotliDecompressor() + elif encoding == "zstd": + if not HAS_ZSTD: + raise ContentEncodingError( + "Can not decode content-encoding: zstandard (zstd). " + "Please install `backports.zstd`" + ) + self.decompressor = ZSTDDecompressor() + else: + self.decompressor = ZLibDecompressor(encoding=encoding) + + self._max_decompress_size = max_decompress_size + + def set_exception( + self, + exc: BaseException, + exc_cause: BaseException = _EXC_SENTINEL, + ) -> None: + set_exception(self.out, exc, exc_cause) + + def feed_data(self, chunk: bytes, size: int) -> None: + if not size: + return + + self.size += size + self.out.total_compressed_bytes = self.size + + # RFC1950 + # bits 0..3 = CM = 0b1000 = 8 = "deflate" + # bits 4..7 = CINFO = 1..7 = windows size. + if ( + not self._started_decoding + and self.encoding == "deflate" + and chunk[0] & 0xF != 8 + ): + # Change the decoder to decompress incorrectly compressed data + # Actually we should issue a warning about non-RFC-compliant data. + self.decompressor = ZLibDecompressor( + encoding=self.encoding, suppress_deflate_header=True + ) + + try: + # Decompress with limit + 1 so we can detect if output exceeds limit + chunk = self.decompressor.decompress_sync( + chunk, max_length=self._max_decompress_size + 1 + ) + except Exception: + raise ContentEncodingError( + "Can not decode content-encoding: %s" % self.encoding + ) + + self._started_decoding = True + + # Check if decompression limit was exceeded + if len(chunk) > self._max_decompress_size: + raise DecompressSizeError( + "Decompressed data exceeds the configured limit of %d bytes" + % self._max_decompress_size + ) + + if chunk: + self.out.feed_data(chunk, len(chunk)) + + def feed_eof(self) -> None: + chunk = self.decompressor.flush() + + if chunk or self.size > 0: + self.out.feed_data(chunk, len(chunk)) + if self.encoding == "deflate" and not self.decompressor.eof: + raise ContentEncodingError("deflate") + + self.out.feed_eof() + + def begin_http_chunk_receiving(self) -> None: + self.out.begin_http_chunk_receiving() + + def end_http_chunk_receiving(self) -> None: + self.out.end_http_chunk_receiving() + + +HttpRequestParserPy = HttpRequestParser +HttpResponseParserPy = HttpResponseParser +RawRequestMessagePy = RawRequestMessage +RawResponseMessagePy = RawResponseMessage + +try: + if not NO_EXTENSIONS: + from ._http_parser import ( # type: ignore[import-not-found,no-redef] + HttpRequestParser, + HttpResponseParser, + RawRequestMessage, + RawResponseMessage, + ) + + HttpRequestParserC = HttpRequestParser + HttpResponseParserC = HttpResponseParser + RawRequestMessageC = RawRequestMessage + RawResponseMessageC = RawResponseMessage +except ImportError: # pragma: no cover + pass diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/http_websocket.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/http_websocket.py new file mode 100644 index 0000000..6b4b30e --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/http_websocket.py @@ -0,0 +1,36 @@ +"""WebSocket protocol versions 13 and 8.""" + +from ._websocket.helpers import WS_KEY, ws_ext_gen, ws_ext_parse +from ._websocket.models import ( + WS_CLOSED_MESSAGE, + WS_CLOSING_MESSAGE, + WebSocketError, + WSCloseCode, + WSHandshakeError, + WSMessage, + WSMsgType, +) +from ._websocket.reader import WebSocketReader +from ._websocket.writer import WebSocketWriter + +# Messages that the WebSocketResponse.receive needs to handle internally +_INTERNAL_RECEIVE_TYPES = frozenset( + (WSMsgType.CLOSE, WSMsgType.CLOSING, WSMsgType.PING, WSMsgType.PONG) +) + + +__all__ = ( + "WS_CLOSED_MESSAGE", + "WS_CLOSING_MESSAGE", + "WS_KEY", + "WebSocketReader", + "WebSocketWriter", + "WSMessage", + "WebSocketError", + "WSMsgType", + "WSCloseCode", + "ws_ext_gen", + "ws_ext_parse", + "WSHandshakeError", + "WSMessage", +) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/http_writer.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/http_writer.py new file mode 100644 index 0000000..a140b21 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/http_writer.py @@ -0,0 +1,378 @@ +"""Http related parsers and protocol.""" + +import asyncio +import sys +from typing import ( # noqa + TYPE_CHECKING, + Any, + Awaitable, + Callable, + Iterable, + List, + NamedTuple, + Optional, + Union, +) + +from multidict import CIMultiDict + +from .abc import AbstractStreamWriter +from .base_protocol import BaseProtocol +from .client_exceptions import ClientConnectionResetError +from .compression_utils import ZLibCompressor +from .helpers import NO_EXTENSIONS + +__all__ = ("StreamWriter", "HttpVersion", "HttpVersion10", "HttpVersion11") + + +MIN_PAYLOAD_FOR_WRITELINES = 2048 +IS_PY313_BEFORE_313_2 = (3, 13, 0) <= sys.version_info < (3, 13, 2) +IS_PY_BEFORE_312_9 = sys.version_info < (3, 12, 9) +SKIP_WRITELINES = IS_PY313_BEFORE_313_2 or IS_PY_BEFORE_312_9 +# writelines is not safe for use +# on Python 3.12+ until 3.12.9 +# on Python 3.13+ until 3.13.2 +# and on older versions it not any faster than write +# CVE-2024-12254: https://github.com/python/cpython/pull/127656 + + +class HttpVersion(NamedTuple): + major: int + minor: int + + +HttpVersion10 = HttpVersion(1, 0) +HttpVersion11 = HttpVersion(1, 1) + + +_T_OnChunkSent = Optional[Callable[[bytes], Awaitable[None]]] +_T_OnHeadersSent = Optional[Callable[["CIMultiDict[str]"], Awaitable[None]]] + + +class StreamWriter(AbstractStreamWriter): + + length: Optional[int] = None + chunked: bool = False + _eof: bool = False + _compress: Optional[ZLibCompressor] = None + + def __init__( + self, + protocol: BaseProtocol, + loop: asyncio.AbstractEventLoop, + on_chunk_sent: _T_OnChunkSent = None, + on_headers_sent: _T_OnHeadersSent = None, + ) -> None: + self._protocol = protocol + self.loop = loop + self._on_chunk_sent: _T_OnChunkSent = on_chunk_sent + self._on_headers_sent: _T_OnHeadersSent = on_headers_sent + self._headers_buf: Optional[bytes] = None + self._headers_written: bool = False + + @property + def transport(self) -> Optional[asyncio.Transport]: + return self._protocol.transport + + @property + def protocol(self) -> BaseProtocol: + return self._protocol + + def enable_chunking(self) -> None: + self.chunked = True + + def enable_compression( + self, encoding: str = "deflate", strategy: Optional[int] = None + ) -> None: + self._compress = ZLibCompressor(encoding=encoding, strategy=strategy) + + def _write(self, chunk: Union[bytes, bytearray, memoryview]) -> None: + size = len(chunk) + self.buffer_size += size + self.output_size += size + transport = self._protocol.transport + if transport is None or transport.is_closing(): + raise ClientConnectionResetError("Cannot write to closing transport") + transport.write(chunk) + + def _writelines(self, chunks: Iterable[bytes]) -> None: + size = 0 + for chunk in chunks: + size += len(chunk) + self.buffer_size += size + self.output_size += size + transport = self._protocol.transport + if transport is None or transport.is_closing(): + raise ClientConnectionResetError("Cannot write to closing transport") + if SKIP_WRITELINES or size < MIN_PAYLOAD_FOR_WRITELINES: + transport.write(b"".join(chunks)) + else: + transport.writelines(chunks) + + def _write_chunked_payload( + self, chunk: Union[bytes, bytearray, "memoryview[int]", "memoryview[bytes]"] + ) -> None: + """Write a chunk with proper chunked encoding.""" + chunk_len_pre = f"{len(chunk):x}\r\n".encode("ascii") + self._writelines((chunk_len_pre, chunk, b"\r\n")) + + def _send_headers_with_payload( + self, + chunk: Union[bytes, bytearray, "memoryview[int]", "memoryview[bytes]"], + is_eof: bool, + ) -> None: + """Send buffered headers with payload, coalescing into single write.""" + # Mark headers as written + self._headers_written = True + headers_buf = self._headers_buf + self._headers_buf = None + + if TYPE_CHECKING: + # Safe because callers (write() and write_eof()) only invoke this method + # after checking that self._headers_buf is truthy + assert headers_buf is not None + + if not self.chunked: + # Non-chunked: coalesce headers with body + if chunk: + self._writelines((headers_buf, chunk)) + else: + self._write(headers_buf) + return + + # Coalesce headers with chunked data + if chunk: + chunk_len_pre = f"{len(chunk):x}\r\n".encode("ascii") + if is_eof: + self._writelines((headers_buf, chunk_len_pre, chunk, b"\r\n0\r\n\r\n")) + else: + self._writelines((headers_buf, chunk_len_pre, chunk, b"\r\n")) + elif is_eof: + self._writelines((headers_buf, b"0\r\n\r\n")) + else: + self._write(headers_buf) + + async def write( + self, + chunk: Union[bytes, bytearray, memoryview], + *, + drain: bool = True, + LIMIT: int = 0x10000, + ) -> None: + """ + Writes chunk of data to a stream. + + write_eof() indicates end of stream. + writer can't be used after write_eof() method being called. + write() return drain future. + """ + if self._on_chunk_sent is not None: + await self._on_chunk_sent(chunk) + + if isinstance(chunk, memoryview): + if chunk.nbytes != len(chunk): + # just reshape it + chunk = chunk.cast("c") + + if self._compress is not None: + chunk = await self._compress.compress(chunk) + if not chunk: + return + + if self.length is not None: + chunk_len = len(chunk) + if self.length >= chunk_len: + self.length = self.length - chunk_len + else: + chunk = chunk[: self.length] + self.length = 0 + if not chunk: + return + + # Handle buffered headers for small payload optimization + if self._headers_buf and not self._headers_written: + self._send_headers_with_payload(chunk, False) + if drain and self.buffer_size > LIMIT: + self.buffer_size = 0 + await self.drain() + return + + if chunk: + if self.chunked: + self._write_chunked_payload(chunk) + else: + self._write(chunk) + + if drain and self.buffer_size > LIMIT: + self.buffer_size = 0 + await self.drain() + + async def write_headers( + self, status_line: str, headers: "CIMultiDict[str]" + ) -> None: + """Write headers to the stream.""" + if self._on_headers_sent is not None: + await self._on_headers_sent(headers) + # status + headers + buf = _serialize_headers(status_line, headers) + self._headers_written = False + self._headers_buf = buf + + def send_headers(self) -> None: + """Force sending buffered headers if not already sent.""" + if not self._headers_buf or self._headers_written: + return + + self._headers_written = True + headers_buf = self._headers_buf + self._headers_buf = None + + if TYPE_CHECKING: + # Safe because we only enter this block when self._headers_buf is truthy + assert headers_buf is not None + + self._write(headers_buf) + + def set_eof(self) -> None: + """Indicate that the message is complete.""" + if self._eof: + return + + # If headers haven't been sent yet, send them now + # This handles the case where there's no body at all + if self._headers_buf and not self._headers_written: + self._headers_written = True + headers_buf = self._headers_buf + self._headers_buf = None + + if TYPE_CHECKING: + # Safe because we only enter this block when self._headers_buf is truthy + assert headers_buf is not None + + # Combine headers and chunked EOF marker in a single write + if self.chunked: + self._writelines((headers_buf, b"0\r\n\r\n")) + else: + self._write(headers_buf) + elif self.chunked and self._headers_written: + # Headers already sent, just send the final chunk marker + self._write(b"0\r\n\r\n") + + self._eof = True + + async def write_eof(self, chunk: bytes = b"") -> None: + if self._eof: + return + + if chunk and self._on_chunk_sent is not None: + await self._on_chunk_sent(chunk) + + # Handle body/compression + if self._compress: + chunks: List[bytes] = [] + chunks_len = 0 + if chunk and (compressed_chunk := await self._compress.compress(chunk)): + chunks_len = len(compressed_chunk) + chunks.append(compressed_chunk) + + flush_chunk = self._compress.flush() + chunks_len += len(flush_chunk) + chunks.append(flush_chunk) + assert chunks_len + + # Send buffered headers with compressed data if not yet sent + if self._headers_buf and not self._headers_written: + self._headers_written = True + headers_buf = self._headers_buf + self._headers_buf = None + + if self.chunked: + # Coalesce headers with compressed chunked data + chunk_len_pre = f"{chunks_len:x}\r\n".encode("ascii") + self._writelines( + (headers_buf, chunk_len_pre, *chunks, b"\r\n0\r\n\r\n") + ) + else: + # Coalesce headers with compressed data + self._writelines((headers_buf, *chunks)) + await self.drain() + self._eof = True + return + + # Headers already sent, just write compressed data + if self.chunked: + chunk_len_pre = f"{chunks_len:x}\r\n".encode("ascii") + self._writelines((chunk_len_pre, *chunks, b"\r\n0\r\n\r\n")) + elif len(chunks) > 1: + self._writelines(chunks) + else: + self._write(chunks[0]) + await self.drain() + self._eof = True + return + + # No compression - send buffered headers if not yet sent + if self._headers_buf and not self._headers_written: + # Use helper to send headers with payload + self._send_headers_with_payload(chunk, True) + await self.drain() + self._eof = True + return + + # Handle remaining body + if self.chunked: + if chunk: + # Write final chunk with EOF marker + self._writelines( + (f"{len(chunk):x}\r\n".encode("ascii"), chunk, b"\r\n0\r\n\r\n") + ) + else: + self._write(b"0\r\n\r\n") + await self.drain() + self._eof = True + return + + if chunk: + self._write(chunk) + await self.drain() + + self._eof = True + + async def drain(self) -> None: + """Flush the write buffer. + + The intended use is to write + + await w.write(data) + await w.drain() + """ + protocol = self._protocol + if protocol.transport is not None and protocol._paused: + await protocol._drain_helper() + + +def _safe_header(string: str) -> str: + if "\r" in string or "\n" in string: + raise ValueError( + "Newline or carriage return detected in headers. " + "Potential header injection attack." + ) + return string + + +def _py_serialize_headers(status_line: str, headers: "CIMultiDict[str]") -> bytes: + headers_gen = (_safe_header(k) + ": " + _safe_header(v) for k, v in headers.items()) + line = status_line + "\r\n" + "\r\n".join(headers_gen) + "\r\n\r\n" + return line.encode("utf-8") + + +_serialize_headers = _py_serialize_headers + +try: + import aiohttp._http_writer as _http_writer # type: ignore[import-not-found] + + _c_serialize_headers = _http_writer._serialize_headers + if not NO_EXTENSIONS: + _serialize_headers = _c_serialize_headers +except ImportError: + pass diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/log.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/log.py new file mode 100644 index 0000000..3cecea2 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/log.py @@ -0,0 +1,8 @@ +import logging + +access_logger = logging.getLogger("aiohttp.access") +client_logger = logging.getLogger("aiohttp.client") +internal_logger = logging.getLogger("aiohttp.internal") +server_logger = logging.getLogger("aiohttp.server") +web_logger = logging.getLogger("aiohttp.web") +ws_logger = logging.getLogger("aiohttp.websocket") diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/multipart.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/multipart.py new file mode 100644 index 0000000..9c37f0b --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/multipart.py @@ -0,0 +1,1152 @@ +import base64 +import binascii +import json +import re +import sys +import uuid +import warnings +from collections import deque +from collections.abc import Mapping, Sequence +from types import TracebackType +from typing import ( + TYPE_CHECKING, + Any, + Deque, + Dict, + Iterator, + List, + Optional, + Tuple, + Type, + Union, + cast, +) +from urllib.parse import parse_qsl, unquote, urlencode + +from multidict import CIMultiDict, CIMultiDictProxy + +from .abc import AbstractStreamWriter +from .compression_utils import ( + DEFAULT_MAX_DECOMPRESS_SIZE, + ZLibCompressor, + ZLibDecompressor, +) +from .hdrs import ( + CONTENT_DISPOSITION, + CONTENT_ENCODING, + CONTENT_LENGTH, + CONTENT_TRANSFER_ENCODING, + CONTENT_TYPE, +) +from .helpers import CHAR, TOKEN, parse_mimetype, reify +from .http import HeadersParser +from .log import internal_logger +from .payload import ( + JsonPayload, + LookupError, + Order, + Payload, + StringPayload, + get_payload, + payload_type, +) +from .streams import StreamReader + +if sys.version_info >= (3, 11): + from typing import Self +else: + from typing import TypeVar + + Self = TypeVar("Self", bound="BodyPartReader") + +__all__ = ( + "MultipartReader", + "MultipartWriter", + "BodyPartReader", + "BadContentDispositionHeader", + "BadContentDispositionParam", + "parse_content_disposition", + "content_disposition_filename", +) + + +if TYPE_CHECKING: + from .client_reqrep import ClientResponse + + +class BadContentDispositionHeader(RuntimeWarning): + pass + + +class BadContentDispositionParam(RuntimeWarning): + pass + + +def parse_content_disposition( + header: Optional[str], +) -> Tuple[Optional[str], Dict[str, str]]: + def is_token(string: str) -> bool: + return bool(string) and TOKEN >= set(string) + + def is_quoted(string: str) -> bool: + return string[0] == string[-1] == '"' + + def is_rfc5987(string: str) -> bool: + return is_token(string) and string.count("'") == 2 + + def is_extended_param(string: str) -> bool: + return string.endswith("*") + + def is_continuous_param(string: str) -> bool: + pos = string.find("*") + 1 + if not pos: + return False + substring = string[pos:-1] if string.endswith("*") else string[pos:] + return substring.isdigit() + + def unescape(text: str, *, chars: str = "".join(map(re.escape, CHAR))) -> str: + return re.sub(f"\\\\([{chars}])", "\\1", text) + + if not header: + return None, {} + + disptype, *parts = header.split(";") + if not is_token(disptype): + warnings.warn(BadContentDispositionHeader(header)) + return None, {} + + params: Dict[str, str] = {} + while parts: + item = parts.pop(0) + + if not item: # To handle trailing semicolons + warnings.warn(BadContentDispositionHeader(header)) + continue + + if "=" not in item: + warnings.warn(BadContentDispositionHeader(header)) + return None, {} + + key, value = item.split("=", 1) + key = key.lower().strip() + value = value.lstrip() + + if key in params: + warnings.warn(BadContentDispositionHeader(header)) + return None, {} + + if not is_token(key): + warnings.warn(BadContentDispositionParam(item)) + continue + + elif is_continuous_param(key): + if is_quoted(value): + value = unescape(value[1:-1]) + elif not is_token(value): + warnings.warn(BadContentDispositionParam(item)) + continue + + elif is_extended_param(key): + if is_rfc5987(value): + encoding, _, value = value.split("'", 2) + encoding = encoding or "utf-8" + else: + warnings.warn(BadContentDispositionParam(item)) + continue + + try: + value = unquote(value, encoding, "strict") + except UnicodeDecodeError: # pragma: nocover + warnings.warn(BadContentDispositionParam(item)) + continue + + else: + failed = True + if is_quoted(value): + failed = False + value = unescape(value[1:-1].lstrip("\\/")) + elif is_token(value): + failed = False + elif parts: + # maybe just ; in filename, in any case this is just + # one case fix, for proper fix we need to redesign parser + _value = f"{value};{parts[0]}" + if is_quoted(_value): + parts.pop(0) + value = unescape(_value[1:-1].lstrip("\\/")) + failed = False + + if failed: + warnings.warn(BadContentDispositionHeader(header)) + return None, {} + + params[key] = value + + return disptype.lower(), params + + +def content_disposition_filename( + params: Mapping[str, str], name: str = "filename" +) -> Optional[str]: + name_suf = "%s*" % name + if not params: + return None + elif name_suf in params: + return params[name_suf] + elif name in params: + return params[name] + else: + parts = [] + fnparams = sorted( + (key, value) for key, value in params.items() if key.startswith(name_suf) + ) + for num, (key, value) in enumerate(fnparams): + _, tail = key.split("*", 1) + if tail.endswith("*"): + tail = tail[:-1] + if tail == str(num): + parts.append(value) + else: + break + if not parts: + return None + value = "".join(parts) + if "'" in value: + encoding, _, value = value.split("'", 2) + encoding = encoding or "utf-8" + return unquote(value, encoding, "strict") + return value + + +class MultipartResponseWrapper: + """Wrapper around the MultipartReader. + + It takes care about + underlying connection and close it when it needs in. + """ + + def __init__( + self, + resp: "ClientResponse", + stream: "MultipartReader", + ) -> None: + self.resp = resp + self.stream = stream + + def __aiter__(self) -> "MultipartResponseWrapper": + return self + + async def __anext__( + self, + ) -> Union["MultipartReader", "BodyPartReader"]: + part = await self.next() + if part is None: + raise StopAsyncIteration + return part + + def at_eof(self) -> bool: + """Returns True when all response data had been read.""" + return self.resp.content.at_eof() + + async def next( + self, + ) -> Optional[Union["MultipartReader", "BodyPartReader"]]: + """Emits next multipart reader object.""" + item = await self.stream.next() + if self.stream.at_eof(): + await self.release() + return item + + async def release(self) -> None: + """Release the connection gracefully. + + All remaining content is read to the void. + """ + await self.resp.release() + + +class BodyPartReader: + """Multipart reader for single body part.""" + + chunk_size = 8192 + + def __init__( + self, + boundary: bytes, + headers: "CIMultiDictProxy[str]", + content: StreamReader, + *, + subtype: str = "mixed", + default_charset: Optional[str] = None, + max_decompress_size: int = DEFAULT_MAX_DECOMPRESS_SIZE, + ) -> None: + self.headers = headers + self._boundary = boundary + self._boundary_len = len(boundary) + 2 # Boundary + \r\n + self._content = content + self._default_charset = default_charset + self._at_eof = False + self._is_form_data = subtype == "form-data" + # https://datatracker.ietf.org/doc/html/rfc7578#section-4.8 + length = None if self._is_form_data else self.headers.get(CONTENT_LENGTH, None) + self._length = int(length) if length is not None else None + self._read_bytes = 0 + self._unread: Deque[bytes] = deque() + self._prev_chunk: Optional[bytes] = None + self._content_eof = 0 + self._cache: Dict[str, Any] = {} + self._max_decompress_size = max_decompress_size + + def __aiter__(self: Self) -> Self: + return self + + async def __anext__(self) -> bytes: + part = await self.next() + if part is None: + raise StopAsyncIteration + return part + + async def next(self) -> Optional[bytes]: + item = await self.read() + if not item: + return None + return item + + async def read(self, *, decode: bool = False) -> bytes: + """Reads body part data. + + decode: Decodes data following by encoding + method from Content-Encoding header. If it missed + data remains untouched + """ + if self._at_eof: + return b"" + data = bytearray() + while not self._at_eof: + data.extend(await self.read_chunk(self.chunk_size)) + if decode: + return await self.decode(data) + return data + + async def read_chunk(self, size: int = chunk_size) -> bytes: + """Reads body part content chunk of the specified size. + + size: chunk size + """ + if self._at_eof: + return b"" + if self._length: + chunk = await self._read_chunk_from_length(size) + else: + chunk = await self._read_chunk_from_stream(size) + + # For the case of base64 data, we must read a fragment of size with a + # remainder of 0 by dividing by 4 for string without symbols \n or \r + encoding = self.headers.get(CONTENT_TRANSFER_ENCODING) + if encoding and encoding.lower() == "base64": + stripped_chunk = b"".join(chunk.split()) + remainder = len(stripped_chunk) % 4 + + while remainder != 0 and not self.at_eof(): + over_chunk_size = 4 - remainder + over_chunk = b"" + + if self._prev_chunk: + over_chunk = self._prev_chunk[:over_chunk_size] + self._prev_chunk = self._prev_chunk[len(over_chunk) :] + + if len(over_chunk) != over_chunk_size: + over_chunk += await self._content.read(4 - len(over_chunk)) + + if not over_chunk: + self._at_eof = True + + stripped_chunk += b"".join(over_chunk.split()) + chunk += over_chunk + remainder = len(stripped_chunk) % 4 + + self._read_bytes += len(chunk) + if self._read_bytes == self._length: + self._at_eof = True + if self._at_eof and await self._content.readline() != b"\r\n": + raise ValueError("Reader did not read all the data or it is malformed") + return chunk + + async def _read_chunk_from_length(self, size: int) -> bytes: + # Reads body part content chunk of the specified size. + # The body part must has Content-Length header with proper value. + assert self._length is not None, "Content-Length required for chunked read" + chunk_size = min(size, self._length - self._read_bytes) + chunk = await self._content.read(chunk_size) + if self._content.at_eof(): + self._at_eof = True + return chunk + + async def _read_chunk_from_stream(self, size: int) -> bytes: + # Reads content chunk of body part with unknown length. + # The Content-Length header for body part is not necessary. + assert ( + size >= self._boundary_len + ), "Chunk size must be greater or equal than boundary length + 2" + first_chunk = self._prev_chunk is None + if first_chunk: + # We need to re-add the CRLF that got removed from headers parsing. + self._prev_chunk = b"\r\n" + await self._content.read(size) + + chunk = b"" + # content.read() may return less than size, so we need to loop to ensure + # we have enough data to detect the boundary. + while len(chunk) < self._boundary_len: + chunk += await self._content.read(size) + self._content_eof += int(self._content.at_eof()) + if self._content_eof > 2: + raise ValueError("Reading after EOF") + if self._content_eof: + break + if len(chunk) > size: + self._content.unread_data(chunk[size:]) + chunk = chunk[:size] + + assert self._prev_chunk is not None + window = self._prev_chunk + chunk + sub = b"\r\n" + self._boundary + if first_chunk: + idx = window.find(sub) + else: + idx = window.find(sub, max(0, len(self._prev_chunk) - len(sub))) + if idx >= 0: + # pushing boundary back to content + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=DeprecationWarning) + self._content.unread_data(window[idx:]) + self._prev_chunk = self._prev_chunk[:idx] + chunk = window[len(self._prev_chunk) : idx] + if not chunk: + self._at_eof = True + result = self._prev_chunk[2 if first_chunk else 0 :] # Strip initial CRLF + self._prev_chunk = chunk + return result + + async def readline(self) -> bytes: + """Reads body part by line by line.""" + if self._at_eof: + return b"" + + if self._unread: + line = self._unread.popleft() + else: + line = await self._content.readline() + + if line.startswith(self._boundary): + # the very last boundary may not come with \r\n, + # so set single rules for everyone + sline = line.rstrip(b"\r\n") + boundary = self._boundary + last_boundary = self._boundary + b"--" + # ensure that we read exactly the boundary, not something alike + if sline == boundary or sline == last_boundary: + self._at_eof = True + self._unread.append(line) + return b"" + else: + next_line = await self._content.readline() + if next_line.startswith(self._boundary): + line = line[:-2] # strip CRLF but only once + self._unread.append(next_line) + + return line + + async def release(self) -> None: + """Like read(), but reads all the data to the void.""" + if self._at_eof: + return + while not self._at_eof: + await self.read_chunk(self.chunk_size) + + async def text(self, *, encoding: Optional[str] = None) -> str: + """Like read(), but assumes that body part contains text data.""" + data = await self.read(decode=True) + # see https://www.w3.org/TR/html5/forms.html#multipart/form-data-encoding-algorithm + # and https://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#dom-xmlhttprequest-send + encoding = encoding or self.get_charset(default="utf-8") + return data.decode(encoding) + + async def json(self, *, encoding: Optional[str] = None) -> Optional[Dict[str, Any]]: + """Like read(), but assumes that body parts contains JSON data.""" + data = await self.read(decode=True) + if not data: + return None + encoding = encoding or self.get_charset(default="utf-8") + return cast(Dict[str, Any], json.loads(data.decode(encoding))) + + async def form(self, *, encoding: Optional[str] = None) -> List[Tuple[str, str]]: + """Like read(), but assumes that body parts contain form urlencoded data.""" + data = await self.read(decode=True) + if not data: + return [] + if encoding is not None: + real_encoding = encoding + else: + real_encoding = self.get_charset(default="utf-8") + try: + decoded_data = data.rstrip().decode(real_encoding) + except UnicodeDecodeError: + raise ValueError("data cannot be decoded with %s encoding" % real_encoding) + + return parse_qsl( + decoded_data, + keep_blank_values=True, + encoding=real_encoding, + ) + + def at_eof(self) -> bool: + """Returns True if the boundary was reached or False otherwise.""" + return self._at_eof + + async def decode(self, data: bytes) -> bytes: + """Decodes data. + + Decoding is done according the specified Content-Encoding + or Content-Transfer-Encoding headers value. + """ + if CONTENT_TRANSFER_ENCODING in self.headers: + data = self._decode_content_transfer(data) + # https://datatracker.ietf.org/doc/html/rfc7578#section-4.8 + if not self._is_form_data and CONTENT_ENCODING in self.headers: + return await self._decode_content(data) + return data + + async def _decode_content(self, data: bytes) -> bytes: + encoding = self.headers.get(CONTENT_ENCODING, "").lower() + if encoding == "identity": + return data + if encoding in {"deflate", "gzip"}: + return await ZLibDecompressor( + encoding=encoding, + suppress_deflate_header=True, + ).decompress(data, max_length=self._max_decompress_size) + + raise RuntimeError(f"unknown content encoding: {encoding}") + + def _decode_content_transfer(self, data: bytes) -> bytes: + encoding = self.headers.get(CONTENT_TRANSFER_ENCODING, "").lower() + + if encoding == "base64": + return base64.b64decode(data) + elif encoding == "quoted-printable": + return binascii.a2b_qp(data) + elif encoding in ("binary", "8bit", "7bit"): + return data + else: + raise RuntimeError(f"unknown content transfer encoding: {encoding}") + + def get_charset(self, default: str) -> str: + """Returns charset parameter from Content-Type header or default.""" + ctype = self.headers.get(CONTENT_TYPE, "") + mimetype = parse_mimetype(ctype) + return mimetype.parameters.get("charset", self._default_charset or default) + + @reify + def name(self) -> Optional[str]: + """Returns name specified in Content-Disposition header. + + If the header is missing or malformed, returns None. + """ + _, params = parse_content_disposition(self.headers.get(CONTENT_DISPOSITION)) + return content_disposition_filename(params, "name") + + @reify + def filename(self) -> Optional[str]: + """Returns filename specified in Content-Disposition header. + + Returns None if the header is missing or malformed. + """ + _, params = parse_content_disposition(self.headers.get(CONTENT_DISPOSITION)) + return content_disposition_filename(params, "filename") + + +@payload_type(BodyPartReader, order=Order.try_first) +class BodyPartReaderPayload(Payload): + _value: BodyPartReader + # _autoclose = False (inherited) - Streaming reader that may have resources + + def __init__(self, value: BodyPartReader, *args: Any, **kwargs: Any) -> None: + super().__init__(value, *args, **kwargs) + + params: Dict[str, str] = {} + if value.name is not None: + params["name"] = value.name + if value.filename is not None: + params["filename"] = value.filename + + if params: + self.set_content_disposition("attachment", True, **params) + + def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str: + raise TypeError("Unable to decode.") + + async def as_bytes(self, encoding: str = "utf-8", errors: str = "strict") -> bytes: + """Raises TypeError as body parts should be consumed via write(). + + This is intentional: BodyPartReader payloads are designed for streaming + large data (potentially gigabytes) and must be consumed only once via + the write() method to avoid memory exhaustion. They cannot be buffered + in memory for reuse. + """ + raise TypeError("Unable to read body part as bytes. Use write() to consume.") + + async def write(self, writer: AbstractStreamWriter) -> None: + field = self._value + chunk = await field.read_chunk(size=2**16) + while chunk: + await writer.write(await field.decode(chunk)) + chunk = await field.read_chunk(size=2**16) + + +class MultipartReader: + """Multipart body reader.""" + + #: Response wrapper, used when multipart readers constructs from response. + response_wrapper_cls = MultipartResponseWrapper + #: Multipart reader class, used to handle multipart/* body parts. + #: None points to type(self) + multipart_reader_cls: Optional[Type["MultipartReader"]] = None + #: Body part reader class for non multipart/* content types. + part_reader_cls = BodyPartReader + + def __init__(self, headers: Mapping[str, str], content: StreamReader) -> None: + self._mimetype = parse_mimetype(headers[CONTENT_TYPE]) + assert self._mimetype.type == "multipart", "multipart/* content type expected" + if "boundary" not in self._mimetype.parameters: + raise ValueError( + "boundary missed for Content-Type: %s" % headers[CONTENT_TYPE] + ) + + self.headers = headers + self._boundary = ("--" + self._get_boundary()).encode() + self._content = content + self._default_charset: Optional[str] = None + self._last_part: Optional[Union["MultipartReader", BodyPartReader]] = None + self._at_eof = False + self._at_bof = True + self._unread: List[bytes] = [] + + def __aiter__(self: Self) -> Self: + return self + + async def __anext__( + self, + ) -> Optional[Union["MultipartReader", BodyPartReader]]: + part = await self.next() + if part is None: + raise StopAsyncIteration + return part + + @classmethod + def from_response( + cls, + response: "ClientResponse", + ) -> MultipartResponseWrapper: + """Constructs reader instance from HTTP response. + + :param response: :class:`~aiohttp.client.ClientResponse` instance + """ + obj = cls.response_wrapper_cls( + response, cls(response.headers, response.content) + ) + return obj + + def at_eof(self) -> bool: + """Returns True if the final boundary was reached, false otherwise.""" + return self._at_eof + + async def next( + self, + ) -> Optional[Union["MultipartReader", BodyPartReader]]: + """Emits the next multipart body part.""" + # So, if we're at BOF, we need to skip till the boundary. + if self._at_eof: + return None + await self._maybe_release_last_part() + if self._at_bof: + await self._read_until_first_boundary() + self._at_bof = False + else: + await self._read_boundary() + if self._at_eof: # we just read the last boundary, nothing to do there + return None + + part = await self.fetch_next_part() + # https://datatracker.ietf.org/doc/html/rfc7578#section-4.6 + if ( + self._last_part is None + and self._mimetype.subtype == "form-data" + and isinstance(part, BodyPartReader) + ): + _, params = parse_content_disposition(part.headers.get(CONTENT_DISPOSITION)) + if params.get("name") == "_charset_": + # Longest encoding in https://encoding.spec.whatwg.org/encodings.json + # is 19 characters, so 32 should be more than enough for any valid encoding. + charset = await part.read_chunk(32) + if len(charset) > 31: + raise RuntimeError("Invalid default charset") + self._default_charset = charset.strip().decode() + part = await self.fetch_next_part() + self._last_part = part + return self._last_part + + async def release(self) -> None: + """Reads all the body parts to the void till the final boundary.""" + while not self._at_eof: + item = await self.next() + if item is None: + break + await item.release() + + async def fetch_next_part( + self, + ) -> Union["MultipartReader", BodyPartReader]: + """Returns the next body part reader.""" + headers = await self._read_headers() + return self._get_part_reader(headers) + + def _get_part_reader( + self, + headers: "CIMultiDictProxy[str]", + ) -> Union["MultipartReader", BodyPartReader]: + """Dispatches the response by the `Content-Type` header. + + Returns a suitable reader instance. + + :param dict headers: Response headers + """ + ctype = headers.get(CONTENT_TYPE, "") + mimetype = parse_mimetype(ctype) + + if mimetype.type == "multipart": + if self.multipart_reader_cls is None: + return type(self)(headers, self._content) + return self.multipart_reader_cls(headers, self._content) + else: + return self.part_reader_cls( + self._boundary, + headers, + self._content, + subtype=self._mimetype.subtype, + default_charset=self._default_charset, + ) + + def _get_boundary(self) -> str: + boundary = self._mimetype.parameters["boundary"] + if len(boundary) > 70: + raise ValueError("boundary %r is too long (70 chars max)" % boundary) + + return boundary + + async def _readline(self) -> bytes: + if self._unread: + return self._unread.pop() + return await self._content.readline() + + async def _read_until_first_boundary(self) -> None: + while True: + chunk = await self._readline() + if chunk == b"": + raise ValueError( + "Could not find starting boundary %r" % (self._boundary) + ) + chunk = chunk.rstrip() + if chunk == self._boundary: + return + elif chunk == self._boundary + b"--": + self._at_eof = True + return + + async def _read_boundary(self) -> None: + chunk = (await self._readline()).rstrip() + if chunk == self._boundary: + pass + elif chunk == self._boundary + b"--": + self._at_eof = True + epilogue = await self._readline() + next_line = await self._readline() + + # the epilogue is expected and then either the end of input or the + # parent multipart boundary, if the parent boundary is found then + # it should be marked as unread and handed to the parent for + # processing + if next_line[:2] == b"--": + self._unread.append(next_line) + # otherwise the request is likely missing an epilogue and both + # lines should be passed to the parent for processing + # (this handles the old behavior gracefully) + else: + self._unread.extend([next_line, epilogue]) + else: + raise ValueError(f"Invalid boundary {chunk!r}, expected {self._boundary!r}") + + async def _read_headers(self) -> "CIMultiDictProxy[str]": + lines = [] + while True: + chunk = await self._content.readline() + chunk = chunk.rstrip(b"\r\n") + lines.append(chunk) + if not chunk: + break + parser = HeadersParser() + headers, raw_headers = parser.parse_headers(lines) + return headers + + async def _maybe_release_last_part(self) -> None: + """Ensures that the last read body part is read completely.""" + if self._last_part is not None: + if not self._last_part.at_eof(): + await self._last_part.release() + self._unread.extend(self._last_part._unread) + self._last_part = None + + +_Part = Tuple[Payload, str, str] + + +class MultipartWriter(Payload): + """Multipart body writer.""" + + _value: None + # _consumed = False (inherited) - Can be encoded multiple times + _autoclose = True # No file handles, just collects parts in memory + + def __init__(self, subtype: str = "mixed", boundary: Optional[str] = None) -> None: + boundary = boundary if boundary is not None else uuid.uuid4().hex + # The underlying Payload API demands a str (utf-8), not bytes, + # so we need to ensure we don't lose anything during conversion. + # As a result, require the boundary to be ASCII only. + # In both situations. + + try: + self._boundary = boundary.encode("ascii") + except UnicodeEncodeError: + raise ValueError("boundary should contain ASCII only chars") from None + ctype = f"multipart/{subtype}; boundary={self._boundary_value}" + + super().__init__(None, content_type=ctype) + + self._parts: List[_Part] = [] + self._is_form_data = subtype == "form-data" + + def __enter__(self) -> "MultipartWriter": + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + pass + + def __iter__(self) -> Iterator[_Part]: + return iter(self._parts) + + def __len__(self) -> int: + return len(self._parts) + + def __bool__(self) -> bool: + return True + + _valid_tchar_regex = re.compile(rb"\A[!#$%&'*+\-.^_`|~\w]+\Z") + _invalid_qdtext_char_regex = re.compile(rb"[\x00-\x08\x0A-\x1F\x7F]") + + @property + def _boundary_value(self) -> str: + """Wrap boundary parameter value in quotes, if necessary. + + Reads self.boundary and returns a unicode string. + """ + # Refer to RFCs 7231, 7230, 5234. + # + # parameter = token "=" ( token / quoted-string ) + # token = 1*tchar + # quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE + # qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text + # obs-text = %x80-FF + # quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) + # tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" + # / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" + # / DIGIT / ALPHA + # ; any VCHAR, except delimiters + # VCHAR = %x21-7E + value = self._boundary + if re.match(self._valid_tchar_regex, value): + return value.decode("ascii") # cannot fail + + if re.search(self._invalid_qdtext_char_regex, value): + raise ValueError("boundary value contains invalid characters") + + # escape %x5C and %x22 + quoted_value_content = value.replace(b"\\", b"\\\\") + quoted_value_content = quoted_value_content.replace(b'"', b'\\"') + + return '"' + quoted_value_content.decode("ascii") + '"' + + @property + def boundary(self) -> str: + return self._boundary.decode("ascii") + + def append(self, obj: Any, headers: Optional[Mapping[str, str]] = None) -> Payload: + if headers is None: + headers = CIMultiDict() + + if isinstance(obj, Payload): + obj.headers.update(headers) + return self.append_payload(obj) + else: + try: + payload = get_payload(obj, headers=headers) + except LookupError: + raise TypeError("Cannot create payload from %r" % obj) + else: + return self.append_payload(payload) + + def append_payload(self, payload: Payload) -> Payload: + """Adds a new body part to multipart writer.""" + encoding: Optional[str] = None + te_encoding: Optional[str] = None + if self._is_form_data: + # https://datatracker.ietf.org/doc/html/rfc7578#section-4.7 + # https://datatracker.ietf.org/doc/html/rfc7578#section-4.8 + assert ( + not {CONTENT_ENCODING, CONTENT_LENGTH, CONTENT_TRANSFER_ENCODING} + & payload.headers.keys() + ) + # Set default Content-Disposition in case user doesn't create one + if CONTENT_DISPOSITION not in payload.headers: + name = f"section-{len(self._parts)}" + payload.set_content_disposition("form-data", name=name) + else: + # compression + encoding = payload.headers.get(CONTENT_ENCODING, "").lower() + if encoding and encoding not in ("deflate", "gzip", "identity"): + raise RuntimeError(f"unknown content encoding: {encoding}") + if encoding == "identity": + encoding = None + + # te encoding + te_encoding = payload.headers.get(CONTENT_TRANSFER_ENCODING, "").lower() + if te_encoding not in ("", "base64", "quoted-printable", "binary"): + raise RuntimeError(f"unknown content transfer encoding: {te_encoding}") + if te_encoding == "binary": + te_encoding = None + + # size + size = payload.size + if size is not None and not (encoding or te_encoding): + payload.headers[CONTENT_LENGTH] = str(size) + + self._parts.append((payload, encoding, te_encoding)) # type: ignore[arg-type] + return payload + + def append_json( + self, obj: Any, headers: Optional[Mapping[str, str]] = None + ) -> Payload: + """Helper to append JSON part.""" + if headers is None: + headers = CIMultiDict() + + return self.append_payload(JsonPayload(obj, headers=headers)) + + def append_form( + self, + obj: Union[Sequence[Tuple[str, str]], Mapping[str, str]], + headers: Optional[Mapping[str, str]] = None, + ) -> Payload: + """Helper to append form urlencoded part.""" + assert isinstance(obj, (Sequence, Mapping)) + + if headers is None: + headers = CIMultiDict() + + if isinstance(obj, Mapping): + obj = list(obj.items()) + data = urlencode(obj, doseq=True) + + return self.append_payload( + StringPayload( + data, headers=headers, content_type="application/x-www-form-urlencoded" + ) + ) + + @property + def size(self) -> Optional[int]: + """Size of the payload.""" + total = 0 + for part, encoding, te_encoding in self._parts: + part_size = part.size + if encoding or te_encoding or part_size is None: + return None + + total += int( + 2 + + len(self._boundary) + + 2 + + part_size # b'--'+self._boundary+b'\r\n' + + len(part._binary_headers) + + 2 # b'\r\n' + ) + + total += 2 + len(self._boundary) + 4 # b'--'+self._boundary+b'--\r\n' + return total + + def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str: + """Return string representation of the multipart data. + + WARNING: This method may do blocking I/O if parts contain file payloads. + It should not be called in the event loop. Use as_bytes().decode() instead. + """ + return "".join( + "--" + + self.boundary + + "\r\n" + + part._binary_headers.decode(encoding, errors) + + part.decode() + for part, _e, _te in self._parts + ) + + async def as_bytes(self, encoding: str = "utf-8", errors: str = "strict") -> bytes: + """Return bytes representation of the multipart data. + + This method is async-safe and calls as_bytes on underlying payloads. + """ + parts: List[bytes] = [] + + # Process each part + for part, _e, _te in self._parts: + # Add boundary + parts.append(b"--" + self._boundary + b"\r\n") + + # Add headers + parts.append(part._binary_headers) + + # Add payload content using as_bytes for async safety + part_bytes = await part.as_bytes(encoding, errors) + parts.append(part_bytes) + + # Add trailing CRLF + parts.append(b"\r\n") + + # Add closing boundary + parts.append(b"--" + self._boundary + b"--\r\n") + + return b"".join(parts) + + async def write( + self, writer: AbstractStreamWriter, close_boundary: bool = True + ) -> None: + """Write body.""" + for part, encoding, te_encoding in self._parts: + if self._is_form_data: + # https://datatracker.ietf.org/doc/html/rfc7578#section-4.2 + assert CONTENT_DISPOSITION in part.headers + assert "name=" in part.headers[CONTENT_DISPOSITION] + + await writer.write(b"--" + self._boundary + b"\r\n") + await writer.write(part._binary_headers) + + if encoding or te_encoding: + w = MultipartPayloadWriter(writer) + if encoding: + w.enable_compression(encoding) + if te_encoding: + w.enable_encoding(te_encoding) + await part.write(w) # type: ignore[arg-type] + await w.write_eof() + else: + await part.write(writer) + + await writer.write(b"\r\n") + + if close_boundary: + await writer.write(b"--" + self._boundary + b"--\r\n") + + async def close(self) -> None: + """ + Close all part payloads that need explicit closing. + + IMPORTANT: This method must not await anything that might not finish + immediately, as it may be called during cleanup/cancellation. Schedule + any long-running operations without awaiting them. + """ + if self._consumed: + return + self._consumed = True + + # Close all parts that need explicit closing + # We catch and log exceptions to ensure all parts get a chance to close + # we do not use asyncio.gather() here because we are not allowed + # to suspend given we may be called during cleanup + for idx, (part, _, _) in enumerate(self._parts): + if not part.autoclose and not part.consumed: + try: + await part.close() + except Exception as exc: + internal_logger.error( + "Failed to close multipart part %d: %s", idx, exc, exc_info=True + ) + + +class MultipartPayloadWriter: + def __init__(self, writer: AbstractStreamWriter) -> None: + self._writer = writer + self._encoding: Optional[str] = None + self._compress: Optional[ZLibCompressor] = None + self._encoding_buffer: Optional[bytearray] = None + + def enable_encoding(self, encoding: str) -> None: + if encoding == "base64": + self._encoding = encoding + self._encoding_buffer = bytearray() + elif encoding == "quoted-printable": + self._encoding = "quoted-printable" + + def enable_compression( + self, encoding: str = "deflate", strategy: Optional[int] = None + ) -> None: + self._compress = ZLibCompressor( + encoding=encoding, + suppress_deflate_header=True, + strategy=strategy, + ) + + async def write_eof(self) -> None: + if self._compress is not None: + chunk = self._compress.flush() + if chunk: + self._compress = None + await self.write(chunk) + + if self._encoding == "base64": + if self._encoding_buffer: + await self._writer.write(base64.b64encode(self._encoding_buffer)) + + async def write(self, chunk: bytes) -> None: + if self._compress is not None: + if chunk: + chunk = await self._compress.compress(chunk) + if not chunk: + return + + if self._encoding == "base64": + buf = self._encoding_buffer + assert buf is not None + buf.extend(chunk) + + if buf: + div, mod = divmod(len(buf), 3) + enc_chunk, self._encoding_buffer = (buf[: div * 3], buf[div * 3 :]) + if enc_chunk: + b64chunk = base64.b64encode(enc_chunk) + await self._writer.write(b64chunk) + elif self._encoding == "quoted-printable": + await self._writer.write(binascii.b2a_qp(chunk)) + else: + await self._writer.write(chunk) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/payload.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/payload.py new file mode 100644 index 0000000..5b88fa0 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/payload.py @@ -0,0 +1,1120 @@ +import asyncio +import enum +import io +import json +import mimetypes +import os +import sys +import warnings +from abc import ABC, abstractmethod +from collections.abc import Iterable +from itertools import chain +from typing import ( + IO, + TYPE_CHECKING, + Any, + Dict, + Final, + List, + Optional, + Set, + TextIO, + Tuple, + Type, + Union, +) + +from multidict import CIMultiDict + +from . import hdrs +from .abc import AbstractStreamWriter +from .helpers import ( + _SENTINEL, + content_disposition_header, + guess_filename, + parse_mimetype, + sentinel, +) +from .streams import StreamReader +from .typedefs import JSONEncoder, _CIMultiDict + +__all__ = ( + "PAYLOAD_REGISTRY", + "get_payload", + "payload_type", + "Payload", + "BytesPayload", + "StringPayload", + "IOBasePayload", + "BytesIOPayload", + "BufferedReaderPayload", + "TextIOPayload", + "StringIOPayload", + "JsonPayload", + "AsyncIterablePayload", +) + +TOO_LARGE_BYTES_BODY: Final[int] = 2**20 # 1 MB +READ_SIZE: Final[int] = 2**16 # 64 KB +_CLOSE_FUTURES: Set[asyncio.Future[None]] = set() + + +class LookupError(Exception): + """Raised when no payload factory is found for the given data type.""" + + +class Order(str, enum.Enum): + normal = "normal" + try_first = "try_first" + try_last = "try_last" + + +def get_payload(data: Any, *args: Any, **kwargs: Any) -> "Payload": + return PAYLOAD_REGISTRY.get(data, *args, **kwargs) + + +def register_payload( + factory: Type["Payload"], type: Any, *, order: Order = Order.normal +) -> None: + PAYLOAD_REGISTRY.register(factory, type, order=order) + + +class payload_type: + def __init__(self, type: Any, *, order: Order = Order.normal) -> None: + self.type = type + self.order = order + + def __call__(self, factory: Type["Payload"]) -> Type["Payload"]: + register_payload(factory, self.type, order=self.order) + return factory + + +PayloadType = Type["Payload"] +_PayloadRegistryItem = Tuple[PayloadType, Any] + + +class PayloadRegistry: + """Payload registry. + + note: we need zope.interface for more efficient adapter search + """ + + __slots__ = ("_first", "_normal", "_last", "_normal_lookup") + + def __init__(self) -> None: + self._first: List[_PayloadRegistryItem] = [] + self._normal: List[_PayloadRegistryItem] = [] + self._last: List[_PayloadRegistryItem] = [] + self._normal_lookup: Dict[Any, PayloadType] = {} + + def get( + self, + data: Any, + *args: Any, + _CHAIN: "Type[chain[_PayloadRegistryItem]]" = chain, + **kwargs: Any, + ) -> "Payload": + if self._first: + for factory, type_ in self._first: + if isinstance(data, type_): + return factory(data, *args, **kwargs) + # Try the fast lookup first + if lookup_factory := self._normal_lookup.get(type(data)): + return lookup_factory(data, *args, **kwargs) + # Bail early if its already a Payload + if isinstance(data, Payload): + return data + # Fallback to the slower linear search + for factory, type_ in _CHAIN(self._normal, self._last): + if isinstance(data, type_): + return factory(data, *args, **kwargs) + raise LookupError() + + def register( + self, factory: PayloadType, type: Any, *, order: Order = Order.normal + ) -> None: + if order is Order.try_first: + self._first.append((factory, type)) + elif order is Order.normal: + self._normal.append((factory, type)) + if isinstance(type, Iterable): + for t in type: + self._normal_lookup[t] = factory + else: + self._normal_lookup[type] = factory + elif order is Order.try_last: + self._last.append((factory, type)) + else: + raise ValueError(f"Unsupported order {order!r}") + + +class Payload(ABC): + + _default_content_type: str = "application/octet-stream" + _size: Optional[int] = None + _consumed: bool = False # Default: payload has not been consumed yet + _autoclose: bool = False # Default: assume resource needs explicit closing + + def __init__( + self, + value: Any, + headers: Optional[ + Union[_CIMultiDict, Dict[str, str], Iterable[Tuple[str, str]]] + ] = None, + content_type: Union[str, None, _SENTINEL] = sentinel, + filename: Optional[str] = None, + encoding: Optional[str] = None, + **kwargs: Any, + ) -> None: + self._encoding = encoding + self._filename = filename + self._headers: _CIMultiDict = CIMultiDict() + self._value = value + if content_type is not sentinel and content_type is not None: + self._headers[hdrs.CONTENT_TYPE] = content_type + elif self._filename is not None: + if sys.version_info >= (3, 13): + guesser = mimetypes.guess_file_type + else: + guesser = mimetypes.guess_type + content_type = guesser(self._filename)[0] + if content_type is None: + content_type = self._default_content_type + self._headers[hdrs.CONTENT_TYPE] = content_type + else: + self._headers[hdrs.CONTENT_TYPE] = self._default_content_type + if headers: + self._headers.update(headers) + + @property + def size(self) -> Optional[int]: + """Size of the payload in bytes. + + Returns the number of bytes that will be transmitted when the payload + is written. For string payloads, this is the size after encoding to bytes, + not the length of the string. + """ + return self._size + + @property + def filename(self) -> Optional[str]: + """Filename of the payload.""" + return self._filename + + @property + def headers(self) -> _CIMultiDict: + """Custom item headers""" + return self._headers + + @property + def _binary_headers(self) -> bytes: + return ( + "".join([k + ": " + v + "\r\n" for k, v in self.headers.items()]).encode( + "utf-8" + ) + + b"\r\n" + ) + + @property + def encoding(self) -> Optional[str]: + """Payload encoding""" + return self._encoding + + @property + def content_type(self) -> str: + """Content type""" + return self._headers[hdrs.CONTENT_TYPE] + + @property + def consumed(self) -> bool: + """Whether the payload has been consumed and cannot be reused.""" + return self._consumed + + @property + def autoclose(self) -> bool: + """ + Whether the payload can close itself automatically. + + Returns True if the payload has no file handles or resources that need + explicit closing. If False, callers must await close() to release resources. + """ + return self._autoclose + + def set_content_disposition( + self, + disptype: str, + quote_fields: bool = True, + _charset: str = "utf-8", + **params: Any, + ) -> None: + """Sets ``Content-Disposition`` header.""" + self._headers[hdrs.CONTENT_DISPOSITION] = content_disposition_header( + disptype, quote_fields=quote_fields, _charset=_charset, **params + ) + + @abstractmethod + def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str: + """ + Return string representation of the value. + + This is named decode() to allow compatibility with bytes objects. + """ + + @abstractmethod + async def write(self, writer: AbstractStreamWriter) -> None: + """ + Write payload to the writer stream. + + Args: + writer: An AbstractStreamWriter instance that handles the actual writing + + This is a legacy method that writes the entire payload without length constraints. + + Important: + For new implementations, use write_with_length() instead of this method. + This method is maintained for backwards compatibility and will eventually + delegate to write_with_length(writer, None) in all implementations. + + All payload subclasses must override this method for backwards compatibility, + but new code should use write_with_length for more flexibility and control. + + """ + + # write_with_length is new in aiohttp 3.12 + # it should be overridden by subclasses + async def write_with_length( + self, writer: AbstractStreamWriter, content_length: Optional[int] + ) -> None: + """ + Write payload with a specific content length constraint. + + Args: + writer: An AbstractStreamWriter instance that handles the actual writing + content_length: Maximum number of bytes to write (None for unlimited) + + This method allows writing payload content with a specific length constraint, + which is particularly useful for HTTP responses with Content-Length header. + + Note: + This is the base implementation that provides backwards compatibility + for subclasses that don't override this method. Specific payload types + should override this method to implement proper length-constrained writing. + + """ + # Backwards compatibility for subclasses that don't override this method + # and for the default implementation + await self.write(writer) + + async def as_bytes(self, encoding: str = "utf-8", errors: str = "strict") -> bytes: + """ + Return bytes representation of the value. + + This is a convenience method that calls decode() and encodes the result + to bytes using the specified encoding. + """ + # Use instance encoding if available, otherwise use parameter + actual_encoding = self._encoding or encoding + return self.decode(actual_encoding, errors).encode(actual_encoding) + + def _close(self) -> None: + """ + Async safe synchronous close operations for backwards compatibility. + + This method exists only for backwards compatibility with code that + needs to clean up payloads synchronously. In the future, we will + drop this method and only support the async close() method. + + WARNING: This method must be safe to call from within the event loop + without blocking. Subclasses should not perform any blocking I/O here. + + WARNING: This method must be called from within an event loop for + certain payload types (e.g., IOBasePayload). Calling it outside an + event loop may raise RuntimeError. + """ + # This is a no-op by default, but subclasses can override it + # for non-blocking cleanup operations. + + async def close(self) -> None: + """ + Close the payload if it holds any resources. + + IMPORTANT: This method must not await anything that might not finish + immediately, as it may be called during cleanup/cancellation. Schedule + any long-running operations without awaiting them. + + In the future, this will be the only close method supported. + """ + self._close() + + +class BytesPayload(Payload): + _value: bytes + # _consumed = False (inherited) - Bytes are immutable and can be reused + _autoclose = True # No file handle, just bytes in memory + + def __init__( + self, value: Union[bytes, bytearray, memoryview], *args: Any, **kwargs: Any + ) -> None: + if "content_type" not in kwargs: + kwargs["content_type"] = "application/octet-stream" + + super().__init__(value, *args, **kwargs) + + if isinstance(value, memoryview): + self._size = value.nbytes + elif isinstance(value, (bytes, bytearray)): + self._size = len(value) + else: + raise TypeError(f"value argument must be byte-ish, not {type(value)!r}") + + if self._size > TOO_LARGE_BYTES_BODY: + kwargs = {"source": self} + warnings.warn( + "Sending a large body directly with raw bytes might" + " lock the event loop. You should probably pass an " + "io.BytesIO object instead", + ResourceWarning, + **kwargs, + ) + + def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str: + return self._value.decode(encoding, errors) + + async def as_bytes(self, encoding: str = "utf-8", errors: str = "strict") -> bytes: + """ + Return bytes representation of the value. + + This method returns the raw bytes content of the payload. + It is equivalent to accessing the _value attribute directly. + """ + return self._value + + async def write(self, writer: AbstractStreamWriter) -> None: + """ + Write the entire bytes payload to the writer stream. + + Args: + writer: An AbstractStreamWriter instance that handles the actual writing + + This method writes the entire bytes content without any length constraint. + + Note: + For new implementations that need length control, use write_with_length(). + This method is maintained for backwards compatibility and is equivalent + to write_with_length(writer, None). + + """ + await writer.write(self._value) + + async def write_with_length( + self, writer: AbstractStreamWriter, content_length: Optional[int] + ) -> None: + """ + Write bytes payload with a specific content length constraint. + + Args: + writer: An AbstractStreamWriter instance that handles the actual writing + content_length: Maximum number of bytes to write (None for unlimited) + + This method writes either the entire byte sequence or a slice of it + up to the specified content_length. For BytesPayload, this operation + is performed efficiently using array slicing. + + """ + if content_length is not None: + await writer.write(self._value[:content_length]) + else: + await writer.write(self._value) + + +class StringPayload(BytesPayload): + def __init__( + self, + value: str, + *args: Any, + encoding: Optional[str] = None, + content_type: Optional[str] = None, + **kwargs: Any, + ) -> None: + + if encoding is None: + if content_type is None: + real_encoding = "utf-8" + content_type = "text/plain; charset=utf-8" + else: + mimetype = parse_mimetype(content_type) + real_encoding = mimetype.parameters.get("charset", "utf-8") + else: + if content_type is None: + content_type = "text/plain; charset=%s" % encoding + real_encoding = encoding + + super().__init__( + value.encode(real_encoding), + encoding=real_encoding, + content_type=content_type, + *args, + **kwargs, + ) + + +class StringIOPayload(StringPayload): + def __init__(self, value: IO[str], *args: Any, **kwargs: Any) -> None: + super().__init__(value.read(), *args, **kwargs) + + +class IOBasePayload(Payload): + _value: io.IOBase + # _consumed = False (inherited) - File can be re-read from the same position + _start_position: Optional[int] = None + # _autoclose = False (inherited) - Has file handle that needs explicit closing + + def __init__( + self, value: IO[Any], disposition: str = "attachment", *args: Any, **kwargs: Any + ) -> None: + if "filename" not in kwargs: + kwargs["filename"] = guess_filename(value) + + super().__init__(value, *args, **kwargs) + + if self._filename is not None and disposition is not None: + if hdrs.CONTENT_DISPOSITION not in self.headers: + self.set_content_disposition(disposition, filename=self._filename) + + def _set_or_restore_start_position(self) -> None: + """Set or restore the start position of the file-like object.""" + if self._start_position is None: + try: + self._start_position = self._value.tell() + except (OSError, AttributeError): + self._consumed = True # Cannot seek, mark as consumed + return + try: + self._value.seek(self._start_position) + except (OSError, AttributeError): + # Failed to seek back - mark as consumed since we've already read + self._consumed = True + + def _read_and_available_len( + self, remaining_content_len: Optional[int] + ) -> Tuple[Optional[int], bytes]: + """ + Read the file-like object and return both its total size and the first chunk. + + Args: + remaining_content_len: Optional limit on how many bytes to read in this operation. + If None, READ_SIZE will be used as the default chunk size. + + Returns: + A tuple containing: + - The total size of the remaining unread content (None if size cannot be determined) + - The first chunk of bytes read from the file object + + This method is optimized to perform both size calculation and initial read + in a single operation, which is executed in a single executor job to minimize + context switches and file operations when streaming content. + + """ + self._set_or_restore_start_position() + size = self.size # Call size only once since it does I/O + return size, self._value.read( + min(READ_SIZE, size or READ_SIZE, remaining_content_len or READ_SIZE) + ) + + def _read(self, remaining_content_len: Optional[int]) -> bytes: + """ + Read a chunk of data from the file-like object. + + Args: + remaining_content_len: Optional maximum number of bytes to read. + If None, READ_SIZE will be used as the default chunk size. + + Returns: + A chunk of bytes read from the file object, respecting the + remaining_content_len limit if specified. + + This method is used for subsequent reads during streaming after + the initial _read_and_available_len call has been made. + + """ + return self._value.read(remaining_content_len or READ_SIZE) # type: ignore[no-any-return] + + @property + def size(self) -> Optional[int]: + """ + Size of the payload in bytes. + + Returns the total size of the payload content from the initial position. + This ensures consistent Content-Length for requests, including 307/308 redirects + where the same payload instance is reused. + + Returns None if the size cannot be determined (e.g., for unseekable streams). + """ + try: + # Store the start position on first access. + # This is critical when the same payload instance is reused (e.g., 307/308 + # redirects). Without storing the initial position, after the payload is + # read once, the file position would be at EOF, which would cause the + # size calculation to return 0 (file_size - EOF position). + # By storing the start position, we ensure the size calculation always + # returns the correct total size for any subsequent use. + if self._start_position is None: + self._start_position = self._value.tell() + + # Return the total size from the start position + # This ensures Content-Length is correct even after reading + return os.fstat(self._value.fileno()).st_size - self._start_position + except (AttributeError, OSError): + return None + + async def write(self, writer: AbstractStreamWriter) -> None: + """ + Write the entire file-like payload to the writer stream. + + Args: + writer: An AbstractStreamWriter instance that handles the actual writing + + This method writes the entire file content without any length constraint. + It delegates to write_with_length() with no length limit for implementation + consistency. + + Note: + For new implementations that need length control, use write_with_length() directly. + This method is maintained for backwards compatibility with existing code. + + """ + await self.write_with_length(writer, None) + + async def write_with_length( + self, writer: AbstractStreamWriter, content_length: Optional[int] + ) -> None: + """ + Write file-like payload with a specific content length constraint. + + Args: + writer: An AbstractStreamWriter instance that handles the actual writing + content_length: Maximum number of bytes to write (None for unlimited) + + This method implements optimized streaming of file content with length constraints: + + 1. File reading is performed in a thread pool to avoid blocking the event loop + 2. Content is read and written in chunks to maintain memory efficiency + 3. Writing stops when either: + - All available file content has been written (when size is known) + - The specified content_length has been reached + 4. File resources are properly closed even if the operation is cancelled + + The implementation carefully handles both known-size and unknown-size payloads, + as well as constrained and unconstrained content lengths. + + """ + loop = asyncio.get_running_loop() + total_written_len = 0 + remaining_content_len = content_length + + # Get initial data and available length + available_len, chunk = await loop.run_in_executor( + None, self._read_and_available_len, remaining_content_len + ) + # Process data chunks until done + while chunk: + chunk_len = len(chunk) + + # Write data with or without length constraint + if remaining_content_len is None: + await writer.write(chunk) + else: + await writer.write(chunk[:remaining_content_len]) + remaining_content_len -= chunk_len + + total_written_len += chunk_len + + # Check if we're done writing + if self._should_stop_writing( + available_len, total_written_len, remaining_content_len + ): + return + + # Read next chunk + chunk = await loop.run_in_executor( + None, + self._read, + ( + min(READ_SIZE, remaining_content_len) + if remaining_content_len is not None + else READ_SIZE + ), + ) + + def _should_stop_writing( + self, + available_len: Optional[int], + total_written_len: int, + remaining_content_len: Optional[int], + ) -> bool: + """ + Determine if we should stop writing data. + + Args: + available_len: Known size of the payload if available (None if unknown) + total_written_len: Number of bytes already written + remaining_content_len: Remaining bytes to be written for content-length limited responses + + Returns: + True if we should stop writing data, based on either: + - Having written all available data (when size is known) + - Having written all requested content (when content-length is specified) + + """ + return (available_len is not None and total_written_len >= available_len) or ( + remaining_content_len is not None and remaining_content_len <= 0 + ) + + def _close(self) -> None: + """ + Async safe synchronous close operations for backwards compatibility. + + This method exists only for backwards + compatibility. Use the async close() method instead. + + WARNING: This method MUST be called from within an event loop. + Calling it outside an event loop will raise RuntimeError. + """ + # Skip if already consumed + if self._consumed: + return + self._consumed = True # Mark as consumed to prevent further writes + # Schedule file closing without awaiting to prevent cancellation issues + loop = asyncio.get_running_loop() + close_future = loop.run_in_executor(None, self._value.close) + # Hold a strong reference to the future to prevent it from being + # garbage collected before it completes. + _CLOSE_FUTURES.add(close_future) + close_future.add_done_callback(_CLOSE_FUTURES.remove) + + async def close(self) -> None: + """ + Close the payload if it holds any resources. + + IMPORTANT: This method must not await anything that might not finish + immediately, as it may be called during cleanup/cancellation. Schedule + any long-running operations without awaiting them. + """ + self._close() + + def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str: + """ + Return string representation of the value. + + WARNING: This method does blocking I/O and should not be called in the event loop. + """ + return self._read_all().decode(encoding, errors) + + def _read_all(self) -> bytes: + """Read the entire file-like object and return its content as bytes.""" + self._set_or_restore_start_position() + # Use readlines() to ensure we get all content + return b"".join(self._value.readlines()) + + async def as_bytes(self, encoding: str = "utf-8", errors: str = "strict") -> bytes: + """ + Return bytes representation of the value. + + This method reads the entire file content and returns it as bytes. + It is equivalent to reading the file-like object directly. + The file reading is performed in an executor to avoid blocking the event loop. + """ + loop = asyncio.get_running_loop() + return await loop.run_in_executor(None, self._read_all) + + +class TextIOPayload(IOBasePayload): + _value: io.TextIOBase + # _autoclose = False (inherited) - Has text file handle that needs explicit closing + + def __init__( + self, + value: TextIO, + *args: Any, + encoding: Optional[str] = None, + content_type: Optional[str] = None, + **kwargs: Any, + ) -> None: + + if encoding is None: + if content_type is None: + encoding = "utf-8" + content_type = "text/plain; charset=utf-8" + else: + mimetype = parse_mimetype(content_type) + encoding = mimetype.parameters.get("charset", "utf-8") + else: + if content_type is None: + content_type = "text/plain; charset=%s" % encoding + + super().__init__( + value, + content_type=content_type, + encoding=encoding, + *args, + **kwargs, + ) + + def _read_and_available_len( + self, remaining_content_len: Optional[int] + ) -> Tuple[Optional[int], bytes]: + """ + Read the text file-like object and return both its total size and the first chunk. + + Args: + remaining_content_len: Optional limit on how many bytes to read in this operation. + If None, READ_SIZE will be used as the default chunk size. + + Returns: + A tuple containing: + - The total size of the remaining unread content (None if size cannot be determined) + - The first chunk of bytes read from the file object, encoded using the payload's encoding + + This method is optimized to perform both size calculation and initial read + in a single operation, which is executed in a single executor job to minimize + context switches and file operations when streaming content. + + Note: + TextIOPayload handles encoding of the text content before writing it + to the stream. If no encoding is specified, UTF-8 is used as the default. + + """ + self._set_or_restore_start_position() + size = self.size + chunk = self._value.read( + min(READ_SIZE, size or READ_SIZE, remaining_content_len or READ_SIZE) + ) + return size, chunk.encode(self._encoding) if self._encoding else chunk.encode() + + def _read(self, remaining_content_len: Optional[int]) -> bytes: + """ + Read a chunk of data from the text file-like object. + + Args: + remaining_content_len: Optional maximum number of bytes to read. + If None, READ_SIZE will be used as the default chunk size. + + Returns: + A chunk of bytes read from the file object and encoded using the payload's + encoding. The data is automatically converted from text to bytes. + + This method is used for subsequent reads during streaming after + the initial _read_and_available_len call has been made. It properly + handles text encoding, converting the text content to bytes using + the specified encoding (or UTF-8 if none was provided). + + """ + chunk = self._value.read(remaining_content_len or READ_SIZE) + return chunk.encode(self._encoding) if self._encoding else chunk.encode() + + def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str: + """ + Return string representation of the value. + + WARNING: This method does blocking I/O and should not be called in the event loop. + """ + self._set_or_restore_start_position() + return self._value.read() + + async def as_bytes(self, encoding: str = "utf-8", errors: str = "strict") -> bytes: + """ + Return bytes representation of the value. + + This method reads the entire text file content and returns it as bytes. + It encodes the text content using the specified encoding. + The file reading is performed in an executor to avoid blocking the event loop. + """ + loop = asyncio.get_running_loop() + + # Use instance encoding if available, otherwise use parameter + actual_encoding = self._encoding or encoding + + def _read_and_encode() -> bytes: + self._set_or_restore_start_position() + # TextIO read() always returns the full content + return self._value.read().encode(actual_encoding, errors) + + return await loop.run_in_executor(None, _read_and_encode) + + +class BytesIOPayload(IOBasePayload): + _value: io.BytesIO + _size: int # Always initialized in __init__ + _autoclose = True # BytesIO is in-memory, safe to auto-close + + def __init__(self, value: io.BytesIO, *args: Any, **kwargs: Any) -> None: + super().__init__(value, *args, **kwargs) + # Calculate size once during initialization + self._size = len(self._value.getbuffer()) - self._value.tell() + + @property + def size(self) -> int: + """Size of the payload in bytes. + + Returns the number of bytes in the BytesIO buffer that will be transmitted. + This is calculated once during initialization for efficiency. + """ + return self._size + + def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str: + self._set_or_restore_start_position() + return self._value.read().decode(encoding, errors) + + async def write(self, writer: AbstractStreamWriter) -> None: + return await self.write_with_length(writer, None) + + async def write_with_length( + self, writer: AbstractStreamWriter, content_length: Optional[int] + ) -> None: + """ + Write BytesIO payload with a specific content length constraint. + + Args: + writer: An AbstractStreamWriter instance that handles the actual writing + content_length: Maximum number of bytes to write (None for unlimited) + + This implementation is specifically optimized for BytesIO objects: + + 1. Reads content in chunks to maintain memory efficiency + 2. Yields control back to the event loop periodically to prevent blocking + when dealing with large BytesIO objects + 3. Respects content_length constraints when specified + 4. Properly cleans up by closing the BytesIO object when done or on error + + The periodic yielding to the event loop is important for maintaining + responsiveness when processing large in-memory buffers. + + """ + self._set_or_restore_start_position() + loop_count = 0 + remaining_bytes = content_length + while chunk := self._value.read(READ_SIZE): + if loop_count > 0: + # Avoid blocking the event loop + # if they pass a large BytesIO object + # and we are not in the first iteration + # of the loop + await asyncio.sleep(0) + if remaining_bytes is None: + await writer.write(chunk) + else: + await writer.write(chunk[:remaining_bytes]) + remaining_bytes -= len(chunk) + if remaining_bytes <= 0: + return + loop_count += 1 + + async def as_bytes(self, encoding: str = "utf-8", errors: str = "strict") -> bytes: + """ + Return bytes representation of the value. + + This method reads the entire BytesIO content and returns it as bytes. + It is equivalent to accessing the _value attribute directly. + """ + self._set_or_restore_start_position() + return self._value.read() + + async def close(self) -> None: + """ + Close the BytesIO payload. + + This does nothing since BytesIO is in-memory and does not require explicit closing. + """ + + +class BufferedReaderPayload(IOBasePayload): + _value: io.BufferedIOBase + # _autoclose = False (inherited) - Has buffered file handle that needs explicit closing + + def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str: + self._set_or_restore_start_position() + return self._value.read().decode(encoding, errors) + + +class JsonPayload(BytesPayload): + def __init__( + self, + value: Any, + encoding: str = "utf-8", + content_type: str = "application/json", + dumps: JSONEncoder = json.dumps, + *args: Any, + **kwargs: Any, + ) -> None: + + super().__init__( + dumps(value).encode(encoding), + content_type=content_type, + encoding=encoding, + *args, + **kwargs, + ) + + +if TYPE_CHECKING: + from typing import AsyncIterable, AsyncIterator + + _AsyncIterator = AsyncIterator[bytes] + _AsyncIterable = AsyncIterable[bytes] +else: + from collections.abc import AsyncIterable, AsyncIterator + + _AsyncIterator = AsyncIterator + _AsyncIterable = AsyncIterable + + +class AsyncIterablePayload(Payload): + + _iter: Optional[_AsyncIterator] = None + _value: _AsyncIterable + _cached_chunks: Optional[List[bytes]] = None + # _consumed stays False to allow reuse with cached content + _autoclose = True # Iterator doesn't need explicit closing + + def __init__(self, value: _AsyncIterable, *args: Any, **kwargs: Any) -> None: + if not isinstance(value, AsyncIterable): + raise TypeError( + "value argument must support " + "collections.abc.AsyncIterable interface, " + "got {!r}".format(type(value)) + ) + + if "content_type" not in kwargs: + kwargs["content_type"] = "application/octet-stream" + + super().__init__(value, *args, **kwargs) + + self._iter = value.__aiter__() + + async def write(self, writer: AbstractStreamWriter) -> None: + """ + Write the entire async iterable payload to the writer stream. + + Args: + writer: An AbstractStreamWriter instance that handles the actual writing + + This method iterates through the async iterable and writes each chunk + to the writer without any length constraint. + + Note: + For new implementations that need length control, use write_with_length() directly. + This method is maintained for backwards compatibility with existing code. + + """ + await self.write_with_length(writer, None) + + async def write_with_length( + self, writer: AbstractStreamWriter, content_length: Optional[int] + ) -> None: + """ + Write async iterable payload with a specific content length constraint. + + Args: + writer: An AbstractStreamWriter instance that handles the actual writing + content_length: Maximum number of bytes to write (None for unlimited) + + This implementation handles streaming of async iterable content with length constraints: + + 1. If cached chunks are available, writes from them + 2. Otherwise iterates through the async iterable one chunk at a time + 3. Respects content_length constraints when specified + 4. Does NOT generate cache - that's done by as_bytes() + + """ + # If we have cached chunks, use them + if self._cached_chunks is not None: + remaining_bytes = content_length + for chunk in self._cached_chunks: + if remaining_bytes is None: + await writer.write(chunk) + elif remaining_bytes > 0: + await writer.write(chunk[:remaining_bytes]) + remaining_bytes -= len(chunk) + else: + break + return + + # If iterator is exhausted and we don't have cached chunks, nothing to write + if self._iter is None: + return + + # Stream from the iterator + remaining_bytes = content_length + + try: + while True: + if sys.version_info >= (3, 10): + chunk = await anext(self._iter) + else: + chunk = await self._iter.__anext__() + if remaining_bytes is None: + await writer.write(chunk) + # If we have a content length limit + elif remaining_bytes > 0: + await writer.write(chunk[:remaining_bytes]) + remaining_bytes -= len(chunk) + # We still want to exhaust the iterator even + # if we have reached the content length limit + # since the file handle may not get closed by + # the iterator if we don't do this + except StopAsyncIteration: + # Iterator is exhausted + self._iter = None + self._consumed = True # Mark as consumed when streamed without caching + + def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str: + """Decode the payload content as a string if cached chunks are available.""" + if self._cached_chunks is not None: + return b"".join(self._cached_chunks).decode(encoding, errors) + raise TypeError("Unable to decode - content not cached. Call as_bytes() first.") + + async def as_bytes(self, encoding: str = "utf-8", errors: str = "strict") -> bytes: + """ + Return bytes representation of the value. + + This method reads the entire async iterable content and returns it as bytes. + It generates and caches the chunks for future reuse. + """ + # If we have cached chunks, return them joined + if self._cached_chunks is not None: + return b"".join(self._cached_chunks) + + # If iterator is exhausted and no cache, return empty + if self._iter is None: + return b"" + + # Read all chunks and cache them + chunks: List[bytes] = [] + async for chunk in self._iter: + chunks.append(chunk) + + # Iterator is exhausted, cache the chunks + self._iter = None + self._cached_chunks = chunks + # Keep _consumed as False to allow reuse with cached chunks + + return b"".join(chunks) + + +class StreamReaderPayload(AsyncIterablePayload): + def __init__(self, value: StreamReader, *args: Any, **kwargs: Any) -> None: + super().__init__(value.iter_any(), *args, **kwargs) + + +PAYLOAD_REGISTRY = PayloadRegistry() +PAYLOAD_REGISTRY.register(BytesPayload, (bytes, bytearray, memoryview)) +PAYLOAD_REGISTRY.register(StringPayload, str) +PAYLOAD_REGISTRY.register(StringIOPayload, io.StringIO) +PAYLOAD_REGISTRY.register(TextIOPayload, io.TextIOBase) +PAYLOAD_REGISTRY.register(BytesIOPayload, io.BytesIO) +PAYLOAD_REGISTRY.register(BufferedReaderPayload, (io.BufferedReader, io.BufferedRandom)) +PAYLOAD_REGISTRY.register(IOBasePayload, io.IOBase) +PAYLOAD_REGISTRY.register(StreamReaderPayload, StreamReader) +# try_last for giving a chance to more specialized async interables like +# multipart.BodyPartReaderPayload override the default +PAYLOAD_REGISTRY.register(AsyncIterablePayload, AsyncIterable, order=Order.try_last) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/payload_streamer.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/payload_streamer.py new file mode 100644 index 0000000..831fdc0 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/payload_streamer.py @@ -0,0 +1,78 @@ +""" +Payload implementation for coroutines as data provider. + +As a simple case, you can upload data from file:: + + @aiohttp.streamer + async def file_sender(writer, file_name=None): + with open(file_name, 'rb') as f: + chunk = f.read(2**16) + while chunk: + await writer.write(chunk) + + chunk = f.read(2**16) + +Then you can use `file_sender` like this: + + async with session.post('http://httpbin.org/post', + data=file_sender(file_name='huge_file')) as resp: + print(await resp.text()) + +..note:: Coroutine must accept `writer` as first argument + +""" + +import types +import warnings +from typing import Any, Awaitable, Callable, Dict, Tuple + +from .abc import AbstractStreamWriter +from .payload import Payload, payload_type + +__all__ = ("streamer",) + + +class _stream_wrapper: + def __init__( + self, + coro: Callable[..., Awaitable[None]], + args: Tuple[Any, ...], + kwargs: Dict[str, Any], + ) -> None: + self.coro = types.coroutine(coro) + self.args = args + self.kwargs = kwargs + + async def __call__(self, writer: AbstractStreamWriter) -> None: + await self.coro(writer, *self.args, **self.kwargs) + + +class streamer: + def __init__(self, coro: Callable[..., Awaitable[None]]) -> None: + warnings.warn( + "@streamer is deprecated, use async generators instead", + DeprecationWarning, + stacklevel=2, + ) + self.coro = coro + + def __call__(self, *args: Any, **kwargs: Any) -> _stream_wrapper: + return _stream_wrapper(self.coro, args, kwargs) + + +@payload_type(_stream_wrapper) +class StreamWrapperPayload(Payload): + async def write(self, writer: AbstractStreamWriter) -> None: + await self._value(writer) + + def decode(self, encoding: str = "utf-8", errors: str = "strict") -> str: + raise TypeError("Unable to decode.") + + +@payload_type(streamer) +class StreamPayload(StreamWrapperPayload): + def __init__(self, value: Any, *args: Any, **kwargs: Any) -> None: + super().__init__(value(), *args, **kwargs) + + async def write(self, writer: AbstractStreamWriter) -> None: + await self._value(writer) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/py.typed b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/py.typed new file mode 100644 index 0000000..f5642f7 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/py.typed @@ -0,0 +1 @@ +Marker diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/pytest_plugin.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/pytest_plugin.py new file mode 100644 index 0000000..7d59fe8 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/pytest_plugin.py @@ -0,0 +1,444 @@ +import asyncio +import contextlib +import inspect +import warnings +from typing import ( + Any, + Awaitable, + Callable, + Dict, + Iterator, + Optional, + Protocol, + Union, + overload, +) + +import pytest + +from .test_utils import ( + BaseTestServer, + RawTestServer, + TestClient, + TestServer, + loop_context, + setup_test_loop, + teardown_test_loop, + unused_port as _unused_port, +) +from .web import Application, BaseRequest, Request +from .web_protocol import _RequestHandler + +try: + import uvloop +except ImportError: # pragma: no cover + uvloop = None # type: ignore[assignment] + + +class AiohttpClient(Protocol): + @overload + async def __call__( + self, + __param: Application, + *, + server_kwargs: Optional[Dict[str, Any]] = None, + **kwargs: Any, + ) -> TestClient[Request, Application]: ... + @overload + async def __call__( + self, + __param: BaseTestServer, + *, + server_kwargs: Optional[Dict[str, Any]] = None, + **kwargs: Any, + ) -> TestClient[BaseRequest, None]: ... + + +class AiohttpServer(Protocol): + def __call__( + self, app: Application, *, port: Optional[int] = None, **kwargs: Any + ) -> Awaitable[TestServer]: ... + + +class AiohttpRawServer(Protocol): + def __call__( + self, handler: _RequestHandler, *, port: Optional[int] = None, **kwargs: Any + ) -> Awaitable[RawTestServer]: ... + + +def pytest_addoption(parser): # type: ignore[no-untyped-def] + parser.addoption( + "--aiohttp-fast", + action="store_true", + default=False, + help="run tests faster by disabling extra checks", + ) + parser.addoption( + "--aiohttp-loop", + action="store", + default="pyloop", + help="run tests with specific loop: pyloop, uvloop or all", + ) + parser.addoption( + "--aiohttp-enable-loop-debug", + action="store_true", + default=False, + help="enable event loop debug mode", + ) + + +def pytest_fixture_setup(fixturedef): # type: ignore[no-untyped-def] + """Set up pytest fixture. + + Allow fixtures to be coroutines. Run coroutine fixtures in an event loop. + """ + func = fixturedef.func + + if inspect.isasyncgenfunction(func): + # async generator fixture + is_async_gen = True + elif inspect.iscoroutinefunction(func): + # regular async fixture + is_async_gen = False + else: + # not an async fixture, nothing to do + return + + strip_request = False + if "request" not in fixturedef.argnames: + fixturedef.argnames += ("request",) + strip_request = True + + def wrapper(*args, **kwargs): # type: ignore[no-untyped-def] + request = kwargs["request"] + if strip_request: + del kwargs["request"] + + # if neither the fixture nor the test use the 'loop' fixture, + # 'getfixturevalue' will fail because the test is not parameterized + # (this can be removed someday if 'loop' is no longer parameterized) + if "loop" not in request.fixturenames: + raise Exception( + "Asynchronous fixtures must depend on the 'loop' fixture or " + "be used in tests depending from it." + ) + + _loop = request.getfixturevalue("loop") + + if is_async_gen: + # for async generators, we need to advance the generator once, + # then advance it again in a finalizer + gen = func(*args, **kwargs) + + def finalizer(): # type: ignore[no-untyped-def] + try: + return _loop.run_until_complete(gen.__anext__()) + except StopAsyncIteration: + pass + + request.addfinalizer(finalizer) + return _loop.run_until_complete(gen.__anext__()) + else: + return _loop.run_until_complete(func(*args, **kwargs)) + + fixturedef.func = wrapper + + +@pytest.fixture +def fast(request): # type: ignore[no-untyped-def] + """--fast config option""" + return request.config.getoption("--aiohttp-fast") + + +@pytest.fixture +def loop_debug(request): # type: ignore[no-untyped-def] + """--enable-loop-debug config option""" + return request.config.getoption("--aiohttp-enable-loop-debug") + + +@contextlib.contextmanager +def _runtime_warning_context(): # type: ignore[no-untyped-def] + """Context manager which checks for RuntimeWarnings. + + This exists specifically to + avoid "coroutine 'X' was never awaited" warnings being missed. + + If RuntimeWarnings occur in the context a RuntimeError is raised. + """ + with warnings.catch_warnings(record=True) as _warnings: + yield + rw = [ + "{w.filename}:{w.lineno}:{w.message}".format(w=w) + for w in _warnings + if w.category == RuntimeWarning + ] + if rw: + raise RuntimeError( + "{} Runtime Warning{},\n{}".format( + len(rw), "" if len(rw) == 1 else "s", "\n".join(rw) + ) + ) + + +@contextlib.contextmanager +def _passthrough_loop_context(loop, fast=False): # type: ignore[no-untyped-def] + """Passthrough loop context. + + Sets up and tears down a loop unless one is passed in via the loop + argument when it's passed straight through. + """ + if loop: + # loop already exists, pass it straight through + yield loop + else: + # this shadows loop_context's standard behavior + loop = setup_test_loop() + yield loop + teardown_test_loop(loop, fast=fast) + + +def pytest_pycollect_makeitem(collector, name, obj): # type: ignore[no-untyped-def] + """Fix pytest collecting for coroutines.""" + if collector.funcnamefilter(name) and inspect.iscoroutinefunction(obj): + return list(collector._genfunctions(name, obj)) + + +def pytest_pyfunc_call(pyfuncitem): # type: ignore[no-untyped-def] + """Run coroutines in an event loop instead of a normal function call.""" + fast = pyfuncitem.config.getoption("--aiohttp-fast") + if inspect.iscoroutinefunction(pyfuncitem.function): + existing_loop = ( + pyfuncitem.funcargs.get("proactor_loop") + or pyfuncitem.funcargs.get("selector_loop") + or pyfuncitem.funcargs.get("uvloop_loop") + or pyfuncitem.funcargs.get("loop", None) + ) + + with _runtime_warning_context(): + with _passthrough_loop_context(existing_loop, fast=fast) as _loop: + testargs = { + arg: pyfuncitem.funcargs[arg] + for arg in pyfuncitem._fixtureinfo.argnames + } + _loop.run_until_complete(pyfuncitem.obj(**testargs)) + + return True + + +def pytest_generate_tests(metafunc): # type: ignore[no-untyped-def] + if "loop_factory" not in metafunc.fixturenames: + return + + loops = metafunc.config.option.aiohttp_loop + avail_factories: dict[str, Callable[[], asyncio.AbstractEventLoop]] + avail_factories = {"pyloop": asyncio.new_event_loop} + + if uvloop is not None: # pragma: no cover + avail_factories["uvloop"] = uvloop.new_event_loop + + if loops == "all": + loops = "pyloop,uvloop?" + + factories = {} # type: ignore[var-annotated] + for name in loops.split(","): + required = not name.endswith("?") + name = name.strip(" ?") + if name not in avail_factories: # pragma: no cover + if required: + raise ValueError( + "Unknown loop '%s', available loops: %s" + % (name, list(factories.keys())) + ) + else: + continue + factories[name] = avail_factories[name] + metafunc.parametrize( + "loop_factory", list(factories.values()), ids=list(factories.keys()) + ) + + +@pytest.fixture +def loop( + loop_factory: Callable[[], asyncio.AbstractEventLoop], + fast: bool, + loop_debug: bool, +) -> Iterator[asyncio.AbstractEventLoop]: + """Return an instance of the event loop.""" + with loop_context(loop_factory, fast=fast) as _loop: + if loop_debug: + _loop.set_debug(True) # pragma: no cover + asyncio.set_event_loop(_loop) + yield _loop + + +@pytest.fixture +def proactor_loop() -> Iterator[asyncio.AbstractEventLoop]: + factory = asyncio.ProactorEventLoop # type: ignore[attr-defined] + + with loop_context(factory) as _loop: + asyncio.set_event_loop(_loop) + yield _loop + + +@pytest.fixture +def unused_port(aiohttp_unused_port: Callable[[], int]) -> Callable[[], int]: + warnings.warn( + "Deprecated, use aiohttp_unused_port fixture instead", + DeprecationWarning, + stacklevel=2, + ) + return aiohttp_unused_port + + +@pytest.fixture +def aiohttp_unused_port() -> Callable[[], int]: + """Return a port that is unused on the current host.""" + return _unused_port + + +@pytest.fixture +def aiohttp_server(loop: asyncio.AbstractEventLoop) -> Iterator[AiohttpServer]: + """Factory to create a TestServer instance, given an app. + + aiohttp_server(app, **kwargs) + """ + servers = [] + + async def go( + app: Application, + *, + host: str = "127.0.0.1", + port: Optional[int] = None, + **kwargs: Any, + ) -> TestServer: + server = TestServer(app, host=host, port=port) + await server.start_server(loop=loop, **kwargs) + servers.append(server) + return server + + yield go + + async def finalize() -> None: + while servers: + await servers.pop().close() + + loop.run_until_complete(finalize()) + + +@pytest.fixture +def test_server(aiohttp_server): # type: ignore[no-untyped-def] # pragma: no cover + warnings.warn( + "Deprecated, use aiohttp_server fixture instead", + DeprecationWarning, + stacklevel=2, + ) + return aiohttp_server + + +@pytest.fixture +def aiohttp_raw_server(loop: asyncio.AbstractEventLoop) -> Iterator[AiohttpRawServer]: + """Factory to create a RawTestServer instance, given a web handler. + + aiohttp_raw_server(handler, **kwargs) + """ + servers = [] + + async def go( + handler: _RequestHandler, *, port: Optional[int] = None, **kwargs: Any + ) -> RawTestServer: + server = RawTestServer(handler, port=port) + await server.start_server(loop=loop, **kwargs) + servers.append(server) + return server + + yield go + + async def finalize() -> None: + while servers: + await servers.pop().close() + + loop.run_until_complete(finalize()) + + +@pytest.fixture +def raw_test_server( # type: ignore[no-untyped-def] # pragma: no cover + aiohttp_raw_server, +): + warnings.warn( + "Deprecated, use aiohttp_raw_server fixture instead", + DeprecationWarning, + stacklevel=2, + ) + return aiohttp_raw_server + + +@pytest.fixture +def aiohttp_client(loop: asyncio.AbstractEventLoop) -> Iterator[AiohttpClient]: + """Factory to create a TestClient instance. + + aiohttp_client(app, **kwargs) + aiohttp_client(server, **kwargs) + aiohttp_client(raw_server, **kwargs) + """ + clients = [] + + @overload + async def go( + __param: Application, + *, + server_kwargs: Optional[Dict[str, Any]] = None, + **kwargs: Any, + ) -> TestClient[Request, Application]: ... + + @overload + async def go( + __param: BaseTestServer, + *, + server_kwargs: Optional[Dict[str, Any]] = None, + **kwargs: Any, + ) -> TestClient[BaseRequest, None]: ... + + async def go( + __param: Union[Application, BaseTestServer], + *args: Any, + server_kwargs: Optional[Dict[str, Any]] = None, + **kwargs: Any, + ) -> TestClient[Any, Any]: + if isinstance(__param, Callable) and not isinstance( # type: ignore[arg-type] + __param, (Application, BaseTestServer) + ): + __param = __param(loop, *args, **kwargs) + kwargs = {} + else: + assert not args, "args should be empty" + + if isinstance(__param, Application): + server_kwargs = server_kwargs or {} + server = TestServer(__param, loop=loop, **server_kwargs) + client = TestClient(server, loop=loop, **kwargs) + elif isinstance(__param, BaseTestServer): + client = TestClient(__param, loop=loop, **kwargs) + else: + raise ValueError("Unknown argument type: %r" % type(__param)) + + await client.start_server() + clients.append(client) + return client + + yield go + + async def finalize() -> None: + while clients: + await clients.pop().close() + + loop.run_until_complete(finalize()) + + +@pytest.fixture +def test_client(aiohttp_client): # type: ignore[no-untyped-def] # pragma: no cover + warnings.warn( + "Deprecated, use aiohttp_client fixture instead", + DeprecationWarning, + stacklevel=2, + ) + return aiohttp_client diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/resolver.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/resolver.py new file mode 100644 index 0000000..b20e567 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/resolver.py @@ -0,0 +1,274 @@ +import asyncio +import socket +import weakref +from typing import Any, Dict, Final, List, Optional, Tuple, Type, Union + +from .abc import AbstractResolver, ResolveResult + +__all__ = ("ThreadedResolver", "AsyncResolver", "DefaultResolver") + + +try: + import aiodns + + aiodns_default = hasattr(aiodns.DNSResolver, "getaddrinfo") +except ImportError: # pragma: no cover + aiodns = None # type: ignore[assignment] + aiodns_default = False + + +_NUMERIC_SOCKET_FLAGS = socket.AI_NUMERICHOST | socket.AI_NUMERICSERV +_NAME_SOCKET_FLAGS = socket.NI_NUMERICHOST | socket.NI_NUMERICSERV +_AI_ADDRCONFIG = socket.AI_ADDRCONFIG +if hasattr(socket, "AI_MASK"): + _AI_ADDRCONFIG &= socket.AI_MASK + + +class ThreadedResolver(AbstractResolver): + """Threaded resolver. + + Uses an Executor for synchronous getaddrinfo() calls. + concurrent.futures.ThreadPoolExecutor is used by default. + """ + + def __init__(self, loop: Optional[asyncio.AbstractEventLoop] = None) -> None: + self._loop = loop or asyncio.get_running_loop() + + async def resolve( + self, host: str, port: int = 0, family: socket.AddressFamily = socket.AF_INET + ) -> List[ResolveResult]: + infos = await self._loop.getaddrinfo( + host, + port, + type=socket.SOCK_STREAM, + family=family, + flags=_AI_ADDRCONFIG, + ) + + hosts: List[ResolveResult] = [] + for family, _, proto, _, address in infos: + if family == socket.AF_INET6: + if len(address) < 3: + # IPv6 is not supported by Python build, + # or IPv6 is not enabled in the host + continue + if address[3]: + # This is essential for link-local IPv6 addresses. + # LL IPv6 is a VERY rare case. Strictly speaking, we should use + # getnameinfo() unconditionally, but performance makes sense. + resolved_host, _port = await self._loop.getnameinfo( + address, _NAME_SOCKET_FLAGS + ) + port = int(_port) + else: + resolved_host, port = address[:2] + else: # IPv4 + assert family == socket.AF_INET + resolved_host, port = address # type: ignore[misc] + hosts.append( + ResolveResult( + hostname=host, + host=resolved_host, + port=port, + family=family, + proto=proto, + flags=_NUMERIC_SOCKET_FLAGS, + ) + ) + + return hosts + + async def close(self) -> None: + pass + + +class AsyncResolver(AbstractResolver): + """Use the `aiodns` package to make asynchronous DNS lookups""" + + def __init__( + self, + loop: Optional[asyncio.AbstractEventLoop] = None, + *args: Any, + **kwargs: Any, + ) -> None: + if aiodns is None: + raise RuntimeError("Resolver requires aiodns library") + + self._loop = loop or asyncio.get_running_loop() + self._manager: Optional[_DNSResolverManager] = None + # If custom args are provided, create a dedicated resolver instance + # This means each AsyncResolver with custom args gets its own + # aiodns.DNSResolver instance + if args or kwargs: + self._resolver = aiodns.DNSResolver(*args, **kwargs) + return + # Use the shared resolver from the manager for default arguments + self._manager = _DNSResolverManager() + self._resolver = self._manager.get_resolver(self, self._loop) + + if not hasattr(self._resolver, "gethostbyname"): + # aiodns 1.1 is not available, fallback to DNSResolver.query + self.resolve = self._resolve_with_query # type: ignore + + async def resolve( + self, host: str, port: int = 0, family: socket.AddressFamily = socket.AF_INET + ) -> List[ResolveResult]: + try: + resp = await self._resolver.getaddrinfo( + host, + port=port, + type=socket.SOCK_STREAM, + family=family, + flags=_AI_ADDRCONFIG, + ) + except aiodns.error.DNSError as exc: + msg = exc.args[1] if len(exc.args) >= 1 else "DNS lookup failed" + raise OSError(None, msg) from exc + hosts: List[ResolveResult] = [] + for node in resp.nodes: + address: Union[Tuple[bytes, int], Tuple[bytes, int, int, int]] = node.addr + family = node.family + if family == socket.AF_INET6: + if len(address) > 3 and address[3]: + # This is essential for link-local IPv6 addresses. + # LL IPv6 is a VERY rare case. Strictly speaking, we should use + # getnameinfo() unconditionally, but performance makes sense. + result = await self._resolver.getnameinfo( + (address[0].decode("ascii"), *address[1:]), + _NAME_SOCKET_FLAGS, + ) + resolved_host = result.node + else: + resolved_host = address[0].decode("ascii") + port = address[1] + else: # IPv4 + assert family == socket.AF_INET + resolved_host = address[0].decode("ascii") + port = address[1] + hosts.append( + ResolveResult( + hostname=host, + host=resolved_host, + port=port, + family=family, + proto=0, + flags=_NUMERIC_SOCKET_FLAGS, + ) + ) + + if not hosts: + raise OSError(None, "DNS lookup failed") + + return hosts + + async def _resolve_with_query( + self, host: str, port: int = 0, family: int = socket.AF_INET + ) -> List[Dict[str, Any]]: + qtype: Final = "AAAA" if family == socket.AF_INET6 else "A" + + try: + resp = await self._resolver.query(host, qtype) + except aiodns.error.DNSError as exc: + msg = exc.args[1] if len(exc.args) >= 1 else "DNS lookup failed" + raise OSError(None, msg) from exc + + hosts = [] + for rr in resp: + hosts.append( + { + "hostname": host, + "host": rr.host, + "port": port, + "family": family, + "proto": 0, + "flags": socket.AI_NUMERICHOST, + } + ) + + if not hosts: + raise OSError(None, "DNS lookup failed") + + return hosts + + async def close(self) -> None: + if self._manager: + # Release the resolver from the manager if using the shared resolver + self._manager.release_resolver(self, self._loop) + self._manager = None # Clear reference to manager + self._resolver = None # type: ignore[assignment] # Clear reference to resolver + return + # Otherwise cancel our dedicated resolver + if self._resolver is not None: + self._resolver.cancel() + self._resolver = None # type: ignore[assignment] # Clear reference + + +class _DNSResolverManager: + """Manager for aiodns.DNSResolver objects. + + This class manages shared aiodns.DNSResolver instances + with no custom arguments across different event loops. + """ + + _instance: Optional["_DNSResolverManager"] = None + + def __new__(cls) -> "_DNSResolverManager": + if cls._instance is None: + cls._instance = super().__new__(cls) + cls._instance._init() + return cls._instance + + def _init(self) -> None: + # Use WeakKeyDictionary to allow event loops to be garbage collected + self._loop_data: weakref.WeakKeyDictionary[ + asyncio.AbstractEventLoop, + tuple["aiodns.DNSResolver", weakref.WeakSet["AsyncResolver"]], + ] = weakref.WeakKeyDictionary() + + def get_resolver( + self, client: "AsyncResolver", loop: asyncio.AbstractEventLoop + ) -> "aiodns.DNSResolver": + """Get or create the shared aiodns.DNSResolver instance for a specific event loop. + + Args: + client: The AsyncResolver instance requesting the resolver. + This is required to track resolver usage. + loop: The event loop to use for the resolver. + """ + # Create a new resolver and client set for this loop if it doesn't exist + if loop not in self._loop_data: + resolver = aiodns.DNSResolver(loop=loop) + client_set: weakref.WeakSet["AsyncResolver"] = weakref.WeakSet() + self._loop_data[loop] = (resolver, client_set) + else: + # Get the existing resolver and client set + resolver, client_set = self._loop_data[loop] + + # Register this client with the loop + client_set.add(client) + return resolver + + def release_resolver( + self, client: "AsyncResolver", loop: asyncio.AbstractEventLoop + ) -> None: + """Release the resolver for an AsyncResolver client when it's closed. + + Args: + client: The AsyncResolver instance to release. + loop: The event loop the resolver was using. + """ + # Remove client from its loop's tracking + current_loop_data = self._loop_data.get(loop) + if current_loop_data is None: + return + resolver, client_set = current_loop_data + client_set.discard(client) + # If no more clients for this loop, cancel and remove its resolver + if not client_set: + if resolver is not None: + resolver.cancel() + del self._loop_data[loop] + + +_DefaultType = Type[Union[AsyncResolver, ThreadedResolver]] +DefaultResolver: _DefaultType = AsyncResolver if aiodns_default else ThreadedResolver diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/streams.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/streams.py new file mode 100644 index 0000000..6cc74fc --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/streams.py @@ -0,0 +1,758 @@ +import asyncio +import collections +import warnings +from typing import ( + Awaitable, + Callable, + Deque, + Final, + Generic, + List, + Optional, + Tuple, + TypeVar, +) + +from .base_protocol import BaseProtocol +from .helpers import ( + _EXC_SENTINEL, + BaseTimerContext, + TimerNoop, + set_exception, + set_result, +) +from .log import internal_logger + +__all__ = ( + "EMPTY_PAYLOAD", + "EofStream", + "StreamReader", + "DataQueue", +) + +_T = TypeVar("_T") + + +class EofStream(Exception): + """eof stream indication.""" + + +class AsyncStreamIterator(Generic[_T]): + + __slots__ = ("read_func",) + + def __init__(self, read_func: Callable[[], Awaitable[_T]]) -> None: + self.read_func = read_func + + def __aiter__(self) -> "AsyncStreamIterator[_T]": + return self + + async def __anext__(self) -> _T: + try: + rv = await self.read_func() + except EofStream: + raise StopAsyncIteration + if rv == b"": + raise StopAsyncIteration + return rv + + +class ChunkTupleAsyncStreamIterator: + + __slots__ = ("_stream",) + + def __init__(self, stream: "StreamReader") -> None: + self._stream = stream + + def __aiter__(self) -> "ChunkTupleAsyncStreamIterator": + return self + + async def __anext__(self) -> Tuple[bytes, bool]: + rv = await self._stream.readchunk() + if rv == (b"", False): + raise StopAsyncIteration + return rv + + +class AsyncStreamReaderMixin: + + __slots__ = () + + def __aiter__(self) -> AsyncStreamIterator[bytes]: + return AsyncStreamIterator(self.readline) # type: ignore[attr-defined] + + def iter_chunked(self, n: int) -> AsyncStreamIterator[bytes]: + """Returns an asynchronous iterator that yields chunks of size n.""" + return AsyncStreamIterator(lambda: self.read(n)) # type: ignore[attr-defined] + + def iter_any(self) -> AsyncStreamIterator[bytes]: + """Yield all available data as soon as it is received.""" + return AsyncStreamIterator(self.readany) # type: ignore[attr-defined] + + def iter_chunks(self) -> ChunkTupleAsyncStreamIterator: + """Yield chunks of data as they are received by the server. + + The yielded objects are tuples + of (bytes, bool) as returned by the StreamReader.readchunk method. + """ + return ChunkTupleAsyncStreamIterator(self) # type: ignore[arg-type] + + +class StreamReader(AsyncStreamReaderMixin): + """An enhancement of asyncio.StreamReader. + + Supports asynchronous iteration by line, chunk or as available:: + + async for line in reader: + ... + async for chunk in reader.iter_chunked(1024): + ... + async for slice in reader.iter_any(): + ... + + """ + + __slots__ = ( + "_protocol", + "_low_water", + "_high_water", + "_low_water_chunks", + "_high_water_chunks", + "_loop", + "_size", + "_cursor", + "_http_chunk_splits", + "_buffer", + "_buffer_offset", + "_eof", + "_waiter", + "_eof_waiter", + "_exception", + "_timer", + "_eof_callbacks", + "_eof_counter", + "total_bytes", + "total_compressed_bytes", + ) + + def __init__( + self, + protocol: BaseProtocol, + limit: int, + *, + timer: Optional[BaseTimerContext] = None, + loop: Optional[asyncio.AbstractEventLoop] = None, + ) -> None: + self._protocol = protocol + self._low_water = limit + self._high_water = limit * 2 + if loop is None: + loop = asyncio.get_event_loop() + # Ensure high_water_chunks >= 3 so it's always > low_water_chunks. + self._high_water_chunks = max(3, limit // 4) + # Use max(2, ...) because there's always at least 1 chunk split remaining + # (the current position), so we need low_water >= 2 to allow resume. + self._low_water_chunks = max(2, self._high_water_chunks // 2) + self._loop = loop + self._size = 0 + self._cursor = 0 + self._http_chunk_splits: Optional[Deque[int]] = None + self._buffer: Deque[bytes] = collections.deque() + self._buffer_offset = 0 + self._eof = False + self._waiter: Optional[asyncio.Future[None]] = None + self._eof_waiter: Optional[asyncio.Future[None]] = None + self._exception: Optional[BaseException] = None + self._timer = TimerNoop() if timer is None else timer + self._eof_callbacks: List[Callable[[], None]] = [] + self._eof_counter = 0 + self.total_bytes = 0 + self.total_compressed_bytes: Optional[int] = None + + def __repr__(self) -> str: + info = [self.__class__.__name__] + if self._size: + info.append("%d bytes" % self._size) + if self._eof: + info.append("eof") + if self._low_water != 2**16: # default limit + info.append("low=%d high=%d" % (self._low_water, self._high_water)) + if self._waiter: + info.append("w=%r" % self._waiter) + if self._exception: + info.append("e=%r" % self._exception) + return "<%s>" % " ".join(info) + + def get_read_buffer_limits(self) -> Tuple[int, int]: + return (self._low_water, self._high_water) + + def exception(self) -> Optional[BaseException]: + return self._exception + + def set_exception( + self, + exc: BaseException, + exc_cause: BaseException = _EXC_SENTINEL, + ) -> None: + self._exception = exc + self._eof_callbacks.clear() + + waiter = self._waiter + if waiter is not None: + self._waiter = None + set_exception(waiter, exc, exc_cause) + + waiter = self._eof_waiter + if waiter is not None: + self._eof_waiter = None + set_exception(waiter, exc, exc_cause) + + def on_eof(self, callback: Callable[[], None]) -> None: + if self._eof: + try: + callback() + except Exception: + internal_logger.exception("Exception in eof callback") + else: + self._eof_callbacks.append(callback) + + def feed_eof(self) -> None: + self._eof = True + + waiter = self._waiter + if waiter is not None: + self._waiter = None + set_result(waiter, None) + + waiter = self._eof_waiter + if waiter is not None: + self._eof_waiter = None + set_result(waiter, None) + + if self._protocol._reading_paused: + self._protocol.resume_reading() + + for cb in self._eof_callbacks: + try: + cb() + except Exception: + internal_logger.exception("Exception in eof callback") + + self._eof_callbacks.clear() + + def is_eof(self) -> bool: + """Return True if 'feed_eof' was called.""" + return self._eof + + def at_eof(self) -> bool: + """Return True if the buffer is empty and 'feed_eof' was called.""" + return self._eof and not self._buffer + + async def wait_eof(self) -> None: + if self._eof: + return + + assert self._eof_waiter is None + self._eof_waiter = self._loop.create_future() + try: + await self._eof_waiter + finally: + self._eof_waiter = None + + @property + def total_raw_bytes(self) -> int: + if self.total_compressed_bytes is None: + return self.total_bytes + return self.total_compressed_bytes + + def unread_data(self, data: bytes) -> None: + """rollback reading some data from stream, inserting it to buffer head.""" + warnings.warn( + "unread_data() is deprecated " + "and will be removed in future releases (#3260)", + DeprecationWarning, + stacklevel=2, + ) + if not data: + return + + if self._buffer_offset: + self._buffer[0] = self._buffer[0][self._buffer_offset :] + self._buffer_offset = 0 + self._size += len(data) + self._cursor -= len(data) + self._buffer.appendleft(data) + self._eof_counter = 0 + + # TODO: size is ignored, remove the param later + def feed_data(self, data: bytes, size: int = 0) -> None: + assert not self._eof, "feed_data after feed_eof" + + if not data: + return + + data_len = len(data) + self._size += data_len + self._buffer.append(data) + self.total_bytes += data_len + + waiter = self._waiter + if waiter is not None: + self._waiter = None + set_result(waiter, None) + + if self._size > self._high_water and not self._protocol._reading_paused: + self._protocol.pause_reading() + + def begin_http_chunk_receiving(self) -> None: + if self._http_chunk_splits is None: + if self.total_bytes: + raise RuntimeError( + "Called begin_http_chunk_receiving when some data was already fed" + ) + self._http_chunk_splits = collections.deque() + + def end_http_chunk_receiving(self) -> None: + if self._http_chunk_splits is None: + raise RuntimeError( + "Called end_chunk_receiving without calling " + "begin_chunk_receiving first" + ) + + # self._http_chunk_splits contains logical byte offsets from start of + # the body transfer. Each offset is the offset of the end of a chunk. + # "Logical" means bytes, accessible for a user. + # If no chunks containing logical data were received, current position + # is difinitely zero. + pos = self._http_chunk_splits[-1] if self._http_chunk_splits else 0 + + if self.total_bytes == pos: + # We should not add empty chunks here. So we check for that. + # Note, when chunked + gzip is used, we can receive a chunk + # of compressed data, but that data may not be enough for gzip FSM + # to yield any uncompressed data. That's why current position may + # not change after receiving a chunk. + return + + self._http_chunk_splits.append(self.total_bytes) + + # If we get too many small chunks before self._high_water is reached, then any + # .read() call becomes computationally expensive, and could block the event loop + # for too long, hence an additional self._high_water_chunks here. + if ( + len(self._http_chunk_splits) > self._high_water_chunks + and not self._protocol._reading_paused + ): + self._protocol.pause_reading() + + # wake up readchunk when end of http chunk received + waiter = self._waiter + if waiter is not None: + self._waiter = None + set_result(waiter, None) + + async def _wait(self, func_name: str) -> None: + if not self._protocol.connected: + raise RuntimeError("Connection closed.") + + # StreamReader uses a future to link the protocol feed_data() method + # to a read coroutine. Running two read coroutines at the same time + # would have an unexpected behaviour. It would not possible to know + # which coroutine would get the next data. + if self._waiter is not None: + raise RuntimeError( + "%s() called while another coroutine is " + "already waiting for incoming data" % func_name + ) + + waiter = self._waiter = self._loop.create_future() + try: + with self._timer: + await waiter + finally: + self._waiter = None + + async def readline(self) -> bytes: + return await self.readuntil() + + async def readuntil(self, separator: bytes = b"\n") -> bytes: + seplen = len(separator) + if seplen == 0: + raise ValueError("Separator should be at least one-byte string") + + if self._exception is not None: + raise self._exception + + chunk = b"" + chunk_size = 0 + not_enough = True + + while not_enough: + while self._buffer and not_enough: + offset = self._buffer_offset + ichar = self._buffer[0].find(separator, offset) + 1 + # Read from current offset to found separator or to the end. + data = self._read_nowait_chunk( + ichar - offset + seplen - 1 if ichar else -1 + ) + chunk += data + chunk_size += len(data) + if ichar: + not_enough = False + + if chunk_size > self._high_water: + raise ValueError("Chunk too big") + + if self._eof: + break + + if not_enough: + await self._wait("readuntil") + + return chunk + + async def read(self, n: int = -1) -> bytes: + if self._exception is not None: + raise self._exception + + # migration problem; with DataQueue you have to catch + # EofStream exception, so common way is to run payload.read() inside + # infinite loop. what can cause real infinite loop with StreamReader + # lets keep this code one major release. + if __debug__: + if self._eof and not self._buffer: + self._eof_counter = getattr(self, "_eof_counter", 0) + 1 + if self._eof_counter > 5: + internal_logger.warning( + "Multiple access to StreamReader in eof state, " + "might be infinite loop.", + stack_info=True, + ) + + if not n: + return b"" + + if n < 0: + # This used to just loop creating a new waiter hoping to + # collect everything in self._buffer, but that would + # deadlock if the subprocess sends more than self.limit + # bytes. So just call self.readany() until EOF. + blocks = [] + while True: + block = await self.readany() + if not block: + break + blocks.append(block) + return b"".join(blocks) + + # TODO: should be `if` instead of `while` + # because waiter maybe triggered on chunk end, + # without feeding any data + while not self._buffer and not self._eof: + await self._wait("read") + + return self._read_nowait(n) + + async def readany(self) -> bytes: + if self._exception is not None: + raise self._exception + + # TODO: should be `if` instead of `while` + # because waiter maybe triggered on chunk end, + # without feeding any data + while not self._buffer and not self._eof: + await self._wait("readany") + + return self._read_nowait(-1) + + async def readchunk(self) -> Tuple[bytes, bool]: + """Returns a tuple of (data, end_of_http_chunk). + + When chunked transfer + encoding is used, end_of_http_chunk is a boolean indicating if the end + of the data corresponds to the end of a HTTP chunk , otherwise it is + always False. + """ + while True: + if self._exception is not None: + raise self._exception + + while self._http_chunk_splits: + pos = self._http_chunk_splits.popleft() + if pos == self._cursor: + return (b"", True) + if pos > self._cursor: + return (self._read_nowait(pos - self._cursor), True) + internal_logger.warning( + "Skipping HTTP chunk end due to data " + "consumption beyond chunk boundary" + ) + + if self._buffer: + return (self._read_nowait_chunk(-1), False) + # return (self._read_nowait(-1), False) + + if self._eof: + # Special case for signifying EOF. + # (b'', True) is not a final return value actually. + return (b"", False) + + await self._wait("readchunk") + + async def readexactly(self, n: int) -> bytes: + if self._exception is not None: + raise self._exception + + blocks: List[bytes] = [] + while n > 0: + block = await self.read(n) + if not block: + partial = b"".join(blocks) + raise asyncio.IncompleteReadError(partial, len(partial) + n) + blocks.append(block) + n -= len(block) + + return b"".join(blocks) + + def read_nowait(self, n: int = -1) -> bytes: + # default was changed to be consistent with .read(-1) + # + # I believe the most users don't know about the method and + # they are not affected. + if self._exception is not None: + raise self._exception + + if self._waiter and not self._waiter.done(): + raise RuntimeError( + "Called while some coroutine is waiting for incoming data." + ) + + return self._read_nowait(n) + + def _read_nowait_chunk(self, n: int) -> bytes: + first_buffer = self._buffer[0] + offset = self._buffer_offset + if n != -1 and len(first_buffer) - offset > n: + data = first_buffer[offset : offset + n] + self._buffer_offset += n + + elif offset: + self._buffer.popleft() + data = first_buffer[offset:] + self._buffer_offset = 0 + + else: + data = self._buffer.popleft() + + data_len = len(data) + self._size -= data_len + self._cursor += data_len + + chunk_splits = self._http_chunk_splits + # Prevent memory leak: drop useless chunk splits + while chunk_splits and chunk_splits[0] < self._cursor: + chunk_splits.popleft() + + if ( + self._protocol._reading_paused + and self._size < self._low_water + and ( + self._http_chunk_splits is None + or len(self._http_chunk_splits) < self._low_water_chunks + ) + ): + self._protocol.resume_reading() + return data + + def _read_nowait(self, n: int) -> bytes: + """Read not more than n bytes, or whole buffer if n == -1""" + self._timer.assert_timeout() + + chunks = [] + while self._buffer: + chunk = self._read_nowait_chunk(n) + chunks.append(chunk) + if n != -1: + n -= len(chunk) + if n == 0: + break + + return b"".join(chunks) if chunks else b"" + + +class EmptyStreamReader(StreamReader): # lgtm [py/missing-call-to-init] + + __slots__ = ("_read_eof_chunk",) + + def __init__(self) -> None: + self._read_eof_chunk = False + self.total_bytes = 0 + + def __repr__(self) -> str: + return "<%s>" % self.__class__.__name__ + + def exception(self) -> Optional[BaseException]: + return None + + def set_exception( + self, + exc: BaseException, + exc_cause: BaseException = _EXC_SENTINEL, + ) -> None: + pass + + def on_eof(self, callback: Callable[[], None]) -> None: + try: + callback() + except Exception: + internal_logger.exception("Exception in eof callback") + + def feed_eof(self) -> None: + pass + + def is_eof(self) -> bool: + return True + + def at_eof(self) -> bool: + return True + + async def wait_eof(self) -> None: + return + + def feed_data(self, data: bytes, n: int = 0) -> None: + pass + + async def readline(self) -> bytes: + return b"" + + async def read(self, n: int = -1) -> bytes: + return b"" + + # TODO add async def readuntil + + async def readany(self) -> bytes: + return b"" + + async def readchunk(self) -> Tuple[bytes, bool]: + if not self._read_eof_chunk: + self._read_eof_chunk = True + return (b"", False) + + return (b"", True) + + async def readexactly(self, n: int) -> bytes: + raise asyncio.IncompleteReadError(b"", n) + + def read_nowait(self, n: int = -1) -> bytes: + return b"" + + +EMPTY_PAYLOAD: Final[StreamReader] = EmptyStreamReader() + + +class DataQueue(Generic[_T]): + """DataQueue is a general-purpose blocking queue with one reader.""" + + def __init__(self, loop: asyncio.AbstractEventLoop) -> None: + self._loop = loop + self._eof = False + self._waiter: Optional[asyncio.Future[None]] = None + self._exception: Optional[BaseException] = None + self._buffer: Deque[Tuple[_T, int]] = collections.deque() + + def __len__(self) -> int: + return len(self._buffer) + + def is_eof(self) -> bool: + return self._eof + + def at_eof(self) -> bool: + return self._eof and not self._buffer + + def exception(self) -> Optional[BaseException]: + return self._exception + + def set_exception( + self, + exc: BaseException, + exc_cause: BaseException = _EXC_SENTINEL, + ) -> None: + self._eof = True + self._exception = exc + if (waiter := self._waiter) is not None: + self._waiter = None + set_exception(waiter, exc, exc_cause) + + def feed_data(self, data: _T, size: int = 0) -> None: + self._buffer.append((data, size)) + if (waiter := self._waiter) is not None: + self._waiter = None + set_result(waiter, None) + + def feed_eof(self) -> None: + self._eof = True + if (waiter := self._waiter) is not None: + self._waiter = None + set_result(waiter, None) + + async def read(self) -> _T: + if not self._buffer and not self._eof: + assert not self._waiter + self._waiter = self._loop.create_future() + try: + await self._waiter + except (asyncio.CancelledError, asyncio.TimeoutError): + self._waiter = None + raise + if self._buffer: + data, _ = self._buffer.popleft() + return data + if self._exception is not None: + raise self._exception + raise EofStream + + def __aiter__(self) -> AsyncStreamIterator[_T]: + return AsyncStreamIterator(self.read) + + +class FlowControlDataQueue(DataQueue[_T]): + """FlowControlDataQueue resumes and pauses an underlying stream. + + It is a destination for parsed data. + + This class is deprecated and will be removed in version 4.0. + """ + + def __init__( + self, protocol: BaseProtocol, limit: int, *, loop: asyncio.AbstractEventLoop + ) -> None: + super().__init__(loop=loop) + self._size = 0 + self._protocol = protocol + self._limit = limit * 2 + + def feed_data(self, data: _T, size: int = 0) -> None: + super().feed_data(data, size) + self._size += size + + if self._size > self._limit and not self._protocol._reading_paused: + self._protocol.pause_reading() + + async def read(self) -> _T: + if not self._buffer and not self._eof: + assert not self._waiter + self._waiter = self._loop.create_future() + try: + await self._waiter + except (asyncio.CancelledError, asyncio.TimeoutError): + self._waiter = None + raise + if self._buffer: + data, size = self._buffer.popleft() + self._size -= size + if self._size < self._limit and self._protocol._reading_paused: + self._protocol.resume_reading() + return data + if self._exception is not None: + raise self._exception + raise EofStream diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/tcp_helpers.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/tcp_helpers.py new file mode 100644 index 0000000..88b2442 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/tcp_helpers.py @@ -0,0 +1,37 @@ +"""Helper methods to tune a TCP connection""" + +import asyncio +import socket +from contextlib import suppress +from typing import Optional # noqa + +__all__ = ("tcp_keepalive", "tcp_nodelay") + + +if hasattr(socket, "SO_KEEPALIVE"): + + def tcp_keepalive(transport: asyncio.Transport) -> None: + sock = transport.get_extra_info("socket") + if sock is not None: + sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) + +else: + + def tcp_keepalive(transport: asyncio.Transport) -> None: # pragma: no cover + pass + + +def tcp_nodelay(transport: asyncio.Transport, value: bool) -> None: + sock = transport.get_extra_info("socket") + + if sock is None: + return + + if sock.family not in (socket.AF_INET, socket.AF_INET6): + return + + value = bool(value) + + # socket may be closed already, on windows OSError get raised + with suppress(OSError): + sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, value) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/test_utils.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/test_utils.py new file mode 100644 index 0000000..87c3142 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/test_utils.py @@ -0,0 +1,774 @@ +"""Utilities shared by tests.""" + +import asyncio +import contextlib +import gc +import inspect +import ipaddress +import os +import socket +import sys +import warnings +from abc import ABC, abstractmethod +from types import TracebackType +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Generic, + Iterator, + List, + Optional, + Type, + TypeVar, + cast, + overload, +) +from unittest import IsolatedAsyncioTestCase, mock + +from aiosignal import Signal +from multidict import CIMultiDict, CIMultiDictProxy +from yarl import URL + +import aiohttp +from aiohttp.client import ( + _RequestContextManager, + _RequestOptions, + _WSRequestContextManager, +) + +from . import ClientSession, hdrs +from .abc import AbstractCookieJar +from .client_reqrep import ClientResponse +from .client_ws import ClientWebSocketResponse +from .helpers import sentinel +from .http import HttpVersion, RawRequestMessage +from .streams import EMPTY_PAYLOAD, StreamReader +from .typedefs import StrOrURL +from .web import ( + Application, + AppRunner, + BaseRequest, + BaseRunner, + Request, + Server, + ServerRunner, + SockSite, + UrlMappingMatchInfo, +) +from .web_protocol import _RequestHandler + +if TYPE_CHECKING: + from ssl import SSLContext +else: + SSLContext = None + +if sys.version_info >= (3, 11) and TYPE_CHECKING: + from typing import Unpack + +if sys.version_info >= (3, 11): + from typing import Self +else: + Self = Any + +_ApplicationNone = TypeVar("_ApplicationNone", Application, None) +_Request = TypeVar("_Request", bound=BaseRequest) + +REUSE_ADDRESS = os.name == "posix" and sys.platform != "cygwin" + + +def get_unused_port_socket( + host: str, family: socket.AddressFamily = socket.AF_INET +) -> socket.socket: + return get_port_socket(host, 0, family) + + +def get_port_socket( + host: str, port: int, family: socket.AddressFamily +) -> socket.socket: + s = socket.socket(family, socket.SOCK_STREAM) + if REUSE_ADDRESS: + # Windows has different semantics for SO_REUSEADDR, + # so don't set it. Ref: + # https://docs.microsoft.com/en-us/windows/win32/winsock/using-so-reuseaddr-and-so-exclusiveaddruse + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + s.bind((host, port)) + return s + + +def unused_port() -> int: + """Return a port that is unused on the current host.""" + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.bind(("127.0.0.1", 0)) + return cast(int, s.getsockname()[1]) + + +class BaseTestServer(ABC): + __test__ = False + + def __init__( + self, + *, + scheme: str = "", + loop: Optional[asyncio.AbstractEventLoop] = None, + host: str = "127.0.0.1", + port: Optional[int] = None, + skip_url_asserts: bool = False, + socket_factory: Callable[ + [str, int, socket.AddressFamily], socket.socket + ] = get_port_socket, + **kwargs: Any, + ) -> None: + self._loop = loop + self.runner: Optional[BaseRunner] = None + self._root: Optional[URL] = None + self.host = host + self.port = port + self._closed = False + self.scheme = scheme + self.skip_url_asserts = skip_url_asserts + self.socket_factory = socket_factory + + async def start_server( + self, loop: Optional[asyncio.AbstractEventLoop] = None, **kwargs: Any + ) -> None: + if self.runner: + return + self._loop = loop + self._ssl = kwargs.pop("ssl", None) + self.runner = await self._make_runner(handler_cancellation=True, **kwargs) + await self.runner.setup() + if not self.port: + self.port = 0 + absolute_host = self.host + try: + version = ipaddress.ip_address(self.host).version + except ValueError: + version = 4 + if version == 6: + absolute_host = f"[{self.host}]" + family = socket.AF_INET6 if version == 6 else socket.AF_INET + _sock = self.socket_factory(self.host, self.port, family) + self.host, self.port = _sock.getsockname()[:2] + site = SockSite(self.runner, sock=_sock, ssl_context=self._ssl) + await site.start() + server = site._server + assert server is not None + sockets = server.sockets # type: ignore[attr-defined] + assert sockets is not None + self.port = sockets[0].getsockname()[1] + if not self.scheme: + self.scheme = "https" if self._ssl else "http" + self._root = URL(f"{self.scheme}://{absolute_host}:{self.port}") + + @abstractmethod # pragma: no cover + async def _make_runner(self, **kwargs: Any) -> BaseRunner: + pass + + def make_url(self, path: StrOrURL) -> URL: + assert self._root is not None + url = URL(path) + if not self.skip_url_asserts: + assert not url.absolute + return self._root.join(url) + else: + return URL(str(self._root) + str(path)) + + @property + def started(self) -> bool: + return self.runner is not None + + @property + def closed(self) -> bool: + return self._closed + + @property + def handler(self) -> Server: + # for backward compatibility + # web.Server instance + runner = self.runner + assert runner is not None + assert runner.server is not None + return runner.server + + async def close(self) -> None: + """Close all fixtures created by the test client. + + After that point, the TestClient is no longer usable. + + This is an idempotent function: running close multiple times + will not have any additional effects. + + close is also run when the object is garbage collected, and on + exit when used as a context manager. + + """ + if self.started and not self.closed: + assert self.runner is not None + await self.runner.cleanup() + self._root = None + self.port = None + self._closed = True + + def __enter__(self) -> None: + raise TypeError("Use async with instead") + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_value: Optional[BaseException], + traceback: Optional[TracebackType], + ) -> None: + # __exit__ should exist in pair with __enter__ but never executed + pass # pragma: no cover + + async def __aenter__(self) -> "BaseTestServer": + await self.start_server(loop=self._loop) + return self + + async def __aexit__( + self, + exc_type: Optional[Type[BaseException]], + exc_value: Optional[BaseException], + traceback: Optional[TracebackType], + ) -> None: + await self.close() + + +class TestServer(BaseTestServer): + def __init__( + self, + app: Application, + *, + scheme: str = "", + host: str = "127.0.0.1", + port: Optional[int] = None, + **kwargs: Any, + ): + self.app = app + super().__init__(scheme=scheme, host=host, port=port, **kwargs) + + async def _make_runner(self, **kwargs: Any) -> BaseRunner: + return AppRunner(self.app, **kwargs) + + +class RawTestServer(BaseTestServer): + def __init__( + self, + handler: _RequestHandler, + *, + scheme: str = "", + host: str = "127.0.0.1", + port: Optional[int] = None, + **kwargs: Any, + ) -> None: + self._handler = handler + super().__init__(scheme=scheme, host=host, port=port, **kwargs) + + async def _make_runner(self, debug: bool = True, **kwargs: Any) -> ServerRunner: + srv = Server(self._handler, loop=self._loop, debug=debug, **kwargs) + return ServerRunner(srv, debug=debug, **kwargs) + + +class TestClient(Generic[_Request, _ApplicationNone]): + """ + A test client implementation. + + To write functional tests for aiohttp based servers. + + """ + + __test__ = False + + @overload + def __init__( + self: "TestClient[Request, Application]", + server: TestServer, + *, + cookie_jar: Optional[AbstractCookieJar] = None, + **kwargs: Any, + ) -> None: ... + @overload + def __init__( + self: "TestClient[_Request, None]", + server: BaseTestServer, + *, + cookie_jar: Optional[AbstractCookieJar] = None, + **kwargs: Any, + ) -> None: ... + def __init__( + self, + server: BaseTestServer, + *, + cookie_jar: Optional[AbstractCookieJar] = None, + loop: Optional[asyncio.AbstractEventLoop] = None, + **kwargs: Any, + ) -> None: + if not isinstance(server, BaseTestServer): + raise TypeError( + "server must be TestServer instance, found type: %r" % type(server) + ) + self._server = server + self._loop = loop + if cookie_jar is None: + cookie_jar = aiohttp.CookieJar(unsafe=True, loop=loop) + self._session = ClientSession(loop=loop, cookie_jar=cookie_jar, **kwargs) + self._session._retry_connection = False + self._closed = False + self._responses: List[ClientResponse] = [] + self._websockets: List[ClientWebSocketResponse] = [] + + async def start_server(self) -> None: + await self._server.start_server(loop=self._loop) + + @property + def host(self) -> str: + return self._server.host + + @property + def port(self) -> Optional[int]: + return self._server.port + + @property + def server(self) -> BaseTestServer: + return self._server + + @property + def app(self) -> _ApplicationNone: + return getattr(self._server, "app", None) # type: ignore[return-value] + + @property + def session(self) -> ClientSession: + """An internal aiohttp.ClientSession. + + Unlike the methods on the TestClient, client session requests + do not automatically include the host in the url queried, and + will require an absolute path to the resource. + + """ + return self._session + + def make_url(self, path: StrOrURL) -> URL: + return self._server.make_url(path) + + async def _request( + self, method: str, path: StrOrURL, **kwargs: Any + ) -> ClientResponse: + resp = await self._session.request(method, self.make_url(path), **kwargs) + # save it to close later + self._responses.append(resp) + return resp + + if sys.version_info >= (3, 11) and TYPE_CHECKING: + + def request( + self, method: str, path: StrOrURL, **kwargs: Unpack[_RequestOptions] + ) -> _RequestContextManager: ... + + def get( + self, + path: StrOrURL, + **kwargs: Unpack[_RequestOptions], + ) -> _RequestContextManager: ... + + def options( + self, + path: StrOrURL, + **kwargs: Unpack[_RequestOptions], + ) -> _RequestContextManager: ... + + def head( + self, + path: StrOrURL, + **kwargs: Unpack[_RequestOptions], + ) -> _RequestContextManager: ... + + def post( + self, + path: StrOrURL, + **kwargs: Unpack[_RequestOptions], + ) -> _RequestContextManager: ... + + def put( + self, + path: StrOrURL, + **kwargs: Unpack[_RequestOptions], + ) -> _RequestContextManager: ... + + def patch( + self, + path: StrOrURL, + **kwargs: Unpack[_RequestOptions], + ) -> _RequestContextManager: ... + + def delete( + self, + path: StrOrURL, + **kwargs: Unpack[_RequestOptions], + ) -> _RequestContextManager: ... + + else: + + def request( + self, method: str, path: StrOrURL, **kwargs: Any + ) -> _RequestContextManager: + """Routes a request to tested http server. + + The interface is identical to aiohttp.ClientSession.request, + except the loop kwarg is overridden by the instance used by the + test server. + + """ + return _RequestContextManager(self._request(method, path, **kwargs)) + + def get(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager: + """Perform an HTTP GET request.""" + return _RequestContextManager(self._request(hdrs.METH_GET, path, **kwargs)) + + def post(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager: + """Perform an HTTP POST request.""" + return _RequestContextManager(self._request(hdrs.METH_POST, path, **kwargs)) + + def options(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager: + """Perform an HTTP OPTIONS request.""" + return _RequestContextManager( + self._request(hdrs.METH_OPTIONS, path, **kwargs) + ) + + def head(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager: + """Perform an HTTP HEAD request.""" + return _RequestContextManager(self._request(hdrs.METH_HEAD, path, **kwargs)) + + def put(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager: + """Perform an HTTP PUT request.""" + return _RequestContextManager(self._request(hdrs.METH_PUT, path, **kwargs)) + + def patch(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager: + """Perform an HTTP PATCH request.""" + return _RequestContextManager( + self._request(hdrs.METH_PATCH, path, **kwargs) + ) + + def delete(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager: + """Perform an HTTP PATCH request.""" + return _RequestContextManager( + self._request(hdrs.METH_DELETE, path, **kwargs) + ) + + def ws_connect(self, path: StrOrURL, **kwargs: Any) -> _WSRequestContextManager: + """Initiate websocket connection. + + The api corresponds to aiohttp.ClientSession.ws_connect. + + """ + return _WSRequestContextManager(self._ws_connect(path, **kwargs)) + + async def _ws_connect( + self, path: StrOrURL, **kwargs: Any + ) -> ClientWebSocketResponse: + ws = await self._session.ws_connect(self.make_url(path), **kwargs) + self._websockets.append(ws) + return ws + + async def close(self) -> None: + """Close all fixtures created by the test client. + + After that point, the TestClient is no longer usable. + + This is an idempotent function: running close multiple times + will not have any additional effects. + + close is also run on exit when used as a(n) (asynchronous) + context manager. + + """ + if not self._closed: + for resp in self._responses: + resp.close() + for ws in self._websockets: + await ws.close() + await self._session.close() + await self._server.close() + self._closed = True + + def __enter__(self) -> None: + raise TypeError("Use async with instead") + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc: Optional[BaseException], + tb: Optional[TracebackType], + ) -> None: + # __exit__ should exist in pair with __enter__ but never executed + pass # pragma: no cover + + async def __aenter__(self) -> Self: + await self.start_server() + return self + + async def __aexit__( + self, + exc_type: Optional[Type[BaseException]], + exc: Optional[BaseException], + tb: Optional[TracebackType], + ) -> None: + await self.close() + + +class AioHTTPTestCase(IsolatedAsyncioTestCase): + """A base class to allow for unittest web applications using aiohttp. + + Provides the following: + + * self.client (aiohttp.test_utils.TestClient): an aiohttp test client. + * self.loop (asyncio.BaseEventLoop): the event loop in which the + application and server are running. + * self.app (aiohttp.web.Application): the application returned by + self.get_application() + + Note that the TestClient's methods are asynchronous: you have to + execute function on the test client using asynchronous methods. + """ + + async def get_application(self) -> Application: + """Get application. + + This method should be overridden + to return the aiohttp.web.Application + object to test. + """ + return self.get_app() + + def get_app(self) -> Application: + """Obsolete method used to constructing web application. + + Use .get_application() coroutine instead. + """ + raise RuntimeError("Did you forget to define get_application()?") + + async def asyncSetUp(self) -> None: + self.loop = asyncio.get_running_loop() + return await self.setUpAsync() + + async def setUpAsync(self) -> None: + self.app = await self.get_application() + self.server = await self.get_server(self.app) + self.client = await self.get_client(self.server) + + await self.client.start_server() + + async def asyncTearDown(self) -> None: + return await self.tearDownAsync() + + async def tearDownAsync(self) -> None: + await self.client.close() + + async def get_server(self, app: Application) -> TestServer: + """Return a TestServer instance.""" + return TestServer(app, loop=self.loop) + + async def get_client(self, server: TestServer) -> TestClient[Request, Application]: + """Return a TestClient instance.""" + return TestClient(server, loop=self.loop) + + +def unittest_run_loop(func: Any, *args: Any, **kwargs: Any) -> Any: + """ + A decorator dedicated to use with asynchronous AioHTTPTestCase test methods. + + In 3.8+, this does nothing. + """ + warnings.warn( + "Decorator `@unittest_run_loop` is no longer needed in aiohttp 3.8+", + DeprecationWarning, + stacklevel=2, + ) + return func + + +_LOOP_FACTORY = Callable[[], asyncio.AbstractEventLoop] + + +@contextlib.contextmanager +def loop_context( + loop_factory: _LOOP_FACTORY = asyncio.new_event_loop, fast: bool = False +) -> Iterator[asyncio.AbstractEventLoop]: + """A contextmanager that creates an event_loop, for test purposes. + + Handles the creation and cleanup of a test loop. + """ + loop = setup_test_loop(loop_factory) + yield loop + teardown_test_loop(loop, fast=fast) + + +def setup_test_loop( + loop_factory: _LOOP_FACTORY = asyncio.new_event_loop, +) -> asyncio.AbstractEventLoop: + """Create and return an asyncio.BaseEventLoop instance. + + The caller should also call teardown_test_loop, + once they are done with the loop. + """ + loop = loop_factory() + asyncio.set_event_loop(loop) + return loop + + +def teardown_test_loop(loop: asyncio.AbstractEventLoop, fast: bool = False) -> None: + """Teardown and cleanup an event_loop created by setup_test_loop.""" + closed = loop.is_closed() + if not closed: + loop.call_soon(loop.stop) + loop.run_forever() + loop.close() + + if not fast: + gc.collect() + + asyncio.set_event_loop(None) + + +def _create_app_mock() -> mock.MagicMock: + def get_dict(app: Any, key: str) -> Any: + return app.__app_dict[key] + + def set_dict(app: Any, key: str, value: Any) -> None: + app.__app_dict[key] = value + + app = mock.MagicMock(spec=Application) + app.__app_dict = {} + app.__getitem__ = get_dict + app.__setitem__ = set_dict + + app._debug = False + app.on_response_prepare = Signal(app) + app.on_response_prepare.freeze() + return app + + +def _create_transport(sslcontext: Optional[SSLContext] = None) -> mock.Mock: + transport = mock.Mock() + + def get_extra_info(key: str) -> Optional[SSLContext]: + if key == "sslcontext": + return sslcontext + else: + return None + + transport.get_extra_info.side_effect = get_extra_info + return transport + + +def make_mocked_request( + method: str, + path: str, + headers: Any = None, + *, + match_info: Any = sentinel, + version: HttpVersion = HttpVersion(1, 1), + closing: bool = False, + app: Any = None, + writer: Any = sentinel, + protocol: Any = sentinel, + transport: Any = sentinel, + payload: StreamReader = EMPTY_PAYLOAD, + sslcontext: Optional[SSLContext] = None, + client_max_size: int = 1024**2, + loop: Any = ..., +) -> Request: + """Creates mocked web.Request testing purposes. + + Useful in unit tests, when spinning full web server is overkill or + specific conditions and errors are hard to trigger. + """ + task = mock.Mock() + if loop is ...: + # no loop passed, try to get the current one if + # its is running as we need a real loop to create + # executor jobs to be able to do testing + # with a real executor + try: + loop = asyncio.get_running_loop() + except RuntimeError: + loop = mock.Mock() + loop.create_future.return_value = () + + if version < HttpVersion(1, 1): + closing = True + + if headers: + headers = CIMultiDictProxy(CIMultiDict(headers)) + raw_hdrs = tuple( + (k.encode("utf-8"), v.encode("utf-8")) for k, v in headers.items() + ) + else: + headers = CIMultiDictProxy(CIMultiDict()) + raw_hdrs = () + + chunked = "chunked" in headers.get(hdrs.TRANSFER_ENCODING, "").lower() + + message = RawRequestMessage( + method, + path, + version, + headers, + raw_hdrs, + closing, + None, + False, + chunked, + URL(path), + ) + if app is None: + app = _create_app_mock() + + if transport is sentinel: + transport = _create_transport(sslcontext) + + if protocol is sentinel: + protocol = mock.Mock() + protocol.transport = transport + type(protocol).peername = mock.PropertyMock( + return_value=transport.get_extra_info("peername") + ) + type(protocol).ssl_context = mock.PropertyMock(return_value=sslcontext) + + if writer is sentinel: + writer = mock.Mock() + writer.write_headers = make_mocked_coro(None) + writer.write = make_mocked_coro(None) + writer.write_eof = make_mocked_coro(None) + writer.drain = make_mocked_coro(None) + writer.transport = transport + + protocol.transport = transport + protocol.writer = writer + + req = Request( + message, payload, protocol, writer, task, loop, client_max_size=client_max_size + ) + + match_info = UrlMappingMatchInfo( + {} if match_info is sentinel else match_info, mock.Mock() + ) + match_info.add_app(app) + req._match_info = match_info + + return req + + +def make_mocked_coro( + return_value: Any = sentinel, raise_exception: Any = sentinel +) -> Any: + """Creates a coroutine mock.""" + + async def mock_coro(*args: Any, **kwargs: Any) -> Any: + if raise_exception is not sentinel: + raise raise_exception + if not inspect.isawaitable(return_value): + return return_value + await return_value + + return mock.Mock(wraps=mock_coro) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/tracing.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/tracing.py new file mode 100644 index 0000000..568fa7f --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/tracing.py @@ -0,0 +1,455 @@ +from types import SimpleNamespace +from typing import TYPE_CHECKING, Mapping, Optional, Type, TypeVar + +import attr +from aiosignal import Signal +from multidict import CIMultiDict +from yarl import URL + +from .client_reqrep import ClientResponse + +if TYPE_CHECKING: + from .client import ClientSession + + _ParamT_contra = TypeVar("_ParamT_contra", contravariant=True) + _TracingSignal = Signal[ClientSession, SimpleNamespace, _ParamT_contra] + + +__all__ = ( + "TraceConfig", + "TraceRequestStartParams", + "TraceRequestEndParams", + "TraceRequestExceptionParams", + "TraceConnectionQueuedStartParams", + "TraceConnectionQueuedEndParams", + "TraceConnectionCreateStartParams", + "TraceConnectionCreateEndParams", + "TraceConnectionReuseconnParams", + "TraceDnsResolveHostStartParams", + "TraceDnsResolveHostEndParams", + "TraceDnsCacheHitParams", + "TraceDnsCacheMissParams", + "TraceRequestRedirectParams", + "TraceRequestChunkSentParams", + "TraceResponseChunkReceivedParams", + "TraceRequestHeadersSentParams", +) + + +class TraceConfig: + """First-class used to trace requests launched via ClientSession objects.""" + + def __init__( + self, trace_config_ctx_factory: Type[SimpleNamespace] = SimpleNamespace + ) -> None: + self._on_request_start: _TracingSignal[TraceRequestStartParams] = Signal(self) + self._on_request_chunk_sent: _TracingSignal[TraceRequestChunkSentParams] = ( + Signal(self) + ) + self._on_response_chunk_received: _TracingSignal[ + TraceResponseChunkReceivedParams + ] = Signal(self) + self._on_request_end: _TracingSignal[TraceRequestEndParams] = Signal(self) + self._on_request_exception: _TracingSignal[TraceRequestExceptionParams] = ( + Signal(self) + ) + self._on_request_redirect: _TracingSignal[TraceRequestRedirectParams] = Signal( + self + ) + self._on_connection_queued_start: _TracingSignal[ + TraceConnectionQueuedStartParams + ] = Signal(self) + self._on_connection_queued_end: _TracingSignal[ + TraceConnectionQueuedEndParams + ] = Signal(self) + self._on_connection_create_start: _TracingSignal[ + TraceConnectionCreateStartParams + ] = Signal(self) + self._on_connection_create_end: _TracingSignal[ + TraceConnectionCreateEndParams + ] = Signal(self) + self._on_connection_reuseconn: _TracingSignal[ + TraceConnectionReuseconnParams + ] = Signal(self) + self._on_dns_resolvehost_start: _TracingSignal[ + TraceDnsResolveHostStartParams + ] = Signal(self) + self._on_dns_resolvehost_end: _TracingSignal[TraceDnsResolveHostEndParams] = ( + Signal(self) + ) + self._on_dns_cache_hit: _TracingSignal[TraceDnsCacheHitParams] = Signal(self) + self._on_dns_cache_miss: _TracingSignal[TraceDnsCacheMissParams] = Signal(self) + self._on_request_headers_sent: _TracingSignal[TraceRequestHeadersSentParams] = ( + Signal(self) + ) + + self._trace_config_ctx_factory = trace_config_ctx_factory + + def trace_config_ctx( + self, trace_request_ctx: Optional[Mapping[str, str]] = None + ) -> SimpleNamespace: + """Return a new trace_config_ctx instance""" + return self._trace_config_ctx_factory(trace_request_ctx=trace_request_ctx) + + def freeze(self) -> None: + self._on_request_start.freeze() + self._on_request_chunk_sent.freeze() + self._on_response_chunk_received.freeze() + self._on_request_end.freeze() + self._on_request_exception.freeze() + self._on_request_redirect.freeze() + self._on_connection_queued_start.freeze() + self._on_connection_queued_end.freeze() + self._on_connection_create_start.freeze() + self._on_connection_create_end.freeze() + self._on_connection_reuseconn.freeze() + self._on_dns_resolvehost_start.freeze() + self._on_dns_resolvehost_end.freeze() + self._on_dns_cache_hit.freeze() + self._on_dns_cache_miss.freeze() + self._on_request_headers_sent.freeze() + + @property + def on_request_start(self) -> "_TracingSignal[TraceRequestStartParams]": + return self._on_request_start + + @property + def on_request_chunk_sent( + self, + ) -> "_TracingSignal[TraceRequestChunkSentParams]": + return self._on_request_chunk_sent + + @property + def on_response_chunk_received( + self, + ) -> "_TracingSignal[TraceResponseChunkReceivedParams]": + return self._on_response_chunk_received + + @property + def on_request_end(self) -> "_TracingSignal[TraceRequestEndParams]": + return self._on_request_end + + @property + def on_request_exception( + self, + ) -> "_TracingSignal[TraceRequestExceptionParams]": + return self._on_request_exception + + @property + def on_request_redirect( + self, + ) -> "_TracingSignal[TraceRequestRedirectParams]": + return self._on_request_redirect + + @property + def on_connection_queued_start( + self, + ) -> "_TracingSignal[TraceConnectionQueuedStartParams]": + return self._on_connection_queued_start + + @property + def on_connection_queued_end( + self, + ) -> "_TracingSignal[TraceConnectionQueuedEndParams]": + return self._on_connection_queued_end + + @property + def on_connection_create_start( + self, + ) -> "_TracingSignal[TraceConnectionCreateStartParams]": + return self._on_connection_create_start + + @property + def on_connection_create_end( + self, + ) -> "_TracingSignal[TraceConnectionCreateEndParams]": + return self._on_connection_create_end + + @property + def on_connection_reuseconn( + self, + ) -> "_TracingSignal[TraceConnectionReuseconnParams]": + return self._on_connection_reuseconn + + @property + def on_dns_resolvehost_start( + self, + ) -> "_TracingSignal[TraceDnsResolveHostStartParams]": + return self._on_dns_resolvehost_start + + @property + def on_dns_resolvehost_end( + self, + ) -> "_TracingSignal[TraceDnsResolveHostEndParams]": + return self._on_dns_resolvehost_end + + @property + def on_dns_cache_hit(self) -> "_TracingSignal[TraceDnsCacheHitParams]": + return self._on_dns_cache_hit + + @property + def on_dns_cache_miss(self) -> "_TracingSignal[TraceDnsCacheMissParams]": + return self._on_dns_cache_miss + + @property + def on_request_headers_sent( + self, + ) -> "_TracingSignal[TraceRequestHeadersSentParams]": + return self._on_request_headers_sent + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceRequestStartParams: + """Parameters sent by the `on_request_start` signal""" + + method: str + url: URL + headers: "CIMultiDict[str]" + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceRequestChunkSentParams: + """Parameters sent by the `on_request_chunk_sent` signal""" + + method: str + url: URL + chunk: bytes + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceResponseChunkReceivedParams: + """Parameters sent by the `on_response_chunk_received` signal""" + + method: str + url: URL + chunk: bytes + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceRequestEndParams: + """Parameters sent by the `on_request_end` signal""" + + method: str + url: URL + headers: "CIMultiDict[str]" + response: ClientResponse + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceRequestExceptionParams: + """Parameters sent by the `on_request_exception` signal""" + + method: str + url: URL + headers: "CIMultiDict[str]" + exception: BaseException + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceRequestRedirectParams: + """Parameters sent by the `on_request_redirect` signal""" + + method: str + url: URL + headers: "CIMultiDict[str]" + response: ClientResponse + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceConnectionQueuedStartParams: + """Parameters sent by the `on_connection_queued_start` signal""" + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceConnectionQueuedEndParams: + """Parameters sent by the `on_connection_queued_end` signal""" + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceConnectionCreateStartParams: + """Parameters sent by the `on_connection_create_start` signal""" + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceConnectionCreateEndParams: + """Parameters sent by the `on_connection_create_end` signal""" + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceConnectionReuseconnParams: + """Parameters sent by the `on_connection_reuseconn` signal""" + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceDnsResolveHostStartParams: + """Parameters sent by the `on_dns_resolvehost_start` signal""" + + host: str + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceDnsResolveHostEndParams: + """Parameters sent by the `on_dns_resolvehost_end` signal""" + + host: str + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceDnsCacheHitParams: + """Parameters sent by the `on_dns_cache_hit` signal""" + + host: str + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceDnsCacheMissParams: + """Parameters sent by the `on_dns_cache_miss` signal""" + + host: str + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceRequestHeadersSentParams: + """Parameters sent by the `on_request_headers_sent` signal""" + + method: str + url: URL + headers: "CIMultiDict[str]" + + +class Trace: + """Internal dependency holder class. + + Used to keep together the main dependencies used + at the moment of send a signal. + """ + + def __init__( + self, + session: "ClientSession", + trace_config: TraceConfig, + trace_config_ctx: SimpleNamespace, + ) -> None: + self._trace_config = trace_config + self._trace_config_ctx = trace_config_ctx + self._session = session + + async def send_request_start( + self, method: str, url: URL, headers: "CIMultiDict[str]" + ) -> None: + return await self._trace_config.on_request_start.send( + self._session, + self._trace_config_ctx, + TraceRequestStartParams(method, url, headers), + ) + + async def send_request_chunk_sent( + self, method: str, url: URL, chunk: bytes + ) -> None: + return await self._trace_config.on_request_chunk_sent.send( + self._session, + self._trace_config_ctx, + TraceRequestChunkSentParams(method, url, chunk), + ) + + async def send_response_chunk_received( + self, method: str, url: URL, chunk: bytes + ) -> None: + return await self._trace_config.on_response_chunk_received.send( + self._session, + self._trace_config_ctx, + TraceResponseChunkReceivedParams(method, url, chunk), + ) + + async def send_request_end( + self, + method: str, + url: URL, + headers: "CIMultiDict[str]", + response: ClientResponse, + ) -> None: + return await self._trace_config.on_request_end.send( + self._session, + self._trace_config_ctx, + TraceRequestEndParams(method, url, headers, response), + ) + + async def send_request_exception( + self, + method: str, + url: URL, + headers: "CIMultiDict[str]", + exception: BaseException, + ) -> None: + return await self._trace_config.on_request_exception.send( + self._session, + self._trace_config_ctx, + TraceRequestExceptionParams(method, url, headers, exception), + ) + + async def send_request_redirect( + self, + method: str, + url: URL, + headers: "CIMultiDict[str]", + response: ClientResponse, + ) -> None: + return await self._trace_config._on_request_redirect.send( + self._session, + self._trace_config_ctx, + TraceRequestRedirectParams(method, url, headers, response), + ) + + async def send_connection_queued_start(self) -> None: + return await self._trace_config.on_connection_queued_start.send( + self._session, self._trace_config_ctx, TraceConnectionQueuedStartParams() + ) + + async def send_connection_queued_end(self) -> None: + return await self._trace_config.on_connection_queued_end.send( + self._session, self._trace_config_ctx, TraceConnectionQueuedEndParams() + ) + + async def send_connection_create_start(self) -> None: + return await self._trace_config.on_connection_create_start.send( + self._session, self._trace_config_ctx, TraceConnectionCreateStartParams() + ) + + async def send_connection_create_end(self) -> None: + return await self._trace_config.on_connection_create_end.send( + self._session, self._trace_config_ctx, TraceConnectionCreateEndParams() + ) + + async def send_connection_reuseconn(self) -> None: + return await self._trace_config.on_connection_reuseconn.send( + self._session, self._trace_config_ctx, TraceConnectionReuseconnParams() + ) + + async def send_dns_resolvehost_start(self, host: str) -> None: + return await self._trace_config.on_dns_resolvehost_start.send( + self._session, self._trace_config_ctx, TraceDnsResolveHostStartParams(host) + ) + + async def send_dns_resolvehost_end(self, host: str) -> None: + return await self._trace_config.on_dns_resolvehost_end.send( + self._session, self._trace_config_ctx, TraceDnsResolveHostEndParams(host) + ) + + async def send_dns_cache_hit(self, host: str) -> None: + return await self._trace_config.on_dns_cache_hit.send( + self._session, self._trace_config_ctx, TraceDnsCacheHitParams(host) + ) + + async def send_dns_cache_miss(self, host: str) -> None: + return await self._trace_config.on_dns_cache_miss.send( + self._session, self._trace_config_ctx, TraceDnsCacheMissParams(host) + ) + + async def send_request_headers( + self, method: str, url: URL, headers: "CIMultiDict[str]" + ) -> None: + return await self._trace_config._on_request_headers_sent.send( + self._session, + self._trace_config_ctx, + TraceRequestHeadersSentParams(method, url, headers), + ) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/typedefs.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/typedefs.py new file mode 100644 index 0000000..cc8c082 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/typedefs.py @@ -0,0 +1,69 @@ +import json +import os +from typing import ( + TYPE_CHECKING, + Any, + Awaitable, + Callable, + Iterable, + Mapping, + Protocol, + Tuple, + Union, +) + +from multidict import CIMultiDict, CIMultiDictProxy, MultiDict, MultiDictProxy, istr +from yarl import URL, Query as _Query + +Query = _Query + +DEFAULT_JSON_ENCODER = json.dumps +DEFAULT_JSON_DECODER = json.loads + +if TYPE_CHECKING: + _CIMultiDict = CIMultiDict[str] + _CIMultiDictProxy = CIMultiDictProxy[str] + _MultiDict = MultiDict[str] + _MultiDictProxy = MultiDictProxy[str] + from http.cookies import BaseCookie, Morsel + + from .web import Request, StreamResponse +else: + _CIMultiDict = CIMultiDict + _CIMultiDictProxy = CIMultiDictProxy + _MultiDict = MultiDict + _MultiDictProxy = MultiDictProxy + +Byteish = Union[bytes, bytearray, memoryview] +JSONEncoder = Callable[[Any], str] +JSONDecoder = Callable[[str], Any] +LooseHeaders = Union[ + Mapping[str, str], + Mapping[istr, str], + _CIMultiDict, + _CIMultiDictProxy, + Iterable[Tuple[Union[str, istr], str]], +] +RawHeaders = Tuple[Tuple[bytes, bytes], ...] +StrOrURL = Union[str, URL] + +LooseCookiesMappings = Mapping[str, Union[str, "BaseCookie[str]", "Morsel[Any]"]] +LooseCookiesIterables = Iterable[ + Tuple[str, Union[str, "BaseCookie[str]", "Morsel[Any]"]] +] +LooseCookies = Union[ + LooseCookiesMappings, + LooseCookiesIterables, + "BaseCookie[str]", +] + +Handler = Callable[["Request"], Awaitable["StreamResponse"]] + + +class Middleware(Protocol): + def __call__( + self, request: "Request", handler: Handler + ) -> Awaitable["StreamResponse"]: ... + + +PathLike = Union[str, "os.PathLike[str]"] diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web.py new file mode 100644 index 0000000..5a1fc96 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web.py @@ -0,0 +1,592 @@ +import asyncio +import logging +import os +import socket +import sys +import warnings +from argparse import ArgumentParser +from collections.abc import Iterable +from contextlib import suppress +from importlib import import_module +from typing import ( + TYPE_CHECKING, + Any, + Awaitable, + Callable, + Iterable as TypingIterable, + List, + Optional, + Set, + Type, + Union, + cast, +) + +from .abc import AbstractAccessLogger +from .helpers import AppKey as AppKey +from .log import access_logger +from .typedefs import PathLike +from .web_app import Application as Application, CleanupError as CleanupError +from .web_exceptions import ( + HTTPAccepted as HTTPAccepted, + HTTPBadGateway as HTTPBadGateway, + HTTPBadRequest as HTTPBadRequest, + HTTPClientError as HTTPClientError, + HTTPConflict as HTTPConflict, + HTTPCreated as HTTPCreated, + HTTPError as HTTPError, + HTTPException as HTTPException, + HTTPExpectationFailed as HTTPExpectationFailed, + HTTPFailedDependency as HTTPFailedDependency, + HTTPForbidden as HTTPForbidden, + HTTPFound as HTTPFound, + HTTPGatewayTimeout as HTTPGatewayTimeout, + HTTPGone as HTTPGone, + HTTPInsufficientStorage as HTTPInsufficientStorage, + HTTPInternalServerError as HTTPInternalServerError, + HTTPLengthRequired as HTTPLengthRequired, + HTTPMethodNotAllowed as HTTPMethodNotAllowed, + HTTPMisdirectedRequest as HTTPMisdirectedRequest, + HTTPMove as HTTPMove, + HTTPMovedPermanently as HTTPMovedPermanently, + HTTPMultipleChoices as HTTPMultipleChoices, + HTTPNetworkAuthenticationRequired as HTTPNetworkAuthenticationRequired, + HTTPNoContent as HTTPNoContent, + HTTPNonAuthoritativeInformation as HTTPNonAuthoritativeInformation, + HTTPNotAcceptable as HTTPNotAcceptable, + HTTPNotExtended as HTTPNotExtended, + HTTPNotFound as HTTPNotFound, + HTTPNotImplemented as HTTPNotImplemented, + HTTPNotModified as HTTPNotModified, + HTTPOk as HTTPOk, + HTTPPartialContent as HTTPPartialContent, + HTTPPaymentRequired as HTTPPaymentRequired, + HTTPPermanentRedirect as HTTPPermanentRedirect, + HTTPPreconditionFailed as HTTPPreconditionFailed, + HTTPPreconditionRequired as HTTPPreconditionRequired, + HTTPProxyAuthenticationRequired as HTTPProxyAuthenticationRequired, + HTTPRedirection as HTTPRedirection, + HTTPRequestEntityTooLarge as HTTPRequestEntityTooLarge, + HTTPRequestHeaderFieldsTooLarge as HTTPRequestHeaderFieldsTooLarge, + HTTPRequestRangeNotSatisfiable as HTTPRequestRangeNotSatisfiable, + HTTPRequestTimeout as HTTPRequestTimeout, + HTTPRequestURITooLong as HTTPRequestURITooLong, + HTTPResetContent as HTTPResetContent, + HTTPSeeOther as HTTPSeeOther, + HTTPServerError as HTTPServerError, + HTTPServiceUnavailable as HTTPServiceUnavailable, + HTTPSuccessful as HTTPSuccessful, + HTTPTemporaryRedirect as HTTPTemporaryRedirect, + HTTPTooManyRequests as HTTPTooManyRequests, + HTTPUnauthorized as HTTPUnauthorized, + HTTPUnavailableForLegalReasons as HTTPUnavailableForLegalReasons, + HTTPUnprocessableEntity as HTTPUnprocessableEntity, + HTTPUnsupportedMediaType as HTTPUnsupportedMediaType, + HTTPUpgradeRequired as HTTPUpgradeRequired, + HTTPUseProxy as HTTPUseProxy, + HTTPVariantAlsoNegotiates as HTTPVariantAlsoNegotiates, + HTTPVersionNotSupported as HTTPVersionNotSupported, + NotAppKeyWarning as NotAppKeyWarning, +) +from .web_fileresponse import FileResponse as FileResponse +from .web_log import AccessLogger +from .web_middlewares import ( + middleware as middleware, + normalize_path_middleware as normalize_path_middleware, +) +from .web_protocol import ( + PayloadAccessError as PayloadAccessError, + RequestHandler as RequestHandler, + RequestPayloadError as RequestPayloadError, +) +from .web_request import ( + BaseRequest as BaseRequest, + FileField as FileField, + Request as Request, +) +from .web_response import ( + ContentCoding as ContentCoding, + Response as Response, + StreamResponse as StreamResponse, + json_response as json_response, +) +from .web_routedef import ( + AbstractRouteDef as AbstractRouteDef, + RouteDef as RouteDef, + RouteTableDef as RouteTableDef, + StaticDef as StaticDef, + delete as delete, + get as get, + head as head, + options as options, + patch as patch, + post as post, + put as put, + route as route, + static as static, + view as view, +) +from .web_runner import ( + AppRunner as AppRunner, + BaseRunner as BaseRunner, + BaseSite as BaseSite, + GracefulExit as GracefulExit, + NamedPipeSite as NamedPipeSite, + ServerRunner as ServerRunner, + SockSite as SockSite, + TCPSite as TCPSite, + UnixSite as UnixSite, +) +from .web_server import Server as Server +from .web_urldispatcher import ( + AbstractResource as AbstractResource, + AbstractRoute as AbstractRoute, + DynamicResource as DynamicResource, + PlainResource as PlainResource, + PrefixedSubAppResource as PrefixedSubAppResource, + Resource as Resource, + ResourceRoute as ResourceRoute, + StaticResource as StaticResource, + UrlDispatcher as UrlDispatcher, + UrlMappingMatchInfo as UrlMappingMatchInfo, + View as View, +) +from .web_ws import ( + WebSocketReady as WebSocketReady, + WebSocketResponse as WebSocketResponse, + WSMsgType as WSMsgType, +) + +__all__ = ( + # web_app + "AppKey", + "Application", + "CleanupError", + # web_exceptions + "NotAppKeyWarning", + "HTTPAccepted", + "HTTPBadGateway", + "HTTPBadRequest", + "HTTPClientError", + "HTTPConflict", + "HTTPCreated", + "HTTPError", + "HTTPException", + "HTTPExpectationFailed", + "HTTPFailedDependency", + "HTTPForbidden", + "HTTPFound", + "HTTPGatewayTimeout", + "HTTPGone", + "HTTPInsufficientStorage", + "HTTPInternalServerError", + "HTTPLengthRequired", + "HTTPMethodNotAllowed", + "HTTPMisdirectedRequest", + "HTTPMove", + "HTTPMovedPermanently", + "HTTPMultipleChoices", + "HTTPNetworkAuthenticationRequired", + "HTTPNoContent", + "HTTPNonAuthoritativeInformation", + "HTTPNotAcceptable", + "HTTPNotExtended", + "HTTPNotFound", + "HTTPNotImplemented", + "HTTPNotModified", + "HTTPOk", + "HTTPPartialContent", + "HTTPPaymentRequired", + "HTTPPermanentRedirect", + "HTTPPreconditionFailed", + "HTTPPreconditionRequired", + "HTTPProxyAuthenticationRequired", + "HTTPRedirection", + "HTTPRequestEntityTooLarge", + "HTTPRequestHeaderFieldsTooLarge", + "HTTPRequestRangeNotSatisfiable", + "HTTPRequestTimeout", + "HTTPRequestURITooLong", + "HTTPResetContent", + "HTTPSeeOther", + "HTTPServerError", + "HTTPServiceUnavailable", + "HTTPSuccessful", + "HTTPTemporaryRedirect", + "HTTPTooManyRequests", + "HTTPUnauthorized", + "HTTPUnavailableForLegalReasons", + "HTTPUnprocessableEntity", + "HTTPUnsupportedMediaType", + "HTTPUpgradeRequired", + "HTTPUseProxy", + "HTTPVariantAlsoNegotiates", + "HTTPVersionNotSupported", + # web_fileresponse + "FileResponse", + # web_middlewares + "middleware", + "normalize_path_middleware", + # web_protocol + "PayloadAccessError", + "RequestHandler", + "RequestPayloadError", + # web_request + "BaseRequest", + "FileField", + "Request", + # web_response + "ContentCoding", + "Response", + "StreamResponse", + "json_response", + # web_routedef + "AbstractRouteDef", + "RouteDef", + "RouteTableDef", + "StaticDef", + "delete", + "get", + "head", + "options", + "patch", + "post", + "put", + "route", + "static", + "view", + # web_runner + "AppRunner", + "BaseRunner", + "BaseSite", + "GracefulExit", + "ServerRunner", + "SockSite", + "TCPSite", + "UnixSite", + "NamedPipeSite", + # web_server + "Server", + # web_urldispatcher + "AbstractResource", + "AbstractRoute", + "DynamicResource", + "PlainResource", + "PrefixedSubAppResource", + "Resource", + "ResourceRoute", + "StaticResource", + "UrlDispatcher", + "UrlMappingMatchInfo", + "View", + # web_ws + "WebSocketReady", + "WebSocketResponse", + "WSMsgType", + # web + "run_app", +) + + +if TYPE_CHECKING: + from ssl import SSLContext +else: + try: + from ssl import SSLContext + except ImportError: # pragma: no cover + SSLContext = object # type: ignore[misc,assignment] + +# Only display warning when using -Wdefault, -We, -X dev or similar. +warnings.filterwarnings("ignore", category=NotAppKeyWarning, append=True) + +HostSequence = TypingIterable[str] + + +async def _run_app( + app: Union[Application, Awaitable[Application]], + *, + host: Optional[Union[str, HostSequence]] = None, + port: Optional[int] = None, + path: Union[PathLike, TypingIterable[PathLike], None] = None, + sock: Optional[Union[socket.socket, TypingIterable[socket.socket]]] = None, + ssl_context: Optional[SSLContext] = None, + print: Optional[Callable[..., None]] = print, + backlog: int = 128, + reuse_address: Optional[bool] = None, + reuse_port: Optional[bool] = None, + **kwargs: Any, # TODO(PY311): Use Unpack +) -> None: + # An internal function to actually do all dirty job for application running + if asyncio.iscoroutine(app): + app = await app + + app = cast(Application, app) + + runner = AppRunner(app, **kwargs) + + await runner.setup() + + sites: List[BaseSite] = [] + + try: + if host is not None: + if isinstance(host, str): + sites.append( + TCPSite( + runner, + host, + port, + ssl_context=ssl_context, + backlog=backlog, + reuse_address=reuse_address, + reuse_port=reuse_port, + ) + ) + else: + for h in host: + sites.append( + TCPSite( + runner, + h, + port, + ssl_context=ssl_context, + backlog=backlog, + reuse_address=reuse_address, + reuse_port=reuse_port, + ) + ) + elif path is None and sock is None or port is not None: + sites.append( + TCPSite( + runner, + port=port, + ssl_context=ssl_context, + backlog=backlog, + reuse_address=reuse_address, + reuse_port=reuse_port, + ) + ) + + if path is not None: + if isinstance(path, (str, os.PathLike)): + sites.append( + UnixSite( + runner, + path, + ssl_context=ssl_context, + backlog=backlog, + ) + ) + else: + for p in path: + sites.append( + UnixSite( + runner, + p, + ssl_context=ssl_context, + backlog=backlog, + ) + ) + + if sock is not None: + if not isinstance(sock, Iterable): + sites.append( + SockSite( + runner, + sock, + ssl_context=ssl_context, + backlog=backlog, + ) + ) + else: + for s in sock: + sites.append( + SockSite( + runner, + s, + ssl_context=ssl_context, + backlog=backlog, + ) + ) + for site in sites: + await site.start() + + if print: # pragma: no branch + names = sorted(str(s.name) for s in runner.sites) + print( + "======== Running on {} ========\n" + "(Press CTRL+C to quit)".format(", ".join(names)) + ) + + # sleep forever by 1 hour intervals, + while True: + await asyncio.sleep(3600) + finally: + await runner.cleanup() + + +def _cancel_tasks( + to_cancel: Set["asyncio.Task[Any]"], loop: asyncio.AbstractEventLoop +) -> None: + if not to_cancel: + return + + for task in to_cancel: + task.cancel() + + loop.run_until_complete(asyncio.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, + } + ) + + +def run_app( + app: Union[Application, Awaitable[Application]], + *, + host: Optional[Union[str, HostSequence]] = None, + port: Optional[int] = None, + path: Union[PathLike, TypingIterable[PathLike], None] = None, + sock: Optional[Union[socket.socket, TypingIterable[socket.socket]]] = None, + shutdown_timeout: float = 60.0, + keepalive_timeout: float = 75.0, + ssl_context: Optional[SSLContext] = None, + print: Optional[Callable[..., None]] = print, + backlog: int = 128, + access_log_class: Type[AbstractAccessLogger] = AccessLogger, + access_log_format: str = AccessLogger.LOG_FORMAT, + access_log: Optional[logging.Logger] = access_logger, + handle_signals: bool = True, + reuse_address: Optional[bool] = None, + reuse_port: Optional[bool] = None, + handler_cancellation: bool = False, + loop: Optional[asyncio.AbstractEventLoop] = None, + **kwargs: Any, +) -> None: + """Run an app locally""" + if loop is None: + loop = asyncio.new_event_loop() + + # Configure if and only if in debugging mode and using the default logger + if loop.get_debug() and access_log and access_log.name == "aiohttp.access": + if access_log.level == logging.NOTSET: + access_log.setLevel(logging.DEBUG) + if not access_log.hasHandlers(): + access_log.addHandler(logging.StreamHandler()) + + main_task = loop.create_task( + _run_app( + app, + host=host, + port=port, + path=path, + sock=sock, + shutdown_timeout=shutdown_timeout, + keepalive_timeout=keepalive_timeout, + ssl_context=ssl_context, + print=print, + backlog=backlog, + access_log_class=access_log_class, + access_log_format=access_log_format, + access_log=access_log, + handle_signals=handle_signals, + reuse_address=reuse_address, + reuse_port=reuse_port, + handler_cancellation=handler_cancellation, + **kwargs, + ) + ) + + try: + asyncio.set_event_loop(loop) + loop.run_until_complete(main_task) + except (GracefulExit, KeyboardInterrupt): # pragma: no cover + pass + finally: + try: + main_task.cancel() + with suppress(asyncio.CancelledError): + loop.run_until_complete(main_task) + finally: + _cancel_tasks(asyncio.all_tasks(loop), loop) + loop.run_until_complete(loop.shutdown_asyncgens()) + loop.close() + + +def main(argv: List[str]) -> None: + arg_parser = ArgumentParser( + description="aiohttp.web Application server", prog="aiohttp.web" + ) + arg_parser.add_argument( + "entry_func", + help=( + "Callable returning the `aiohttp.web.Application` instance to " + "run. Should be specified in the 'module:function' syntax." + ), + metavar="entry-func", + ) + arg_parser.add_argument( + "-H", + "--hostname", + help="TCP/IP hostname to serve on (default: localhost)", + default=None, + ) + arg_parser.add_argument( + "-P", + "--port", + help="TCP/IP port to serve on (default: %(default)r)", + type=int, + default=8080, + ) + arg_parser.add_argument( + "-U", + "--path", + help="Unix file system path to serve on. Can be combined with hostname " + "to serve on both Unix and TCP.", + ) + args, extra_argv = arg_parser.parse_known_args(argv) + + # Import logic + mod_str, _, func_str = args.entry_func.partition(":") + if not func_str or not mod_str: + arg_parser.error("'entry-func' not in 'module:function' syntax") + if mod_str.startswith("."): + arg_parser.error("relative module names not supported") + try: + module = import_module(mod_str) + except ImportError as ex: + arg_parser.error(f"unable to import {mod_str}: {ex}") + try: + func = getattr(module, func_str) + except AttributeError: + arg_parser.error(f"module {mod_str!r} has no attribute {func_str!r}") + + # Compatibility logic + if args.path is not None and not hasattr(socket, "AF_UNIX"): + arg_parser.error( + "file system paths not supported by your operating environment" + ) + + logging.basicConfig(level=logging.DEBUG) + + if args.path and args.hostname is None: + host = port = None + else: + host = args.hostname or "localhost" + port = args.port + + app = func(extra_argv) + run_app(app, host=host, port=port, path=args.path) + arg_parser.exit(message="Stopped\n") + + +if __name__ == "__main__": # pragma: no branch + main(sys.argv[1:]) # pragma: no cover diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_app.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_app.py new file mode 100644 index 0000000..619c008 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_app.py @@ -0,0 +1,620 @@ +import asyncio +import logging +import warnings +from functools import lru_cache, partial, update_wrapper +from typing import ( + TYPE_CHECKING, + Any, + AsyncIterator, + Awaitable, + Callable, + Dict, + Iterable, + Iterator, + List, + Mapping, + MutableMapping, + Optional, + Sequence, + Tuple, + Type, + TypeVar, + Union, + cast, + overload, +) + +from aiosignal import Signal +from frozenlist import FrozenList + +from . import hdrs +from .abc import ( + AbstractAccessLogger, + AbstractMatchInfo, + AbstractRouter, + AbstractStreamWriter, +) +from .helpers import DEBUG, AppKey +from .http_parser import RawRequestMessage +from .log import web_logger +from .streams import StreamReader +from .typedefs import Handler, Middleware +from .web_exceptions import NotAppKeyWarning +from .web_log import AccessLogger +from .web_middlewares import _fix_request_current_app +from .web_protocol import RequestHandler +from .web_request import Request +from .web_response import StreamResponse +from .web_routedef import AbstractRouteDef +from .web_server import Server +from .web_urldispatcher import ( + AbstractResource, + AbstractRoute, + Domain, + MaskDomain, + MatchedSubAppResource, + PrefixedSubAppResource, + SystemRoute, + UrlDispatcher, +) + +__all__ = ("Application", "CleanupError") + + +if TYPE_CHECKING: + _AppSignal = Signal["Application"] + _RespPrepareSignal = Signal[Request, StreamResponse] + _Middlewares = FrozenList[Middleware] + _MiddlewaresHandlers = Optional[Sequence[Tuple[Middleware, bool]]] + _Subapps = List["Application"] +else: + # No type checker mode, skip types + _AppSignal = Signal + _RespPrepareSignal = Signal + _Middlewares = FrozenList + _MiddlewaresHandlers = Optional[Sequence] + _Subapps = List + +_T = TypeVar("_T") +_U = TypeVar("_U") +_Resource = TypeVar("_Resource", bound=AbstractResource) + + +def _build_middlewares( + handler: Handler, apps: Tuple["Application", ...] +) -> Callable[[Request], Awaitable[StreamResponse]]: + """Apply middlewares to handler.""" + for app in apps[::-1]: + for m, _ in app._middlewares_handlers: # type: ignore[union-attr] + handler = update_wrapper(partial(m, handler=handler), handler) + return handler + + +_cached_build_middleware = lru_cache(maxsize=1024)(_build_middlewares) + + +class Application(MutableMapping[Union[str, AppKey[Any]], Any]): + ATTRS = frozenset( + [ + "logger", + "_debug", + "_router", + "_loop", + "_handler_args", + "_middlewares", + "_middlewares_handlers", + "_has_legacy_middlewares", + "_run_middlewares", + "_state", + "_frozen", + "_pre_frozen", + "_subapps", + "_on_response_prepare", + "_on_startup", + "_on_shutdown", + "_on_cleanup", + "_client_max_size", + "_cleanup_ctx", + ] + ) + + def __init__( + self, + *, + logger: logging.Logger = web_logger, + router: Optional[UrlDispatcher] = None, + middlewares: Iterable[Middleware] = (), + handler_args: Optional[Mapping[str, Any]] = None, + client_max_size: int = 1024**2, + loop: Optional[asyncio.AbstractEventLoop] = None, + debug: Any = ..., # mypy doesn't support ellipsis + ) -> None: + if router is None: + router = UrlDispatcher() + else: + warnings.warn( + "router argument is deprecated", DeprecationWarning, stacklevel=2 + ) + assert isinstance(router, AbstractRouter), router + + if loop is not None: + warnings.warn( + "loop argument is deprecated", DeprecationWarning, stacklevel=2 + ) + + if debug is not ...: + warnings.warn( + "debug argument is deprecated", DeprecationWarning, stacklevel=2 + ) + self._debug = debug + self._router: UrlDispatcher = router + self._loop = loop + self._handler_args = handler_args + self.logger = logger + + self._middlewares: _Middlewares = FrozenList(middlewares) + + # initialized on freezing + self._middlewares_handlers: _MiddlewaresHandlers = None + # initialized on freezing + self._run_middlewares: Optional[bool] = None + self._has_legacy_middlewares: bool = True + + self._state: Dict[Union[AppKey[Any], str], object] = {} + self._frozen = False + self._pre_frozen = False + self._subapps: _Subapps = [] + + self._on_response_prepare: _RespPrepareSignal = Signal(self) + self._on_startup: _AppSignal = Signal(self) + self._on_shutdown: _AppSignal = Signal(self) + self._on_cleanup: _AppSignal = Signal(self) + self._cleanup_ctx = CleanupContext() + self._on_startup.append(self._cleanup_ctx._on_startup) + self._on_cleanup.append(self._cleanup_ctx._on_cleanup) + self._client_max_size = client_max_size + + def __init_subclass__(cls: Type["Application"]) -> None: + warnings.warn( + "Inheritance class {} from web.Application " + "is discouraged".format(cls.__name__), + DeprecationWarning, + stacklevel=3, + ) + + if DEBUG: # pragma: no cover + + def __setattr__(self, name: str, val: Any) -> None: + if name not in self.ATTRS: + warnings.warn( + "Setting custom web.Application.{} attribute " + "is discouraged".format(name), + DeprecationWarning, + stacklevel=2, + ) + super().__setattr__(name, val) + + # MutableMapping API + + def __eq__(self, other: object) -> bool: + return self is other + + @overload # type: ignore[override] + def __getitem__(self, key: AppKey[_T]) -> _T: ... + + @overload + def __getitem__(self, key: str) -> Any: ... + + def __getitem__(self, key: Union[str, AppKey[_T]]) -> Any: + return self._state[key] + + def _check_frozen(self) -> None: + if self._frozen: + warnings.warn( + "Changing state of started or joined application is deprecated", + DeprecationWarning, + stacklevel=3, + ) + + @overload # type: ignore[override] + def __setitem__(self, key: AppKey[_T], value: _T) -> None: ... + + @overload + def __setitem__(self, key: str, value: Any) -> None: ... + + def __setitem__(self, key: Union[str, AppKey[_T]], value: Any) -> None: + self._check_frozen() + if not isinstance(key, AppKey): + warnings.warn( + "It is recommended to use web.AppKey instances for keys.\n" + + "https://docs.aiohttp.org/en/stable/web_advanced.html" + + "#application-s-config", + category=NotAppKeyWarning, + stacklevel=2, + ) + self._state[key] = value + + def __delitem__(self, key: Union[str, AppKey[_T]]) -> None: + self._check_frozen() + del self._state[key] + + def __len__(self) -> int: + return len(self._state) + + def __iter__(self) -> Iterator[Union[str, AppKey[Any]]]: + return iter(self._state) + + def __hash__(self) -> int: + return id(self) + + @overload # type: ignore[override] + def get(self, key: AppKey[_T], default: None = ...) -> Optional[_T]: ... + + @overload + def get(self, key: AppKey[_T], default: _U) -> Union[_T, _U]: ... + + @overload + def get(self, key: str, default: Any = ...) -> Any: ... + + def get(self, key: Union[str, AppKey[_T]], default: Any = None) -> Any: + return self._state.get(key, default) + + ######## + @property + def loop(self) -> asyncio.AbstractEventLoop: + # Technically the loop can be None + # but we mask it by explicit type cast + # to provide more convenient type annotation + warnings.warn("loop property is deprecated", DeprecationWarning, stacklevel=2) + return cast(asyncio.AbstractEventLoop, self._loop) + + def _set_loop(self, loop: Optional[asyncio.AbstractEventLoop]) -> None: + if loop is None: + loop = asyncio.get_event_loop() + if self._loop is not None and self._loop is not loop: + raise RuntimeError( + "web.Application instance initialized with different loop" + ) + + self._loop = loop + + # set loop debug + if self._debug is ...: + self._debug = loop.get_debug() + + # set loop to sub applications + for subapp in self._subapps: + subapp._set_loop(loop) + + @property + def pre_frozen(self) -> bool: + return self._pre_frozen + + def pre_freeze(self) -> None: + if self._pre_frozen: + return + + self._pre_frozen = True + self._middlewares.freeze() + self._router.freeze() + self._on_response_prepare.freeze() + self._cleanup_ctx.freeze() + self._on_startup.freeze() + self._on_shutdown.freeze() + self._on_cleanup.freeze() + self._middlewares_handlers = tuple(self._prepare_middleware()) + self._has_legacy_middlewares = any( + not new_style for _, new_style in self._middlewares_handlers + ) + + # If current app and any subapp do not have middlewares avoid run all + # of the code footprint that it implies, which have a middleware + # hardcoded per app that sets up the current_app attribute. If no + # middlewares are configured the handler will receive the proper + # current_app without needing all of this code. + self._run_middlewares = True if self.middlewares else False + + for subapp in self._subapps: + subapp.pre_freeze() + self._run_middlewares = self._run_middlewares or subapp._run_middlewares + + @property + def frozen(self) -> bool: + return self._frozen + + def freeze(self) -> None: + if self._frozen: + return + + self.pre_freeze() + self._frozen = True + for subapp in self._subapps: + subapp.freeze() + + @property + def debug(self) -> bool: + warnings.warn("debug property is deprecated", DeprecationWarning, stacklevel=2) + return self._debug # type: ignore[no-any-return] + + def _reg_subapp_signals(self, subapp: "Application") -> None: + def reg_handler(signame: str) -> None: + subsig = getattr(subapp, signame) + + async def handler(app: "Application") -> None: + await subsig.send(subapp) + + appsig = getattr(self, signame) + appsig.append(handler) + + reg_handler("on_startup") + reg_handler("on_shutdown") + reg_handler("on_cleanup") + + def add_subapp(self, prefix: str, subapp: "Application") -> PrefixedSubAppResource: + if not isinstance(prefix, str): + raise TypeError("Prefix must be str") + prefix = prefix.rstrip("/") + if not prefix: + raise ValueError("Prefix cannot be empty") + factory = partial(PrefixedSubAppResource, prefix, subapp) + return self._add_subapp(factory, subapp) + + def _add_subapp( + self, resource_factory: Callable[[], _Resource], subapp: "Application" + ) -> _Resource: + if self.frozen: + raise RuntimeError("Cannot add sub application to frozen application") + if subapp.frozen: + raise RuntimeError("Cannot add frozen application") + resource = resource_factory() + self.router.register_resource(resource) + self._reg_subapp_signals(subapp) + self._subapps.append(subapp) + subapp.pre_freeze() + if self._loop is not None: + subapp._set_loop(self._loop) + return resource + + def add_domain(self, domain: str, subapp: "Application") -> MatchedSubAppResource: + if not isinstance(domain, str): + raise TypeError("Domain must be str") + elif "*" in domain: + rule: Domain = MaskDomain(domain) + else: + rule = Domain(domain) + factory = partial(MatchedSubAppResource, rule, subapp) + return self._add_subapp(factory, subapp) + + def add_routes(self, routes: Iterable[AbstractRouteDef]) -> List[AbstractRoute]: + return self.router.add_routes(routes) + + @property + def on_response_prepare(self) -> _RespPrepareSignal: + return self._on_response_prepare + + @property + def on_startup(self) -> _AppSignal: + return self._on_startup + + @property + def on_shutdown(self) -> _AppSignal: + return self._on_shutdown + + @property + def on_cleanup(self) -> _AppSignal: + return self._on_cleanup + + @property + def cleanup_ctx(self) -> "CleanupContext": + return self._cleanup_ctx + + @property + def router(self) -> UrlDispatcher: + return self._router + + @property + def middlewares(self) -> _Middlewares: + return self._middlewares + + def _make_handler( + self, + *, + loop: Optional[asyncio.AbstractEventLoop] = None, + access_log_class: Type[AbstractAccessLogger] = AccessLogger, + **kwargs: Any, + ) -> Server: + + if not issubclass(access_log_class, AbstractAccessLogger): + raise TypeError( + "access_log_class must be subclass of " + "aiohttp.abc.AbstractAccessLogger, got {}".format(access_log_class) + ) + + self._set_loop(loop) + self.freeze() + + kwargs["debug"] = self._debug + kwargs["access_log_class"] = access_log_class + if self._handler_args: + for k, v in self._handler_args.items(): + kwargs[k] = v + + return Server( + self._handle, # type: ignore[arg-type] + request_factory=self._make_request, + loop=self._loop, + **kwargs, + ) + + def make_handler( + self, + *, + loop: Optional[asyncio.AbstractEventLoop] = None, + access_log_class: Type[AbstractAccessLogger] = AccessLogger, + **kwargs: Any, + ) -> Server: + + warnings.warn( + "Application.make_handler(...) is deprecated, use AppRunner API instead", + DeprecationWarning, + stacklevel=2, + ) + + return self._make_handler( + loop=loop, access_log_class=access_log_class, **kwargs + ) + + async def startup(self) -> None: + """Causes on_startup signal + + Should be called in the event loop along with the request handler. + """ + await self.on_startup.send(self) + + async def shutdown(self) -> None: + """Causes on_shutdown signal + + Should be called before cleanup() + """ + await self.on_shutdown.send(self) + + async def cleanup(self) -> None: + """Causes on_cleanup signal + + Should be called after shutdown() + """ + if self.on_cleanup.frozen: + await self.on_cleanup.send(self) + else: + # If an exception occurs in startup, ensure cleanup contexts are completed. + await self._cleanup_ctx._on_cleanup(self) + + def _make_request( + self, + message: RawRequestMessage, + payload: StreamReader, + protocol: RequestHandler, + writer: AbstractStreamWriter, + task: "asyncio.Task[None]", + _cls: Type[Request] = Request, + ) -> Request: + if TYPE_CHECKING: + assert self._loop is not None + return _cls( + message, + payload, + protocol, + writer, + task, + self._loop, + client_max_size=self._client_max_size, + ) + + def _prepare_middleware(self) -> Iterator[Tuple[Middleware, bool]]: + for m in reversed(self._middlewares): + if getattr(m, "__middleware_version__", None) == 1: + yield m, True + else: + warnings.warn( + f'old-style middleware "{m!r}" deprecated, see #2252', + DeprecationWarning, + stacklevel=2, + ) + yield m, False + + yield _fix_request_current_app(self), True + + async def _handle(self, request: Request) -> StreamResponse: + loop = asyncio.get_event_loop() + debug = loop.get_debug() + match_info = await self._router.resolve(request) + if debug: # pragma: no cover + if not isinstance(match_info, AbstractMatchInfo): + raise TypeError( + "match_info should be AbstractMatchInfo " + "instance, not {!r}".format(match_info) + ) + match_info.add_app(self) + + match_info.freeze() + + request._match_info = match_info + + if request.headers.get(hdrs.EXPECT): + resp = await match_info.expect_handler(request) + await request.writer.drain() + if resp is not None: + return resp + + handler = match_info.handler + + if self._run_middlewares: + # If its a SystemRoute, don't cache building the middlewares since + # they are constructed for every MatchInfoError as a new handler + # is made each time. + if not self._has_legacy_middlewares and not isinstance( + match_info.route, SystemRoute + ): + handler = _cached_build_middleware(handler, match_info.apps) + else: + for app in match_info.apps[::-1]: + for m, new_style in app._middlewares_handlers: # type: ignore[union-attr] + if new_style: + handler = update_wrapper( + partial(m, handler=handler), handler + ) + else: + handler = await m(app, handler) # type: ignore[arg-type,assignment] + + return await handler(request) + + def __call__(self) -> "Application": + """gunicorn compatibility""" + return self + + def __repr__(self) -> str: + return f"" + + def __bool__(self) -> bool: + return True + + +class CleanupError(RuntimeError): + @property + def exceptions(self) -> List[BaseException]: + return cast(List[BaseException], self.args[1]) + + +if TYPE_CHECKING: + _CleanupContextBase = FrozenList[Callable[[Application], AsyncIterator[None]]] +else: + _CleanupContextBase = FrozenList + + +class CleanupContext(_CleanupContextBase): + def __init__(self) -> None: + super().__init__() + self._exits: List[AsyncIterator[None]] = [] + + async def _on_startup(self, app: Application) -> None: + for cb in self: + it = cb(app).__aiter__() + await it.__anext__() + self._exits.append(it) + + async def _on_cleanup(self, app: Application) -> None: + errors = [] + for it in reversed(self._exits): + try: + await it.__anext__() + except StopAsyncIteration: + pass + except (Exception, asyncio.CancelledError) as exc: + errors.append(exc) + else: + errors.append(RuntimeError(f"{it!r} has more than one 'yield'")) + if errors: + if len(errors) == 1: + raise errors[0] + else: + raise CleanupError("Multiple errors on cleanup stage", errors) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_exceptions.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_exceptions.py new file mode 100644 index 0000000..ee2c1e7 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_exceptions.py @@ -0,0 +1,452 @@ +import warnings +from typing import Any, Dict, Iterable, List, Optional, Set # noqa + +from yarl import URL + +from .typedefs import LooseHeaders, StrOrURL +from .web_response import Response + +__all__ = ( + "HTTPException", + "HTTPError", + "HTTPRedirection", + "HTTPSuccessful", + "HTTPOk", + "HTTPCreated", + "HTTPAccepted", + "HTTPNonAuthoritativeInformation", + "HTTPNoContent", + "HTTPResetContent", + "HTTPPartialContent", + "HTTPMove", + "HTTPMultipleChoices", + "HTTPMovedPermanently", + "HTTPFound", + "HTTPSeeOther", + "HTTPNotModified", + "HTTPUseProxy", + "HTTPTemporaryRedirect", + "HTTPPermanentRedirect", + "HTTPClientError", + "HTTPBadRequest", + "HTTPUnauthorized", + "HTTPPaymentRequired", + "HTTPForbidden", + "HTTPNotFound", + "HTTPMethodNotAllowed", + "HTTPNotAcceptable", + "HTTPProxyAuthenticationRequired", + "HTTPRequestTimeout", + "HTTPConflict", + "HTTPGone", + "HTTPLengthRequired", + "HTTPPreconditionFailed", + "HTTPRequestEntityTooLarge", + "HTTPRequestURITooLong", + "HTTPUnsupportedMediaType", + "HTTPRequestRangeNotSatisfiable", + "HTTPExpectationFailed", + "HTTPMisdirectedRequest", + "HTTPUnprocessableEntity", + "HTTPFailedDependency", + "HTTPUpgradeRequired", + "HTTPPreconditionRequired", + "HTTPTooManyRequests", + "HTTPRequestHeaderFieldsTooLarge", + "HTTPUnavailableForLegalReasons", + "HTTPServerError", + "HTTPInternalServerError", + "HTTPNotImplemented", + "HTTPBadGateway", + "HTTPServiceUnavailable", + "HTTPGatewayTimeout", + "HTTPVersionNotSupported", + "HTTPVariantAlsoNegotiates", + "HTTPInsufficientStorage", + "HTTPNotExtended", + "HTTPNetworkAuthenticationRequired", +) + + +class NotAppKeyWarning(UserWarning): + """Warning when not using AppKey in Application.""" + + +############################################################ +# HTTP Exceptions +############################################################ + + +class HTTPException(Response, Exception): + + # You should set in subclasses: + # status = 200 + + status_code = -1 + empty_body = False + + __http_exception__ = True + + def __init__( + self, + *, + headers: Optional[LooseHeaders] = None, + reason: Optional[str] = None, + body: Any = None, + text: Optional[str] = None, + content_type: Optional[str] = None, + ) -> None: + if body is not None: + warnings.warn( + "body argument is deprecated for http web exceptions", + DeprecationWarning, + ) + Response.__init__( + self, + status=self.status_code, + headers=headers, + reason=reason, + body=body, + text=text, + content_type=content_type, + ) + Exception.__init__(self, self.reason) + if self.body is None and not self.empty_body: + self.text = f"{self.status}: {self.reason}" + + def __bool__(self) -> bool: + return True + + +class HTTPError(HTTPException): + """Base class for exceptions with status codes in the 400s and 500s.""" + + +class HTTPRedirection(HTTPException): + """Base class for exceptions with status codes in the 300s.""" + + +class HTTPSuccessful(HTTPException): + """Base class for exceptions with status codes in the 200s.""" + + +class HTTPOk(HTTPSuccessful): + status_code = 200 + + +class HTTPCreated(HTTPSuccessful): + status_code = 201 + + +class HTTPAccepted(HTTPSuccessful): + status_code = 202 + + +class HTTPNonAuthoritativeInformation(HTTPSuccessful): + status_code = 203 + + +class HTTPNoContent(HTTPSuccessful): + status_code = 204 + empty_body = True + + +class HTTPResetContent(HTTPSuccessful): + status_code = 205 + empty_body = True + + +class HTTPPartialContent(HTTPSuccessful): + status_code = 206 + + +############################################################ +# 3xx redirection +############################################################ + + +class HTTPMove(HTTPRedirection): + def __init__( + self, + location: StrOrURL, + *, + headers: Optional[LooseHeaders] = None, + reason: Optional[str] = None, + body: Any = None, + text: Optional[str] = None, + content_type: Optional[str] = None, + ) -> None: + if not location: + raise ValueError("HTTP redirects need a location to redirect to.") + super().__init__( + headers=headers, + reason=reason, + body=body, + text=text, + content_type=content_type, + ) + self.headers["Location"] = str(URL(location)) + self.location = location + + +class HTTPMultipleChoices(HTTPMove): + status_code = 300 + + +class HTTPMovedPermanently(HTTPMove): + status_code = 301 + + +class HTTPFound(HTTPMove): + status_code = 302 + + +# This one is safe after a POST (the redirected location will be +# retrieved with GET): +class HTTPSeeOther(HTTPMove): + status_code = 303 + + +class HTTPNotModified(HTTPRedirection): + # FIXME: this should include a date or etag header + status_code = 304 + empty_body = True + + +class HTTPUseProxy(HTTPMove): + # Not a move, but looks a little like one + status_code = 305 + + +class HTTPTemporaryRedirect(HTTPMove): + status_code = 307 + + +class HTTPPermanentRedirect(HTTPMove): + status_code = 308 + + +############################################################ +# 4xx client error +############################################################ + + +class HTTPClientError(HTTPError): + pass + + +class HTTPBadRequest(HTTPClientError): + status_code = 400 + + +class HTTPUnauthorized(HTTPClientError): + status_code = 401 + + +class HTTPPaymentRequired(HTTPClientError): + status_code = 402 + + +class HTTPForbidden(HTTPClientError): + status_code = 403 + + +class HTTPNotFound(HTTPClientError): + status_code = 404 + + +class HTTPMethodNotAllowed(HTTPClientError): + status_code = 405 + + def __init__( + self, + method: str, + allowed_methods: Iterable[str], + *, + headers: Optional[LooseHeaders] = None, + reason: Optional[str] = None, + body: Any = None, + text: Optional[str] = None, + content_type: Optional[str] = None, + ) -> None: + allow = ",".join(sorted(allowed_methods)) + super().__init__( + headers=headers, + reason=reason, + body=body, + text=text, + content_type=content_type, + ) + self.headers["Allow"] = allow + self.allowed_methods: Set[str] = set(allowed_methods) + self.method = method.upper() + + +class HTTPNotAcceptable(HTTPClientError): + status_code = 406 + + +class HTTPProxyAuthenticationRequired(HTTPClientError): + status_code = 407 + + +class HTTPRequestTimeout(HTTPClientError): + status_code = 408 + + +class HTTPConflict(HTTPClientError): + status_code = 409 + + +class HTTPGone(HTTPClientError): + status_code = 410 + + +class HTTPLengthRequired(HTTPClientError): + status_code = 411 + + +class HTTPPreconditionFailed(HTTPClientError): + status_code = 412 + + +class HTTPRequestEntityTooLarge(HTTPClientError): + status_code = 413 + + def __init__(self, max_size: float, actual_size: float, **kwargs: Any) -> None: + kwargs.setdefault( + "text", + "Maximum request body size {} exceeded, " + "actual body size {}".format(max_size, actual_size), + ) + super().__init__(**kwargs) + + +class HTTPRequestURITooLong(HTTPClientError): + status_code = 414 + + +class HTTPUnsupportedMediaType(HTTPClientError): + status_code = 415 + + +class HTTPRequestRangeNotSatisfiable(HTTPClientError): + status_code = 416 + + +class HTTPExpectationFailed(HTTPClientError): + status_code = 417 + + +class HTTPMisdirectedRequest(HTTPClientError): + status_code = 421 + + +class HTTPUnprocessableEntity(HTTPClientError): + status_code = 422 + + +class HTTPFailedDependency(HTTPClientError): + status_code = 424 + + +class HTTPUpgradeRequired(HTTPClientError): + status_code = 426 + + +class HTTPPreconditionRequired(HTTPClientError): + status_code = 428 + + +class HTTPTooManyRequests(HTTPClientError): + status_code = 429 + + +class HTTPRequestHeaderFieldsTooLarge(HTTPClientError): + status_code = 431 + + +class HTTPUnavailableForLegalReasons(HTTPClientError): + status_code = 451 + + def __init__( + self, + link: Optional[StrOrURL], + *, + headers: Optional[LooseHeaders] = None, + reason: Optional[str] = None, + body: Any = None, + text: Optional[str] = None, + content_type: Optional[str] = None, + ) -> None: + super().__init__( + headers=headers, + reason=reason, + body=body, + text=text, + content_type=content_type, + ) + self._link = None + if link: + self._link = URL(link) + self.headers["Link"] = f'<{str(self._link)}>; rel="blocked-by"' + + @property + def link(self) -> Optional[URL]: + return self._link + + +############################################################ +# 5xx Server Error +############################################################ +# Response status codes beginning with the digit "5" indicate cases in +# which the server is aware that it has erred or is incapable of +# performing the request. Except when responding to a HEAD request, the +# server SHOULD include an entity containing an explanation of the error +# situation, and whether it is a temporary or permanent condition. User +# agents SHOULD display any included entity to the user. These response +# codes are applicable to any request method. + + +class HTTPServerError(HTTPError): + pass + + +class HTTPInternalServerError(HTTPServerError): + status_code = 500 + + +class HTTPNotImplemented(HTTPServerError): + status_code = 501 + + +class HTTPBadGateway(HTTPServerError): + status_code = 502 + + +class HTTPServiceUnavailable(HTTPServerError): + status_code = 503 + + +class HTTPGatewayTimeout(HTTPServerError): + status_code = 504 + + +class HTTPVersionNotSupported(HTTPServerError): + status_code = 505 + + +class HTTPVariantAlsoNegotiates(HTTPServerError): + status_code = 506 + + +class HTTPInsufficientStorage(HTTPServerError): + status_code = 507 + + +class HTTPNotExtended(HTTPServerError): + status_code = 510 + + +class HTTPNetworkAuthenticationRequired(HTTPServerError): + status_code = 511 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_fileresponse.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_fileresponse.py new file mode 100644 index 0000000..26484b9 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_fileresponse.py @@ -0,0 +1,418 @@ +import asyncio +import io +import os +import pathlib +import sys +from contextlib import suppress +from enum import Enum, auto +from mimetypes import MimeTypes +from stat import S_ISREG +from types import MappingProxyType +from typing import ( # noqa + IO, + TYPE_CHECKING, + Any, + Awaitable, + Callable, + Final, + Iterator, + List, + Optional, + Set, + Tuple, + Union, + cast, +) + +from . import hdrs +from .abc import AbstractStreamWriter +from .helpers import ETAG_ANY, ETag, must_be_empty_body +from .typedefs import LooseHeaders, PathLike +from .web_exceptions import ( + HTTPForbidden, + HTTPNotFound, + HTTPNotModified, + HTTPPartialContent, + HTTPPreconditionFailed, + HTTPRequestRangeNotSatisfiable, +) +from .web_response import StreamResponse + +__all__ = ("FileResponse",) + +if TYPE_CHECKING: + from .web_request import BaseRequest + + +_T_OnChunkSent = Optional[Callable[[bytes], Awaitable[None]]] + + +NOSENDFILE: Final[bool] = bool(os.environ.get("AIOHTTP_NOSENDFILE")) + +CONTENT_TYPES: Final[MimeTypes] = MimeTypes() + +# File extension to IANA encodings map that will be checked in the order defined. +ENCODING_EXTENSIONS = MappingProxyType( + {ext: CONTENT_TYPES.encodings_map[ext] for ext in (".br", ".gz")} +) + +FALLBACK_CONTENT_TYPE = "application/octet-stream" + +# Provide additional MIME type/extension pairs to be recognized. +# https://en.wikipedia.org/wiki/List_of_archive_formats#Compression_only +ADDITIONAL_CONTENT_TYPES = MappingProxyType( + { + "application/gzip": ".gz", + "application/x-brotli": ".br", + "application/x-bzip2": ".bz2", + "application/x-compress": ".Z", + "application/x-xz": ".xz", + } +) + + +class _FileResponseResult(Enum): + """The result of the file response.""" + + SEND_FILE = auto() # Ie a regular file to send + NOT_ACCEPTABLE = auto() # Ie a socket, or non-regular file + PRE_CONDITION_FAILED = auto() # Ie If-Match or If-None-Match failed + NOT_MODIFIED = auto() # 304 Not Modified + + +# Add custom pairs and clear the encodings map so guess_type ignores them. +CONTENT_TYPES.encodings_map.clear() +for content_type, extension in ADDITIONAL_CONTENT_TYPES.items(): + CONTENT_TYPES.add_type(content_type, extension) + + +_CLOSE_FUTURES: Set[asyncio.Future[None]] = set() + + +class FileResponse(StreamResponse): + """A response object can be used to send files.""" + + def __init__( + self, + path: PathLike, + chunk_size: int = 256 * 1024, + status: int = 200, + reason: Optional[str] = None, + headers: Optional[LooseHeaders] = None, + ) -> None: + super().__init__(status=status, reason=reason, headers=headers) + + self._path = pathlib.Path(path) + self._chunk_size = chunk_size + + def _seek_and_read(self, fobj: IO[Any], offset: int, chunk_size: int) -> bytes: + fobj.seek(offset) + return fobj.read(chunk_size) # type: ignore[no-any-return] + + async def _sendfile_fallback( + self, writer: AbstractStreamWriter, fobj: IO[Any], offset: int, count: int + ) -> AbstractStreamWriter: + # To keep memory usage low,fobj is transferred in chunks + # controlled by the constructor's chunk_size argument. + + chunk_size = self._chunk_size + loop = asyncio.get_event_loop() + chunk = await loop.run_in_executor( + None, self._seek_and_read, fobj, offset, chunk_size + ) + while chunk: + await writer.write(chunk) + count = count - chunk_size + if count <= 0: + break + chunk = await loop.run_in_executor(None, fobj.read, min(chunk_size, count)) + + await writer.drain() + return writer + + async def _sendfile( + self, request: "BaseRequest", fobj: IO[Any], offset: int, count: int + ) -> AbstractStreamWriter: + writer = await super().prepare(request) + assert writer is not None + + if NOSENDFILE or self.compression: + return await self._sendfile_fallback(writer, fobj, offset, count) + + loop = request._loop + transport = request.transport + assert transport is not None + + try: + await loop.sendfile(transport, fobj, offset, count) + except NotImplementedError: + return await self._sendfile_fallback(writer, fobj, offset, count) + + await super().write_eof() + return writer + + @staticmethod + def _etag_match(etag_value: str, etags: Tuple[ETag, ...], *, weak: bool) -> bool: + if len(etags) == 1 and etags[0].value == ETAG_ANY: + return True + return any( + etag.value == etag_value for etag in etags if weak or not etag.is_weak + ) + + async def _not_modified( + self, request: "BaseRequest", etag_value: str, last_modified: float + ) -> Optional[AbstractStreamWriter]: + self.set_status(HTTPNotModified.status_code) + self._length_check = False + self.etag = etag_value + self.last_modified = last_modified + # Delete any Content-Length headers provided by user. HTTP 304 + # should always have empty response body + return await super().prepare(request) + + async def _precondition_failed( + self, request: "BaseRequest" + ) -> Optional[AbstractStreamWriter]: + self.set_status(HTTPPreconditionFailed.status_code) + self.content_length = 0 + return await super().prepare(request) + + def _make_response( + self, request: "BaseRequest", accept_encoding: str + ) -> Tuple[ + _FileResponseResult, Optional[io.BufferedReader], os.stat_result, Optional[str] + ]: + """Return the response result, io object, stat result, and encoding. + + If an uncompressed file is returned, the encoding is set to + :py:data:`None`. + + This method should be called from a thread executor + since it calls os.stat which may block. + """ + file_path, st, file_encoding = self._get_file_path_stat_encoding( + accept_encoding + ) + if not file_path: + return _FileResponseResult.NOT_ACCEPTABLE, None, st, None + + etag_value = f"{st.st_mtime_ns:x}-{st.st_size:x}" + + # https://www.rfc-editor.org/rfc/rfc9110#section-13.1.1-2 + if (ifmatch := request.if_match) is not None and not self._etag_match( + etag_value, ifmatch, weak=False + ): + return _FileResponseResult.PRE_CONDITION_FAILED, None, st, file_encoding + + if ( + (unmodsince := request.if_unmodified_since) is not None + and ifmatch is None + and st.st_mtime > unmodsince.timestamp() + ): + return _FileResponseResult.PRE_CONDITION_FAILED, None, st, file_encoding + + # https://www.rfc-editor.org/rfc/rfc9110#section-13.1.2-2 + if (ifnonematch := request.if_none_match) is not None and self._etag_match( + etag_value, ifnonematch, weak=True + ): + return _FileResponseResult.NOT_MODIFIED, None, st, file_encoding + + if ( + (modsince := request.if_modified_since) is not None + and ifnonematch is None + and st.st_mtime <= modsince.timestamp() + ): + return _FileResponseResult.NOT_MODIFIED, None, st, file_encoding + + fobj = file_path.open("rb") + with suppress(OSError): + # fstat() may not be available on all platforms + # Once we open the file, we want the fstat() to ensure + # the file has not changed between the first stat() + # and the open(). + st = os.stat(fobj.fileno()) + return _FileResponseResult.SEND_FILE, fobj, st, file_encoding + + def _get_file_path_stat_encoding( + self, accept_encoding: str + ) -> Tuple[Optional[pathlib.Path], os.stat_result, Optional[str]]: + file_path = self._path + for file_extension, file_encoding in ENCODING_EXTENSIONS.items(): + if file_encoding not in accept_encoding: + continue + + compressed_path = file_path.with_suffix(file_path.suffix + file_extension) + with suppress(OSError): + # Do not follow symlinks and ignore any non-regular files. + st = compressed_path.lstat() + if S_ISREG(st.st_mode): + return compressed_path, st, file_encoding + + # Fallback to the uncompressed file + st = file_path.stat() + return file_path if S_ISREG(st.st_mode) else None, st, None + + async def prepare(self, request: "BaseRequest") -> Optional[AbstractStreamWriter]: + loop = asyncio.get_running_loop() + # Encoding comparisons should be case-insensitive + # https://www.rfc-editor.org/rfc/rfc9110#section-8.4.1 + accept_encoding = request.headers.get(hdrs.ACCEPT_ENCODING, "").lower() + try: + response_result, fobj, st, file_encoding = await loop.run_in_executor( + None, self._make_response, request, accept_encoding + ) + except PermissionError: + self.set_status(HTTPForbidden.status_code) + return await super().prepare(request) + except OSError: + # Most likely to be FileNotFoundError or OSError for circular + # symlinks in python >= 3.13, so respond with 404. + self.set_status(HTTPNotFound.status_code) + return await super().prepare(request) + + # Forbid special files like sockets, pipes, devices, etc. + if response_result is _FileResponseResult.NOT_ACCEPTABLE: + self.set_status(HTTPForbidden.status_code) + return await super().prepare(request) + + if response_result is _FileResponseResult.PRE_CONDITION_FAILED: + return await self._precondition_failed(request) + + if response_result is _FileResponseResult.NOT_MODIFIED: + etag_value = f"{st.st_mtime_ns:x}-{st.st_size:x}" + last_modified = st.st_mtime + return await self._not_modified(request, etag_value, last_modified) + + assert fobj is not None + try: + return await self._prepare_open_file(request, fobj, st, file_encoding) + finally: + # We do not await here because we do not want to wait + # for the executor to finish before returning the response + # so the connection can begin servicing another request + # as soon as possible. + close_future = loop.run_in_executor(None, fobj.close) + # Hold a strong reference to the future to prevent it from being + # garbage collected before it completes. + _CLOSE_FUTURES.add(close_future) + close_future.add_done_callback(_CLOSE_FUTURES.remove) + + async def _prepare_open_file( + self, + request: "BaseRequest", + fobj: io.BufferedReader, + st: os.stat_result, + file_encoding: Optional[str], + ) -> Optional[AbstractStreamWriter]: + status = self._status + file_size: int = st.st_size + file_mtime: float = st.st_mtime + count: int = file_size + start: Optional[int] = None + + if (ifrange := request.if_range) is None or file_mtime <= ifrange.timestamp(): + # If-Range header check: + # condition = cached date >= last modification date + # return 206 if True else 200. + # if False: + # Range header would not be processed, return 200 + # if True but Range header missing + # return 200 + try: + rng = request.http_range + start = rng.start + end: Optional[int] = rng.stop + except ValueError: + # https://tools.ietf.org/html/rfc7233: + # A server generating a 416 (Range Not Satisfiable) response to + # a byte-range request SHOULD send a Content-Range header field + # with an unsatisfied-range value. + # The complete-length in a 416 response indicates the current + # length of the selected representation. + # + # Will do the same below. Many servers ignore this and do not + # send a Content-Range header with HTTP 416 + self._headers[hdrs.CONTENT_RANGE] = f"bytes */{file_size}" + self.set_status(HTTPRequestRangeNotSatisfiable.status_code) + return await super().prepare(request) + + # If a range request has been made, convert start, end slice + # notation into file pointer offset and count + if start is not None: + if start < 0 and end is None: # return tail of file + start += file_size + if start < 0: + # if Range:bytes=-1000 in request header but file size + # is only 200, there would be trouble without this + start = 0 + count = file_size - start + else: + # rfc7233:If the last-byte-pos value is + # absent, or if the value is greater than or equal to + # the current length of the representation data, + # the byte range is interpreted as the remainder + # of the representation (i.e., the server replaces the + # value of last-byte-pos with a value that is one less than + # the current length of the selected representation). + count = ( + min(end if end is not None else file_size, file_size) - start + ) + + if start >= file_size: + # HTTP 416 should be returned in this case. + # + # According to https://tools.ietf.org/html/rfc7233: + # If a valid byte-range-set includes at least one + # byte-range-spec with a first-byte-pos that is less than + # the current length of the representation, or at least one + # suffix-byte-range-spec with a non-zero suffix-length, + # then the byte-range-set is satisfiable. Otherwise, the + # byte-range-set is unsatisfiable. + self._headers[hdrs.CONTENT_RANGE] = f"bytes */{file_size}" + self.set_status(HTTPRequestRangeNotSatisfiable.status_code) + return await super().prepare(request) + + status = HTTPPartialContent.status_code + # Even though you are sending the whole file, you should still + # return a HTTP 206 for a Range request. + self.set_status(status) + + # If the Content-Type header is not already set, guess it based on the + # extension of the request path. The encoding returned by guess_type + # can be ignored since the map was cleared above. + if hdrs.CONTENT_TYPE not in self._headers: + if sys.version_info >= (3, 13): + guesser = CONTENT_TYPES.guess_file_type + else: + guesser = CONTENT_TYPES.guess_type + self.content_type = guesser(self._path)[0] or FALLBACK_CONTENT_TYPE + + if file_encoding: + self._headers[hdrs.CONTENT_ENCODING] = file_encoding + self._headers[hdrs.VARY] = hdrs.ACCEPT_ENCODING + # Disable compression if we are already sending + # a compressed file since we don't want to double + # compress. + self._compression = False + + self.etag = f"{st.st_mtime_ns:x}-{st.st_size:x}" + self.last_modified = file_mtime + self.content_length = count + + self._headers[hdrs.ACCEPT_RANGES] = "bytes" + + if status == HTTPPartialContent.status_code: + real_start = start + assert real_start is not None + self._headers[hdrs.CONTENT_RANGE] = "bytes {}-{}/{}".format( + real_start, real_start + count - 1, file_size + ) + + # If we are sending 0 bytes calling sendfile() will throw a ValueError + if count == 0 or must_be_empty_body(request.method, status): + return await super().prepare(request) + + # be aware that start could be None or int=0 here. + offset = start or 0 + + return await self._sendfile(request, fobj, offset, count) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_log.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_log.py new file mode 100644 index 0000000..d5ea2be --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_log.py @@ -0,0 +1,216 @@ +import datetime +import functools +import logging +import os +import re +import time as time_mod +from collections import namedtuple +from typing import Any, Callable, Dict, Iterable, List, Tuple # noqa + +from .abc import AbstractAccessLogger +from .web_request import BaseRequest +from .web_response import StreamResponse + +KeyMethod = namedtuple("KeyMethod", "key method") + + +class AccessLogger(AbstractAccessLogger): + """Helper object to log access. + + Usage: + log = logging.getLogger("spam") + log_format = "%a %{User-Agent}i" + access_logger = AccessLogger(log, log_format) + access_logger.log(request, response, time) + + Format: + %% The percent sign + %a Remote IP-address (IP-address of proxy if using reverse proxy) + %t Time when the request was started to process + %P The process ID of the child that serviced the request + %r First line of request + %s Response status code + %b Size of response in bytes, including HTTP headers + %T Time taken to serve the request, in seconds + %Tf Time taken to serve the request, in seconds with floating fraction + in .06f format + %D Time taken to serve the request, in microseconds + %{FOO}i request.headers['FOO'] + %{FOO}o response.headers['FOO'] + %{FOO}e os.environ['FOO'] + + """ + + LOG_FORMAT_MAP = { + "a": "remote_address", + "t": "request_start_time", + "P": "process_id", + "r": "first_request_line", + "s": "response_status", + "b": "response_size", + "T": "request_time", + "Tf": "request_time_frac", + "D": "request_time_micro", + "i": "request_header", + "o": "response_header", + } + + LOG_FORMAT = '%a %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"' + FORMAT_RE = re.compile(r"%(\{([A-Za-z0-9\-_]+)\}([ioe])|[atPrsbOD]|Tf?)") + CLEANUP_RE = re.compile(r"(%[^s])") + _FORMAT_CACHE: Dict[str, Tuple[str, List[KeyMethod]]] = {} + + def __init__(self, logger: logging.Logger, log_format: str = LOG_FORMAT) -> None: + """Initialise the logger. + + logger is a logger object to be used for logging. + log_format is a string with apache compatible log format description. + + """ + super().__init__(logger, log_format=log_format) + + _compiled_format = AccessLogger._FORMAT_CACHE.get(log_format) + if not _compiled_format: + _compiled_format = self.compile_format(log_format) + AccessLogger._FORMAT_CACHE[log_format] = _compiled_format + + self._log_format, self._methods = _compiled_format + + def compile_format(self, log_format: str) -> Tuple[str, List[KeyMethod]]: + """Translate log_format into form usable by modulo formatting + + All known atoms will be replaced with %s + Also methods for formatting of those atoms will be added to + _methods in appropriate order + + For example we have log_format = "%a %t" + This format will be translated to "%s %s" + Also contents of _methods will be + [self._format_a, self._format_t] + These method will be called and results will be passed + to translated string format. + + Each _format_* method receive 'args' which is list of arguments + given to self.log + + Exceptions are _format_e, _format_i and _format_o methods which + also receive key name (by functools.partial) + + """ + # list of (key, method) tuples, we don't use an OrderedDict as users + # can repeat the same key more than once + methods = list() + + for atom in self.FORMAT_RE.findall(log_format): + if atom[1] == "": + format_key1 = self.LOG_FORMAT_MAP[atom[0]] + m = getattr(AccessLogger, "_format_%s" % atom[0]) + key_method = KeyMethod(format_key1, m) + else: + format_key2 = (self.LOG_FORMAT_MAP[atom[2]], atom[1]) + m = getattr(AccessLogger, "_format_%s" % atom[2]) + key_method = KeyMethod(format_key2, functools.partial(m, atom[1])) + + methods.append(key_method) + + log_format = self.FORMAT_RE.sub(r"%s", log_format) + log_format = self.CLEANUP_RE.sub(r"%\1", log_format) + return log_format, methods + + @staticmethod + def _format_i( + key: str, request: BaseRequest, response: StreamResponse, time: float + ) -> str: + if request is None: + return "(no headers)" + + # suboptimal, make istr(key) once + return request.headers.get(key, "-") + + @staticmethod + def _format_o( + key: str, request: BaseRequest, response: StreamResponse, time: float + ) -> str: + # suboptimal, make istr(key) once + return response.headers.get(key, "-") + + @staticmethod + def _format_a(request: BaseRequest, response: StreamResponse, time: float) -> str: + if request is None: + return "-" + ip = request.remote + return ip if ip is not None else "-" + + @staticmethod + def _format_t(request: BaseRequest, response: StreamResponse, time: float) -> str: + tz = datetime.timezone(datetime.timedelta(seconds=-time_mod.timezone)) + now = datetime.datetime.now(tz) + start_time = now - datetime.timedelta(seconds=time) + return start_time.strftime("[%d/%b/%Y:%H:%M:%S %z]") + + @staticmethod + def _format_P(request: BaseRequest, response: StreamResponse, time: float) -> str: + return "<%s>" % os.getpid() + + @staticmethod + def _format_r(request: BaseRequest, response: StreamResponse, time: float) -> str: + if request is None: + return "-" + return "{} {} HTTP/{}.{}".format( + request.method, + request.path_qs, + request.version.major, + request.version.minor, + ) + + @staticmethod + def _format_s(request: BaseRequest, response: StreamResponse, time: float) -> int: + return response.status + + @staticmethod + def _format_b(request: BaseRequest, response: StreamResponse, time: float) -> int: + return response.body_length + + @staticmethod + def _format_T(request: BaseRequest, response: StreamResponse, time: float) -> str: + return str(round(time)) + + @staticmethod + def _format_Tf(request: BaseRequest, response: StreamResponse, time: float) -> str: + return "%06f" % time + + @staticmethod + def _format_D(request: BaseRequest, response: StreamResponse, time: float) -> str: + return str(round(time * 1000000)) + + def _format_line( + self, request: BaseRequest, response: StreamResponse, time: float + ) -> Iterable[Tuple[str, Callable[[BaseRequest, StreamResponse, float], str]]]: + return [(key, method(request, response, time)) for key, method in self._methods] + + @property + def enabled(self) -> bool: + """Check if logger is enabled.""" + # Avoid formatting the log line if it will not be emitted. + return self.logger.isEnabledFor(logging.INFO) + + def log(self, request: BaseRequest, response: StreamResponse, time: float) -> None: + try: + fmt_info = self._format_line(request, response, time) + + values = list() + extra = dict() + for key, value in fmt_info: + values.append(value) + + if key.__class__ is str: + extra[key] = value + else: + k1, k2 = key # type: ignore[misc] + dct = extra.get(k1, {}) # type: ignore[var-annotated,has-type] + dct[k2] = value # type: ignore[index,has-type] + extra[k1] = dct # type: ignore[has-type,assignment] + + self.logger.info(self._log_format % tuple(values), extra=extra) + except Exception: + self.logger.exception("Error in logging") diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_middlewares.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_middlewares.py new file mode 100644 index 0000000..2f1f5f5 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_middlewares.py @@ -0,0 +1,121 @@ +import re +from typing import TYPE_CHECKING, Tuple, Type, TypeVar + +from .typedefs import Handler, Middleware +from .web_exceptions import HTTPMove, HTTPPermanentRedirect +from .web_request import Request +from .web_response import StreamResponse +from .web_urldispatcher import SystemRoute + +__all__ = ( + "middleware", + "normalize_path_middleware", +) + +if TYPE_CHECKING: + from .web_app import Application + +_Func = TypeVar("_Func") + + +async def _check_request_resolves(request: Request, path: str) -> Tuple[bool, Request]: + alt_request = request.clone(rel_url=path) + + match_info = await request.app.router.resolve(alt_request) + alt_request._match_info = match_info + + if match_info.http_exception is None: + return True, alt_request + + return False, request + + +def middleware(f: _Func) -> _Func: + f.__middleware_version__ = 1 # type: ignore[attr-defined] + return f + + +def normalize_path_middleware( + *, + append_slash: bool = True, + remove_slash: bool = False, + merge_slashes: bool = True, + redirect_class: Type[HTTPMove] = HTTPPermanentRedirect, +) -> Middleware: + """Factory for producing a middleware that normalizes the path of a request. + + Normalizing means: + - Add or remove a trailing slash to the path. + - Double slashes are replaced by one. + + The middleware returns as soon as it finds a path that resolves + correctly. The order if both merge and append/remove are enabled is + 1) merge slashes + 2) append/remove slash + 3) both merge slashes and append/remove slash. + If the path resolves with at least one of those conditions, it will + redirect to the new path. + + Only one of `append_slash` and `remove_slash` can be enabled. If both + are `True` the factory will raise an assertion error + + If `append_slash` is `True` the middleware will append a slash when + needed. If a resource is defined with trailing slash and the request + comes without it, it will append it automatically. + + If `remove_slash` is `True`, `append_slash` must be `False`. When enabled + the middleware will remove trailing slashes and redirect if the resource + is defined + + If merge_slashes is True, merge multiple consecutive slashes in the + path into one. + """ + correct_configuration = not (append_slash and remove_slash) + assert correct_configuration, "Cannot both remove and append slash" + + @middleware + async def impl(request: Request, handler: Handler) -> StreamResponse: + if isinstance(request.match_info.route, SystemRoute): + paths_to_check = [] + if "?" in request.raw_path: + path, query = request.raw_path.split("?", 1) + query = "?" + query + else: + query = "" + path = request.raw_path + + if merge_slashes: + paths_to_check.append(re.sub("//+", "/", path)) + if append_slash and not request.path.endswith("/"): + paths_to_check.append(path + "/") + if remove_slash and request.path.endswith("/"): + paths_to_check.append(path[:-1]) + if merge_slashes and append_slash: + paths_to_check.append(re.sub("//+", "/", path + "/")) + if merge_slashes and remove_slash: + merged_slashes = re.sub("//+", "/", path) + paths_to_check.append(merged_slashes[:-1]) + + for path in paths_to_check: + path = re.sub("^//+", "/", path) # SECURITY: GHSA-v6wp-4m6f-gcjg + resolves, request = await _check_request_resolves(request, path) + if resolves: + raise redirect_class(request.raw_path + query) + + return await handler(request) + + return impl + + +def _fix_request_current_app(app: "Application") -> Middleware: + @middleware + async def impl(request: Request, handler: Handler) -> StreamResponse: + match_info = request.match_info + prev = match_info.current_app + match_info.current_app = app + try: + return await handler(request) + finally: + match_info.current_app = prev + + return impl diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_protocol.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_protocol.py new file mode 100644 index 0000000..1bd344a --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_protocol.py @@ -0,0 +1,792 @@ +import asyncio +import asyncio.streams +import sys +import traceback +import warnings +from collections import deque +from contextlib import suppress +from html import escape as html_escape +from http import HTTPStatus +from logging import Logger +from typing import ( + TYPE_CHECKING, + Any, + Awaitable, + Callable, + Deque, + Optional, + Sequence, + Tuple, + Type, + Union, + cast, +) + +import attr +import yarl +from propcache import under_cached_property + +from .abc import AbstractAccessLogger, AbstractStreamWriter +from .base_protocol import BaseProtocol +from .helpers import ceil_timeout +from .http import ( + HttpProcessingError, + HttpRequestParser, + HttpVersion10, + RawRequestMessage, + StreamWriter, +) +from .http_exceptions import BadHttpMethod +from .log import access_logger, server_logger +from .streams import EMPTY_PAYLOAD, StreamReader +from .tcp_helpers import tcp_keepalive +from .web_exceptions import HTTPException, HTTPInternalServerError +from .web_log import AccessLogger +from .web_request import BaseRequest +from .web_response import Response, StreamResponse + +__all__ = ("RequestHandler", "RequestPayloadError", "PayloadAccessError") + +if TYPE_CHECKING: + import ssl + + from .web_server import Server + + +_RequestFactory = Callable[ + [ + RawRequestMessage, + StreamReader, + "RequestHandler", + AbstractStreamWriter, + "asyncio.Task[None]", + ], + BaseRequest, +] + +_RequestHandler = Callable[[BaseRequest], Awaitable[StreamResponse]] + +ERROR = RawRequestMessage( + "UNKNOWN", + "/", + HttpVersion10, + {}, # type: ignore[arg-type] + {}, # type: ignore[arg-type] + True, + None, + False, + False, + yarl.URL("/"), +) + + +class RequestPayloadError(Exception): + """Payload parsing error.""" + + +class PayloadAccessError(Exception): + """Payload was accessed after response was sent.""" + + +_PAYLOAD_ACCESS_ERROR = PayloadAccessError() + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class _ErrInfo: + status: int + exc: BaseException + message: str + + +_MsgType = Tuple[Union[RawRequestMessage, _ErrInfo], StreamReader] + + +class RequestHandler(BaseProtocol): + """HTTP protocol implementation. + + RequestHandler handles incoming HTTP request. It reads request line, + request headers and request payload and calls handle_request() method. + By default it always returns with 404 response. + + RequestHandler handles errors in incoming request, like bad + status line, bad headers or incomplete payload. If any error occurs, + connection gets closed. + + keepalive_timeout -- number of seconds before closing + keep-alive connection + + tcp_keepalive -- TCP keep-alive is on, default is on + + debug -- enable debug mode + + logger -- custom logger object + + access_log_class -- custom class for access_logger + + access_log -- custom logging object + + access_log_format -- access log format string + + loop -- Optional event loop + + max_line_size -- Optional maximum header line size + + max_field_size -- Optional maximum header field size + + max_headers -- Optional maximum header size + + timeout_ceil_threshold -- Optional value to specify + threshold to ceil() timeout + values + + """ + + __slots__ = ( + "_request_count", + "_keepalive", + "_manager", + "_request_handler", + "_request_factory", + "_tcp_keepalive", + "_next_keepalive_close_time", + "_keepalive_handle", + "_keepalive_timeout", + "_lingering_time", + "_messages", + "_message_tail", + "_handler_waiter", + "_waiter", + "_task_handler", + "_upgrade", + "_payload_parser", + "_request_parser", + "_reading_paused", + "logger", + "debug", + "access_log", + "access_logger", + "_close", + "_force_close", + "_current_request", + "_timeout_ceil_threshold", + "_request_in_progress", + "_logging_enabled", + "_cache", + ) + + def __init__( + self, + manager: "Server", + *, + loop: asyncio.AbstractEventLoop, + # Default should be high enough that it's likely longer than a reverse proxy. + keepalive_timeout: float = 3630, + tcp_keepalive: bool = True, + logger: Logger = server_logger, + access_log_class: Type[AbstractAccessLogger] = AccessLogger, + access_log: Logger = access_logger, + access_log_format: str = AccessLogger.LOG_FORMAT, + debug: bool = False, + max_line_size: int = 8190, + max_headers: int = 32768, + max_field_size: int = 8190, + lingering_time: float = 10.0, + read_bufsize: int = 2**16, + auto_decompress: bool = True, + timeout_ceil_threshold: float = 5, + ): + super().__init__(loop) + + # _request_count is the number of requests processed with the same connection. + self._request_count = 0 + self._keepalive = False + self._current_request: Optional[BaseRequest] = None + self._manager: Optional[Server] = manager + self._request_handler: Optional[_RequestHandler] = manager.request_handler + self._request_factory: Optional[_RequestFactory] = manager.request_factory + + self._tcp_keepalive = tcp_keepalive + # placeholder to be replaced on keepalive timeout setup + self._next_keepalive_close_time = 0.0 + self._keepalive_handle: Optional[asyncio.Handle] = None + self._keepalive_timeout = keepalive_timeout + self._lingering_time = float(lingering_time) + + self._messages: Deque[_MsgType] = deque() + self._message_tail = b"" + + self._waiter: Optional[asyncio.Future[None]] = None + self._handler_waiter: Optional[asyncio.Future[None]] = None + self._task_handler: Optional[asyncio.Task[None]] = None + + self._upgrade = False + self._payload_parser: Any = None + self._request_parser: Optional[HttpRequestParser] = HttpRequestParser( + self, + loop, + read_bufsize, + max_line_size=max_line_size, + max_field_size=max_field_size, + max_headers=max_headers, + payload_exception=RequestPayloadError, + auto_decompress=auto_decompress, + ) + + self._timeout_ceil_threshold: float = 5 + try: + self._timeout_ceil_threshold = float(timeout_ceil_threshold) + except (TypeError, ValueError): + pass + + self.logger = logger + self.debug = debug + self.access_log = access_log + if access_log: + self.access_logger: Optional[AbstractAccessLogger] = access_log_class( + access_log, access_log_format + ) + self._logging_enabled = self.access_logger.enabled + else: + self.access_logger = None + self._logging_enabled = False + + self._close = False + self._force_close = False + self._request_in_progress = False + self._cache: dict[str, Any] = {} + + def __repr__(self) -> str: + return "<{} {}>".format( + self.__class__.__name__, + "connected" if self.transport is not None else "disconnected", + ) + + @under_cached_property + def ssl_context(self) -> Optional["ssl.SSLContext"]: + """Return SSLContext if available.""" + return ( + None + if self.transport is None + else self.transport.get_extra_info("sslcontext") + ) + + @under_cached_property + def peername( + self, + ) -> Optional[Union[str, Tuple[str, int, int, int], Tuple[str, int]]]: + """Return peername if available.""" + return ( + None + if self.transport is None + else self.transport.get_extra_info("peername") + ) + + @property + def keepalive_timeout(self) -> float: + return self._keepalive_timeout + + async def shutdown(self, timeout: Optional[float] = 15.0) -> None: + """Do worker process exit preparations. + + We need to clean up everything and stop accepting requests. + It is especially important for keep-alive connections. + """ + self._force_close = True + + if self._keepalive_handle is not None: + self._keepalive_handle.cancel() + + # Wait for graceful handler completion + if self._request_in_progress: + # The future is only created when we are shutting + # down while the handler is still processing a request + # to avoid creating a future for every request. + self._handler_waiter = self._loop.create_future() + try: + async with ceil_timeout(timeout): + await self._handler_waiter + except (asyncio.CancelledError, asyncio.TimeoutError): + self._handler_waiter = None + if ( + sys.version_info >= (3, 11) + and (task := asyncio.current_task()) + and task.cancelling() + ): + raise + # Then cancel handler and wait + try: + async with ceil_timeout(timeout): + if self._current_request is not None: + self._current_request._cancel(asyncio.CancelledError()) + + if self._task_handler is not None and not self._task_handler.done(): + await asyncio.shield(self._task_handler) + except (asyncio.CancelledError, asyncio.TimeoutError): + if ( + sys.version_info >= (3, 11) + and (task := asyncio.current_task()) + and task.cancelling() + ): + raise + + # force-close non-idle handler + if self._task_handler is not None: + self._task_handler.cancel() + + self.force_close() + + def connection_made(self, transport: asyncio.BaseTransport) -> None: + super().connection_made(transport) + + real_transport = cast(asyncio.Transport, transport) + if self._tcp_keepalive: + tcp_keepalive(real_transport) + + assert self._manager is not None + self._manager.connection_made(self, real_transport) + + loop = self._loop + if sys.version_info >= (3, 12): + task = asyncio.Task(self.start(), loop=loop, eager_start=True) + else: + task = loop.create_task(self.start()) + self._task_handler = task + + def connection_lost(self, exc: Optional[BaseException]) -> None: + if self._manager is None: + return + self._manager.connection_lost(self, exc) + + # Grab value before setting _manager to None. + handler_cancellation = self._manager.handler_cancellation + + self.force_close() + super().connection_lost(exc) + self._manager = None + self._request_factory = None + self._request_handler = None + self._request_parser = None + + if self._keepalive_handle is not None: + self._keepalive_handle.cancel() + + if self._current_request is not None: + if exc is None: + exc = ConnectionResetError("Connection lost") + self._current_request._cancel(exc) + + if handler_cancellation and self._task_handler is not None: + self._task_handler.cancel() + + self._task_handler = None + + if self._payload_parser is not None: + self._payload_parser.feed_eof() + self._payload_parser = None + + def set_parser(self, parser: Any) -> None: + # Actual type is WebReader + assert self._payload_parser is None + + self._payload_parser = parser + + if self._message_tail: + self._payload_parser.feed_data(self._message_tail) + self._message_tail = b"" + + def eof_received(self) -> None: + pass + + def data_received(self, data: bytes) -> None: + if self._force_close or self._close: + return + # parse http messages + messages: Sequence[_MsgType] + if self._payload_parser is None and not self._upgrade: + assert self._request_parser is not None + try: + messages, upgraded, tail = self._request_parser.feed_data(data) + except HttpProcessingError as exc: + messages = [ + (_ErrInfo(status=400, exc=exc, message=exc.message), EMPTY_PAYLOAD) + ] + upgraded = False + tail = b"" + + for msg, payload in messages or (): + self._request_count += 1 + self._messages.append((msg, payload)) + + waiter = self._waiter + if messages and waiter is not None and not waiter.done(): + # don't set result twice + waiter.set_result(None) + + self._upgrade = upgraded + if upgraded and tail: + self._message_tail = tail + + # no parser, just store + elif self._payload_parser is None and self._upgrade and data: + self._message_tail += data + + # feed payload + elif data: + eof, tail = self._payload_parser.feed_data(data) + if eof: + self.close() + + def keep_alive(self, val: bool) -> None: + """Set keep-alive connection mode. + + :param bool val: new state. + """ + self._keepalive = val + if self._keepalive_handle: + self._keepalive_handle.cancel() + self._keepalive_handle = None + + def close(self) -> None: + """Close connection. + + Stop accepting new pipelining messages and close + connection when handlers done processing messages. + """ + self._close = True + if self._waiter: + self._waiter.cancel() + + def force_close(self) -> None: + """Forcefully close connection.""" + self._force_close = True + if self._waiter: + self._waiter.cancel() + if self.transport is not None: + self.transport.close() + self.transport = None + + def log_access( + self, request: BaseRequest, response: StreamResponse, time: Optional[float] + ) -> None: + if self._logging_enabled and self.access_logger is not None: + if TYPE_CHECKING: + assert time is not None + self.access_logger.log(request, response, self._loop.time() - time) + + def log_debug(self, *args: Any, **kw: Any) -> None: + if self.debug: + self.logger.debug(*args, **kw) + + def log_exception(self, *args: Any, **kw: Any) -> None: + self.logger.exception(*args, **kw) + + def _process_keepalive(self) -> None: + self._keepalive_handle = None + if self._force_close or not self._keepalive: + return + + loop = self._loop + now = loop.time() + close_time = self._next_keepalive_close_time + if now < close_time: + # Keep alive close check fired too early, reschedule + self._keepalive_handle = loop.call_at(close_time, self._process_keepalive) + return + + # handler in idle state + if self._waiter and not self._waiter.done(): + self.force_close() + + async def _handle_request( + self, + request: BaseRequest, + start_time: Optional[float], + request_handler: Callable[[BaseRequest], Awaitable[StreamResponse]], + ) -> Tuple[StreamResponse, bool]: + self._request_in_progress = True + try: + try: + self._current_request = request + resp = await request_handler(request) + finally: + self._current_request = None + except HTTPException as exc: + resp = exc + resp, reset = await self.finish_response(request, resp, start_time) + except asyncio.CancelledError: + raise + except asyncio.TimeoutError as exc: + self.log_debug("Request handler timed out.", exc_info=exc) + resp = self.handle_error(request, 504) + resp, reset = await self.finish_response(request, resp, start_time) + except Exception as exc: + resp = self.handle_error(request, 500, exc) + resp, reset = await self.finish_response(request, resp, start_time) + else: + # Deprecation warning (See #2415) + if getattr(resp, "__http_exception__", False): + warnings.warn( + "returning HTTPException object is deprecated " + "(#2415) and will be removed, " + "please raise the exception instead", + DeprecationWarning, + ) + + resp, reset = await self.finish_response(request, resp, start_time) + finally: + self._request_in_progress = False + if self._handler_waiter is not None: + self._handler_waiter.set_result(None) + + return resp, reset + + async def start(self) -> None: + """Process incoming request. + + It reads request line, request headers and request payload, then + calls handle_request() method. Subclass has to override + handle_request(). start() handles various exceptions in request + or response handling. Connection is being closed always unless + keep_alive(True) specified. + """ + loop = self._loop + manager = self._manager + assert manager is not None + keepalive_timeout = self._keepalive_timeout + resp = None + assert self._request_factory is not None + assert self._request_handler is not None + + while not self._force_close: + if not self._messages: + try: + # wait for next request + self._waiter = loop.create_future() + await self._waiter + finally: + self._waiter = None + + message, payload = self._messages.popleft() + + # time is only fetched if logging is enabled as otherwise + # its thrown away and never used. + start = loop.time() if self._logging_enabled else None + + manager.requests_count += 1 + writer = StreamWriter(self, loop) + if isinstance(message, _ErrInfo): + # make request_factory work + request_handler = self._make_error_handler(message) + message = ERROR + else: + request_handler = self._request_handler + + # Important don't hold a reference to the current task + # as on traceback it will prevent the task from being + # collected and will cause a memory leak. + request = self._request_factory( + message, + payload, + self, + writer, + self._task_handler or asyncio.current_task(loop), # type: ignore[arg-type] + ) + try: + # a new task is used for copy context vars (#3406) + coro = self._handle_request(request, start, request_handler) + if sys.version_info >= (3, 12): + task = asyncio.Task(coro, loop=loop, eager_start=True) + else: + task = loop.create_task(coro) + try: + resp, reset = await task + except ConnectionError: + self.log_debug("Ignored premature client disconnection") + break + + # Drop the processed task from asyncio.Task.all_tasks() early + del task + if reset: + self.log_debug("Ignored premature client disconnection 2") + break + + # notify server about keep-alive + self._keepalive = bool(resp.keep_alive) + + # check payload + if not payload.is_eof(): + lingering_time = self._lingering_time + if not self._force_close and lingering_time: + self.log_debug( + "Start lingering close timer for %s sec.", lingering_time + ) + + now = loop.time() + end_t = now + lingering_time + + try: + while not payload.is_eof() and now < end_t: + async with ceil_timeout(end_t - now): + # read and ignore + await payload.readany() + now = loop.time() + except (asyncio.CancelledError, asyncio.TimeoutError): + if ( + sys.version_info >= (3, 11) + and (t := asyncio.current_task()) + and t.cancelling() + ): + raise + + # if payload still uncompleted + if not payload.is_eof() and not self._force_close: + self.log_debug("Uncompleted request.") + self.close() + + payload.set_exception(_PAYLOAD_ACCESS_ERROR) + + except asyncio.CancelledError: + self.log_debug("Ignored premature client disconnection") + self.force_close() + raise + except Exception as exc: + self.log_exception("Unhandled exception", exc_info=exc) + self.force_close() + except BaseException: + self.force_close() + raise + finally: + request._task = None # type: ignore[assignment] # Break reference cycle in case of exception + if self.transport is None and resp is not None: + self.log_debug("Ignored premature client disconnection.") + + if self._keepalive and not self._close and not self._force_close: + # start keep-alive timer + close_time = loop.time() + keepalive_timeout + self._next_keepalive_close_time = close_time + if self._keepalive_handle is None: + self._keepalive_handle = loop.call_at( + close_time, self._process_keepalive + ) + else: + break + + # remove handler, close transport if no handlers left + if not self._force_close: + self._task_handler = None + if self.transport is not None: + self.transport.close() + + async def finish_response( + self, request: BaseRequest, resp: StreamResponse, start_time: Optional[float] + ) -> Tuple[StreamResponse, bool]: + """Prepare the response and write_eof, then log access. + + This has to + be called within the context of any exception so the access logger + can get exception information. Returns True if the client disconnects + prematurely. + """ + request._finish() + if self._request_parser is not None: + self._request_parser.set_upgraded(False) + self._upgrade = False + if self._message_tail: + self._request_parser.feed_data(self._message_tail) + self._message_tail = b"" + try: + prepare_meth = resp.prepare + except AttributeError: + if resp is None: + self.log_exception("Missing return statement on request handler") + else: + self.log_exception( + "Web-handler should return a response instance, " + "got {!r}".format(resp) + ) + exc = HTTPInternalServerError() + resp = Response( + status=exc.status, reason=exc.reason, text=exc.text, headers=exc.headers + ) + prepare_meth = resp.prepare + try: + await prepare_meth(request) + await resp.write_eof() + except ConnectionError: + self.log_access(request, resp, start_time) + return resp, True + + self.log_access(request, resp, start_time) + return resp, False + + def handle_error( + self, + request: BaseRequest, + status: int = 500, + exc: Optional[BaseException] = None, + message: Optional[str] = None, + ) -> StreamResponse: + """Handle errors. + + Returns HTTP response with specific status code. Logs additional + information. It always closes current connection. + """ + if self._request_count == 1 and isinstance(exc, BadHttpMethod): + # BadHttpMethod is common when a client sends non-HTTP + # or encrypted traffic to an HTTP port. This is expected + # to happen when connected to the public internet so we log + # it at the debug level as to not fill logs with noise. + self.logger.debug( + "Error handling request from %s", request.remote, exc_info=exc + ) + else: + self.log_exception( + "Error handling request from %s", request.remote, exc_info=exc + ) + + # some data already got sent, connection is broken + if request.writer.output_size > 0: + raise ConnectionError( + "Response is sent already, cannot send another response " + "with the error message" + ) + + ct = "text/plain" + if status == HTTPStatus.INTERNAL_SERVER_ERROR: + title = "{0.value} {0.phrase}".format(HTTPStatus.INTERNAL_SERVER_ERROR) + msg = HTTPStatus.INTERNAL_SERVER_ERROR.description + tb = None + if self.debug: + with suppress(Exception): + tb = traceback.format_exc() + + if "text/html" in request.headers.get("Accept", ""): + if tb: + tb = html_escape(tb) + msg = f"

    Traceback:

    \n
    {tb}
    " + message = ( + "" + "{title}" + "\n

    {title}

    " + "\n{msg}\n\n" + ).format(title=title, msg=msg) + ct = "text/html" + else: + if tb: + msg = tb + message = title + "\n\n" + msg + + resp = Response(status=status, text=message, content_type=ct) + resp.force_close() + + return resp + + def _make_error_handler( + self, err_info: _ErrInfo + ) -> Callable[[BaseRequest], Awaitable[StreamResponse]]: + async def handler(request: BaseRequest) -> StreamResponse: + return self.handle_error( + request, err_info.status, err_info.exc, err_info.message + ) + + return handler diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_request.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_request.py new file mode 100644 index 0000000..0eafcd6 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_request.py @@ -0,0 +1,914 @@ +import asyncio +import datetime +import io +import re +import socket +import string +import tempfile +import types +import warnings +from types import MappingProxyType +from typing import ( + TYPE_CHECKING, + Any, + Dict, + Final, + Iterator, + Mapping, + MutableMapping, + Optional, + Pattern, + Tuple, + Union, + cast, +) +from urllib.parse import parse_qsl + +import attr +from multidict import ( + CIMultiDict, + CIMultiDictProxy, + MultiDict, + MultiDictProxy, + MultiMapping, +) +from yarl import URL + +from . import hdrs +from ._cookie_helpers import parse_cookie_header +from .abc import AbstractStreamWriter +from .helpers import ( + _SENTINEL, + DEBUG, + ETAG_ANY, + LIST_QUOTED_ETAG_RE, + ChainMapProxy, + ETag, + HeadersMixin, + parse_http_date, + reify, + sentinel, + set_exception, +) +from .http_parser import RawRequestMessage +from .http_writer import HttpVersion +from .multipart import BodyPartReader, MultipartReader +from .streams import EmptyStreamReader, StreamReader +from .typedefs import ( + DEFAULT_JSON_DECODER, + JSONDecoder, + LooseHeaders, + RawHeaders, + StrOrURL, +) +from .web_exceptions import HTTPRequestEntityTooLarge +from .web_response import StreamResponse + +__all__ = ("BaseRequest", "FileField", "Request") + + +if TYPE_CHECKING: + from .web_app import Application + from .web_protocol import RequestHandler + from .web_urldispatcher import UrlMappingMatchInfo + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class FileField: + name: str + filename: str + file: io.BufferedReader + content_type: str + headers: CIMultiDictProxy[str] + + +_TCHAR: Final[str] = string.digits + string.ascii_letters + r"!#$%&'*+.^_`|~-" +# '-' at the end to prevent interpretation as range in a char class + +_TOKEN: Final[str] = rf"[{_TCHAR}]+" + +_QDTEXT: Final[str] = r"[{}]".format( + r"".join(chr(c) for c in (0x09, 0x20, 0x21) + tuple(range(0x23, 0x7F))) +) +# qdtext includes 0x5C to escape 0x5D ('\]') +# qdtext excludes obs-text (because obsoleted, and encoding not specified) + +_QUOTED_PAIR: Final[str] = r"\\[\t !-~]" + +_QUOTED_STRING: Final[str] = r'"(?:{quoted_pair}|{qdtext})*"'.format( + qdtext=_QDTEXT, quoted_pair=_QUOTED_PAIR +) + +_FORWARDED_PAIR: Final[str] = ( + r"({token})=({token}|{quoted_string})(:\d{{1,4}})?".format( + token=_TOKEN, quoted_string=_QUOTED_STRING + ) +) + +_QUOTED_PAIR_REPLACE_RE: Final[Pattern[str]] = re.compile(r"\\([\t !-~])") +# same pattern as _QUOTED_PAIR but contains a capture group + +_FORWARDED_PAIR_RE: Final[Pattern[str]] = re.compile(_FORWARDED_PAIR) + +############################################################ +# HTTP Request +############################################################ + + +class BaseRequest(MutableMapping[str, Any], HeadersMixin): + + POST_METHODS = { + hdrs.METH_PATCH, + hdrs.METH_POST, + hdrs.METH_PUT, + hdrs.METH_TRACE, + hdrs.METH_DELETE, + } + + ATTRS = HeadersMixin.ATTRS | frozenset( + [ + "_message", + "_protocol", + "_payload_writer", + "_payload", + "_headers", + "_method", + "_version", + "_rel_url", + "_post", + "_read_bytes", + "_state", + "_cache", + "_task", + "_client_max_size", + "_loop", + "_transport_sslcontext", + "_transport_peername", + ] + ) + _post: Optional[MultiDictProxy[Union[str, bytes, FileField]]] = None + _read_bytes: Optional[bytes] = None + + def __init__( + self, + message: RawRequestMessage, + payload: StreamReader, + protocol: "RequestHandler", + payload_writer: AbstractStreamWriter, + task: "asyncio.Task[None]", + loop: asyncio.AbstractEventLoop, + *, + client_max_size: int = 1024**2, + state: Optional[Dict[str, Any]] = None, + scheme: Optional[str] = None, + host: Optional[str] = None, + remote: Optional[str] = None, + ) -> None: + self._message = message + self._protocol = protocol + self._payload_writer = payload_writer + + self._payload = payload + self._headers: CIMultiDictProxy[str] = message.headers + self._method = message.method + self._version = message.version + self._cache: Dict[str, Any] = {} + url = message.url + if url.absolute: + if scheme is not None: + url = url.with_scheme(scheme) + if host is not None: + url = url.with_host(host) + # absolute URL is given, + # override auto-calculating url, host, and scheme + # all other properties should be good + self._cache["url"] = url + self._cache["host"] = url.host + self._cache["scheme"] = url.scheme + self._rel_url = url.relative() + else: + self._rel_url = url + if scheme is not None: + self._cache["scheme"] = scheme + if host is not None: + self._cache["host"] = host + + self._state = {} if state is None else state + self._task = task + self._client_max_size = client_max_size + self._loop = loop + + self._transport_sslcontext = protocol.ssl_context + self._transport_peername = protocol.peername + + if remote is not None: + self._cache["remote"] = remote + + def clone( + self, + *, + method: Union[str, _SENTINEL] = sentinel, + rel_url: Union[StrOrURL, _SENTINEL] = sentinel, + headers: Union[LooseHeaders, _SENTINEL] = sentinel, + scheme: Union[str, _SENTINEL] = sentinel, + host: Union[str, _SENTINEL] = sentinel, + remote: Union[str, _SENTINEL] = sentinel, + client_max_size: Union[int, _SENTINEL] = sentinel, + ) -> "BaseRequest": + """Clone itself with replacement some attributes. + + Creates and returns a new instance of Request object. If no parameters + are given, an exact copy is returned. If a parameter is not passed, it + will reuse the one from the current request object. + """ + if self._read_bytes: + raise RuntimeError("Cannot clone request after reading its content") + + dct: Dict[str, Any] = {} + if method is not sentinel: + dct["method"] = method + if rel_url is not sentinel: + new_url: URL = URL(rel_url) + dct["url"] = new_url + dct["path"] = str(new_url) + if headers is not sentinel: + # a copy semantic + dct["headers"] = CIMultiDictProxy(CIMultiDict(headers)) + dct["raw_headers"] = tuple( + (k.encode("utf-8"), v.encode("utf-8")) + for k, v in dct["headers"].items() + ) + + message = self._message._replace(**dct) + + kwargs = {} + if scheme is not sentinel: + kwargs["scheme"] = scheme + if host is not sentinel: + kwargs["host"] = host + if remote is not sentinel: + kwargs["remote"] = remote + if client_max_size is sentinel: + client_max_size = self._client_max_size + + return self.__class__( + message, + self._payload, + self._protocol, + self._payload_writer, + self._task, + self._loop, + client_max_size=client_max_size, + state=self._state.copy(), + **kwargs, + ) + + @property + def task(self) -> "asyncio.Task[None]": + return self._task + + @property + def protocol(self) -> "RequestHandler": + return self._protocol + + @property + def transport(self) -> Optional[asyncio.Transport]: + if self._protocol is None: + return None + return self._protocol.transport + + @property + def writer(self) -> AbstractStreamWriter: + return self._payload_writer + + @property + def client_max_size(self) -> int: + return self._client_max_size + + @reify + def message(self) -> RawRequestMessage: + warnings.warn("Request.message is deprecated", DeprecationWarning, stacklevel=3) + return self._message + + @reify + def rel_url(self) -> URL: + return self._rel_url + + @reify + def loop(self) -> asyncio.AbstractEventLoop: + warnings.warn( + "request.loop property is deprecated", DeprecationWarning, stacklevel=2 + ) + return self._loop + + # MutableMapping API + + def __getitem__(self, key: str) -> Any: + return self._state[key] + + def __setitem__(self, key: str, value: Any) -> None: + self._state[key] = value + + def __delitem__(self, key: str) -> None: + del self._state[key] + + def __len__(self) -> int: + return len(self._state) + + def __iter__(self) -> Iterator[str]: + return iter(self._state) + + ######## + + @reify + def secure(self) -> bool: + """A bool indicating if the request is handled with SSL.""" + return self.scheme == "https" + + @reify + def forwarded(self) -> Tuple[Mapping[str, str], ...]: + """A tuple containing all parsed Forwarded header(s). + + Makes an effort to parse Forwarded headers as specified by RFC 7239: + + - It adds one (immutable) dictionary per Forwarded 'field-value', ie + per proxy. The element corresponds to the data in the Forwarded + field-value added by the first proxy encountered by the client. Each + subsequent item corresponds to those added by later proxies. + - It checks that every value has valid syntax in general as specified + in section 4: either a 'token' or a 'quoted-string'. + - It un-escapes found escape sequences. + - It does NOT validate 'by' and 'for' contents as specified in section + 6. + - It does NOT validate 'host' contents (Host ABNF). + - It does NOT validate 'proto' contents for valid URI scheme names. + + Returns a tuple containing one or more immutable dicts + """ + elems = [] + for field_value in self._message.headers.getall(hdrs.FORWARDED, ()): + length = len(field_value) + pos = 0 + need_separator = False + elem: Dict[str, str] = {} + elems.append(types.MappingProxyType(elem)) + while 0 <= pos < length: + match = _FORWARDED_PAIR_RE.match(field_value, pos) + if match is not None: # got a valid forwarded-pair + if need_separator: + # bad syntax here, skip to next comma + pos = field_value.find(",", pos) + else: + name, value, port = match.groups() + if value[0] == '"': + # quoted string: remove quotes and unescape + value = _QUOTED_PAIR_REPLACE_RE.sub(r"\1", value[1:-1]) + if port: + value += port + elem[name.lower()] = value + pos += len(match.group(0)) + need_separator = True + elif field_value[pos] == ",": # next forwarded-element + need_separator = False + elem = {} + elems.append(types.MappingProxyType(elem)) + pos += 1 + elif field_value[pos] == ";": # next forwarded-pair + need_separator = False + pos += 1 + elif field_value[pos] in " \t": + # Allow whitespace even between forwarded-pairs, though + # RFC 7239 doesn't. This simplifies code and is in line + # with Postel's law. + pos += 1 + else: + # bad syntax here, skip to next comma + pos = field_value.find(",", pos) + return tuple(elems) + + @reify + def scheme(self) -> str: + """A string representing the scheme of the request. + + Hostname is resolved in this order: + + - overridden value by .clone(scheme=new_scheme) call. + - type of connection to peer: HTTPS if socket is SSL, HTTP otherwise. + + 'http' or 'https'. + """ + if self._transport_sslcontext: + return "https" + else: + return "http" + + @reify + def method(self) -> str: + """Read only property for getting HTTP method. + + The value is upper-cased str like 'GET', 'POST', 'PUT' etc. + """ + return self._method + + @reify + def version(self) -> HttpVersion: + """Read only property for getting HTTP version of request. + + Returns aiohttp.protocol.HttpVersion instance. + """ + return self._version + + @reify + def host(self) -> str: + """Hostname of the request. + + Hostname is resolved in this order: + + - overridden value by .clone(host=new_host) call. + - HOST HTTP header + - socket.getfqdn() value + + For example, 'example.com' or 'localhost:8080'. + + For historical reasons, the port number may be included. + """ + host = self._message.headers.get(hdrs.HOST) + if host is not None: + return host + return socket.getfqdn() + + @reify + def remote(self) -> Optional[str]: + """Remote IP of client initiated HTTP request. + + The IP is resolved in this order: + + - overridden value by .clone(remote=new_remote) call. + - peername of opened socket + """ + if self._transport_peername is None: + return None + if isinstance(self._transport_peername, (list, tuple)): + return str(self._transport_peername[0]) + return str(self._transport_peername) + + @reify + def url(self) -> URL: + """The full URL of the request.""" + # authority is used here because it may include the port number + # and we want yarl to parse it correctly + return URL.build(scheme=self.scheme, authority=self.host).join(self._rel_url) + + @reify + def path(self) -> str: + """The URL including *PATH INFO* without the host or scheme. + + E.g., ``/app/blog`` + """ + return self._rel_url.path + + @reify + def path_qs(self) -> str: + """The URL including PATH_INFO and the query string. + + E.g, /app/blog?id=10 + """ + return str(self._rel_url) + + @reify + def raw_path(self) -> str: + """The URL including raw *PATH INFO* without the host or scheme. + + Warning, the path is unquoted and may contains non valid URL characters + + E.g., ``/my%2Fpath%7Cwith%21some%25strange%24characters`` + """ + return self._message.path + + @reify + def query(self) -> "MultiMapping[str]": + """A multidict with all the variables in the query string.""" + return self._rel_url.query + + @reify + def query_string(self) -> str: + """The query string in the URL. + + E.g., id=10 + """ + return self._rel_url.query_string + + @reify + def headers(self) -> CIMultiDictProxy[str]: + """A case-insensitive multidict proxy with all headers.""" + return self._headers + + @reify + def raw_headers(self) -> RawHeaders: + """A sequence of pairs for all headers.""" + return self._message.raw_headers + + @reify + def if_modified_since(self) -> Optional[datetime.datetime]: + """The value of If-Modified-Since HTTP header, or None. + + This header is represented as a `datetime` object. + """ + return parse_http_date(self.headers.get(hdrs.IF_MODIFIED_SINCE)) + + @reify + def if_unmodified_since(self) -> Optional[datetime.datetime]: + """The value of If-Unmodified-Since HTTP header, or None. + + This header is represented as a `datetime` object. + """ + return parse_http_date(self.headers.get(hdrs.IF_UNMODIFIED_SINCE)) + + @staticmethod + def _etag_values(etag_header: str) -> Iterator[ETag]: + """Extract `ETag` objects from raw header.""" + if etag_header == ETAG_ANY: + yield ETag( + is_weak=False, + value=ETAG_ANY, + ) + else: + for match in LIST_QUOTED_ETAG_RE.finditer(etag_header): + is_weak, value, garbage = match.group(2, 3, 4) + # Any symbol captured by 4th group means + # that the following sequence is invalid. + if garbage: + break + + yield ETag( + is_weak=bool(is_weak), + value=value, + ) + + @classmethod + def _if_match_or_none_impl( + cls, header_value: Optional[str] + ) -> Optional[Tuple[ETag, ...]]: + if not header_value: + return None + + return tuple(cls._etag_values(header_value)) + + @reify + def if_match(self) -> Optional[Tuple[ETag, ...]]: + """The value of If-Match HTTP header, or None. + + This header is represented as a `tuple` of `ETag` objects. + """ + return self._if_match_or_none_impl(self.headers.get(hdrs.IF_MATCH)) + + @reify + def if_none_match(self) -> Optional[Tuple[ETag, ...]]: + """The value of If-None-Match HTTP header, or None. + + This header is represented as a `tuple` of `ETag` objects. + """ + return self._if_match_or_none_impl(self.headers.get(hdrs.IF_NONE_MATCH)) + + @reify + def if_range(self) -> Optional[datetime.datetime]: + """The value of If-Range HTTP header, or None. + + This header is represented as a `datetime` object. + """ + return parse_http_date(self.headers.get(hdrs.IF_RANGE)) + + @reify + def keep_alive(self) -> bool: + """Is keepalive enabled by client?""" + return not self._message.should_close + + @reify + def cookies(self) -> Mapping[str, str]: + """Return request cookies. + + A read-only dictionary-like object. + """ + # Use parse_cookie_header for RFC 6265 compliant Cookie header parsing + # that accepts special characters in cookie names (fixes #2683) + parsed = parse_cookie_header(self.headers.get(hdrs.COOKIE, "")) + # Extract values from Morsel objects + return MappingProxyType({name: morsel.value for name, morsel in parsed}) + + @reify + def http_range(self) -> slice: + """The content of Range HTTP header. + + Return a slice instance. + + """ + rng = self._headers.get(hdrs.RANGE) + start, end = None, None + if rng is not None: + try: + pattern = r"^bytes=(\d*)-(\d*)$" + start, end = re.findall(pattern, rng, re.ASCII)[0] + except IndexError: # pattern was not found in header + raise ValueError("range not in acceptable format") + + end = int(end) if end else None + start = int(start) if start else None + + if start is None and end is not None: + # end with no start is to return tail of content + start = -end + end = None + + if start is not None and end is not None: + # end is inclusive in range header, exclusive for slice + end += 1 + + if start >= end: + raise ValueError("start cannot be after end") + + if start is end is None: # No valid range supplied + raise ValueError("No start or end of range specified") + + return slice(start, end, 1) + + @reify + def content(self) -> StreamReader: + """Return raw payload stream.""" + return self._payload + + @property + def has_body(self) -> bool: + """Return True if request's HTTP BODY can be read, False otherwise.""" + warnings.warn( + "Deprecated, use .can_read_body #2005", DeprecationWarning, stacklevel=2 + ) + return not self._payload.at_eof() + + @property + def can_read_body(self) -> bool: + """Return True if request's HTTP BODY can be read, False otherwise.""" + return not self._payload.at_eof() + + @reify + def body_exists(self) -> bool: + """Return True if request has HTTP BODY, False otherwise.""" + return type(self._payload) is not EmptyStreamReader + + async def release(self) -> None: + """Release request. + + Eat unread part of HTTP BODY if present. + """ + while not self._payload.at_eof(): + await self._payload.readany() + + async def read(self) -> bytes: + """Read request body if present. + + Returns bytes object with full request content. + """ + if self._read_bytes is None: + body = bytearray() + while True: + chunk = await self._payload.readany() + body.extend(chunk) + if self._client_max_size: + body_size = len(body) + if body_size >= self._client_max_size: + raise HTTPRequestEntityTooLarge( + max_size=self._client_max_size, actual_size=body_size + ) + if not chunk: + break + self._read_bytes = bytes(body) + return self._read_bytes + + async def text(self) -> str: + """Return BODY as text using encoding from .charset.""" + bytes_body = await self.read() + encoding = self.charset or "utf-8" + return bytes_body.decode(encoding) + + async def json(self, *, loads: JSONDecoder = DEFAULT_JSON_DECODER) -> Any: + """Return BODY as JSON.""" + body = await self.text() + return loads(body) + + async def multipart(self) -> MultipartReader: + """Return async iterator to process BODY as multipart.""" + return MultipartReader(self._headers, self._payload) + + async def post(self) -> "MultiDictProxy[Union[str, bytes, FileField]]": + """Return POST parameters.""" + if self._post is not None: + return self._post + if self._method not in self.POST_METHODS: + self._post = MultiDictProxy(MultiDict()) + return self._post + + content_type = self.content_type + if content_type not in ( + "", + "application/x-www-form-urlencoded", + "multipart/form-data", + ): + self._post = MultiDictProxy(MultiDict()) + return self._post + + out: MultiDict[Union[str, bytes, FileField]] = MultiDict() + + if content_type == "multipart/form-data": + multipart = await self.multipart() + max_size = self._client_max_size + + size = 0 + while (field := await multipart.next()) is not None: + field_ct = field.headers.get(hdrs.CONTENT_TYPE) + + if isinstance(field, BodyPartReader): + if field.name is None: + raise ValueError("Multipart field missing name.") + + # Note that according to RFC 7578, the Content-Type header + # is optional, even for files, so we can't assume it's + # present. + # https://tools.ietf.org/html/rfc7578#section-4.4 + if field.filename: + # store file in temp file + tmp = await self._loop.run_in_executor( + None, tempfile.TemporaryFile + ) + chunk = await field.read_chunk(size=2**16) + while chunk: + chunk = await field.decode(chunk) + await self._loop.run_in_executor(None, tmp.write, chunk) + size += len(chunk) + if 0 < max_size < size: + await self._loop.run_in_executor(None, tmp.close) + raise HTTPRequestEntityTooLarge( + max_size=max_size, actual_size=size + ) + chunk = await field.read_chunk(size=2**16) + await self._loop.run_in_executor(None, tmp.seek, 0) + + if field_ct is None: + field_ct = "application/octet-stream" + + ff = FileField( + field.name, + field.filename, + cast(io.BufferedReader, tmp), + field_ct, + field.headers, + ) + out.add(field.name, ff) + else: + # deal with ordinary data + value = await field.read(decode=True) + if field_ct is None or field_ct.startswith("text/"): + charset = field.get_charset(default="utf-8") + out.add(field.name, value.decode(charset)) + else: + out.add(field.name, value) + size += len(value) + if 0 < max_size < size: + raise HTTPRequestEntityTooLarge( + max_size=max_size, actual_size=size + ) + else: + raise ValueError( + "To decode nested multipart you need to use custom reader", + ) + else: + data = await self.read() + if data: + charset = self.charset or "utf-8" + out.extend( + parse_qsl( + data.rstrip().decode(charset), + keep_blank_values=True, + encoding=charset, + ) + ) + + self._post = MultiDictProxy(out) + return self._post + + def get_extra_info(self, name: str, default: Any = None) -> Any: + """Extra info from protocol transport""" + protocol = self._protocol + if protocol is None: + return default + + transport = protocol.transport + if transport is None: + return default + + return transport.get_extra_info(name, default) + + def __repr__(self) -> str: + ascii_encodable_path = self.path.encode("ascii", "backslashreplace").decode( + "ascii" + ) + return "<{} {} {} >".format( + self.__class__.__name__, self._method, ascii_encodable_path + ) + + def __eq__(self, other: object) -> bool: + return id(self) == id(other) + + def __bool__(self) -> bool: + return True + + async def _prepare_hook(self, response: StreamResponse) -> None: + return + + def _cancel(self, exc: BaseException) -> None: + set_exception(self._payload, exc) + + def _finish(self) -> None: + if self._post is None or self.content_type != "multipart/form-data": + return + + # NOTE: Release file descriptors for the + # NOTE: `tempfile.Temporaryfile`-created `_io.BufferedRandom` + # NOTE: instances of files sent within multipart request body + # NOTE: via HTTP POST request. + for file_name, file_field_object in self._post.items(): + if isinstance(file_field_object, FileField): + file_field_object.file.close() + + +class Request(BaseRequest): + + ATTRS = BaseRequest.ATTRS | frozenset(["_match_info"]) + + _match_info: Optional["UrlMappingMatchInfo"] = None + + if DEBUG: + + def __setattr__(self, name: str, val: Any) -> None: + if name not in self.ATTRS: + warnings.warn( + "Setting custom {}.{} attribute " + "is discouraged".format(self.__class__.__name__, name), + DeprecationWarning, + stacklevel=2, + ) + super().__setattr__(name, val) + + def clone( + self, + *, + method: Union[str, _SENTINEL] = sentinel, + rel_url: Union[StrOrURL, _SENTINEL] = sentinel, + headers: Union[LooseHeaders, _SENTINEL] = sentinel, + scheme: Union[str, _SENTINEL] = sentinel, + host: Union[str, _SENTINEL] = sentinel, + remote: Union[str, _SENTINEL] = sentinel, + client_max_size: Union[int, _SENTINEL] = sentinel, + ) -> "Request": + ret = super().clone( + method=method, + rel_url=rel_url, + headers=headers, + scheme=scheme, + host=host, + remote=remote, + client_max_size=client_max_size, + ) + new_ret = cast(Request, ret) + new_ret._match_info = self._match_info + return new_ret + + @reify + def match_info(self) -> "UrlMappingMatchInfo": + """Result of route resolving.""" + match_info = self._match_info + assert match_info is not None + return match_info + + @property + def app(self) -> "Application": + """Application instance.""" + match_info = self._match_info + assert match_info is not None + return match_info.current_app + + @property + def config_dict(self) -> ChainMapProxy: + match_info = self._match_info + assert match_info is not None + lst = match_info.apps + app = self.app + idx = lst.index(app) + sublist = list(reversed(lst[: idx + 1])) + return ChainMapProxy(sublist) + + async def _prepare_hook(self, response: StreamResponse) -> None: + match_info = self._match_info + if match_info is None: + return + for app in match_info._apps: + if on_response_prepare := app.on_response_prepare: + await on_response_prepare.send(self, response) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_response.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_response.py new file mode 100644 index 0000000..e5f8b6c --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_response.py @@ -0,0 +1,856 @@ +import asyncio +import collections.abc +import datetime +import enum +import json +import math +import time +import warnings +from concurrent.futures import Executor +from http import HTTPStatus +from http.cookies import SimpleCookie +from typing import ( + TYPE_CHECKING, + Any, + Dict, + Iterator, + MutableMapping, + Optional, + Union, + cast, +) + +from multidict import CIMultiDict, istr + +from . import hdrs, payload +from .abc import AbstractStreamWriter +from .compression_utils import ZLibCompressor +from .helpers import ( + ETAG_ANY, + QUOTED_ETAG_RE, + ETag, + HeadersMixin, + must_be_empty_body, + parse_http_date, + rfc822_formatted_time, + sentinel, + should_remove_content_length, + validate_etag_value, +) +from .http import SERVER_SOFTWARE, HttpVersion10, HttpVersion11 +from .payload import Payload +from .typedefs import JSONEncoder, LooseHeaders + +REASON_PHRASES = {http_status.value: http_status.phrase for http_status in HTTPStatus} +LARGE_BODY_SIZE = 1024**2 + +__all__ = ("ContentCoding", "StreamResponse", "Response", "json_response") + + +if TYPE_CHECKING: + from .web_request import BaseRequest + + BaseClass = MutableMapping[str, Any] +else: + BaseClass = collections.abc.MutableMapping + + +# TODO(py311): Convert to StrEnum for wider use +class ContentCoding(enum.Enum): + # The content codings that we have support for. + # + # Additional registered codings are listed at: + # https://www.iana.org/assignments/http-parameters/http-parameters.xhtml#content-coding + deflate = "deflate" + gzip = "gzip" + identity = "identity" + + +CONTENT_CODINGS = {coding.value: coding for coding in ContentCoding} + +############################################################ +# HTTP Response classes +############################################################ + + +class StreamResponse(BaseClass, HeadersMixin): + + _body: Union[None, bytes, bytearray, Payload] + _length_check = True + _body = None + _keep_alive: Optional[bool] = None + _chunked: bool = False + _compression: bool = False + _compression_strategy: Optional[int] = None + _compression_force: Optional[ContentCoding] = None + _req: Optional["BaseRequest"] = None + _payload_writer: Optional[AbstractStreamWriter] = None + _eof_sent: bool = False + _must_be_empty_body: Optional[bool] = None + _body_length = 0 + _cookies: Optional[SimpleCookie] = None + _send_headers_immediately = True + + def __init__( + self, + *, + status: int = 200, + reason: Optional[str] = None, + headers: Optional[LooseHeaders] = None, + _real_headers: Optional[CIMultiDict[str]] = None, + ) -> None: + """Initialize a new stream response object. + + _real_headers is an internal parameter used to pass a pre-populated + headers object. It is used by the `Response` class to avoid copying + the headers when creating a new response object. It is not intended + to be used by external code. + """ + self._state: Dict[str, Any] = {} + + if _real_headers is not None: + self._headers = _real_headers + elif headers is not None: + self._headers: CIMultiDict[str] = CIMultiDict(headers) + else: + self._headers = CIMultiDict() + + self._set_status(status, reason) + + @property + def prepared(self) -> bool: + return self._eof_sent or self._payload_writer is not None + + @property + def task(self) -> "Optional[asyncio.Task[None]]": + if self._req: + return self._req.task + else: + return None + + @property + def status(self) -> int: + return self._status + + @property + def chunked(self) -> bool: + return self._chunked + + @property + def compression(self) -> bool: + return self._compression + + @property + def reason(self) -> str: + return self._reason + + def set_status( + self, + status: int, + reason: Optional[str] = None, + ) -> None: + assert ( + not self.prepared + ), "Cannot change the response status code after the headers have been sent" + self._set_status(status, reason) + + def _set_status(self, status: int, reason: Optional[str]) -> None: + self._status = int(status) + if reason is None: + reason = REASON_PHRASES.get(self._status, "") + elif "\n" in reason: + raise ValueError("Reason cannot contain \\n") + self._reason = reason + + @property + def keep_alive(self) -> Optional[bool]: + return self._keep_alive + + def force_close(self) -> None: + self._keep_alive = False + + @property + def body_length(self) -> int: + return self._body_length + + @property + def output_length(self) -> int: + warnings.warn("output_length is deprecated", DeprecationWarning) + assert self._payload_writer + return self._payload_writer.buffer_size + + def enable_chunked_encoding(self, chunk_size: Optional[int] = None) -> None: + """Enables automatic chunked transfer encoding.""" + if hdrs.CONTENT_LENGTH in self._headers: + raise RuntimeError( + "You can't enable chunked encoding when a content length is set" + ) + if chunk_size is not None: + warnings.warn("Chunk size is deprecated #1615", DeprecationWarning) + self._chunked = True + + def enable_compression( + self, + force: Optional[Union[bool, ContentCoding]] = None, + strategy: Optional[int] = None, + ) -> None: + """Enables response compression encoding.""" + # Backwards compatibility for when force was a bool <0.17. + if isinstance(force, bool): + force = ContentCoding.deflate if force else ContentCoding.identity + warnings.warn( + "Using boolean for force is deprecated #3318", DeprecationWarning + ) + elif force is not None: + assert isinstance( + force, ContentCoding + ), "force should one of None, bool or ContentEncoding" + + self._compression = True + self._compression_force = force + self._compression_strategy = strategy + + @property + def headers(self) -> "CIMultiDict[str]": + return self._headers + + @property + def cookies(self) -> SimpleCookie: + if self._cookies is None: + self._cookies = SimpleCookie() + return self._cookies + + def set_cookie( + self, + name: str, + value: str, + *, + expires: Optional[str] = None, + domain: Optional[str] = None, + max_age: Optional[Union[int, str]] = None, + path: str = "/", + secure: Optional[bool] = None, + httponly: Optional[bool] = None, + version: Optional[str] = None, + samesite: Optional[str] = None, + partitioned: Optional[bool] = None, + ) -> None: + """Set or update response cookie. + + Sets new cookie or updates existent with new value. + Also updates only those params which are not None. + """ + if self._cookies is None: + self._cookies = SimpleCookie() + + self._cookies[name] = value + c = self._cookies[name] + + if expires is not None: + c["expires"] = expires + elif c.get("expires") == "Thu, 01 Jan 1970 00:00:00 GMT": + del c["expires"] + + if domain is not None: + c["domain"] = domain + + if max_age is not None: + c["max-age"] = str(max_age) + elif "max-age" in c: + del c["max-age"] + + c["path"] = path + + if secure is not None: + c["secure"] = secure + if httponly is not None: + c["httponly"] = httponly + if version is not None: + c["version"] = version + if samesite is not None: + c["samesite"] = samesite + + if partitioned is not None: + c["partitioned"] = partitioned + + def del_cookie( + self, + name: str, + *, + domain: Optional[str] = None, + path: str = "/", + secure: Optional[bool] = None, + httponly: Optional[bool] = None, + samesite: Optional[str] = None, + ) -> None: + """Delete cookie. + + Creates new empty expired cookie. + """ + # TODO: do we need domain/path here? + if self._cookies is not None: + self._cookies.pop(name, None) + self.set_cookie( + name, + "", + max_age=0, + expires="Thu, 01 Jan 1970 00:00:00 GMT", + domain=domain, + path=path, + secure=secure, + httponly=httponly, + samesite=samesite, + ) + + @property + def content_length(self) -> Optional[int]: + # Just a placeholder for adding setter + return super().content_length + + @content_length.setter + def content_length(self, value: Optional[int]) -> None: + if value is not None: + value = int(value) + if self._chunked: + raise RuntimeError( + "You can't set content length when chunked encoding is enable" + ) + self._headers[hdrs.CONTENT_LENGTH] = str(value) + else: + self._headers.pop(hdrs.CONTENT_LENGTH, None) + + @property + def content_type(self) -> str: + # Just a placeholder for adding setter + return super().content_type + + @content_type.setter + def content_type(self, value: str) -> None: + self.content_type # read header values if needed + self._content_type = str(value) + self._generate_content_type_header() + + @property + def charset(self) -> Optional[str]: + # Just a placeholder for adding setter + return super().charset + + @charset.setter + def charset(self, value: Optional[str]) -> None: + ctype = self.content_type # read header values if needed + if ctype == "application/octet-stream": + raise RuntimeError( + "Setting charset for application/octet-stream " + "doesn't make sense, setup content_type first" + ) + assert self._content_dict is not None + if value is None: + self._content_dict.pop("charset", None) + else: + self._content_dict["charset"] = str(value).lower() + self._generate_content_type_header() + + @property + def last_modified(self) -> Optional[datetime.datetime]: + """The value of Last-Modified HTTP header, or None. + + This header is represented as a `datetime` object. + """ + return parse_http_date(self._headers.get(hdrs.LAST_MODIFIED)) + + @last_modified.setter + def last_modified( + self, value: Optional[Union[int, float, datetime.datetime, str]] + ) -> None: + if value is None: + self._headers.pop(hdrs.LAST_MODIFIED, None) + elif isinstance(value, (int, float)): + self._headers[hdrs.LAST_MODIFIED] = time.strftime( + "%a, %d %b %Y %H:%M:%S GMT", time.gmtime(math.ceil(value)) + ) + elif isinstance(value, datetime.datetime): + self._headers[hdrs.LAST_MODIFIED] = time.strftime( + "%a, %d %b %Y %H:%M:%S GMT", value.utctimetuple() + ) + elif isinstance(value, str): + self._headers[hdrs.LAST_MODIFIED] = value + else: + msg = f"Unsupported type for last_modified: {type(value).__name__}" + raise TypeError(msg) + + @property + def etag(self) -> Optional[ETag]: + quoted_value = self._headers.get(hdrs.ETAG) + if not quoted_value: + return None + elif quoted_value == ETAG_ANY: + return ETag(value=ETAG_ANY) + match = QUOTED_ETAG_RE.fullmatch(quoted_value) + if not match: + return None + is_weak, value = match.group(1, 2) + return ETag( + is_weak=bool(is_weak), + value=value, + ) + + @etag.setter + def etag(self, value: Optional[Union[ETag, str]]) -> None: + if value is None: + self._headers.pop(hdrs.ETAG, None) + elif (isinstance(value, str) and value == ETAG_ANY) or ( + isinstance(value, ETag) and value.value == ETAG_ANY + ): + self._headers[hdrs.ETAG] = ETAG_ANY + elif isinstance(value, str): + validate_etag_value(value) + self._headers[hdrs.ETAG] = f'"{value}"' + elif isinstance(value, ETag) and isinstance(value.value, str): + validate_etag_value(value.value) + hdr_value = f'W/"{value.value}"' if value.is_weak else f'"{value.value}"' + self._headers[hdrs.ETAG] = hdr_value + else: + raise ValueError( + f"Unsupported etag type: {type(value)}. " + f"etag must be str, ETag or None" + ) + + def _generate_content_type_header( + self, CONTENT_TYPE: istr = hdrs.CONTENT_TYPE + ) -> None: + assert self._content_dict is not None + assert self._content_type is not None + params = "; ".join(f"{k}={v}" for k, v in self._content_dict.items()) + if params: + ctype = self._content_type + "; " + params + else: + ctype = self._content_type + self._headers[CONTENT_TYPE] = ctype + + async def _do_start_compression(self, coding: ContentCoding) -> None: + if coding is ContentCoding.identity: + return + assert self._payload_writer is not None + self._headers[hdrs.CONTENT_ENCODING] = coding.value + self._payload_writer.enable_compression( + coding.value, self._compression_strategy + ) + # Compressed payload may have different content length, + # remove the header + self._headers.popall(hdrs.CONTENT_LENGTH, None) + + async def _start_compression(self, request: "BaseRequest") -> None: + if self._compression_force: + await self._do_start_compression(self._compression_force) + return + # Encoding comparisons should be case-insensitive + # https://www.rfc-editor.org/rfc/rfc9110#section-8.4.1 + accept_encoding = request.headers.get(hdrs.ACCEPT_ENCODING, "").lower() + for value, coding in CONTENT_CODINGS.items(): + if value in accept_encoding: + await self._do_start_compression(coding) + return + + async def prepare(self, request: "BaseRequest") -> Optional[AbstractStreamWriter]: + if self._eof_sent: + return None + if self._payload_writer is not None: + return self._payload_writer + self._must_be_empty_body = must_be_empty_body(request.method, self.status) + return await self._start(request) + + async def _start(self, request: "BaseRequest") -> AbstractStreamWriter: + self._req = request + writer = self._payload_writer = request._payload_writer + + await self._prepare_headers() + await request._prepare_hook(self) + await self._write_headers() + + return writer + + async def _prepare_headers(self) -> None: + request = self._req + assert request is not None + writer = self._payload_writer + assert writer is not None + keep_alive = self._keep_alive + if keep_alive is None: + keep_alive = request.keep_alive + self._keep_alive = keep_alive + + version = request.version + + headers = self._headers + if self._cookies: + for cookie in self._cookies.values(): + value = cookie.output(header="")[1:] + headers.add(hdrs.SET_COOKIE, value) + + if self._compression: + await self._start_compression(request) + + if self._chunked: + if version != HttpVersion11: + raise RuntimeError( + "Using chunked encoding is forbidden " + "for HTTP/{0.major}.{0.minor}".format(request.version) + ) + if not self._must_be_empty_body: + writer.enable_chunking() + headers[hdrs.TRANSFER_ENCODING] = "chunked" + elif self._length_check: # Disabled for WebSockets + writer.length = self.content_length + if writer.length is None: + if version >= HttpVersion11: + if not self._must_be_empty_body: + writer.enable_chunking() + headers[hdrs.TRANSFER_ENCODING] = "chunked" + elif not self._must_be_empty_body: + keep_alive = False + + # HTTP 1.1: https://tools.ietf.org/html/rfc7230#section-3.3.2 + # HTTP 1.0: https://tools.ietf.org/html/rfc1945#section-10.4 + if self._must_be_empty_body: + if hdrs.CONTENT_LENGTH in headers and should_remove_content_length( + request.method, self.status + ): + del headers[hdrs.CONTENT_LENGTH] + # https://datatracker.ietf.org/doc/html/rfc9112#section-6.1-10 + # https://datatracker.ietf.org/doc/html/rfc9112#section-6.1-13 + if hdrs.TRANSFER_ENCODING in headers: + del headers[hdrs.TRANSFER_ENCODING] + elif (writer.length if self._length_check else self.content_length) != 0: + # https://www.rfc-editor.org/rfc/rfc9110#section-8.3-5 + headers.setdefault(hdrs.CONTENT_TYPE, "application/octet-stream") + headers.setdefault(hdrs.DATE, rfc822_formatted_time()) + headers.setdefault(hdrs.SERVER, SERVER_SOFTWARE) + + # connection header + if hdrs.CONNECTION not in headers: + if keep_alive: + if version == HttpVersion10: + headers[hdrs.CONNECTION] = "keep-alive" + elif version == HttpVersion11: + headers[hdrs.CONNECTION] = "close" + + async def _write_headers(self) -> None: + request = self._req + assert request is not None + writer = self._payload_writer + assert writer is not None + # status line + version = request.version + status_line = f"HTTP/{version[0]}.{version[1]} {self._status} {self._reason}" + await writer.write_headers(status_line, self._headers) + # Send headers immediately if not opted into buffering + if self._send_headers_immediately: + writer.send_headers() + + async def write(self, data: Union[bytes, bytearray, memoryview]) -> None: + assert isinstance( + data, (bytes, bytearray, memoryview) + ), "data argument must be byte-ish (%r)" % type(data) + + if self._eof_sent: + raise RuntimeError("Cannot call write() after write_eof()") + if self._payload_writer is None: + raise RuntimeError("Cannot call write() before prepare()") + + await self._payload_writer.write(data) + + async def drain(self) -> None: + assert not self._eof_sent, "EOF has already been sent" + assert self._payload_writer is not None, "Response has not been started" + warnings.warn( + "drain method is deprecated, use await resp.write()", + DeprecationWarning, + stacklevel=2, + ) + await self._payload_writer.drain() + + async def write_eof(self, data: bytes = b"") -> None: + assert isinstance( + data, (bytes, bytearray, memoryview) + ), "data argument must be byte-ish (%r)" % type(data) + + if self._eof_sent: + return + + assert self._payload_writer is not None, "Response has not been started" + + await self._payload_writer.write_eof(data) + self._eof_sent = True + self._req = None + self._body_length = self._payload_writer.output_size + self._payload_writer = None + + def __repr__(self) -> str: + if self._eof_sent: + info = "eof" + elif self.prepared: + assert self._req is not None + info = f"{self._req.method} {self._req.path} " + else: + info = "not prepared" + return f"<{self.__class__.__name__} {self.reason} {info}>" + + def __getitem__(self, key: str) -> Any: + return self._state[key] + + def __setitem__(self, key: str, value: Any) -> None: + self._state[key] = value + + def __delitem__(self, key: str) -> None: + del self._state[key] + + def __len__(self) -> int: + return len(self._state) + + def __iter__(self) -> Iterator[str]: + return iter(self._state) + + def __hash__(self) -> int: + return hash(id(self)) + + def __eq__(self, other: object) -> bool: + return self is other + + def __bool__(self) -> bool: + return True + + +class Response(StreamResponse): + + _compressed_body: Optional[bytes] = None + _send_headers_immediately = False + + def __init__( + self, + *, + body: Any = None, + status: int = 200, + reason: Optional[str] = None, + text: Optional[str] = None, + headers: Optional[LooseHeaders] = None, + content_type: Optional[str] = None, + charset: Optional[str] = None, + zlib_executor_size: Optional[int] = None, + zlib_executor: Optional[Executor] = None, + ) -> None: + if body is not None and text is not None: + raise ValueError("body and text are not allowed together") + + if headers is None: + real_headers: CIMultiDict[str] = CIMultiDict() + else: + real_headers = CIMultiDict(headers) + + if content_type is not None and "charset" in content_type: + raise ValueError("charset must not be in content_type argument") + + if text is not None: + if hdrs.CONTENT_TYPE in real_headers: + if content_type or charset: + raise ValueError( + "passing both Content-Type header and " + "content_type or charset params " + "is forbidden" + ) + else: + # fast path for filling headers + if not isinstance(text, str): + raise TypeError("text argument must be str (%r)" % type(text)) + if content_type is None: + content_type = "text/plain" + if charset is None: + charset = "utf-8" + real_headers[hdrs.CONTENT_TYPE] = content_type + "; charset=" + charset + body = text.encode(charset) + text = None + elif hdrs.CONTENT_TYPE in real_headers: + if content_type is not None or charset is not None: + raise ValueError( + "passing both Content-Type header and " + "content_type or charset params " + "is forbidden" + ) + elif content_type is not None: + if charset is not None: + content_type += "; charset=" + charset + real_headers[hdrs.CONTENT_TYPE] = content_type + + super().__init__(status=status, reason=reason, _real_headers=real_headers) + + if text is not None: + self.text = text + else: + self.body = body + + self._zlib_executor_size = zlib_executor_size + self._zlib_executor = zlib_executor + + @property + def body(self) -> Optional[Union[bytes, Payload]]: + return self._body + + @body.setter + def body(self, body: Any) -> None: + if body is None: + self._body = None + elif isinstance(body, (bytes, bytearray)): + self._body = body + else: + try: + self._body = body = payload.PAYLOAD_REGISTRY.get(body) + except payload.LookupError: + raise ValueError("Unsupported body type %r" % type(body)) + + headers = self._headers + + # set content-type + if hdrs.CONTENT_TYPE not in headers: + headers[hdrs.CONTENT_TYPE] = body.content_type + + # copy payload headers + if body.headers: + for key, value in body.headers.items(): + if key not in headers: + headers[key] = value + + self._compressed_body = None + + @property + def text(self) -> Optional[str]: + if self._body is None: + return None + # Note: When _body is a Payload (e.g. FilePayload), this may do blocking I/O + # This is generally safe as most common payloads (BytesPayload, StringPayload) + # don't do blocking I/O, but be careful with file-based payloads + return self._body.decode(self.charset or "utf-8") + + @text.setter + def text(self, text: str) -> None: + assert text is None or isinstance( + text, str + ), "text argument must be str (%r)" % type(text) + + if self.content_type == "application/octet-stream": + self.content_type = "text/plain" + if self.charset is None: + self.charset = "utf-8" + + self._body = text.encode(self.charset) + self._compressed_body = None + + @property + def content_length(self) -> Optional[int]: + if self._chunked: + return None + + if hdrs.CONTENT_LENGTH in self._headers: + return int(self._headers[hdrs.CONTENT_LENGTH]) + + if self._compressed_body is not None: + # Return length of the compressed body + return len(self._compressed_body) + elif isinstance(self._body, Payload): + # A payload without content length, or a compressed payload + return None + elif self._body is not None: + return len(self._body) + else: + return 0 + + @content_length.setter + def content_length(self, value: Optional[int]) -> None: + raise RuntimeError("Content length is set automatically") + + async def write_eof(self, data: bytes = b"") -> None: + if self._eof_sent: + return + if self._compressed_body is None: + body: Optional[Union[bytes, Payload]] = self._body + else: + body = self._compressed_body + assert not data, f"data arg is not supported, got {data!r}" + assert self._req is not None + assert self._payload_writer is not None + if body is None or self._must_be_empty_body: + await super().write_eof() + elif isinstance(self._body, Payload): + await self._body.write(self._payload_writer) + await self._body.close() + await super().write_eof() + else: + await super().write_eof(cast(bytes, body)) + + async def _start(self, request: "BaseRequest") -> AbstractStreamWriter: + if hdrs.CONTENT_LENGTH in self._headers: + if should_remove_content_length(request.method, self.status): + del self._headers[hdrs.CONTENT_LENGTH] + elif not self._chunked: + if isinstance(self._body, Payload): + if (size := self._body.size) is not None: + self._headers[hdrs.CONTENT_LENGTH] = str(size) + else: + body_len = len(self._body) if self._body else "0" + # https://www.rfc-editor.org/rfc/rfc9110.html#section-8.6-7 + if body_len != "0" or ( + self.status != 304 and request.method not in hdrs.METH_HEAD_ALL + ): + self._headers[hdrs.CONTENT_LENGTH] = str(body_len) + + return await super()._start(request) + + async def _do_start_compression(self, coding: ContentCoding) -> None: + if self._chunked or isinstance(self._body, Payload): + return await super()._do_start_compression(coding) + if coding is ContentCoding.identity: + return + # Instead of using _payload_writer.enable_compression, + # compress the whole body + compressor = ZLibCompressor( + encoding=coding.value, + max_sync_chunk_size=self._zlib_executor_size, + executor=self._zlib_executor, + ) + assert self._body is not None + if self._zlib_executor_size is None and len(self._body) > LARGE_BODY_SIZE: + warnings.warn( + "Synchronous compression of large response bodies " + f"({len(self._body)} bytes) might block the async event loop. " + "Consider providing a custom value to zlib_executor_size/" + "zlib_executor response properties or disabling compression on it." + ) + self._compressed_body = ( + await compressor.compress(self._body) + compressor.flush() + ) + self._headers[hdrs.CONTENT_ENCODING] = coding.value + self._headers[hdrs.CONTENT_LENGTH] = str(len(self._compressed_body)) + + +def json_response( + data: Any = sentinel, + *, + text: Optional[str] = None, + body: Optional[bytes] = None, + status: int = 200, + reason: Optional[str] = None, + headers: Optional[LooseHeaders] = None, + content_type: str = "application/json", + dumps: JSONEncoder = json.dumps, +) -> Response: + if data is not sentinel: + if text or body: + raise ValueError("only one of data, text, or body should be specified") + else: + text = dumps(data) + return Response( + text=text, + body=body, + status=status, + reason=reason, + headers=headers, + content_type=content_type, + ) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_routedef.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_routedef.py new file mode 100644 index 0000000..f51b6cd --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_routedef.py @@ -0,0 +1,214 @@ +import abc +import os # noqa +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Dict, + Iterator, + List, + Optional, + Sequence, + Type, + Union, + overload, +) + +import attr + +from . import hdrs +from .abc import AbstractView +from .typedefs import Handler, PathLike + +if TYPE_CHECKING: + from .web_request import Request + from .web_response import StreamResponse + from .web_urldispatcher import AbstractRoute, UrlDispatcher +else: + Request = StreamResponse = UrlDispatcher = AbstractRoute = None + + +__all__ = ( + "AbstractRouteDef", + "RouteDef", + "StaticDef", + "RouteTableDef", + "head", + "options", + "get", + "post", + "patch", + "put", + "delete", + "route", + "view", + "static", +) + + +class AbstractRouteDef(abc.ABC): + @abc.abstractmethod + def register(self, router: UrlDispatcher) -> List[AbstractRoute]: + pass # pragma: no cover + + +_HandlerType = Union[Type[AbstractView], Handler] + + +@attr.s(auto_attribs=True, frozen=True, repr=False, slots=True) +class RouteDef(AbstractRouteDef): + method: str + path: str + handler: _HandlerType + kwargs: Dict[str, Any] + + def __repr__(self) -> str: + info = [] + for name, value in sorted(self.kwargs.items()): + info.append(f", {name}={value!r}") + return " {handler.__name__!r}{info}>".format( + method=self.method, path=self.path, handler=self.handler, info="".join(info) + ) + + def register(self, router: UrlDispatcher) -> List[AbstractRoute]: + if self.method in hdrs.METH_ALL: + reg = getattr(router, "add_" + self.method.lower()) + return [reg(self.path, self.handler, **self.kwargs)] + else: + return [ + router.add_route(self.method, self.path, self.handler, **self.kwargs) + ] + + +@attr.s(auto_attribs=True, frozen=True, repr=False, slots=True) +class StaticDef(AbstractRouteDef): + prefix: str + path: PathLike + kwargs: Dict[str, Any] + + def __repr__(self) -> str: + info = [] + for name, value in sorted(self.kwargs.items()): + info.append(f", {name}={value!r}") + return " {path}{info}>".format( + prefix=self.prefix, path=self.path, info="".join(info) + ) + + def register(self, router: UrlDispatcher) -> List[AbstractRoute]: + resource = router.add_static(self.prefix, self.path, **self.kwargs) + routes = resource.get_info().get("routes", {}) + return list(routes.values()) + + +def route(method: str, path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: + return RouteDef(method, path, handler, kwargs) + + +def head(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: + return route(hdrs.METH_HEAD, path, handler, **kwargs) + + +def options(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: + return route(hdrs.METH_OPTIONS, path, handler, **kwargs) + + +def get( + path: str, + handler: _HandlerType, + *, + name: Optional[str] = None, + allow_head: bool = True, + **kwargs: Any, +) -> RouteDef: + return route( + hdrs.METH_GET, path, handler, name=name, allow_head=allow_head, **kwargs + ) + + +def post(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: + return route(hdrs.METH_POST, path, handler, **kwargs) + + +def put(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: + return route(hdrs.METH_PUT, path, handler, **kwargs) + + +def patch(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: + return route(hdrs.METH_PATCH, path, handler, **kwargs) + + +def delete(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: + return route(hdrs.METH_DELETE, path, handler, **kwargs) + + +def view(path: str, handler: Type[AbstractView], **kwargs: Any) -> RouteDef: + return route(hdrs.METH_ANY, path, handler, **kwargs) + + +def static(prefix: str, path: PathLike, **kwargs: Any) -> StaticDef: + return StaticDef(prefix, path, kwargs) + + +_Deco = Callable[[_HandlerType], _HandlerType] + + +class RouteTableDef(Sequence[AbstractRouteDef]): + """Route definition table""" + + def __init__(self) -> None: + self._items: List[AbstractRouteDef] = [] + + def __repr__(self) -> str: + return f"" + + @overload + def __getitem__(self, index: int) -> AbstractRouteDef: ... + + @overload + def __getitem__(self, index: slice) -> List[AbstractRouteDef]: ... + + def __getitem__(self, index): # type: ignore[no-untyped-def] + return self._items[index] + + def __iter__(self) -> Iterator[AbstractRouteDef]: + return iter(self._items) + + def __len__(self) -> int: + return len(self._items) + + def __contains__(self, item: object) -> bool: + return item in self._items + + def route(self, method: str, path: str, **kwargs: Any) -> _Deco: + def inner(handler: _HandlerType) -> _HandlerType: + self._items.append(RouteDef(method, path, handler, kwargs)) + return handler + + return inner + + def head(self, path: str, **kwargs: Any) -> _Deco: + return self.route(hdrs.METH_HEAD, path, **kwargs) + + def get(self, path: str, **kwargs: Any) -> _Deco: + return self.route(hdrs.METH_GET, path, **kwargs) + + def post(self, path: str, **kwargs: Any) -> _Deco: + return self.route(hdrs.METH_POST, path, **kwargs) + + def put(self, path: str, **kwargs: Any) -> _Deco: + return self.route(hdrs.METH_PUT, path, **kwargs) + + def patch(self, path: str, **kwargs: Any) -> _Deco: + return self.route(hdrs.METH_PATCH, path, **kwargs) + + def delete(self, path: str, **kwargs: Any) -> _Deco: + return self.route(hdrs.METH_DELETE, path, **kwargs) + + def options(self, path: str, **kwargs: Any) -> _Deco: + return self.route(hdrs.METH_OPTIONS, path, **kwargs) + + def view(self, path: str, **kwargs: Any) -> _Deco: + return self.route(hdrs.METH_ANY, path, **kwargs) + + def static(self, prefix: str, path: PathLike, **kwargs: Any) -> None: + self._items.append(StaticDef(prefix, path, kwargs)) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_runner.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_runner.py new file mode 100644 index 0000000..bcfec72 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_runner.py @@ -0,0 +1,399 @@ +import asyncio +import signal +import socket +import warnings +from abc import ABC, abstractmethod +from typing import TYPE_CHECKING, Any, List, Optional, Set + +from yarl import URL + +from .typedefs import PathLike +from .web_app import Application +from .web_server import Server + +if TYPE_CHECKING: + from ssl import SSLContext +else: + try: + from ssl import SSLContext + except ImportError: # pragma: no cover + SSLContext = object # type: ignore[misc,assignment] + +__all__ = ( + "BaseSite", + "TCPSite", + "UnixSite", + "NamedPipeSite", + "SockSite", + "BaseRunner", + "AppRunner", + "ServerRunner", + "GracefulExit", +) + + +class GracefulExit(SystemExit): + code = 1 + + +def _raise_graceful_exit() -> None: + raise GracefulExit() + + +class BaseSite(ABC): + __slots__ = ("_runner", "_ssl_context", "_backlog", "_server") + + def __init__( + self, + runner: "BaseRunner", + *, + shutdown_timeout: float = 60.0, + ssl_context: Optional[SSLContext] = None, + backlog: int = 128, + ) -> None: + if runner.server is None: + raise RuntimeError("Call runner.setup() before making a site") + if shutdown_timeout != 60.0: + msg = "shutdown_timeout should be set on BaseRunner" + warnings.warn(msg, DeprecationWarning, stacklevel=2) + runner._shutdown_timeout = shutdown_timeout + self._runner = runner + self._ssl_context = ssl_context + self._backlog = backlog + self._server: Optional[asyncio.AbstractServer] = None + + @property + @abstractmethod + def name(self) -> str: + pass # pragma: no cover + + @abstractmethod + async def start(self) -> None: + self._runner._reg_site(self) + + async def stop(self) -> None: + self._runner._check_site(self) + if self._server is not None: # Maybe not started yet + self._server.close() + + self._runner._unreg_site(self) + + +class TCPSite(BaseSite): + __slots__ = ("_host", "_port", "_reuse_address", "_reuse_port") + + def __init__( + self, + runner: "BaseRunner", + host: Optional[str] = None, + port: Optional[int] = None, + *, + shutdown_timeout: float = 60.0, + ssl_context: Optional[SSLContext] = None, + backlog: int = 128, + reuse_address: Optional[bool] = None, + reuse_port: Optional[bool] = None, + ) -> None: + super().__init__( + runner, + shutdown_timeout=shutdown_timeout, + ssl_context=ssl_context, + backlog=backlog, + ) + self._host = host + if port is None: + port = 8443 if self._ssl_context else 8080 + self._port = port + self._reuse_address = reuse_address + self._reuse_port = reuse_port + + @property + def name(self) -> str: + scheme = "https" if self._ssl_context else "http" + host = "0.0.0.0" if not self._host else self._host + return str(URL.build(scheme=scheme, host=host, port=self._port)) + + async def start(self) -> None: + await super().start() + loop = asyncio.get_event_loop() + server = self._runner.server + assert server is not None + self._server = await loop.create_server( + server, + self._host, + self._port, + ssl=self._ssl_context, + backlog=self._backlog, + reuse_address=self._reuse_address, + reuse_port=self._reuse_port, + ) + + +class UnixSite(BaseSite): + __slots__ = ("_path",) + + def __init__( + self, + runner: "BaseRunner", + path: PathLike, + *, + shutdown_timeout: float = 60.0, + ssl_context: Optional[SSLContext] = None, + backlog: int = 128, + ) -> None: + super().__init__( + runner, + shutdown_timeout=shutdown_timeout, + ssl_context=ssl_context, + backlog=backlog, + ) + self._path = path + + @property + def name(self) -> str: + scheme = "https" if self._ssl_context else "http" + return f"{scheme}://unix:{self._path}:" + + async def start(self) -> None: + await super().start() + loop = asyncio.get_event_loop() + server = self._runner.server + assert server is not None + self._server = await loop.create_unix_server( + server, + self._path, + ssl=self._ssl_context, + backlog=self._backlog, + ) + + +class NamedPipeSite(BaseSite): + __slots__ = ("_path",) + + def __init__( + self, runner: "BaseRunner", path: str, *, shutdown_timeout: float = 60.0 + ) -> None: + loop = asyncio.get_event_loop() + if not isinstance( + loop, asyncio.ProactorEventLoop # type: ignore[attr-defined] + ): + raise RuntimeError( + "Named Pipes only available in proactor loop under windows" + ) + super().__init__(runner, shutdown_timeout=shutdown_timeout) + self._path = path + + @property + def name(self) -> str: + return self._path + + async def start(self) -> None: + await super().start() + loop = asyncio.get_event_loop() + server = self._runner.server + assert server is not None + _server = await loop.start_serving_pipe( # type: ignore[attr-defined] + server, self._path + ) + self._server = _server[0] + + +class SockSite(BaseSite): + __slots__ = ("_sock", "_name") + + def __init__( + self, + runner: "BaseRunner", + sock: socket.socket, + *, + shutdown_timeout: float = 60.0, + ssl_context: Optional[SSLContext] = None, + backlog: int = 128, + ) -> None: + super().__init__( + runner, + shutdown_timeout=shutdown_timeout, + ssl_context=ssl_context, + backlog=backlog, + ) + self._sock = sock + scheme = "https" if self._ssl_context else "http" + if hasattr(socket, "AF_UNIX") and sock.family == socket.AF_UNIX: + name = f"{scheme}://unix:{sock.getsockname()}:" + else: + host, port = sock.getsockname()[:2] + name = str(URL.build(scheme=scheme, host=host, port=port)) + self._name = name + + @property + def name(self) -> str: + return self._name + + async def start(self) -> None: + await super().start() + loop = asyncio.get_event_loop() + server = self._runner.server + assert server is not None + self._server = await loop.create_server( + server, sock=self._sock, ssl=self._ssl_context, backlog=self._backlog + ) + + +class BaseRunner(ABC): + __slots__ = ("_handle_signals", "_kwargs", "_server", "_sites", "_shutdown_timeout") + + def __init__( + self, + *, + handle_signals: bool = False, + shutdown_timeout: float = 60.0, + **kwargs: Any, + ) -> None: + self._handle_signals = handle_signals + self._kwargs = kwargs + self._server: Optional[Server] = None + self._sites: List[BaseSite] = [] + self._shutdown_timeout = shutdown_timeout + + @property + def server(self) -> Optional[Server]: + return self._server + + @property + def addresses(self) -> List[Any]: + ret: List[Any] = [] + for site in self._sites: + server = site._server + if server is not None: + sockets = server.sockets # type: ignore[attr-defined] + if sockets is not None: + for sock in sockets: + ret.append(sock.getsockname()) + return ret + + @property + def sites(self) -> Set[BaseSite]: + return set(self._sites) + + async def setup(self) -> None: + loop = asyncio.get_event_loop() + + if self._handle_signals: + try: + loop.add_signal_handler(signal.SIGINT, _raise_graceful_exit) + loop.add_signal_handler(signal.SIGTERM, _raise_graceful_exit) + except NotImplementedError: # pragma: no cover + # add_signal_handler is not implemented on Windows + pass + + self._server = await self._make_server() + + @abstractmethod + async def shutdown(self) -> None: + """Call any shutdown hooks to help server close gracefully.""" + + async def cleanup(self) -> None: + # The loop over sites is intentional, an exception on gather() + # leaves self._sites in unpredictable state. + # The loop guaranties that a site is either deleted on success or + # still present on failure + for site in list(self._sites): + await site.stop() + + if self._server: # If setup succeeded + # Yield to event loop to ensure incoming requests prior to stopping the sites + # have all started to be handled before we proceed to close idle connections. + await asyncio.sleep(0) + self._server.pre_shutdown() + await self.shutdown() + await self._server.shutdown(self._shutdown_timeout) + await self._cleanup_server() + + self._server = None + if self._handle_signals: + loop = asyncio.get_running_loop() + try: + loop.remove_signal_handler(signal.SIGINT) + loop.remove_signal_handler(signal.SIGTERM) + except NotImplementedError: # pragma: no cover + # remove_signal_handler is not implemented on Windows + pass + + @abstractmethod + async def _make_server(self) -> Server: + pass # pragma: no cover + + @abstractmethod + async def _cleanup_server(self) -> None: + pass # pragma: no cover + + def _reg_site(self, site: BaseSite) -> None: + if site in self._sites: + raise RuntimeError(f"Site {site} is already registered in runner {self}") + self._sites.append(site) + + def _check_site(self, site: BaseSite) -> None: + if site not in self._sites: + raise RuntimeError(f"Site {site} is not registered in runner {self}") + + def _unreg_site(self, site: BaseSite) -> None: + if site not in self._sites: + raise RuntimeError(f"Site {site} is not registered in runner {self}") + self._sites.remove(site) + + +class ServerRunner(BaseRunner): + """Low-level web server runner""" + + __slots__ = ("_web_server",) + + def __init__( + self, web_server: Server, *, handle_signals: bool = False, **kwargs: Any + ) -> None: + super().__init__(handle_signals=handle_signals, **kwargs) + self._web_server = web_server + + async def shutdown(self) -> None: + pass + + async def _make_server(self) -> Server: + return self._web_server + + async def _cleanup_server(self) -> None: + pass + + +class AppRunner(BaseRunner): + """Web Application runner""" + + __slots__ = ("_app",) + + def __init__( + self, app: Application, *, handle_signals: bool = False, **kwargs: Any + ) -> None: + super().__init__(handle_signals=handle_signals, **kwargs) + if not isinstance(app, Application): + raise TypeError( + "The first argument should be web.Application " + "instance, got {!r}".format(app) + ) + self._app = app + + @property + def app(self) -> Application: + return self._app + + async def shutdown(self) -> None: + await self._app.shutdown() + + async def _make_server(self) -> Server: + loop = asyncio.get_event_loop() + self._app._set_loop(loop) + self._app.on_startup.freeze() + await self._app.startup() + self._app.freeze() + + return self._app._make_handler(loop=loop, **self._kwargs) + + async def _cleanup_server(self) -> None: + await self._app.cleanup() diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_server.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_server.py new file mode 100644 index 0000000..328aca1 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_server.py @@ -0,0 +1,84 @@ +"""Low level HTTP server.""" + +import asyncio +from typing import Any, Awaitable, Callable, Dict, List, Optional # noqa + +from .abc import AbstractStreamWriter +from .http_parser import RawRequestMessage +from .streams import StreamReader +from .web_protocol import RequestHandler, _RequestFactory, _RequestHandler +from .web_request import BaseRequest + +__all__ = ("Server",) + + +class Server: + def __init__( + self, + handler: _RequestHandler, + *, + request_factory: Optional[_RequestFactory] = None, + handler_cancellation: bool = False, + loop: Optional[asyncio.AbstractEventLoop] = None, + **kwargs: Any, + ) -> None: + self._loop = loop or asyncio.get_running_loop() + self._connections: Dict[RequestHandler, asyncio.Transport] = {} + self._kwargs = kwargs + # requests_count is the number of requests being processed by the server + # for the lifetime of the server. + self.requests_count = 0 + self.request_handler = handler + self.request_factory = request_factory or self._make_request + self.handler_cancellation = handler_cancellation + + @property + def connections(self) -> List[RequestHandler]: + return list(self._connections.keys()) + + def connection_made( + self, handler: RequestHandler, transport: asyncio.Transport + ) -> None: + self._connections[handler] = transport + + def connection_lost( + self, handler: RequestHandler, exc: Optional[BaseException] = None + ) -> None: + if handler in self._connections: + if handler._task_handler: + handler._task_handler.add_done_callback( + lambda f: self._connections.pop(handler, None) + ) + else: + del self._connections[handler] + + def _make_request( + self, + message: RawRequestMessage, + payload: StreamReader, + protocol: RequestHandler, + writer: AbstractStreamWriter, + task: "asyncio.Task[None]", + ) -> BaseRequest: + return BaseRequest(message, payload, protocol, writer, task, self._loop) + + def pre_shutdown(self) -> None: + for conn in self._connections: + conn.close() + + async def shutdown(self, timeout: Optional[float] = None) -> None: + coros = (conn.shutdown(timeout) for conn in self._connections) + await asyncio.gather(*coros) + self._connections.clear() + + def __call__(self) -> RequestHandler: + try: + return RequestHandler(self, loop=self._loop, **self._kwargs) + except TypeError: + # Failsafe creation: remove all custom handler_args + kwargs = { + k: v + for k, v in self._kwargs.items() + if k in ["debug", "access_log_class"] + } + return RequestHandler(self, loop=self._loop, **kwargs) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_urldispatcher.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_urldispatcher.py new file mode 100644 index 0000000..cfa57a3 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_urldispatcher.py @@ -0,0 +1,1305 @@ +import abc +import asyncio +import base64 +import functools +import hashlib +import html +import inspect +import keyword +import os +import platform +import re +import sys +import warnings +from functools import wraps +from pathlib import Path +from types import MappingProxyType +from typing import ( + TYPE_CHECKING, + Any, + Awaitable, + Callable, + Container, + Dict, + Final, + Generator, + Iterable, + Iterator, + List, + Mapping, + NoReturn, + Optional, + Pattern, + Set, + Sized, + Tuple, + Type, + TypedDict, + Union, + cast, +) + +from yarl import URL, __version__ as yarl_version + +from . import hdrs +from .abc import AbstractMatchInfo, AbstractRouter, AbstractView +from .helpers import DEBUG +from .http import HttpVersion11 +from .typedefs import Handler, PathLike +from .web_exceptions import ( + HTTPException, + HTTPExpectationFailed, + HTTPForbidden, + HTTPMethodNotAllowed, + HTTPNotFound, +) +from .web_fileresponse import FileResponse +from .web_request import Request +from .web_response import Response, StreamResponse +from .web_routedef import AbstractRouteDef + +__all__ = ( + "UrlDispatcher", + "UrlMappingMatchInfo", + "AbstractResource", + "Resource", + "PlainResource", + "DynamicResource", + "AbstractRoute", + "ResourceRoute", + "StaticResource", + "View", +) + + +if TYPE_CHECKING: + from .web_app import Application + + BaseDict = Dict[str, str] +else: + BaseDict = dict + +CIRCULAR_SYMLINK_ERROR = ( + (OSError,) + if sys.version_info < (3, 10) and sys.platform.startswith("win32") + else (RuntimeError,) if sys.version_info < (3, 13) else () +) + +YARL_VERSION: Final[Tuple[int, ...]] = tuple(map(int, yarl_version.split(".")[:2])) + +HTTP_METHOD_RE: Final[Pattern[str]] = re.compile( + r"^[0-9A-Za-z!#\$%&'\*\+\-\.\^_`\|~]+$" +) +ROUTE_RE: Final[Pattern[str]] = re.compile( + r"(\{[_a-zA-Z][^{}]*(?:\{[^{}]*\}[^{}]*)*\})" +) +PATH_SEP: Final[str] = re.escape("/") + +IS_WINDOWS: Final[bool] = platform.system() == "Windows" + +_ExpectHandler = Callable[[Request], Awaitable[Optional[StreamResponse]]] +_Resolve = Tuple[Optional["UrlMappingMatchInfo"], Set[str]] + +html_escape = functools.partial(html.escape, quote=True) + + +class _InfoDict(TypedDict, total=False): + path: str + + formatter: str + pattern: Pattern[str] + + directory: Path + prefix: str + routes: Mapping[str, "AbstractRoute"] + + app: "Application" + + domain: str + + rule: "AbstractRuleMatching" + + http_exception: HTTPException + + +class AbstractResource(Sized, Iterable["AbstractRoute"]): + def __init__(self, *, name: Optional[str] = None) -> None: + self._name = name + + @property + def name(self) -> Optional[str]: + return self._name + + @property + @abc.abstractmethod + def canonical(self) -> str: + """Exposes the resource's canonical path. + + For example '/foo/bar/{name}' + + """ + + @abc.abstractmethod # pragma: no branch + def url_for(self, **kwargs: str) -> URL: + """Construct url for resource with additional params.""" + + @abc.abstractmethod # pragma: no branch + async def resolve(self, request: Request) -> _Resolve: + """Resolve resource. + + Return (UrlMappingMatchInfo, allowed_methods) pair. + """ + + @abc.abstractmethod + def add_prefix(self, prefix: str) -> None: + """Add a prefix to processed URLs. + + Required for subapplications support. + """ + + @abc.abstractmethod + def get_info(self) -> _InfoDict: + """Return a dict with additional info useful for introspection""" + + def freeze(self) -> None: + pass + + @abc.abstractmethod + def raw_match(self, path: str) -> bool: + """Perform a raw match against path""" + + +class AbstractRoute(abc.ABC): + def __init__( + self, + method: str, + handler: Union[Handler, Type[AbstractView]], + *, + expect_handler: Optional[_ExpectHandler] = None, + resource: Optional[AbstractResource] = None, + ) -> None: + + if expect_handler is None: + expect_handler = _default_expect_handler + + assert inspect.iscoroutinefunction(expect_handler) or ( + sys.version_info < (3, 14) and asyncio.iscoroutinefunction(expect_handler) + ), f"Coroutine is expected, got {expect_handler!r}" + + method = method.upper() + if not HTTP_METHOD_RE.match(method): + raise ValueError(f"{method} is not allowed HTTP method") + + assert callable(handler), handler + if inspect.iscoroutinefunction(handler) or ( + sys.version_info < (3, 14) and asyncio.iscoroutinefunction(handler) + ): + pass + elif inspect.isgeneratorfunction(handler): + if TYPE_CHECKING: + assert False + warnings.warn( + "Bare generators are deprecated, use @coroutine wrapper", + DeprecationWarning, + ) + elif isinstance(handler, type) and issubclass(handler, AbstractView): + pass + else: + warnings.warn( + "Bare functions are deprecated, use async ones", DeprecationWarning + ) + + @wraps(handler) + async def handler_wrapper(request: Request) -> StreamResponse: + result = old_handler(request) # type: ignore[call-arg] + if asyncio.iscoroutine(result): + result = await result + assert isinstance(result, StreamResponse) + return result + + old_handler = handler + handler = handler_wrapper + + self._method = method + self._handler = handler + self._expect_handler = expect_handler + self._resource = resource + + @property + def method(self) -> str: + return self._method + + @property + def handler(self) -> Handler: + return self._handler + + @property + @abc.abstractmethod + def name(self) -> Optional[str]: + """Optional route's name, always equals to resource's name.""" + + @property + def resource(self) -> Optional[AbstractResource]: + return self._resource + + @abc.abstractmethod + def get_info(self) -> _InfoDict: + """Return a dict with additional info useful for introspection""" + + @abc.abstractmethod # pragma: no branch + def url_for(self, *args: str, **kwargs: str) -> URL: + """Construct url for route with additional params.""" + + async def handle_expect_header(self, request: Request) -> Optional[StreamResponse]: + return await self._expect_handler(request) + + +class UrlMappingMatchInfo(BaseDict, AbstractMatchInfo): + + __slots__ = ("_route", "_apps", "_current_app", "_frozen") + + def __init__(self, match_dict: Dict[str, str], route: AbstractRoute) -> None: + super().__init__(match_dict) + self._route = route + self._apps: List[Application] = [] + self._current_app: Optional[Application] = None + self._frozen = False + + @property + def handler(self) -> Handler: + return self._route.handler + + @property + def route(self) -> AbstractRoute: + return self._route + + @property + def expect_handler(self) -> _ExpectHandler: + return self._route.handle_expect_header + + @property + def http_exception(self) -> Optional[HTTPException]: + return None + + def get_info(self) -> _InfoDict: # type: ignore[override] + return self._route.get_info() + + @property + def apps(self) -> Tuple["Application", ...]: + return tuple(self._apps) + + def add_app(self, app: "Application") -> None: + if self._frozen: + raise RuntimeError("Cannot change apps stack after .freeze() call") + if self._current_app is None: + self._current_app = app + self._apps.insert(0, app) + + @property + def current_app(self) -> "Application": + app = self._current_app + assert app is not None + return app + + @current_app.setter + def current_app(self, app: "Application") -> None: + if DEBUG: # pragma: no cover + if app not in self._apps: + raise RuntimeError( + "Expected one of the following apps {!r}, got {!r}".format( + self._apps, app + ) + ) + self._current_app = app + + def freeze(self) -> None: + self._frozen = True + + def __repr__(self) -> str: + return f"" + + +class MatchInfoError(UrlMappingMatchInfo): + + __slots__ = ("_exception",) + + def __init__(self, http_exception: HTTPException) -> None: + self._exception = http_exception + super().__init__({}, SystemRoute(self._exception)) + + @property + def http_exception(self) -> HTTPException: + return self._exception + + def __repr__(self) -> str: + return "".format( + self._exception.status, self._exception.reason + ) + + +async def _default_expect_handler(request: Request) -> None: + """Default handler for Expect header. + + Just send "100 Continue" to client. + raise HTTPExpectationFailed if value of header is not "100-continue" + """ + expect = request.headers.get(hdrs.EXPECT, "") + if request.version == HttpVersion11: + if expect.lower() == "100-continue": + await request.writer.write(b"HTTP/1.1 100 Continue\r\n\r\n") + # Reset output_size as we haven't started the main body yet. + request.writer.output_size = 0 + else: + raise HTTPExpectationFailed(text="Unknown Expect: %s" % expect) + + +class Resource(AbstractResource): + def __init__(self, *, name: Optional[str] = None) -> None: + super().__init__(name=name) + self._routes: Dict[str, ResourceRoute] = {} + self._any_route: Optional[ResourceRoute] = None + self._allowed_methods: Set[str] = set() + + def add_route( + self, + method: str, + handler: Union[Type[AbstractView], Handler], + *, + expect_handler: Optional[_ExpectHandler] = None, + ) -> "ResourceRoute": + if route := self._routes.get(method, self._any_route): + raise RuntimeError( + "Added route will never be executed, " + f"method {route.method} is already " + "registered" + ) + + route_obj = ResourceRoute(method, handler, self, expect_handler=expect_handler) + self.register_route(route_obj) + return route_obj + + def register_route(self, route: "ResourceRoute") -> None: + assert isinstance( + route, ResourceRoute + ), f"Instance of Route class is required, got {route!r}" + if route.method == hdrs.METH_ANY: + self._any_route = route + self._allowed_methods.add(route.method) + self._routes[route.method] = route + + async def resolve(self, request: Request) -> _Resolve: + if (match_dict := self._match(request.rel_url.path_safe)) is None: + return None, set() + if route := self._routes.get(request.method, self._any_route): + return UrlMappingMatchInfo(match_dict, route), self._allowed_methods + return None, self._allowed_methods + + @abc.abstractmethod + def _match(self, path: str) -> Optional[Dict[str, str]]: + pass # pragma: no cover + + def __len__(self) -> int: + return len(self._routes) + + def __iter__(self) -> Iterator["ResourceRoute"]: + return iter(self._routes.values()) + + # TODO: implement all abstract methods + + +class PlainResource(Resource): + def __init__(self, path: str, *, name: Optional[str] = None) -> None: + super().__init__(name=name) + assert not path or path.startswith("/") + self._path = path + + @property + def canonical(self) -> str: + return self._path + + def freeze(self) -> None: + if not self._path: + self._path = "/" + + def add_prefix(self, prefix: str) -> None: + assert prefix.startswith("/") + assert not prefix.endswith("/") + assert len(prefix) > 1 + self._path = prefix + self._path + + def _match(self, path: str) -> Optional[Dict[str, str]]: + # string comparison is about 10 times faster than regexp matching + if self._path == path: + return {} + return None + + def raw_match(self, path: str) -> bool: + return self._path == path + + def get_info(self) -> _InfoDict: + return {"path": self._path} + + def url_for(self) -> URL: # type: ignore[override] + return URL.build(path=self._path, encoded=True) + + def __repr__(self) -> str: + name = "'" + self.name + "' " if self.name is not None else "" + return f"" + + +class DynamicResource(Resource): + + DYN = re.compile(r"\{(?P[_a-zA-Z][_a-zA-Z0-9]*)\}") + DYN_WITH_RE = re.compile(r"\{(?P[_a-zA-Z][_a-zA-Z0-9]*):(?P.+)\}") + GOOD = r"[^{}/]+" + + def __init__(self, path: str, *, name: Optional[str] = None) -> None: + super().__init__(name=name) + self._orig_path = path + pattern = "" + formatter = "" + for part in ROUTE_RE.split(path): + match = self.DYN.fullmatch(part) + if match: + pattern += "(?P<{}>{})".format(match.group("var"), self.GOOD) + formatter += "{" + match.group("var") + "}" + continue + + match = self.DYN_WITH_RE.fullmatch(part) + if match: + pattern += "(?P<{var}>{re})".format(**match.groupdict()) + formatter += "{" + match.group("var") + "}" + continue + + if "{" in part or "}" in part: + raise ValueError(f"Invalid path '{path}'['{part}']") + + part = _requote_path(part) + formatter += part + pattern += re.escape(part) + + try: + compiled = re.compile(pattern) + except re.error as exc: + raise ValueError(f"Bad pattern '{pattern}': {exc}") from None + assert compiled.pattern.startswith(PATH_SEP) + assert formatter.startswith("/") + self._pattern = compiled + self._formatter = formatter + + @property + def canonical(self) -> str: + return self._formatter + + def add_prefix(self, prefix: str) -> None: + assert prefix.startswith("/") + assert not prefix.endswith("/") + assert len(prefix) > 1 + self._pattern = re.compile(re.escape(prefix) + self._pattern.pattern) + self._formatter = prefix + self._formatter + + def _match(self, path: str) -> Optional[Dict[str, str]]: + match = self._pattern.fullmatch(path) + if match is None: + return None + return { + key: _unquote_path_safe(value) for key, value in match.groupdict().items() + } + + def raw_match(self, path: str) -> bool: + return self._orig_path == path + + def get_info(self) -> _InfoDict: + return {"formatter": self._formatter, "pattern": self._pattern} + + def url_for(self, **parts: str) -> URL: + url = self._formatter.format_map({k: _quote_path(v) for k, v in parts.items()}) + return URL.build(path=url, encoded=True) + + def __repr__(self) -> str: + name = "'" + self.name + "' " if self.name is not None else "" + return "".format( + name=name, formatter=self._formatter + ) + + +class PrefixResource(AbstractResource): + def __init__(self, prefix: str, *, name: Optional[str] = None) -> None: + assert not prefix or prefix.startswith("/"), prefix + assert prefix in ("", "/") or not prefix.endswith("/"), prefix + super().__init__(name=name) + self._prefix = _requote_path(prefix) + self._prefix2 = self._prefix + "/" + + @property + def canonical(self) -> str: + return self._prefix + + def add_prefix(self, prefix: str) -> None: + assert prefix.startswith("/") + assert not prefix.endswith("/") + assert len(prefix) > 1 + self._prefix = prefix + self._prefix + self._prefix2 = self._prefix + "/" + + def raw_match(self, prefix: str) -> bool: + return False + + # TODO: impl missing abstract methods + + +class StaticResource(PrefixResource): + VERSION_KEY = "v" + + def __init__( + self, + prefix: str, + directory: PathLike, + *, + name: Optional[str] = None, + expect_handler: Optional[_ExpectHandler] = None, + chunk_size: int = 256 * 1024, + show_index: bool = False, + follow_symlinks: bool = False, + append_version: bool = False, + ) -> None: + super().__init__(prefix, name=name) + try: + directory = Path(directory).expanduser().resolve(strict=True) + except FileNotFoundError as error: + raise ValueError(f"'{directory}' does not exist") from error + if not directory.is_dir(): + raise ValueError(f"'{directory}' is not a directory") + self._directory = directory + self._show_index = show_index + self._chunk_size = chunk_size + self._follow_symlinks = follow_symlinks + self._expect_handler = expect_handler + self._append_version = append_version + + self._routes = { + "GET": ResourceRoute( + "GET", self._handle, self, expect_handler=expect_handler + ), + "HEAD": ResourceRoute( + "HEAD", self._handle, self, expect_handler=expect_handler + ), + } + self._allowed_methods = set(self._routes) + + def url_for( # type: ignore[override] + self, + *, + filename: PathLike, + append_version: Optional[bool] = None, + ) -> URL: + if append_version is None: + append_version = self._append_version + filename = str(filename).lstrip("/") + + url = URL.build(path=self._prefix, encoded=True) + # filename is not encoded + if YARL_VERSION < (1, 6): + url = url / filename.replace("%", "%25") + else: + url = url / filename + + if append_version: + unresolved_path = self._directory.joinpath(filename) + try: + if self._follow_symlinks: + normalized_path = Path(os.path.normpath(unresolved_path)) + normalized_path.relative_to(self._directory) + filepath = normalized_path.resolve() + else: + filepath = unresolved_path.resolve() + filepath.relative_to(self._directory) + except (ValueError, FileNotFoundError): + # ValueError for case when path point to symlink + # with follow_symlinks is False + return url # relatively safe + if filepath.is_file(): + # TODO cache file content + # with file watcher for cache invalidation + with filepath.open("rb") as f: + file_bytes = f.read() + h = self._get_file_hash(file_bytes) + url = url.with_query({self.VERSION_KEY: h}) + return url + return url + + @staticmethod + def _get_file_hash(byte_array: bytes) -> str: + m = hashlib.sha256() # todo sha256 can be configurable param + m.update(byte_array) + b64 = base64.urlsafe_b64encode(m.digest()) + return b64.decode("ascii") + + def get_info(self) -> _InfoDict: + return { + "directory": self._directory, + "prefix": self._prefix, + "routes": self._routes, + } + + def set_options_route(self, handler: Handler) -> None: + if "OPTIONS" in self._routes: + raise RuntimeError("OPTIONS route was set already") + self._routes["OPTIONS"] = ResourceRoute( + "OPTIONS", handler, self, expect_handler=self._expect_handler + ) + self._allowed_methods.add("OPTIONS") + + async def resolve(self, request: Request) -> _Resolve: + path = request.rel_url.path_safe + method = request.method + # We normalise here to avoid matches that traverse below the static root. + # e.g. /static/../../../../home/user/webapp/static/ + norm_path = os.path.normpath(path) + if IS_WINDOWS: + norm_path = norm_path.replace("\\", "/") + if not norm_path.startswith(self._prefix2) and norm_path != self._prefix: + return None, set() + + allowed_methods = self._allowed_methods + if method not in allowed_methods: + return None, allowed_methods + + match_dict = {"filename": _unquote_path_safe(path[len(self._prefix) + 1 :])} + return (UrlMappingMatchInfo(match_dict, self._routes[method]), allowed_methods) + + def __len__(self) -> int: + return len(self._routes) + + def __iter__(self) -> Iterator[AbstractRoute]: + return iter(self._routes.values()) + + async def _handle(self, request: Request) -> StreamResponse: + filename = request.match_info["filename"] + unresolved_path = self._directory.joinpath(filename) + loop = asyncio.get_running_loop() + return await loop.run_in_executor( + None, self._resolve_path_to_response, unresolved_path + ) + + def _resolve_path_to_response(self, unresolved_path: Path) -> StreamResponse: + """Take the unresolved path and query the file system to form a response.""" + # Check for access outside the root directory. For follow symlinks, URI + # cannot traverse out, but symlinks can. Otherwise, no access outside + # root is permitted. + try: + if self._follow_symlinks: + normalized_path = Path(os.path.normpath(unresolved_path)) + normalized_path.relative_to(self._directory) + file_path = normalized_path.resolve() + else: + file_path = unresolved_path.resolve() + file_path.relative_to(self._directory) + except (ValueError, *CIRCULAR_SYMLINK_ERROR) as error: + # ValueError is raised for the relative check. Circular symlinks + # raise here on resolving for python < 3.13. + raise HTTPNotFound() from error + + # if path is a directory, return the contents if permitted. Note the + # directory check will raise if a segment is not readable. + try: + if file_path.is_dir(): + if self._show_index: + return Response( + text=self._directory_as_html(file_path), + content_type="text/html", + ) + else: + raise HTTPForbidden() + except PermissionError as error: + raise HTTPForbidden() from error + + # Return the file response, which handles all other checks. + return FileResponse(file_path, chunk_size=self._chunk_size) + + def _directory_as_html(self, dir_path: Path) -> str: + """returns directory's index as html.""" + assert dir_path.is_dir() + + relative_path_to_dir = dir_path.relative_to(self._directory).as_posix() + index_of = f"Index of /{html_escape(relative_path_to_dir)}" + h1 = f"

    {index_of}

    " + + index_list = [] + dir_index = dir_path.iterdir() + for _file in sorted(dir_index): + # show file url as relative to static path + rel_path = _file.relative_to(self._directory).as_posix() + quoted_file_url = _quote_path(f"{self._prefix}/{rel_path}") + + # if file is a directory, add '/' to the end of the name + if _file.is_dir(): + file_name = f"{_file.name}/" + else: + file_name = _file.name + + index_list.append( + f'
  • {html_escape(file_name)}
  • ' + ) + ul = "
      \n{}\n
    ".format("\n".join(index_list)) + body = f"\n{h1}\n{ul}\n" + + head_str = f"\n{index_of}\n" + html = f"\n{head_str}\n{body}\n" + + return html + + def __repr__(self) -> str: + name = "'" + self.name + "'" if self.name is not None else "" + return " {directory!r}>".format( + name=name, path=self._prefix, directory=self._directory + ) + + +class PrefixedSubAppResource(PrefixResource): + def __init__(self, prefix: str, app: "Application") -> None: + super().__init__(prefix) + self._app = app + self._add_prefix_to_resources(prefix) + + def add_prefix(self, prefix: str) -> None: + super().add_prefix(prefix) + self._add_prefix_to_resources(prefix) + + def _add_prefix_to_resources(self, prefix: str) -> None: + router = self._app.router + for resource in router.resources(): + # Since the canonical path of a resource is about + # to change, we need to unindex it and then reindex + router.unindex_resource(resource) + resource.add_prefix(prefix) + router.index_resource(resource) + + def url_for(self, *args: str, **kwargs: str) -> URL: + raise RuntimeError(".url_for() is not supported by sub-application root") + + def get_info(self) -> _InfoDict: + return {"app": self._app, "prefix": self._prefix} + + async def resolve(self, request: Request) -> _Resolve: + match_info = await self._app.router.resolve(request) + match_info.add_app(self._app) + if isinstance(match_info.http_exception, HTTPMethodNotAllowed): + methods = match_info.http_exception.allowed_methods + else: + methods = set() + return match_info, methods + + def __len__(self) -> int: + return len(self._app.router.routes()) + + def __iter__(self) -> Iterator[AbstractRoute]: + return iter(self._app.router.routes()) + + def __repr__(self) -> str: + return " {app!r}>".format( + prefix=self._prefix, app=self._app + ) + + +class AbstractRuleMatching(abc.ABC): + @abc.abstractmethod # pragma: no branch + async def match(self, request: Request) -> bool: + """Return bool if the request satisfies the criteria""" + + @abc.abstractmethod # pragma: no branch + def get_info(self) -> _InfoDict: + """Return a dict with additional info useful for introspection""" + + @property + @abc.abstractmethod # pragma: no branch + def canonical(self) -> str: + """Return a str""" + + +class Domain(AbstractRuleMatching): + re_part = re.compile(r"(?!-)[a-z\d-]{1,63}(? None: + super().__init__() + self._domain = self.validation(domain) + + @property + def canonical(self) -> str: + return self._domain + + def validation(self, domain: str) -> str: + if not isinstance(domain, str): + raise TypeError("Domain must be str") + domain = domain.rstrip(".").lower() + if not domain: + raise ValueError("Domain cannot be empty") + elif "://" in domain: + raise ValueError("Scheme not supported") + url = URL("http://" + domain) + assert url.raw_host is not None + if not all(self.re_part.fullmatch(x) for x in url.raw_host.split(".")): + raise ValueError("Domain not valid") + if url.port == 80: + return url.raw_host + return f"{url.raw_host}:{url.port}" + + async def match(self, request: Request) -> bool: + host = request.headers.get(hdrs.HOST) + if not host: + return False + return self.match_domain(host) + + def match_domain(self, host: str) -> bool: + return host.lower() == self._domain + + def get_info(self) -> _InfoDict: + return {"domain": self._domain} + + +class MaskDomain(Domain): + re_part = re.compile(r"(?!-)[a-z\d\*-]{1,63}(? None: + super().__init__(domain) + mask = self._domain.replace(".", r"\.").replace("*", ".*") + self._mask = re.compile(mask) + + @property + def canonical(self) -> str: + return self._mask.pattern + + def match_domain(self, host: str) -> bool: + return self._mask.fullmatch(host) is not None + + +class MatchedSubAppResource(PrefixedSubAppResource): + def __init__(self, rule: AbstractRuleMatching, app: "Application") -> None: + AbstractResource.__init__(self) + self._prefix = "" + self._app = app + self._rule = rule + + @property + def canonical(self) -> str: + return self._rule.canonical + + def get_info(self) -> _InfoDict: + return {"app": self._app, "rule": self._rule} + + async def resolve(self, request: Request) -> _Resolve: + if not await self._rule.match(request): + return None, set() + match_info = await self._app.router.resolve(request) + match_info.add_app(self._app) + if isinstance(match_info.http_exception, HTTPMethodNotAllowed): + methods = match_info.http_exception.allowed_methods + else: + methods = set() + return match_info, methods + + def __repr__(self) -> str: + return f" {self._app!r}>" + + +class ResourceRoute(AbstractRoute): + """A route with resource""" + + def __init__( + self, + method: str, + handler: Union[Handler, Type[AbstractView]], + resource: AbstractResource, + *, + expect_handler: Optional[_ExpectHandler] = None, + ) -> None: + super().__init__( + method, handler, expect_handler=expect_handler, resource=resource + ) + + def __repr__(self) -> str: + return " {handler!r}".format( + method=self.method, resource=self._resource, handler=self.handler + ) + + @property + def name(self) -> Optional[str]: + if self._resource is None: + return None + return self._resource.name + + def url_for(self, *args: str, **kwargs: str) -> URL: + """Construct url for route with additional params.""" + assert self._resource is not None + return self._resource.url_for(*args, **kwargs) + + def get_info(self) -> _InfoDict: + assert self._resource is not None + return self._resource.get_info() + + +class SystemRoute(AbstractRoute): + def __init__(self, http_exception: HTTPException) -> None: + super().__init__(hdrs.METH_ANY, self._handle) + self._http_exception = http_exception + + def url_for(self, *args: str, **kwargs: str) -> URL: + raise RuntimeError(".url_for() is not allowed for SystemRoute") + + @property + def name(self) -> Optional[str]: + return None + + def get_info(self) -> _InfoDict: + return {"http_exception": self._http_exception} + + async def _handle(self, request: Request) -> StreamResponse: + raise self._http_exception + + @property + def status(self) -> int: + return self._http_exception.status + + @property + def reason(self) -> str: + return self._http_exception.reason + + def __repr__(self) -> str: + return "".format(self=self) + + +class View(AbstractView): + async def _iter(self) -> StreamResponse: + if self.request.method not in hdrs.METH_ALL: + self._raise_allowed_methods() + method: Optional[Callable[[], Awaitable[StreamResponse]]] + method = getattr(self, self.request.method.lower(), None) + if method is None: + self._raise_allowed_methods() + ret = await method() + assert isinstance(ret, StreamResponse) + return ret + + def __await__(self) -> Generator[None, None, StreamResponse]: + return self._iter().__await__() + + def _raise_allowed_methods(self) -> NoReturn: + allowed_methods = {m for m in hdrs.METH_ALL if hasattr(self, m.lower())} + raise HTTPMethodNotAllowed(self.request.method, allowed_methods) + + +class ResourcesView(Sized, Iterable[AbstractResource], Container[AbstractResource]): + def __init__(self, resources: List[AbstractResource]) -> None: + self._resources = resources + + def __len__(self) -> int: + return len(self._resources) + + def __iter__(self) -> Iterator[AbstractResource]: + yield from self._resources + + def __contains__(self, resource: object) -> bool: + return resource in self._resources + + +class RoutesView(Sized, Iterable[AbstractRoute], Container[AbstractRoute]): + def __init__(self, resources: List[AbstractResource]): + self._routes: List[AbstractRoute] = [] + for resource in resources: + for route in resource: + self._routes.append(route) + + def __len__(self) -> int: + return len(self._routes) + + def __iter__(self) -> Iterator[AbstractRoute]: + yield from self._routes + + def __contains__(self, route: object) -> bool: + return route in self._routes + + +class UrlDispatcher(AbstractRouter, Mapping[str, AbstractResource]): + + NAME_SPLIT_RE = re.compile(r"[.:-]") + + def __init__(self) -> None: + super().__init__() + self._resources: List[AbstractResource] = [] + self._named_resources: Dict[str, AbstractResource] = {} + self._resource_index: dict[str, list[AbstractResource]] = {} + self._matched_sub_app_resources: List[MatchedSubAppResource] = [] + + async def resolve(self, request: Request) -> UrlMappingMatchInfo: + resource_index = self._resource_index + allowed_methods: Set[str] = set() + + # MatchedSubAppResource is primarily used to match on domain names + # (though custom rules could match on other things). This means that + # the traversal algorithm below can't be applied, and that we likely + # need to check these first so a sub app that defines the same path + # as a parent app will get priority if there's a domain match. + # + # For most cases we do not expect there to be many of these since + # currently they are only added by `.add_domain()`. + for resource in self._matched_sub_app_resources: + match_dict, allowed = await resource.resolve(request) + if match_dict is not None: + return match_dict + else: + allowed_methods |= allowed + + # Walk the url parts looking for candidates. We walk the url backwards + # to ensure the most explicit match is found first. If there are multiple + # candidates for a given url part because there are multiple resources + # registered for the same canonical path, we resolve them in a linear + # fashion to ensure registration order is respected. + url_part = request.rel_url.path_safe + while url_part: + for candidate in resource_index.get(url_part, ()): + match_dict, allowed = await candidate.resolve(request) + if match_dict is not None: + return match_dict + else: + allowed_methods |= allowed + if url_part == "/": + break + url_part = url_part.rpartition("/")[0] or "/" + + if allowed_methods: + return MatchInfoError(HTTPMethodNotAllowed(request.method, allowed_methods)) + + return MatchInfoError(HTTPNotFound()) + + def __iter__(self) -> Iterator[str]: + return iter(self._named_resources) + + def __len__(self) -> int: + return len(self._named_resources) + + def __contains__(self, resource: object) -> bool: + return resource in self._named_resources + + def __getitem__(self, name: str) -> AbstractResource: + return self._named_resources[name] + + def resources(self) -> ResourcesView: + return ResourcesView(self._resources) + + def routes(self) -> RoutesView: + return RoutesView(self._resources) + + def named_resources(self) -> Mapping[str, AbstractResource]: + return MappingProxyType(self._named_resources) + + def register_resource(self, resource: AbstractResource) -> None: + assert isinstance( + resource, AbstractResource + ), f"Instance of AbstractResource class is required, got {resource!r}" + if self.frozen: + raise RuntimeError("Cannot register a resource into frozen router.") + + name = resource.name + + if name is not None: + parts = self.NAME_SPLIT_RE.split(name) + for part in parts: + if keyword.iskeyword(part): + raise ValueError( + f"Incorrect route name {name!r}, " + "python keywords cannot be used " + "for route name" + ) + if not part.isidentifier(): + raise ValueError( + "Incorrect route name {!r}, " + "the name should be a sequence of " + "python identifiers separated " + "by dash, dot or column".format(name) + ) + if name in self._named_resources: + raise ValueError( + "Duplicate {!r}, " + "already handled by {!r}".format(name, self._named_resources[name]) + ) + self._named_resources[name] = resource + self._resources.append(resource) + + if isinstance(resource, MatchedSubAppResource): + # We cannot index match sub-app resources because they have match rules + self._matched_sub_app_resources.append(resource) + else: + self.index_resource(resource) + + def _get_resource_index_key(self, resource: AbstractResource) -> str: + """Return a key to index the resource in the resource index.""" + if "{" in (index_key := resource.canonical): + # strip at the first { to allow for variables, and than + # rpartition at / to allow for variable parts in the path + # For example if the canonical path is `/core/locations{tail:.*}` + # the index key will be `/core` since index is based on the + # url parts split by `/` + index_key = index_key.partition("{")[0].rpartition("/")[0] + return index_key.rstrip("/") or "/" + + def index_resource(self, resource: AbstractResource) -> None: + """Add a resource to the resource index.""" + resource_key = self._get_resource_index_key(resource) + # There may be multiple resources for a canonical path + # so we keep them in a list to ensure that registration + # order is respected. + self._resource_index.setdefault(resource_key, []).append(resource) + + def unindex_resource(self, resource: AbstractResource) -> None: + """Remove a resource from the resource index.""" + resource_key = self._get_resource_index_key(resource) + self._resource_index[resource_key].remove(resource) + + def add_resource(self, path: str, *, name: Optional[str] = None) -> Resource: + if path and not path.startswith("/"): + raise ValueError("path should be started with / or be empty") + # Reuse last added resource if path and name are the same + if self._resources: + resource = self._resources[-1] + if resource.name == name and resource.raw_match(path): + return cast(Resource, resource) + if not ("{" in path or "}" in path or ROUTE_RE.search(path)): + resource = PlainResource(path, name=name) + self.register_resource(resource) + return resource + resource = DynamicResource(path, name=name) + self.register_resource(resource) + return resource + + def add_route( + self, + method: str, + path: str, + handler: Union[Handler, Type[AbstractView]], + *, + name: Optional[str] = None, + expect_handler: Optional[_ExpectHandler] = None, + ) -> AbstractRoute: + resource = self.add_resource(path, name=name) + return resource.add_route(method, handler, expect_handler=expect_handler) + + def add_static( + self, + prefix: str, + path: PathLike, + *, + name: Optional[str] = None, + expect_handler: Optional[_ExpectHandler] = None, + chunk_size: int = 256 * 1024, + show_index: bool = False, + follow_symlinks: bool = False, + append_version: bool = False, + ) -> AbstractResource: + """Add static files view. + + prefix - url prefix + path - folder with files + + """ + assert prefix.startswith("/") + if prefix.endswith("/"): + prefix = prefix[:-1] + resource = StaticResource( + prefix, + path, + name=name, + expect_handler=expect_handler, + chunk_size=chunk_size, + show_index=show_index, + follow_symlinks=follow_symlinks, + append_version=append_version, + ) + self.register_resource(resource) + return resource + + def add_head(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: + """Shortcut for add_route with method HEAD.""" + return self.add_route(hdrs.METH_HEAD, path, handler, **kwargs) + + def add_options(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: + """Shortcut for add_route with method OPTIONS.""" + return self.add_route(hdrs.METH_OPTIONS, path, handler, **kwargs) + + def add_get( + self, + path: str, + handler: Handler, + *, + name: Optional[str] = None, + allow_head: bool = True, + **kwargs: Any, + ) -> AbstractRoute: + """Shortcut for add_route with method GET. + + If allow_head is true, another + route is added allowing head requests to the same endpoint. + """ + resource = self.add_resource(path, name=name) + if allow_head: + resource.add_route(hdrs.METH_HEAD, handler, **kwargs) + return resource.add_route(hdrs.METH_GET, handler, **kwargs) + + def add_post(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: + """Shortcut for add_route with method POST.""" + return self.add_route(hdrs.METH_POST, path, handler, **kwargs) + + def add_put(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: + """Shortcut for add_route with method PUT.""" + return self.add_route(hdrs.METH_PUT, path, handler, **kwargs) + + def add_patch(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: + """Shortcut for add_route with method PATCH.""" + return self.add_route(hdrs.METH_PATCH, path, handler, **kwargs) + + def add_delete(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: + """Shortcut for add_route with method DELETE.""" + return self.add_route(hdrs.METH_DELETE, path, handler, **kwargs) + + def add_view( + self, path: str, handler: Type[AbstractView], **kwargs: Any + ) -> AbstractRoute: + """Shortcut for add_route with ANY methods for a class-based view.""" + return self.add_route(hdrs.METH_ANY, path, handler, **kwargs) + + def freeze(self) -> None: + super().freeze() + for resource in self._resources: + resource.freeze() + + def add_routes(self, routes: Iterable[AbstractRouteDef]) -> List[AbstractRoute]: + """Append routes to route table. + + Parameter should be a sequence of RouteDef objects. + + Returns a list of registered AbstractRoute instances. + """ + registered_routes = [] + for route_def in routes: + registered_routes.extend(route_def.register(self)) + return registered_routes + + +def _quote_path(value: str) -> str: + if YARL_VERSION < (1, 6): + value = value.replace("%", "%25") + return URL.build(path=value, encoded=False).raw_path + + +def _unquote_path_safe(value: str) -> str: + if "%" not in value: + return value + return value.replace("%2F", "/").replace("%25", "%") + + +def _requote_path(value: str) -> str: + # Quote non-ascii characters and other characters which must be quoted, + # but preserve existing %-sequences. + result = _quote_path(value) + if "%" in value: + result = result.replace("%25", "%") + return result diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_ws.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_ws.py new file mode 100644 index 0000000..575f9a3 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/web_ws.py @@ -0,0 +1,631 @@ +import asyncio +import base64 +import binascii +import hashlib +import json +import sys +from typing import Any, Final, Iterable, Optional, Tuple, Union, cast + +import attr +from multidict import CIMultiDict + +from . import hdrs +from ._websocket.reader import WebSocketDataQueue +from ._websocket.writer import DEFAULT_LIMIT +from .abc import AbstractStreamWriter +from .client_exceptions import WSMessageTypeError +from .helpers import calculate_timeout_when, set_exception, set_result +from .http import ( + WS_CLOSED_MESSAGE, + WS_CLOSING_MESSAGE, + WS_KEY, + WebSocketError, + WebSocketReader, + WebSocketWriter, + WSCloseCode, + WSMessage, + WSMsgType as WSMsgType, + ws_ext_gen, + ws_ext_parse, +) +from .http_websocket import _INTERNAL_RECEIVE_TYPES +from .log import ws_logger +from .streams import EofStream +from .typedefs import JSONDecoder, JSONEncoder +from .web_exceptions import HTTPBadRequest, HTTPException +from .web_request import BaseRequest +from .web_response import StreamResponse + +if sys.version_info >= (3, 11): + import asyncio as async_timeout +else: + import async_timeout + +__all__ = ( + "WebSocketResponse", + "WebSocketReady", + "WSMsgType", +) + +THRESHOLD_CONNLOST_ACCESS: Final[int] = 5 + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class WebSocketReady: + ok: bool + protocol: Optional[str] + + def __bool__(self) -> bool: + return self.ok + + +class WebSocketResponse(StreamResponse): + + _length_check: bool = False + _ws_protocol: Optional[str] = None + _writer: Optional[WebSocketWriter] = None + _reader: Optional[WebSocketDataQueue] = None + _closed: bool = False + _closing: bool = False + _conn_lost: int = 0 + _close_code: Optional[int] = None + _loop: Optional[asyncio.AbstractEventLoop] = None + _waiting: bool = False + _close_wait: Optional[asyncio.Future[None]] = None + _exception: Optional[BaseException] = None + _heartbeat_when: float = 0.0 + _heartbeat_cb: Optional[asyncio.TimerHandle] = None + _pong_response_cb: Optional[asyncio.TimerHandle] = None + _ping_task: Optional[asyncio.Task[None]] = None + + def __init__( + self, + *, + timeout: float = 10.0, + receive_timeout: Optional[float] = None, + autoclose: bool = True, + autoping: bool = True, + heartbeat: Optional[float] = None, + protocols: Iterable[str] = (), + compress: bool = True, + max_msg_size: int = 4 * 1024 * 1024, + writer_limit: int = DEFAULT_LIMIT, + ) -> None: + super().__init__(status=101) + self._protocols = protocols + self._timeout = timeout + self._receive_timeout = receive_timeout + self._autoclose = autoclose + self._autoping = autoping + self._heartbeat = heartbeat + if heartbeat is not None: + self._pong_heartbeat = heartbeat / 2.0 + self._compress: Union[bool, int] = compress + self._max_msg_size = max_msg_size + self._writer_limit = writer_limit + + def _cancel_heartbeat(self) -> None: + self._cancel_pong_response_cb() + if self._heartbeat_cb is not None: + self._heartbeat_cb.cancel() + self._heartbeat_cb = None + if self._ping_task is not None: + self._ping_task.cancel() + self._ping_task = None + + def _cancel_pong_response_cb(self) -> None: + if self._pong_response_cb is not None: + self._pong_response_cb.cancel() + self._pong_response_cb = None + + def _reset_heartbeat(self) -> None: + if self._heartbeat is None: + return + self._cancel_pong_response_cb() + req = self._req + timeout_ceil_threshold = ( + req._protocol._timeout_ceil_threshold if req is not None else 5 + ) + loop = self._loop + assert loop is not None + now = loop.time() + when = calculate_timeout_when(now, self._heartbeat, timeout_ceil_threshold) + self._heartbeat_when = when + if self._heartbeat_cb is None: + # We do not cancel the previous heartbeat_cb here because + # it generates a significant amount of TimerHandle churn + # which causes asyncio to rebuild the heap frequently. + # Instead _send_heartbeat() will reschedule the next + # heartbeat if it fires too early. + self._heartbeat_cb = loop.call_at(when, self._send_heartbeat) + + def _send_heartbeat(self) -> None: + self._heartbeat_cb = None + loop = self._loop + assert loop is not None and self._writer is not None + now = loop.time() + if now < self._heartbeat_when: + # Heartbeat fired too early, reschedule + self._heartbeat_cb = loop.call_at( + self._heartbeat_when, self._send_heartbeat + ) + return + + req = self._req + timeout_ceil_threshold = ( + req._protocol._timeout_ceil_threshold if req is not None else 5 + ) + when = calculate_timeout_when(now, self._pong_heartbeat, timeout_ceil_threshold) + self._cancel_pong_response_cb() + self._pong_response_cb = loop.call_at(when, self._pong_not_received) + + coro = self._writer.send_frame(b"", WSMsgType.PING) + if sys.version_info >= (3, 12): + # Optimization for Python 3.12, try to send the ping + # immediately to avoid having to schedule + # the task on the event loop. + ping_task = asyncio.Task(coro, loop=loop, eager_start=True) + else: + ping_task = loop.create_task(coro) + + if not ping_task.done(): + self._ping_task = ping_task + ping_task.add_done_callback(self._ping_task_done) + else: + self._ping_task_done(ping_task) + + def _ping_task_done(self, task: "asyncio.Task[None]") -> None: + """Callback for when the ping task completes.""" + if not task.cancelled() and (exc := task.exception()): + self._handle_ping_pong_exception(exc) + self._ping_task = None + + def _pong_not_received(self) -> None: + if self._req is not None and self._req.transport is not None: + self._handle_ping_pong_exception( + asyncio.TimeoutError( + f"No PONG received after {self._pong_heartbeat} seconds" + ) + ) + + def _handle_ping_pong_exception(self, exc: BaseException) -> None: + """Handle exceptions raised during ping/pong processing.""" + if self._closed: + return + self._set_closed() + self._set_code_close_transport(WSCloseCode.ABNORMAL_CLOSURE) + self._exception = exc + if self._waiting and not self._closing and self._reader is not None: + self._reader.feed_data(WSMessage(WSMsgType.ERROR, exc, None), 0) + + def _set_closed(self) -> None: + """Set the connection to closed. + + Cancel any heartbeat timers and set the closed flag. + """ + self._closed = True + self._cancel_heartbeat() + + async def prepare(self, request: BaseRequest) -> AbstractStreamWriter: + # make pre-check to don't hide it by do_handshake() exceptions + if self._payload_writer is not None: + return self._payload_writer + + protocol, writer = self._pre_start(request) + payload_writer = await super().prepare(request) + assert payload_writer is not None + self._post_start(request, protocol, writer) + await payload_writer.drain() + return payload_writer + + def _handshake( + self, request: BaseRequest + ) -> Tuple["CIMultiDict[str]", Optional[str], int, bool]: + headers = request.headers + if "websocket" != headers.get(hdrs.UPGRADE, "").lower().strip(): + raise HTTPBadRequest( + text=( + "No WebSocket UPGRADE hdr: {}\n Can " + '"Upgrade" only to "WebSocket".' + ).format(headers.get(hdrs.UPGRADE)) + ) + + if "upgrade" not in headers.get(hdrs.CONNECTION, "").lower(): + raise HTTPBadRequest( + text="No CONNECTION upgrade hdr: {}".format( + headers.get(hdrs.CONNECTION) + ) + ) + + # find common sub-protocol between client and server + protocol: Optional[str] = None + if hdrs.SEC_WEBSOCKET_PROTOCOL in headers: + req_protocols = [ + str(proto.strip()) + for proto in headers[hdrs.SEC_WEBSOCKET_PROTOCOL].split(",") + ] + + for proto in req_protocols: + if proto in self._protocols: + protocol = proto + break + else: + # No overlap found: Return no protocol as per spec + ws_logger.warning( + "%s: Client protocols %r don’t overlap server-known ones %r", + request.remote, + req_protocols, + self._protocols, + ) + + # check supported version + version = headers.get(hdrs.SEC_WEBSOCKET_VERSION, "") + if version not in ("13", "8", "7"): + raise HTTPBadRequest(text=f"Unsupported version: {version}") + + # check client handshake for validity + key = headers.get(hdrs.SEC_WEBSOCKET_KEY) + try: + if not key or len(base64.b64decode(key)) != 16: + raise HTTPBadRequest(text=f"Handshake error: {key!r}") + except binascii.Error: + raise HTTPBadRequest(text=f"Handshake error: {key!r}") from None + + accept_val = base64.b64encode( + hashlib.sha1(key.encode() + WS_KEY).digest() + ).decode() + response_headers = CIMultiDict( + { + hdrs.UPGRADE: "websocket", + hdrs.CONNECTION: "upgrade", + hdrs.SEC_WEBSOCKET_ACCEPT: accept_val, + } + ) + + notakeover = False + compress = 0 + if self._compress: + extensions = headers.get(hdrs.SEC_WEBSOCKET_EXTENSIONS) + # Server side always get return with no exception. + # If something happened, just drop compress extension + compress, notakeover = ws_ext_parse(extensions, isserver=True) + if compress: + enabledext = ws_ext_gen( + compress=compress, isserver=True, server_notakeover=notakeover + ) + response_headers[hdrs.SEC_WEBSOCKET_EXTENSIONS] = enabledext + + if protocol: + response_headers[hdrs.SEC_WEBSOCKET_PROTOCOL] = protocol + return ( + response_headers, + protocol, + compress, + notakeover, + ) + + def _pre_start(self, request: BaseRequest) -> Tuple[Optional[str], WebSocketWriter]: + self._loop = request._loop + + headers, protocol, compress, notakeover = self._handshake(request) + + self.set_status(101) + self.headers.update(headers) + self.force_close() + self._compress = compress + transport = request._protocol.transport + assert transport is not None + writer = WebSocketWriter( + request._protocol, + transport, + compress=compress, + notakeover=notakeover, + limit=self._writer_limit, + ) + + return protocol, writer + + def _post_start( + self, request: BaseRequest, protocol: Optional[str], writer: WebSocketWriter + ) -> None: + self._ws_protocol = protocol + self._writer = writer + + self._reset_heartbeat() + + loop = self._loop + assert loop is not None + self._reader = WebSocketDataQueue(request._protocol, 2**16, loop=loop) + request.protocol.set_parser( + WebSocketReader( + self._reader, self._max_msg_size, compress=bool(self._compress) + ) + ) + # disable HTTP keepalive for WebSocket + request.protocol.keep_alive(False) + + def can_prepare(self, request: BaseRequest) -> WebSocketReady: + if self._writer is not None: + raise RuntimeError("Already started") + try: + _, protocol, _, _ = self._handshake(request) + except HTTPException: + return WebSocketReady(False, None) + else: + return WebSocketReady(True, protocol) + + @property + def prepared(self) -> bool: + return self._writer is not None + + @property + def closed(self) -> bool: + return self._closed + + @property + def close_code(self) -> Optional[int]: + return self._close_code + + @property + def ws_protocol(self) -> Optional[str]: + return self._ws_protocol + + @property + def compress(self) -> Union[int, bool]: + return self._compress + + def get_extra_info(self, name: str, default: Any = None) -> Any: + """Get optional transport information. + + If no value associated with ``name`` is found, ``default`` is returned. + """ + writer = self._writer + if writer is None: + return default + transport = writer.transport + if transport is None: + return default + return transport.get_extra_info(name, default) + + def exception(self) -> Optional[BaseException]: + return self._exception + + async def ping(self, message: bytes = b"") -> None: + if self._writer is None: + raise RuntimeError("Call .prepare() first") + await self._writer.send_frame(message, WSMsgType.PING) + + async def pong(self, message: bytes = b"") -> None: + # unsolicited pong + if self._writer is None: + raise RuntimeError("Call .prepare() first") + await self._writer.send_frame(message, WSMsgType.PONG) + + async def send_frame( + self, message: bytes, opcode: WSMsgType, compress: Optional[int] = None + ) -> None: + """Send a frame over the websocket.""" + if self._writer is None: + raise RuntimeError("Call .prepare() first") + await self._writer.send_frame(message, opcode, compress) + + async def send_str(self, data: str, compress: Optional[int] = None) -> None: + if self._writer is None: + raise RuntimeError("Call .prepare() first") + if not isinstance(data, str): + raise TypeError("data argument must be str (%r)" % type(data)) + await self._writer.send_frame( + data.encode("utf-8"), WSMsgType.TEXT, compress=compress + ) + + async def send_bytes(self, data: bytes, compress: Optional[int] = None) -> None: + if self._writer is None: + raise RuntimeError("Call .prepare() first") + if not isinstance(data, (bytes, bytearray, memoryview)): + raise TypeError("data argument must be byte-ish (%r)" % type(data)) + await self._writer.send_frame(data, WSMsgType.BINARY, compress=compress) + + async def send_json( + self, + data: Any, + compress: Optional[int] = None, + *, + dumps: JSONEncoder = json.dumps, + ) -> None: + await self.send_str(dumps(data), compress=compress) + + async def write_eof(self) -> None: # type: ignore[override] + if self._eof_sent: + return + if self._payload_writer is None: + raise RuntimeError("Response has not been started") + + await self.close() + self._eof_sent = True + + async def close( + self, *, code: int = WSCloseCode.OK, message: bytes = b"", drain: bool = True + ) -> bool: + """Close websocket connection.""" + if self._writer is None: + raise RuntimeError("Call .prepare() first") + + if self._closed: + return False + self._set_closed() + + try: + await self._writer.close(code, message) + writer = self._payload_writer + assert writer is not None + if drain: + await writer.drain() + except (asyncio.CancelledError, asyncio.TimeoutError): + self._set_code_close_transport(WSCloseCode.ABNORMAL_CLOSURE) + raise + except Exception as exc: + self._exception = exc + self._set_code_close_transport(WSCloseCode.ABNORMAL_CLOSURE) + return True + + reader = self._reader + assert reader is not None + # we need to break `receive()` cycle before we can call + # `reader.read()` as `close()` may be called from different task + if self._waiting: + assert self._loop is not None + assert self._close_wait is None + self._close_wait = self._loop.create_future() + reader.feed_data(WS_CLOSING_MESSAGE, 0) + await self._close_wait + + if self._closing: + self._close_transport() + return True + + try: + async with async_timeout.timeout(self._timeout): + while True: + msg = await reader.read() + if msg.type is WSMsgType.CLOSE: + self._set_code_close_transport(msg.data) + return True + except asyncio.CancelledError: + self._set_code_close_transport(WSCloseCode.ABNORMAL_CLOSURE) + raise + except Exception as exc: + self._exception = exc + self._set_code_close_transport(WSCloseCode.ABNORMAL_CLOSURE) + return True + + def _set_closing(self, code: WSCloseCode) -> None: + """Set the close code and mark the connection as closing.""" + self._closing = True + self._close_code = code + self._cancel_heartbeat() + + def _set_code_close_transport(self, code: WSCloseCode) -> None: + """Set the close code and close the transport.""" + self._close_code = code + self._close_transport() + + def _close_transport(self) -> None: + """Close the transport.""" + if self._req is not None and self._req.transport is not None: + self._req.transport.close() + + async def receive(self, timeout: Optional[float] = None) -> WSMessage: + if self._reader is None: + raise RuntimeError("Call .prepare() first") + + receive_timeout = timeout or self._receive_timeout + while True: + if self._waiting: + raise RuntimeError("Concurrent call to receive() is not allowed") + + if self._closed: + self._conn_lost += 1 + if self._conn_lost >= THRESHOLD_CONNLOST_ACCESS: + raise RuntimeError("WebSocket connection is closed.") + return WS_CLOSED_MESSAGE + elif self._closing: + return WS_CLOSING_MESSAGE + + try: + self._waiting = True + try: + if receive_timeout: + # Entering the context manager and creating + # Timeout() object can take almost 50% of the + # run time in this loop so we avoid it if + # there is no read timeout. + async with async_timeout.timeout(receive_timeout): + msg = await self._reader.read() + else: + msg = await self._reader.read() + self._reset_heartbeat() + finally: + self._waiting = False + if self._close_wait: + set_result(self._close_wait, None) + except asyncio.TimeoutError: + raise + except EofStream: + self._close_code = WSCloseCode.OK + await self.close() + return WSMessage(WSMsgType.CLOSED, None, None) + except WebSocketError as exc: + self._close_code = exc.code + await self.close(code=exc.code) + return WSMessage(WSMsgType.ERROR, exc, None) + except Exception as exc: + self._exception = exc + self._set_closing(WSCloseCode.ABNORMAL_CLOSURE) + await self.close() + return WSMessage(WSMsgType.ERROR, exc, None) + + if msg.type not in _INTERNAL_RECEIVE_TYPES: + # If its not a close/closing/ping/pong message + # we can return it immediately + return msg + + if msg.type is WSMsgType.CLOSE: + self._set_closing(msg.data) + # Could be closed while awaiting reader. + if not self._closed and self._autoclose: + # The client is likely going to close the + # connection out from under us so we do not + # want to drain any pending writes as it will + # likely result writing to a broken pipe. + await self.close(drain=False) + elif msg.type is WSMsgType.CLOSING: + self._set_closing(WSCloseCode.OK) + elif msg.type is WSMsgType.PING and self._autoping: + await self.pong(msg.data) + continue + elif msg.type is WSMsgType.PONG and self._autoping: + continue + + return msg + + async def receive_str(self, *, timeout: Optional[float] = None) -> str: + msg = await self.receive(timeout) + if msg.type is not WSMsgType.TEXT: + raise WSMessageTypeError( + f"Received message {msg.type}:{msg.data!r} is not WSMsgType.TEXT" + ) + return cast(str, msg.data) + + async def receive_bytes(self, *, timeout: Optional[float] = None) -> bytes: + msg = await self.receive(timeout) + if msg.type is not WSMsgType.BINARY: + raise WSMessageTypeError( + f"Received message {msg.type}:{msg.data!r} is not WSMsgType.BINARY" + ) + return cast(bytes, msg.data) + + async def receive_json( + self, *, loads: JSONDecoder = json.loads, timeout: Optional[float] = None + ) -> Any: + data = await self.receive_str(timeout=timeout) + return loads(data) + + async def write(self, data: bytes) -> None: + raise RuntimeError("Cannot call .write() for websocket") + + def __aiter__(self) -> "WebSocketResponse": + return self + + async def __anext__(self) -> WSMessage: + msg = await self.receive() + if msg.type in (WSMsgType.CLOSE, WSMsgType.CLOSING, WSMsgType.CLOSED): + raise StopAsyncIteration + return msg + + def _cancel(self, exc: BaseException) -> None: + # web_protocol calls this from connection_lost + # or when the server is shutting down. + self._closing = True + self._cancel_heartbeat() + if self._reader is not None: + set_exception(self._reader, exc) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/worker.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/worker.py new file mode 100644 index 0000000..f7281bf --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiohttp/worker.py @@ -0,0 +1,255 @@ +"""Async gunicorn worker for aiohttp.web""" + +import asyncio +import inspect +import os +import re +import signal +import sys +from types import FrameType +from typing import TYPE_CHECKING, Any, Optional + +from gunicorn.config import AccessLogFormat as GunicornAccessLogFormat +from gunicorn.workers import base + +from aiohttp import web + +from .helpers import set_result +from .web_app import Application +from .web_log import AccessLogger + +if TYPE_CHECKING: + import ssl + + SSLContext = ssl.SSLContext +else: + try: + import ssl + + SSLContext = ssl.SSLContext + except ImportError: # pragma: no cover + ssl = None # type: ignore[assignment] + SSLContext = object # type: ignore[misc,assignment] + + +__all__ = ("GunicornWebWorker", "GunicornUVLoopWebWorker") + + +class GunicornWebWorker(base.Worker): # type: ignore[misc,no-any-unimported] + + DEFAULT_AIOHTTP_LOG_FORMAT = AccessLogger.LOG_FORMAT + DEFAULT_GUNICORN_LOG_FORMAT = GunicornAccessLogFormat.default + + def __init__(self, *args: Any, **kw: Any) -> None: # pragma: no cover + super().__init__(*args, **kw) + + self._task: Optional[asyncio.Task[None]] = None + self.exit_code = 0 + self._notify_waiter: Optional[asyncio.Future[bool]] = None + + def init_process(self) -> None: + # create new event_loop after fork + asyncio.get_event_loop().close() + + self.loop = asyncio.new_event_loop() + asyncio.set_event_loop(self.loop) + + super().init_process() + + def run(self) -> None: + self._task = self.loop.create_task(self._run()) + + try: # ignore all finalization problems + self.loop.run_until_complete(self._task) + except Exception: + self.log.exception("Exception in gunicorn worker") + self.loop.run_until_complete(self.loop.shutdown_asyncgens()) + self.loop.close() + + sys.exit(self.exit_code) + + async def _run(self) -> None: + runner = None + if isinstance(self.wsgi, Application): + app = self.wsgi + elif inspect.iscoroutinefunction(self.wsgi) or ( + sys.version_info < (3, 14) and asyncio.iscoroutinefunction(self.wsgi) + ): + wsgi = await self.wsgi() + if isinstance(wsgi, web.AppRunner): + runner = wsgi + app = runner.app + else: + app = wsgi + else: + raise RuntimeError( + "wsgi app should be either Application or " + "async function returning Application, got {}".format(self.wsgi) + ) + + if runner is None: + access_log = self.log.access_log if self.cfg.accesslog else None + runner = web.AppRunner( + app, + logger=self.log, + keepalive_timeout=self.cfg.keepalive, + access_log=access_log, + access_log_format=self._get_valid_log_format( + self.cfg.access_log_format + ), + shutdown_timeout=self.cfg.graceful_timeout / 100 * 95, + ) + await runner.setup() + + ctx = self._create_ssl_context(self.cfg) if self.cfg.is_ssl else None + + runner = runner + assert runner is not None + server = runner.server + assert server is not None + for sock in self.sockets: + site = web.SockSite( + runner, + sock, + ssl_context=ctx, + ) + await site.start() + + # If our parent changed then we shut down. + pid = os.getpid() + try: + while self.alive: # type: ignore[has-type] + self.notify() + + cnt = server.requests_count + if self.max_requests and cnt > self.max_requests: + self.alive = False + self.log.info("Max requests, shutting down: %s", self) + + elif pid == os.getpid() and self.ppid != os.getppid(): + self.alive = False + self.log.info("Parent changed, shutting down: %s", self) + else: + await self._wait_next_notify() + except BaseException: + pass + + await runner.cleanup() + + def _wait_next_notify(self) -> "asyncio.Future[bool]": + self._notify_waiter_done() + + loop = self.loop + assert loop is not None + self._notify_waiter = waiter = loop.create_future() + self.loop.call_later(1.0, self._notify_waiter_done, waiter) + + return waiter + + def _notify_waiter_done( + self, waiter: Optional["asyncio.Future[bool]"] = None + ) -> None: + if waiter is None: + waiter = self._notify_waiter + if waiter is not None: + set_result(waiter, True) + + if waiter is self._notify_waiter: + self._notify_waiter = None + + def init_signals(self) -> None: + # Set up signals through the event loop API. + + self.loop.add_signal_handler( + signal.SIGQUIT, self.handle_quit, signal.SIGQUIT, None + ) + + self.loop.add_signal_handler( + signal.SIGTERM, self.handle_exit, signal.SIGTERM, None + ) + + self.loop.add_signal_handler( + signal.SIGINT, self.handle_quit, signal.SIGINT, None + ) + + self.loop.add_signal_handler( + signal.SIGWINCH, self.handle_winch, signal.SIGWINCH, None + ) + + self.loop.add_signal_handler( + signal.SIGUSR1, self.handle_usr1, signal.SIGUSR1, None + ) + + self.loop.add_signal_handler( + signal.SIGABRT, self.handle_abort, signal.SIGABRT, None + ) + + # Don't let SIGTERM and SIGUSR1 disturb active requests + # by interrupting system calls + signal.siginterrupt(signal.SIGTERM, False) + signal.siginterrupt(signal.SIGUSR1, False) + # Reset signals so Gunicorn doesn't swallow subprocess return codes + # See: https://github.com/aio-libs/aiohttp/issues/6130 + + def handle_quit(self, sig: int, frame: Optional[FrameType]) -> None: + self.alive = False + + # worker_int callback + self.cfg.worker_int(self) + + # wakeup closing process + self._notify_waiter_done() + + def handle_abort(self, sig: int, frame: Optional[FrameType]) -> None: + self.alive = False + self.exit_code = 1 + self.cfg.worker_abort(self) + sys.exit(1) + + @staticmethod + def _create_ssl_context(cfg: Any) -> "SSLContext": + """Creates SSLContext instance for usage in asyncio.create_server. + + See ssl.SSLSocket.__init__ for more details. + """ + if ssl is None: # pragma: no cover + raise RuntimeError("SSL is not supported.") + + ctx = ssl.SSLContext(cfg.ssl_version) + ctx.load_cert_chain(cfg.certfile, cfg.keyfile) + ctx.verify_mode = cfg.cert_reqs + if cfg.ca_certs: + ctx.load_verify_locations(cfg.ca_certs) + if cfg.ciphers: + ctx.set_ciphers(cfg.ciphers) + return ctx + + def _get_valid_log_format(self, source_format: str) -> str: + if source_format == self.DEFAULT_GUNICORN_LOG_FORMAT: + return self.DEFAULT_AIOHTTP_LOG_FORMAT + elif re.search(r"%\([^\)]+\)", source_format): + raise ValueError( + "Gunicorn's style options in form of `%(name)s` are not " + "supported for the log formatting. Please use aiohttp's " + "format specification to configure access log formatting: " + "http://docs.aiohttp.org/en/stable/logging.html" + "#format-specification" + ) + else: + return source_format + + +class GunicornUVLoopWebWorker(GunicornWebWorker): + def init_process(self) -> None: + import uvloop + + # Close any existing event loop before setting a + # new policy. + asyncio.get_event_loop().close() + + # Setup uvloop policy, so that every + # asyncio.get_event_loop() will create an instance + # of uvloop event loop. + asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) + + super().init_process() diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/INSTALLER b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/METADATA b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/METADATA new file mode 100644 index 0000000..03a6f0f --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/METADATA @@ -0,0 +1,112 @@ +Metadata-Version: 2.4 +Name: aiosignal +Version: 1.4.0 +Summary: aiosignal: a list of registered asynchronous callbacks +Home-page: https://github.com/aio-libs/aiosignal +Maintainer: aiohttp team +Maintainer-email: team@aiohttp.org +License: Apache 2.0 +Project-URL: Chat: Gitter, https://gitter.im/aio-libs/Lobby +Project-URL: CI: GitHub Actions, https://github.com/aio-libs/aiosignal/actions +Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/aiosignal +Project-URL: Docs: RTD, https://docs.aiosignal.org +Project-URL: GitHub: issues, https://github.com/aio-libs/aiosignal/issues +Project-URL: GitHub: repo, https://github.com/aio-libs/aiosignal +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Intended Audience :: Developers +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Development Status :: 5 - Production/Stable +Classifier: Operating System :: POSIX +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Operating System :: Microsoft :: Windows +Classifier: Framework :: AsyncIO +Requires-Python: >=3.9 +Description-Content-Type: text/x-rst +License-File: LICENSE +Requires-Dist: frozenlist>=1.1.0 +Requires-Dist: typing-extensions>=4.2; python_version < "3.13" +Dynamic: license-file + +========= +aiosignal +========= + +.. image:: https://github.com/aio-libs/aiosignal/workflows/CI/badge.svg + :target: https://github.com/aio-libs/aiosignal/actions?query=workflow%3ACI + :alt: GitHub status for master branch + +.. image:: https://codecov.io/gh/aio-libs/aiosignal/branch/master/graph/badge.svg?flag=pytest + :target: https://codecov.io/gh/aio-libs/aiosignal?flags[0]=pytest + :alt: codecov.io status for master branch + +.. image:: https://badge.fury.io/py/aiosignal.svg + :target: https://pypi.org/project/aiosignal + :alt: Latest PyPI package version + +.. image:: https://readthedocs.org/projects/aiosignal/badge/?version=latest + :target: https://aiosignal.readthedocs.io/ + :alt: Latest Read The Docs + +.. image:: https://img.shields.io/discourse/topics?server=https%3A%2F%2Faio-libs.discourse.group%2F + :target: https://aio-libs.discourse.group/ + :alt: Discourse group for io-libs + +.. image:: https://badges.gitter.im/Join%20Chat.svg + :target: https://gitter.im/aio-libs/Lobby + :alt: Chat on Gitter + +Introduction +============ + +A project to manage callbacks in `asyncio` projects. + +``Signal`` is a list of registered asynchronous callbacks. + +The signal's life-cycle has two stages: after creation its content +could be filled by using standard list operations: ``sig.append()`` +etc. + +After you call ``sig.freeze()`` the signal is *frozen*: adding, removing +and dropping callbacks is forbidden. + +The only available operation is calling the previously registered +callbacks by using ``await sig.send(data)``. + +For concrete usage examples see the `Signals + +section of the `Web Server Advanced +` chapter of the `aiohttp +documentation`_. + + +Installation +------------ + +:: + + $ pip install aiosignal + + +Documentation +============= + +https://aiosignal.readthedocs.io/ + +License +======= + +``aiosignal`` is offered under the Apache 2 license. + +Source code +=========== + +The project is hosted on GitHub_ + +Please file an issue in the `bug tracker +`_ if you have found a bug +or have some suggestions to improve the library. + +.. _GitHub: https://github.com/aio-libs/aiosignal +.. _aiohttp documentation: https://docs.aiohttp.org/ diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/RECORD b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/RECORD new file mode 100644 index 0000000..df5ca06 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/RECORD @@ -0,0 +1,9 @@ +aiosignal-1.4.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +aiosignal-1.4.0.dist-info/METADATA,sha256=CSR-8dqLxpZyjUcTDnAuQwf299EB1sSFv_nzpxznAI0,3662 +aiosignal-1.4.0.dist-info/RECORD,, +aiosignal-1.4.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91 +aiosignal-1.4.0.dist-info/licenses/LICENSE,sha256=b9UkPpLdf5jsacesN3co50kFcJ_1J6W_mNbQJjwE9bY,11332 +aiosignal-1.4.0.dist-info/top_level.txt,sha256=z45aNOKGDdrI1roqZY3BGXQ22kJFPHBmVdwtLYLtXC0,10 +aiosignal/__init__.py,sha256=TIkmUG9HTBt4dfq2nISYBiZiRB2xwvFtEZydLP0HPL4,1537 +aiosignal/__pycache__/__init__.cpython-312.pyc,, +aiosignal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/WHEEL b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/WHEEL new file mode 100644 index 0000000..e7fa31b --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (80.9.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/licenses/LICENSE b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/licenses/LICENSE new file mode 100644 index 0000000..7082a2d --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/licenses/LICENSE @@ -0,0 +1,201 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2013-2019 Nikolay Kim and Andrew Svetlov + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/top_level.txt b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/top_level.txt new file mode 100644 index 0000000..ac6df3a --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info/top_level.txt @@ -0,0 +1 @@ +aiosignal diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal/__init__.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal/__init__.py new file mode 100644 index 0000000..5ede009 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal/__init__.py @@ -0,0 +1,59 @@ +import sys +from typing import Any, Awaitable, Callable, TypeVar + +from frozenlist import FrozenList + +if sys.version_info >= (3, 11): + from typing import Unpack +else: + from typing_extensions import Unpack + +if sys.version_info >= (3, 13): + from typing import TypeVarTuple +else: + from typing_extensions import TypeVarTuple + +_T = TypeVar("_T") +_Ts = TypeVarTuple("_Ts", default=Unpack[tuple[()]]) + +__version__ = "1.4.0" + +__all__ = ("Signal",) + + +class Signal(FrozenList[Callable[[Unpack[_Ts]], Awaitable[object]]]): + """Coroutine-based signal implementation. + + To connect a callback to a signal, use any list method. + + Signals are fired using the send() coroutine, which takes named + arguments. + """ + + __slots__ = ("_owner",) + + def __init__(self, owner: object): + super().__init__() + self._owner = owner + + def __repr__(self) -> str: + return "".format( + self._owner, self.frozen, list(self) + ) + + async def send(self, *args: Unpack[_Ts], **kwargs: Any) -> None: + """ + Sends data to all registered receivers. + """ + if not self.frozen: + raise RuntimeError("Cannot send non-frozen signal.") + + for receiver in self: + await receiver(*args, **kwargs) + + def __call__( + self, func: Callable[[Unpack[_Ts]], Awaitable[_T]] + ) -> Callable[[Unpack[_Ts]], Awaitable[_T]]: + """Decorator to add a function to this Signal.""" + self.append(func) + return func diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal/__pycache__/__init__.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d8fa7de06b99355f7f69b1e8ad13123c2553791 GIT binary patch literal 2684 zcmZ`*%WoUU8J~S}`4T0HZvD>M0#Xx_Nk5bXaop6d-86w)9cs0QMUBOZGn7_Z?y|E> zE2LyVaEwGQl3ERrSUFWjbC9DJ@G(I9AM_$N2CQs@RzYB(zA;sU20r!shNPSX$pHLj z=6lV|?|Ur&md&OJjQPJXSJDaj3^)Ce>@9XO5+SzX(Ggaq)O$bkbrUo98R#GCqE_SKz?mO)CUAqL>rLA<&F5#uR zJDD(z8XIs=999PQX_{n7mZhnEz`@_2(i<{LK|Vk;R*q(^L7DuN(19C-=2(KMpg(|` z(-KqI5U#3n-+DtqOR&v1rQ+ZtTuv0#SUK-EPhG!T&Jzx3-)Wv(c51G(8QH`6nnY}CP}Y){6DJsI9bg9K$& zr{P5{?PO`ZbOK#mcBg&EtAOe5Nc2`aZ^PmZh#e!AM2RI+$x^6nsZ?QFRbD1liK;g; zmQFR6sLE8op;`t_01g5*Y5rb1}3^POK(_=+& z-n+|~IX~l8X3WT$W1;CgHAck+96sH^ONAw|Md{r|TN)u7J&r^crA1=zS~nri6GbJ~!bTmO8@BEGZe-hh7z}`~hRmz-0&L=> zZC5-e3~f8a!%TDO@nm@>sIhY7xU+6K3IZ=IJ9DA!OvBB~rK`-pTK3$ja=i)Y_@_%J zPnAPAV#hHHK?juGpbKZYe{QMX2cL3yZ$Qb=Q~*S zdqBTlA=~7M*3q-wyPG0XKU}yrW>!T_isix)e(gmlX1yBlniC12VIve`6|<=*@x5?b zh!-{aexMi^&g$H@zk*Ab@dMO624snBK&yhD1e^%zDqSAU^ zWII;iWhj);q)z0BvhzHXvuOZ_VLfqHVeVDNd)0yZt-}`_-wz^DVWuDW$GedB>a{ch zZSN_#YMl8+!;jn=`w8a(FRB7+eiS4eQ!F-iePis=b2kD|2tIA4ds&H_F_4GnfczVC zvSX0J!mWkhE_{+dy!q6RKFXil%$(cad+c!3c=-Nx|{OE(sXgf3d zxdM`{%;@7V15U0V8<#$iPU#!QxD>0^hF|&i630-BfP7mT?*;+O9FkFLjb3EXYn&+H z0!B(r$3*AY>yQ)8xS`p56gC;BUWcavR+xbt4-2s}`Y1piVmJI+9(EbeqAJ#>fFhZ_ zmA;u?xp?2$x0M@SPK%@~<}r`4$JutAvh7+x8y>DRw*8xi6MNuYX?`WUl5o&hN7ibM|KEIos^-Ct?6sw zopgu5@?I#W52GF2bqbnR*eZbG+U57=RV}-!7c#C?MNT4y`=9I`aD$ zR*tXjTR(N@&}P2WPL}_tflOc~E>#?cH#ebNqh=jGB;Ch~CyK{n!N#d>x?}&~*rDPK z)(1ox8ai|uL@FNY+S}~ai1{cBIi{WfD%K+W10c|h)3)8WwquBg2suBAy7(>SIV9Le z1bUB+v)xd>$j<@~6El1RNJo(*=^rHZFEaiS8GlHQY%BT$Ww@;jugw2lIs8xc&_ngu zH+dru)zYV0W_j|pD@*dndVb}ZwWrtjtn<73+DA{{*TFv~>rNn>r5vj0j kts0;*d}nm+(7oh`Pq$B;-#l`@z4yoM?1e7~D2R*xAL9g&DF6Tf literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal/py.typed b/search_agent/search_agent/.venv/lib/python3.12/site-packages/aiosignal/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/INSTALLER b/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/LICENSE b/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/LICENSE new file mode 100644 index 0000000..e4c3725 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017-2019 Hanjun Kim + +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/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/METADATA b/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/METADATA new file mode 100644 index 0000000..c2d6d7f --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/METADATA @@ -0,0 +1,124 @@ +Metadata-Version: 2.1 +Name: asyncio-throttle +Version: 1.0.2 +Summary: Simple, easy-to-use throttler for asyncio +Home-page: https://github.com/hallazzang/asyncio-throttle +Author: Hanjun Kim +Author-email: hallazzang@gmail.com +License: MIT +Platform: any +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >=3.6 +Description-Content-Type: text/markdown + +# asyncio-throttle + +[![travis-ci](https://travis-ci.org/hallazzang/asyncio-throttle.svg?branch=master)](https://travis-ci.org/hallazzang/asyncio-throttle) +[![pypi-version](https://badge.fury.io/py/asyncio-throttle.svg)](https://badge.fury.io/py/asyncio-throttle) + +Simple, easy-to-use throttler for asyncio. + +## Example + +```python +import time +import random +import asyncio + +from asyncio_throttle import Throttler + +async def worker(no, throttler, n): + for _ in range(n): + await asyncio.sleep(random.random() * 2) + + async with throttler: + print(time.time(), 'Worker #%d: Bang!' % no) + +async def main(): + throttler = Throttler(rate_limit=5) + + tasks = [ + loop.create_task(worker(no, throttler, 10)) + for no in range(5) + ] + await asyncio.wait(tasks) + +loop = asyncio.get_event_loop() +loop.run_until_complete(main()) +loop.close() +``` + +Here I limited work rate to 5/sec while there are 5 workers. +And the result: + +```plain +1508273760.3462772 Worker #2: Bang! +1508273760.590009 Worker #3: Bang! +1508273760.856431 Worker #0: Bang! +1508273761.0110679 Worker #2: Bang! +1508273761.086856 Worker #4: Bang! +1508273761.350699 Worker #3: Bang! +1508273761.5906 Worker #1: Bang! +1508273761.8655958 Worker #4: Bang! +1508273762.224158 Worker #0: Bang! +1508273762.600234 Worker #2: Bang! +1508273762.694332 Worker #2: Bang! +1508273762.726774 Worker #0: Bang! +1508273762.944273 Worker #4: Bang! +``` + +## Installation + +```bash +$ pip install asyncio-throttle +``` + +It requires Python 3.6 or later. + +## Usage + +`asyncio_throttle.Throttler` introduces simple APIs: `flush()` and +`acquire()`. But you will not be interested in those because you can +just use it within `with` statement and it looks nicer. + +First, create a throttler given desired rate limit. For example if you +want to limit rate to 500/min, you can make it as: + +```python +from asyncio_throttle import Throttler + +throttler = Throttler(rate_limit=500, period=60) +``` + +Then whenever you want to do some jobs which should have limited +rate(e.g. sending request to server), Put it in `async with` statement: + +```python +async with throttler: + send_a_request() +``` + +It's that easy. `asyncio_throttler` can be easily integrated with +`aiohttp` too: + +```python +async def worker(throttler, session): + while True: + async with throttler: + async with session.get('http://example.com') as resp: + do_some_job_with(await resp.text()) + + await asyncio.sleep(0.05) +``` + + diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/RECORD b/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/RECORD new file mode 100644 index 0000000..3e83b98 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/RECORD @@ -0,0 +1,12 @@ +asyncio_throttle-1.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +asyncio_throttle-1.0.2.dist-info/LICENSE,sha256=MH1pM_8Z2itSVYiel-hXyMuljQN43Leo7o5Kc_sm49s,1082 +asyncio_throttle-1.0.2.dist-info/METADATA,sha256=fbE-PisPgfyTUaPh54pGx33Bf468gHxr0_7JXa3eOpc,3364 +asyncio_throttle-1.0.2.dist-info/RECORD,, +asyncio_throttle-1.0.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +asyncio_throttle-1.0.2.dist-info/WHEEL,sha256=OqRkF0eY5GHssMorFjlbTIq072vpHpF60fIQA6lS9xA,92 +asyncio_throttle-1.0.2.dist-info/top_level.txt,sha256=WE-3eFJNwIdfFqq7I3fyWUzaIY66hoGTMQdR6wAsrZs,17 +asyncio_throttle/__init__.py,sha256=uSe6Ru8ooE44q2c64UIT0E_rnCldKkqUD8wYVwTRdyU,33 +asyncio_throttle/__pycache__/__init__.cpython-312.pyc,, +asyncio_throttle/__pycache__/throttler.cpython-312.pyc,, +asyncio_throttle/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +asyncio_throttle/throttler.py,sha256=GrkQdoU-gkuPISVZuyMcTO-FnwQqErTuAxu3_tqLMeI,937 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/REQUESTED b/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/WHEEL b/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/WHEEL new file mode 100644 index 0000000..385faab --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.36.2) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/top_level.txt b/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/top_level.txt new file mode 100644 index 0000000..84ca6fe --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle-1.0.2.dist-info/top_level.txt @@ -0,0 +1 @@ +asyncio_throttle diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle/__init__.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle/__init__.py new file mode 100644 index 0000000..81d73d8 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle/__init__.py @@ -0,0 +1 @@ +from .throttler import Throttler diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle/__pycache__/__init__.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db23566d5eee73021fb6089b75893a24c9f920ee GIT binary patch literal 234 zcmX@j%ge<81m(L^GZlgKV-N=hn4pZ$0zk%eh7^Vr#vF!R#wbQchDs()=9i2>VNJ$c zoFN%S`6VSesYQO8Ot&~oV7ww`p!`aP&mdENMeAqe=cekHBxYu1>X+o_=M?KFW*5gN zrl;nW=0S s%*!l^kJl@x{Ka9Do1apelWJGQ0kjL`tYQ%312ZEd<2?q2A~qlg0Mk=IE&u=k literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle/__pycache__/throttler.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/asyncio_throttle/__pycache__/throttler.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05fbd58585808bb4d4f65e8d3034202f6bd00745 GIT binary patch literal 2204 zcmaJ?-ER{|5Z}EIehN>gZ@1))X^Vo;0ZgOTPb%q2@I%XyiiPPUY?npY{2 z$XmovW{9D#NWl*INR?(If8gYDmU^neu1zr%&ZAHai~6-N zNrp6|<`qMpA$b+g$VUtnc+`jhk5!}DxEH@N!5twi#=Q<+5KOnsvMGvTGPpa2g$Fe* z0jrVQ^fu8!3h1^3GuoQTFl(kkh=_*zmC%~#t(~i6nO@GS9F4q4g>lm{ycB1GS9Q}C zj9)KU9MAPSbWw08b;}udvx=v<%o_8(I2MC<0&{WKexR-Qa}!RP-#y8(fLbDi5><7?ENN zHJD(YKE^+RP$QzXR%)RM3rz~q`~WIZYT+5K0wnKXjdofw=sqx;2Haph()I|Y$@AcS zU}xV_JhW<$VI-8;w2FJ~6b+q!yGp7gD_!Q8Ojh+2VV0Q}FFUp)9NR4N1nB*0deMqg zvDlc%N<0ZlPqv*KF1q#i^Asx7F>A`5nAY0(`w9)#+>5~Ol4q&Rf<0%irTS*&I>^pP zPF>4Pzpgb`Pv-1798e_W1Jg$J&{Cx~rxwYU}BN)%3uVboS?T_ePv(yBC}X z4o|~=+scIL-G{Gn7z%WeP$*R#({7au)|%9YMqpum+8LmgrZ=qaR1!#@Q~Q``!C&&< zpm5LD&WPa)6z+Th;!?P%q`ZY2? z{Iz_8a*R3K!S}%6$riJNLi;y9+PrC=>ROCd{A=t*3Y7}84UXsV-N2Tq-v%y1)NFug zp?Gb|tlO8*7G>lv*ls~-RtV34{485i}cZ# zegb|PXceSUC9RN_NmdE&YmD72>Y`d-ZjOV8RhVI@Tq^~@JF=E>U zF~$=A`2P1K1%4J1))r`Ebo^G=H*ftiJu?cwFnE;hLYe70{3!IYV@z2nCv^SVRKaSl z$nZzu*xP8r>NA;Zh=hsg03`V1S@Jq&Dy{3)sG$)({2fnhThQTJ@7qw1;6 z3{`s@5vnEwcl69ggZ9Oj*6S=fmc@#~bZj^HnMD8`(;nyelmsVjKYc6qdXU2#`~;X_ h self.period: + self._task_logs.popleft() + else: + break + + async def acquire(self): + while True: + self.flush() + if len(self._task_logs) < self.rate_limit: + break + await asyncio.sleep(self.retry_interval) + + self._task_logs.append(time.monotonic()) + + async def __aenter__(self): + await self.acquire() + + async def __aexit__(self, exc_type, exc, tb): + pass diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__init__.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__init__.py new file mode 100644 index 0000000..5c6e065 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__init__.py @@ -0,0 +1,104 @@ +# SPDX-License-Identifier: MIT + +""" +Classes Without Boilerplate +""" + +from functools import partial +from typing import Callable, Literal, Protocol + +from . import converters, exceptions, filters, setters, validators +from ._cmp import cmp_using +from ._config import get_run_validators, set_run_validators +from ._funcs import asdict, assoc, astuple, has, resolve_types +from ._make import ( + NOTHING, + Attribute, + Converter, + Factory, + _Nothing, + attrib, + attrs, + evolve, + fields, + fields_dict, + make_class, + validate, +) +from ._next_gen import define, field, frozen, mutable +from ._version_info import VersionInfo + + +s = attributes = attrs +ib = attr = attrib +dataclass = partial(attrs, auto_attribs=True) # happy Easter ;) + + +class AttrsInstance(Protocol): + pass + + +NothingType = Literal[_Nothing.NOTHING] + +__all__ = [ + "NOTHING", + "Attribute", + "AttrsInstance", + "Converter", + "Factory", + "NothingType", + "asdict", + "assoc", + "astuple", + "attr", + "attrib", + "attributes", + "attrs", + "cmp_using", + "converters", + "define", + "evolve", + "exceptions", + "field", + "fields", + "fields_dict", + "filters", + "frozen", + "get_run_validators", + "has", + "ib", + "make_class", + "mutable", + "resolve_types", + "s", + "set_run_validators", + "setters", + "validate", + "validators", +] + + +def _make_getattr(mod_name: str) -> Callable: + """ + Create a metadata proxy for packaging information that uses *mod_name* in + its warnings and errors. + """ + + def __getattr__(name: str) -> str: + if name not in ("__version__", "__version_info__"): + msg = f"module {mod_name} has no attribute {name}" + raise AttributeError(msg) + + from importlib.metadata import metadata + + meta = metadata("attrs") + + if name == "__version_info__": + return VersionInfo._from_version_string(meta["version"]) + + return meta["version"] + + return __getattr__ + + +__getattr__ = _make_getattr(__name__) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__init__.pyi b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__init__.pyi new file mode 100644 index 0000000..8d78fa1 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__init__.pyi @@ -0,0 +1,389 @@ +import enum +import sys + +from typing import ( + Any, + Callable, + Generic, + Literal, + Mapping, + Protocol, + Sequence, + TypeVar, + overload, +) + +# `import X as X` is required to make these public +from . import converters as converters +from . import exceptions as exceptions +from . import filters as filters +from . import setters as setters +from . import validators as validators +from ._cmp import cmp_using as cmp_using +from ._typing_compat import AttrsInstance_ +from ._version_info import VersionInfo +from attrs import ( + define as define, + field as field, + mutable as mutable, + frozen as frozen, + _EqOrderType, + _ValidatorType, + _ConverterType, + _ReprArgType, + _OnSetAttrType, + _OnSetAttrArgType, + _FieldTransformer, + _ValidatorArgType, +) + +if sys.version_info >= (3, 10): + from typing import TypeGuard, TypeAlias +else: + from typing_extensions import TypeGuard, TypeAlias + +if sys.version_info >= (3, 11): + from typing import dataclass_transform +else: + from typing_extensions import dataclass_transform + +__version__: str +__version_info__: VersionInfo +__title__: str +__description__: str +__url__: str +__uri__: str +__author__: str +__email__: str +__license__: str +__copyright__: str + +_T = TypeVar("_T") +_C = TypeVar("_C", bound=type) + +_FilterType = Callable[["Attribute[_T]", _T], bool] + +# We subclass this here to keep the protocol's qualified name clean. +class AttrsInstance(AttrsInstance_, Protocol): + pass + +_A = TypeVar("_A", bound=type[AttrsInstance]) + +class _Nothing(enum.Enum): + NOTHING = enum.auto() + +NOTHING = _Nothing.NOTHING +NothingType: TypeAlias = Literal[_Nothing.NOTHING] + +# NOTE: Factory lies about its return type to make this possible: +# `x: List[int] # = Factory(list)` +# Work around mypy issue #4554 in the common case by using an overload. + +@overload +def Factory(factory: Callable[[], _T]) -> _T: ... +@overload +def Factory( + factory: Callable[[Any], _T], + takes_self: Literal[True], +) -> _T: ... +@overload +def Factory( + factory: Callable[[], _T], + takes_self: Literal[False], +) -> _T: ... + +In = TypeVar("In") +Out = TypeVar("Out") + +class Converter(Generic[In, Out]): + @overload + def __init__(self, converter: Callable[[In], Out]) -> None: ... + @overload + def __init__( + self, + converter: Callable[[In, AttrsInstance, Attribute], Out], + *, + takes_self: Literal[True], + takes_field: Literal[True], + ) -> None: ... + @overload + def __init__( + self, + converter: Callable[[In, Attribute], Out], + *, + takes_field: Literal[True], + ) -> None: ... + @overload + def __init__( + self, + converter: Callable[[In, AttrsInstance], Out], + *, + takes_self: Literal[True], + ) -> None: ... + +class Attribute(Generic[_T]): + name: str + default: _T | None + validator: _ValidatorType[_T] | None + repr: _ReprArgType + cmp: _EqOrderType + eq: _EqOrderType + order: _EqOrderType + hash: bool | None + init: bool + converter: Converter | None + metadata: dict[Any, Any] + type: type[_T] | None + kw_only: bool + on_setattr: _OnSetAttrType + alias: str | None + + def evolve(self, **changes: Any) -> "Attribute[Any]": ... + +# NOTE: We had several choices for the annotation to use for type arg: +# 1) Type[_T] +# - Pros: Handles simple cases correctly +# - Cons: Might produce less informative errors in the case of conflicting +# TypeVars e.g. `attr.ib(default='bad', type=int)` +# 2) Callable[..., _T] +# - Pros: Better error messages than #1 for conflicting TypeVars +# - Cons: Terrible error messages for validator checks. +# e.g. attr.ib(type=int, validator=validate_str) +# -> error: Cannot infer function type argument +# 3) type (and do all of the work in the mypy plugin) +# - Pros: Simple here, and we could customize the plugin with our own errors. +# - Cons: Would need to write mypy plugin code to handle all the cases. +# We chose option #1. + +# `attr` lies about its return type to make the following possible: +# attr() -> Any +# attr(8) -> int +# attr(validator=) -> Whatever the callable expects. +# This makes this type of assignments possible: +# x: int = attr(8) +# +# This form catches explicit None or no default but with no other arguments +# returns Any. +@overload +def attrib( + default: None = ..., + validator: None = ..., + repr: _ReprArgType = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + type: None = ..., + converter: None = ..., + factory: None = ..., + kw_only: bool | None = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., +) -> Any: ... + +# This form catches an explicit None or no default and infers the type from the +# other arguments. +@overload +def attrib( + default: None = ..., + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + type: type[_T] | None = ..., + converter: _ConverterType + | list[_ConverterType] + | tuple[_ConverterType] + | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool | None = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., +) -> _T: ... + +# This form catches an explicit default argument. +@overload +def attrib( + default: _T, + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + type: type[_T] | None = ..., + converter: _ConverterType + | list[_ConverterType] + | tuple[_ConverterType] + | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool | None = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., +) -> _T: ... + +# This form covers type=non-Type: e.g. forward references (str), Any +@overload +def attrib( + default: _T | None = ..., + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + type: object = ..., + converter: _ConverterType + | list[_ConverterType] + | tuple[_ConverterType] + | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool | None = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., +) -> Any: ... +@overload +@dataclass_transform(order_default=True, field_specifiers=(attrib, field)) +def attrs( + maybe_cls: _C, + these: dict[str, Any] | None = ..., + repr_ns: str | None = ..., + repr: bool = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + auto_detect: bool = ..., + collect_by_mro: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., + unsafe_hash: bool | None = ..., +) -> _C: ... +@overload +@dataclass_transform(order_default=True, field_specifiers=(attrib, field)) +def attrs( + maybe_cls: None = ..., + these: dict[str, Any] | None = ..., + repr_ns: str | None = ..., + repr: bool = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + auto_detect: bool = ..., + collect_by_mro: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., + unsafe_hash: bool | None = ..., +) -> Callable[[_C], _C]: ... +def fields(cls: type[AttrsInstance]) -> Any: ... +def fields_dict(cls: type[AttrsInstance]) -> dict[str, Attribute[Any]]: ... +def validate(inst: AttrsInstance) -> None: ... +def resolve_types( + cls: _A, + globalns: dict[str, Any] | None = ..., + localns: dict[str, Any] | None = ..., + attribs: list[Attribute[Any]] | None = ..., + include_extras: bool = ..., +) -> _A: ... + +# TODO: add support for returning a proper attrs class from the mypy plugin +# we use Any instead of _CountingAttr so that e.g. `make_class('Foo', +# [attr.ib()])` is valid +def make_class( + name: str, + attrs: list[str] | tuple[str, ...] | dict[str, Any], + bases: tuple[type, ...] = ..., + class_body: dict[str, Any] | None = ..., + repr_ns: str | None = ..., + repr: bool = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + collect_by_mro: bool = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., +) -> type: ... + +# _funcs -- + +# TODO: add support for returning TypedDict from the mypy plugin +# FIXME: asdict/astuple do not honor their factory args. Waiting on one of +# these: +# https://github.com/python/mypy/issues/4236 +# https://github.com/python/typing/issues/253 +# XXX: remember to fix attrs.asdict/astuple too! +def asdict( + inst: AttrsInstance, + recurse: bool = ..., + filter: _FilterType[Any] | None = ..., + dict_factory: type[Mapping[Any, Any]] = ..., + retain_collection_types: bool = ..., + value_serializer: Callable[[type, Attribute[Any], Any], Any] | None = ..., + tuple_keys: bool | None = ..., +) -> dict[str, Any]: ... + +# TODO: add support for returning NamedTuple from the mypy plugin +def astuple( + inst: AttrsInstance, + recurse: bool = ..., + filter: _FilterType[Any] | None = ..., + tuple_factory: type[Sequence[Any]] = ..., + retain_collection_types: bool = ..., +) -> tuple[Any, ...]: ... +def has(cls: type) -> TypeGuard[type[AttrsInstance]]: ... +def assoc(inst: _T, **changes: Any) -> _T: ... +def evolve(inst: _T, **changes: Any) -> _T: ... + +# _config -- + +def set_run_validators(run: bool) -> None: ... +def get_run_validators() -> bool: ... + +# aliases -- + +s = attributes = attrs +ib = attr = attrib +dataclass = attrs # Technically, partial(attrs, auto_attribs=True) ;) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/__init__.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..501df48bef57bf0202eb203aa47cea49f6bc67be GIT binary patch literal 2613 zcmZWq-ESMm5#Ku=ze!OhWy!X_&XQ%DPE5vD92ZU?AePg}MIfh$(G>f#J@b~**|&G> z-chjx8D$Ftb>55ug$1Mqf}#&C+yd!afc^=6p`!$G773i9D2lu(Re}_G>dc-frS5{9 zot^!fotfY7{#Gs*2(-8U%DsG!kbmG{(9(O#?vD*Z9uSvM;u@~$8^WZffqKeM35!}H zP17PnGhnmaw4W6@niF}N7X?}nMOqXkTGDeFzbuC6kk+$)MGVtnaflw$pVwz41o7&0glm32d9JC2M! z$FHYUZqf05=Z4Q!_BAi&((zU9bs5HCEA+p>v+HS9XobNVmoOWt0>9njo!AS5NM+le zuZ`J=$I0xP<9n_Xhcbd|@-5L}-N*}8>ZYo$@R-SNzz&wED(rj82G?br$n{#WO2b3K zmdZL&-0gsasZ}RZWyzz^U*jxZ@9?NzQrYEe*O#s?zpC;t$FcNobYrgaivx#M_WMo? z+*wySwj9Q*;0v6u7sC0_M=HbD@IaMmd)#*;RZM!OeJBX$7H2Jtsmkqn&g+)SxV-HJ zT&4A5*ek;g9;mG7#u!X^eDOyRE(p`rpdDU^amne%Axo}~T9}AI+sh!?ErI0$;e;B1 z4|CmssFm?i(bXV|ouI{+F=31aj^K=`0%Ia{yFThA#(vs${AA{jWEao=_F8i_6ucQb z-c7F=hoK)eom&xeR(KFM8*4mRYx>@eW@jBLC75rVJKv0;1kQGx)-6~Ai{b7jV_x9J zj5Rvz@-&>P#T+ORV)`z5Y~|$HfxSK>52HRhFvu~~j(||bz4%{;#K~baA3{;ZISa3n z$51UKA%ZkUavT?wQ2?J1c^t(Aiad%L6q6{XP$2opSrkJkY9N&9-H_8bI)P#YO-3Xu zI4Gj9QDE3r4nnB|t1^Lun@ghtjk?C>ALkgqIz!I~Lh81Tz449&;D*LQ%gO|oganZev0*y(0(L3PL@aW)AGAvZB+ zPqodIn?qI`?0ka^ED);vG8BA~F`ya*4pjBuXz!PcEsWvDgH6R%*n{F5FxEv}(Uw+pf;_OLPCsHUC~2+sbZN z?0eSdu%|ZnL2>TW+SJFj`A4<+_pZEu^e@-8YghWEE1y?t_piSFvwm($gBGHdf+y8Y z?Yg{-cViTPVkgd*|Hof>1*U$8YY=eY-%hENp8n134uS6XvtMJkGeJsYeQQ)7zg+*G z$};ALEl6g*-3@?>frTVONo9b+A(j%cC6P;H2F-g|*9g~;)|5g6Jt~(L9hKKdm409fI2DCW$qv=_e@}%`peeq8Y@-JMt{xw_`|XkdTq4 zAk8^QFsi&?CmP6DKyn_%ITZMXm(PJvc_aY+QAsGZiAD$%e2N*9i?|L$E$b*SDH3@n zp;;`dZ*wmtI9QOF4uos;XAnCn!!W+gn1=Orju=xR6wQ_Ke;S9+#?pQtg?&>z|Zr_h0#g^F!J}8z9P`=(__OdV(En*5VFv_R!qVi~2eL1t*oRk^lez literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/_cmp.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/_cmp.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d12c659e8a1b4f6a31dccc619c4e6f95bbb5f55d GIT binary patch literal 5077 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 WS6ln|{>NLAyqegJgt!#D_J06pRW-K& literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/_config.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/_config.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..048b7d4df6a4c894e995094b191a24717c96ff26 GIT binary patch literal 1109 zcmd5*%}x|S5boYtU|p7}GCQ;B?p-nj z6Eq%7ym-TdFJO2CAHmBWJeY|G5?_G09t+Jj} z1In7vu-y>4Ata;{l2pTaTEL_L%+v!|$$*PZ){gZ&AUHbrBgJa5;Md*i8DEqrEg1K#W9Q;Eywf#kwv`6Vs+Oj)x9S%2a-ujvq%gzm@4mnk;z>i@u7qxPdp?LJWfOo_-Lf$!1jdTA4Hrx2lAOx`Jwtd><#3 z$v5G`tx6bRNTbezby!8B04^bpEsxPMXc63J3z|raZ$r^F#&Y`Wz zW1-tJ`G-mPui9-M(qG%{QfbQfp2!L=a@Z)-FRP}|Q07^m6n3UtoVGAC4nsk};y4KG z_LE-NeWr}(T*sxm&6KxeaZiq8z!Y1}p*nIXrALFL0^PaW-SVBip~H#Ey|HhD6*}F! JT%t3U;wPPdDz^Xt literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/_funcs.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/_funcs.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e5dfb61d3ba04eb3f35c921eb51a96e16ad6f78 GIT binary patch literal 14031 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 literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/_make.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/_make.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c64dfdfcd3cc7f5d7a677c1c679edd5337ee6754 GIT binary patch literal 107151 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 literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/_next_gen.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/_next_gen.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1428c61886c538d404027024d0c9edf7d79b2fe5 GIT binary patch literal 26367 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 literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/_version_info.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/_version_info.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..648fe15ccdcd002ed6d994734294a80356f75875 GIT binary patch literal 3418 zcmb_e-A^3X6~A|8XV@>;<-;MERvmwkcoFPoapKypP1VHsD=w;Q`r%ci>9BJ#1G6*B zy|XwVETPB`P(OGhM}o?gO4LX-!b(%M50Uy0xatc|kdlm$nyRT(zhUF5k)L|*o!wP+d(GW_ui%C1fHK+o*tZ7$Z|M zWm_u9Ia%-_J5*3|NvL*$RwMu~Mo@<(k zrecq{G==>Z&-Dyjcd1FJW#$VyZwBW)sllOgI(sV?QO7S*~-z8FP)h5IL&B`hhkbh&6X~ zg5*8T8#g>HZ#dd0(eiGgXi#Emo~wy^XzrM16X%*Yu4ViCUp^TXJ_ZK|HC~-`U4$dq z6Mb5?PkX6PJ2+-JhJ7%lX{SzWLOzfZ_eN-md?N>^g6rTmyN8EqOFO-H9s><|)I!3A zT^`RGHrq+6W)Xzjr954IP~X?&Q`1*74qS*7(&=jL4bvp%$&*_4M0!A|0GT0grbzM? z5DSz*>mUxQ?FT@X&>Wtqz(;5+#KdbA=?%%NLJ-Z>pk_*wM-ZZ|bJB!Te=p!oxq2HT z3C$s|+MeLS40VA~Ro|ddzE-2wYru!Z&pYjU1*O8X$HbF47=L6?Mzmhms~L`|QR0=T zqZyiBhpTkW_!&+=;t%u{fiKESMfn(b#5riw&D)5RITLx<^6sEHYj z8|T`rR{!X|EM9=5SPsZM+KQs)mfPnR&y`=hb!h=_##$DpZXGLM{^j>RjW^#uzj(g< zvyJ$-|DI^uZ0#stE>FEZa;NLPLo3ET{I2=i)Sr%iF!f>UAG|-Fc#wT?`7bX&m8E2K z3rUgaHh4!38047Y)!6irkoi>+oJ)wt>JYhuQ|#4{IEOv8dbK*hnd))m zi}e;Zu@|eJ=4w9j(woxce)#)G0pGB*=K4Dr)t~BesG-@E_wu?QdTdMrjD}|4ufcA} zVI>M6b-i&ydo_yzKx?zn(54OBGAlDO9gIhg>>mp(bK9cJm^Et8XdX2jHs;a-%-5Qc&k6~2HWNM{T_c>KYP_m-y7?{GiOIuXUtg^$^; z2E^8@j)FC_fB;mJD4x7MxH!1{li%pS(jUh9HaohPhwcn741JO4TJCvo-$vra&9`dM3`MC3?#q$fVmP1=%lx!=HEY7ZnyS{wd zgp!AzARIZk*?!=o_<=1M*k{{uaPd}0H@chXm+#|#`TtljDAYG880~{pXg?f2XWLcfc?8@+et_ZL?$ei-`X_=ShZFRXW5{5bLY zdiZtGLc^(69~?U{Z*<*{>UzO7OE%}@x;|Ah?24vI*G)GM1BO4Bc5~90wJ*bWO{DI} z#4sul_(+;m%$k^tqCJEJc;*wv5!)EzUi8zEv4`@`9@Df07I_^5*PF{THDTjiu>RiBrDXQoNW0C|9=KoC!viv^h4sgOpLE6%H MIY~Ya34w_5U+FUpl>h($ literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/converters.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/converters.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5c54630277d123209aec499559fc195137c5f94 GIT binary patch literal 4627 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 A!Tk-6X|OqgQi&dr3YD|j9VgqacdeOm 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 T4<`oj`Ii=4>U-mxgmm~X@IuQg literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/validators.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/__pycache__/validators.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..936e2ee57152ba9801fd6d65118cc1c52dd48380 GIT binary patch literal 27525 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", "ge": ">="} + + +def cmp_using( + eq=None, + lt=None, + le=None, + gt=None, + ge=None, + require_same_type=True, + class_name="Comparable", +): + """ + Create a class that can be passed into `attrs.field`'s ``eq``, ``order``, + and ``cmp`` arguments to customize field comparison. + + The resulting class will have a full set of ordering methods if at least + one of ``{lt, le, gt, ge}`` and ``eq`` are provided. + + Args: + eq (typing.Callable | None): + Callable used to evaluate equality of two objects. + + lt (typing.Callable | None): + Callable used to evaluate whether one object is less than another + object. + + le (typing.Callable | None): + Callable used to evaluate whether one object is less than or equal + to another object. + + gt (typing.Callable | None): + Callable used to evaluate whether one object is greater than + another object. + + ge (typing.Callable | None): + Callable used to evaluate whether one object is greater than or + equal to another object. + + require_same_type (bool): + When `True`, equality and ordering methods will return + `NotImplemented` if objects are not of the same type. + + class_name (str | None): Name of class. Defaults to "Comparable". + + See `comparison` for more details. + + .. versionadded:: 21.1.0 + """ + + body = { + "__slots__": ["value"], + "__init__": _make_init(), + "_requirements": [], + "_is_comparable_to": _is_comparable_to, + } + + # Add operations. + num_order_functions = 0 + has_eq_function = False + + if eq is not None: + has_eq_function = True + body["__eq__"] = _make_operator("eq", eq) + body["__ne__"] = __ne__ + + if lt is not None: + num_order_functions += 1 + body["__lt__"] = _make_operator("lt", lt) + + if le is not None: + num_order_functions += 1 + body["__le__"] = _make_operator("le", le) + + if gt is not None: + num_order_functions += 1 + body["__gt__"] = _make_operator("gt", gt) + + if ge is not None: + num_order_functions += 1 + body["__ge__"] = _make_operator("ge", ge) + + type_ = types.new_class( + class_name, (object,), {}, lambda ns: ns.update(body) + ) + + # Add same type requirement. + if require_same_type: + type_._requirements.append(_check_same_type) + + # Add total ordering if at least one operation was defined. + if 0 < num_order_functions < 4: + if not has_eq_function: + # functools.total_ordering requires __eq__ to be defined, + # so raise early error here to keep a nice stack. + msg = "eq must be define is order to complete ordering from lt, le, gt, ge." + raise ValueError(msg) + type_ = functools.total_ordering(type_) + + return type_ + + +def _make_init(): + """ + Create __init__ method. + """ + + def __init__(self, value): + """ + Initialize object with *value*. + """ + self.value = value + + return __init__ + + +def _make_operator(name, func): + """ + Create operator method. + """ + + def method(self, other): + if not self._is_comparable_to(other): + return NotImplemented + + result = func(self.value, other.value) + if result is NotImplemented: + return NotImplemented + + return result + + method.__name__ = f"__{name}__" + method.__doc__ = ( + f"Return a {_operation_names[name]} b. Computed by attrs." + ) + + return method + + +def _is_comparable_to(self, other): + """ + Check whether `other` is comparable to `self`. + """ + return all(func(self, other) for func in self._requirements) + + +def _check_same_type(self, other): + """ + Return True if *self* and *other* are of the same type, False otherwise. + """ + return other.value.__class__ is self.value.__class__ diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_cmp.pyi b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_cmp.pyi new file mode 100644 index 0000000..cc7893b --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_cmp.pyi @@ -0,0 +1,13 @@ +from typing import Any, Callable + +_CompareWithType = Callable[[Any, Any], bool] + +def cmp_using( + eq: _CompareWithType | None = ..., + lt: _CompareWithType | None = ..., + le: _CompareWithType | None = ..., + gt: _CompareWithType | None = ..., + ge: _CompareWithType | None = ..., + require_same_type: bool = ..., + class_name: str = ..., +) -> type: ... diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_compat.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_compat.py new file mode 100644 index 0000000..bc68ed9 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_compat.py @@ -0,0 +1,99 @@ +# SPDX-License-Identifier: MIT + +import inspect +import platform +import sys +import threading + +from collections.abc import Mapping, Sequence # noqa: F401 +from typing import _GenericAlias + + +PYPY = platform.python_implementation() == "PyPy" +PY_3_10_PLUS = sys.version_info[:2] >= (3, 10) +PY_3_11_PLUS = sys.version_info[:2] >= (3, 11) +PY_3_12_PLUS = sys.version_info[:2] >= (3, 12) +PY_3_13_PLUS = sys.version_info[:2] >= (3, 13) +PY_3_14_PLUS = sys.version_info[:2] >= (3, 14) + + +if PY_3_14_PLUS: + import annotationlib + + # We request forward-ref annotations to not break in the presence of + # forward references. + + def _get_annotations(cls): + return annotationlib.get_annotations( + cls, format=annotationlib.Format.FORWARDREF + ) + +else: + + def _get_annotations(cls): + """ + Get annotations for *cls*. + """ + return cls.__dict__.get("__annotations__", {}) + + +class _AnnotationExtractor: + """ + Extract type annotations from a callable, returning None whenever there + is none. + """ + + __slots__ = ["sig"] + + def __init__(self, callable): + try: + self.sig = inspect.signature(callable) + except (ValueError, TypeError): # inspect failed + self.sig = None + + def get_first_param_type(self): + """ + Return the type annotation of the first argument if it's not empty. + """ + if not self.sig: + return None + + params = list(self.sig.parameters.values()) + if params and params[0].annotation is not inspect.Parameter.empty: + return params[0].annotation + + return None + + def get_return_type(self): + """ + Return the return type if it's not empty. + """ + if ( + self.sig + and self.sig.return_annotation is not inspect.Signature.empty + ): + return self.sig.return_annotation + + return None + + +# Thread-local global to track attrs instances which are already being repr'd. +# This is needed because there is no other (thread-safe) way to pass info +# about the instances that are already being repr'd through the call stack +# in order to ensure we don't perform infinite recursion. +# +# For instance, if an instance contains a dict which contains that instance, +# we need to know that we're already repr'ing the outside instance from within +# the dict's repr() call. +# +# This lives here rather than in _make.py so that the functions in _make.py +# don't have a direct reference to the thread-local in their globals dict. +# If they have such a reference, it breaks cloudpickle. +repr_context = threading.local() + + +def get_generic_base(cl): + """If this is a generic class (A[str]), return the generic base for it.""" + if cl.__class__ is _GenericAlias: + return cl.__origin__ + return None diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_config.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_config.py new file mode 100644 index 0000000..4b25772 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_config.py @@ -0,0 +1,31 @@ +# SPDX-License-Identifier: MIT + +__all__ = ["get_run_validators", "set_run_validators"] + +_run_validators = True + + +def set_run_validators(run): + """ + Set whether or not validators are run. By default, they are run. + + .. deprecated:: 21.3.0 It will not be removed, but it also will not be + moved to new ``attrs`` namespace. Use `attrs.validators.set_disabled()` + instead. + """ + if not isinstance(run, bool): + msg = "'run' must be bool." + raise TypeError(msg) + global _run_validators + _run_validators = run + + +def get_run_validators(): + """ + Return whether or not validators are run. + + .. deprecated:: 21.3.0 It will not be removed, but it also will not be + moved to new ``attrs`` namespace. Use `attrs.validators.get_disabled()` + instead. + """ + return _run_validators diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_funcs.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_funcs.py new file mode 100644 index 0000000..1adb500 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_funcs.py @@ -0,0 +1,497 @@ +# SPDX-License-Identifier: MIT + + +import copy + +from ._compat import get_generic_base +from ._make import _OBJ_SETATTR, NOTHING, fields +from .exceptions import AttrsAttributeNotFoundError + + +_ATOMIC_TYPES = frozenset( + { + type(None), + bool, + int, + float, + str, + complex, + bytes, + type(...), + type, + range, + property, + } +) + + +def asdict( + inst, + recurse=True, + filter=None, + dict_factory=dict, + retain_collection_types=False, + value_serializer=None, +): + """ + Return the *attrs* attribute values of *inst* as a dict. + + Optionally recurse into other *attrs*-decorated classes. + + Args: + inst: Instance of an *attrs*-decorated class. + + recurse (bool): Recurse into classes that are also *attrs*-decorated. + + filter (~typing.Callable): + A callable whose return code determines whether an attribute or + element is included (`True`) or dropped (`False`). Is called with + the `attrs.Attribute` as the first argument and the value as the + second argument. + + dict_factory (~typing.Callable): + A callable to produce dictionaries from. For example, to produce + ordered dictionaries instead of normal Python dictionaries, pass in + ``collections.OrderedDict``. + + retain_collection_types (bool): + Do not convert to `list` when encountering an attribute whose type + is `tuple` or `set`. Only meaningful if *recurse* is `True`. + + value_serializer (typing.Callable | None): + A hook that is called for every attribute or dict key/value. It + receives the current instance, field and value and must return the + (updated) value. The hook is run *after* the optional *filter* has + been applied. + + Returns: + Return type of *dict_factory*. + + Raises: + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + .. versionadded:: 16.0.0 *dict_factory* + .. versionadded:: 16.1.0 *retain_collection_types* + .. versionadded:: 20.3.0 *value_serializer* + .. versionadded:: 21.3.0 + If a dict has a collection for a key, it is serialized as a tuple. + """ + attrs = fields(inst.__class__) + rv = dict_factory() + for a in attrs: + v = getattr(inst, a.name) + if filter is not None and not filter(a, v): + continue + + if value_serializer is not None: + v = value_serializer(inst, a, v) + + if recurse is True: + value_type = type(v) + if value_type in _ATOMIC_TYPES: + rv[a.name] = v + elif has(value_type): + rv[a.name] = asdict( + v, + recurse=True, + filter=filter, + dict_factory=dict_factory, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ) + elif issubclass(value_type, (tuple, list, set, frozenset)): + cf = value_type if retain_collection_types is True else list + items = [ + _asdict_anything( + i, + is_key=False, + filter=filter, + dict_factory=dict_factory, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ) + for i in v + ] + try: + rv[a.name] = cf(items) + except TypeError: + if not issubclass(cf, tuple): + raise + # Workaround for TypeError: cf.__new__() missing 1 required + # positional argument (which appears, for a namedturle) + rv[a.name] = cf(*items) + elif issubclass(value_type, dict): + df = dict_factory + rv[a.name] = df( + ( + _asdict_anything( + kk, + is_key=True, + filter=filter, + dict_factory=df, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ), + _asdict_anything( + vv, + is_key=False, + filter=filter, + dict_factory=df, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ), + ) + for kk, vv in v.items() + ) + else: + rv[a.name] = v + else: + rv[a.name] = v + return rv + + +def _asdict_anything( + val, + is_key, + filter, + dict_factory, + retain_collection_types, + value_serializer, +): + """ + ``asdict`` only works on attrs instances, this works on anything. + """ + val_type = type(val) + if val_type in _ATOMIC_TYPES: + rv = val + if value_serializer is not None: + rv = value_serializer(None, None, rv) + elif getattr(val_type, "__attrs_attrs__", None) is not None: + # Attrs class. + rv = asdict( + val, + recurse=True, + filter=filter, + dict_factory=dict_factory, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ) + elif issubclass(val_type, (tuple, list, set, frozenset)): + if retain_collection_types is True: + cf = val.__class__ + elif is_key: + cf = tuple + else: + cf = list + + rv = cf( + [ + _asdict_anything( + i, + is_key=False, + filter=filter, + dict_factory=dict_factory, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ) + for i in val + ] + ) + elif issubclass(val_type, dict): + df = dict_factory + rv = df( + ( + _asdict_anything( + kk, + is_key=True, + filter=filter, + dict_factory=df, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ), + _asdict_anything( + vv, + is_key=False, + filter=filter, + dict_factory=df, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ), + ) + for kk, vv in val.items() + ) + else: + rv = val + if value_serializer is not None: + rv = value_serializer(None, None, rv) + + return rv + + +def astuple( + inst, + recurse=True, + filter=None, + tuple_factory=tuple, + retain_collection_types=False, +): + """ + Return the *attrs* attribute values of *inst* as a tuple. + + Optionally recurse into other *attrs*-decorated classes. + + Args: + inst: Instance of an *attrs*-decorated class. + + recurse (bool): + Recurse into classes that are also *attrs*-decorated. + + filter (~typing.Callable): + A callable whose return code determines whether an attribute or + element is included (`True`) or dropped (`False`). Is called with + the `attrs.Attribute` as the first argument and the value as the + second argument. + + tuple_factory (~typing.Callable): + A callable to produce tuples from. For example, to produce lists + instead of tuples. + + retain_collection_types (bool): + Do not convert to `list` or `dict` when encountering an attribute + which type is `tuple`, `dict` or `set`. Only meaningful if + *recurse* is `True`. + + Returns: + Return type of *tuple_factory* + + Raises: + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + .. versionadded:: 16.2.0 + """ + attrs = fields(inst.__class__) + rv = [] + retain = retain_collection_types # Very long. :/ + for a in attrs: + v = getattr(inst, a.name) + if filter is not None and not filter(a, v): + continue + value_type = type(v) + if recurse is True: + if value_type in _ATOMIC_TYPES: + rv.append(v) + elif has(value_type): + rv.append( + astuple( + v, + recurse=True, + filter=filter, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + ) + elif issubclass(value_type, (tuple, list, set, frozenset)): + cf = v.__class__ if retain is True else list + items = [ + ( + astuple( + j, + recurse=True, + filter=filter, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + if has(j.__class__) + else j + ) + for j in v + ] + try: + rv.append(cf(items)) + except TypeError: + if not issubclass(cf, tuple): + raise + # Workaround for TypeError: cf.__new__() missing 1 required + # positional argument (which appears, for a namedturle) + rv.append(cf(*items)) + elif issubclass(value_type, dict): + df = value_type if retain is True else dict + rv.append( + df( + ( + ( + astuple( + kk, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + if has(kk.__class__) + else kk + ), + ( + astuple( + vv, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + if has(vv.__class__) + else vv + ), + ) + for kk, vv in v.items() + ) + ) + else: + rv.append(v) + else: + rv.append(v) + + return rv if tuple_factory is list else tuple_factory(rv) + + +def has(cls): + """ + Check whether *cls* is a class with *attrs* attributes. + + Args: + cls (type): Class to introspect. + + Raises: + TypeError: If *cls* is not a class. + + Returns: + bool: + """ + attrs = getattr(cls, "__attrs_attrs__", None) + if attrs is not None: + return True + + # No attrs, maybe it's a specialized generic (A[str])? + generic_base = get_generic_base(cls) + if generic_base is not None: + generic_attrs = getattr(generic_base, "__attrs_attrs__", None) + if generic_attrs is not None: + # Stick it on here for speed next time. + cls.__attrs_attrs__ = generic_attrs + return generic_attrs is not None + return False + + +def assoc(inst, **changes): + """ + Copy *inst* and apply *changes*. + + This is different from `evolve` that applies the changes to the arguments + that create the new instance. + + `evolve`'s behavior is preferable, but there are `edge cases`_ where it + doesn't work. Therefore `assoc` is deprecated, but will not be removed. + + .. _`edge cases`: https://github.com/python-attrs/attrs/issues/251 + + Args: + inst: Instance of a class with *attrs* attributes. + + changes: Keyword changes in the new copy. + + Returns: + A copy of inst with *changes* incorporated. + + Raises: + attrs.exceptions.AttrsAttributeNotFoundError: + If *attr_name* couldn't be found on *cls*. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + .. deprecated:: 17.1.0 + Use `attrs.evolve` instead if you can. This function will not be + removed du to the slightly different approach compared to + `attrs.evolve`, though. + """ + new = copy.copy(inst) + attrs = fields(inst.__class__) + for k, v in changes.items(): + a = getattr(attrs, k, NOTHING) + if a is NOTHING: + msg = f"{k} is not an attrs attribute on {new.__class__}." + raise AttrsAttributeNotFoundError(msg) + _OBJ_SETATTR(new, k, v) + return new + + +def resolve_types( + cls, globalns=None, localns=None, attribs=None, include_extras=True +): + """ + Resolve any strings and forward annotations in type annotations. + + This is only required if you need concrete types in :class:`Attribute`'s + *type* field. In other words, you don't need to resolve your types if you + only use them for static type checking. + + With no arguments, names will be looked up in the module in which the class + was created. If this is not what you want, for example, if the name only + exists inside a method, you may pass *globalns* or *localns* to specify + other dictionaries in which to look up these names. See the docs of + `typing.get_type_hints` for more details. + + Args: + cls (type): Class to resolve. + + globalns (dict | None): Dictionary containing global variables. + + localns (dict | None): Dictionary containing local variables. + + attribs (list | None): + List of attribs for the given class. This is necessary when calling + from inside a ``field_transformer`` since *cls* is not an *attrs* + class yet. + + include_extras (bool): + Resolve more accurately, if possible. Pass ``include_extras`` to + ``typing.get_hints``, if supported by the typing module. On + supported Python versions (3.9+), this resolves the types more + accurately. + + Raises: + TypeError: If *cls* is not a class. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class and you didn't pass any attribs. + + NameError: If types cannot be resolved because of missing variables. + + Returns: + *cls* so you can use this function also as a class decorator. Please + note that you have to apply it **after** `attrs.define`. That means the + decorator has to come in the line **before** `attrs.define`. + + .. versionadded:: 20.1.0 + .. versionadded:: 21.1.0 *attribs* + .. versionadded:: 23.1.0 *include_extras* + """ + # Since calling get_type_hints is expensive we cache whether we've + # done it already. + if getattr(cls, "__attrs_types_resolved__", None) != cls: + import typing + + kwargs = { + "globalns": globalns, + "localns": localns, + "include_extras": include_extras, + } + + hints = typing.get_type_hints(cls, **kwargs) + for field in fields(cls) if attribs is None else attribs: + if field.name in hints: + # Since fields have been frozen we must work around it. + _OBJ_SETATTR(field, "type", hints[field.name]) + # We store the class we resolved so that subclasses know they haven't + # been resolved. + cls.__attrs_types_resolved__ = cls + + # Return the class so you can use it as a decorator too. + return cls diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_make.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_make.py new file mode 100644 index 0000000..d24d9ba --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_make.py @@ -0,0 +1,3362 @@ +# SPDX-License-Identifier: MIT + +from __future__ import annotations + +import abc +import contextlib +import copy +import enum +import inspect +import itertools +import linecache +import sys +import types +import unicodedata +import weakref + +from collections.abc import Callable, Mapping +from functools import cached_property +from typing import Any, NamedTuple, TypeVar + +# We need to import _compat itself in addition to the _compat members to avoid +# having the thread-local in the globals here. +from . import _compat, _config, setters +from ._compat import ( + PY_3_10_PLUS, + PY_3_11_PLUS, + PY_3_13_PLUS, + _AnnotationExtractor, + _get_annotations, + get_generic_base, +) +from .exceptions import ( + DefaultAlreadySetError, + FrozenInstanceError, + NotAnAttrsClassError, + UnannotatedAttributeError, +) + + +# This is used at least twice, so cache it here. +_OBJ_SETATTR = object.__setattr__ +_INIT_FACTORY_PAT = "__attr_factory_%s" +_CLASSVAR_PREFIXES = ( + "typing.ClassVar", + "t.ClassVar", + "ClassVar", + "typing_extensions.ClassVar", +) +# we don't use a double-underscore prefix because that triggers +# name mangling when trying to create a slot for the field +# (when slots=True) +_HASH_CACHE_FIELD = "_attrs_cached_hash" + +_EMPTY_METADATA_SINGLETON = types.MappingProxyType({}) + +# Unique object for unequivocal getattr() defaults. +_SENTINEL = object() + +_DEFAULT_ON_SETATTR = setters.pipe(setters.convert, setters.validate) + + +class _Nothing(enum.Enum): + """ + Sentinel to indicate the lack of a value when `None` is ambiguous. + + If extending attrs, you can use ``typing.Literal[NOTHING]`` to show + that a value may be ``NOTHING``. + + .. versionchanged:: 21.1.0 ``bool(NOTHING)`` is now False. + .. versionchanged:: 22.2.0 ``NOTHING`` is now an ``enum.Enum`` variant. + """ + + NOTHING = enum.auto() + + def __repr__(self): + return "NOTHING" + + def __bool__(self): + return False + + +NOTHING = _Nothing.NOTHING +""" +Sentinel to indicate the lack of a value when `None` is ambiguous. + +When using in 3rd party code, use `attrs.NothingType` for type annotations. +""" + + +class _CacheHashWrapper(int): + """ + An integer subclass that pickles / copies as None + + This is used for non-slots classes with ``cache_hash=True``, to avoid + serializing a potentially (even likely) invalid hash value. Since `None` + is the default value for uncalculated hashes, whenever this is copied, + the copy's value for the hash should automatically reset. + + See GH #613 for more details. + """ + + def __reduce__(self, _none_constructor=type(None), _args=()): # noqa: B008 + return _none_constructor, _args + + +def attrib( + default=NOTHING, + validator=None, + repr=True, + cmp=None, + hash=None, + init=True, + metadata=None, + type=None, + converter=None, + factory=None, + kw_only=None, + eq=None, + order=None, + on_setattr=None, + alias=None, +): + """ + Create a new field / attribute on a class. + + Identical to `attrs.field`, except it's not keyword-only. + + Consider using `attrs.field` in new code (``attr.ib`` will *never* go away, + though). + + .. warning:: + + Does **nothing** unless the class is also decorated with + `attr.s` (or similar)! + + + .. versionadded:: 15.2.0 *convert* + .. versionadded:: 16.3.0 *metadata* + .. versionchanged:: 17.1.0 *validator* can be a ``list`` now. + .. versionchanged:: 17.1.0 + *hash* is `None` and therefore mirrors *eq* by default. + .. versionadded:: 17.3.0 *type* + .. deprecated:: 17.4.0 *convert* + .. versionadded:: 17.4.0 + *converter* as a replacement for the deprecated *convert* to achieve + consistency with other noun-based arguments. + .. versionadded:: 18.1.0 + ``factory=f`` is syntactic sugar for ``default=attr.Factory(f)``. + .. versionadded:: 18.2.0 *kw_only* + .. versionchanged:: 19.2.0 *convert* keyword argument removed. + .. versionchanged:: 19.2.0 *repr* also accepts a custom callable. + .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01. + .. versionadded:: 19.2.0 *eq* and *order* + .. versionadded:: 20.1.0 *on_setattr* + .. versionchanged:: 20.3.0 *kw_only* backported to Python 2 + .. versionchanged:: 21.1.0 + *eq*, *order*, and *cmp* also accept a custom callable + .. versionchanged:: 21.1.0 *cmp* undeprecated + .. versionadded:: 22.2.0 *alias* + .. versionchanged:: 25.4.0 + *kw_only* can now be None, and its default is also changed from False to + None. + """ + eq, eq_key, order, order_key = _determine_attrib_eq_order( + cmp, eq, order, True + ) + + if hash is not None and hash is not True and hash is not False: + msg = "Invalid value for hash. Must be True, False, or None." + raise TypeError(msg) + + if factory is not None: + if default is not NOTHING: + msg = ( + "The `default` and `factory` arguments are mutually exclusive." + ) + raise ValueError(msg) + if not callable(factory): + msg = "The `factory` argument must be a callable." + raise ValueError(msg) + default = Factory(factory) + + if metadata is None: + metadata = {} + + # Apply syntactic sugar by auto-wrapping. + if isinstance(on_setattr, (list, tuple)): + on_setattr = setters.pipe(*on_setattr) + + if validator and isinstance(validator, (list, tuple)): + validator = and_(*validator) + + if converter and isinstance(converter, (list, tuple)): + converter = pipe(*converter) + + return _CountingAttr( + default=default, + validator=validator, + repr=repr, + cmp=None, + hash=hash, + init=init, + converter=converter, + metadata=metadata, + type=type, + kw_only=kw_only, + eq=eq, + eq_key=eq_key, + order=order, + order_key=order_key, + on_setattr=on_setattr, + alias=alias, + ) + + +def _compile_and_eval( + script: str, + globs: dict[str, Any] | None, + locs: Mapping[str, object] | None = None, + filename: str = "", +) -> None: + """ + Evaluate the script with the given global (globs) and local (locs) + variables. + """ + bytecode = compile(script, filename, "exec") + eval(bytecode, globs, locs) + + +def _linecache_and_compile( + script: str, + filename: str, + globs: dict[str, Any] | None, + locals: Mapping[str, object] | None = None, +) -> dict[str, Any]: + """ + Cache the script with _linecache_, compile it and return the _locals_. + """ + + locs = {} if locals is None else locals + + # In order of debuggers like PDB being able to step through the code, + # we add a fake linecache entry. + count = 1 + base_filename = filename + while True: + linecache_tuple = ( + len(script), + None, + script.splitlines(True), + filename, + ) + old_val = linecache.cache.setdefault(filename, linecache_tuple) + if old_val == linecache_tuple: + break + + filename = f"{base_filename[:-1]}-{count}>" + count += 1 + + _compile_and_eval(script, globs, locs, filename) + + return locs + + +def _make_attr_tuple_class(cls_name: str, attr_names: list[str]) -> type: + """ + Create a tuple subclass to hold `Attribute`s for an `attrs` class. + + The subclass is a bare tuple with properties for names. + + class MyClassAttributes(tuple): + __slots__ = () + x = property(itemgetter(0)) + """ + attr_class_name = f"{cls_name}Attributes" + body = {} + for i, attr_name in enumerate(attr_names): + + def getter(self, i=i): + return self[i] + + body[attr_name] = property(getter) + return type(attr_class_name, (tuple,), body) + + +# Tuple class for extracted attributes from a class definition. +# `base_attrs` is a subset of `attrs`. +class _Attributes(NamedTuple): + attrs: type + base_attrs: list[Attribute] + base_attrs_map: dict[str, type] + + +def _is_class_var(annot): + """ + Check whether *annot* is a typing.ClassVar. + + The string comparison hack is used to avoid evaluating all string + annotations which would put attrs-based classes at a performance + disadvantage compared to plain old classes. + """ + annot = str(annot) + + # Annotation can be quoted. + if annot.startswith(("'", '"')) and annot.endswith(("'", '"')): + annot = annot[1:-1] + + return annot.startswith(_CLASSVAR_PREFIXES) + + +def _has_own_attribute(cls, attrib_name): + """ + Check whether *cls* defines *attrib_name* (and doesn't just inherit it). + """ + return attrib_name in cls.__dict__ + + +def _collect_base_attrs( + cls, taken_attr_names +) -> tuple[list[Attribute], dict[str, type]]: + """ + Collect attr.ibs from base classes of *cls*, except *taken_attr_names*. + """ + base_attrs = [] + base_attr_map = {} # A dictionary of base attrs to their classes. + + # Traverse the MRO and collect attributes. + for base_cls in reversed(cls.__mro__[1:-1]): + for a in getattr(base_cls, "__attrs_attrs__", []): + if a.inherited or a.name in taken_attr_names: + continue + + a = a.evolve(inherited=True) # noqa: PLW2901 + base_attrs.append(a) + base_attr_map[a.name] = base_cls + + # For each name, only keep the freshest definition i.e. the furthest at the + # back. base_attr_map is fine because it gets overwritten with every new + # instance. + filtered = [] + seen = set() + for a in reversed(base_attrs): + if a.name in seen: + continue + filtered.insert(0, a) + seen.add(a.name) + + return filtered, base_attr_map + + +def _collect_base_attrs_broken(cls, taken_attr_names): + """ + Collect attr.ibs from base classes of *cls*, except *taken_attr_names*. + + N.B. *taken_attr_names* will be mutated. + + Adhere to the old incorrect behavior. + + Notably it collects from the front and considers inherited attributes which + leads to the buggy behavior reported in #428. + """ + base_attrs = [] + base_attr_map = {} # A dictionary of base attrs to their classes. + + # Traverse the MRO and collect attributes. + for base_cls in cls.__mro__[1:-1]: + for a in getattr(base_cls, "__attrs_attrs__", []): + if a.name in taken_attr_names: + continue + + a = a.evolve(inherited=True) # noqa: PLW2901 + taken_attr_names.add(a.name) + base_attrs.append(a) + base_attr_map[a.name] = base_cls + + return base_attrs, base_attr_map + + +def _transform_attrs( + cls, + these, + auto_attribs, + kw_only, + collect_by_mro, + field_transformer, +) -> _Attributes: + """ + Transform all `_CountingAttr`s on a class into `Attribute`s. + + If *these* is passed, use that and don't look for them on the class. + + If *collect_by_mro* is True, collect them in the correct MRO order, + otherwise use the old -- incorrect -- order. See #428. + + Return an `_Attributes`. + """ + cd = cls.__dict__ + anns = _get_annotations(cls) + + if these is not None: + ca_list = list(these.items()) + elif auto_attribs is True: + ca_names = { + name + for name, attr in cd.items() + if attr.__class__ is _CountingAttr + } + ca_list = [] + annot_names = set() + for attr_name, type in anns.items(): + if _is_class_var(type): + continue + annot_names.add(attr_name) + a = cd.get(attr_name, NOTHING) + + if a.__class__ is not _CountingAttr: + a = attrib(a) + ca_list.append((attr_name, a)) + + unannotated = ca_names - annot_names + if unannotated: + raise UnannotatedAttributeError( + "The following `attr.ib`s lack a type annotation: " + + ", ".join( + sorted(unannotated, key=lambda n: cd.get(n).counter) + ) + + "." + ) + else: + ca_list = sorted( + ( + (name, attr) + for name, attr in cd.items() + if attr.__class__ is _CountingAttr + ), + key=lambda e: e[1].counter, + ) + + fca = Attribute.from_counting_attr + no = ClassProps.KeywordOnly.NO + own_attrs = [ + fca( + attr_name, + ca, + kw_only is not no, + anns.get(attr_name), + ) + for attr_name, ca in ca_list + ] + + if collect_by_mro: + base_attrs, base_attr_map = _collect_base_attrs( + cls, {a.name for a in own_attrs} + ) + else: + base_attrs, base_attr_map = _collect_base_attrs_broken( + cls, {a.name for a in own_attrs} + ) + + if kw_only is ClassProps.KeywordOnly.FORCE: + own_attrs = [a.evolve(kw_only=True) for a in own_attrs] + base_attrs = [a.evolve(kw_only=True) for a in base_attrs] + + attrs = base_attrs + own_attrs + + if field_transformer is not None: + attrs = tuple(field_transformer(cls, attrs)) + + # Check attr order after executing the field_transformer. + # Mandatory vs non-mandatory attr order only matters when they are part of + # the __init__ signature and when they aren't kw_only (which are moved to + # the end and can be mandatory or non-mandatory in any order, as they will + # be specified as keyword args anyway). Check the order of those attrs: + had_default = False + for a in (a for a in attrs if a.init is not False and a.kw_only is False): + if had_default is True and a.default is NOTHING: + msg = f"No mandatory attributes allowed after an attribute with a default value or factory. Attribute in question: {a!r}" + raise ValueError(msg) + + if had_default is False and a.default is not NOTHING: + had_default = True + + # Resolve default field alias after executing field_transformer. + # This allows field_transformer to differentiate between explicit vs + # default aliases and supply their own defaults. + for a in attrs: + if not a.alias: + # Evolve is very slow, so we hold our nose and do it dirty. + _OBJ_SETATTR.__get__(a)("alias", _default_init_alias_for(a.name)) + + # Create AttrsClass *after* applying the field_transformer since it may + # add or remove attributes! + attr_names = [a.name for a in attrs] + AttrsClass = _make_attr_tuple_class(cls.__name__, attr_names) + + return _Attributes(AttrsClass(attrs), base_attrs, base_attr_map) + + +def _make_cached_property_getattr(cached_properties, original_getattr, cls): + lines = [ + # Wrapped to get `__class__` into closure cell for super() + # (It will be replaced with the newly constructed class after construction). + "def wrapper(_cls):", + " __class__ = _cls", + " def __getattr__(self, item, cached_properties=cached_properties, original_getattr=original_getattr, _cached_setattr_get=_cached_setattr_get):", + " func = cached_properties.get(item)", + " if func is not None:", + " result = func(self)", + " _setter = _cached_setattr_get(self)", + " _setter(item, result)", + " return result", + ] + if original_getattr is not None: + lines.append( + " return original_getattr(self, item)", + ) + else: + lines.extend( + [ + " try:", + " return super().__getattribute__(item)", + " except AttributeError:", + " if not hasattr(super(), '__getattr__'):", + " raise", + " return super().__getattr__(item)", + " original_error = f\"'{self.__class__.__name__}' object has no attribute '{item}'\"", + " raise AttributeError(original_error)", + ] + ) + + lines.extend( + [ + " return __getattr__", + "__getattr__ = wrapper(_cls)", + ] + ) + + unique_filename = _generate_unique_filename(cls, "getattr") + + glob = { + "cached_properties": cached_properties, + "_cached_setattr_get": _OBJ_SETATTR.__get__, + "original_getattr": original_getattr, + } + + return _linecache_and_compile( + "\n".join(lines), unique_filename, glob, locals={"_cls": cls} + )["__getattr__"] + + +def _frozen_setattrs(self, name, value): + """ + Attached to frozen classes as __setattr__. + """ + if isinstance(self, BaseException) and name in ( + "__cause__", + "__context__", + "__traceback__", + "__suppress_context__", + "__notes__", + ): + BaseException.__setattr__(self, name, value) + return + + raise FrozenInstanceError + + +def _frozen_delattrs(self, name): + """ + Attached to frozen classes as __delattr__. + """ + if isinstance(self, BaseException) and name in ("__notes__",): + BaseException.__delattr__(self, name) + return + + raise FrozenInstanceError + + +def evolve(*args, **changes): + """ + Create a new instance, based on the first positional argument with + *changes* applied. + + .. tip:: + + On Python 3.13 and later, you can also use `copy.replace` instead. + + Args: + + inst: + Instance of a class with *attrs* attributes. *inst* must be passed + as a positional argument. + + changes: + Keyword changes in the new copy. + + Returns: + A copy of inst with *changes* incorporated. + + Raises: + TypeError: + If *attr_name* couldn't be found in the class ``__init__``. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + .. versionadded:: 17.1.0 + .. deprecated:: 23.1.0 + It is now deprecated to pass the instance using the keyword argument + *inst*. It will raise a warning until at least April 2024, after which + it will become an error. Always pass the instance as a positional + argument. + .. versionchanged:: 24.1.0 + *inst* can't be passed as a keyword argument anymore. + """ + try: + (inst,) = args + except ValueError: + msg = ( + f"evolve() takes 1 positional argument, but {len(args)} were given" + ) + raise TypeError(msg) from None + + cls = inst.__class__ + attrs = fields(cls) + for a in attrs: + if not a.init: + continue + attr_name = a.name # To deal with private attributes. + init_name = a.alias + if init_name not in changes: + changes[init_name] = getattr(inst, attr_name) + + return cls(**changes) + + +class _ClassBuilder: + """ + Iteratively build *one* class. + """ + + __slots__ = ( + "_add_method_dunders", + "_attr_names", + "_attrs", + "_base_attr_map", + "_base_names", + "_cache_hash", + "_cls", + "_cls_dict", + "_delete_attribs", + "_frozen", + "_has_custom_setattr", + "_has_post_init", + "_has_pre_init", + "_is_exc", + "_on_setattr", + "_pre_init_has_args", + "_repr_added", + "_script_snippets", + "_slots", + "_weakref_slot", + "_wrote_own_setattr", + ) + + def __init__( + self, + cls: type, + these, + auto_attribs: bool, + props: ClassProps, + has_custom_setattr: bool, + ): + attrs, base_attrs, base_map = _transform_attrs( + cls, + these, + auto_attribs, + props.kw_only, + props.collected_fields_by_mro, + props.field_transformer, + ) + + self._cls = cls + self._cls_dict = dict(cls.__dict__) if props.is_slotted else {} + self._attrs = attrs + self._base_names = {a.name for a in base_attrs} + self._base_attr_map = base_map + self._attr_names = tuple(a.name for a in attrs) + self._slots = props.is_slotted + self._frozen = props.is_frozen + self._weakref_slot = props.has_weakref_slot + self._cache_hash = ( + props.hashability is ClassProps.Hashability.HASHABLE_CACHED + ) + self._has_pre_init = bool(getattr(cls, "__attrs_pre_init__", False)) + self._pre_init_has_args = False + if self._has_pre_init: + # Check if the pre init method has more arguments than just `self` + # We want to pass arguments if pre init expects arguments + pre_init_func = cls.__attrs_pre_init__ + pre_init_signature = inspect.signature(pre_init_func) + self._pre_init_has_args = len(pre_init_signature.parameters) > 1 + self._has_post_init = bool(getattr(cls, "__attrs_post_init__", False)) + self._delete_attribs = not bool(these) + self._is_exc = props.is_exception + self._on_setattr = props.on_setattr_hook + + self._has_custom_setattr = has_custom_setattr + self._wrote_own_setattr = False + + self._cls_dict["__attrs_attrs__"] = self._attrs + self._cls_dict["__attrs_props__"] = props + + if props.is_frozen: + self._cls_dict["__setattr__"] = _frozen_setattrs + self._cls_dict["__delattr__"] = _frozen_delattrs + + self._wrote_own_setattr = True + elif self._on_setattr in ( + _DEFAULT_ON_SETATTR, + setters.validate, + setters.convert, + ): + has_validator = has_converter = False + for a in attrs: + if a.validator is not None: + has_validator = True + if a.converter is not None: + has_converter = True + + if has_validator and has_converter: + break + if ( + ( + self._on_setattr == _DEFAULT_ON_SETATTR + and not (has_validator or has_converter) + ) + or (self._on_setattr == setters.validate and not has_validator) + or (self._on_setattr == setters.convert and not has_converter) + ): + # If class-level on_setattr is set to convert + validate, but + # there's no field to convert or validate, pretend like there's + # no on_setattr. + self._on_setattr = None + + if props.added_pickling: + ( + self._cls_dict["__getstate__"], + self._cls_dict["__setstate__"], + ) = self._make_getstate_setstate() + + # tuples of script, globs, hook + self._script_snippets: list[ + tuple[str, dict, Callable[[dict, dict], Any]] + ] = [] + self._repr_added = False + + # We want to only do this check once; in 99.9% of cases these + # exist. + if not hasattr(self._cls, "__module__") or not hasattr( + self._cls, "__qualname__" + ): + self._add_method_dunders = self._add_method_dunders_safe + else: + self._add_method_dunders = self._add_method_dunders_unsafe + + def __repr__(self): + return f"<_ClassBuilder(cls={self._cls.__name__})>" + + def _eval_snippets(self) -> None: + """ + Evaluate any registered snippets in one go. + """ + script = "\n".join([snippet[0] for snippet in self._script_snippets]) + globs = {} + for _, snippet_globs, _ in self._script_snippets: + globs.update(snippet_globs) + + locs = _linecache_and_compile( + script, + _generate_unique_filename(self._cls, "methods"), + globs, + ) + + for _, _, hook in self._script_snippets: + hook(self._cls_dict, locs) + + def build_class(self): + """ + Finalize class based on the accumulated configuration. + + Builder cannot be used after calling this method. + """ + self._eval_snippets() + if self._slots is True: + cls = self._create_slots_class() + self._cls.__attrs_base_of_slotted__ = weakref.ref(cls) + else: + cls = self._patch_original_class() + if PY_3_10_PLUS: + cls = abc.update_abstractmethods(cls) + + # The method gets only called if it's not inherited from a base class. + # _has_own_attribute does NOT work properly for classmethods. + if ( + getattr(cls, "__attrs_init_subclass__", None) + and "__attrs_init_subclass__" not in cls.__dict__ + ): + cls.__attrs_init_subclass__() + + return cls + + def _patch_original_class(self): + """ + Apply accumulated methods and return the class. + """ + cls = self._cls + base_names = self._base_names + + # Clean class of attribute definitions (`attr.ib()`s). + if self._delete_attribs: + for name in self._attr_names: + if ( + name not in base_names + and getattr(cls, name, _SENTINEL) is not _SENTINEL + ): + # An AttributeError can happen if a base class defines a + # class variable and we want to set an attribute with the + # same name by using only a type annotation. + with contextlib.suppress(AttributeError): + delattr(cls, name) + + # Attach our dunder methods. + for name, value in self._cls_dict.items(): + setattr(cls, name, value) + + # If we've inherited an attrs __setattr__ and don't write our own, + # reset it to object's. + if not self._wrote_own_setattr and getattr( + cls, "__attrs_own_setattr__", False + ): + cls.__attrs_own_setattr__ = False + + if not self._has_custom_setattr: + cls.__setattr__ = _OBJ_SETATTR + + return cls + + def _create_slots_class(self): + """ + Build and return a new class with a `__slots__` attribute. + """ + cd = { + k: v + for k, v in self._cls_dict.items() + if k not in (*tuple(self._attr_names), "__dict__", "__weakref__") + } + + # 3.14.0rc2+ + if hasattr(sys, "_clear_type_descriptors"): + sys._clear_type_descriptors(self._cls) + + # If our class doesn't have its own implementation of __setattr__ + # (either from the user or by us), check the bases, if one of them has + # an attrs-made __setattr__, that needs to be reset. We don't walk the + # MRO because we only care about our immediate base classes. + # XXX: This can be confused by subclassing a slotted attrs class with + # XXX: a non-attrs class and subclass the resulting class with an attrs + # XXX: class. See `test_slotted_confused` for details. For now that's + # XXX: OK with us. + if not self._wrote_own_setattr: + cd["__attrs_own_setattr__"] = False + + if not self._has_custom_setattr: + for base_cls in self._cls.__bases__: + if base_cls.__dict__.get("__attrs_own_setattr__", False): + cd["__setattr__"] = _OBJ_SETATTR + break + + # Traverse the MRO to collect existing slots + # and check for an existing __weakref__. + existing_slots = {} + weakref_inherited = False + for base_cls in self._cls.__mro__[1:-1]: + if base_cls.__dict__.get("__weakref__", None) is not None: + weakref_inherited = True + existing_slots.update( + { + name: getattr(base_cls, name) + for name in getattr(base_cls, "__slots__", []) + } + ) + + base_names = set(self._base_names) + + names = self._attr_names + if ( + self._weakref_slot + and "__weakref__" not in getattr(self._cls, "__slots__", ()) + and "__weakref__" not in names + and not weakref_inherited + ): + names += ("__weakref__",) + + cached_properties = { + name: cached_prop.func + for name, cached_prop in cd.items() + if isinstance(cached_prop, cached_property) + } + + # Collect methods with a `__class__` reference that are shadowed in the new class. + # To know to update them. + additional_closure_functions_to_update = [] + if cached_properties: + class_annotations = _get_annotations(self._cls) + for name, func in cached_properties.items(): + # Add cached properties to names for slotting. + names += (name,) + # Clear out function from class to avoid clashing. + del cd[name] + additional_closure_functions_to_update.append(func) + annotation = inspect.signature(func).return_annotation + if annotation is not inspect.Parameter.empty: + class_annotations[name] = annotation + + original_getattr = cd.get("__getattr__") + if original_getattr is not None: + additional_closure_functions_to_update.append(original_getattr) + + cd["__getattr__"] = _make_cached_property_getattr( + cached_properties, original_getattr, self._cls + ) + + # We only add the names of attributes that aren't inherited. + # Setting __slots__ to inherited attributes wastes memory. + slot_names = [name for name in names if name not in base_names] + + # There are slots for attributes from current class + # that are defined in parent classes. + # As their descriptors may be overridden by a child class, + # we collect them here and update the class dict + reused_slots = { + slot: slot_descriptor + for slot, slot_descriptor in existing_slots.items() + if slot in slot_names + } + slot_names = [name for name in slot_names if name not in reused_slots] + cd.update(reused_slots) + if self._cache_hash: + slot_names.append(_HASH_CACHE_FIELD) + + cd["__slots__"] = tuple(slot_names) + + cd["__qualname__"] = self._cls.__qualname__ + + # Create new class based on old class and our methods. + cls = type(self._cls)(self._cls.__name__, self._cls.__bases__, cd) + + # The following is a fix for + # . + # If a method mentions `__class__` or uses the no-arg super(), the + # compiler will bake a reference to the class in the method itself + # as `method.__closure__`. Since we replace the class with a + # clone, we rewrite these references so it keeps working. + for item in itertools.chain( + cls.__dict__.values(), additional_closure_functions_to_update + ): + if isinstance(item, (classmethod, staticmethod)): + # Class- and staticmethods hide their functions inside. + # These might need to be rewritten as well. + closure_cells = getattr(item.__func__, "__closure__", None) + elif isinstance(item, property): + # Workaround for property `super()` shortcut (PY3-only). + # There is no universal way for other descriptors. + closure_cells = getattr(item.fget, "__closure__", None) + else: + closure_cells = getattr(item, "__closure__", None) + + if not closure_cells: # Catch None or the empty list. + continue + for cell in closure_cells: + try: + match = cell.cell_contents is self._cls + except ValueError: # noqa: PERF203 + # ValueError: Cell is empty + pass + else: + if match: + cell.cell_contents = cls + return cls + + def add_repr(self, ns): + script, globs = _make_repr_script(self._attrs, ns) + + def _attach_repr(cls_dict, globs): + cls_dict["__repr__"] = self._add_method_dunders(globs["__repr__"]) + + self._script_snippets.append((script, globs, _attach_repr)) + self._repr_added = True + return self + + def add_str(self): + if not self._repr_added: + msg = "__str__ can only be generated if a __repr__ exists." + raise ValueError(msg) + + def __str__(self): + return self.__repr__() + + self._cls_dict["__str__"] = self._add_method_dunders(__str__) + return self + + def _make_getstate_setstate(self): + """ + Create custom __setstate__ and __getstate__ methods. + """ + # __weakref__ is not writable. + state_attr_names = tuple( + an for an in self._attr_names if an != "__weakref__" + ) + + def slots_getstate(self): + """ + Automatically created by attrs. + """ + return {name: getattr(self, name) for name in state_attr_names} + + hash_caching_enabled = self._cache_hash + + def slots_setstate(self, state): + """ + Automatically created by attrs. + """ + __bound_setattr = _OBJ_SETATTR.__get__(self) + if isinstance(state, tuple): + # Backward compatibility with attrs instances pickled with + # attrs versions before v22.2.0 which stored tuples. + for name, value in zip(state_attr_names, state): + __bound_setattr(name, value) + else: + for name in state_attr_names: + if name in state: + __bound_setattr(name, state[name]) + + # The hash code cache is not included when the object is + # serialized, but it still needs to be initialized to None to + # indicate that the first call to __hash__ should be a cache + # miss. + if hash_caching_enabled: + __bound_setattr(_HASH_CACHE_FIELD, None) + + return slots_getstate, slots_setstate + + def make_unhashable(self): + self._cls_dict["__hash__"] = None + return self + + def add_hash(self): + script, globs = _make_hash_script( + self._cls, + self._attrs, + frozen=self._frozen, + cache_hash=self._cache_hash, + ) + + def attach_hash(cls_dict: dict, locs: dict) -> None: + cls_dict["__hash__"] = self._add_method_dunders(locs["__hash__"]) + + self._script_snippets.append((script, globs, attach_hash)) + + return self + + def add_init(self): + script, globs, annotations = _make_init_script( + self._cls, + self._attrs, + self._has_pre_init, + self._pre_init_has_args, + self._has_post_init, + self._frozen, + self._slots, + self._cache_hash, + self._base_attr_map, + self._is_exc, + self._on_setattr, + attrs_init=False, + ) + + def _attach_init(cls_dict, globs): + init = globs["__init__"] + init.__annotations__ = annotations + cls_dict["__init__"] = self._add_method_dunders(init) + + self._script_snippets.append((script, globs, _attach_init)) + + return self + + def add_replace(self): + self._cls_dict["__replace__"] = self._add_method_dunders( + lambda self, **changes: evolve(self, **changes) + ) + return self + + def add_match_args(self): + self._cls_dict["__match_args__"] = tuple( + field.name + for field in self._attrs + if field.init and not field.kw_only + ) + + def add_attrs_init(self): + script, globs, annotations = _make_init_script( + self._cls, + self._attrs, + self._has_pre_init, + self._pre_init_has_args, + self._has_post_init, + self._frozen, + self._slots, + self._cache_hash, + self._base_attr_map, + self._is_exc, + self._on_setattr, + attrs_init=True, + ) + + def _attach_attrs_init(cls_dict, globs): + init = globs["__attrs_init__"] + init.__annotations__ = annotations + cls_dict["__attrs_init__"] = self._add_method_dunders(init) + + self._script_snippets.append((script, globs, _attach_attrs_init)) + + return self + + def add_eq(self): + cd = self._cls_dict + + script, globs = _make_eq_script(self._attrs) + + def _attach_eq(cls_dict, globs): + cls_dict["__eq__"] = self._add_method_dunders(globs["__eq__"]) + + self._script_snippets.append((script, globs, _attach_eq)) + + cd["__ne__"] = __ne__ + + return self + + def add_order(self): + cd = self._cls_dict + + cd["__lt__"], cd["__le__"], cd["__gt__"], cd["__ge__"] = ( + self._add_method_dunders(meth) + for meth in _make_order(self._cls, self._attrs) + ) + + return self + + def add_setattr(self): + sa_attrs = {} + for a in self._attrs: + on_setattr = a.on_setattr or self._on_setattr + if on_setattr and on_setattr is not setters.NO_OP: + sa_attrs[a.name] = a, on_setattr + + if not sa_attrs: + return self + + if self._has_custom_setattr: + # We need to write a __setattr__ but there already is one! + msg = "Can't combine custom __setattr__ with on_setattr hooks." + raise ValueError(msg) + + # docstring comes from _add_method_dunders + def __setattr__(self, name, val): + try: + a, hook = sa_attrs[name] + except KeyError: + nval = val + else: + nval = hook(self, a, val) + + _OBJ_SETATTR(self, name, nval) + + self._cls_dict["__attrs_own_setattr__"] = True + self._cls_dict["__setattr__"] = self._add_method_dunders(__setattr__) + self._wrote_own_setattr = True + + return self + + def _add_method_dunders_unsafe(self, method: Callable) -> Callable: + """ + Add __module__ and __qualname__ to a *method*. + """ + method.__module__ = self._cls.__module__ + + method.__qualname__ = f"{self._cls.__qualname__}.{method.__name__}" + + method.__doc__ = ( + f"Method generated by attrs for class {self._cls.__qualname__}." + ) + + return method + + def _add_method_dunders_safe(self, method: Callable) -> Callable: + """ + Add __module__ and __qualname__ to a *method* if possible. + """ + with contextlib.suppress(AttributeError): + method.__module__ = self._cls.__module__ + + with contextlib.suppress(AttributeError): + method.__qualname__ = f"{self._cls.__qualname__}.{method.__name__}" + + with contextlib.suppress(AttributeError): + method.__doc__ = f"Method generated by attrs for class {self._cls.__qualname__}." + + return method + + +def _determine_attrs_eq_order(cmp, eq, order, default_eq): + """ + Validate the combination of *cmp*, *eq*, and *order*. Derive the effective + values of eq and order. If *eq* is None, set it to *default_eq*. + """ + if cmp is not None and any((eq is not None, order is not None)): + msg = "Don't mix `cmp` with `eq' and `order`." + raise ValueError(msg) + + # cmp takes precedence due to bw-compatibility. + if cmp is not None: + return cmp, cmp + + # If left None, equality is set to the specified default and ordering + # mirrors equality. + if eq is None: + eq = default_eq + + if order is None: + order = eq + + if eq is False and order is True: + msg = "`order` can only be True if `eq` is True too." + raise ValueError(msg) + + return eq, order + + +def _determine_attrib_eq_order(cmp, eq, order, default_eq): + """ + Validate the combination of *cmp*, *eq*, and *order*. Derive the effective + values of eq and order. If *eq* is None, set it to *default_eq*. + """ + if cmp is not None and any((eq is not None, order is not None)): + msg = "Don't mix `cmp` with `eq' and `order`." + raise ValueError(msg) + + def decide_callable_or_boolean(value): + """ + Decide whether a key function is used. + """ + if callable(value): + value, key = True, value + else: + key = None + return value, key + + # cmp takes precedence due to bw-compatibility. + if cmp is not None: + cmp, cmp_key = decide_callable_or_boolean(cmp) + return cmp, cmp_key, cmp, cmp_key + + # If left None, equality is set to the specified default and ordering + # mirrors equality. + if eq is None: + eq, eq_key = default_eq, None + else: + eq, eq_key = decide_callable_or_boolean(eq) + + if order is None: + order, order_key = eq, eq_key + else: + order, order_key = decide_callable_or_boolean(order) + + if eq is False and order is True: + msg = "`order` can only be True if `eq` is True too." + raise ValueError(msg) + + return eq, eq_key, order, order_key + + +def _determine_whether_to_implement( + cls, flag, auto_detect, dunders, default=True +): + """ + Check whether we should implement a set of methods for *cls*. + + *flag* is the argument passed into @attr.s like 'init', *auto_detect* the + same as passed into @attr.s and *dunders* is a tuple of attribute names + whose presence signal that the user has implemented it themselves. + + Return *default* if no reason for either for or against is found. + """ + if flag is True or flag is False: + return flag + + if flag is None and auto_detect is False: + return default + + # Logically, flag is None and auto_detect is True here. + for dunder in dunders: + if _has_own_attribute(cls, dunder): + return False + + return default + + +def attrs( + maybe_cls=None, + these=None, + repr_ns=None, + repr=None, + cmp=None, + hash=None, + init=None, + slots=False, + frozen=False, + weakref_slot=True, + str=False, + auto_attribs=False, + kw_only=False, + cache_hash=False, + auto_exc=False, + eq=None, + order=None, + auto_detect=False, + collect_by_mro=False, + getstate_setstate=None, + on_setattr=None, + field_transformer=None, + match_args=True, + unsafe_hash=None, + force_kw_only=True, +): + r""" + A class decorator that adds :term:`dunder methods` according to the + specified attributes using `attr.ib` or the *these* argument. + + Consider using `attrs.define` / `attrs.frozen` in new code (``attr.s`` will + *never* go away, though). + + Args: + repr_ns (str): + When using nested classes, there was no way in Python 2 to + automatically detect that. This argument allows to set a custom + name for a more meaningful ``repr`` output. This argument is + pointless in Python 3 and is therefore deprecated. + + .. caution:: + Refer to `attrs.define` for the rest of the parameters, but note that they + can have different defaults. + + Notably, leaving *on_setattr* as `None` will **not** add any hooks. + + .. versionadded:: 16.0.0 *slots* + .. versionadded:: 16.1.0 *frozen* + .. versionadded:: 16.3.0 *str* + .. versionadded:: 16.3.0 Support for ``__attrs_post_init__``. + .. versionchanged:: 17.1.0 + *hash* supports `None` as value which is also the default now. + .. versionadded:: 17.3.0 *auto_attribs* + .. versionchanged:: 18.1.0 + If *these* is passed, no attributes are deleted from the class body. + .. versionchanged:: 18.1.0 If *these* is ordered, the order is retained. + .. versionadded:: 18.2.0 *weakref_slot* + .. deprecated:: 18.2.0 + ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now raise a + `DeprecationWarning` if the classes compared are subclasses of + each other. ``__eq`` and ``__ne__`` never tried to compared subclasses + to each other. + .. versionchanged:: 19.2.0 + ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now do not consider + subclasses comparable anymore. + .. versionadded:: 18.2.0 *kw_only* + .. versionadded:: 18.2.0 *cache_hash* + .. versionadded:: 19.1.0 *auto_exc* + .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01. + .. versionadded:: 19.2.0 *eq* and *order* + .. versionadded:: 20.1.0 *auto_detect* + .. versionadded:: 20.1.0 *collect_by_mro* + .. versionadded:: 20.1.0 *getstate_setstate* + .. versionadded:: 20.1.0 *on_setattr* + .. versionadded:: 20.3.0 *field_transformer* + .. versionchanged:: 21.1.0 + ``init=False`` injects ``__attrs_init__`` + .. versionchanged:: 21.1.0 Support for ``__attrs_pre_init__`` + .. versionchanged:: 21.1.0 *cmp* undeprecated + .. versionadded:: 21.3.0 *match_args* + .. versionadded:: 22.2.0 + *unsafe_hash* as an alias for *hash* (for :pep:`681` compliance). + .. deprecated:: 24.1.0 *repr_ns* + .. versionchanged:: 24.1.0 + Instances are not compared as tuples of attributes anymore, but using a + big ``and`` condition. This is faster and has more correct behavior for + uncomparable values like `math.nan`. + .. versionadded:: 24.1.0 + If a class has an *inherited* classmethod called + ``__attrs_init_subclass__``, it is executed after the class is created. + .. deprecated:: 24.1.0 *hash* is deprecated in favor of *unsafe_hash*. + .. versionchanged:: 25.4.0 + *kw_only* now only applies to attributes defined in the current class, + and respects attribute-level ``kw_only=False`` settings. + .. versionadded:: 25.4.0 *force_kw_only* + """ + if repr_ns is not None: + import warnings + + warnings.warn( + DeprecationWarning( + "The `repr_ns` argument is deprecated and will be removed in or after August 2025." + ), + stacklevel=2, + ) + + eq_, order_ = _determine_attrs_eq_order(cmp, eq, order, None) + + # unsafe_hash takes precedence due to PEP 681. + if unsafe_hash is not None: + hash = unsafe_hash + + if isinstance(on_setattr, (list, tuple)): + on_setattr = setters.pipe(*on_setattr) + + def wrap(cls): + nonlocal hash + is_frozen = frozen or _has_frozen_base_class(cls) + is_exc = auto_exc is True and issubclass(cls, BaseException) + has_own_setattr = auto_detect and _has_own_attribute( + cls, "__setattr__" + ) + + if has_own_setattr and is_frozen: + msg = "Can't freeze a class with a custom __setattr__." + raise ValueError(msg) + + eq = not is_exc and _determine_whether_to_implement( + cls, eq_, auto_detect, ("__eq__", "__ne__") + ) + + Hashability = ClassProps.Hashability + + if is_exc: + hashability = Hashability.LEAVE_ALONE + elif hash is True: + hashability = ( + Hashability.HASHABLE_CACHED + if cache_hash + else Hashability.HASHABLE + ) + elif hash is False: + hashability = Hashability.LEAVE_ALONE + elif hash is None: + if auto_detect is True and _has_own_attribute(cls, "__hash__"): + hashability = Hashability.LEAVE_ALONE + elif eq is True and is_frozen is True: + hashability = ( + Hashability.HASHABLE_CACHED + if cache_hash + else Hashability.HASHABLE + ) + elif eq is False: + hashability = Hashability.LEAVE_ALONE + else: + hashability = Hashability.UNHASHABLE + else: + msg = "Invalid value for hash. Must be True, False, or None." + raise TypeError(msg) + + KeywordOnly = ClassProps.KeywordOnly + if kw_only: + kwo = KeywordOnly.FORCE if force_kw_only else KeywordOnly.YES + else: + kwo = KeywordOnly.NO + + props = ClassProps( + is_exception=is_exc, + is_frozen=is_frozen, + is_slotted=slots, + collected_fields_by_mro=collect_by_mro, + added_init=_determine_whether_to_implement( + cls, init, auto_detect, ("__init__",) + ), + added_repr=_determine_whether_to_implement( + cls, repr, auto_detect, ("__repr__",) + ), + added_eq=eq, + added_ordering=not is_exc + and _determine_whether_to_implement( + cls, + order_, + auto_detect, + ("__lt__", "__le__", "__gt__", "__ge__"), + ), + hashability=hashability, + added_match_args=match_args, + kw_only=kwo, + has_weakref_slot=weakref_slot, + added_str=str, + added_pickling=_determine_whether_to_implement( + cls, + getstate_setstate, + auto_detect, + ("__getstate__", "__setstate__"), + default=slots, + ), + on_setattr_hook=on_setattr, + field_transformer=field_transformer, + ) + + if not props.is_hashable and cache_hash: + msg = "Invalid value for cache_hash. To use hash caching, hashing must be either explicitly or implicitly enabled." + raise TypeError(msg) + + builder = _ClassBuilder( + cls, + these, + auto_attribs=auto_attribs, + props=props, + has_custom_setattr=has_own_setattr, + ) + + if props.added_repr: + builder.add_repr(repr_ns) + + if props.added_str: + builder.add_str() + + if props.added_eq: + builder.add_eq() + if props.added_ordering: + builder.add_order() + + if not frozen: + builder.add_setattr() + + if props.is_hashable: + builder.add_hash() + elif props.hashability is Hashability.UNHASHABLE: + builder.make_unhashable() + + if props.added_init: + builder.add_init() + else: + builder.add_attrs_init() + if cache_hash: + msg = "Invalid value for cache_hash. To use hash caching, init must be True." + raise TypeError(msg) + + if PY_3_13_PLUS and not _has_own_attribute(cls, "__replace__"): + builder.add_replace() + + if ( + PY_3_10_PLUS + and match_args + and not _has_own_attribute(cls, "__match_args__") + ): + builder.add_match_args() + + return builder.build_class() + + # maybe_cls's type depends on the usage of the decorator. It's a class + # if it's used as `@attrs` but `None` if used as `@attrs()`. + if maybe_cls is None: + return wrap + + return wrap(maybe_cls) + + +_attrs = attrs +""" +Internal alias so we can use it in functions that take an argument called +*attrs*. +""" + + +def _has_frozen_base_class(cls): + """ + Check whether *cls* has a frozen ancestor by looking at its + __setattr__. + """ + return cls.__setattr__ is _frozen_setattrs + + +def _generate_unique_filename(cls: type, func_name: str) -> str: + """ + Create a "filename" suitable for a function being generated. + """ + return ( + f"" + ) + + +def _make_hash_script( + cls: type, attrs: list[Attribute], frozen: bool, cache_hash: bool +) -> tuple[str, dict]: + attrs = tuple( + a for a in attrs if a.hash is True or (a.hash is None and a.eq is True) + ) + + tab = " " + + type_hash = hash(_generate_unique_filename(cls, "hash")) + # If eq is custom generated, we need to include the functions in globs + globs = {} + + hash_def = "def __hash__(self" + hash_func = "hash((" + closing_braces = "))" + if not cache_hash: + hash_def += "):" + else: + hash_def += ", *" + + hash_def += ", _cache_wrapper=__import__('attr._make')._make._CacheHashWrapper):" + hash_func = "_cache_wrapper(" + hash_func + closing_braces += ")" + + method_lines = [hash_def] + + def append_hash_computation_lines(prefix, indent): + """ + Generate the code for actually computing the hash code. + Below this will either be returned directly or used to compute + a value which is then cached, depending on the value of cache_hash + """ + + method_lines.extend( + [ + indent + prefix + hash_func, + indent + f" {type_hash},", + ] + ) + + for a in attrs: + if a.eq_key: + cmp_name = f"_{a.name}_key" + globs[cmp_name] = a.eq_key + method_lines.append( + indent + f" {cmp_name}(self.{a.name})," + ) + else: + method_lines.append(indent + f" self.{a.name},") + + method_lines.append(indent + " " + closing_braces) + + if cache_hash: + method_lines.append(tab + f"if self.{_HASH_CACHE_FIELD} is None:") + if frozen: + append_hash_computation_lines( + f"object.__setattr__(self, '{_HASH_CACHE_FIELD}', ", tab * 2 + ) + method_lines.append(tab * 2 + ")") # close __setattr__ + else: + append_hash_computation_lines( + f"self.{_HASH_CACHE_FIELD} = ", tab * 2 + ) + method_lines.append(tab + f"return self.{_HASH_CACHE_FIELD}") + else: + append_hash_computation_lines("return ", tab) + + script = "\n".join(method_lines) + return script, globs + + +def _add_hash(cls: type, attrs: list[Attribute]): + """ + Add a hash method to *cls*. + """ + script, globs = _make_hash_script( + cls, attrs, frozen=False, cache_hash=False + ) + _compile_and_eval( + script, globs, filename=_generate_unique_filename(cls, "__hash__") + ) + cls.__hash__ = globs["__hash__"] + return cls + + +def __ne__(self, other): + """ + Check equality and either forward a NotImplemented or + return the result negated. + """ + result = self.__eq__(other) + if result is NotImplemented: + return NotImplemented + + return not result + + +def _make_eq_script(attrs: list) -> tuple[str, dict]: + """ + Create __eq__ method for *cls* with *attrs*. + """ + attrs = [a for a in attrs if a.eq] + + lines = [ + "def __eq__(self, other):", + " if other.__class__ is not self.__class__:", + " return NotImplemented", + ] + + globs = {} + if attrs: + lines.append(" return (") + for a in attrs: + if a.eq_key: + cmp_name = f"_{a.name}_key" + # Add the key function to the global namespace + # of the evaluated function. + globs[cmp_name] = a.eq_key + lines.append( + f" {cmp_name}(self.{a.name}) == {cmp_name}(other.{a.name})" + ) + else: + lines.append(f" self.{a.name} == other.{a.name}") + if a is not attrs[-1]: + lines[-1] = f"{lines[-1]} and" + lines.append(" )") + else: + lines.append(" return True") + + script = "\n".join(lines) + + return script, globs + + +def _make_order(cls, attrs): + """ + Create ordering methods for *cls* with *attrs*. + """ + attrs = [a for a in attrs if a.order] + + def attrs_to_tuple(obj): + """ + Save us some typing. + """ + return tuple( + key(value) if key else value + for value, key in ( + (getattr(obj, a.name), a.order_key) for a in attrs + ) + ) + + def __lt__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) < attrs_to_tuple(other) + + return NotImplemented + + def __le__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) <= attrs_to_tuple(other) + + return NotImplemented + + def __gt__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) > attrs_to_tuple(other) + + return NotImplemented + + def __ge__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) >= attrs_to_tuple(other) + + return NotImplemented + + return __lt__, __le__, __gt__, __ge__ + + +def _add_eq(cls, attrs=None): + """ + Add equality methods to *cls* with *attrs*. + """ + if attrs is None: + attrs = cls.__attrs_attrs__ + + script, globs = _make_eq_script(attrs) + _compile_and_eval( + script, globs, filename=_generate_unique_filename(cls, "__eq__") + ) + cls.__eq__ = globs["__eq__"] + cls.__ne__ = __ne__ + + return cls + + +def _make_repr_script(attrs, ns) -> tuple[str, dict]: + """ + Create the source and globs for a __repr__ and return it. + """ + # Figure out which attributes to include, and which function to use to + # format them. The a.repr value can be either bool or a custom + # callable. + attr_names_with_reprs = tuple( + (a.name, (repr if a.repr is True else a.repr), a.init) + for a in attrs + if a.repr is not False + ) + globs = { + name + "_repr": r for name, r, _ in attr_names_with_reprs if r != repr + } + globs["_compat"] = _compat + globs["AttributeError"] = AttributeError + globs["NOTHING"] = NOTHING + attribute_fragments = [] + for name, r, i in attr_names_with_reprs: + accessor = ( + "self." + name if i else 'getattr(self, "' + name + '", NOTHING)' + ) + fragment = ( + "%s={%s!r}" % (name, accessor) + if r == repr + else "%s={%s_repr(%s)}" % (name, name, accessor) + ) + attribute_fragments.append(fragment) + repr_fragment = ", ".join(attribute_fragments) + + if ns is None: + cls_name_fragment = '{self.__class__.__qualname__.rsplit(">.", 1)[-1]}' + else: + cls_name_fragment = ns + ".{self.__class__.__name__}" + + lines = [ + "def __repr__(self):", + " try:", + " already_repring = _compat.repr_context.already_repring", + " except AttributeError:", + " already_repring = {id(self),}", + " _compat.repr_context.already_repring = already_repring", + " else:", + " if id(self) in already_repring:", + " return '...'", + " else:", + " already_repring.add(id(self))", + " try:", + f" return f'{cls_name_fragment}({repr_fragment})'", + " finally:", + " already_repring.remove(id(self))", + ] + + return "\n".join(lines), globs + + +def _add_repr(cls, ns=None, attrs=None): + """ + Add a repr method to *cls*. + """ + if attrs is None: + attrs = cls.__attrs_attrs__ + + script, globs = _make_repr_script(attrs, ns) + _compile_and_eval( + script, globs, filename=_generate_unique_filename(cls, "__repr__") + ) + cls.__repr__ = globs["__repr__"] + return cls + + +def fields(cls): + """ + Return the tuple of *attrs* attributes for a class. + + The tuple also allows accessing the fields by their names (see below for + examples). + + Args: + cls (type): Class to introspect. + + Raises: + TypeError: If *cls* is not a class. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + Returns: + tuple (with name accessors) of `attrs.Attribute` + + .. versionchanged:: 16.2.0 Returned tuple allows accessing the fields + by name. + .. versionchanged:: 23.1.0 Add support for generic classes. + """ + generic_base = get_generic_base(cls) + + if generic_base is None and not isinstance(cls, type): + msg = "Passed object must be a class." + raise TypeError(msg) + + attrs = getattr(cls, "__attrs_attrs__", None) + + if attrs is None: + if generic_base is not None: + attrs = getattr(generic_base, "__attrs_attrs__", None) + if attrs is not None: + # Even though this is global state, stick it on here to speed + # it up. We rely on `cls` being cached for this to be + # efficient. + cls.__attrs_attrs__ = attrs + return attrs + msg = f"{cls!r} is not an attrs-decorated class." + raise NotAnAttrsClassError(msg) + + return attrs + + +def fields_dict(cls): + """ + Return an ordered dictionary of *attrs* attributes for a class, whose keys + are the attribute names. + + Args: + cls (type): Class to introspect. + + Raises: + TypeError: If *cls* is not a class. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + Returns: + dict[str, attrs.Attribute]: Dict of attribute name to definition + + .. versionadded:: 18.1.0 + """ + if not isinstance(cls, type): + msg = "Passed object must be a class." + raise TypeError(msg) + attrs = getattr(cls, "__attrs_attrs__", None) + if attrs is None: + msg = f"{cls!r} is not an attrs-decorated class." + raise NotAnAttrsClassError(msg) + return {a.name: a for a in attrs} + + +def validate(inst): + """ + Validate all attributes on *inst* that have a validator. + + Leaves all exceptions through. + + Args: + inst: Instance of a class with *attrs* attributes. + """ + if _config._run_validators is False: + return + + for a in fields(inst.__class__): + v = a.validator + if v is not None: + v(inst, a, getattr(inst, a.name)) + + +def _is_slot_attr(a_name, base_attr_map): + """ + Check if the attribute name comes from a slot class. + """ + cls = base_attr_map.get(a_name) + return cls and "__slots__" in cls.__dict__ + + +def _make_init_script( + cls, + attrs, + pre_init, + pre_init_has_args, + post_init, + frozen, + slots, + cache_hash, + base_attr_map, + is_exc, + cls_on_setattr, + attrs_init, +) -> tuple[str, dict, dict]: + has_cls_on_setattr = ( + cls_on_setattr is not None and cls_on_setattr is not setters.NO_OP + ) + + if frozen and has_cls_on_setattr: + msg = "Frozen classes can't use on_setattr." + raise ValueError(msg) + + needs_cached_setattr = cache_hash or frozen + filtered_attrs = [] + attr_dict = {} + for a in attrs: + if not a.init and a.default is NOTHING: + continue + + filtered_attrs.append(a) + attr_dict[a.name] = a + + if a.on_setattr is not None: + if frozen is True: + msg = "Frozen classes can't use on_setattr." + raise ValueError(msg) + + needs_cached_setattr = True + elif has_cls_on_setattr and a.on_setattr is not setters.NO_OP: + needs_cached_setattr = True + + script, globs, annotations = _attrs_to_init_script( + filtered_attrs, + frozen, + slots, + pre_init, + pre_init_has_args, + post_init, + cache_hash, + base_attr_map, + is_exc, + needs_cached_setattr, + has_cls_on_setattr, + "__attrs_init__" if attrs_init else "__init__", + ) + if cls.__module__ in sys.modules: + # This makes typing.get_type_hints(CLS.__init__) resolve string types. + globs.update(sys.modules[cls.__module__].__dict__) + + globs.update({"NOTHING": NOTHING, "attr_dict": attr_dict}) + + if needs_cached_setattr: + # Save the lookup overhead in __init__ if we need to circumvent + # setattr hooks. + globs["_cached_setattr_get"] = _OBJ_SETATTR.__get__ + + return script, globs, annotations + + +def _setattr(attr_name: str, value_var: str, has_on_setattr: bool) -> str: + """ + Use the cached object.setattr to set *attr_name* to *value_var*. + """ + return f"_setattr('{attr_name}', {value_var})" + + +def _setattr_with_converter( + attr_name: str, value_var: str, has_on_setattr: bool, converter: Converter +) -> str: + """ + Use the cached object.setattr to set *attr_name* to *value_var*, but run + its converter first. + """ + return f"_setattr('{attr_name}', {converter._fmt_converter_call(attr_name, value_var)})" + + +def _assign(attr_name: str, value: str, has_on_setattr: bool) -> str: + """ + Unless *attr_name* has an on_setattr hook, use normal assignment. Otherwise + relegate to _setattr. + """ + if has_on_setattr: + return _setattr(attr_name, value, True) + + return f"self.{attr_name} = {value}" + + +def _assign_with_converter( + attr_name: str, value_var: str, has_on_setattr: bool, converter: Converter +) -> str: + """ + Unless *attr_name* has an on_setattr hook, use normal assignment after + conversion. Otherwise relegate to _setattr_with_converter. + """ + if has_on_setattr: + return _setattr_with_converter(attr_name, value_var, True, converter) + + return f"self.{attr_name} = {converter._fmt_converter_call(attr_name, value_var)}" + + +def _determine_setters( + frozen: bool, slots: bool, base_attr_map: dict[str, type] +): + """ + Determine the correct setter functions based on whether a class is frozen + and/or slotted. + """ + if frozen is True: + if slots is True: + return (), _setattr, _setattr_with_converter + + # Dict frozen classes assign directly to __dict__. + # But only if the attribute doesn't come from an ancestor slot + # class. + # Note _inst_dict will be used again below if cache_hash is True + + def fmt_setter( + attr_name: str, value_var: str, has_on_setattr: bool + ) -> str: + if _is_slot_attr(attr_name, base_attr_map): + return _setattr(attr_name, value_var, has_on_setattr) + + return f"_inst_dict['{attr_name}'] = {value_var}" + + def fmt_setter_with_converter( + attr_name: str, + value_var: str, + has_on_setattr: bool, + converter: Converter, + ) -> str: + if has_on_setattr or _is_slot_attr(attr_name, base_attr_map): + return _setattr_with_converter( + attr_name, value_var, has_on_setattr, converter + ) + + return f"_inst_dict['{attr_name}'] = {converter._fmt_converter_call(attr_name, value_var)}" + + return ( + ("_inst_dict = self.__dict__",), + fmt_setter, + fmt_setter_with_converter, + ) + + # Not frozen -- we can just assign directly. + return (), _assign, _assign_with_converter + + +def _attrs_to_init_script( + attrs: list[Attribute], + is_frozen: bool, + is_slotted: bool, + call_pre_init: bool, + pre_init_has_args: bool, + call_post_init: bool, + does_cache_hash: bool, + base_attr_map: dict[str, type], + is_exc: bool, + needs_cached_setattr: bool, + has_cls_on_setattr: bool, + method_name: str, +) -> tuple[str, dict, dict]: + """ + Return a script of an initializer for *attrs*, a dict of globals, and + annotations for the initializer. + + The globals are required by the generated script. + """ + lines = ["self.__attrs_pre_init__()"] if call_pre_init else [] + + if needs_cached_setattr: + lines.append( + # Circumvent the __setattr__ descriptor to save one lookup per + # assignment. Note _setattr will be used again below if + # does_cache_hash is True. + "_setattr = _cached_setattr_get(self)" + ) + + extra_lines, fmt_setter, fmt_setter_with_converter = _determine_setters( + is_frozen, is_slotted, base_attr_map + ) + lines.extend(extra_lines) + + args = [] # Parameters in the definition of __init__ + pre_init_args = [] # Parameters in the call to __attrs_pre_init__ + kw_only_args = [] # Used for both 'args' and 'pre_init_args' above + attrs_to_validate = [] + + # This is a dictionary of names to validator and converter callables. + # Injecting this into __init__ globals lets us avoid lookups. + names_for_globals = {} + annotations = {"return": None} + + for a in attrs: + if a.validator: + attrs_to_validate.append(a) + + attr_name = a.name + has_on_setattr = a.on_setattr is not None or ( + a.on_setattr is not setters.NO_OP and has_cls_on_setattr + ) + # a.alias is set to maybe-mangled attr_name in _ClassBuilder if not + # explicitly provided + arg_name = a.alias + + has_factory = isinstance(a.default, Factory) + maybe_self = "self" if has_factory and a.default.takes_self else "" + + if a.converter is not None and not isinstance(a.converter, Converter): + converter = Converter(a.converter) + else: + converter = a.converter + + if a.init is False: + if has_factory: + init_factory_name = _INIT_FACTORY_PAT % (a.name,) + if converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, + init_factory_name + f"({maybe_self})", + has_on_setattr, + converter, + ) + ) + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) + else: + lines.append( + fmt_setter( + attr_name, + init_factory_name + f"({maybe_self})", + has_on_setattr, + ) + ) + names_for_globals[init_factory_name] = a.default.factory + elif converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, + f"attr_dict['{attr_name}'].default", + has_on_setattr, + converter, + ) + ) + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) + else: + lines.append( + fmt_setter( + attr_name, + f"attr_dict['{attr_name}'].default", + has_on_setattr, + ) + ) + elif a.default is not NOTHING and not has_factory: + arg = f"{arg_name}=attr_dict['{attr_name}'].default" + if a.kw_only: + kw_only_args.append(arg) + else: + args.append(arg) + pre_init_args.append(arg_name) + + if converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, arg_name, has_on_setattr, converter + ) + ) + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) + else: + lines.append(fmt_setter(attr_name, arg_name, has_on_setattr)) + + elif has_factory: + arg = f"{arg_name}=NOTHING" + if a.kw_only: + kw_only_args.append(arg) + else: + args.append(arg) + pre_init_args.append(arg_name) + lines.append(f"if {arg_name} is not NOTHING:") + + init_factory_name = _INIT_FACTORY_PAT % (a.name,) + if converter is not None: + lines.append( + " " + + fmt_setter_with_converter( + attr_name, arg_name, has_on_setattr, converter + ) + ) + lines.append("else:") + lines.append( + " " + + fmt_setter_with_converter( + attr_name, + init_factory_name + "(" + maybe_self + ")", + has_on_setattr, + converter, + ) + ) + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) + else: + lines.append( + " " + fmt_setter(attr_name, arg_name, has_on_setattr) + ) + lines.append("else:") + lines.append( + " " + + fmt_setter( + attr_name, + init_factory_name + "(" + maybe_self + ")", + has_on_setattr, + ) + ) + names_for_globals[init_factory_name] = a.default.factory + else: + if a.kw_only: + kw_only_args.append(arg_name) + else: + args.append(arg_name) + pre_init_args.append(arg_name) + + if converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, arg_name, has_on_setattr, converter + ) + ) + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) + else: + lines.append(fmt_setter(attr_name, arg_name, has_on_setattr)) + + if a.init is True: + if a.type is not None and converter is None: + annotations[arg_name] = a.type + elif converter is not None and converter._first_param_type: + # Use the type from the converter if present. + annotations[arg_name] = converter._first_param_type + + if attrs_to_validate: # we can skip this if there are no validators. + names_for_globals["_config"] = _config + lines.append("if _config._run_validators is True:") + for a in attrs_to_validate: + val_name = "__attr_validator_" + a.name + attr_name = "__attr_" + a.name + lines.append(f" {val_name}(self, {attr_name}, self.{a.name})") + names_for_globals[val_name] = a.validator + names_for_globals[attr_name] = a + + if call_post_init: + lines.append("self.__attrs_post_init__()") + + # Because this is set only after __attrs_post_init__ is called, a crash + # will result if post-init tries to access the hash code. This seemed + # preferable to setting this beforehand, in which case alteration to field + # values during post-init combined with post-init accessing the hash code + # would result in silent bugs. + if does_cache_hash: + if is_frozen: + if is_slotted: + init_hash_cache = f"_setattr('{_HASH_CACHE_FIELD}', None)" + else: + init_hash_cache = f"_inst_dict['{_HASH_CACHE_FIELD}'] = None" + else: + init_hash_cache = f"self.{_HASH_CACHE_FIELD} = None" + lines.append(init_hash_cache) + + # For exceptions we rely on BaseException.__init__ for proper + # initialization. + if is_exc: + vals = ",".join(f"self.{a.name}" for a in attrs if a.init) + + lines.append(f"BaseException.__init__(self, {vals})") + + args = ", ".join(args) + pre_init_args = ", ".join(pre_init_args) + if kw_only_args: + # leading comma & kw_only args + args += f"{', ' if args else ''}*, {', '.join(kw_only_args)}" + pre_init_kw_only_args = ", ".join( + [ + f"{kw_arg_name}={kw_arg_name}" + # We need to remove the defaults from the kw_only_args. + for kw_arg_name in (kwa.split("=")[0] for kwa in kw_only_args) + ] + ) + pre_init_args += ", " if pre_init_args else "" + pre_init_args += pre_init_kw_only_args + + if call_pre_init and pre_init_has_args: + # If pre init method has arguments, pass the values given to __init__. + lines[0] = f"self.__attrs_pre_init__({pre_init_args})" + + # Python <3.12 doesn't allow backslashes in f-strings. + NL = "\n " + return ( + f"""def {method_name}(self, {args}): + {NL.join(lines) if lines else "pass"} +""", + names_for_globals, + annotations, + ) + + +def _default_init_alias_for(name: str) -> str: + """ + The default __init__ parameter name for a field. + + This performs private-name adjustment via leading-unscore stripping, + and is the default value of Attribute.alias if not provided. + """ + + return name.lstrip("_") + + +class Attribute: + """ + *Read-only* representation of an attribute. + + .. warning:: + + You should never instantiate this class yourself. + + The class has *all* arguments of `attr.ib` (except for ``factory`` which is + only syntactic sugar for ``default=Factory(...)`` plus the following: + + - ``name`` (`str`): The name of the attribute. + - ``alias`` (`str`): The __init__ parameter name of the attribute, after + any explicit overrides and default private-attribute-name handling. + - ``inherited`` (`bool`): Whether or not that attribute has been inherited + from a base class. + - ``eq_key`` and ``order_key`` (`typing.Callable` or `None`): The + callables that are used for comparing and ordering objects by this + attribute, respectively. These are set by passing a callable to + `attr.ib`'s ``eq``, ``order``, or ``cmp`` arguments. See also + :ref:`comparison customization `. + + Instances of this class are frequently used for introspection purposes + like: + + - `fields` returns a tuple of them. + - Validators get them passed as the first argument. + - The :ref:`field transformer ` hook receives a list of + them. + - The ``alias`` property exposes the __init__ parameter name of the field, + with any overrides and default private-attribute handling applied. + + + .. versionadded:: 20.1.0 *inherited* + .. versionadded:: 20.1.0 *on_setattr* + .. versionchanged:: 20.2.0 *inherited* is not taken into account for + equality checks and hashing anymore. + .. versionadded:: 21.1.0 *eq_key* and *order_key* + .. versionadded:: 22.2.0 *alias* + + For the full version history of the fields, see `attr.ib`. + """ + + # These slots must NOT be reordered because we use them later for + # instantiation. + __slots__ = ( # noqa: RUF023 + "name", + "default", + "validator", + "repr", + "eq", + "eq_key", + "order", + "order_key", + "hash", + "init", + "metadata", + "type", + "converter", + "kw_only", + "inherited", + "on_setattr", + "alias", + ) + + def __init__( + self, + name, + default, + validator, + repr, + cmp, # XXX: unused, remove along with other cmp code. + hash, + init, + inherited, + metadata=None, + type=None, + converter=None, + kw_only=False, + eq=None, + eq_key=None, + order=None, + order_key=None, + on_setattr=None, + alias=None, + ): + eq, eq_key, order, order_key = _determine_attrib_eq_order( + cmp, eq_key or eq, order_key or order, True + ) + + # Cache this descriptor here to speed things up later. + bound_setattr = _OBJ_SETATTR.__get__(self) + + # Despite the big red warning, people *do* instantiate `Attribute` + # themselves. + bound_setattr("name", name) + bound_setattr("default", default) + bound_setattr("validator", validator) + bound_setattr("repr", repr) + bound_setattr("eq", eq) + bound_setattr("eq_key", eq_key) + bound_setattr("order", order) + bound_setattr("order_key", order_key) + bound_setattr("hash", hash) + bound_setattr("init", init) + bound_setattr("converter", converter) + bound_setattr( + "metadata", + ( + types.MappingProxyType(dict(metadata)) # Shallow copy + if metadata + else _EMPTY_METADATA_SINGLETON + ), + ) + bound_setattr("type", type) + bound_setattr("kw_only", kw_only) + bound_setattr("inherited", inherited) + bound_setattr("on_setattr", on_setattr) + bound_setattr("alias", alias) + + def __setattr__(self, name, value): + raise FrozenInstanceError + + @classmethod + def from_counting_attr( + cls, name: str, ca: _CountingAttr, kw_only: bool, type=None + ): + # The 'kw_only' argument is the class-level setting, and is used if the + # attribute itself does not explicitly set 'kw_only'. + # type holds the annotated value. deal with conflicts: + if type is None: + type = ca.type + elif ca.type is not None: + msg = f"Type annotation and type argument cannot both be present for '{name}'." + raise ValueError(msg) + return cls( + name, + ca._default, + ca._validator, + ca.repr, + None, + ca.hash, + ca.init, + False, + ca.metadata, + type, + ca.converter, + kw_only if ca.kw_only is None else ca.kw_only, + ca.eq, + ca.eq_key, + ca.order, + ca.order_key, + ca.on_setattr, + ca.alias, + ) + + # Don't use attrs.evolve since fields(Attribute) doesn't work + def evolve(self, **changes): + """ + Copy *self* and apply *changes*. + + This works similarly to `attrs.evolve` but that function does not work + with :class:`attrs.Attribute`. + + It is mainly meant to be used for `transform-fields`. + + .. versionadded:: 20.3.0 + """ + new = copy.copy(self) + + new._setattrs(changes.items()) + + return new + + # Don't use _add_pickle since fields(Attribute) doesn't work + def __getstate__(self): + """ + Play nice with pickle. + """ + return tuple( + getattr(self, name) if name != "metadata" else dict(self.metadata) + for name in self.__slots__ + ) + + def __setstate__(self, state): + """ + Play nice with pickle. + """ + self._setattrs(zip(self.__slots__, state)) + + def _setattrs(self, name_values_pairs): + bound_setattr = _OBJ_SETATTR.__get__(self) + for name, value in name_values_pairs: + if name != "metadata": + bound_setattr(name, value) + else: + bound_setattr( + name, + ( + types.MappingProxyType(dict(value)) + if value + else _EMPTY_METADATA_SINGLETON + ), + ) + + +_a = [ + Attribute( + name=name, + default=NOTHING, + validator=None, + repr=True, + cmp=None, + eq=True, + order=False, + hash=(name != "metadata"), + init=True, + inherited=False, + alias=_default_init_alias_for(name), + ) + for name in Attribute.__slots__ +] + +Attribute = _add_hash( + _add_eq( + _add_repr(Attribute, attrs=_a), + attrs=[a for a in _a if a.name != "inherited"], + ), + attrs=[a for a in _a if a.hash and a.name != "inherited"], +) + + +class _CountingAttr: + """ + Intermediate representation of attributes that uses a counter to preserve + the order in which the attributes have been defined. + + *Internal* data structure of the attrs library. Running into is most + likely the result of a bug like a forgotten `@attr.s` decorator. + """ + + __slots__ = ( + "_default", + "_validator", + "alias", + "converter", + "counter", + "eq", + "eq_key", + "hash", + "init", + "kw_only", + "metadata", + "on_setattr", + "order", + "order_key", + "repr", + "type", + ) + __attrs_attrs__ = ( + *tuple( + Attribute( + name=name, + alias=_default_init_alias_for(name), + default=NOTHING, + validator=None, + repr=True, + cmp=None, + hash=True, + init=True, + kw_only=False, + eq=True, + eq_key=None, + order=False, + order_key=None, + inherited=False, + on_setattr=None, + ) + for name in ( + "counter", + "_default", + "repr", + "eq", + "order", + "hash", + "init", + "on_setattr", + "alias", + ) + ), + Attribute( + name="metadata", + alias="metadata", + default=None, + validator=None, + repr=True, + cmp=None, + hash=False, + init=True, + kw_only=False, + eq=True, + eq_key=None, + order=False, + order_key=None, + inherited=False, + on_setattr=None, + ), + ) + cls_counter = 0 + + def __init__( + self, + default, + validator, + repr, + cmp, + hash, + init, + converter, + metadata, + type, + kw_only, + eq, + eq_key, + order, + order_key, + on_setattr, + alias, + ): + _CountingAttr.cls_counter += 1 + self.counter = _CountingAttr.cls_counter + self._default = default + self._validator = validator + self.converter = converter + self.repr = repr + self.eq = eq + self.eq_key = eq_key + self.order = order + self.order_key = order_key + self.hash = hash + self.init = init + self.metadata = metadata + self.type = type + self.kw_only = kw_only + self.on_setattr = on_setattr + self.alias = alias + + def validator(self, meth): + """ + Decorator that adds *meth* to the list of validators. + + Returns *meth* unchanged. + + .. versionadded:: 17.1.0 + """ + if self._validator is None: + self._validator = meth + else: + self._validator = and_(self._validator, meth) + return meth + + def default(self, meth): + """ + Decorator that allows to set the default for an attribute. + + Returns *meth* unchanged. + + Raises: + DefaultAlreadySetError: If default has been set before. + + .. versionadded:: 17.1.0 + """ + if self._default is not NOTHING: + raise DefaultAlreadySetError + + self._default = Factory(meth, takes_self=True) + + return meth + + +_CountingAttr = _add_eq(_add_repr(_CountingAttr)) + + +class ClassProps: + """ + Effective class properties as derived from parameters to `attr.s()` or + `define()` decorators. + + This is the same data structure that *attrs* uses internally to decide how + to construct the final class. + + Warning: + + This feature is currently **experimental** and is not covered by our + strict backwards-compatibility guarantees. + + + Attributes: + is_exception (bool): + Whether the class is treated as an exception class. + + is_slotted (bool): + Whether the class is `slotted `. + + has_weakref_slot (bool): + Whether the class has a slot for weak references. + + is_frozen (bool): + Whether the class is frozen. + + kw_only (KeywordOnly): + Whether / how the class enforces keyword-only arguments on the + ``__init__`` method. + + collected_fields_by_mro (bool): + Whether the class fields were collected by method resolution order. + That is, correctly but unlike `dataclasses`. + + added_init (bool): + Whether the class has an *attrs*-generated ``__init__`` method. + + added_repr (bool): + Whether the class has an *attrs*-generated ``__repr__`` method. + + added_eq (bool): + Whether the class has *attrs*-generated equality methods. + + added_ordering (bool): + Whether the class has *attrs*-generated ordering methods. + + hashability (Hashability): How `hashable ` the class is. + + added_match_args (bool): + Whether the class supports positional `match ` over its + fields. + + added_str (bool): + Whether the class has an *attrs*-generated ``__str__`` method. + + added_pickling (bool): + Whether the class has *attrs*-generated ``__getstate__`` and + ``__setstate__`` methods for `pickle`. + + on_setattr_hook (Callable[[Any, Attribute[Any], Any], Any] | None): + The class's ``__setattr__`` hook. + + field_transformer (Callable[[Attribute[Any]], Attribute[Any]] | None): + The class's `field transformers `. + + .. versionadded:: 25.4.0 + """ + + class Hashability(enum.Enum): + """ + The hashability of a class. + + .. versionadded:: 25.4.0 + """ + + HASHABLE = "hashable" + """Write a ``__hash__``.""" + HASHABLE_CACHED = "hashable_cache" + """Write a ``__hash__`` and cache the hash.""" + UNHASHABLE = "unhashable" + """Set ``__hash__`` to ``None``.""" + LEAVE_ALONE = "leave_alone" + """Don't touch ``__hash__``.""" + + class KeywordOnly(enum.Enum): + """ + How attributes should be treated regarding keyword-only parameters. + + .. versionadded:: 25.4.0 + """ + + NO = "no" + """Attributes are not keyword-only.""" + YES = "yes" + """Attributes in current class without kw_only=False are keyword-only.""" + FORCE = "force" + """All attributes are keyword-only.""" + + __slots__ = ( # noqa: RUF023 -- order matters for __init__ + "is_exception", + "is_slotted", + "has_weakref_slot", + "is_frozen", + "kw_only", + "collected_fields_by_mro", + "added_init", + "added_repr", + "added_eq", + "added_ordering", + "hashability", + "added_match_args", + "added_str", + "added_pickling", + "on_setattr_hook", + "field_transformer", + ) + + def __init__( + self, + is_exception, + is_slotted, + has_weakref_slot, + is_frozen, + kw_only, + collected_fields_by_mro, + added_init, + added_repr, + added_eq, + added_ordering, + hashability, + added_match_args, + added_str, + added_pickling, + on_setattr_hook, + field_transformer, + ): + self.is_exception = is_exception + self.is_slotted = is_slotted + self.has_weakref_slot = has_weakref_slot + self.is_frozen = is_frozen + self.kw_only = kw_only + self.collected_fields_by_mro = collected_fields_by_mro + self.added_init = added_init + self.added_repr = added_repr + self.added_eq = added_eq + self.added_ordering = added_ordering + self.hashability = hashability + self.added_match_args = added_match_args + self.added_str = added_str + self.added_pickling = added_pickling + self.on_setattr_hook = on_setattr_hook + self.field_transformer = field_transformer + + @property + def is_hashable(self): + return ( + self.hashability is ClassProps.Hashability.HASHABLE + or self.hashability is ClassProps.Hashability.HASHABLE_CACHED + ) + + +_cas = [ + Attribute( + name=name, + default=NOTHING, + validator=None, + repr=True, + cmp=None, + eq=True, + order=False, + hash=True, + init=True, + inherited=False, + alias=_default_init_alias_for(name), + ) + for name in ClassProps.__slots__ +] + +ClassProps = _add_eq(_add_repr(ClassProps, attrs=_cas), attrs=_cas) + + +class Factory: + """ + Stores a factory callable. + + If passed as the default value to `attrs.field`, the factory is used to + generate a new value. + + Args: + factory (typing.Callable): + A callable that takes either none or exactly one mandatory + positional argument depending on *takes_self*. + + takes_self (bool): + Pass the partially initialized instance that is being initialized + as a positional argument. + + .. versionadded:: 17.1.0 *takes_self* + """ + + __slots__ = ("factory", "takes_self") + + def __init__(self, factory, takes_self=False): + self.factory = factory + self.takes_self = takes_self + + def __getstate__(self): + """ + Play nice with pickle. + """ + return tuple(getattr(self, name) for name in self.__slots__) + + def __setstate__(self, state): + """ + Play nice with pickle. + """ + for name, value in zip(self.__slots__, state): + setattr(self, name, value) + + +_f = [ + Attribute( + name=name, + default=NOTHING, + validator=None, + repr=True, + cmp=None, + eq=True, + order=False, + hash=True, + init=True, + inherited=False, + ) + for name in Factory.__slots__ +] + +Factory = _add_hash(_add_eq(_add_repr(Factory, attrs=_f), attrs=_f), attrs=_f) + + +class Converter: + """ + Stores a converter callable. + + Allows for the wrapped converter to take additional arguments. The + arguments are passed in the order they are documented. + + Args: + converter (Callable): A callable that converts the passed value. + + takes_self (bool): + Pass the partially initialized instance that is being initialized + as a positional argument. (default: `False`) + + takes_field (bool): + Pass the field definition (an :class:`Attribute`) into the + converter as a positional argument. (default: `False`) + + .. versionadded:: 24.1.0 + """ + + __slots__ = ( + "__call__", + "_first_param_type", + "_global_name", + "converter", + "takes_field", + "takes_self", + ) + + def __init__(self, converter, *, takes_self=False, takes_field=False): + self.converter = converter + self.takes_self = takes_self + self.takes_field = takes_field + + ex = _AnnotationExtractor(converter) + self._first_param_type = ex.get_first_param_type() + + if not (self.takes_self or self.takes_field): + self.__call__ = lambda value, _, __: self.converter(value) + elif self.takes_self and not self.takes_field: + self.__call__ = lambda value, instance, __: self.converter( + value, instance + ) + elif not self.takes_self and self.takes_field: + self.__call__ = lambda value, __, field: self.converter( + value, field + ) + else: + self.__call__ = lambda value, instance, field: self.converter( + value, instance, field + ) + + rt = ex.get_return_type() + if rt is not None: + self.__call__.__annotations__["return"] = rt + + @staticmethod + def _get_global_name(attr_name: str) -> str: + """ + Return the name that a converter for an attribute name *attr_name* + would have. + """ + return f"__attr_converter_{attr_name}" + + def _fmt_converter_call(self, attr_name: str, value_var: str) -> str: + """ + Return a string that calls the converter for an attribute name + *attr_name* and the value in variable named *value_var* according to + `self.takes_self` and `self.takes_field`. + """ + if not (self.takes_self or self.takes_field): + return f"{self._get_global_name(attr_name)}({value_var})" + + if self.takes_self and self.takes_field: + return f"{self._get_global_name(attr_name)}({value_var}, self, attr_dict['{attr_name}'])" + + if self.takes_self: + return f"{self._get_global_name(attr_name)}({value_var}, self)" + + return f"{self._get_global_name(attr_name)}({value_var}, attr_dict['{attr_name}'])" + + def __getstate__(self): + """ + Return a dict containing only converter and takes_self -- the rest gets + computed when loading. + """ + return { + "converter": self.converter, + "takes_self": self.takes_self, + "takes_field": self.takes_field, + } + + def __setstate__(self, state): + """ + Load instance from state. + """ + self.__init__(**state) + + +_f = [ + Attribute( + name=name, + default=NOTHING, + validator=None, + repr=True, + cmp=None, + eq=True, + order=False, + hash=True, + init=True, + inherited=False, + ) + for name in ("converter", "takes_self", "takes_field") +] + +Converter = _add_hash( + _add_eq(_add_repr(Converter, attrs=_f), attrs=_f), attrs=_f +) + + +def make_class( + name, attrs, bases=(object,), class_body=None, **attributes_arguments +): + r""" + A quick way to create a new class called *name* with *attrs*. + + .. note:: + + ``make_class()`` is a thin wrapper around `attr.s`, not `attrs.define` + which means that it doesn't come with some of the improved defaults. + + For example, if you want the same ``on_setattr`` behavior as in + `attrs.define`, you have to pass the hooks yourself: ``make_class(..., + on_setattr=setters.pipe(setters.convert, setters.validate)`` + + .. warning:: + + It is *your* duty to ensure that the class name and the attribute names + are valid identifiers. ``make_class()`` will *not* validate them for + you. + + Args: + name (str): The name for the new class. + + attrs (list | dict): + A list of names or a dictionary of mappings of names to `attr.ib`\ + s / `attrs.field`\ s. + + The order is deduced from the order of the names or attributes + inside *attrs*. Otherwise the order of the definition of the + attributes is used. + + bases (tuple[type, ...]): Classes that the new class will subclass. + + class_body (dict): + An optional dictionary of class attributes for the new class. + + attributes_arguments: Passed unmodified to `attr.s`. + + Returns: + type: A new class with *attrs*. + + .. versionadded:: 17.1.0 *bases* + .. versionchanged:: 18.1.0 If *attrs* is ordered, the order is retained. + .. versionchanged:: 23.2.0 *class_body* + .. versionchanged:: 25.2.0 Class names can now be unicode. + """ + # Class identifiers are converted into the normal form NFKC while parsing + name = unicodedata.normalize("NFKC", name) + + if isinstance(attrs, dict): + cls_dict = attrs + elif isinstance(attrs, (list, tuple)): + cls_dict = {a: attrib() for a in attrs} + else: + msg = "attrs argument must be a dict or a list." + raise TypeError(msg) + + pre_init = cls_dict.pop("__attrs_pre_init__", None) + post_init = cls_dict.pop("__attrs_post_init__", None) + user_init = cls_dict.pop("__init__", None) + + body = {} + if class_body is not None: + body.update(class_body) + if pre_init is not None: + body["__attrs_pre_init__"] = pre_init + if post_init is not None: + body["__attrs_post_init__"] = post_init + if user_init is not None: + body["__init__"] = user_init + + type_ = types.new_class(name, bases, {}, lambda ns: ns.update(body)) + + # For pickling to work, the __module__ variable needs to be set to the + # frame where the class is created. Bypass this step in environments where + # sys._getframe is not defined (Jython for example) or sys._getframe is not + # defined for arguments greater than 0 (IronPython). + with contextlib.suppress(AttributeError, ValueError): + type_.__module__ = sys._getframe(1).f_globals.get( + "__name__", "__main__" + ) + + # We do it here for proper warnings with meaningful stacklevel. + cmp = attributes_arguments.pop("cmp", None) + ( + attributes_arguments["eq"], + attributes_arguments["order"], + ) = _determine_attrs_eq_order( + cmp, + attributes_arguments.get("eq"), + attributes_arguments.get("order"), + True, + ) + + cls = _attrs(these=cls_dict, **attributes_arguments)(type_) + # Only add type annotations now or "_attrs()" will complain: + cls.__annotations__ = { + k: v.type for k, v in cls_dict.items() if v.type is not None + } + return cls + + +# These are required by within this module so we define them here and merely +# import into .validators / .converters. + + +@attrs(slots=True, unsafe_hash=True) +class _AndValidator: + """ + Compose many validators to a single one. + """ + + _validators = attrib() + + def __call__(self, inst, attr, value): + for v in self._validators: + v(inst, attr, value) + + +def and_(*validators): + """ + A validator that composes multiple validators into one. + + When called on a value, it runs all wrapped validators. + + Args: + validators (~collections.abc.Iterable[typing.Callable]): + Arbitrary number of validators. + + .. versionadded:: 17.1.0 + """ + vals = [] + for validator in validators: + vals.extend( + validator._validators + if isinstance(validator, _AndValidator) + else [validator] + ) + + return _AndValidator(tuple(vals)) + + +def pipe(*converters): + """ + A converter that composes multiple converters into one. + + When called on a value, it runs all wrapped converters, returning the + *last* value. + + Type annotations will be inferred from the wrapped converters', if they + have any. + + converters (~collections.abc.Iterable[typing.Callable]): + Arbitrary number of converters. + + .. versionadded:: 20.1.0 + """ + + return_instance = any(isinstance(c, Converter) for c in converters) + + if return_instance: + + def pipe_converter(val, inst, field): + for c in converters: + val = ( + c(val, inst, field) if isinstance(c, Converter) else c(val) + ) + + return val + + else: + + def pipe_converter(val): + for c in converters: + val = c(val) + + return val + + if not converters: + # If the converter list is empty, pipe_converter is the identity. + A = TypeVar("A") + pipe_converter.__annotations__.update({"val": A, "return": A}) + else: + # Get parameter type from first converter. + t = _AnnotationExtractor(converters[0]).get_first_param_type() + if t: + pipe_converter.__annotations__["val"] = t + + last = converters[-1] + if not PY_3_11_PLUS and isinstance(last, Converter): + last = last.__call__ + + # Get return type from last converter. + rt = _AnnotationExtractor(last).get_return_type() + if rt: + pipe_converter.__annotations__["return"] = rt + + if return_instance: + return Converter(pipe_converter, takes_self=True, takes_field=True) + return pipe_converter diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_next_gen.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_next_gen.py new file mode 100644 index 0000000..4ccd0da --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_next_gen.py @@ -0,0 +1,674 @@ +# SPDX-License-Identifier: MIT + +""" +These are keyword-only APIs that call `attr.s` and `attr.ib` with different +default values. +""" + +from functools import partial + +from . import setters +from ._funcs import asdict as _asdict +from ._funcs import astuple as _astuple +from ._make import ( + _DEFAULT_ON_SETATTR, + NOTHING, + _frozen_setattrs, + attrib, + attrs, +) +from .exceptions import NotAnAttrsClassError, UnannotatedAttributeError + + +def define( + maybe_cls=None, + *, + these=None, + repr=None, + unsafe_hash=None, + hash=None, + init=None, + slots=True, + frozen=False, + weakref_slot=True, + str=False, + auto_attribs=None, + kw_only=False, + cache_hash=False, + auto_exc=True, + eq=None, + order=False, + auto_detect=True, + getstate_setstate=None, + on_setattr=None, + field_transformer=None, + match_args=True, + force_kw_only=False, +): + r""" + A class decorator that adds :term:`dunder methods` according to + :term:`fields ` specified using :doc:`type annotations `, + `field()` calls, or the *these* argument. + + Since *attrs* patches or replaces an existing class, you cannot use + `object.__init_subclass__` with *attrs* classes, because it runs too early. + As a replacement, you can define ``__attrs_init_subclass__`` on your class. + It will be called by *attrs* classes that subclass it after they're + created. See also :ref:`init-subclass`. + + Args: + slots (bool): + Create a :term:`slotted class ` that's more + memory-efficient. Slotted classes are generally superior to the + default dict classes, but have some gotchas you should know about, + so we encourage you to read the :term:`glossary entry `. + + auto_detect (bool): + Instead of setting the *init*, *repr*, *eq*, and *hash* arguments + explicitly, assume they are set to True **unless any** of the + involved methods for one of the arguments is implemented in the + *current* class (meaning, it is *not* inherited from some base + class). + + So, for example by implementing ``__eq__`` on a class yourself, + *attrs* will deduce ``eq=False`` and will create *neither* + ``__eq__`` *nor* ``__ne__`` (but Python classes come with a + sensible ``__ne__`` by default, so it *should* be enough to only + implement ``__eq__`` in most cases). + + Passing :data:`True` or :data:`False` to *init*, *repr*, *eq*, or *hash* + overrides whatever *auto_detect* would determine. + + auto_exc (bool): + If the class subclasses `BaseException` (which implicitly includes + any subclass of any exception), the following happens to behave + like a well-behaved Python exception class: + + - the values for *eq*, *order*, and *hash* are ignored and the + instances compare and hash by the instance's ids [#]_ , + - all attributes that are either passed into ``__init__`` or have a + default value are additionally available as a tuple in the + ``args`` attribute, + - the value of *str* is ignored leaving ``__str__`` to base + classes. + + .. [#] + Note that *attrs* will *not* remove existing implementations of + ``__hash__`` or the equality methods. It just won't add own + ones. + + on_setattr (~typing.Callable | list[~typing.Callable] | None | ~typing.Literal[attrs.setters.NO_OP]): + A callable that is run whenever the user attempts to set an + attribute (either by assignment like ``i.x = 42`` or by using + `setattr` like ``setattr(i, "x", 42)``). It receives the same + arguments as validators: the instance, the attribute that is being + modified, and the new value. + + If no exception is raised, the attribute is set to the return value + of the callable. + + If a list of callables is passed, they're automatically wrapped in + an `attrs.setters.pipe`. + + If left None, the default behavior is to run converters and + validators whenever an attribute is set. + + init (bool): + Create a ``__init__`` method that initializes the *attrs* + attributes. Leading underscores are stripped for the argument name, + unless an alias is set on the attribute. + + .. seealso:: + `init` shows advanced ways to customize the generated + ``__init__`` method, including executing code before and after. + + repr(bool): + Create a ``__repr__`` method with a human readable representation + of *attrs* attributes. + + str (bool): + Create a ``__str__`` method that is identical to ``__repr__``. This + is usually not necessary except for `Exception`\ s. + + eq (bool | None): + If True or None (default), add ``__eq__`` and ``__ne__`` methods + that check two instances for equality. + + .. seealso:: + `comparison` describes how to customize the comparison behavior + going as far comparing NumPy arrays. + + order (bool | None): + If True, add ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` + methods that behave like *eq* above and allow instances to be + ordered. + + They compare the instances as if they were tuples of their *attrs* + attributes if and only if the types of both classes are + *identical*. + + If `None` mirror value of *eq*. + + .. seealso:: `comparison` + + unsafe_hash (bool | None): + If None (default), the ``__hash__`` method is generated according + how *eq* and *frozen* are set. + + 1. If *both* are True, *attrs* will generate a ``__hash__`` for + you. + 2. If *eq* is True and *frozen* is False, ``__hash__`` will be set + to None, marking it unhashable (which it is). + 3. If *eq* is False, ``__hash__`` will be left untouched meaning + the ``__hash__`` method of the base class will be used. If the + base class is `object`, this means it will fall back to id-based + hashing. + + Although not recommended, you can decide for yourself and force + *attrs* to create one (for example, if the class is immutable even + though you didn't freeze it programmatically) by passing True or + not. Both of these cases are rather special and should be used + carefully. + + .. seealso:: + + - Our documentation on `hashing`, + - Python's documentation on `object.__hash__`, + - and the `GitHub issue that led to the default \ behavior + `_ for more + details. + + hash (bool | None): + Deprecated alias for *unsafe_hash*. *unsafe_hash* takes precedence. + + cache_hash (bool): + Ensure that the object's hash code is computed only once and stored + on the object. If this is set to True, hashing must be either + explicitly or implicitly enabled for this class. If the hash code + is cached, avoid any reassignments of fields involved in hash code + computation or mutations of the objects those fields point to after + object creation. If such changes occur, the behavior of the + object's hash code is undefined. + + frozen (bool): + Make instances immutable after initialization. If someone attempts + to modify a frozen instance, `attrs.exceptions.FrozenInstanceError` + is raised. + + .. note:: + + 1. This is achieved by installing a custom ``__setattr__`` + method on your class, so you can't implement your own. + + 2. True immutability is impossible in Python. + + 3. This *does* have a minor a runtime performance `impact + ` when initializing new instances. In other + words: ``__init__`` is slightly slower with ``frozen=True``. + + 4. If a class is frozen, you cannot modify ``self`` in + ``__attrs_post_init__`` or a self-written ``__init__``. You + can circumvent that limitation by using + ``object.__setattr__(self, "attribute_name", value)``. + + 5. Subclasses of a frozen class are frozen too. + + kw_only (bool): + Make attributes keyword-only in the generated ``__init__`` (if + *init* is False, this parameter is ignored). Attributes that + explicitly set ``kw_only=False`` are not affected; base class + attributes are also not affected. + + Also see *force_kw_only*. + + weakref_slot (bool): + Make instances weak-referenceable. This has no effect unless + *slots* is True. + + field_transformer (~typing.Callable | None): + A function that is called with the original class object and all + fields right before *attrs* finalizes the class. You can use this, + for example, to automatically add converters or validators to + fields based on their types. + + .. seealso:: `transform-fields` + + match_args (bool): + If True (default), set ``__match_args__`` on the class to support + :pep:`634` (*Structural Pattern Matching*). It is a tuple of all + non-keyword-only ``__init__`` parameter names on Python 3.10 and + later. Ignored on older Python versions. + + collect_by_mro (bool): + If True, *attrs* collects attributes from base classes correctly + according to the `method resolution order + `_. If False, *attrs* + will mimic the (wrong) behavior of `dataclasses` and :pep:`681`. + + See also `issue #428 + `_. + + force_kw_only (bool): + A back-compat flag for restoring pre-25.4.0 behavior. If True and + ``kw_only=True``, all attributes are made keyword-only, including + base class attributes, and those set to ``kw_only=False`` at the + attribute level. Defaults to False. + + See also `issue #980 + `_. + + getstate_setstate (bool | None): + .. note:: + + This is usually only interesting for slotted classes and you + should probably just set *auto_detect* to True. + + If True, ``__getstate__`` and ``__setstate__`` are generated and + attached to the class. This is necessary for slotted classes to be + pickleable. If left None, it's True by default for slotted classes + and False for dict classes. + + If *auto_detect* is True, and *getstate_setstate* is left None, and + **either** ``__getstate__`` or ``__setstate__`` is detected + directly on the class (meaning: not inherited), it is set to False + (this is usually what you want). + + auto_attribs (bool | None): + If True, look at type annotations to determine which attributes to + use, like `dataclasses`. If False, it will only look for explicit + :func:`field` class attributes, like classic *attrs*. + + If left None, it will guess: + + 1. If any attributes are annotated and no unannotated + `attrs.field`\ s are found, it assumes *auto_attribs=True*. + 2. Otherwise it assumes *auto_attribs=False* and tries to collect + `attrs.field`\ s. + + If *attrs* decides to look at type annotations, **all** fields + **must** be annotated. If *attrs* encounters a field that is set to + a :func:`field` / `attr.ib` but lacks a type annotation, an + `attrs.exceptions.UnannotatedAttributeError` is raised. Use + ``field_name: typing.Any = field(...)`` if you don't want to set a + type. + + .. warning:: + + For features that use the attribute name to create decorators + (for example, :ref:`validators `), you still *must* + assign :func:`field` / `attr.ib` to them. Otherwise Python will + either not find the name or try to use the default value to + call, for example, ``validator`` on it. + + Attributes annotated as `typing.ClassVar`, and attributes that are + neither annotated nor set to an `field()` are **ignored**. + + these (dict[str, object]): + A dictionary of name to the (private) return value of `field()` + mappings. This is useful to avoid the definition of your attributes + within the class body because you can't (for example, if you want + to add ``__repr__`` methods to Django models) or don't want to. + + If *these* is not `None`, *attrs* will *not* search the class body + for attributes and will *not* remove any attributes from it. + + The order is deduced from the order of the attributes inside + *these*. + + Arguably, this is a rather obscure feature. + + .. versionadded:: 20.1.0 + .. versionchanged:: 21.3.0 Converters are also run ``on_setattr``. + .. versionadded:: 22.2.0 + *unsafe_hash* as an alias for *hash* (for :pep:`681` compliance). + .. versionchanged:: 24.1.0 + Instances are not compared as tuples of attributes anymore, but using a + big ``and`` condition. This is faster and has more correct behavior for + uncomparable values like `math.nan`. + .. versionadded:: 24.1.0 + If a class has an *inherited* classmethod called + ``__attrs_init_subclass__``, it is executed after the class is created. + .. deprecated:: 24.1.0 *hash* is deprecated in favor of *unsafe_hash*. + .. versionadded:: 24.3.0 + Unless already present, a ``__replace__`` method is automatically + created for `copy.replace` (Python 3.13+ only). + .. versionchanged:: 25.4.0 + *kw_only* now only applies to attributes defined in the current class, + and respects attribute-level ``kw_only=False`` settings. + .. versionadded:: 25.4.0 + Added *force_kw_only* to go back to the previous *kw_only* behavior. + + .. note:: + + The main differences to the classic `attr.s` are: + + - Automatically detect whether or not *auto_attribs* should be `True` + (c.f. *auto_attribs* parameter). + - Converters and validators run when attributes are set by default -- + if *frozen* is `False`. + - *slots=True* + + Usually, this has only upsides and few visible effects in everyday + programming. But it *can* lead to some surprising behaviors, so + please make sure to read :term:`slotted classes`. + + - *auto_exc=True* + - *auto_detect=True* + - *order=False* + - *force_kw_only=False* + - Some options that were only relevant on Python 2 or were kept around + for backwards-compatibility have been removed. + + """ + + def do_it(cls, auto_attribs): + return attrs( + maybe_cls=cls, + these=these, + repr=repr, + hash=hash, + unsafe_hash=unsafe_hash, + init=init, + slots=slots, + frozen=frozen, + weakref_slot=weakref_slot, + str=str, + auto_attribs=auto_attribs, + kw_only=kw_only, + cache_hash=cache_hash, + auto_exc=auto_exc, + eq=eq, + order=order, + auto_detect=auto_detect, + collect_by_mro=True, + getstate_setstate=getstate_setstate, + on_setattr=on_setattr, + field_transformer=field_transformer, + match_args=match_args, + force_kw_only=force_kw_only, + ) + + def wrap(cls): + """ + Making this a wrapper ensures this code runs during class creation. + + We also ensure that frozen-ness of classes is inherited. + """ + nonlocal frozen, on_setattr + + had_on_setattr = on_setattr not in (None, setters.NO_OP) + + # By default, mutable classes convert & validate on setattr. + if frozen is False and on_setattr is None: + on_setattr = _DEFAULT_ON_SETATTR + + # However, if we subclass a frozen class, we inherit the immutability + # and disable on_setattr. + for base_cls in cls.__bases__: + if base_cls.__setattr__ is _frozen_setattrs: + if had_on_setattr: + msg = "Frozen classes can't use on_setattr (frozen-ness was inherited)." + raise ValueError(msg) + + on_setattr = setters.NO_OP + break + + if auto_attribs is not None: + return do_it(cls, auto_attribs) + + try: + return do_it(cls, True) + except UnannotatedAttributeError: + return do_it(cls, False) + + # maybe_cls's type depends on the usage of the decorator. It's a class + # if it's used as `@attrs` but `None` if used as `@attrs()`. + if maybe_cls is None: + return wrap + + return wrap(maybe_cls) + + +mutable = define +frozen = partial(define, frozen=True, on_setattr=None) + + +def field( + *, + default=NOTHING, + validator=None, + repr=True, + hash=None, + init=True, + metadata=None, + type=None, + converter=None, + factory=None, + kw_only=None, + eq=None, + order=None, + on_setattr=None, + alias=None, +): + """ + Create a new :term:`field` / :term:`attribute` on a class. + + .. warning:: + + Does **nothing** unless the class is also decorated with + `attrs.define` (or similar)! + + Args: + default: + A value that is used if an *attrs*-generated ``__init__`` is used + and no value is passed while instantiating or the attribute is + excluded using ``init=False``. + + If the value is an instance of `attrs.Factory`, its callable will + be used to construct a new value (useful for mutable data types + like lists or dicts). + + If a default is not set (or set manually to `attrs.NOTHING`), a + value *must* be supplied when instantiating; otherwise a + `TypeError` will be raised. + + .. seealso:: `defaults` + + factory (~typing.Callable): + Syntactic sugar for ``default=attr.Factory(factory)``. + + validator (~typing.Callable | list[~typing.Callable]): + Callable that is called by *attrs*-generated ``__init__`` methods + after the instance has been initialized. They receive the + initialized instance, the :func:`~attrs.Attribute`, and the passed + value. + + The return value is *not* inspected so the validator has to throw + an exception itself. + + If a `list` is passed, its items are treated as validators and must + all pass. + + Validators can be globally disabled and re-enabled using + `attrs.validators.get_disabled` / `attrs.validators.set_disabled`. + + The validator can also be set using decorator notation as shown + below. + + .. seealso:: :ref:`validators` + + repr (bool | ~typing.Callable): + Include this attribute in the generated ``__repr__`` method. If + True, include the attribute; if False, omit it. By default, the + built-in ``repr()`` function is used. To override how the attribute + value is formatted, pass a ``callable`` that takes a single value + and returns a string. Note that the resulting string is used as-is, + which means it will be used directly *instead* of calling + ``repr()`` (the default). + + eq (bool | ~typing.Callable): + If True (default), include this attribute in the generated + ``__eq__`` and ``__ne__`` methods that check two instances for + equality. To override how the attribute value is compared, pass a + callable that takes a single value and returns the value to be + compared. + + .. seealso:: `comparison` + + order (bool | ~typing.Callable): + If True (default), include this attributes in the generated + ``__lt__``, ``__le__``, ``__gt__`` and ``__ge__`` methods. To + override how the attribute value is ordered, pass a callable that + takes a single value and returns the value to be ordered. + + .. seealso:: `comparison` + + hash (bool | None): + Include this attribute in the generated ``__hash__`` method. If + None (default), mirror *eq*'s value. This is the correct behavior + according the Python spec. Setting this value to anything else + than None is *discouraged*. + + .. seealso:: `hashing` + + init (bool): + Include this attribute in the generated ``__init__`` method. + + It is possible to set this to False and set a default value. In + that case this attributed is unconditionally initialized with the + specified default value or factory. + + .. seealso:: `init` + + converter (typing.Callable | Converter): + A callable that is called by *attrs*-generated ``__init__`` methods + to convert attribute's value to the desired format. + + If a vanilla callable is passed, it is given the passed-in value as + the only positional argument. It is possible to receive additional + arguments by wrapping the callable in a `Converter`. + + Either way, the returned value will be used as the new value of the + attribute. The value is converted before being passed to the + validator, if any. + + .. seealso:: :ref:`converters` + + metadata (dict | None): + An arbitrary mapping, to be used by third-party code. + + .. seealso:: `extending-metadata`. + + type (type): + The type of the attribute. Nowadays, the preferred method to + specify the type is using a variable annotation (see :pep:`526`). + This argument is provided for backwards-compatibility and for usage + with `make_class`. Regardless of the approach used, the type will + be stored on ``Attribute.type``. + + Please note that *attrs* doesn't do anything with this metadata by + itself. You can use it as part of your own code or for `static type + checking `. + + kw_only (bool | None): + Make this attribute keyword-only in the generated ``__init__`` (if + *init* is False, this parameter is ignored). If None (default), + mirror the setting from `attrs.define`. + + on_setattr (~typing.Callable | list[~typing.Callable] | None | ~typing.Literal[attrs.setters.NO_OP]): + Allows to overwrite the *on_setattr* setting from `attr.s`. If left + None, the *on_setattr* value from `attr.s` is used. Set to + `attrs.setters.NO_OP` to run **no** `setattr` hooks for this + attribute -- regardless of the setting in `define()`. + + alias (str | None): + Override this attribute's parameter name in the generated + ``__init__`` method. If left None, default to ``name`` stripped + of leading underscores. See `private-attributes`. + + .. versionadded:: 20.1.0 + .. versionchanged:: 21.1.0 + *eq*, *order*, and *cmp* also accept a custom callable + .. versionadded:: 22.2.0 *alias* + .. versionadded:: 23.1.0 + The *type* parameter has been re-added; mostly for `attrs.make_class`. + Please note that type checkers ignore this metadata. + .. versionchanged:: 25.4.0 + *kw_only* can now be None, and its default is also changed from False to + None. + + .. seealso:: + + `attr.ib` + """ + return attrib( + default=default, + validator=validator, + repr=repr, + hash=hash, + init=init, + metadata=metadata, + type=type, + converter=converter, + factory=factory, + kw_only=kw_only, + eq=eq, + order=order, + on_setattr=on_setattr, + alias=alias, + ) + + +def asdict(inst, *, recurse=True, filter=None, value_serializer=None): + """ + Same as `attr.asdict`, except that collections types are always retained + and dict is always used as *dict_factory*. + + .. versionadded:: 21.3.0 + """ + return _asdict( + inst=inst, + recurse=recurse, + filter=filter, + value_serializer=value_serializer, + retain_collection_types=True, + ) + + +def astuple(inst, *, recurse=True, filter=None): + """ + Same as `attr.astuple`, except that collections types are always retained + and `tuple` is always used as the *tuple_factory*. + + .. versionadded:: 21.3.0 + """ + return _astuple( + inst=inst, recurse=recurse, filter=filter, retain_collection_types=True + ) + + +def inspect(cls): + """ + Inspect the class and return its effective build parameters. + + Warning: + This feature is currently **experimental** and is not covered by our + strict backwards-compatibility guarantees. + + Args: + cls: The *attrs*-decorated class to inspect. + + Returns: + The effective build parameters of the class. + + Raises: + NotAnAttrsClassError: If the class is not an *attrs*-decorated class. + + .. versionadded:: 25.4.0 + """ + try: + return cls.__dict__["__attrs_props__"] + except KeyError: + msg = f"{cls!r} is not an attrs-decorated class." + raise NotAnAttrsClassError(msg) from None diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_typing_compat.pyi b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_typing_compat.pyi new file mode 100644 index 0000000..ca7b71e --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_typing_compat.pyi @@ -0,0 +1,15 @@ +from typing import Any, ClassVar, Protocol + +# MYPY is a special constant in mypy which works the same way as `TYPE_CHECKING`. +MYPY = False + +if MYPY: + # A protocol to be able to statically accept an attrs class. + class AttrsInstance_(Protocol): + __attrs_attrs__: ClassVar[Any] + +else: + # For type checkers without plug-in support use an empty protocol that + # will (hopefully) be combined into a union. + class AttrsInstance_(Protocol): + pass diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_version_info.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_version_info.py new file mode 100644 index 0000000..27f1888 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_version_info.py @@ -0,0 +1,89 @@ +# SPDX-License-Identifier: MIT + + +from functools import total_ordering + +from ._funcs import astuple +from ._make import attrib, attrs + + +@total_ordering +@attrs(eq=False, order=False, slots=True, frozen=True) +class VersionInfo: + """ + A version object that can be compared to tuple of length 1--4: + + >>> attr.VersionInfo(19, 1, 0, "final") <= (19, 2) + True + >>> attr.VersionInfo(19, 1, 0, "final") < (19, 1, 1) + True + >>> vi = attr.VersionInfo(19, 2, 0, "final") + >>> vi < (19, 1, 1) + False + >>> vi < (19,) + False + >>> vi == (19, 2,) + True + >>> vi == (19, 2, 1) + False + + .. versionadded:: 19.2 + """ + + year = attrib(type=int) + minor = attrib(type=int) + micro = attrib(type=int) + releaselevel = attrib(type=str) + + @classmethod + def _from_version_string(cls, s): + """ + Parse *s* and return a _VersionInfo. + """ + v = s.split(".") + if len(v) == 3: + v.append("final") + + return cls( + year=int(v[0]), minor=int(v[1]), micro=int(v[2]), releaselevel=v[3] + ) + + def _ensure_tuple(self, other): + """ + Ensure *other* is a tuple of a valid length. + + Returns a possibly transformed *other* and ourselves as a tuple of + the same length as *other*. + """ + + if self.__class__ is other.__class__: + other = astuple(other) + + if not isinstance(other, tuple): + raise NotImplementedError + + if not (1 <= len(other) <= 4): + raise NotImplementedError + + return astuple(self)[: len(other)], other + + def __eq__(self, other): + try: + us, them = self._ensure_tuple(other) + except NotImplementedError: + return NotImplemented + + return us == them + + def __lt__(self, other): + try: + us, them = self._ensure_tuple(other) + except NotImplementedError: + return NotImplemented + + # Since alphabetically "dev0" < "final" < "post1" < "post2", we don't + # have to do anything special with releaselevel for now. + return us < them + + def __hash__(self): + return hash((self.year, self.minor, self.micro, self.releaselevel)) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_version_info.pyi b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_version_info.pyi new file mode 100644 index 0000000..45ced08 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/_version_info.pyi @@ -0,0 +1,9 @@ +class VersionInfo: + @property + def year(self) -> int: ... + @property + def minor(self) -> int: ... + @property + def micro(self) -> int: ... + @property + def releaselevel(self) -> str: ... diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/converters.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/converters.py new file mode 100644 index 0000000..0a79dee --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/converters.py @@ -0,0 +1,162 @@ +# SPDX-License-Identifier: MIT + +""" +Commonly useful converters. +""" + +import typing + +from ._compat import _AnnotationExtractor +from ._make import NOTHING, Converter, Factory, pipe + + +__all__ = [ + "default_if_none", + "optional", + "pipe", + "to_bool", +] + + +def optional(converter): + """ + A converter that allows an attribute to be optional. An optional attribute + is one which can be set to `None`. + + Type annotations will be inferred from the wrapped converter's, if it has + any. + + Args: + converter (typing.Callable): + the converter that is used for non-`None` values. + + .. versionadded:: 17.1.0 + """ + + if isinstance(converter, Converter): + + def optional_converter(val, inst, field): + if val is None: + return None + return converter(val, inst, field) + + else: + + def optional_converter(val): + if val is None: + return None + return converter(val) + + xtr = _AnnotationExtractor(converter) + + t = xtr.get_first_param_type() + if t: + optional_converter.__annotations__["val"] = typing.Optional[t] + + rt = xtr.get_return_type() + if rt: + optional_converter.__annotations__["return"] = typing.Optional[rt] + + if isinstance(converter, Converter): + return Converter(optional_converter, takes_self=True, takes_field=True) + + return optional_converter + + +def default_if_none(default=NOTHING, factory=None): + """ + A converter that allows to replace `None` values by *default* or the result + of *factory*. + + Args: + default: + Value to be used if `None` is passed. Passing an instance of + `attrs.Factory` is supported, however the ``takes_self`` option is + *not*. + + factory (typing.Callable): + A callable that takes no parameters whose result is used if `None` + is passed. + + Raises: + TypeError: If **neither** *default* or *factory* is passed. + + TypeError: If **both** *default* and *factory* are passed. + + ValueError: + If an instance of `attrs.Factory` is passed with + ``takes_self=True``. + + .. versionadded:: 18.2.0 + """ + if default is NOTHING and factory is None: + msg = "Must pass either `default` or `factory`." + raise TypeError(msg) + + if default is not NOTHING and factory is not None: + msg = "Must pass either `default` or `factory` but not both." + raise TypeError(msg) + + if factory is not None: + default = Factory(factory) + + if isinstance(default, Factory): + if default.takes_self: + msg = "`takes_self` is not supported by default_if_none." + raise ValueError(msg) + + def default_if_none_converter(val): + if val is not None: + return val + + return default.factory() + + else: + + def default_if_none_converter(val): + if val is not None: + return val + + return default + + return default_if_none_converter + + +def to_bool(val): + """ + Convert "boolean" strings (for example, from environment variables) to real + booleans. + + Values mapping to `True`: + + - ``True`` + - ``"true"`` / ``"t"`` + - ``"yes"`` / ``"y"`` + - ``"on"`` + - ``"1"`` + - ``1`` + + Values mapping to `False`: + + - ``False`` + - ``"false"`` / ``"f"`` + - ``"no"`` / ``"n"`` + - ``"off"`` + - ``"0"`` + - ``0`` + + Raises: + ValueError: For any other value. + + .. versionadded:: 21.3.0 + """ + if isinstance(val, str): + val = val.lower() + + if val in (True, "true", "t", "yes", "y", "on", "1", 1): + return True + if val in (False, "false", "f", "no", "n", "off", "0", 0): + return False + + msg = f"Cannot convert value to bool: {val!r}" + raise ValueError(msg) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/converters.pyi b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/converters.pyi new file mode 100644 index 0000000..12bd0c4 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/converters.pyi @@ -0,0 +1,19 @@ +from typing import Callable, Any, overload + +from attrs import _ConverterType, _CallableConverterType + +@overload +def pipe(*validators: _CallableConverterType) -> _CallableConverterType: ... +@overload +def pipe(*validators: _ConverterType) -> _ConverterType: ... +@overload +def optional(converter: _CallableConverterType) -> _CallableConverterType: ... +@overload +def optional(converter: _ConverterType) -> _ConverterType: ... +@overload +def default_if_none(default: Any) -> _CallableConverterType: ... +@overload +def default_if_none( + *, factory: Callable[[], Any] +) -> _CallableConverterType: ... +def to_bool(val: str | int | bool) -> bool: ... diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/exceptions.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/exceptions.py new file mode 100644 index 0000000..3b7abb8 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/exceptions.py @@ -0,0 +1,95 @@ +# SPDX-License-Identifier: MIT + +from __future__ import annotations + +from typing import ClassVar + + +class FrozenError(AttributeError): + """ + A frozen/immutable instance or attribute have been attempted to be + modified. + + It mirrors the behavior of ``namedtuples`` by using the same error message + and subclassing `AttributeError`. + + .. versionadded:: 20.1.0 + """ + + msg = "can't set attribute" + args: ClassVar[tuple[str]] = [msg] + + +class FrozenInstanceError(FrozenError): + """ + A frozen instance has been attempted to be modified. + + .. versionadded:: 16.1.0 + """ + + +class FrozenAttributeError(FrozenError): + """ + A frozen attribute has been attempted to be modified. + + .. versionadded:: 20.1.0 + """ + + +class AttrsAttributeNotFoundError(ValueError): + """ + An *attrs* function couldn't find an attribute that the user asked for. + + .. versionadded:: 16.2.0 + """ + + +class NotAnAttrsClassError(ValueError): + """ + A non-*attrs* class has been passed into an *attrs* function. + + .. versionadded:: 16.2.0 + """ + + +class DefaultAlreadySetError(RuntimeError): + """ + A default has been set when defining the field and is attempted to be reset + using the decorator. + + .. versionadded:: 17.1.0 + """ + + +class UnannotatedAttributeError(RuntimeError): + """ + A class with ``auto_attribs=True`` has a field without a type annotation. + + .. versionadded:: 17.3.0 + """ + + +class PythonTooOldError(RuntimeError): + """ + It was attempted to use an *attrs* feature that requires a newer Python + version. + + .. versionadded:: 18.2.0 + """ + + +class NotCallableError(TypeError): + """ + A field requiring a callable has been set with a value that is not + callable. + + .. versionadded:: 19.2.0 + """ + + def __init__(self, msg, value): + super(TypeError, self).__init__(msg, value) + self.msg = msg + self.value = value + + def __str__(self): + return str(self.msg) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/exceptions.pyi b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/exceptions.pyi new file mode 100644 index 0000000..f268011 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/exceptions.pyi @@ -0,0 +1,17 @@ +from typing import Any + +class FrozenError(AttributeError): + msg: str = ... + +class FrozenInstanceError(FrozenError): ... +class FrozenAttributeError(FrozenError): ... +class AttrsAttributeNotFoundError(ValueError): ... +class NotAnAttrsClassError(ValueError): ... +class DefaultAlreadySetError(RuntimeError): ... +class UnannotatedAttributeError(RuntimeError): ... +class PythonTooOldError(RuntimeError): ... + +class NotCallableError(TypeError): + msg: str = ... + value: Any = ... + def __init__(self, msg: str, value: Any) -> None: ... diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/filters.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/filters.py new file mode 100644 index 0000000..689b170 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/filters.py @@ -0,0 +1,72 @@ +# SPDX-License-Identifier: MIT + +""" +Commonly useful filters for `attrs.asdict` and `attrs.astuple`. +""" + +from ._make import Attribute + + +def _split_what(what): + """ + Returns a tuple of `frozenset`s of classes and attributes. + """ + return ( + frozenset(cls for cls in what if isinstance(cls, type)), + frozenset(cls for cls in what if isinstance(cls, str)), + frozenset(cls for cls in what if isinstance(cls, Attribute)), + ) + + +def include(*what): + """ + Create a filter that only allows *what*. + + Args: + what (list[type, str, attrs.Attribute]): + What to include. Can be a type, a name, or an attribute. + + Returns: + Callable: + A callable that can be passed to `attrs.asdict`'s and + `attrs.astuple`'s *filter* argument. + + .. versionchanged:: 23.1.0 Accept strings with field names. + """ + cls, names, attrs = _split_what(what) + + def include_(attribute, value): + return ( + value.__class__ in cls + or attribute.name in names + or attribute in attrs + ) + + return include_ + + +def exclude(*what): + """ + Create a filter that does **not** allow *what*. + + Args: + what (list[type, str, attrs.Attribute]): + What to exclude. Can be a type, a name, or an attribute. + + Returns: + Callable: + A callable that can be passed to `attrs.asdict`'s and + `attrs.astuple`'s *filter* argument. + + .. versionchanged:: 23.3.0 Accept field name string as input argument + """ + cls, names, attrs = _split_what(what) + + def exclude_(attribute, value): + return not ( + value.__class__ in cls + or attribute.name in names + or attribute in attrs + ) + + return exclude_ diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/filters.pyi b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/filters.pyi new file mode 100644 index 0000000..974abdc --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/filters.pyi @@ -0,0 +1,6 @@ +from typing import Any + +from . import Attribute, _FilterType + +def include(*what: type | str | Attribute[Any]) -> _FilterType[Any]: ... +def exclude(*what: type | str | Attribute[Any]) -> _FilterType[Any]: ... diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/py.typed b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/setters.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/setters.py new file mode 100644 index 0000000..78b0839 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/setters.py @@ -0,0 +1,79 @@ +# SPDX-License-Identifier: MIT + +""" +Commonly used hooks for on_setattr. +""" + +from . import _config +from .exceptions import FrozenAttributeError + + +def pipe(*setters): + """ + Run all *setters* and return the return value of the last one. + + .. versionadded:: 20.1.0 + """ + + def wrapped_pipe(instance, attrib, new_value): + rv = new_value + + for setter in setters: + rv = setter(instance, attrib, rv) + + return rv + + return wrapped_pipe + + +def frozen(_, __, ___): + """ + Prevent an attribute to be modified. + + .. versionadded:: 20.1.0 + """ + raise FrozenAttributeError + + +def validate(instance, attrib, new_value): + """ + Run *attrib*'s validator on *new_value* if it has one. + + .. versionadded:: 20.1.0 + """ + if _config._run_validators is False: + return new_value + + v = attrib.validator + if not v: + return new_value + + v(instance, attrib, new_value) + + return new_value + + +def convert(instance, attrib, new_value): + """ + Run *attrib*'s converter -- if it has one -- on *new_value* and return the + result. + + .. versionadded:: 20.1.0 + """ + c = attrib.converter + if c: + # This can be removed once we drop 3.8 and use attrs.Converter instead. + from ._make import Converter + + if not isinstance(c, Converter): + return c(new_value) + + return c(new_value, instance, attrib) + + return new_value + + +# Sentinel for disabling class-wide *on_setattr* hooks for certain attributes. +# Sphinx's autodata stopped working, so the docstring is inlined in the API +# docs. +NO_OP = object() diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/setters.pyi b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/setters.pyi new file mode 100644 index 0000000..73abf36 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/setters.pyi @@ -0,0 +1,20 @@ +from typing import Any, NewType, NoReturn, TypeVar + +from . import Attribute +from attrs import _OnSetAttrType + +_T = TypeVar("_T") + +def frozen( + instance: Any, attribute: Attribute[Any], new_value: Any +) -> NoReturn: ... +def pipe(*setters: _OnSetAttrType) -> _OnSetAttrType: ... +def validate(instance: Any, attribute: Attribute[_T], new_value: _T) -> _T: ... + +# convert is allowed to return Any, because they can be chained using pipe. +def convert( + instance: Any, attribute: Attribute[Any], new_value: Any +) -> Any: ... + +_NoOpType = NewType("_NoOpType", object) +NO_OP: _NoOpType diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/validators.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/validators.py new file mode 100644 index 0000000..837e003 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/validators.py @@ -0,0 +1,748 @@ +# SPDX-License-Identifier: MIT + +""" +Commonly useful validators. +""" + +import operator +import re + +from contextlib import contextmanager +from re import Pattern + +from ._config import get_run_validators, set_run_validators +from ._make import _AndValidator, and_, attrib, attrs +from .converters import default_if_none +from .exceptions import NotCallableError + + +__all__ = [ + "and_", + "deep_iterable", + "deep_mapping", + "disabled", + "ge", + "get_disabled", + "gt", + "in_", + "instance_of", + "is_callable", + "le", + "lt", + "matches_re", + "max_len", + "min_len", + "not_", + "optional", + "or_", + "set_disabled", +] + + +def set_disabled(disabled): + """ + Globally disable or enable running validators. + + By default, they are run. + + Args: + disabled (bool): If `True`, disable running all validators. + + .. warning:: + + This function is not thread-safe! + + .. versionadded:: 21.3.0 + """ + set_run_validators(not disabled) + + +def get_disabled(): + """ + Return a bool indicating whether validators are currently disabled or not. + + Returns: + bool:`True` if validators are currently disabled. + + .. versionadded:: 21.3.0 + """ + return not get_run_validators() + + +@contextmanager +def disabled(): + """ + Context manager that disables running validators within its context. + + .. warning:: + + This context manager is not thread-safe! + + .. versionadded:: 21.3.0 + """ + set_run_validators(False) + try: + yield + finally: + set_run_validators(True) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _InstanceOfValidator: + type = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not isinstance(value, self.type): + msg = f"'{attr.name}' must be {self.type!r} (got {value!r} that is a {value.__class__!r})." + raise TypeError( + msg, + attr, + self.type, + value, + ) + + def __repr__(self): + return f"" + + +def instance_of(type): + """ + A validator that raises a `TypeError` if the initializer is called with a + wrong type for this particular attribute (checks are performed using + `isinstance` therefore it's also valid to pass a tuple of types). + + Args: + type (type | tuple[type]): The type to check for. + + Raises: + TypeError: + With a human readable error message, the attribute (of type + `attrs.Attribute`), the expected type, and the value it got. + """ + return _InstanceOfValidator(type) + + +@attrs(repr=False, frozen=True, slots=True) +class _MatchesReValidator: + pattern = attrib() + match_func = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not self.match_func(value): + msg = f"'{attr.name}' must match regex {self.pattern.pattern!r} ({value!r} doesn't)" + raise ValueError( + msg, + attr, + self.pattern, + value, + ) + + def __repr__(self): + return f"" + + +def matches_re(regex, flags=0, func=None): + r""" + A validator that raises `ValueError` if the initializer is called with a + string that doesn't match *regex*. + + Args: + regex (str, re.Pattern): + A regex string or precompiled pattern to match against + + flags (int): + Flags that will be passed to the underlying re function (default 0) + + func (typing.Callable): + Which underlying `re` function to call. Valid options are + `re.fullmatch`, `re.search`, and `re.match`; the default `None` + means `re.fullmatch`. For performance reasons, the pattern is + always precompiled using `re.compile`. + + .. versionadded:: 19.2.0 + .. versionchanged:: 21.3.0 *regex* can be a pre-compiled pattern. + """ + valid_funcs = (re.fullmatch, None, re.search, re.match) + if func not in valid_funcs: + msg = "'func' must be one of {}.".format( + ", ".join( + sorted((e and e.__name__) or "None" for e in set(valid_funcs)) + ) + ) + raise ValueError(msg) + + if isinstance(regex, Pattern): + if flags: + msg = "'flags' can only be used with a string pattern; pass flags to re.compile() instead" + raise TypeError(msg) + pattern = regex + else: + pattern = re.compile(regex, flags) + + if func is re.match: + match_func = pattern.match + elif func is re.search: + match_func = pattern.search + else: + match_func = pattern.fullmatch + + return _MatchesReValidator(pattern, match_func) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _OptionalValidator: + validator = attrib() + + def __call__(self, inst, attr, value): + if value is None: + return + + self.validator(inst, attr, value) + + def __repr__(self): + return f"" + + +def optional(validator): + """ + A validator that makes an attribute optional. An optional attribute is one + which can be set to `None` in addition to satisfying the requirements of + the sub-validator. + + Args: + validator + (typing.Callable | tuple[typing.Callable] | list[typing.Callable]): + A validator (or validators) that is used for non-`None` values. + + .. versionadded:: 15.1.0 + .. versionchanged:: 17.1.0 *validator* can be a list of validators. + .. versionchanged:: 23.1.0 *validator* can also be a tuple of validators. + """ + if isinstance(validator, (list, tuple)): + return _OptionalValidator(_AndValidator(validator)) + + return _OptionalValidator(validator) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _InValidator: + options = attrib() + _original_options = attrib(hash=False) + + def __call__(self, inst, attr, value): + try: + in_options = value in self.options + except TypeError: # e.g. `1 in "abc"` + in_options = False + + if not in_options: + msg = f"'{attr.name}' must be in {self._original_options!r} (got {value!r})" + raise ValueError( + msg, + attr, + self._original_options, + value, + ) + + def __repr__(self): + return f"" + + +def in_(options): + """ + A validator that raises a `ValueError` if the initializer is called with a + value that does not belong in the *options* provided. + + The check is performed using ``value in options``, so *options* has to + support that operation. + + To keep the validator hashable, dicts, lists, and sets are transparently + transformed into a `tuple`. + + Args: + options: Allowed options. + + Raises: + ValueError: + With a human readable error message, the attribute (of type + `attrs.Attribute`), the expected options, and the value it got. + + .. versionadded:: 17.1.0 + .. versionchanged:: 22.1.0 + The ValueError was incomplete until now and only contained the human + readable error message. Now it contains all the information that has + been promised since 17.1.0. + .. versionchanged:: 24.1.0 + *options* that are a list, dict, or a set are now transformed into a + tuple to keep the validator hashable. + """ + repr_options = options + if isinstance(options, (list, dict, set)): + options = tuple(options) + + return _InValidator(options, repr_options) + + +@attrs(repr=False, slots=False, unsafe_hash=True) +class _IsCallableValidator: + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not callable(value): + message = ( + "'{name}' must be callable " + "(got {value!r} that is a {actual!r})." + ) + raise NotCallableError( + msg=message.format( + name=attr.name, value=value, actual=value.__class__ + ), + value=value, + ) + + def __repr__(self): + return "" + + +def is_callable(): + """ + A validator that raises a `attrs.exceptions.NotCallableError` if the + initializer is called with a value for this particular attribute that is + not callable. + + .. versionadded:: 19.1.0 + + Raises: + attrs.exceptions.NotCallableError: + With a human readable error message containing the attribute + (`attrs.Attribute`) name, and the value it got. + """ + return _IsCallableValidator() + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _DeepIterable: + member_validator = attrib(validator=is_callable()) + iterable_validator = attrib( + default=None, validator=optional(is_callable()) + ) + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if self.iterable_validator is not None: + self.iterable_validator(inst, attr, value) + + for member in value: + self.member_validator(inst, attr, member) + + def __repr__(self): + iterable_identifier = ( + "" + if self.iterable_validator is None + else f" {self.iterable_validator!r}" + ) + return ( + f"" + ) + + +def deep_iterable(member_validator, iterable_validator=None): + """ + A validator that performs deep validation of an iterable. + + Args: + member_validator: Validator(s) to apply to iterable members. + + iterable_validator: + Validator(s) to apply to iterable itself (optional). + + Raises + TypeError: if any sub-validators fail + + .. versionadded:: 19.1.0 + + .. versionchanged:: 25.4.0 + *member_validator* and *iterable_validator* can now be a list or tuple + of validators. + """ + if isinstance(member_validator, (list, tuple)): + member_validator = and_(*member_validator) + if isinstance(iterable_validator, (list, tuple)): + iterable_validator = and_(*iterable_validator) + return _DeepIterable(member_validator, iterable_validator) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _DeepMapping: + key_validator = attrib(validator=optional(is_callable())) + value_validator = attrib(validator=optional(is_callable())) + mapping_validator = attrib(validator=optional(is_callable())) + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if self.mapping_validator is not None: + self.mapping_validator(inst, attr, value) + + for key in value: + if self.key_validator is not None: + self.key_validator(inst, attr, key) + if self.value_validator is not None: + self.value_validator(inst, attr, value[key]) + + def __repr__(self): + return f"" + + +def deep_mapping( + key_validator=None, value_validator=None, mapping_validator=None +): + """ + A validator that performs deep validation of a dictionary. + + All validators are optional, but at least one of *key_validator* or + *value_validator* must be provided. + + Args: + key_validator: Validator(s) to apply to dictionary keys. + + value_validator: Validator(s) to apply to dictionary values. + + mapping_validator: + Validator(s) to apply to top-level mapping attribute. + + .. versionadded:: 19.1.0 + + .. versionchanged:: 25.4.0 + *key_validator* and *value_validator* are now optional, but at least one + of them must be provided. + + .. versionchanged:: 25.4.0 + *key_validator*, *value_validator*, and *mapping_validator* can now be a + list or tuple of validators. + + Raises: + TypeError: If any sub-validator fails on validation. + + ValueError: + If neither *key_validator* nor *value_validator* is provided on + instantiation. + """ + if key_validator is None and value_validator is None: + msg = ( + "At least one of key_validator or value_validator must be provided" + ) + raise ValueError(msg) + + if isinstance(key_validator, (list, tuple)): + key_validator = and_(*key_validator) + if isinstance(value_validator, (list, tuple)): + value_validator = and_(*value_validator) + if isinstance(mapping_validator, (list, tuple)): + mapping_validator = and_(*mapping_validator) + + return _DeepMapping(key_validator, value_validator, mapping_validator) + + +@attrs(repr=False, frozen=True, slots=True) +class _NumberValidator: + bound = attrib() + compare_op = attrib() + compare_func = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not self.compare_func(value, self.bound): + msg = f"'{attr.name}' must be {self.compare_op} {self.bound}: {value}" + raise ValueError(msg) + + def __repr__(self): + return f"" + + +def lt(val): + """ + A validator that raises `ValueError` if the initializer is called with a + number larger or equal to *val*. + + The validator uses `operator.lt` to compare the values. + + Args: + val: Exclusive upper bound for values. + + .. versionadded:: 21.3.0 + """ + return _NumberValidator(val, "<", operator.lt) + + +def le(val): + """ + A validator that raises `ValueError` if the initializer is called with a + number greater than *val*. + + The validator uses `operator.le` to compare the values. + + Args: + val: Inclusive upper bound for values. + + .. versionadded:: 21.3.0 + """ + return _NumberValidator(val, "<=", operator.le) + + +def ge(val): + """ + A validator that raises `ValueError` if the initializer is called with a + number smaller than *val*. + + The validator uses `operator.ge` to compare the values. + + Args: + val: Inclusive lower bound for values + + .. versionadded:: 21.3.0 + """ + return _NumberValidator(val, ">=", operator.ge) + + +def gt(val): + """ + A validator that raises `ValueError` if the initializer is called with a + number smaller or equal to *val*. + + The validator uses `operator.gt` to compare the values. + + Args: + val: Exclusive lower bound for values + + .. versionadded:: 21.3.0 + """ + return _NumberValidator(val, ">", operator.gt) + + +@attrs(repr=False, frozen=True, slots=True) +class _MaxLengthValidator: + max_length = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if len(value) > self.max_length: + msg = f"Length of '{attr.name}' must be <= {self.max_length}: {len(value)}" + raise ValueError(msg) + + def __repr__(self): + return f"" + + +def max_len(length): + """ + A validator that raises `ValueError` if the initializer is called + with a string or iterable that is longer than *length*. + + Args: + length (int): Maximum length of the string or iterable + + .. versionadded:: 21.3.0 + """ + return _MaxLengthValidator(length) + + +@attrs(repr=False, frozen=True, slots=True) +class _MinLengthValidator: + min_length = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if len(value) < self.min_length: + msg = f"Length of '{attr.name}' must be >= {self.min_length}: {len(value)}" + raise ValueError(msg) + + def __repr__(self): + return f"" + + +def min_len(length): + """ + A validator that raises `ValueError` if the initializer is called + with a string or iterable that is shorter than *length*. + + Args: + length (int): Minimum length of the string or iterable + + .. versionadded:: 22.1.0 + """ + return _MinLengthValidator(length) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _SubclassOfValidator: + type = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not issubclass(value, self.type): + msg = f"'{attr.name}' must be a subclass of {self.type!r} (got {value!r})." + raise TypeError( + msg, + attr, + self.type, + value, + ) + + def __repr__(self): + return f"" + + +def _subclass_of(type): + """ + A validator that raises a `TypeError` if the initializer is called with a + wrong type for this particular attribute (checks are performed using + `issubclass` therefore it's also valid to pass a tuple of types). + + Args: + type (type | tuple[type, ...]): The type(s) to check for. + + Raises: + TypeError: + With a human readable error message, the attribute (of type + `attrs.Attribute`), the expected type, and the value it got. + """ + return _SubclassOfValidator(type) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _NotValidator: + validator = attrib() + msg = attrib( + converter=default_if_none( + "not_ validator child '{validator!r}' " + "did not raise a captured error" + ) + ) + exc_types = attrib( + validator=deep_iterable( + member_validator=_subclass_of(Exception), + iterable_validator=instance_of(tuple), + ), + ) + + def __call__(self, inst, attr, value): + try: + self.validator(inst, attr, value) + except self.exc_types: + pass # suppress error to invert validity + else: + raise ValueError( + self.msg.format( + validator=self.validator, + exc_types=self.exc_types, + ), + attr, + self.validator, + value, + self.exc_types, + ) + + def __repr__(self): + return f"" + + +def not_(validator, *, msg=None, exc_types=(ValueError, TypeError)): + """ + A validator that wraps and logically 'inverts' the validator passed to it. + It will raise a `ValueError` if the provided validator *doesn't* raise a + `ValueError` or `TypeError` (by default), and will suppress the exception + if the provided validator *does*. + + Intended to be used with existing validators to compose logic without + needing to create inverted variants, for example, ``not_(in_(...))``. + + Args: + validator: A validator to be logically inverted. + + msg (str): + Message to raise if validator fails. Formatted with keys + ``exc_types`` and ``validator``. + + exc_types (tuple[type, ...]): + Exception type(s) to capture. Other types raised by child + validators will not be intercepted and pass through. + + Raises: + ValueError: + With a human readable error message, the attribute (of type + `attrs.Attribute`), the validator that failed to raise an + exception, the value it got, and the expected exception types. + + .. versionadded:: 22.2.0 + """ + try: + exc_types = tuple(exc_types) + except TypeError: + exc_types = (exc_types,) + return _NotValidator(validator, msg, exc_types) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _OrValidator: + validators = attrib() + + def __call__(self, inst, attr, value): + for v in self.validators: + try: + v(inst, attr, value) + except Exception: # noqa: BLE001, PERF203, S112 + continue + else: + return + + msg = f"None of {self.validators!r} satisfied for value {value!r}" + raise ValueError(msg) + + def __repr__(self): + return f"" + + +def or_(*validators): + """ + A validator that composes multiple validators into one. + + When called on a value, it runs all wrapped validators until one of them is + satisfied. + + Args: + validators (~collections.abc.Iterable[typing.Callable]): + Arbitrary number of validators. + + Raises: + ValueError: + If no validator is satisfied. Raised with a human-readable error + message listing all the wrapped validators and the value that + failed all of them. + + .. versionadded:: 24.1.0 + """ + vals = [] + for v in validators: + vals.extend(v.validators if isinstance(v, _OrValidator) else [v]) + + return _OrValidator(tuple(vals)) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/validators.pyi b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/validators.pyi new file mode 100644 index 0000000..36a7e80 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attr/validators.pyi @@ -0,0 +1,140 @@ +from types import UnionType +from typing import ( + Any, + AnyStr, + Callable, + Container, + ContextManager, + Iterable, + Mapping, + Match, + Pattern, + TypeVar, + overload, +) + +from attrs import _ValidatorType +from attrs import _ValidatorArgType + +_T = TypeVar("_T") +_T1 = TypeVar("_T1") +_T2 = TypeVar("_T2") +_T3 = TypeVar("_T3") +_T4 = TypeVar("_T4") +_T5 = TypeVar("_T5") +_T6 = TypeVar("_T6") +_I = TypeVar("_I", bound=Iterable) +_K = TypeVar("_K") +_V = TypeVar("_V") +_M = TypeVar("_M", bound=Mapping) + +def set_disabled(run: bool) -> None: ... +def get_disabled() -> bool: ... +def disabled() -> ContextManager[None]: ... + +# To be more precise on instance_of use some overloads. +# If there are more than 3 items in the tuple then we fall back to Any +@overload +def instance_of(type: type[_T]) -> _ValidatorType[_T]: ... +@overload +def instance_of(type: tuple[type[_T]]) -> _ValidatorType[_T]: ... +@overload +def instance_of( + type: tuple[type[_T1], type[_T2]], +) -> _ValidatorType[_T1 | _T2]: ... +@overload +def instance_of( + type: tuple[type[_T1], type[_T2], type[_T3]], +) -> _ValidatorType[_T1 | _T2 | _T3]: ... +@overload +def instance_of(type: tuple[type, ...]) -> _ValidatorType[Any]: ... +@overload +def instance_of(type: UnionType) -> _ValidatorType[Any]: ... +def optional( + validator: ( + _ValidatorType[_T] + | list[_ValidatorType[_T]] + | tuple[_ValidatorType[_T]] + ), +) -> _ValidatorType[_T | None]: ... +def in_(options: Container[_T]) -> _ValidatorType[_T]: ... +def and_(*validators: _ValidatorType[_T]) -> _ValidatorType[_T]: ... +def matches_re( + regex: Pattern[AnyStr] | AnyStr, + flags: int = ..., + func: Callable[[AnyStr, AnyStr, int], Match[AnyStr] | None] | None = ..., +) -> _ValidatorType[AnyStr]: ... +def deep_iterable( + member_validator: _ValidatorArgType[_T], + iterable_validator: _ValidatorArgType[_I] | None = ..., +) -> _ValidatorType[_I]: ... +@overload +def deep_mapping( + key_validator: _ValidatorArgType[_K], + value_validator: _ValidatorArgType[_V] | None = ..., + mapping_validator: _ValidatorArgType[_M] | None = ..., +) -> _ValidatorType[_M]: ... +@overload +def deep_mapping( + key_validator: _ValidatorArgType[_K] | None = ..., + value_validator: _ValidatorArgType[_V] = ..., + mapping_validator: _ValidatorArgType[_M] | None = ..., +) -> _ValidatorType[_M]: ... +def is_callable() -> _ValidatorType[_T]: ... +def lt(val: _T) -> _ValidatorType[_T]: ... +def le(val: _T) -> _ValidatorType[_T]: ... +def ge(val: _T) -> _ValidatorType[_T]: ... +def gt(val: _T) -> _ValidatorType[_T]: ... +def max_len(length: int) -> _ValidatorType[_T]: ... +def min_len(length: int) -> _ValidatorType[_T]: ... +def not_( + validator: _ValidatorType[_T], + *, + msg: str | None = None, + exc_types: type[Exception] | Iterable[type[Exception]] = ..., +) -> _ValidatorType[_T]: ... +@overload +def or_( + __v1: _ValidatorType[_T1], + __v2: _ValidatorType[_T2], +) -> _ValidatorType[_T1 | _T2]: ... +@overload +def or_( + __v1: _ValidatorType[_T1], + __v2: _ValidatorType[_T2], + __v3: _ValidatorType[_T3], +) -> _ValidatorType[_T1 | _T2 | _T3]: ... +@overload +def or_( + __v1: _ValidatorType[_T1], + __v2: _ValidatorType[_T2], + __v3: _ValidatorType[_T3], + __v4: _ValidatorType[_T4], +) -> _ValidatorType[_T1 | _T2 | _T3 | _T4]: ... +@overload +def or_( + __v1: _ValidatorType[_T1], + __v2: _ValidatorType[_T2], + __v3: _ValidatorType[_T3], + __v4: _ValidatorType[_T4], + __v5: _ValidatorType[_T5], +) -> _ValidatorType[_T1 | _T2 | _T3 | _T4 | _T5]: ... +@overload +def or_( + __v1: _ValidatorType[_T1], + __v2: _ValidatorType[_T2], + __v3: _ValidatorType[_T3], + __v4: _ValidatorType[_T4], + __v5: _ValidatorType[_T5], + __v6: _ValidatorType[_T6], +) -> _ValidatorType[_T1 | _T2 | _T3 | _T4 | _T5 | _T6]: ... +@overload +def or_( + __v1: _ValidatorType[Any], + __v2: _ValidatorType[Any], + __v3: _ValidatorType[Any], + __v4: _ValidatorType[Any], + __v5: _ValidatorType[Any], + __v6: _ValidatorType[Any], + *validators: _ValidatorType[Any], +) -> _ValidatorType[Any]: ... diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs-25.4.0.dist-info/INSTALLER b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs-25.4.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs-25.4.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs-25.4.0.dist-info/METADATA b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs-25.4.0.dist-info/METADATA new file mode 100644 index 0000000..51128bb --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs-25.4.0.dist-info/METADATA @@ -0,0 +1,235 @@ +Metadata-Version: 2.4 +Name: attrs +Version: 25.4.0 +Summary: Classes Without Boilerplate +Project-URL: Documentation, https://www.attrs.org/ +Project-URL: Changelog, https://www.attrs.org/en/stable/changelog.html +Project-URL: GitHub, https://github.com/python-attrs/attrs +Project-URL: Funding, https://github.com/sponsors/hynek +Project-URL: Tidelift, https://tidelift.com/subscription/pkg/pypi-attrs?utm_source=pypi-attrs&utm_medium=pypi +Author-email: Hynek Schlawack +License-Expression: MIT +License-File: LICENSE +Keywords: attribute,boilerplate,class +Classifier: Development Status :: 5 - Production/Stable +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 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Typing :: Typed +Requires-Python: >=3.9 +Description-Content-Type: text/markdown + +

    + + attrs + +

    + + +*attrs* is the Python package that will bring back the **joy** of **writing classes** by relieving you from the drudgery of implementing object protocols (aka [dunder methods](https://www.attrs.org/en/latest/glossary.html#term-dunder-methods)). +Trusted by NASA for [Mars missions since 2020](https://github.com/readme/featured/nasa-ingenuity-helicopter)! + +Its main goal is to help you to write **concise** and **correct** software without slowing down your code. + + +## Sponsors + +*attrs* would not be possible without our [amazing sponsors](https://github.com/sponsors/hynek). +Especially those generously supporting us at the *The Organization* tier and higher: + + + +

    + + + + + + + + + +

    + + + +

    + Please consider joining them to help make attrs’s maintenance more sustainable! +

    + + + +## Example + +*attrs* gives you a class decorator and a way to declaratively define the attributes on that class: + + + +```pycon +>>> from attrs import asdict, define, make_class, Factory + +>>> @define +... class SomeClass: +... a_number: int = 42 +... list_of_numbers: list[int] = Factory(list) +... +... def hard_math(self, another_number): +... return self.a_number + sum(self.list_of_numbers) * another_number + + +>>> sc = SomeClass(1, [1, 2, 3]) +>>> sc +SomeClass(a_number=1, list_of_numbers=[1, 2, 3]) + +>>> sc.hard_math(3) +19 +>>> sc == SomeClass(1, [1, 2, 3]) +True +>>> sc != SomeClass(2, [3, 2, 1]) +True + +>>> asdict(sc) +{'a_number': 1, 'list_of_numbers': [1, 2, 3]} + +>>> SomeClass() +SomeClass(a_number=42, list_of_numbers=[]) + +>>> C = make_class("C", ["a", "b"]) +>>> C("foo", "bar") +C(a='foo', b='bar') +``` + +After *declaring* your attributes, *attrs* gives you: + +- a concise and explicit overview of the class's attributes, +- a nice human-readable `__repr__`, +- equality-checking methods, +- an initializer, +- and much more, + +*without* writing dull boilerplate code again and again and *without* runtime performance penalties. + +--- + +This example uses *attrs*'s modern APIs that have been introduced in version 20.1.0, and the *attrs* package import name that has been added in version 21.3.0. +The classic APIs (`@attr.s`, `attr.ib`, plus their serious-business aliases) and the `attr` package import name will remain **indefinitely**. + +Check out [*On The Core API Names*](https://www.attrs.org/en/latest/names.html) for an in-depth explanation! + + +### Hate Type Annotations!? + +No problem! +Types are entirely **optional** with *attrs*. +Simply assign `attrs.field()` to the attributes instead of annotating them with types: + +```python +from attrs import define, field + +@define +class SomeClass: + a_number = field(default=42) + list_of_numbers = field(factory=list) +``` + + +## Data Classes + +On the tin, *attrs* might remind you of `dataclasses` (and indeed, `dataclasses` [are a descendant](https://hynek.me/articles/import-attrs/) of *attrs*). +In practice it does a lot more and is more flexible. +For instance, it allows you to define [special handling of NumPy arrays for equality checks](https://www.attrs.org/en/stable/comparison.html#customization), allows more ways to [plug into the initialization process](https://www.attrs.org/en/stable/init.html#hooking-yourself-into-initialization), has a replacement for `__init_subclass__`, and allows for stepping through the generated methods using a debugger. + +For more details, please refer to our [comparison page](https://www.attrs.org/en/stable/why.html#data-classes), but generally speaking, we are more likely to commit crimes against nature to make things work that one would expect to work, but that are quite complicated in practice. + + +## Project Information + +- [**Changelog**](https://www.attrs.org/en/stable/changelog.html) +- [**Documentation**](https://www.attrs.org/) +- [**PyPI**](https://pypi.org/project/attrs/) +- [**Source Code**](https://github.com/python-attrs/attrs) +- [**Contributing**](https://github.com/python-attrs/attrs/blob/main/.github/CONTRIBUTING.md) +- [**Third-party Extensions**](https://github.com/python-attrs/attrs/wiki/Extensions-to-attrs) +- **Get Help**: use the `python-attrs` tag on [Stack Overflow](https://stackoverflow.com/questions/tagged/python-attrs) + + +### *attrs* for Enterprise + +Available as part of the [Tidelift Subscription](https://tidelift.com/?utm_source=lifter&utm_medium=referral&utm_campaign=hynek). + +The maintainers of *attrs* and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. +Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use. + +## Release Information + +### Backwards-incompatible Changes + +- Class-level `kw_only=True` behavior is now consistent with `dataclasses`. + + Previously, a class that sets `kw_only=True` makes all attributes keyword-only, including those from base classes. + If an attribute sets `kw_only=False`, that setting is ignored, and it is still made keyword-only. + + Now, only the attributes defined in that class that doesn't explicitly set `kw_only=False` are made keyword-only. + + This shouldn't be a problem for most users, unless you have a pattern like this: + + ```python + @attrs.define(kw_only=True) + class Base: + a: int + b: int = attrs.field(default=1, kw_only=False) + + @attrs.define + class Subclass(Base): + c: int + ``` + + Here, we have a `kw_only=True` *attrs* class (`Base`) with an attribute that sets `kw_only=False` and has a default (`Base.b`), and then create a subclass (`Subclass`) with required arguments (`Subclass.c`). + Previously this would work, since it would make `Base.b` keyword-only, but now this fails since `Base.b` is positional, and we have a required positional argument (`Subclass.c`) following another argument with defaults. + [#1457](https://github.com/python-attrs/attrs/issues/1457) + + +### Changes + +- Values passed to the `__init__()` method of `attrs` classes are now correctly passed to `__attrs_pre_init__()` instead of their default values (in cases where *kw_only* was not specified). + [#1427](https://github.com/python-attrs/attrs/issues/1427) +- Added support for Python 3.14 and [PEP 749](https://peps.python.org/pep-0749/). + [#1446](https://github.com/python-attrs/attrs/issues/1446), + [#1451](https://github.com/python-attrs/attrs/issues/1451) +- `attrs.validators.deep_mapping()` now allows to leave out either *key_validator* xor *value_validator*. + [#1448](https://github.com/python-attrs/attrs/issues/1448) +- `attrs.validators.deep_iterator()` and `attrs.validators.deep_mapping()` now accept lists and tuples for all validators and wrap them into a `attrs.validators.and_()`. + [#1449](https://github.com/python-attrs/attrs/issues/1449) +- Added a new **experimental** way to inspect classes: + + `attrs.inspect(cls)` returns the _effective_ class-wide parameters that were used by *attrs* to construct the class. + + The returned class is the same data structure that *attrs* uses internally to decide how to construct the final class. + [#1454](https://github.com/python-attrs/attrs/issues/1454) +- Fixed annotations for `attrs.field(converter=...)`. + Previously, a `tuple` of converters was only accepted if it had exactly one element. + [#1461](https://github.com/python-attrs/attrs/issues/1461) +- The performance of `attrs.asdict()` has been improved by 45–260%. + [#1463](https://github.com/python-attrs/attrs/issues/1463) +- The performance of `attrs.astuple()` has been improved by 49–270%. + [#1469](https://github.com/python-attrs/attrs/issues/1469) +- The type annotation for `attrs.validators.or_()` now allows for different types of validators. + + This was only an issue on Pyright. + [#1474](https://github.com/python-attrs/attrs/issues/1474) + + + +--- + +[Full changelog →](https://www.attrs.org/en/stable/changelog.html) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs-25.4.0.dist-info/RECORD b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs-25.4.0.dist-info/RECORD new file mode 100644 index 0000000..e7d4f86 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs-25.4.0.dist-info/RECORD @@ -0,0 +1,55 @@ +attr/__init__.py,sha256=fOYIvt1eGSqQre4uCS3sJWKZ0mwAuC8UD6qba5OS9_U,2057 +attr/__init__.pyi,sha256=IZkzIjvtbRqDWGkDBIF9dd12FgDa379JYq3GHnVOvFQ,11309 +attr/__pycache__/__init__.cpython-312.pyc,, +attr/__pycache__/_cmp.cpython-312.pyc,, +attr/__pycache__/_compat.cpython-312.pyc,, +attr/__pycache__/_config.cpython-312.pyc,, +attr/__pycache__/_funcs.cpython-312.pyc,, +attr/__pycache__/_make.cpython-312.pyc,, +attr/__pycache__/_next_gen.cpython-312.pyc,, +attr/__pycache__/_version_info.cpython-312.pyc,, +attr/__pycache__/converters.cpython-312.pyc,, +attr/__pycache__/exceptions.cpython-312.pyc,, +attr/__pycache__/filters.cpython-312.pyc,, +attr/__pycache__/setters.cpython-312.pyc,, +attr/__pycache__/validators.cpython-312.pyc,, +attr/_cmp.py,sha256=3Nn1TjxllUYiX_nJoVnEkXoDk0hM1DYKj5DE7GZe4i0,4117 +attr/_cmp.pyi,sha256=U-_RU_UZOyPUEQzXE6RMYQQcjkZRY25wTH99sN0s7MM,368 +attr/_compat.py,sha256=x0g7iEUOnBVJC72zyFCgb1eKqyxS-7f2LGnNyZ_r95s,2829 +attr/_config.py,sha256=dGq3xR6fgZEF6UBt_L0T-eUHIB4i43kRmH0P28sJVw8,843 +attr/_funcs.py,sha256=Ix5IETTfz5F01F-12MF_CSFomIn2h8b67EVVz2gCtBE,16479 +attr/_make.py,sha256=NRJDGS8syg2h3YNflVNoK2FwR3CpdSZxx8M6lacwljA,104141 +attr/_next_gen.py,sha256=BQtCUlzwg2gWHTYXBQvrEYBnzBUrDvO57u0Py6UCPhc,26274 +attr/_typing_compat.pyi,sha256=XDP54TUn-ZKhD62TOQebmzrwFyomhUCoGRpclb6alRA,469 +attr/_version_info.py,sha256=w4R-FYC3NK_kMkGUWJlYP4cVAlH9HRaC-um3fcjYkHM,2222 +attr/_version_info.pyi,sha256=x_M3L3WuB7r_ULXAWjx959udKQ4HLB8l-hsc1FDGNvk,209 +attr/converters.py,sha256=GlDeOzPeTFgeBBLbj9G57Ez5lAk68uhSALRYJ_exe84,3861 +attr/converters.pyi,sha256=orU2bff-VjQa2kMDyvnMQV73oJT2WRyQuw4ZR1ym1bE,643 +attr/exceptions.py,sha256=HRFq4iybmv7-DcZwyjl6M1euM2YeJVK_hFxuaBGAngI,1977 +attr/exceptions.pyi,sha256=zZq8bCUnKAy9mDtBEw42ZhPhAUIHoTKedDQInJD883M,539 +attr/filters.py,sha256=ZBiKWLp3R0LfCZsq7X11pn9WX8NslS2wXM4jsnLOGc8,1795 +attr/filters.pyi,sha256=3J5BG-dTxltBk1_-RuNRUHrv2qu1v8v4aDNAQ7_mifA,208 +attr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +attr/setters.py,sha256=5-dcT63GQK35ONEzSgfXCkbB7pPkaR-qv15mm4PVSzQ,1617 +attr/setters.pyi,sha256=NnVkaFU1BB4JB8E4JuXyrzTUgvtMpj8p3wBdJY7uix4,584 +attr/validators.py,sha256=1BnYGTuYvSucGEI4ju-RPNJteVzG0ZlfWpJiWoSFHQ8,21458 +attr/validators.pyi,sha256=ftmW3m4KJ3pQcIXAj-BejT7BY4ZfqrC1G-5W7XvoPds,4082 +attrs-25.4.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +attrs-25.4.0.dist-info/METADATA,sha256=2Rerxj7agcMRxiwdkt6lC2guqHAmkGKCH13nWWK7ZoQ,10473 +attrs-25.4.0.dist-info/RECORD,, +attrs-25.4.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87 +attrs-25.4.0.dist-info/licenses/LICENSE,sha256=iCEVyV38KvHutnFPjsbVy8q_Znyv-HKfQkINpj9xTp8,1109 +attrs/__init__.py,sha256=RxaAZNwYiEh-fcvHLZNpQ_DWKni73M_jxEPEftiq1Zc,1183 +attrs/__init__.pyi,sha256=2gV79g9UxJppGSM48hAZJ6h_MHb70dZoJL31ZNJeZYI,9416 +attrs/__pycache__/__init__.cpython-312.pyc,, +attrs/__pycache__/converters.cpython-312.pyc,, +attrs/__pycache__/exceptions.cpython-312.pyc,, +attrs/__pycache__/filters.cpython-312.pyc,, +attrs/__pycache__/setters.cpython-312.pyc,, +attrs/__pycache__/validators.cpython-312.pyc,, +attrs/converters.py,sha256=8kQljrVwfSTRu8INwEk8SI0eGrzmWftsT7rM0EqyohM,76 +attrs/exceptions.py,sha256=ACCCmg19-vDFaDPY9vFl199SPXCQMN_bENs4DALjzms,76 +attrs/filters.py,sha256=VOUMZug9uEU6dUuA0dF1jInUK0PL3fLgP0VBS5d-CDE,73 +attrs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +attrs/setters.py,sha256=eL1YidYQV3T2h9_SYIZSZR1FAcHGb1TuCTy0E0Lv2SU,73 +attrs/validators.py,sha256=xcy6wD5TtTkdCG1f4XWbocPSO0faBjk5IfVJfP6SUj0,76 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs-25.4.0.dist-info/WHEEL b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs-25.4.0.dist-info/WHEEL new file mode 100644 index 0000000..12228d4 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs-25.4.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: hatchling 1.27.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs-25.4.0.dist-info/licenses/LICENSE b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs-25.4.0.dist-info/licenses/LICENSE new file mode 100644 index 0000000..2bd6453 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs-25.4.0.dist-info/licenses/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Hynek Schlawack and the attrs 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/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/__init__.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/__init__.py new file mode 100644 index 0000000..dc1ce4b --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/__init__.py @@ -0,0 +1,72 @@ +# SPDX-License-Identifier: MIT + +from attr import ( + NOTHING, + Attribute, + AttrsInstance, + Converter, + Factory, + NothingType, + _make_getattr, + assoc, + cmp_using, + define, + evolve, + field, + fields, + fields_dict, + frozen, + has, + make_class, + mutable, + resolve_types, + validate, +) +from attr._make import ClassProps +from attr._next_gen import asdict, astuple, inspect + +from . import converters, exceptions, filters, setters, validators + + +__all__ = [ + "NOTHING", + "Attribute", + "AttrsInstance", + "ClassProps", + "Converter", + "Factory", + "NothingType", + "__author__", + "__copyright__", + "__description__", + "__doc__", + "__email__", + "__license__", + "__title__", + "__url__", + "__version__", + "__version_info__", + "asdict", + "assoc", + "astuple", + "cmp_using", + "converters", + "define", + "evolve", + "exceptions", + "field", + "fields", + "fields_dict", + "filters", + "frozen", + "has", + "inspect", + "make_class", + "mutable", + "resolve_types", + "setters", + "validate", + "validators", +] + +__getattr__ = _make_getattr(__name__) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/__init__.pyi b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/__init__.pyi new file mode 100644 index 0000000..6364bac --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/__init__.pyi @@ -0,0 +1,314 @@ +import sys + +from typing import ( + Any, + Callable, + Mapping, + Sequence, + overload, + TypeVar, +) + +# Because we need to type our own stuff, we have to make everything from +# attr explicitly public too. +from attr import __author__ as __author__ +from attr import __copyright__ as __copyright__ +from attr import __description__ as __description__ +from attr import __email__ as __email__ +from attr import __license__ as __license__ +from attr import __title__ as __title__ +from attr import __url__ as __url__ +from attr import __version__ as __version__ +from attr import __version_info__ as __version_info__ +from attr import assoc as assoc +from attr import Attribute as Attribute +from attr import AttrsInstance as AttrsInstance +from attr import cmp_using as cmp_using +from attr import converters as converters +from attr import Converter as Converter +from attr import evolve as evolve +from attr import exceptions as exceptions +from attr import Factory as Factory +from attr import fields as fields +from attr import fields_dict as fields_dict +from attr import filters as filters +from attr import has as has +from attr import make_class as make_class +from attr import NOTHING as NOTHING +from attr import resolve_types as resolve_types +from attr import setters as setters +from attr import validate as validate +from attr import validators as validators +from attr import attrib, asdict as asdict, astuple as astuple +from attr import NothingType as NothingType + +if sys.version_info >= (3, 11): + from typing import dataclass_transform +else: + from typing_extensions import dataclass_transform + +_T = TypeVar("_T") +_C = TypeVar("_C", bound=type) + +_EqOrderType = bool | Callable[[Any], Any] +_ValidatorType = Callable[[Any, "Attribute[_T]", _T], Any] +_CallableConverterType = Callable[[Any], Any] +_ConverterType = _CallableConverterType | Converter[Any, Any] +_ReprType = Callable[[Any], str] +_ReprArgType = bool | _ReprType +_OnSetAttrType = Callable[[Any, "Attribute[Any]", Any], Any] +_OnSetAttrArgType = _OnSetAttrType | list[_OnSetAttrType] | setters._NoOpType +_FieldTransformer = Callable[ + [type, list["Attribute[Any]"]], list["Attribute[Any]"] +] +# FIXME: in reality, if multiple validators are passed they must be in a list +# or tuple, but those are invariant and so would prevent subtypes of +# _ValidatorType from working when passed in a list or tuple. +_ValidatorArgType = _ValidatorType[_T] | Sequence[_ValidatorType[_T]] + +@overload +def field( + *, + default: None = ..., + validator: None = ..., + repr: _ReprArgType = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + converter: None = ..., + factory: None = ..., + kw_only: bool | None = ..., + eq: bool | None = ..., + order: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., + type: type | None = ..., +) -> Any: ... + +# This form catches an explicit None or no default and infers the type from the +# other arguments. +@overload +def field( + *, + default: None = ..., + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + converter: _ConverterType + | list[_ConverterType] + | tuple[_ConverterType, ...] + | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool | None = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., + type: type | None = ..., +) -> _T: ... + +# This form catches an explicit default argument. +@overload +def field( + *, + default: _T, + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + converter: _ConverterType + | list[_ConverterType] + | tuple[_ConverterType, ...] + | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool | None = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., + type: type | None = ..., +) -> _T: ... + +# This form covers type=non-Type: e.g. forward references (str), Any +@overload +def field( + *, + default: _T | None = ..., + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + converter: _ConverterType + | list[_ConverterType] + | tuple[_ConverterType, ...] + | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool | None = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., + type: type | None = ..., +) -> Any: ... +@overload +@dataclass_transform(field_specifiers=(attrib, field)) +def define( + maybe_cls: _C, + *, + these: dict[str, Any] | None = ..., + repr: bool = ..., + unsafe_hash: bool | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + auto_detect: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., +) -> _C: ... +@overload +@dataclass_transform(field_specifiers=(attrib, field)) +def define( + maybe_cls: None = ..., + *, + these: dict[str, Any] | None = ..., + repr: bool = ..., + unsafe_hash: bool | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + auto_detect: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., +) -> Callable[[_C], _C]: ... + +mutable = define + +@overload +@dataclass_transform(frozen_default=True, field_specifiers=(attrib, field)) +def frozen( + maybe_cls: _C, + *, + these: dict[str, Any] | None = ..., + repr: bool = ..., + unsafe_hash: bool | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + auto_detect: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., +) -> _C: ... +@overload +@dataclass_transform(frozen_default=True, field_specifiers=(attrib, field)) +def frozen( + maybe_cls: None = ..., + *, + these: dict[str, Any] | None = ..., + repr: bool = ..., + unsafe_hash: bool | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + auto_detect: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., +) -> Callable[[_C], _C]: ... + +class ClassProps: + # XXX: somehow when defining/using enums Mypy starts looking at our own + # (untyped) code and causes tons of errors. + Hashability: Any + KeywordOnly: Any + + is_exception: bool + is_slotted: bool + has_weakref_slot: bool + is_frozen: bool + # kw_only: ClassProps.KeywordOnly + kw_only: Any + collected_fields_by_mro: bool + added_init: bool + added_repr: bool + added_eq: bool + added_ordering: bool + # hashability: ClassProps.Hashability + hashability: Any + added_match_args: bool + added_str: bool + added_pickling: bool + on_setattr_hook: _OnSetAttrType | None + field_transformer: Callable[[Attribute[Any]], Attribute[Any]] | None + + def __init__( + self, + is_exception: bool, + is_slotted: bool, + has_weakref_slot: bool, + is_frozen: bool, + # kw_only: ClassProps.KeywordOnly + kw_only: Any, + collected_fields_by_mro: bool, + added_init: bool, + added_repr: bool, + added_eq: bool, + added_ordering: bool, + # hashability: ClassProps.Hashability + hashability: Any, + added_match_args: bool, + added_str: bool, + added_pickling: bool, + on_setattr_hook: _OnSetAttrType, + field_transformer: Callable[[Attribute[Any]], Attribute[Any]], + ) -> None: ... + @property + def is_hashable(self) -> bool: ... + +def inspect(cls: type) -> ClassProps: ... diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/__pycache__/__init__.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..66c9eac84446fc4cf6be44fd13b85b80126bcda2 GIT binary patch literal 1210 zcmZXTOK%)S5XXD=F|#}C-Ss=R@rw{ZD}hH~aYINX5;zwVp`7~CYR|O29Z$`Sx_g&w zPRXYTHzaO|3wJ&OCxp24g#!na8(^VGIZ-vcR)m?uZ>no+>R(k|`%}LkGkm`KQR#15 zjQviB>!-Oeu6{t{Im=iUb#)CXx&GrUpzdyfBL!a ze(IdjXA`GPj>7z0=Z-b#d`XVR%r;NyD~`oNTx9W{L@ZJjcb)=et>GSY>uRO(*P zC`N4`r`MgKlzN=1%IUH|sdJrUyJ%SDY9n5Vl*W$UF?9C^7lN5K;T9nzM1&5)$3n=7 z8<$21oR3J$YG(As*x_*~M5b(NbghPt2pwgLMpp<0Qs-#)gvfQO3ajRRr(I4a#!k#4 z058R2z35#Q;`*SA^HK=2MU~L@nr%XluuE7X^a*=}0bxj3ChQYd2&;r0!WvCy*vJ#{IstGH3XYwa7dr08Q(I;z*Lp1L2*9ff-AaQ}*V z+jYlOx?l8McUrer7k@}U;UHyBgX{=VNTAu`%ojT>#CPlpqu8ql$+!fSIH@1$#Fb@k z6M1QcL@}2fO;s^Xa($LmGra5K_~?TV6RVwizmn-C#$Yi0l@cLzq4DmIs@bc~$53XI zTzz6bLIK)DdxH4083e)0a3g5EWdFw%`Tlv21-E}=$3L^8W`o z`g&!ld1d-JnMwKul_eSZdB%E%M*78>C8@dviOJbOH9*BcV~h0>=IRwx{^GF7%}*)K fNwq8D09wHa#Kj;#d|+l|WcI literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/__pycache__/exceptions.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8559cc412beeee36c394e2dd59359c4bceed842 GIT binary patch literal 218 zcmX@j%ge<81m(L^Gkt*cV-N=hn4pZ$d_cx@h7^Vr#vF#VOpFYbOq$FuL6Vw`w-~kj zfFyrnNlB4jYDIEtK}lwQUhztX&mj38W`o z`g&!ld1d-JnMwKul_eSZdB%E%M*78>C8@dviOJbOH9*BcV~h0>=IRwx{^GF7%}*)K fNwq8D09wHa#Kj;#d|+l|WcRiRr0%CHi`0 zsd;7kIhjfN1(hWk`FX~AhDQ3unI);Z1&PVoKs7+cKr@T=p@!-eRQ}?y$<0qG%}KQ@ c;sBb@2*kx8*MDGUWMurx#=t0D#0KO70H$y_RR910 literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/__pycache__/setters.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/__pycache__/setters.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b321f5c0c3c2371f556d0bd37eab17260f2e80b GIT binary patch literal 212 zcmX@j%ge<81m(L^Gd+RyV-N=hn4pZ$d_cx@h7^Vr#vF#VOpFYbOq$FuL6Vw`w-~kj zfFw_1NlB4jacW6PYEkh@hR-0$U;g?T`MIh3C5f3?nffL9`8mbRiRr0%CHi`0 zsd;7kIhjfN1(hWk`FX~AhDQ3unI);Z1&PVoKs7+cKr@T=p@!-eRQ}?y$<0qG%}KQ@ c;sBb@2*kx8*MDGUWMurx#=t0D#0KO70J48LcK`qY literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/__pycache__/validators.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/attrs/__pycache__/validators.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23cad207b36fc0d61892a0cc83e19f58290ae130 GIT binary patch literal 218 zcmX@j%ge<81m(L^Gkt*cV-N=hn4pZ$d_cx@h7^Vr#vF#VOpFYbOq$FuL6Vw`w-~kj zfFyrnNlB4jSz=CRN@7WVQSnNK&mj38W`o z`g&!ld1d-JnMwKul_eSZdB%E%M*78>C8@dviOJbOH9*BcV~h0>=IRwx{^GF7%}*)K fNwq8D09wHa#Kj;#d|+l|Wc=3.7 +License-File: LICENSE +Dynamic: author +Dynamic: author-email +Dynamic: classifier +Dynamic: description +Dynamic: home-page +Dynamic: license +Dynamic: license-file +Dynamic: project-url +Dynamic: requires-python +Dynamic: summary + +Certifi: Python SSL Certificates +================================ + +Certifi provides Mozilla's carefully curated collection of Root Certificates for +validating the trustworthiness of SSL certificates while verifying the identity +of TLS hosts. It has been extracted from the `Requests`_ project. + +Installation +------------ + +``certifi`` is available on PyPI. Simply install it with ``pip``:: + + $ pip install certifi + +Usage +----- + +To reference the installed certificate authority (CA) bundle, you can use the +built-in function:: + + >>> import certifi + + >>> certifi.where() + '/usr/local/lib/python3.7/site-packages/certifi/cacert.pem' + +Or from the command line:: + + $ python -m certifi + /usr/local/lib/python3.7/site-packages/certifi/cacert.pem + +Enjoy! + +.. _`Requests`: https://requests.readthedocs.io/en/master/ + +Addition/Removal of Certificates +-------------------------------- + +Certifi does not support any addition/removal or other modification of the +CA trust store content. This project is intended to provide a reliable and +highly portable root of trust to python deployments. Look to upstream projects +for methods to use alternate trust. diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/RECORD b/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/RECORD new file mode 100644 index 0000000..abef4a1 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/RECORD @@ -0,0 +1,14 @@ +certifi-2026.1.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +certifi-2026.1.4.dist-info/METADATA,sha256=FSfJEfKuMo6bJlofUrtRpn4PFTYtbYyXpHN_A3ZFpIY,2473 +certifi-2026.1.4.dist-info/RECORD,, +certifi-2026.1.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91 +certifi-2026.1.4.dist-info/licenses/LICENSE,sha256=6TcW2mucDVpKHfYP5pWzcPBpVgPSH2-D8FPkLPwQyvc,989 +certifi-2026.1.4.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8 +certifi/__init__.py,sha256=969deMMS7Uchipr0oO4dbRBUvRi0uNYCn07VmG1aTrg,94 +certifi/__main__.py,sha256=xBBoj905TUWBLRGANOcf7oi6e-3dMP4cEoG9OyMs11g,243 +certifi/__pycache__/__init__.cpython-312.pyc,, +certifi/__pycache__/__main__.cpython-312.pyc,, +certifi/__pycache__/core.cpython-312.pyc,, +certifi/cacert.pem,sha256=Tzl1_zCrvzVEO0hgZK6Ly0Hf9wf_31dsdtKS-0WKoKk,270954 +certifi/core.py,sha256=XFXycndG5pf37ayeF8N32HUuDafsyhkVMbO4BAPWHa0,3394 +certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/WHEEL b/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/WHEEL new file mode 100644 index 0000000..e7fa31b --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (80.9.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/licenses/LICENSE b/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/licenses/LICENSE new file mode 100644 index 0000000..62b076c --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/licenses/LICENSE @@ -0,0 +1,20 @@ +This package contains a modified version of ca-bundle.crt: + +ca-bundle.crt -- Bundle of CA Root Certificates + +This is a bundle of X.509 certificates of public Certificate Authorities +(CA). These were automatically extracted from Mozilla's root certificates +file (certdata.txt). This file can be found in the mozilla source tree: +https://hg.mozilla.org/mozilla-central/file/tip/security/nss/lib/ckfw/builtins/certdata.txt +It contains the certificates in PEM format and therefore +can be directly used with curl / libcurl / php_curl, or with +an Apache+mod_ssl webserver for SSL client authentication. +Just configure this file as the SSLCACertificateFile.# + +***** BEGIN LICENSE BLOCK ***** +This Source Code Form is subject to the terms of the Mozilla Public License, +v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain +one at http://mozilla.org/MPL/2.0/. + +***** END LICENSE BLOCK ***** +@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $ diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/top_level.txt b/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/top_level.txt new file mode 100644 index 0000000..963eac5 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/top_level.txt @@ -0,0 +1 @@ +certifi diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/__init__.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/__init__.py new file mode 100644 index 0000000..090fd58 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/__init__.py @@ -0,0 +1,4 @@ +from .core import contents, where + +__all__ = ["contents", "where"] +__version__ = "2026.01.04" diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/__main__.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/__main__.py new file mode 100644 index 0000000..8945b5d --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/__main__.py @@ -0,0 +1,12 @@ +import argparse + +from certifi import contents, where + +parser = argparse.ArgumentParser() +parser.add_argument("-c", "--contents", action="store_true") +args = parser.parse_args() + +if args.contents: + print(contents()) +else: + print(where()) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0616c13af98c56e73b497a366b4a1553a6985521 GIT binary patch literal 306 zcmYjLF;2uV5VW0yI}#loLZSi66vVlJs1Q$}piIFkB<5nyi6h%23Kjg|I^Mt=cmfS2 zN&^xV9ny7I;gdjOirv|rS$F6d#|5-r(l)zdVcp zG9dtl0H9?`b6EpCp`|@Vs|#AnicypC8%~XsLep%nA)DDK8nvu$so+<%=}jr?qiC8? z%?&$jvV3kmn&wOye$6QWuekw;ntnAttz>a4*qI7!#QJ}|W6QULF@8q}AHnvbd-eD3 NM{irZ4}sdW+7Ab{QVjqA literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/__pycache__/__main__.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/__pycache__/__main__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28a9639a686fd0b529c826886b9c9633546ef73d GIT binary patch literal 621 zcmZuuO>0v@6utAl-@~+G5JFc$5sjD(+HETcU6bI!eUXXZ<-7JwSNp9wuz@t59I!=8il z69wKw0trf?tD}*k%;*}K*)L2bcTC@~W&u|GLu^O8ZJe9M)( zh*xzy;ti|?Um>=nI`GvrD(4toY6wPXu9^SSTJ9fh+-w=ri;G;4TySac_6Z|D zGI=dZl29eiG#SiTz30-Jt#-+1E{;Hd30yqI{URe+M07y0D2kNhXq$&oPZh?U9g^?h zls?DhNc4+*we#>1=2Vb&8O7Vm!|}W?9EMp$^Dyj`qYG~>E0SSK9o9CnOgpu z2%#Ua{2Okc`OPvsau=6jfvYhc2^Fp gGt+&&{&M}h<-fgmc>kMq^QS_04)4C&WY<;ke-0d%cmMzZ literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/__pycache__/core.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/__pycache__/core.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4079d5dc77f96f4c7dc501b83ddf336cb6c287f7 GIT binary patch literal 2053 zcmbVN&2QsG6dyZI<9w}4TiSH9YN8;Z;Uf{egeV^15WNgT~g zzd%Aga9B?Cwmqy+4;;EGf51xo14!(lA&Y`c4@e-P-ilHQsVCkzwv&dQc+$N0JoDaU z{QLdJ`6(WcAh4|;uz5F*&>#H4Gto`j2ar5O1}Y*$FvN;b6r3m)MI&ZNUrEIP7Rs{M z){RDR{ZoXs+p_rM85Pb5?LvkG+nifjS5Z^%r;1krdbK6%^GD|rJ^y@ zs--KI-bt+0w65`;a&=ryTO@5Vn%1ov!!<^8kyHMD1$&^gk=}hfD{V_m)=Fxs^|BSyl12$yD_*YV-b!LcU~Gah_>r z*~~M`s?fZ)PE~CU4wuhu;@W1uVt$sd@34|pyP11qDo;&@U$1NWI@Hj-i%?#-2nLvJ z#o4~|zN*f)36}#ObOhWkI+2u?lxRqa{gHiku=0!a3gJX&#Z!Lp)2Nf%A&si5W(C_p z?x_y5zWJa$g{fXpcJDJE7RIX_GlV0dla)j6R8KHOZ`F&M#P}f`W4;EkxVKu`%sg3WW5Npj-R7p>HEBQ@Pj-D)OpKUg@4 z4Slot_2Q$&XR+7*RFcPX()p!J404wEXnzb27G*C}$Nal^w8QoiB$R82vz^!b624y{J7|Yg)v$E9 zZvnbPJ1}qr?ARtI6#fcSv$ks4!)CQ^5e8q=9KqDuAUdYqtL$802jC8({5CqrAZeau zxVz%G7xLSk|DkuuB$V)*M7P161q4C(TMP)8A+j5V7L(&-rM>) zF!7f(_50B1?)-pWL$62jTE5WMGB J-V+>X{spH>oOJ*I literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/cacert.pem b/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/cacert.pem new file mode 100644 index 0000000..132db0d --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/cacert.pem @@ -0,0 +1,4468 @@ + +# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2" +# Serial: 1289 +# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b +# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 +# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3" +# Serial: 1478 +# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf +# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 +# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Label: "SwissSign Gold CA - G2" +# Serial: 13492815561806991280 +# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 +# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 +# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +# Subject: CN=SecureTrust CA O=SecureTrust Corporation +# Label: "SecureTrust CA" +# Serial: 17199774589125277788362757014266862032 +# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +# Issuer: CN=Secure Global CA O=SecureTrust Corporation +# Subject: CN=Secure Global CA O=SecureTrust Corporation +# Label: "Secure Global CA" +# Serial: 9751836167731051554232119481456978597 +# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: CN=Certigna O=Dhimyotis +# Subject: CN=Certigna O=Dhimyotis +# Label: "Certigna" +# Serial: 18364802974209362175 +# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Label: "ePKI Root Certification Authority" +# Serial: 28956088682735189655030529057352760477 +# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 +# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 +# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +# Issuer: O=certSIGN OU=certSIGN ROOT CA +# Subject: O=certSIGN OU=certSIGN ROOT CA +# Label: "certSIGN ROOT CA" +# Serial: 35210227249154 +# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 +# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b +# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" +# Serial: 80544274841616 +# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 +# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 +# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Label: "Microsec e-Szigno Root CA 2009" +# Serial: 14014712776195784473 +# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 +# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e +# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=Izenpe.com O=IZENPE S.A. +# Subject: CN=Izenpe.com O=IZENPE S.A. +# Label: "Izenpe.com" +# Serial: 917563065490389241595536686991402621 +# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 +# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 +# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Services Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA" +# Serial: 279744 +# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Label: "TWCA Root Certification Authority" +# Serial: 1 +# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 +# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 +# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Label: "Security Communication RootCA2" +# Serial: 0 +# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 +# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 +# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Label: "Actalis Authentication Root CA" +# Serial: 6271844772424770508 +# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 +# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac +# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 2 Root CA" +# Serial: 2 +# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 +# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 +# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 3 Root CA" +# Serial: 2 +# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec +# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 +# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 3" +# Serial: 1 +# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef +# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 +# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 2009" +# Serial: 623603 +# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f +# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 +# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 EV 2009" +# Serial: 623604 +# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 +# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 +# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R2 O=Disig a.s. +# Subject: CN=CA Disig Root R2 O=Disig a.s. +# Label: "CA Disig Root R2" +# Serial: 10572350602393338211 +# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 +# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 +# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Label: "ACCVRAIZ1" +# Serial: 6828503384748696800 +# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 +# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 +# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE +AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw +CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ +BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND +VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb +qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY +HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo +G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA +lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr +IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ +0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH +k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 +4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO +m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa +cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl +uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI +KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls +ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG +AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT +VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG +CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA +cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA +QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA +7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA +cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA +QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA +czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu +aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt +aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud +DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF +BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp +D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU +JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m +AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD +vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms +tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH +7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA +h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF +d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H +pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA Global Root CA" +# Serial: 3262 +# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 +# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 +# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx +EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT +VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 +NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT +B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF +10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz +0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh +MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH +zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc +46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 +yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi +laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP +oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA +BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE +qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm +4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL +1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF +H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo +RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ +nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh +15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW +6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW +nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j +wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz +aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy +KwbQBM0= +-----END CERTIFICATE----- + +# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Label: "TeliaSonera Root CA v1" +# Serial: 199041966741090107964904287217786801558 +# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c +# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 +# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 2" +# Serial: 1 +# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a +# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 +# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd +AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC +FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi +1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq +jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ +wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ +WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy +NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC +uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw +IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 +g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP +BSeOE6Fuwg== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot 2011 O=Atos +# Subject: CN=Atos TrustedRoot 2011 O=Atos +# Label: "Atos TrustedRoot 2011" +# Serial: 6643877497813316402 +# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 +# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 +# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 1 G3" +# Serial: 687049649626669250736271037606554624078720034195 +# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab +# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 +# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 +MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV +wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe +rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 +68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh +4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp +UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o +abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc +3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G +KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt +hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO +Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt +zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD +ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 +cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN +qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 +YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv +b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 +8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k +NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj +ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp +q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt +nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2 G3" +# Serial: 390156079458959257446133169266079962026824725800 +# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 +# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 +# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 +MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf +qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW +n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym +c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ +O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 +o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j +IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq +IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz +8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh +vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l +7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG +cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD +ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC +roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga +W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n +lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE ++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV +csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd +dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg +KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM +HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 +WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3 G3" +# Serial: 268090761170461462463995952157327242137089239581 +# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 +# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d +# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 +MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR +/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu +FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR +U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c +ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR +FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k +A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw +eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl +sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp +VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q +A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ +ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD +ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI +FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv +oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg +u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP +0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf +3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl +8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ +DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN +PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ +ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G2" +# Serial: 15385348160840213938643033620894905419 +# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d +# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f +# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA +n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc +biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp +EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA +bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu +YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW +BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI +QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I +0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni +lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 +B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv +ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G3" +# Serial: 15459312981008553731928384953135426796 +# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb +# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 +# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg +RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf +Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q +RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD +AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY +JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv +6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G2" +# Serial: 4293743540046975378534879503202253541 +# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G3" +# Serial: 7089244469030293291760083333884364146 +# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Trusted Root G4" +# Serial: 7451500558977370777930084869016614236 +# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 +# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 +# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg +RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y +ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If +xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV +ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO +DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ +jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ +CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi +EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM +fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY +uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK +chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t +9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 +SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd ++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc +fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa +sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N +cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N +0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie +4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI +r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 +/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm +gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ +-----END CERTIFICATE----- + +# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Label: "COMODO RSA Certification Authority" +# Serial: 101909084537582093308941363524873193117 +# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 +# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 +# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z ++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +NVOFBkpdn627G190 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Label: "USERTrust RSA Certification Authority" +# Serial: 2645093764781058787591871645665788717 +# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +jjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Label: "USERTrust ECC Certification Authority" +# Serial: 123013823720199481456569720443997572134 +# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 +# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 +# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl +eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT +JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT +Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg +VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo +I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G +A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB +zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW +RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Label: "GlobalSign ECC Root CA - R5" +# Serial: 32785792099990507226680698011560947931244 +# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 +# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa +# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc +8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke +hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI +KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg +515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO +xwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Label: "IdenTrust Commercial Root CA 1" +# Serial: 13298821034946342390520003877796839426 +# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 +# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 +# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu +VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw +MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw +JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT +3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU ++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp +S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 +bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi +T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL +vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK +Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK +dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT +c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv +l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N +iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD +ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt +LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 +nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 ++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK +W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT +AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq +l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG +4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ +mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A +7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Label: "IdenTrust Public Sector Root CA 1" +# Serial: 13298821034946342390521976156843933698 +# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba +# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd +# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu +VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN +MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 +MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 +ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy +RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS +bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF +/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R +3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw +EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy +9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V +GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ +2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV +WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD +W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN +AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV +DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 +TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G +lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW +mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df +WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 ++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ +tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA +GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv +8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority +# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority +# Label: "CFCA EV ROOT" +# Serial: 407555286 +# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 +# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 +# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD +TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx +MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j +aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP +T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 +sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL +TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 +/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp +7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz +EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt +hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP +a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot +aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg +TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV +PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv +cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL +tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd +BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT +ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL +jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS +ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy +P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 +xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d +Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN +5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe +/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z +AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ +5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GB CA" +# Serial: 157768595616588414422159278966750757568 +# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d +# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed +# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt +MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg +Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i +YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x +CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG +b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 +HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx +WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX +1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk +u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P +99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r +M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB +BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh +cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 +gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO +ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf +aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Label: "SZAFIR ROOT CA2" +# Serial: 357043034767186914217277344587386743377558296292 +# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 +# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de +# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 +ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw +NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L +cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg +Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN +QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT +3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw +3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 +3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 +BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN +XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF +AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw +8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG +nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP +oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy +d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg +LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA 2" +# Serial: 44979900017204383099463764357512596969 +# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 +# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 +# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB +gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu +QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG +A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz +OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ +VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 +b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA +DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn +0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB +OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE +fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E +Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m +o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i +sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW +OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez +Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS +adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n +3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ +F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf +CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 +XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm +djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ +WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb +AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq +P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko +b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj +XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P +5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi +DrW5viSP +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce +# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 +# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix +DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k +IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT +N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v +dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG +A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh +ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx +QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA +4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 +AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 +4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C +ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV +9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD +gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 +Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq +NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko +LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd +ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I +XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI +M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot +9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V +Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea +j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh +X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ +l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf +bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 +pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK +e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 +vm9qp/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef +# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 +# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN +BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl +bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv +b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ +BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj +YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 +MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 +dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg +QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa +jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi +C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep +lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof +TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X1 O=Internet Security Research Group +# Subject: CN=ISRG Root X1 O=Internet Security Research Group +# Label: "ISRG Root X1" +# Serial: 172886928669790476064670243504169061120 +# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e +# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 +# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Label: "AC RAIZ FNMT-RCM" +# Serial: 485876308206448804701554682760554759 +# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d +# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 +# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx +CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ +WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ +BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG +Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ +yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf +BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz +WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF +tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z +374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC +IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL +mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 +wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS +MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 +ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet +UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H +YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 +LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 +RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM +LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf +77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N +JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm +fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp +6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp +1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B +9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok +RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv +uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 1 O=Amazon +# Subject: CN=Amazon Root CA 1 O=Amazon +# Label: "Amazon Root CA 1" +# Serial: 143266978916655856878034712317230054538369994 +# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 +# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 +# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj +ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM +9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw +IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 +VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L +93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm +jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA +A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI +U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs +N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv +o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU +5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy +rqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 2 O=Amazon +# Subject: CN=Amazon Root CA 2 O=Amazon +# Label: "Amazon Root CA 2" +# Serial: 143266982885963551818349160658925006970653239 +# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 +# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a +# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK +gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ +W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg +1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K +8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r +2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me +z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR +8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj +mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz +7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 ++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI +0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm +UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 +LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS +k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl +7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm +btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl +urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ +fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 +n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE +76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H +9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT +4PsJYGw= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 3 O=Amazon +# Subject: CN=Amazon Root CA 3 O=Amazon +# Label: "Amazon Root CA 3" +# Serial: 143266986699090766294700635381230934788665930 +# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 +# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e +# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl +ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr +ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr +BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM +YyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 4 O=Amazon +# Subject: CN=Amazon Root CA 4 O=Amazon +# Label: "Amazon Root CA 4" +# Serial: 143266989758080763974105200630763877849284878 +# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd +# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be +# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi +9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk +M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB +MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw +CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW +1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" +# Serial: 1 +# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 +# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca +# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx +GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp +bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w +KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 +BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy +dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG +EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll +IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU +QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT +TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg +LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 +a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr +LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr +N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X +YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ +iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f +AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH +V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf +IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 +lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c +8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf +lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Label: "GDCA TrustAUTH R5 ROOT" +# Serial: 9009899650740120186 +# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 +# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 +# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE +BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 +MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w +HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj +Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj +TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u +KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj +qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm +MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 +ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP +zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk +L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC +jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA +HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC +AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm +DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 +COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry +L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf +JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg +IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io +2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV +09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ +XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq +T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe +MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Label: "SSL.com Root Certification Authority RSA" +# Serial: 8875640296558310041 +# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 +# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb +# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE +BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK +DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz +OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R +xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX +qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC +C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 +6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh +/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF +YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E +JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc +US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 +ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm ++Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi +M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G +A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV +cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc +Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs +PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ +q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 +cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr +a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I +H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y +K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu +nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf +oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY +Ic2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com Root Certification Authority ECC" +# Serial: 8495723813297216424 +# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e +# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a +# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz +WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 +b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS +b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI +7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg +CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD +VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T +kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ +gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority RSA R2" +# Serial: 6248227494352943350 +# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 +# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a +# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV +BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE +CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy +MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G +A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD +DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq +M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf +OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa +4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 +HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR +aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA +b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ +Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV +PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO +pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu +UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY +MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 +9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW +s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 +Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg +cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM +79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz +/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt +ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm +Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK +QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ +w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi +S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 +mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority ECC" +# Serial: 3182246526754555285 +# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 +# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d +# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx +NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv +bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA +VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku +WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX +5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ +ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg +h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Label: "GlobalSign Root CA - R6" +# Serial: 1417766617973444989252670301619537 +# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae +# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 +# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg +MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx +MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET +MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI +xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k +ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD +aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw +LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw +1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX +k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 +SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h +bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n +WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY +rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce +MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu +bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt +Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 +55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj +vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf +cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz +oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp +nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs +pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v +JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R +8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 +5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GC CA" +# Serial: 44084345621038548146064804565436152554 +# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 +# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 +# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw +CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 +bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg +Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ +BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu +ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS +b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni +eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W +p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T +rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV +57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg +Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +# Issuer: CN=UCA Global G2 Root O=UniTrust +# Subject: CN=UCA Global G2 Root O=UniTrust +# Label: "UCA Global G2 Root" +# Serial: 124779693093741543919145257850076631279 +# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 +# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a +# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH +bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x +CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds +b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr +b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 +kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm +VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R +VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc +C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj +tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY +D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv +j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl +NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 +iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP +O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV +ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj +L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl +1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU +b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV +PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj +y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb +EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg +DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI ++Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy +YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX +UB+K+wb1whnw0A== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Extended Validation Root O=UniTrust +# Subject: CN=UCA Extended Validation Root O=UniTrust +# Label: "UCA Extended Validation Root" +# Serial: 106100277556486529736699587978573607008 +# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 +# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a +# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF +eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx +MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV +BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog +D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS +sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop +O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk +sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi +c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj +VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz +KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ +TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G +sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs +1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD +fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN +l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ +VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 +c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp +4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s +t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj +2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO +vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C +xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx +cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM +fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax +-----END CERTIFICATE----- + +# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Label: "Certigna Root CA" +# Serial: 269714418870597844693661054334862075617 +# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 +# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 +# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw +WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw +MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x +MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD +VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX +BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO +ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M +CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu +I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm +TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh +C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf +ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz +IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT +Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k +JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 +hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB +GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov +L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo +dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr +aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq +hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L +6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG +HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 +0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB +lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi +o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 +gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v +faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 +Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh +jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw +3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign Root CA - G1" +# Serial: 235931866688319308814040 +# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac +# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c +# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD +VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU +ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH +MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO +MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv +Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz +f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO +8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq +d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM +tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt +Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB +o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x +PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM +wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d +GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH +6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby +RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign ECC Root CA - G3" +# Serial: 287880440101571086945156 +# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 +# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 +# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG +EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo +bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ +TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s +b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 +WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS +fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB +zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq +hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB +CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD ++JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Label: "emSign Root CA - C1" +# Serial: 825510296613316004955058 +# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 +# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 +# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG +A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg +SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v +dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ +BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ +HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH +3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH +GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c +xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 +aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq +TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 +/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 +kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG +YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT ++xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo +WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Label: "emSign ECC Root CA - C3" +# Serial: 582948710642506000014504 +# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 +# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 +# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG +EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx +IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND +IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci +MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti +sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O +BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB +Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c +3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J +0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Label: "Hongkong Post Root CA 3" +# Serial: 46170865288971385588281144162979347873371282084 +# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 +# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 +# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 +-----BEGIN CERTIFICATE----- +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 +mpv0 +-----END CERTIFICATE----- + +# Issuer: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation +# Subject: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation +# Label: "Microsoft ECC Root Certificate Authority 2017" +# Serial: 136839042543790627607696632466672567020 +# MD5 Fingerprint: dd:a1:03:e6:4a:93:10:d1:bf:f0:19:42:cb:fe:ed:67 +# SHA1 Fingerprint: 99:9a:64:c3:7f:f4:7d:9f:ab:95:f1:47:69:89:14:60:ee:c4:c3:c5 +# SHA256 Fingerprint: 35:8d:f3:9d:76:4a:f9:e1:b7:66:e9:c9:72:df:35:2e:e1:5c:fa:c2:27:af:6a:d1:d7:0e:8e:4a:6e:dc:ba:02 +-----BEGIN CERTIFICATE----- +MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYD +VQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw +MTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4MjMxNjA0WjBlMQswCQYDVQQGEwJV +UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNy +b3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZR +ogPZnZH6thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYb +hGBKia/teQ87zvH2RPUBeMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBTIy5lycFIM+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3 +FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlfXu5gKcs68tvWMoQZP3zV +L8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaReNtUjGUB +iudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= +-----END CERTIFICATE----- + +# Issuer: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation +# Subject: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation +# Label: "Microsoft RSA Root Certificate Authority 2017" +# Serial: 40975477897264996090493496164228220339 +# MD5 Fingerprint: 10:ff:00:ff:cf:c9:f8:c7:7a:c0:ee:35:8e:c9:0f:47 +# SHA1 Fingerprint: 73:a5:e6:4a:3b:ff:83:16:ff:0e:dc:cc:61:8a:90:6e:4e:ae:4d:74 +# SHA256 Fingerprint: c7:41:f7:0f:4b:2a:8d:88:bf:2e:71:c1:41:22:ef:53:ef:10:eb:a0:cf:a5:e6:4c:fa:20:f4:18:85:30:73:e0 +-----BEGIN CERTIFICATE----- +MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBl +MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw +NAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIwNzE4MjMwMDIzWjBlMQswCQYDVQQG +EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1N +aWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZ +Nt9GkMml7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0 +ZdDMbRnMlfl7rEqUrQ7eS0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1 +HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw71VdyvD/IybLeS2v4I2wDwAW9lcfNcztm +gGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+dkC0zVJhUXAoP8XFWvLJ +jEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49FyGcohJUc +aDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaG +YaRSMLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6 +W6IYZVcSn2i51BVrlMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4K +UGsTuqwPN1q3ErWQgR5WrlcihtnJ0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH ++FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJClTUFLkqqNfs+avNJVgyeY+Q +W5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZC +LgLNFgVZJ8og6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OC +gMNPOsduET/m4xaRhPtthH80dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6 +tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk+ONVFT24bcMKpBLBaYVu32TxU5nh +SnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex/2kskZGT4d9Mozd2 +TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDyAmH3 +pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGR +xpl/j8nWZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiApp +GWSZI1b7rCoucL5mxAyE7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9 +dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKTc0QWbej09+CVgI+WXTik9KveCjCHk9hN +AHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D5KbvtwEwXlGjefVwaaZB +RA+GsCyRxj3qrg+E +-----END CERTIFICATE----- + +# Issuer: CN=e-Szigno Root CA 2017 O=Microsec Ltd. +# Subject: CN=e-Szigno Root CA 2017 O=Microsec Ltd. +# Label: "e-Szigno Root CA 2017" +# Serial: 411379200276854331539784714 +# MD5 Fingerprint: de:1f:f6:9e:84:ae:a7:b4:21:ce:1e:58:7d:d1:84:98 +# SHA1 Fingerprint: 89:d4:83:03:4f:9e:9a:48:80:5f:72:37:d4:a9:a6:ef:cb:7c:1f:d1 +# SHA256 Fingerprint: be:b0:0b:30:83:9b:9b:c3:2c:32:e4:44:79:05:95:06:41:f2:64:21:b1:5e:d0:89:19:8b:51:8a:e2:ea:1b:99 +-----BEGIN CERTIFICATE----- +MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNV +BAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRk +LjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJv +b3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZaFw00MjA4MjIxMjA3MDZaMHExCzAJ +BgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMg +THRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25v +IFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtv +xie+RJCxs1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+H +Wyx7xf58etqjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBSHERUI0arBeAyxr87GyZDvvzAEwDAfBgNVHSMEGDAWgBSHERUI0arB +eAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEAtVfd14pVCzbhhkT61Nlo +jbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxOsvxyqltZ ++efcMQ== +-----END CERTIFICATE----- + +# Issuer: O=CERTSIGN SA OU=certSIGN ROOT CA G2 +# Subject: O=CERTSIGN SA OU=certSIGN ROOT CA G2 +# Label: "certSIGN Root CA G2" +# Serial: 313609486401300475190 +# MD5 Fingerprint: 8c:f1:75:8a:c6:19:cf:94:b7:f7:65:20:87:c3:97:c7 +# SHA1 Fingerprint: 26:f9:93:b4:ed:3d:28:27:b0:b9:4b:a7:e9:15:1d:a3:8d:92:e5:32 +# SHA256 Fingerprint: 65:7c:fe:2f:a7:3f:aa:38:46:25:71:f3:32:a2:36:3a:46:fc:e7:02:09:51:71:07:02:cd:fb:b6:ee:da:33:05 +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV +BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g +Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ +BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ +R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF +dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw +vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ +uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp +n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs +cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW +xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P +rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF +DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx +DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy +LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C +eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ +d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq +kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC +b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl +qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0 +OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c +NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk +ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO +pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj +03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk +PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE +1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX +QRBdJ3NghVdJIgc= +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global Certification Authority" +# Serial: 1846098327275375458322922162 +# MD5 Fingerprint: f8:1c:18:2d:2f:ba:5f:6d:a1:6c:bc:c7:ab:91:c7:0e +# SHA1 Fingerprint: 2f:8f:36:4f:e1:58:97:44:21:59:87:a5:2a:9a:d0:69:95:26:7f:b5 +# SHA256 Fingerprint: 97:55:20:15:f5:dd:fc:3c:87:88:c0:06:94:45:55:40:88:94:45:00:84:f1:00:86:70:86:bc:1a:2b:b5:8d:c8 +-----BEGIN CERTIFICATE----- +MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQsw +CQYDVQQGEwJVUzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28x +ITAfBgNVBAoMGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1 +c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMx +OTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJVUzERMA8GA1UECAwI +SWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +ALldUShLPDeS0YLOvR29zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0Xzn +swuvCAAJWX/NKSqIk4cXGIDtiLK0thAfLdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu +7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4BqstTnoApTAbqOl5F2brz8 +1Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9oWN0EACyW +80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotP +JqX+OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1l +RtzuzWniTY+HKE40Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfw +hI0Vcnyh78zyiGG69Gm7DIwLdVcEuE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10 +coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm+9jaJXLE9gCxInm943xZYkqc +BW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqjifLJS3tBEW1n +twiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1Ud +DwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W +0OhUKDtkLSGm+J1WE2pIPU/HPinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfe +uyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0HZJDmHvUqoai7PF35owgLEQzxPy0Q +lG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla4gt5kNdXElE1GYhB +aCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5RvbbE +sLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPT +MaCm/zjdzyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qe +qu5AvzSxnI9O4fKSTx+O856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxh +VicGaeVyQYHTtgGJoC86cnn+OjC/QezHYj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8 +h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu3R3y4G5OBVixwJAWKqQ9 +EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP29FpHOTK +yeC2nOnOcXHebD8WpHk= +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global ECC P256 Certification Authority" +# Serial: 4151900041497450638097112925 +# MD5 Fingerprint: 5b:44:e3:8d:5d:36:86:26:e8:0d:05:d2:59:a7:83:54 +# SHA1 Fingerprint: b4:90:82:dd:45:0c:be:8b:5b:b1:66:d3:e2:a4:08:26:cd:ed:42:cf +# SHA256 Fingerprint: 94:5b:bc:82:5e:a5:54:f4:89:d1:fd:51:a7:3d:df:2e:a6:24:ac:70:19:a0:52:05:22:5c:22:a7:8c:cf:a8:b4 +-----BEGIN CERTIFICATE----- +MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf +BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 +YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x +NzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYDVQQGEwJVUzERMA8G +A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 +d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF +Q0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqG +SM49AwEHA0IABH77bOYj43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoN +FWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqmP62jQzBBMA8GA1UdEwEB/wQFMAMBAf8w +DwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt0UrrdaVKEJmzsaGLSvcw +CgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjzRM4q3wgh +DDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global ECC P384 Certification Authority" +# Serial: 2704997926503831671788816187 +# MD5 Fingerprint: ea:cf:60:c4:3b:b9:15:29:40:a1:97:ed:78:27:93:d6 +# SHA1 Fingerprint: e7:f3:a3:c8:cf:6f:c3:04:2e:6d:0e:67:32:c5:9e:68:95:0d:5e:d2 +# SHA256 Fingerprint: 55:90:38:59:c8:c0:c3:eb:b8:75:9e:ce:4e:25:57:22:5f:f5:75:8b:bd:38:eb:d4:82:76:60:1e:1b:d5:80:97 +-----BEGIN CERTIFICATE----- +MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf +BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 +YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x +NzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYDVQQGEwJVUzERMA8G +A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 +d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF +Q0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuB +BAAiA2IABGvaDXU1CDFHBa5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJ +j9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr/TklZvFe/oyujUF5nQlgziip04pt89ZF +1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNVHQ8BAf8EBQMDBwYAMB0G +A1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNnADBkAjA3 +AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsC +MGclCrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVu +Sw== +-----END CERTIFICATE----- + +# Issuer: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. +# Subject: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. +# Label: "NAVER Global Root Certification Authority" +# Serial: 9013692873798656336226253319739695165984492813 +# MD5 Fingerprint: c8:7e:41:f6:25:3b:f5:09:b3:17:e8:46:3d:bf:d0:9b +# SHA1 Fingerprint: 8f:6b:f2:a9:27:4a:da:14:a0:c4:f4:8e:61:27:f9:c0:1e:78:5d:d1 +# SHA256 Fingerprint: 88:f4:38:dc:f8:ff:d1:fa:8f:42:91:15:ff:e5:f8:2a:e1:e0:6e:0c:70:c3:75:fa:ad:71:7b:34:a4:9e:72:65 +-----BEGIN CERTIFICATE----- +MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEM +BQAwaTELMAkGA1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRG +T1JNIENvcnAuMTIwMAYDVQQDDClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4NDJaFw0zNzA4MTgyMzU5NTlaMGkx +CzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVTUyBQTEFURk9STSBD +b3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVA +iQqrDZBbUGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH +38dq6SZeWYp34+hInDEW+j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lE +HoSTGEq0n+USZGnQJoViAbbJAh2+g1G7XNr4rRVqmfeSVPc0W+m/6imBEtRTkZaz +kVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2aacp+yPOiNgSnABIqKYP +szuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4Yb8Obtoq +vC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHf +nZ3zVHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaG +YQ5fG8Ir4ozVu53BA0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo +0es+nPxdGoMuK8u180SdOqcXYZaicdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3a +CJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejyYhbLgGvtPe31HzClrkvJE+2K +AQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNVHQ4EFgQU0p+I +36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoN +qo0hV4/GPnrK21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatj +cu3cvuzHV+YwIHHW1xDBE1UBjCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm ++LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bxhYTeodoS76TiEJd6eN4MUZeoIUCL +hr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTgE34h5prCy8VCZLQe +lHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTHD8z7 +p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8 +piKCk5XQA76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLR +LBT/DShycpWbXgnbiUSYqqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX +5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oGI/hGoiLtk/bdmuYqh7GYVPEi92tF4+KO +dh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmgkpzNNIaRkPpkUZ3+/uul +9XXeifdy +-----END CERTIFICATE----- + +# Issuer: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres +# Subject: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres +# Label: "AC RAIZ FNMT-RCM SERVIDORES SEGUROS" +# Serial: 131542671362353147877283741781055151509 +# MD5 Fingerprint: 19:36:9c:52:03:2f:d2:d1:bb:23:cc:dd:1e:12:55:bb +# SHA1 Fingerprint: 62:ff:d9:9e:c0:65:0d:03:ce:75:93:d2:ed:3f:2d:32:c9:e3:e5:4a +# SHA256 Fingerprint: 55:41:53:b1:3d:2c:f9:dd:b7:53:bf:be:1a:4e:0a:e0:8d:0a:a4:18:70:58:fe:60:a2:b8:62:b2:e4:b8:7b:cb +-----BEGIN CERTIFICATE----- +MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQsw +CQYDVQQGEwJFUzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgw +FgYDVQRhDA9WQVRFUy1RMjgyNjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1S +Q00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4MTIyMDA5MzczM1oXDTQzMTIyMDA5 +MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQtUkNNMQ4wDAYDVQQL +DAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNBQyBS +QUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LH +sbI6GA60XYyzZl2hNPk2LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oK +Um8BA06Oi6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqGSM49BAMDA2kAMGYCMQCu +SuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoDzBOQn5IC +MQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJy +v+c= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign Root R46 O=GlobalSign nv-sa +# Subject: CN=GlobalSign Root R46 O=GlobalSign nv-sa +# Label: "GlobalSign Root R46" +# Serial: 1552617688466950547958867513931858518042577 +# MD5 Fingerprint: c4:14:30:e4:fa:66:43:94:2a:6a:1b:24:5f:19:d0:ef +# SHA1 Fingerprint: 53:a2:b0:4b:ca:6b:d6:45:e6:39:8a:8e:c4:0d:d2:bf:77:c3:a2:90 +# SHA256 Fingerprint: 4f:a3:12:6d:8d:3a:11:d1:c4:85:5a:4f:80:7c:ba:d6:cf:91:9d:3a:5a:88:b0:3b:ea:2c:63:72:d9:3c:40:c9 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUA +MEYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYD +VQQDExNHbG9iYWxTaWduIFJvb3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMy +MDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYt +c2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08EsCVeJ +OaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQG +vGIFAha/r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud +316HCkD7rRlr+/fKYIje2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo +0q3v84RLHIf8E6M6cqJaESvWJ3En7YEtbWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSE +y132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvjK8Cd+RTyG/FWaha/LIWF +zXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD412lPFzYE ++cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCN +I/onccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzs +x2sZy/N78CsHpdlseVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqa +ByFrgY/bxFn63iLABJzjqls2k+g9vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC +4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEMBQADggIBAHx4 +7PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg +JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti +2kM3S+LGteWygxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIk +pnnpHs6i58FZFZ8d4kuaPp92CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRF +FRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZmOUdkLG5NrmJ7v2B0GbhWrJKsFjLt +rWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qqJZ4d16GLuc1CLgSk +ZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwyeqiv5 +u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP +4vkYxboznxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6 +N3ec592kD3ZDZopD8p/7DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3 +vouXsXgxT7PntgMTzlSdriVZzH81Xwj3QEUxeCp6 +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign Root E46 O=GlobalSign nv-sa +# Subject: CN=GlobalSign Root E46 O=GlobalSign nv-sa +# Label: "GlobalSign Root E46" +# Serial: 1552617690338932563915843282459653771421763 +# MD5 Fingerprint: b5:b8:66:ed:de:08:83:e3:c9:e2:01:34:06:ac:51:6f +# SHA1 Fingerprint: 39:b4:6c:d5:fe:80:06:eb:e2:2f:4a:bb:08:33:a0:af:db:b9:dd:84 +# SHA256 Fingerprint: cb:b9:c4:4d:84:b8:04:3e:10:50:ea:31:a6:9f:51:49:55:d7:bf:d2:e2:c6:b4:93:01:01:9a:d6:1d:9f:50:58 +-----BEGIN CERTIFICATE----- +MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYx +CzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQD +ExNHbG9iYWxTaWduIFJvb3QgRTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAw +MDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex +HDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkBjtjq +R+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGdd +yXqBPCCjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBQxCpCPtsad0kRLgLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ +7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZkvLtoURMMA/cVi4RguYv/Uo7njLwcAjA8 ++RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+CAezNIm8BZ/3Hobui3A= +-----END CERTIFICATE----- + +# Issuer: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz +# Subject: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz +# Label: "ANF Secure Server Root CA" +# Serial: 996390341000653745 +# MD5 Fingerprint: 26:a6:44:5a:d9:af:4e:2f:b2:1d:b6:65:b0:4e:e8:96 +# SHA1 Fingerprint: 5b:6e:68:d0:cc:15:b6:a0:5f:1e:c1:5f:ae:02:fc:6b:2f:5d:6f:74 +# SHA256 Fingerprint: fb:8f:ec:75:91:69:b9:10:6b:1e:51:16:44:c6:18:c5:13:04:37:3f:6c:06:43:08:8d:8b:ef:fd:1b:99:75:99 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Subject: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Label: "Certum EC-384 CA" +# Serial: 160250656287871593594747141429395092468 +# MD5 Fingerprint: b6:65:b3:96:60:97:12:a1:ec:4e:e1:3d:a3:c6:c9:f1 +# SHA1 Fingerprint: f3:3e:78:3c:ac:df:f4:a2:cc:ac:67:55:69:56:d7:e5:16:3c:e1:ed +# SHA256 Fingerprint: 6b:32:80:85:62:53:18:aa:50:d1:73:c9:8d:8b:da:09:d5:7e:27:41:3d:11:4c:f7:87:a0:f5:d0:6c:03:0c:f6 +-----BEGIN CERTIFICATE----- +MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQsw +CQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScw +JQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMT +EENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2MDcyNDU0WhcNNDMwMzI2MDcyNDU0 +WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBT +LkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAX +BgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATE +KI6rGFtqvm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7Tm +Fy8as10CW4kjPMIRBSqniBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68Kj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI0GZnQkdjrzife81r1HfS+8 +EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjADVS2m5hjEfO/J +UG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0QoSZ/6vn +nvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Root CA" +# Serial: 40870380103424195783807378461123655149 +# MD5 Fingerprint: 51:e1:c2:e7:fe:4c:84:af:59:0e:2f:f4:54:6f:ea:29 +# SHA1 Fingerprint: c8:83:44:c0:18:ae:9f:cc:f1:87:b7:8f:22:d1:c5:d7:45:84:ba:e5 +# SHA256 Fingerprint: fe:76:96:57:38:55:77:3e:37:a9:5e:7a:d4:d9:cc:96:c3:01:57:c1:5d:31:76:5b:a9:b1:57:04:e1:ae:78:fd +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique +# Subject: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique +# Label: "TunTrust Root CA" +# Serial: 108534058042236574382096126452369648152337120275 +# MD5 Fingerprint: 85:13:b9:90:5b:36:5c:b6:5e:b8:5a:f8:e0:31:57:b4 +# SHA1 Fingerprint: cf:e9:70:84:0f:e0:73:0f:9d:f6:0c:7f:2c:4b:ee:20:46:34:9c:bb +# SHA256 Fingerprint: 2e:44:10:2a:b5:8c:b8:54:19:45:1c:8e:19:d9:ac:f3:66:2c:af:bc:61:4b:6a:53:96:0a:30:f7:d0:e2:eb:41 +-----BEGIN CERTIFICATE----- +MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQEL +BQAwYTELMAkGA1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUg +Q2VydGlmaWNhdGlvbiBFbGVjdHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJv +b3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQwNDI2MDg1NzU2WjBhMQswCQYDVQQG +EwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBDZXJ0aWZpY2F0aW9u +IEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZ +n56eY+hz2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd +2JQDoOw05TDENX37Jk0bbjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgF +VwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZ +GoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAdgjH8KcwAWJeRTIAAHDOF +li/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViWVSHbhlnU +r8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2 +eY8fTpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIb +MlEsPvLfe/ZdeikZjuXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISg +jwBUFfyRbVinljvrS5YnzWuioYasDXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB +7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwSVXAkPcvCFDVDXSdOvsC9qnyW +5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI04Y+oXNZtPdE +ITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0 +90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+z +xiD2BkewhpMl0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYu +QEkHDVneixCwSQXi/5E/S7fdAo74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4 +FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRYYdZ2vyJ/0Adqp2RT8JeNnYA/u8EH +22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJpadbGNjHh/PqAulxP +xOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65xxBzn +dFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5 +Xc0yGYuPjCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7b +nV2UqL1g52KAdoGDDIzMMEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQ +CvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9zZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZH +u/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3rAZ3r2OvEhJn7wAzMMujj +d9qDRIueVSjAi1jTkD5OGwDxFa2DK5o= +-----END CERTIFICATE----- + +# Issuer: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Subject: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Label: "HARICA TLS RSA Root CA 2021" +# Serial: 76817823531813593706434026085292783742 +# MD5 Fingerprint: 65:47:9b:58:86:dd:2c:f0:fc:a2:84:1f:1e:96:c4:91 +# SHA1 Fingerprint: 02:2d:05:82:fa:88:ce:14:0c:06:79:de:7f:14:10:e9:45:d7:a5:6d +# SHA256 Fingerprint: d9:5d:0e:8e:da:79:52:5b:f9:be:b1:1b:14:d2:10:0d:32:94:98:5f:0c:62:d9:fa:bd:9c:d9:99:ec:cb:7b:1d +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBs +MQswCQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0Eg +Um9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUzOFoXDTQ1MDIxMzEwNTUzN1owbDEL +MAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNBIFJv +b3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569l +mwVnlskNJLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE +4VGC/6zStGndLuwRo0Xua2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uv +a9of08WRiFukiZLRgeaMOVig1mlDqa2YUlhu2wr7a89o+uOkXjpFc5gH6l8Cct4M +pbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K5FrZx40d/JiZ+yykgmvw +Kh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEvdmn8kN3b +LW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcY +AuUR0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqB +AGMUuTNe3QvboEUHGjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYq +E613TBoYm5EPWNgGVMWX+Ko/IIqmhaZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHr +W2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQCPxrvrNQKlr9qEgYRtaQQJKQ +CoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAU +X15QvWiWkKQUEapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3 +f5Z2EMVGpdAgS1D0NTsY9FVqQRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxaja +H6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxDQpSbIPDRzbLrLFPCU3hKTwSUQZqP +JzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcRj88YxeMn/ibvBZ3P +zzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5vZSt +jBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0 +/L5H9MG0qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pT +BGIBnfHAT+7hOtSLIBD6Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79 +aPib8qXPMThcFarmlwDB31qlpzmq6YR/PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YW +xw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnnkf3/W9b3raYvAwtt41dU +63ZTGI0RmLo= +-----END CERTIFICATE----- + +# Issuer: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Subject: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Label: "HARICA TLS ECC Root CA 2021" +# Serial: 137515985548005187474074462014555733966 +# MD5 Fingerprint: ae:f7:4c:e5:66:35:d1:b7:9b:8c:22:93:74:d3:4b:b0 +# SHA1 Fingerprint: bc:b0:c1:9d:e9:98:92:70:19:38:57:e9:8d:a7:b4:5d:6e:ee:01:48 +# SHA256 Fingerprint: 3f:99:cc:47:4a:cf:ce:4d:fe:d5:87:94:66:5e:47:8d:15:47:73:9f:2e:78:0f:1b:b4:ca:9b:13:30:97:d4:01 +-----BEGIN CERTIFICATE----- +MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQsw +CQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2Vh +cmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9v +dCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoXDTQ1MDIxMzExMDEwOVowbDELMAkG +A1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJvb3Qg +Q0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7 +KKrxcm1lAEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9Y +STHMmE5gEYd103KUkE+bECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQD +AgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAircJRQO9gcS3ujwLEXQNw +SaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/QwCZ61IygN +nxS2PFOiTAZpffpskcYqSUXm7LcT4Tps +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 1977337328857672817 +# MD5 Fingerprint: 4e:6e:9b:54:4c:ca:b7:fa:48:e4:90:b1:15:4b:1c:a3 +# SHA1 Fingerprint: 0b:be:c2:27:22:49:cb:39:aa:db:35:5c:53:e3:8c:ae:78:ff:b6:fe +# SHA256 Fingerprint: 57:de:05:83:ef:d2:b2:6e:03:61:da:99:da:9d:f4:64:8d:ef:7e:e8:44:1c:3b:72:8a:fa:9b:cd:e0:f9:b2:6a +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1 +MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1UdDgQWBBRlzeurNR4APn7VdMAc +tHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4wgZswgZgGBFUd +IAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j +b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABC +AG8AbgBhAG4AbwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAw +ADEANzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9m +iWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL4QjbEwj4KKE1soCzC1HA01aajTNF +Sa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDbLIpgD7dvlAceHabJ +hfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1ilI45P +Vf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZE +EAEeiGaPcjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV +1aUsIC+nmCjuRfzxuIgALI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2t +CsvMo2ebKHTEm9caPARYpoKdrcd7b/+Alun4jWq9GJAd/0kakFI3ky88Al2CdgtR +5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH9IBk9W6VULgRfhVwOEqw +f9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpfNIbnYrX9 +ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNK +GbqEZycPvEJdvSRUDewdcAZfpLz6IHxV +-----END CERTIFICATE----- + +# Issuer: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd. +# Subject: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd. +# Label: "vTrus ECC Root CA" +# Serial: 630369271402956006249506845124680065938238527194 +# MD5 Fingerprint: de:4b:c1:f5:52:8c:9b:43:e1:3e:8f:55:54:17:8d:85 +# SHA1 Fingerprint: f6:9c:db:b0:fc:f6:02:13:b6:52:32:a6:a3:91:3f:16:70:da:c3:e1 +# SHA256 Fingerprint: 30:fb:ba:2c:32:23:8e:2a:98:54:7a:f9:79:31:e5:50:42:8b:9b:3f:1c:8e:eb:66:33:dc:fa:86:c5:b2:7d:d3 +-----BEGIN CERTIFICATE----- +MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMw +RzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAY +BgNVBAMTEXZUcnVzIEVDQyBSb290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDcz +MTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28u +LEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+cToL0 +v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUd +e4BdS49nTPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIw +V53dVvHH4+m4SVBrm2nDb+zDfSXkV5UTQJtS0zvzQBm8JsctBp61ezaf9SXUY2sA +AjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQLYgmRWAD5Tfs0aNoJrSEG +GJTO +-----END CERTIFICATE----- + +# Issuer: CN=vTrus Root CA O=iTrusChina Co.,Ltd. +# Subject: CN=vTrus Root CA O=iTrusChina Co.,Ltd. +# Label: "vTrus Root CA" +# Serial: 387574501246983434957692974888460947164905180485 +# MD5 Fingerprint: b8:c9:37:df:fa:6b:31:84:64:c5:ea:11:6a:1b:75:fc +# SHA1 Fingerprint: 84:1a:69:fb:f5:cd:1a:25:34:13:3d:e3:f8:fc:b8:99:d0:c9:14:b7 +# SHA256 Fingerprint: 8a:71:de:65:59:33:6f:42:6c:26:e5:38:80:d0:0d:88:a1:8d:a4:c6:a9:1f:0d:cb:61:94:e2:06:c5:c9:63:87 +-----BEGIN CERTIFICATE----- +MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQEL +BQAwQzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4x +FjAUBgNVBAMTDXZUcnVzIFJvb3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMx +MDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoGA1UEChMTaVRydXNDaGluYSBDby4s +THRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZotsSKYc +IrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykU +AyyNJJrIZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+ +GrPSbcKvdmaVayqwlHeFXgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z9 +8Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KAYPxMvDVTAWqXcoKv8R1w6Jz1717CbMdH +flqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70kLJrxLT5ZOrpGgrIDajt +J8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2AXPKBlim +0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZN +pGvu/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQ +UqqzApVg+QxMaPnu1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHW +OXSuTEGC2/KmSNGzm/MzqvOmwMVO9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMB +AAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYgscasGrz2iTAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAKbqSSaet +8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd +nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1j +bhd47F18iMjrjld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvM +Kar5CKXiNxTKsbhm7xqC5PD48acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIiv +TDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJnxDHO2zTlJQNgJXtxmOTAGytfdELS +S8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554WgicEFOwE30z9J4nfr +I8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4sEb9 +b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNB +UvupLnKWnyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1P +Ti07NEPhmg4NpGaXutIcSkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929ven +sBxXVsFy6K2ir40zSbofitzmdHxghm+Hl3s= +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X2 O=Internet Security Research Group +# Subject: CN=ISRG Root X2 O=Internet Security Research Group +# Label: "ISRG Root X2" +# Serial: 87493402998870891108772069816698636114 +# MD5 Fingerprint: d3:9e:c4:1e:23:3c:a6:df:cf:a3:7e:6d:e0:14:e6:e5 +# SHA1 Fingerprint: bd:b1:b9:3c:d5:97:8d:45:c6:26:14:55:f8:db:95:c7:5a:d1:53:af +# SHA256 Fingerprint: 69:72:9b:8e:15:a8:6e:fc:17:7a:57:af:b7:17:1d:fc:64:ad:d2:8c:2f:ca:8c:f1:50:7e:34:45:3c:cb:14:70 +-----BEGIN CERTIFICATE----- +MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw +CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg +R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00 +MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT +ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw +EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW ++1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9 +ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI +zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW +tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1 +/q4AaOeMSQ+2b1tbFfLn +-----END CERTIFICATE----- + +# Issuer: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd. +# Subject: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd. +# Label: "HiPKI Root CA - G1" +# Serial: 60966262342023497858655262305426234976 +# MD5 Fingerprint: 69:45:df:16:65:4b:e8:68:9a:8f:76:5f:ff:80:9e:d3 +# SHA1 Fingerprint: 6a:92:e4:a8:ee:1b:ec:96:45:37:e3:29:57:49:cd:96:e3:e5:d2:60 +# SHA256 Fingerprint: f0:15:ce:3c:c2:39:bf:ef:06:4b:e9:f1:d2:c4:17:e1:a0:26:4a:0a:94:be:1f:0c:8d:12:18:64:eb:69:49:cc +-----BEGIN CERTIFICATE----- +MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBP +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xGzAZBgNVBAMMEkhpUEtJIFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRa +Fw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3 +YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kgUm9vdCBDQSAtIEcx +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0o9Qw +qNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twv +Vcg3Px+kwJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6 +lZgRZq2XNdZ1AYDgr/SEYYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnz +Qs7ZngyzsHeXZJzA9KMuH5UHsBffMNsAGJZMoYFL3QRtU6M9/Aes1MU3guvklQgZ +KILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfdhSi8MEyr48KxRURHH+CK +FgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj1jOXTyFj +HluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDr +y+K49a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ +/W3c1pzAtH2lsN0/Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgM +a/aOEmem8rJY5AIJEzypuxC00jBF8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6 +fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQDAgGGMA0GCSqG +SIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi +7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqc +SE5XCV0vrPSltJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6Fza +ZsT0pPBWGTMpWmWSBUdGSquEwx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9Tc +XzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07QJNBAsNB1CI69aO4I1258EHBGG3zg +iLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv5wiZqAxeJoBF1Pho +L5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+GpzjLrF +Ne85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wr +kkVbbiVghUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+ +vhV4nYWBSipX3tUZQ9rbyltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQU +YDksswBVLuT1sw5XxJFBAJw/6KXf6vb/yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Label: "GlobalSign ECC Root CA - R4" +# Serial: 159662223612894884239637590694 +# MD5 Fingerprint: 26:29:f8:6d:e1:88:bf:a2:65:7f:aa:c4:cd:0f:7f:fc +# SHA1 Fingerprint: 6b:a0:b0:98:e1:71:ef:5a:ad:fe:48:15:80:77:10:f4:bd:6f:0b:28 +# SHA256 Fingerprint: b0:85:d7:0b:96:4f:19:1a:73:e4:af:0d:54:ae:7a:0e:07:aa:fd:af:9b:71:dd:08:62:13:8a:b7:32:5a:24:a2 +-----BEGIN CERTIFICATE----- +MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYD +VQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgw +MTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0g +UjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wWTAT +BgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkWymOx +uYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNV +HQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/ ++wpu+74zyTyjhNUwCgYIKoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147 +bmF0774BxL4YSFlhgjICICadVGNA3jdgUM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R1 O=Google Trust Services LLC +# Subject: CN=GTS Root R1 O=Google Trust Services LLC +# Label: "GTS Root R1" +# Serial: 159662320309726417404178440727 +# MD5 Fingerprint: 05:fe:d0:bf:71:a8:a3:76:63:da:01:e0:d8:52:dc:40 +# SHA1 Fingerprint: e5:8c:1c:c4:91:3b:38:63:4b:e9:10:6e:e3:ad:8e:6b:9d:d9:81:4a +# SHA256 Fingerprint: d9:47:43:2a:bd:e7:b7:fa:90:fc:2e:6b:59:10:1b:12:80:e0:e1:c7:e4:e4:0f:a3:c6:88:7f:ff:57:a7:f4:cf +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo +27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7w +Cl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjw +TcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl +qAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaH +szVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8 +Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmk +MiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 +wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70p +aDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrN +VjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQID +AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb +C5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe +QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuy +h6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4 +7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J +ZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef +MgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/ +Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT +6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ +0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm +2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb +bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R2 O=Google Trust Services LLC +# Subject: CN=GTS Root R2 O=Google Trust Services LLC +# Label: "GTS Root R2" +# Serial: 159662449406622349769042896298 +# MD5 Fingerprint: 1e:39:c0:53:e6:1e:29:82:0b:ca:52:55:36:5d:57:dc +# SHA1 Fingerprint: 9a:44:49:76:32:db:de:fa:d0:bc:fb:5a:7b:17:bd:9e:56:09:24:94 +# SHA256 Fingerprint: 8d:25:cd:97:22:9d:bf:70:35:6b:da:4e:b3:cc:73:40:31:e2:4c:f0:0f:af:cf:d3:2d:c7:6e:b5:84:1c:7e:a8 +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3LvCvpt +nfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY +6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAu +MC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7k +RXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWg +f9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1mKPV ++3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K8Yzo +dDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW +Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKa +G73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCq +gc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwID +AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBAB/Kzt3H +vqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 +0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyC +B19m3H0Q/gxhswWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2u +NmSRXbBoGOqKYcl3qJfEycel/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMg +yALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVnjWQye+mew4K6Ki3pHrTgSAai/Gev +HyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y59PYjJbigapordwj6 +xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M7YNR +TOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924Sg +JPFI/2R80L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV +7LXTWtiBmelDGDfrs7vRWGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl +6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjWHYbL +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R3 O=Google Trust Services LLC +# Subject: CN=GTS Root R3 O=Google Trust Services LLC +# Label: "GTS Root R3" +# Serial: 159662495401136852707857743206 +# MD5 Fingerprint: 3e:e7:9d:58:02:94:46:51:94:e5:e0:22:4a:8b:e7:73 +# SHA1 Fingerprint: ed:e5:71:80:2b:c8:92:b9:5b:83:3c:d2:32:68:3f:09:cd:a0:1e:46 +# SHA256 Fingerprint: 34:d8:a7:3e:e2:08:d9:bc:db:0d:95:65:20:93:4b:4e:40:e6:94:82:59:6e:8b:6f:73:c8:42:6b:01:0a:6f:48 +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYD +VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG +A1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw +WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz +IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout736G +jOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL2 +4CejQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7 +VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azTL818+FsuVbu/3ZL3pAzcMeGiAjEA/Jdm +ZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV11RZt+cRLInUue4X +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R4 O=Google Trust Services LLC +# Subject: CN=GTS Root R4 O=Google Trust Services LLC +# Label: "GTS Root R4" +# Serial: 159662532700760215368942768210 +# MD5 Fingerprint: 43:96:83:77:19:4d:76:b3:9d:65:52:e4:1d:22:a5:e8 +# SHA1 Fingerprint: 77:d3:03:67:b5:e0:0c:15:f6:0c:38:61:df:7c:e1:3b:92:46:4d:47 +# SHA256 Fingerprint: 34:9d:fa:40:58:c5:e2:63:12:3b:39:8a:e7:95:57:3c:4e:13:13:c8:3f:e6:8f:93:55:6c:d5:e8:03:1b:3c:7d +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYD +VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG +A1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw +WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz +IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzuhXyi +QHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvR +HYqjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D +9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/Cr8deVl5c1RxYIigL9zC2L7F8AjEA8GE8 +p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh4rsUecrNIdSUtUlD +-----END CERTIFICATE----- + +# Issuer: CN=Telia Root CA v2 O=Telia Finland Oyj +# Subject: CN=Telia Root CA v2 O=Telia Finland Oyj +# Label: "Telia Root CA v2" +# Serial: 7288924052977061235122729490515358 +# MD5 Fingerprint: 0e:8f:ac:aa:82:df:85:b1:f4:dc:10:1c:fc:99:d9:48 +# SHA1 Fingerprint: b9:99:cd:d1:73:50:8a:c4:47:05:08:9c:8c:88:fb:be:a0:2b:40:cd +# SHA256 Fingerprint: 24:2b:69:74:2f:cb:1e:5b:2a:bf:98:89:8b:94:57:21:87:54:4e:5b:4d:99:11:78:65:73:62:1f:6a:74:b8:2c +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQx +CzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UE +AwwQVGVsaWEgUm9vdCBDQSB2MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1 +NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZ +MBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ76zBq +AMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9 +vVYiQJ3q9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9 +lRdU2HhE8Qx3FZLgmEKnpNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTOD +n3WhUidhOPFZPY5Q4L15POdslv5e2QJltI5c0BE0312/UqeBAMN/mUWZFdUXyApT +7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW5olWK8jjfN7j/4nlNW4o +6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNrRBH0pUPC +TEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6 +WT0EBXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63R +DolUK5X6wK0dmBR4M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZI +pEYslOqodmJHixBTB0hXbOKSTbauBcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGj +YzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7Wxy+G2CQ5MB0GA1UdDgQWBBRy +rOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ +8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi +0f6X+J8wfBj5tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMM +A8iZGok1GTzTyVR8qPAs5m4HeW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBS +SRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+Cy748fdHif64W1lZYudogsYMVoe+K +TTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygCQMez2P2ccGrGKMOF +6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15h2Er +3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMt +Ty3EHD70sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pT +VmBds9hCG1xLEooc6+t9xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAW +ysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQraVplI/owd8k+BsHMYeB2F326CjYSlKA +rBPuUBQemMc= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH +# Subject: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH +# Label: "D-TRUST BR Root CA 1 2020" +# Serial: 165870826978392376648679885835942448534 +# MD5 Fingerprint: b5:aa:4b:d5:ed:f7:e3:55:2e:8f:72:0a:f3:75:b8:ed +# SHA1 Fingerprint: 1f:5b:98:f0:e3:b5:f7:74:3c:ed:e6:b0:36:7d:32:cd:f4:09:41:67 +# SHA256 Fingerprint: e5:9a:aa:81:60:09:c2:2b:ff:5b:25:ba:d3:7d:f3:06:f0:49:79:7c:1f:81:d8:5a:b0:89:e6:57:bd:8f:00:44 +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQsw +CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS +VVNUIEJSIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5 +NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG +A1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB +BAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7dPYS +zuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0 +QVK5buXuQqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/ +VbNafAkl1bK6CKBrqx9tMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g +PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2JyX3Jvb3Rf +Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l +dC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 +c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO +PQQDAwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFW +wKrY7RjEsK70PvomAjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHV +dWNbFJWcHwHP2NVypw87 +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH +# Subject: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH +# Label: "D-TRUST EV Root CA 1 2020" +# Serial: 126288379621884218666039612629459926992 +# MD5 Fingerprint: 8c:2d:9d:70:9f:48:99:11:06:11:fb:e9:cb:30:c0:6e +# SHA1 Fingerprint: 61:db:8c:21:59:69:03:90:d8:7c:9c:12:86:54:cf:9d:3d:f4:dd:07 +# SHA256 Fingerprint: 08:17:0d:1a:a3:64:53:90:1a:2f:95:92:45:e3:47:db:0c:8d:37:ab:aa:bc:56:b8:1a:a1:00:dc:95:89:70:db +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQsw +CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS +VVNUIEVWIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5 +NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG +A1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB +BAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8ZRCC +/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rD +wpdhQntJraOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3 +OqQo5FD4pPfsazK2/umLMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g +PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2V2X3Jvb3Rf +Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l +dC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 +c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO +PQQDAwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CA +y/m0sRtW9XLS/BnRAjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJb +gfM0agPnIjhQW+0ZT0MW +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert TLS ECC P384 Root G5 O=DigiCert, Inc. +# Subject: CN=DigiCert TLS ECC P384 Root G5 O=DigiCert, Inc. +# Label: "DigiCert TLS ECC P384 Root G5" +# Serial: 13129116028163249804115411775095713523 +# MD5 Fingerprint: d3:71:04:6a:43:1c:db:a6:59:e1:a8:a3:aa:c5:71:ed +# SHA1 Fingerprint: 17:f3:de:5e:9f:0f:19:e9:8e:f6:1f:32:26:6e:20:c4:07:ae:30:ee +# SHA256 Fingerprint: 01:8e:13:f0:77:25:32:cf:80:9b:d1:b1:72:81:86:72:83:fc:48:c6:e1:3b:e9:c6:98:12:85:4a:49:0c:1b:05 +-----BEGIN CERTIFICATE----- +MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURp +Z2lDZXJ0IFRMUyBFQ0MgUDM4NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2 +MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJ +bmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQgUm9vdCBHNTB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1TzvdlHJS +7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp +0zVozptjn4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICIS +B4CIfBFqMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49 +BAMDA2gAMGUCMQCJao1H5+z8blUD2WdsJk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQ +LgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIxAJSdYsiJvRmEFOml+wG4 +DXZDjC5Ty3zfDBeWUA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert TLS RSA4096 Root G5 O=DigiCert, Inc. +# Subject: CN=DigiCert TLS RSA4096 Root G5 O=DigiCert, Inc. +# Label: "DigiCert TLS RSA4096 Root G5" +# Serial: 11930366277458970227240571539258396554 +# MD5 Fingerprint: ac:fe:f7:34:96:a9:f2:b3:b4:12:4b:e4:27:41:6f:e1 +# SHA1 Fingerprint: a7:88:49:dc:5d:7c:75:8c:8c:de:39:98:56:b3:aa:d0:b2:a5:71:35 +# SHA256 Fingerprint: 37:1a:00:dc:05:33:b3:72:1a:7e:eb:40:e8:41:9e:70:79:9d:2b:0a:0f:2c:1d:80:69:31:65:f7:ce:c4:ad:75 +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBN +MQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMT +HERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcN +NDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQs +IEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS87IE+ +ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG0 +2C+JFvuUAT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgp +wgscONyfMXdcvyej/Cestyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZM +pG2T6T867jp8nVid9E6P/DsjyG244gXazOvswzH016cpVIDPRFtMbzCe88zdH5RD +nU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnVDdXifBBiqmvwPXbzP6Po +sMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9qTXeXAaDx +Zre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cd +Lvvyz6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvX +KyY//SovcfXWJL5/MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNe +XoVPzthwiHvOAbWWl9fNff2C+MIkwcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPL +tgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4EFgQUUTMc7TZArxfTJc1paPKv +TiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN +AQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw +GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7H +PNtQOa27PShNlnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLF +O4uJ+DQtpBflF+aZfTCIITfNMBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQ +REtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/u4cnYiWB39yhL/btp/96j1EuMPik +AdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9GOUrYU9DzLjtxpdRv +/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh47a+ +p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilw +MUc/dNAUFvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WF +qUITVuwhd4GTWgzqltlJyqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCK +ovfepEWFJqgejF0pW8hL2JpqA15w8oVPbEtoL8pU9ozaMv7Da4M/OMZ+ +-----END CERTIFICATE----- + +# Issuer: CN=Certainly Root R1 O=Certainly +# Subject: CN=Certainly Root R1 O=Certainly +# Label: "Certainly Root R1" +# Serial: 188833316161142517227353805653483829216 +# MD5 Fingerprint: 07:70:d4:3e:82:87:a0:fa:33:36:13:f4:fa:33:e7:12 +# SHA1 Fingerprint: a0:50:ee:0f:28:71:f4:27:b2:12:6d:6f:50:96:25:ba:cc:86:42:af +# SHA256 Fingerprint: 77:b8:2c:d8:64:4c:43:05:f7:ac:c5:cb:15:6b:45:67:50:04:03:3d:51:c6:0c:62:02:a8:e0:c3:34:67:d3:a0 +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAw +PTELMAkGA1UEBhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2Vy +dGFpbmx5IFJvb3QgUjEwHhcNMjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9 +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0 +YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANA2 +1B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O5MQT +vqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbed +aFySpvXl8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b0 +1C7jcvk2xusVtyWMOvwlDbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5 +r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGIXsXwClTNSaa/ApzSRKft43jvRl5tcdF5 +cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkNKPl6I7ENPT2a/Z2B7yyQ +wHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQAjeZjOVJ +6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA +2CnbrlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyH +Wyf5QBGenDPBt+U1VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMR +eiFPCyEQtkA6qyI6BJyLm4SGcprSp6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB +/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTgqj8ljZ9EXME66C6u +d0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAszHQNTVfSVcOQr +PbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d +8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi +1wrykXprOQ4vMMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrd +rRT90+7iIgXr0PK3aBLXWopBGsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9di +taY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+gjwN/KUD+nsa2UUeYNrEjvn8K8l7 +lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgHJBu6haEaBQmAupVj +yTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7fpYn +Kx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLy +yCwzk5Iwx06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5n +wXARPbv0+Em34yaXOp/SX3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6 +OV+KmalBWQewLK8= +-----END CERTIFICATE----- + +# Issuer: CN=Certainly Root E1 O=Certainly +# Subject: CN=Certainly Root E1 O=Certainly +# Label: "Certainly Root E1" +# Serial: 8168531406727139161245376702891150584 +# MD5 Fingerprint: 0a:9e:ca:cd:3e:52:50:c6:36:f3:4b:a3:ed:a7:53:e9 +# SHA1 Fingerprint: f9:e1:6d:dc:01:89:cf:d5:82:45:63:3e:c5:37:7d:c2:eb:93:6f:2b +# SHA256 Fingerprint: b4:58:5f:22:e4:ac:75:6a:4e:86:12:a1:36:1c:5d:9d:03:1a:93:fd:84:fe:bb:77:8f:a3:06:8b:0f:c4:2d:c2 +-----BEGIN CERTIFICATE----- +MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQsw +CQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlu +bHkgUm9vdCBFMTAeFw0yMTA0MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJ +BgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlubHkxGjAYBgNVBAMTEUNlcnRhaW5s +eSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4fxzf7flHh4axpMCK ++IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9YBk2 +QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4 +hevIIgcwCgYIKoZIzj0EAwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozm +ut6Dacpps6kFtZaSF4fC0urQe87YQVt8rgIwRt7qy12a7DLCZRawTDBcMPPaTnOG +BtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR +-----END CERTIFICATE----- + +# Issuer: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD. +# Subject: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD. +# Label: "Security Communication ECC RootCA1" +# Serial: 15446673492073852651 +# MD5 Fingerprint: 7e:43:b0:92:68:ec:05:43:4c:98:ab:5d:35:2e:7e:86 +# SHA1 Fingerprint: b8:0e:26:a9:bf:d2:b2:3b:c0:ef:46:c9:ba:c7:bb:f6:1d:0d:41:41 +# SHA256 Fingerprint: e7:4f:bd:a5:5b:d5:64:c4:73:a3:6b:44:1a:a7:99:c8:a6:8e:07:74:40:e8:28:8b:9f:a1:e5:0e:4b:ba:ca:11 +-----BEGIN CERTIFICATE----- +MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYT +AkpQMSUwIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYD +VQQDEyJTZWN1cml0eSBDb21tdW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYx +NjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTELMAkGA1UEBhMCSlAxJTAjBgNVBAoT +HFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNVBAMTIlNlY3VyaXR5 +IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+Cnnfdl +dB9sELLo5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpK +ULGjQjBAMB0GA1UdDgQWBBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu +9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3LsnNdo4gIxwwCMQDAqy0O +be0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70eN9k= +-----END CERTIFICATE----- + +# Issuer: CN=BJCA Global Root CA1 O=BEIJING CERTIFICATE AUTHORITY +# Subject: CN=BJCA Global Root CA1 O=BEIJING CERTIFICATE AUTHORITY +# Label: "BJCA Global Root CA1" +# Serial: 113562791157148395269083148143378328608 +# MD5 Fingerprint: 42:32:99:76:43:33:36:24:35:07:82:9b:28:f9:d0:90 +# SHA1 Fingerprint: d5:ec:8d:7b:4c:ba:79:f4:e7:e8:cb:9d:6b:ae:77:83:10:03:21:6a +# SHA256 Fingerprint: f3:89:6f:88:fe:7c:0a:88:27:66:a7:fa:6a:d2:74:9f:b5:7a:7f:3e:98:fb:76:9c:1f:a7:b0:9c:2c:44:d5:ae +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBU +MQswCQYDVQQGEwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRI +T1JJVFkxHTAbBgNVBAMMFEJKQ0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAz +MTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkGA1UEBhMCQ04xJjAkBgNVBAoMHUJF +SUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRCSkNBIEdsb2Jh +bCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFmCL3Z +xRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZ +spDyRhySsTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O5 +58dnJCNPYwpj9mZ9S1WnP3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgR +at7GGPZHOiJBhyL8xIkoVNiMpTAK+BcWyqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll +5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRjeulumijWML3mG90Vr4Tq +nMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNnMoH1V6XK +V0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/ +pj+bOT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZO +z2nxbkRs1CTqjSShGL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXn +jSXWgXSHRtQpdaJCbPdzied9v3pKH9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+ +WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMBAAGjQjBAMB0GA1UdDgQWBBTF +7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4 +YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3Kli +awLwQ8hOnThJdMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u ++2D2/VnGKhs/I0qUJDAnyIm860Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88 +X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuhTaRjAv04l5U/BXCga99igUOLtFkN +SoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW4AB+dAb/OMRyHdOo +P2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmpGQrI ++pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRz +znfSxqxx4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9 +eVzYH6Eze9mCUAyTF6ps3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2 +YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4SSPfSKcOYKMryMguTjClPPGAyzQWWYezy +r/6zcCwupvI= +-----END CERTIFICATE----- + +# Issuer: CN=BJCA Global Root CA2 O=BEIJING CERTIFICATE AUTHORITY +# Subject: CN=BJCA Global Root CA2 O=BEIJING CERTIFICATE AUTHORITY +# Label: "BJCA Global Root CA2" +# Serial: 58605626836079930195615843123109055211 +# MD5 Fingerprint: 5e:0a:f6:47:5f:a6:14:e8:11:01:95:3f:4d:01:eb:3c +# SHA1 Fingerprint: f4:27:86:eb:6e:b8:6d:88:31:67:02:fb:ba:66:a4:53:00:aa:7a:a6 +# SHA256 Fingerprint: 57:4d:f6:93:1e:27:80:39:66:7b:72:0a:fd:c1:60:0f:c2:7e:b6:6d:d3:09:29:79:fb:73:85:64:87:21:28:82 +-----BEGIN CERTIFICATE----- +MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQsw +CQYDVQQGEwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJ +VFkxHTAbBgNVBAMMFEJKQ0EgR2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgy +MVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJ +TkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRCSkNBIEdsb2JhbCBS +b290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jlSR9B +IgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK+ ++kpRuDCK/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJK +sVF/BvDRgh9Obl+rg/xI1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA +94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8gUXOQwKhbYdDFUDn9hf7B +43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== +-----END CERTIFICATE----- + +# Issuer: CN=Sectigo Public Server Authentication Root E46 O=Sectigo Limited +# Subject: CN=Sectigo Public Server Authentication Root E46 O=Sectigo Limited +# Label: "Sectigo Public Server Authentication Root E46" +# Serial: 88989738453351742415770396670917916916 +# MD5 Fingerprint: 28:23:f8:b2:98:5c:37:16:3b:3e:46:13:4e:b0:b3:01 +# SHA1 Fingerprint: ec:8a:39:6c:40:f0:2e:bc:42:75:d4:9f:ab:1c:1a:5b:67:be:d2:9a +# SHA256 Fingerprint: c9:0f:26:f0:fb:1b:40:18:b2:22:27:51:9b:5c:a2:b5:3e:2c:a5:b3:be:5c:f1:8e:fe:1b:ef:47:38:0c:53:83 +-----BEGIN CERTIFICATE----- +MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQsw +CQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T +ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcN +MjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYG +A1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT +ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccC +WvkEN/U0NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+ +6xnOQ6OjQjBAMB0GA1UdDgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8B +Af8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNnADBkAjAn7qRa +qCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RHlAFWovgzJQxC36oCMB3q +4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21USAGKcw== +-----END CERTIFICATE----- + +# Issuer: CN=Sectigo Public Server Authentication Root R46 O=Sectigo Limited +# Subject: CN=Sectigo Public Server Authentication Root R46 O=Sectigo Limited +# Label: "Sectigo Public Server Authentication Root R46" +# Serial: 156256931880233212765902055439220583700 +# MD5 Fingerprint: 32:10:09:52:00:d5:7e:6c:43:df:15:c0:b1:16:93:e5 +# SHA1 Fingerprint: ad:98:f9:f3:e4:7d:75:3b:65:d4:82:b3:a4:52:17:bb:6e:f5:e4:38 +# SHA256 Fingerprint: 7b:b6:47:a6:2a:ee:ac:88:bf:25:7a:a5:22:d0:1f:fe:a3:95:e0:ab:45:c7:3f:93:f6:56:54:ec:38:f2:5a:06 +-----BEGIN CERTIFICATE----- +MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBf +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQD +Ey1TZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYw +HhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEY +MBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1Ymxp +YyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDa +ef0rty2k1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnz +SDBh+oF8HqcIStw+KxwfGExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xf +iOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMPFF1bFOdLvt30yNoDN9HWOaEhUTCDsG3X +ME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vuZDCQOc2TZYEhMbUjUDM3 +IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5QazYw6A3OAS +VYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgE +SJ/AwSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu ++Zd4KKTIRJLpfSYFplhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt +8uaZFURww3y8nDnAtOFr94MlI1fZEoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+L +HaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW6aWWrL3DkJiy4Pmi1KZHQ3xt +zwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWIIUkwDgYDVR0P +AQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c +mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQ +YKlJfp/imTYpE0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52 +gDY9hAaLMyZlbcp+nv4fjFg4exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZA +Fv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M0ejf5lG5Nkc/kLnHvALcWxxPDkjB +JYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI84HxZmduTILA7rpX +DhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9mpFui +TdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5 +dHn5HrwdVw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65 +LvKRRFHQV80MNNVIIb/bE/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp +0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmmJ1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAY +QqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com TLS RSA Root CA 2022 O=SSL Corporation +# Subject: CN=SSL.com TLS RSA Root CA 2022 O=SSL Corporation +# Label: "SSL.com TLS RSA Root CA 2022" +# Serial: 148535279242832292258835760425842727825 +# MD5 Fingerprint: d8:4e:c6:59:30:d8:fe:a0:d6:7a:5a:2c:2c:69:78:da +# SHA1 Fingerprint: ec:2c:83:40:72:af:26:95:10:ff:0e:f2:03:ee:31:70:f6:78:9d:ca +# SHA256 Fingerprint: 8f:af:7d:2e:2c:b4:70:9b:b8:e0:b3:36:66:bf:75:a5:dd:45:b5:de:48:0f:8e:a8:d4:bf:e6:be:bc:17:f2:ed +-----BEGIN CERTIFICATE----- +MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBO +MQswCQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQD +DBxTU0wuY29tIFRMUyBSU0EgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloX +DTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jw +b3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJvb3QgQ0EgMjAyMjCC +AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u9nTP +L3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OY +t6/wNr/y7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0ins +S657Lb85/bRi3pZ7QcacoOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3 +PnxEX4MN8/HdIGkWCVDi1FW24IBydm5MR7d1VVm0U3TZlMZBrViKMWYPHqIbKUBO +L9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDGD6C1vBdOSHtRwvzpXGk3 +R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEWTO6Af77w +dr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS ++YCk8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYS +d66UNHsef8JmAOSqg+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoG +AtUjHBPW6dvbxrB6y3snm/vg1UYk7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2f +gTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j +BBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsuN+7jhHonLs0Z +NbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt +hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsM +QtfhWsSWTVTNj8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvf +R4iyrT7gJ4eLSYwfqUdYe5byiB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJ +DPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjUo3KUQyxi4U5cMj29TH0ZR6LDSeeW +P4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqoENjwuSfr98t67wVy +lrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7EgkaibMOlq +bLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2w +AgDHbICivRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3q +r5nsLFR+jM4uElZI7xc7P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sji +Mho6/4UIyYOf8kpIEFR3N+2ivEC+5BB09+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU +98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com TLS ECC Root CA 2022 O=SSL Corporation +# Subject: CN=SSL.com TLS ECC Root CA 2022 O=SSL Corporation +# Label: "SSL.com TLS ECC Root CA 2022" +# Serial: 26605119622390491762507526719404364228 +# MD5 Fingerprint: 99:d7:5c:f1:51:36:cc:e9:ce:d9:19:2e:77:71:56:c5 +# SHA1 Fingerprint: 9f:5f:d9:1a:54:6d:f5:0c:71:f0:ee:7a:bd:17:49:98:84:73:e2:39 +# SHA256 Fingerprint: c3:2f:fd:9f:46:f9:36:d1:6c:36:73:99:09:59:43:4b:9a:d6:0a:af:bb:9e:7c:f3:36:54:f1:44:cc:1b:a1:43 +-----BEGIN CERTIFICATE----- +MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQsw +CQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxT +U0wuY29tIFRMUyBFQ0MgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2 +MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3Jh +dGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3QgQ0EgMjAyMjB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWyJGYm +acCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFN +SeR7T5v15wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME +GDAWgBSJjy+j6CugFFR781a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NW +uCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp +15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w7deedWo1dlJF4AIxAMeN +b0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5Zn6g6g== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot Root CA ECC TLS 2021 O=Atos +# Subject: CN=Atos TrustedRoot Root CA ECC TLS 2021 O=Atos +# Label: "Atos TrustedRoot Root CA ECC TLS 2021" +# Serial: 81873346711060652204712539181482831616 +# MD5 Fingerprint: 16:9f:ad:f1:70:ad:79:d6:ed:29:b4:d1:c5:79:70:a8 +# SHA1 Fingerprint: 9e:bc:75:10:42:b3:02:f3:81:f4:f7:30:62:d4:8f:c3:a7:51:b2:dd +# SHA256 Fingerprint: b2:fa:e5:3e:14:cc:d7:ab:92:12:06:47:01:ae:27:9c:1d:89:88:fa:cb:77:5f:a8:a0:08:91:4e:66:39:88:a8 +-----BEGIN CERTIFICATE----- +MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4w +LAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0w +CwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0 +MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBF +Q0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMHYwEAYHKoZI +zj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6KDP/X +tXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4 +AjJn8ZQSb+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2 +KCXWfeBmmnoJsmo7jjPXNtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMD +aAAwZQIwW5kp85wxtolrbNa9d+F851F+uDrNozZffPc8dz7kUK2o59JZDCaOMDtu +CCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGYa3cpetskz2VAv9LcjBHo +9H1/IISpQuQo +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot Root CA RSA TLS 2021 O=Atos +# Subject: CN=Atos TrustedRoot Root CA RSA TLS 2021 O=Atos +# Label: "Atos TrustedRoot Root CA RSA TLS 2021" +# Serial: 111436099570196163832749341232207667876 +# MD5 Fingerprint: d4:d3:46:b8:9a:c0:9c:76:5d:9e:3a:c3:b9:99:31:d2 +# SHA1 Fingerprint: 18:52:3b:0d:06:37:e4:d6:3a:df:23:e4:98:fb:5b:16:fb:86:74:48 +# SHA256 Fingerprint: 81:a9:08:8e:a5:9f:b3:64:c5:48:a6:f8:55:59:09:9b:6f:04:05:ef:bf:18:e5:32:4e:c9:f4:57:ba:00:11:2f +-----BEGIN CERTIFICATE----- +MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBM +MS4wLAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIx +MQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00 +MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBD +QSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BBl01Z +4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYv +Ye+W/CBGvevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZ +kmGbzSoXfduP9LVq6hdKZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDs +GY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt0xU6kGpn8bRrZtkh68rZYnxGEFzedUln +nkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVKPNe0OwANwI8f4UDErmwh +3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMYsluMWuPD +0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzy +geBYBr3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8 +ANSbhqRAvNncTFd+rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezB +c6eUWsuSZIKmAMFwoW4sKeFYV+xafJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lI +pw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +dEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +DAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS +4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPs +o0UvFJ/1TCplQ3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJ +qM7F78PRreBrAwA0JrRUITWXAdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuyw +xfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9GslA9hGCZcbUztVdF5kJHdWoOsAgM +rr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2VktafcxBPTy+av5EzH4 +AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9qTFsR +0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuY +o7Ey7Nmj1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5 +dDTedk+SKlOxJTnbPP/lPqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcE +oji2jbDwN/zIIX8/syQbPYtuzE2wFg2WHYMfRsCbvUOZ58SWLs5fyQ== +-----END CERTIFICATE----- + +# Issuer: CN=TrustAsia Global Root CA G3 O=TrustAsia Technologies, Inc. +# Subject: CN=TrustAsia Global Root CA G3 O=TrustAsia Technologies, Inc. +# Label: "TrustAsia Global Root CA G3" +# Serial: 576386314500428537169965010905813481816650257167 +# MD5 Fingerprint: 30:42:1b:b7:bb:81:75:35:e4:16:4f:53:d2:94:de:04 +# SHA1 Fingerprint: 63:cf:b6:c1:27:2b:56:e4:88:8e:1c:23:9a:b6:2e:81:47:24:c3:c7 +# SHA256 Fingerprint: e0:d3:22:6a:eb:11:63:c2:e4:8f:f9:be:3b:50:b4:c6:43:1b:e7:bb:1e:ac:c5:c3:6b:5d:5e:c5:09:03:9a:08 +-----BEGIN CERTIFICATE----- +MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEM +BQAwWjELMAkGA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dp +ZXMsIEluYy4xJDAiBgNVBAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAe +Fw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEwMTlaMFoxCzAJBgNVBAYTAkNOMSUw +IwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQwIgYDVQQDDBtU +cnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNS +T1QY4SxzlZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqK +AtCWHwDNBSHvBm3dIZwZQ0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1 +nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/VP68czH5GX6zfZBCK70bwkPAPLfSIC7Ep +qq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1AgdB4SQXMeJNnKziyhWTXA +yB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm9WAPzJMs +hH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gX +zhqcD0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAv +kV34PmVACxmZySYgWmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msT +f9FkPz2ccEblooV7WIQn3MSAPmeamseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jA +uPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCFTIcQcf+eQxuulXUtgQIDAQAB +o2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj7zjKsK5Xf/Ih +MBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E +BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4 +wM8zAQLpw6o1D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2 +XFNFV1pF1AWZLy4jVe5jaN/TG3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1 +JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNjduMNhXJEIlU/HHzp/LgV6FL6qj6j +ITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstlcHboCoWASzY9M/eV +VHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys+TIx +xHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1on +AX1daBli2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d +7XB4tmBZrOFdRWOPyN9yaFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2Ntjj +gKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsASZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV ++Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFRJQJ6+N1rZdVtTTDIZbpo +FGWsJwt0ivKH +-----END CERTIFICATE----- + +# Issuer: CN=TrustAsia Global Root CA G4 O=TrustAsia Technologies, Inc. +# Subject: CN=TrustAsia Global Root CA G4 O=TrustAsia Technologies, Inc. +# Label: "TrustAsia Global Root CA G4" +# Serial: 451799571007117016466790293371524403291602933463 +# MD5 Fingerprint: 54:dd:b2:d7:5f:d8:3e:ed:7c:e0:0b:2e:cc:ed:eb:eb +# SHA1 Fingerprint: 57:73:a5:61:5d:80:b2:e6:ac:38:82:fc:68:07:31:ac:9f:b5:92:5a +# SHA256 Fingerprint: be:4b:56:cb:50:56:c0:13:6a:52:6d:f4:44:50:8d:aa:36:a0:b5:4f:42:e4:ac:38:f7:2a:f4:70:e4:79:65:4c +-----BEGIN CERTIFICATE----- +MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMw +WjELMAkGA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs +IEluYy4xJDAiBgNVBAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0y +MTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJaMFoxCzAJBgNVBAYTAkNOMSUwIwYD +VQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQwIgYDVQQDDBtUcnVz +dEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATx +s8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbw +LxYI+hW8m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJij +YzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mD +pm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/pDHel4NZg6ZvccveMA4GA1UdDwEB/wQE +AwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AAbbd+NvBNEU/zy4k6LHiR +UKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xkdUfFVZDj +/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA== +-----END CERTIFICATE----- + +# Issuer: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH +# Subject: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH +# Label: "Telekom Security TLS ECC Root 2020" +# Serial: 72082518505882327255703894282316633856 +# MD5 Fingerprint: c1:ab:fe:6a:10:2c:03:8d:bc:1c:22:32:c0:85:a7:fd +# SHA1 Fingerprint: c0:f8:96:c5:a9:3b:01:06:21:07:da:18:42:48:bc:e9:9d:88:d5:ec +# SHA256 Fingerprint: 57:8a:f4:de:d0:85:3f:4e:59:98:db:4a:ea:f9:cb:ea:8d:94:5f:60:b6:20:a3:8d:1a:3c:13:b2:bc:7b:a8:e1 +-----BEGIN CERTIFICATE----- +MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQsw +CQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBH +bWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIw +MB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIzNTk1OVowYzELMAkGA1UEBhMCREUx +JzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkGA1UE +AwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/O +tdKPD/M12kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDP +f8iAC8GXs7s1J8nCG6NCMEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6f +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2cA +MGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZMo7k+5Dck2TOrbRBR2Di +z6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdUga/sf+Rn +27iQ7t0l +-----END CERTIFICATE----- + +# Issuer: CN=Telekom Security TLS RSA Root 2023 O=Deutsche Telekom Security GmbH +# Subject: CN=Telekom Security TLS RSA Root 2023 O=Deutsche Telekom Security GmbH +# Label: "Telekom Security TLS RSA Root 2023" +# Serial: 44676229530606711399881795178081572759 +# MD5 Fingerprint: bf:5b:eb:54:40:cd:48:71:c4:20:8d:7d:de:0a:42:f2 +# SHA1 Fingerprint: 54:d3:ac:b3:bd:57:56:f6:85:9d:ce:e5:c3:21:e2:d4:ad:83:d0:93 +# SHA256 Fingerprint: ef:c6:5c:ad:bb:59:ad:b6:ef:e8:4d:a2:23:11:b3:56:24:b7:1b:3b:1e:a0:da:8b:66:55:17:4e:c8:97:86:46 +-----BEGIN CERTIFICATE----- +MIIFszCCA5ugAwIBAgIQIZxULej27HF3+k7ow3BXlzANBgkqhkiG9w0BAQwFADBj +MQswCQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0 +eSBHbWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAy +MDIzMB4XDTIzMDMyODEyMTY0NVoXDTQ4MDMyNzIzNTk1OVowYzELMAkGA1UEBhMC +REUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkG +A1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgUlNBIFJvb3QgMjAyMzCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAO01oYGA88tKaVvC+1GDrib94W7zgRJ9 +cUD/h3VCKSHtgVIs3xLBGYSJwb3FKNXVS2xE1kzbB5ZKVXrKNoIENqil/Cf2SfHV +cp6R+SPWcHu79ZvB7JPPGeplfohwoHP89v+1VmLhc2o0mD6CuKyVU/QBoCcHcqMA +U6DksquDOFczJZSfvkgdmOGjup5czQRxUX11eKvzWarE4GC+j4NSuHUaQTXtvPM6 +Y+mpFEXX5lLRbtLevOP1Czvm4MS9Q2QTps70mDdsipWol8hHD/BeEIvnHRz+sTug +BTNoBUGCwQMrAcjnj02r6LX2zWtEtefdi+zqJbQAIldNsLGyMcEWzv/9FIS3R/qy +8XDe24tsNlikfLMR0cN3f1+2JeANxdKz+bi4d9s3cXFH42AYTyS2dTd4uaNir73J +co4vzLuu2+QVUhkHM/tqty1LkCiCc/4YizWN26cEar7qwU02OxY2kTLvtkCJkUPg +8qKrBC7m8kwOFjQgrIfBLX7JZkcXFBGk8/ehJImr2BrIoVyxo/eMbcgByU/J7MT8 +rFEz0ciD0cmfHdRHNCk+y7AO+oMLKFjlKdw/fKifybYKu6boRhYPluV75Gp6SG12 +mAWl3G0eQh5C2hrgUve1g8Aae3g1LDj1H/1Joy7SWWO/gLCMk3PLNaaZlSJhZQNg ++y+TS/qanIA7AgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtqeX +gj10hZv3PJ+TmpV5dVKMbUcwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS2 +p5eCPXSFm/c8n5OalXl1UoxtRzANBgkqhkiG9w0BAQwFAAOCAgEAqMxhpr51nhVQ +pGv7qHBFfLp+sVr8WyP6Cnf4mHGCDG3gXkaqk/QeoMPhk9tLrbKmXauw1GLLXrtm +9S3ul0A8Yute1hTWjOKWi0FpkzXmuZlrYrShF2Y0pmtjxrlO8iLpWA1WQdH6DErw +M807u20hOq6OcrXDSvvpfeWxm4bu4uB9tPcy/SKE8YXJN3nptT+/XOR0so8RYgDd +GGah2XsjX/GO1WfoVNpbOms2b/mBsTNHM3dA+VKq3dSDz4V4mZqTuXNnQkYRIer+ +CqkbGmVps4+uFrb2S1ayLfmlyOw7YqPta9BO1UAJpB+Y1zqlklkg5LB9zVtzaL1t +xKITDmcZuI1CfmwMmm6gJC3VRRvcxAIU/oVbZZfKTpBQCHpCNfnqwmbU+AGuHrS+ +w6jv/naaoqYfRvaE7fzbzsQCzndILIyy7MMAo+wsVRjBfhnu4S/yrYObnqsZ38aK +L4x35bcF7DvB7L6Gs4a8wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+lj +X273CXE2whJdV/LItM3z7gLfEdxquVeEHVlNjM7IDiPCtyaaEBRx/pOyiriA8A4Q +ntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0o82bNSQ3+pCTE4FCxpgm +dTdmQRCsu/WU48IxK63nI1bMNSWSs1A= +-----END CERTIFICATE----- + +# Issuer: CN=FIRMAPROFESIONAL CA ROOT-A WEB O=Firmaprofesional SA +# Subject: CN=FIRMAPROFESIONAL CA ROOT-A WEB O=Firmaprofesional SA +# Label: "FIRMAPROFESIONAL CA ROOT-A WEB" +# Serial: 65916896770016886708751106294915943533 +# MD5 Fingerprint: 82:b2:ad:45:00:82:b0:66:63:f8:5f:c3:67:4e:ce:a3 +# SHA1 Fingerprint: a8:31:11:74:a6:14:15:0d:ca:77:dd:0e:e4:0c:5d:58:fc:a0:72:a5 +# SHA256 Fingerprint: be:f2:56:da:f2:6e:9c:69:bd:ec:16:02:35:97:98:f3:ca:f7:18:21:a0:3e:01:82:57:c5:3c:65:61:7f:3d:4a +-----BEGIN CERTIFICATE----- +MIICejCCAgCgAwIBAgIQMZch7a+JQn81QYehZ1ZMbTAKBggqhkjOPQQDAzBuMQsw +CQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UE +YQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENB +IFJPT1QtQSBXRUIwHhcNMjIwNDA2MDkwMTM2WhcNNDcwMzMxMDkwMTM2WjBuMQsw +CQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UE +YQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENB +IFJPT1QtQSBXRUIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARHU+osEaR3xyrq89Zf +e9MEkVz6iMYiuYMQYneEMy3pA4jU4DP37XcsSmDq5G+tbbT4TIqk5B/K6k84Si6C +cyvHZpsKjECcfIr28jlgst7L7Ljkb+qbXbdTkBgyVcUgt5SjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHwYDVR0jBBgwFoAUk+FDY1w8ndYn81LsF7Kpryz3dvgwHQYDVR0O +BBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjO +PQQDAwNoADBlAjAdfKR7w4l1M+E7qUW/Runpod3JIha3RxEL2Jq68cgLcFBTApFw +hVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dG +XSaQpYXFuXqUPoeovQA= +-----END CERTIFICATE----- + +# Issuer: CN=TWCA CYBER Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA CYBER Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA CYBER Root CA" +# Serial: 85076849864375384482682434040119489222 +# MD5 Fingerprint: 0b:33:a0:97:52:95:d4:a9:fd:bb:db:6e:a3:55:5b:51 +# SHA1 Fingerprint: f6:b1:1c:1a:83:38:e9:7b:db:b3:a8:c8:33:24:e0:2d:9c:7f:26:66 +# SHA256 Fingerprint: 3f:63:bb:28:14:be:17:4e:c8:b6:43:9c:f0:8d:6d:56:f0:b7:c4:05:88:3a:56:48:a3:34:42:4d:6b:3e:c5:58 +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQ +MQswCQYDVQQGEwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290 +IENBMRswGQYDVQQDExJUV0NBIENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5 +WhcNNDcxMTIyMTU1OTU5WjBQMQswCQYDVQQGEwJUVzESMBAGA1UEChMJVEFJV0FO +LUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NBIENZQkVSIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDG+Moe2Qkgfh1sTs6P +40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33Kc7wb3+szT3vsxxF +avcokPFhV8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYdHNWdZsc/ +34bKS1PE2Y2yHer43CdTo0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684i +JkXXYJndzk834H/nY62wuFm40AZoNWDTNq5xQwTxaWV4fPMf88oon1oglWa0zbfu +j3ikRRjpJi+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK/c/WMw+f+5eesRycnupf +Xtuq3VTpMCEobY5583WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkHIuNZW0CP +2oi3aQiotyMuRAlZN1vH4xfyIutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDA +S9TMfAxsNAwmmyYxpjyn9tnQS6Jk/zuZQXLB4HCX8SS7K8R0IrGsayIyJNN4KsDA +oS/xUgXJP+92ZuJF2A09rZXIx4kmyA+upwMu+8Ff+iDhcK2wZSA3M2Cw1a/XDBzC +kHDXShi8fgGwsOsVHkQGzaRP6AzRwyAQ4VRlnrZR0Bp2a0JaWHY06rc3Ga4udfmW +5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83QOGt4A1WNzAd +BgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIB +AGSPesRiDrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0t +tGlTITVX1olNc79pj3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn +68xDiBaiA9a5F/gZbG0jAn/xX9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNn +TKkHmvPfXvt89YnNdJdhEGoHK4Fa0o635yDRIG4kqIQnoVesqlVYL9zZyvpoBJ7t +RCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1JSdJlBTrq/p1hvIbZv97Tujqx +f36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4iuO/Qq+n1M0RFxbI +Qh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY73NxW0Qz +8ppy6rBePm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4 +NxKfKjLji7gh7MMrZQzvIt6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzX +xeSDwWrruoBa3lwtcHb4yOWHh8qgnaHlIhInD0Q9HWzq1MKLL295q39QpsQZp6F6 +t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign Root CA12 O=Cybertrust Japan Co., Ltd. +# Subject: CN=SecureSign Root CA12 O=Cybertrust Japan Co., Ltd. +# Label: "SecureSign Root CA12" +# Serial: 587887345431707215246142177076162061960426065942 +# MD5 Fingerprint: c6:89:ca:64:42:9b:62:08:49:0b:1e:7f:e9:07:3d:e8 +# SHA1 Fingerprint: 7a:22:1e:3d:de:1b:06:ac:9e:c8:47:70:16:8e:3c:e5:f7:6b:06:f4 +# SHA256 Fingerprint: 3f:03:4b:b5:70:4d:44:b2:d0:85:45:a0:20:57:de:93:eb:f3:90:5f:ce:72:1a:cb:c7:30:c0:6d:da:ee:90:4e +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28u +LCBMdGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgw +NTM2NDZaFw00MDA0MDgwNTM2NDZaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpD +eWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBS +b290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6OcE3emhF +KxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048luT9Ub+ZyZN+v/mt +p7JIKwccJ/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPjcf59q5zd +J1M3s6oYwlkm7Fsf0uZlfO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gur +FzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBFEaCeVESE99g2zvVQR9wsMJvuwPWW0v4J +hscGWa5Pro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1UefNzFJM3IFTQy2VYzxV4+K +h9GtxRESOaCtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBRXNPN0zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsF +AAOCAQEAPrvbFxbS8hQBICw4g0utvsqFepq2m2um4fylOqyttCg6r9cBg0krY6Ld +mmQOmFxv3Y67ilQiLUoT865AQ9tPkbeGGuwAtEGBpE/6aouIs3YIcipJQMPTw4WJ +mBClnW8Zt7vPemVV2zfrPIpyMpcemik+rY3moxtt9XUa5rBouVui7mlHJzWhhpmA +8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPSvWKErI4cqc1avTc7bgoitPQV +55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhgaaaI5gdka9at/ +yOPiZwud9AzqVN/Ssq+xIvEg37xEHA== +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign Root CA14 O=Cybertrust Japan Co., Ltd. +# Subject: CN=SecureSign Root CA14 O=Cybertrust Japan Co., Ltd. +# Label: "SecureSign Root CA14" +# Serial: 575790784512929437950770173562378038616896959179 +# MD5 Fingerprint: 71:0d:72:fa:92:19:65:5e:89:04:ac:16:33:f0:bc:d5 +# SHA1 Fingerprint: dd:50:c0:f7:79:b3:64:2e:74:a2:b8:9d:9f:d3:40:dd:bb:f0:f2:4f +# SHA256 Fingerprint: 4b:00:9c:10:34:49:4f:9a:b5:6b:ba:3b:a1:d6:27:31:fc:4d:20:d8:95:5a:dc:ec:10:a9:25:60:72:61:e3:38 +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEM +BQAwUTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28u +LCBMdGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgw +NzA2MTlaFw00NTA0MDgwNzA2MTlaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpD +eWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBS +b290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF0nqh1oq/ +FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG3rdSINVSW0KZnvOg +vlIfX8xnbacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6KxNedlsmGy +6pJxaeQp8E+BgQQ8sqVb1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo +/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa/d/aLIJ+7sr2KeH6caH3iGicnPCNvg9J +kdjqOvn90Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOEkJTRX45zGRBdAuVwpcAQ +0BB8b8VYSbSwbprafZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSxjVIHvXib +y8posqTdDEx5YMaZ0ZPxMBoH064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac +18izju3Gm5h1DVXoX+WViwKkrkMpKBGk5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs +0Wq2XSqypWa9a4X0dFbD9ed1Uigspf9mR6XU/v6eVL9lfgHWMI+lNpyiUBzuOIAB +SMbHdPTGrMNASRZhdCyvjG817XsYAFs2PJxQDcqSMxDxJklt33UkN4Ii1+iW/RVL +ApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeqYR3r6/wtbyPk +86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0E +rX+lRVAQZk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ib +ed87hwriZLoAymzvftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopT +zfFP7ELyk+OZpDc8h7hi2/DsHzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHS +DCRZNhqfLJGP4xjblJUK7ZGqDpncllPjYYPGFrojutzdfhrGe0K22VoF3Jpf1d+4 +2kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHVdqqGuw6qnsb58Nn4DSEC5MUo +FlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI2i/6GaX7i+B/OfVy +K4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDeM9ovnhp6 +dB7h7sxaOgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtl +Lor6CZpO2oYofaphNdgOpygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB +365jJ6UeTo3cKXhZ+PmhIIynJkBugnLNeLLIjzwec+fBH7/PzqUqm9tEZDKgu39c +JRNItX+S +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign Root CA15 O=Cybertrust Japan Co., Ltd. +# Subject: CN=SecureSign Root CA15 O=Cybertrust Japan Co., Ltd. +# Label: "SecureSign Root CA15" +# Serial: 126083514594751269499665114766174399806381178503 +# MD5 Fingerprint: 13:30:fc:c4:62:a6:a9:de:b5:c1:68:af:b5:d2:31:47 +# SHA1 Fingerprint: cb:ba:83:c8:c1:5a:5d:f1:f9:73:6f:ca:d7:ef:28:13:06:4a:07:7d +# SHA256 Fingerprint: e7:78:f0:f0:95:fe:84:37:29:cd:1a:00:82:17:9e:53:14:a9:c2:91:44:28:05:e1:fb:1d:8f:b6:b8:88:6c:3a +-----BEGIN CERTIFICATE----- +MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMw +UTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBM +dGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMy +NTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpDeWJl +cnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBSb290 +IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5GdCx4 +wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSR +ZHX+AezB2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT +9DAKBggqhkjOPQQDAwNoADBlAjEA2S6Jfl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp +4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJSwdLZrWeqrqgHkHZAXQ6 +bkU6iYAZezKYVWOr62Nuk22rGwlgMU4= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST BR Root CA 2 2023 O=D-Trust GmbH +# Subject: CN=D-TRUST BR Root CA 2 2023 O=D-Trust GmbH +# Label: "D-TRUST BR Root CA 2 2023" +# Serial: 153168538924886464690566649552453098598 +# MD5 Fingerprint: e1:09:ed:d3:60:d4:56:1b:47:1f:b7:0c:5f:1b:5f:85 +# SHA1 Fingerprint: 2d:b0:70:ee:71:94:af:69:68:17:db:79:ce:58:9f:a0:6b:96:f7:87 +# SHA256 Fingerprint: 05:52:e6:f8:3f:df:65:e8:fa:96:70:e6:66:df:28:a4:e2:13:40:b5:10:cb:e5:25:66:f9:7c:4f:b9:4b:2b:d1 +-----BEGIN CERTIFICATE----- +MIIFqTCCA5GgAwIBAgIQczswBEhb2U14LnNLyaHcZjANBgkqhkiG9w0BAQ0FADBI +MQswCQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlE +LVRSVVNUIEJSIFJvb3QgQ0EgMiAyMDIzMB4XDTIzMDUwOTA4NTYzMVoXDTM4MDUw +OTA4NTYzMFowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEi +MCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDIgMjAyMzCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAK7/CVmRgApKaOYkP7in5Mg6CjoWzckjYaCTcfKr +i3OPoGdlYNJUa2NRb0kz4HIHE304zQaSBylSa053bATTlfrdTIzZXcFhfUvnKLNE +gXtRr90zsWh81k5M/itoucpmacTsXld/9w3HnDY25QdgrMBM6ghs7wZ8T1soegj8 +k12b9py0i4a6Ibn08OhZWiihNIQaJZG2tY/vsvmA+vk9PBFy2OMvhnbFeSzBqZCT +Rphny4NqoFAjpzv2gTng7fC5v2Xx2Mt6++9zA84A9H3X4F07ZrjcjrqDy4d2A/wl +2ecjbwb9Z/Pg/4S8R7+1FhhGaRTMBffb00msa8yr5LULQyReS2tNZ9/WtT5PeB+U +cSTq3nD88ZP+npNa5JRal1QMNXtfbO4AHyTsA7oC9Xb0n9Sa7YUsOCIvx9gvdhFP +/Wxc6PWOJ4d/GUohR5AdeY0cW/jPSoXk7bNbjb7EZChdQcRurDhaTyN0dKkSw/bS +uREVMweR2Ds3OmMwBtHFIjYoYiMQ4EbMl6zWK11kJNXuHA7e+whadSr2Y23OC0K+ +0bpwHJwh5Q8xaRfX/Aq03u2AnMuStIv13lmiWAmlY0cL4UEyNEHZmrHZqLAbWt4N +DfTisl01gLmB1IRpkQLLddCNxbU9CZEJjxShFHR5PtbJFR2kWVki3PaKRT08EtY+ +XTIvAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUZ5Dw1t61 +GNVGKX5cq/ieCLxklRAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRCMEAwPqA8oDqG +OGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfYnJfcm9vdF9jYV8y +XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQA097N3U9swFrktpSHxQCF16+tI +FoE9c+CeJyrrd6kTpGoKWloUMz1oH4Guaf2Mn2VsNELZLdB/eBaxOqwjMa1ef67n +riv6uvw8l5VAk1/DLQOj7aRvU9f6QA4w9QAgLABMjDu0ox+2v5Eyq6+SmNMW5tTR +VFxDWy6u71cqqLRvpO8NVhTaIasgdp4D/Ca4nj8+AybmTNudX0KEPUUDAxxZiMrc +LmEkWqTqJwtzEr5SswrPMhfiHocaFpVIbVrg0M8JkiZmkdijYQ6qgYF/6FKC0ULn +4B0Y+qSFNueG4A3rvNTJ1jxD8V1Jbn6Bm2m1iWKPiFLY1/4nwSPFyysCu7Ff/vtD +hQNGvl3GyiEm/9cCnnRK3PgTFbGBVzbLZVzRHTF36SXDw7IyN9XxmAnkbWOACKsG +koHU6XCPpz+y7YaMgmo1yEJagtFSGkUPFaUA8JR7ZSdXOUPPfH/mvTWze/EZTN46 +ls/pdu4D58JDUjxqgejBWoC9EV2Ta/vH5mQ/u2kc6d0li690yVRAysuTEwrt+2aS +Ecr1wPrYg1UDfNPFIkZ1cGt5SAYqgpq/5usWDiJFAbzdNpQ0qTUmiteXue4Icr80 +knCDgKs4qllo3UCkGJCy89UDyibK79XH4I9TjvAA46jtn/mtd+ArY0+ew+43u3gJ +hJ65bvspmZDogNOfJA== +-----END CERTIFICATE----- + +# Issuer: CN=TrustAsia TLS ECC Root CA O=TrustAsia Technologies, Inc. +# Subject: CN=TrustAsia TLS ECC Root CA O=TrustAsia Technologies, Inc. +# Label: "TrustAsia TLS ECC Root CA" +# Serial: 310892014698942880364840003424242768478804666567 +# MD5 Fingerprint: 09:48:04:77:d2:fc:65:93:71:66:b1:11:95:4f:06:8c +# SHA1 Fingerprint: b5:ec:39:f3:a1:66:37:ae:c3:05:94:57:e2:be:11:be:b7:a1:7f:36 +# SHA256 Fingerprint: c0:07:6b:9e:f0:53:1f:b1:a6:56:d6:7c:4e:be:97:cd:5d:ba:a4:1e:f4:45:98:ac:c2:48:98:78:c9:2d:87:11 +-----BEGIN CERTIFICATE----- +MIICMTCCAbegAwIBAgIUNnThTXxlE8msg1UloD5Sfi9QaMcwCgYIKoZIzj0EAwMw +WDELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs +IEluYy4xIjAgBgNVBAMTGVRydXN0QXNpYSBUTFMgRUNDIFJvb3QgQ0EwHhcNMjQw +NTE1MDU0MTU2WhcNNDQwNTE1MDU0MTU1WjBYMQswCQYDVQQGEwJDTjElMCMGA1UE +ChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjEiMCAGA1UEAxMZVHJ1c3RB +c2lhIFRMUyBFQ0MgUm9vdCBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABLh/pVs/ +AT598IhtrimY4ZtcU5nb9wj/1WrgjstEpvDBjL1P1M7UiFPoXlfXTr4sP/MSpwDp +guMqWzJ8S5sUKZ74LYO1644xST0mYekdcouJtgq7nDM1D9rs3qlKH8kzsaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQULIVTu7FDzTLqnqOH/qKYqKaT6RAw +DgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMFRH18MtYYZI9HlaVQ01 +L18N9mdsd0AaRuf4aFtOJx24mH1/k78ITcTaRTChD15KeAIxAKORh/IRM4PDwYqR +OkwrULG9IpRdNYlzg8WbGf60oenUoWa2AaU2+dhoYSi3dOGiMQ== +-----END CERTIFICATE----- + +# Issuer: CN=TrustAsia TLS RSA Root CA O=TrustAsia Technologies, Inc. +# Subject: CN=TrustAsia TLS RSA Root CA O=TrustAsia Technologies, Inc. +# Label: "TrustAsia TLS RSA Root CA" +# Serial: 160405846464868906657516898462547310235378010780 +# MD5 Fingerprint: 3b:9e:c3:86:0f:34:3c:6b:c5:46:c4:8e:1d:e7:19:12 +# SHA1 Fingerprint: a5:46:50:c5:62:ea:95:9a:1a:a7:04:6f:17:58:c7:29:53:3d:03:fa +# SHA256 Fingerprint: 06:c0:8d:7d:af:d8:76:97:1e:b1:12:4f:e6:7f:84:7e:c0:c7:a1:58:d3:ea:53:cb:e9:40:e2:ea:97:91:f4:c3 +-----BEGIN CERTIFICATE----- +MIIFgDCCA2igAwIBAgIUHBjYz+VTPyI1RlNUJDxsR9FcSpwwDQYJKoZIhvcNAQEM +BQAwWDELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dp +ZXMsIEluYy4xIjAgBgNVBAMTGVRydXN0QXNpYSBUTFMgUlNBIFJvb3QgQ0EwHhcN +MjQwNTE1MDU0MTU3WhcNNDQwNTE1MDU0MTU2WjBYMQswCQYDVQQGEwJDTjElMCMG +A1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjEiMCAGA1UEAxMZVHJ1 +c3RBc2lhIFRMUyBSU0EgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC +AgoCggIBAMMWuBtqpERz5dZO9LnPWwvB0ZqB9WOwj0PBuwhaGnrhB3YmH49pVr7+ +NmDQDIPNlOrnxS1cLwUWAp4KqC/lYCZUlviYQB2srp10Zy9U+5RjmOMmSoPGlbYJ +Q1DNDX3eRA5gEk9bNb2/mThtfWza4mhzH/kxpRkQcwUqwzIZheo0qt1CHjCNP561 +HmHVb70AcnKtEj+qpklz8oYVlQwQX1Fkzv93uMltrOXVmPGZLmzjyUT5tUMnCE32 +ft5EebuyjBza00tsLtbDeLdM1aTk2tyKjg7/D8OmYCYozza/+lcK7Fs/6TAWe8Tb +xNRkoDD75f0dcZLdKY9BWN4ArTr9PXwaqLEX8E40eFgl1oUh63kd0Nyrz2I8sMeX +i9bQn9P+PN7F4/w6g3CEIR0JwqH8uyghZVNgepBtljhb//HXeltt08lwSUq6HTrQ +UNoyIBnkiz/r1RYmNzz7dZ6wB3C4FGB33PYPXFIKvF1tjVEK2sUYyJtt3LCDs3+j +TnhMmCWr8n4uIF6CFabW2I+s5c0yhsj55NqJ4js+k8UTav/H9xj8Z7XvGCxUq0DT +bE3txci3OE9kxJRMT6DNrqXGJyV1J23G2pyOsAWZ1SgRxSHUuPzHlqtKZFlhaxP8 +S8ySpg+kUb8OWJDZgoM5pl+z+m6Ss80zDoWo8SnTq1mt1tve1CuBAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFLgHkXlcBvRG/XtZylomkadFK/hT +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQwFAAOCAgEAIZtqBSBdGBanEqT3 +Rz/NyjuujsCCztxIJXgXbODgcMTWltnZ9r96nBO7U5WS/8+S4PPFJzVXqDuiGev4 +iqME3mmL5Dw8veWv0BIb5Ylrc5tvJQJLkIKvQMKtuppgJFqBTQUYo+IzeXoLH5Pt +7DlK9RME7I10nYEKqG/odv6LTytpEoYKNDbdgptvT+Bz3Ul/KD7JO6NXBNiT2Twp +2xIQaOHEibgGIOcberyxk2GaGUARtWqFVwHxtlotJnMnlvm5P1vQiJ3koP26TpUJ +g3933FEFlJ0gcXax7PqJtZwuhfG5WyRasQmr2soaB82G39tp27RIGAAtvKLEiUUj +pQ7hRGU+isFqMB3iYPg6qocJQrmBktwliJiJ8Xw18WLK7nn4GS/+X/jbh87qqA8M +pugLoDzga5SYnH+tBuYc6kIQX+ImFTw3OffXvO645e8D7r0i+yiGNFjEWn9hongP +XvPKnbwbPKfILfanIhHKA9jnZwqKDss1jjQ52MjqjZ9k4DewbNfFj8GQYSbbJIwe +SsCI3zWQzj8C9GRh3sfIB5XeMhg6j6JCQCTl1jNdfK7vsU1P1FeQNWrcrgSXSYk0 +ly4wBOeY99sLAZDBHwo/+ML+TvrbmnNzFrwFuHnYWa8G5z9nODmxfKuU4CkUpijy +323imttUQ/hHWKNddBWcwauwxzQ= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST EV Root CA 2 2023 O=D-Trust GmbH +# Subject: CN=D-TRUST EV Root CA 2 2023 O=D-Trust GmbH +# Label: "D-TRUST EV Root CA 2 2023" +# Serial: 139766439402180512324132425437959641711 +# MD5 Fingerprint: 96:b4:78:09:f0:09:cb:77:eb:bb:1b:4d:6f:36:bc:b6 +# SHA1 Fingerprint: a5:5b:d8:47:6c:8f:19:f7:4c:f4:6d:6b:b6:c2:79:82:22:df:54:8b +# SHA256 Fingerprint: 8e:82:21:b2:e7:d4:00:78:36:a1:67:2f:0d:cc:29:9c:33:bc:07:d3:16:f1:32:fa:1a:20:6d:58:71:50:f1:ce +-----BEGIN CERTIFICATE----- +MIIFqTCCA5GgAwIBAgIQaSYJfoBLTKCnjHhiU19abzANBgkqhkiG9w0BAQ0FADBI +MQswCQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlE +LVRSVVNUIEVWIFJvb3QgQ0EgMiAyMDIzMB4XDTIzMDUwOTA5MTAzM1oXDTM4MDUw +OTA5MTAzMlowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEi +MCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDIgMjAyMzCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBANiOo4mAC7JXUtypU0w3uX9jFxPvp1sjW2l1sJkK +F8GLxNuo4MwxusLyzV3pt/gdr2rElYfXR8mV2IIEUD2BCP/kPbOx1sWy/YgJ25yE +7CUXFId/MHibaljJtnMoPDT3mfd/06b4HEV8rSyMlD/YZxBTfiLNTiVR8CUkNRFe +EMbsh2aJgWi6zCudR3Mfvc2RpHJqnKIbGKBv7FD0fUDCqDDPvXPIEysQEx6Lmqg6 +lHPTGGkKSv/BAQP/eX+1SH977ugpbzZMlWGG2Pmic4ruri+W7mjNPU0oQvlFKzIb +RlUWaqZLKfm7lVa/Rh3sHZMdwGWyH6FDrlaeoLGPaxK3YG14C8qKXO0elg6DpkiV +jTujIcSuWMYAsoS0I6SWhjW42J7YrDRJmGOVxcttSEfi8i4YHtAxq9107PncjLgc +jmgjutDzUNzPZY9zOjLHfP7KgiJPvo5iR2blzYfi6NUPGJ/lBHJLRjwQ8kTCZFZx +TnXonMkmdMV9WdEKWw9t/p51HBjGGjp82A0EzM23RWV6sY+4roRIPrN6TagD4uJ+ +ARZZaBhDM7DS3LAaQzXupdqpRlyuhoFBAUp0JuyfBr/CBTdkdXgpaP3F9ev+R/nk +hbDhezGdpn9yo7nELC7MmVcOIQxFAZRl62UJxmMiCzNJkkg8/M3OsD6Onov4/knF +NXJHAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqvyREBuH +kV8Wub9PS5FeAByxMoAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRCMEAwPqA8oDqG +OGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfZXZfcm9vdF9jYV8y +XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQCTy6UfmRHsmg1fLBWTxj++EI14 +QvBukEdHjqOSMo1wj/Zbjb6JzkcBahsgIIlbyIIQbODnmaprxiqgYzWRaoUlrRc4 +pZt+UPJ26oUFKidBK7GB0aL2QHWpDsvxVUjY7NHss+jOFKE17MJeNRqrphYBBo7q +3C+jisosketSjl8MmxfPy3MHGcRqwnNU73xDUmPBEcrCRbH0O1P1aa4846XerOhU +t7KR/aypH/KH5BfGSah82ApB9PI+53c0BFLd6IHyTS9URZ0V4U/M5d40VxDJI3IX +cI1QcB9WbMy5/zpaT2N6w25lBx2Eof+pDGOJbbJAiDnXH3dotfyc1dZnaVuodNv8 +ifYbMvekJKZ2t0dT741Jj6m2g1qllpBFYfXeA08mD6iL8AOWsKwV0HFaanuU5nCT +2vFp4LJiTZ6P/4mdm13NRemUAiKN4DV/6PEEeXFsVIP4M7kFMhtYVRFP0OUnR3Hs +7dpn1mKmS00PaaLJvOwiS5THaJQXfuKOKD62xur1NGyfN4gHONuGcfrNlUhDbqNP +gofXNJhuS5N5YHVpD/Aa1VP6IQzCP+k/HxiMkl14p3ZnGbuy6n/pcAlWVqOwDAst +Nl7F6cTVg8uGF5csbBNvh1qvSaYd2804BC5f4ko1Di1L+KIkBI3Y4WNeApI02phh +XBxvWHZks/wCuPWdCg== +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign RSA TLS Root CA 2022 - 1 O=SwissSign AG +# Subject: CN=SwissSign RSA TLS Root CA 2022 - 1 O=SwissSign AG +# Label: "SwissSign RSA TLS Root CA 2022 - 1" +# Serial: 388078645722908516278762308316089881486363258315 +# MD5 Fingerprint: 16:2e:e4:19:76:81:85:ba:8e:91:58:f1:15:ef:72:39 +# SHA1 Fingerprint: 81:34:0a:be:4c:cd:ce:cc:e7:7d:cc:8a:d4:57:e2:45:a0:77:5d:ce +# SHA256 Fingerprint: 19:31:44:f4:31:e0:fd:db:74:07:17:d4:de:92:6a:57:11:33:88:4b:43:60:d3:0e:27:29:13:cb:e6:60:ce:41 +-----BEGIN CERTIFICATE----- +MIIFkzCCA3ugAwIBAgIUQ/oMX04bgBhE79G0TzUfRPSA7cswDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzErMCkGA1UE +AxMiU3dpc3NTaWduIFJTQSBUTFMgUm9vdCBDQSAyMDIyIC0gMTAeFw0yMjA2MDgx +MTA4MjJaFw00NzA2MDgxMTA4MjJaMFExCzAJBgNVBAYTAkNIMRUwEwYDVQQKEwxT +d2lzc1NpZ24gQUcxKzApBgNVBAMTIlN3aXNzU2lnbiBSU0EgVExTIFJvb3QgQ0Eg +MjAyMiAtIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDLKmjiC8NX +vDVjvHClO/OMPE5Xlm7DTjak9gLKHqquuN6orx122ro10JFwB9+zBvKK8i5VUXu7 +LCTLf5ImgKO0lPaCoaTo+nUdWfMHamFk4saMla+ju45vVs9xzF6BYQ1t8qsCLqSX +5XH8irCRIFucdFJtrhUnWXjyCcplDn/L9Ovn3KlMd/YrFgSVrpxxpT8q2kFC5zyE +EPThPYxr4iuRR1VPuFa+Rd4iUU1OKNlfGUEGjw5NBuBwQCMBauTLE5tzrE0USJIt +/m2n+IdreXXhvhCxqohAWVTXz8TQm0SzOGlkjIHRI36qOTw7D59Ke4LKa2/KIj4x +0LDQKhySio/YGZxH5D4MucLNvkEM+KRHBdvBFzA4OmnczcNpI/2aDwLOEGrOyvi5 +KaM2iYauC8BPY7kGWUleDsFpswrzd34unYyzJ5jSmY0lpx+Gs6ZUcDj8fV3oT4MM +0ZPlEuRU2j7yrTrePjxF8CgPBrnh25d7mUWe3f6VWQQvdT/TromZhqwUtKiE+shd +OxtYk8EXlFXIC+OCeYSf8wCENO7cMdWP8vpPlkwGqnj73mSiI80fPsWMvDdUDrta +clXvyFu1cvh43zcgTFeRc5JzrBh3Q4IgaezprClG5QtO+DdziZaKHG29777YtvTK +wP1H8K4LWCDFyB02rpeNUIMmJCn3nTsPBQIDAQABo2MwYTAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBRvjmKLk0Ow4UD2p8P98Q+4 +DxU4pTAdBgNVHQ4EFgQUb45ii5NDsOFA9qfD/fEPuA8VOKUwDQYJKoZIhvcNAQEL +BQADggIBAKwsKUF9+lz1GpUYvyypiqkkVHX1uECry6gkUSsYP2OprphWKwVDIqO3 +10aewCoSPY6WlkDfDDOLazeROpW7OSltwAJsipQLBwJNGD77+3v1dj2b9l4wBlgz +Hqp41eZUBDqyggmNzhYzWUUo8aWjlw5DI/0LIICQ/+Mmz7hkkeUFjxOgdg3XNwwQ +iJb0Pr6VvfHDffCjw3lHC1ySFWPtUnWK50Zpy1FVCypM9fJkT6lc/2cyjlUtMoIc +gC9qkfjLvH4YoiaoLqNTKIftV+Vlek4ASltOU8liNr3CjlvrzG4ngRhZi0Rjn9UM +ZfQpZX+RLOV/fuiJz48gy20HQhFRJjKKLjpHE7iNvUcNCfAWpO2Whi4Z2L6MOuhF +LhG6rlrnub+xzI/goP+4s9GFe3lmozm1O2bYQL7Pt2eLSMkZJVX8vY3PXtpOpvJp +zv1/THfQwUY1mFwjmwJFQ5Ra3bxHrSL+ul4vkSkphnsh3m5kt8sNjzdbowhq6/Td +Ao9QAwKxuDdollDruF/UKIqlIgyKhPBZLtU30WHlQnNYKoH3dtvi4k0NX/a3vgW0 +rk4N3hY9A4GzJl5LuEsAz/+MF7psYC0nhzck5npgL7XTgwSqT0N1osGDsieYK7EO +gLrAhV5Cud+xYJHT6xh+cHiudoO+cVrQkOPKwRYlZ0rwtnu64ZzZ +-----END CERTIFICATE----- + +# Issuer: CN=OISTE Server Root ECC G1 O=OISTE Foundation +# Subject: CN=OISTE Server Root ECC G1 O=OISTE Foundation +# Label: "OISTE Server Root ECC G1" +# Serial: 47819833811561661340092227008453318557 +# MD5 Fingerprint: 42:a7:d2:35:ae:02:92:db:19:76:08:de:2f:05:b4:d4 +# SHA1 Fingerprint: 3b:f6:8b:09:ae:2a:92:7b:ba:e3:8d:3f:11:95:d9:e6:44:0c:45:e2 +# SHA256 Fingerprint: ee:c9:97:c0:c3:0f:21:6f:7e:3b:8b:30:7d:2b:ae:42:41:2d:75:3f:c8:21:9d:af:d1:52:0b:25:72:85:0f:49 +-----BEGIN CERTIFICATE----- +MIICNTCCAbqgAwIBAgIQI/nD1jWvjyhLH/BU6n6XnTAKBggqhkjOPQQDAzBLMQsw +CQYDVQQGEwJDSDEZMBcGA1UECgwQT0lTVEUgRm91bmRhdGlvbjEhMB8GA1UEAwwY +T0lTVEUgU2VydmVyIFJvb3QgRUNDIEcxMB4XDTIzMDUzMTE0NDIyOFoXDTQ4MDUy +NDE0NDIyN1owSzELMAkGA1UEBhMCQ0gxGTAXBgNVBAoMEE9JU1RFIEZvdW5kYXRp +b24xITAfBgNVBAMMGE9JU1RFIFNlcnZlciBSb290IEVDQyBHMTB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABBcv+hK8rBjzCvRE1nZCnrPoH7d5qVi2+GXROiFPqOujvqQy +cvO2Ackr/XeFblPdreqqLiWStukhEaivtUwL85Zgmjvn6hp4LrQ95SjeHIC6XG4N +2xml4z+cKrhAS93mT6NjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBQ3 +TYhlz/w9itWj8UnATgwQb0K0nDAdBgNVHQ4EFgQUN02IZc/8PYrVo/FJwE4MEG9C +tJwwDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2kAMGYCMQCpKjAd0MKfkFFR +QD6VVCHNFmb3U2wIFjnQEnx/Yxvf4zgAOdktUyBFCxxgZzFDJe0CMQCSia7pXGKD +YmH5LVerVrkR3SW+ak5KGoJr3M/TvEqzPNcum9v4KGm8ay3sMaE641c= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE Server Root RSA G1 O=OISTE Foundation +# Subject: CN=OISTE Server Root RSA G1 O=OISTE Foundation +# Label: " OISTE Server Root RSA G1" +# Serial: 113845518112613905024960613408179309848 +# MD5 Fingerprint: 23:a7:9e:d4:70:b8:b9:14:57:41:8a:7e:44:59:e2:68 +# SHA1 Fingerprint: f7:00:34:25:94:88:68:31:e4:34:87:3f:70:fe:86:b3:86:9f:f0:6e +# SHA256 Fingerprint: 9a:e3:62:32:a5:18:9f:fd:db:35:3d:fd:26:52:0c:01:53:95:d2:27:77:da:c5:9d:b5:7b:98:c0:89:a6:51:e6 +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIQVaXZZ5Qoxu0M+ifdWwFNGDANBgkqhkiG9w0BAQwFADBL +MQswCQYDVQQGEwJDSDEZMBcGA1UECgwQT0lTVEUgRm91bmRhdGlvbjEhMB8GA1UE +AwwYT0lTVEUgU2VydmVyIFJvb3QgUlNBIEcxMB4XDTIzMDUzMTE0MzcxNloXDTQ4 +MDUyNDE0MzcxNVowSzELMAkGA1UEBhMCQ0gxGTAXBgNVBAoMEE9JU1RFIEZvdW5k +YXRpb24xITAfBgNVBAMMGE9JU1RFIFNlcnZlciBSb290IFJTQSBHMTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAKqu9KuCz/vlNwvn1ZatkOhLKdxVYOPM +vLO8LZK55KN68YG0nnJyQ98/qwsmtO57Gmn7KNByXEptaZnwYx4M0rH/1ow00O7b +rEi56rAUjtgHqSSY3ekJvqgiG1k50SeH3BzN+Puz6+mTeO0Pzjd8JnduodgsIUzk +ik/HEzxux9UTl7Ko2yRpg1bTacuCErudG/L4NPKYKyqOBGf244ehHa1uzjZ0Dl4z +O8vbUZeUapU8zhhabkvG/AePLhq5SvdkNCncpo1Q4Y2LS+VIG24ugBA/5J8bZT8R +tOpXaZ+0AOuFJJkk9SGdl6r7NH8CaxWQrbueWhl/pIzY+m0o/DjH40ytas7ZTpOS +jswMZ78LS5bOZmdTaMsXEY5Z96ycG7mOaES3GK/m5Q9l3JUJsJMStR8+lKXHiHUh +sd4JJCpM4rzsTGdHwimIuQq6+cF0zowYJmXa92/GjHtoXAvuY8BeS/FOzJ8vD+Ho +mnqT8eDI278n5mUpezbgMxVz8p1rhAhoKzYHKyfMeNhqhw5HdPSqoBNdZH702xSu ++zrkL8Fl47l6QGzwBrd7KJvX4V84c5Ss2XCTLdyEr0YconosP4EmQufU2MVshGYR +i3drVByjtdgQ8K4p92cIiBdcuJd5z+orKu5YM+Vt6SmqZQENghPsJQtdLEByFSnT +kCz3GkPVavBpAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU +8snBDw1jALvsRQ5KH7WxszbNDo0wHQYDVR0OBBYEFPLJwQ8NYwC77EUOSh+1sbM2 +zQ6NMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQwFAAOCAgEANGd5sjrG5T33 +I3K5Ce+SrScfoE4KsvXaFwyihdJ+klH9FWXXXGtkFu6KRcoMQzZENdl//nk6HOjG +5D1rd9QhEOP28yBOqb6J8xycqd+8MDoX0TJD0KqKchxRKEzdNsjkLWd9kYccnbz8 +qyiWXmFcuCIzGEgWUOrKL+mlSdx/PKQZvDatkuK59EvV6wit53j+F8Bdh3foZ3dP +AGav9LEDOr4SfEE15fSmG0eLy3n31r8Xbk5l8PjaV8GUgeV6Vg27Rn9vkf195hfk +gSe7BYhW3SCl95gtkRlpMV+bMPKZrXJAlszYd2abtNUOshD+FKrDgHGdPY3ofRRs +YWSGRqbXVMW215AWRqWFyp464+YTFrYVI8ypKVL9AMb2kI5Wj4kI3Zaq5tNqqYY1 +9tVFeEJKRvwDyF7YZvZFZSS0vod7VSCd9521Kvy5YhnLbDuv0204bKt7ph6N/Ome +/msVuduCmsuY33OhkKCgxeDoAaijFJzIwZqsFVAzje18KotzlUBDJvyBpCpfOZC3 +J8tRd/iWkx7P8nd9H0aTolkelUTFLXVksNb54Dxp6gS1HAviRkRNQzuXSXERvSS2 +wq1yVAb+axj5d9spLFKebXd7Yv0PTY6YMjAwcRLWJTXjn/hvnLXrahut6hDTlhZy +BiElxky8j3C7DOReIoMt0r7+hVu05L0= +-----END CERTIFICATE----- diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/core.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/core.py new file mode 100644 index 0000000..1c9661c --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/core.py @@ -0,0 +1,83 @@ +""" +certifi.py +~~~~~~~~~~ + +This module returns the installation location of cacert.pem or its contents. +""" +import sys +import atexit + +def exit_cacert_ctx() -> None: + _CACERT_CTX.__exit__(None, None, None) # type: ignore[union-attr] + + +if sys.version_info >= (3, 11): + + from importlib.resources import as_file, files + + _CACERT_CTX = None + _CACERT_PATH = None + + def where() -> str: + # This is slightly terrible, but we want to delay extracting the file + # in cases where we're inside of a zipimport situation until someone + # actually calls where(), but we don't want to re-extract the file + # on every call of where(), so we'll do it once then store it in a + # global variable. + global _CACERT_CTX + global _CACERT_PATH + if _CACERT_PATH is None: + # This is slightly janky, the importlib.resources API wants you to + # manage the cleanup of this file, so it doesn't actually return a + # path, it returns a context manager that will give you the path + # when you enter it and will do any cleanup when you leave it. In + # the common case of not needing a temporary file, it will just + # return the file system location and the __exit__() is a no-op. + # + # We also have to hold onto the actual context manager, because + # it will do the cleanup whenever it gets garbage collected, so + # we will also store that at the global level as well. + _CACERT_CTX = as_file(files("certifi").joinpath("cacert.pem")) + _CACERT_PATH = str(_CACERT_CTX.__enter__()) + atexit.register(exit_cacert_ctx) + + return _CACERT_PATH + + def contents() -> str: + return files("certifi").joinpath("cacert.pem").read_text(encoding="ascii") + +else: + + from importlib.resources import path as get_path, read_text + + _CACERT_CTX = None + _CACERT_PATH = None + + def where() -> str: + # This is slightly terrible, but we want to delay extracting the + # file in cases where we're inside of a zipimport situation until + # someone actually calls where(), but we don't want to re-extract + # the file on every call of where(), so we'll do it once then store + # it in a global variable. + global _CACERT_CTX + global _CACERT_PATH + if _CACERT_PATH is None: + # This is slightly janky, the importlib.resources API wants you + # to manage the cleanup of this file, so it doesn't actually + # return a path, it returns a context manager that will give + # you the path when you enter it and will do any cleanup when + # you leave it. In the common case of not needing a temporary + # file, it will just return the file system location and the + # __exit__() is a no-op. + # + # We also have to hold onto the actual context manager, because + # it will do the cleanup whenever it gets garbage collected, so + # we will also store that at the global level as well. + _CACERT_CTX = get_path("certifi", "cacert.pem") + _CACERT_PATH = str(_CACERT_CTX.__enter__()) + atexit.register(exit_cacert_ctx) + + return _CACERT_PATH + + def contents() -> str: + return read_text("certifi", "cacert.pem", encoding="ascii") diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/py.typed b/search_agent/search_agent/.venv/lib/python3.12/site-packages/certifi/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/INSTALLER b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/METADATA b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/METADATA new file mode 100644 index 0000000..8d32edc --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/METADATA @@ -0,0 +1,764 @@ +Metadata-Version: 2.4 +Name: charset-normalizer +Version: 3.4.4 +Summary: The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. +Author-email: "Ahmed R. TAHRI" +Maintainer-email: "Ahmed R. TAHRI" +License: MIT +Project-URL: Changelog, https://github.com/jawah/charset_normalizer/blob/master/CHANGELOG.md +Project-URL: Documentation, https://charset-normalizer.readthedocs.io/ +Project-URL: Code, https://github.com/jawah/charset_normalizer +Project-URL: Issue tracker, https://github.com/jawah/charset_normalizer/issues +Keywords: encoding,charset,charset-detector,detector,normalization,unicode,chardet,detect +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Text Processing :: Linguistic +Classifier: Topic :: Utilities +Classifier: Typing :: Typed +Requires-Python: >=3.7 +Description-Content-Type: text/markdown +License-File: LICENSE +Provides-Extra: unicode-backport +Dynamic: license-file + +

    Charset Detection, for Everyone 👋

    + +

    + The Real First Universal Charset Detector
    + + + + + Download Count Total + + + + +

    +

    + Featured Packages
    + + Static Badge + + + Static Badge + +

    +

    + In other language (unofficial port - by the community)
    + + Static Badge + +

    + +> A library that helps you read text from an unknown charset encoding.
    Motivated by `chardet`, +> I'm trying to resolve the issue by taking a new approach. +> All IANA character set names for which the Python core library provides codecs are supported. + +

    + >>>>> 👉 Try Me Online Now, Then Adopt Me 👈 <<<<< +

    + +This project offers you an alternative to **Universal Charset Encoding Detector**, also known as **Chardet**. + +| Feature | [Chardet](https://github.com/chardet/chardet) | Charset Normalizer | [cChardet](https://github.com/PyYoshi/cChardet) | +|--------------------------------------------------|:---------------------------------------------:|:--------------------------------------------------------------------------------------------------:|:-----------------------------------------------:| +| `Fast` | ❌ | ✅ | ✅ | +| `Universal**` | ❌ | ✅ | ❌ | +| `Reliable` **without** distinguishable standards | ❌ | ✅ | ✅ | +| `Reliable` **with** distinguishable standards | ✅ | ✅ | ✅ | +| `License` | LGPL-2.1
    _restrictive_ | MIT | MPL-1.1
    _restrictive_ | +| `Native Python` | ✅ | ✅ | ❌ | +| `Detect spoken language` | ❌ | ✅ | N/A | +| `UnicodeDecodeError Safety` | ❌ | ✅ | ❌ | +| `Whl Size (min)` | 193.6 kB | 42 kB | ~200 kB | +| `Supported Encoding` | 33 | 🎉 [99](https://charset-normalizer.readthedocs.io/en/latest/user/support.html#supported-encodings) | 40 | + +

    +Reading Normalized TextCat Reading Text +

    + +*\*\* : They are clearly using specific code for a specific encoding even if covering most of used one*
    + +## ⚡ Performance + +This package offer better performance than its counterpart Chardet. Here are some numbers. + +| Package | Accuracy | Mean per file (ms) | File per sec (est) | +|-----------------------------------------------|:--------:|:------------------:|:------------------:| +| [chardet](https://github.com/chardet/chardet) | 86 % | 63 ms | 16 file/sec | +| charset-normalizer | **98 %** | **10 ms** | 100 file/sec | + +| Package | 99th percentile | 95th percentile | 50th percentile | +|-----------------------------------------------|:---------------:|:---------------:|:---------------:| +| [chardet](https://github.com/chardet/chardet) | 265 ms | 71 ms | 7 ms | +| charset-normalizer | 100 ms | 50 ms | 5 ms | + +_updated as of december 2024 using CPython 3.12_ + +Chardet's performance on larger file (1MB+) are very poor. Expect huge difference on large payload. + +> Stats are generated using 400+ files using default parameters. More details on used files, see GHA workflows. +> And yes, these results might change at any time. The dataset can be updated to include more files. +> The actual delays heavily depends on your CPU capabilities. The factors should remain the same. +> Keep in mind that the stats are generous and that Chardet accuracy vs our is measured using Chardet initial capability +> (e.g. Supported Encoding) Challenge-them if you want. + +## ✨ Installation + +Using pip: + +```sh +pip install charset-normalizer -U +``` + +## 🚀 Basic Usage + +### CLI +This package comes with a CLI. + +``` +usage: normalizer [-h] [-v] [-a] [-n] [-m] [-r] [-f] [-t THRESHOLD] + file [file ...] + +The Real First Universal Charset Detector. Discover originating encoding used +on text file. Normalize text to unicode. + +positional arguments: + files File(s) to be analysed + +optional arguments: + -h, --help show this help message and exit + -v, --verbose Display complementary information about file if any. + Stdout will contain logs about the detection process. + -a, --with-alternative + Output complementary possibilities if any. Top-level + JSON WILL be a list. + -n, --normalize Permit to normalize input file. If not set, program + does not write anything. + -m, --minimal Only output the charset detected to STDOUT. Disabling + JSON output. + -r, --replace Replace file when trying to normalize it instead of + creating a new one. + -f, --force Replace file without asking if you are sure, use this + flag with caution. + -t THRESHOLD, --threshold THRESHOLD + Define a custom maximum amount of chaos allowed in + decoded content. 0. <= chaos <= 1. + --version Show version information and exit. +``` + +```bash +normalizer ./data/sample.1.fr.srt +``` + +or + +```bash +python -m charset_normalizer ./data/sample.1.fr.srt +``` + +🎉 Since version 1.4.0 the CLI produce easily usable stdout result in JSON format. + +```json +{ + "path": "/home/default/projects/charset_normalizer/data/sample.1.fr.srt", + "encoding": "cp1252", + "encoding_aliases": [ + "1252", + "windows_1252" + ], + "alternative_encodings": [ + "cp1254", + "cp1256", + "cp1258", + "iso8859_14", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_9", + "latin_1", + "mbcs" + ], + "language": "French", + "alphabets": [ + "Basic Latin", + "Latin-1 Supplement" + ], + "has_sig_or_bom": false, + "chaos": 0.149, + "coherence": 97.152, + "unicode_path": null, + "is_preferred": true +} +``` + +### Python +*Just print out normalized text* +```python +from charset_normalizer import from_path + +results = from_path('./my_subtitle.srt') + +print(str(results.best())) +``` + +*Upgrade your code without effort* +```python +from charset_normalizer import detect +``` + +The above code will behave the same as **chardet**. We ensure that we offer the best (reasonable) BC result possible. + +See the docs for advanced usage : [readthedocs.io](https://charset-normalizer.readthedocs.io/en/latest/) + +## 😇 Why + +When I started using Chardet, I noticed that it was not suited to my expectations, and I wanted to propose a +reliable alternative using a completely different method. Also! I never back down on a good challenge! + +I **don't care** about the **originating charset** encoding, because **two different tables** can +produce **two identical rendered string.** +What I want is to get readable text, the best I can. + +In a way, **I'm brute forcing text decoding.** How cool is that ? 😎 + +Don't confuse package **ftfy** with charset-normalizer or chardet. ftfy goal is to repair Unicode string whereas charset-normalizer to convert raw file in unknown encoding to unicode. + +## 🍰 How + + - Discard all charset encoding table that could not fit the binary content. + - Measure noise, or the mess once opened (by chunks) with a corresponding charset encoding. + - Extract matches with the lowest mess detected. + - Additionally, we measure coherence / probe for a language. + +**Wait a minute**, what is noise/mess and coherence according to **YOU ?** + +*Noise :* I opened hundred of text files, **written by humans**, with the wrong encoding table. **I observed**, then +**I established** some ground rules about **what is obvious** when **it seems like** a mess (aka. defining noise in rendered text). + I know that my interpretation of what is noise is probably incomplete, feel free to contribute in order to + improve or rewrite it. + +*Coherence :* For each language there is on earth, we have computed ranked letter appearance occurrences (the best we can). So I thought +that intel is worth something here. So I use those records against decoded text to check if I can detect intelligent design. + +## ⚡ Known limitations + + - Language detection is unreliable when text contains two or more languages sharing identical letters. (eg. HTML (english tags) + Turkish content (Sharing Latin characters)) + - Every charset detector heavily depends on sufficient content. In common cases, do not bother run detection on very tiny content. + +## ⚠️ About Python EOLs + +**If you are running:** + +- Python >=2.7,<3.5: Unsupported +- Python 3.5: charset-normalizer < 2.1 +- Python 3.6: charset-normalizer < 3.1 +- Python 3.7: charset-normalizer < 4.0 + +Upgrade your Python interpreter as soon as possible. + +## 👤 Contributing + +Contributions, issues and feature requests are very much welcome.
    +Feel free to check [issues page](https://github.com/ousret/charset_normalizer/issues) if you want to contribute. + +## 📝 License + +Copyright © [Ahmed TAHRI @Ousret](https://github.com/Ousret).
    +This project is [MIT](https://github.com/Ousret/charset_normalizer/blob/master/LICENSE) licensed. + +Characters frequencies used in this project © 2012 [Denny Vrandečić](http://simia.net/letters/) + +## 💼 For Enterprise + +Professional support for charset-normalizer is available as part of the [Tidelift +Subscription][1]. Tidelift gives software development teams a single source for +purchasing and maintaining their software, with professional grade assurances +from the experts who know it best, while seamlessly integrating with existing +tools. + +[1]: https://tidelift.com/subscription/pkg/pypi-charset-normalizer?utm_source=pypi-charset-normalizer&utm_medium=readme + +[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/7297/badge)](https://www.bestpractices.dev/projects/7297) + +# Changelog +All notable changes to charset-normalizer will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). + +## [3.4.4](https://github.com/Ousret/charset_normalizer/compare/3.4.2...3.4.4) (2025-10-13) + +### Changed +- Bound `setuptools` to a specific constraint `setuptools>=68,<=81`. +- Raised upper bound of mypyc for the optional pre-built extension to v1.18.2 + +### Removed +- `setuptools-scm` as a build dependency. + +### Misc +- Enforced hashes in `dev-requirements.txt` and created `ci-requirements.txt` for security purposes. +- Additional pre-built wheels for riscv64, s390x, and armv7l architectures. +- Restore ` multiple.intoto.jsonl` in GitHub releases in addition to individual attestation file per wheel. + +## [3.4.3](https://github.com/Ousret/charset_normalizer/compare/3.4.2...3.4.3) (2025-08-09) + +### Changed +- mypy(c) is no longer a required dependency at build time if `CHARSET_NORMALIZER_USE_MYPYC` isn't set to `1`. (#595) (#583) +- automatically lower confidence on small bytes samples that are not Unicode in `detect` output legacy function. (#391) + +### Added +- Custom build backend to overcome inability to mark mypy as an optional dependency in the build phase. +- Support for Python 3.14 + +### Fixed +- sdist archive contained useless directories. +- automatically fallback on valid UTF-16 or UTF-32 even if the md says it's noisy. (#633) + +### Misc +- SBOM are automatically published to the relevant GitHub release to comply with regulatory changes. + Each published wheel comes with its SBOM. We choose CycloneDX as the format. +- Prebuilt optimized wheel are no longer distributed by default for CPython 3.7 due to a change in cibuildwheel. + +## [3.4.2](https://github.com/Ousret/charset_normalizer/compare/3.4.1...3.4.2) (2025-05-02) + +### Fixed +- Addressed the DeprecationWarning in our CLI regarding `argparse.FileType` by backporting the target class into the package. (#591) +- Improved the overall reliability of the detector with CJK Ideographs. (#605) (#587) + +### Changed +- Optional mypyc compilation upgraded to version 1.15 for Python >= 3.8 + +## [3.4.1](https://github.com/Ousret/charset_normalizer/compare/3.4.0...3.4.1) (2024-12-24) + +### Changed +- Project metadata are now stored using `pyproject.toml` instead of `setup.cfg` using setuptools as the build backend. +- Enforce annotation delayed loading for a simpler and consistent types in the project. +- Optional mypyc compilation upgraded to version 1.14 for Python >= 3.8 + +### Added +- pre-commit configuration. +- noxfile. + +### Removed +- `build-requirements.txt` as per using `pyproject.toml` native build configuration. +- `bin/integration.py` and `bin/serve.py` in favor of downstream integration test (see noxfile). +- `setup.cfg` in favor of `pyproject.toml` metadata configuration. +- Unused `utils.range_scan` function. + +### Fixed +- Converting content to Unicode bytes may insert `utf_8` instead of preferred `utf-8`. (#572) +- Deprecation warning "'count' is passed as positional argument" when converting to Unicode bytes on Python 3.13+ + +## [3.4.0](https://github.com/Ousret/charset_normalizer/compare/3.3.2...3.4.0) (2024-10-08) + +### Added +- Argument `--no-preemptive` in the CLI to prevent the detector to search for hints. +- Support for Python 3.13 (#512) + +### Fixed +- Relax the TypeError exception thrown when trying to compare a CharsetMatch with anything else than a CharsetMatch. +- Improved the general reliability of the detector based on user feedbacks. (#520) (#509) (#498) (#407) (#537) +- Declared charset in content (preemptive detection) not changed when converting to utf-8 bytes. (#381) + +## [3.3.2](https://github.com/Ousret/charset_normalizer/compare/3.3.1...3.3.2) (2023-10-31) + +### Fixed +- Unintentional memory usage regression when using large payload that match several encoding (#376) +- Regression on some detection case showcased in the documentation (#371) + +### Added +- Noise (md) probe that identify malformed arabic representation due to the presence of letters in isolated form (credit to my wife) + +## [3.3.1](https://github.com/Ousret/charset_normalizer/compare/3.3.0...3.3.1) (2023-10-22) + +### Changed +- Optional mypyc compilation upgraded to version 1.6.1 for Python >= 3.8 +- Improved the general detection reliability based on reports from the community + +## [3.3.0](https://github.com/Ousret/charset_normalizer/compare/3.2.0...3.3.0) (2023-09-30) + +### Added +- Allow to execute the CLI (e.g. normalizer) through `python -m charset_normalizer.cli` or `python -m charset_normalizer` +- Support for 9 forgotten encoding that are supported by Python but unlisted in `encoding.aliases` as they have no alias (#323) + +### Removed +- (internal) Redundant utils.is_ascii function and unused function is_private_use_only +- (internal) charset_normalizer.assets is moved inside charset_normalizer.constant + +### Changed +- (internal) Unicode code blocks in constants are updated using the latest v15.0.0 definition to improve detection +- Optional mypyc compilation upgraded to version 1.5.1 for Python >= 3.8 + +### Fixed +- Unable to properly sort CharsetMatch when both chaos/noise and coherence were close due to an unreachable condition in \_\_lt\_\_ (#350) + +## [3.2.0](https://github.com/Ousret/charset_normalizer/compare/3.1.0...3.2.0) (2023-06-07) + +### Changed +- Typehint for function `from_path` no longer enforce `PathLike` as its first argument +- Minor improvement over the global detection reliability + +### Added +- Introduce function `is_binary` that relies on main capabilities, and optimized to detect binaries +- Propagate `enable_fallback` argument throughout `from_bytes`, `from_path`, and `from_fp` that allow a deeper control over the detection (default True) +- Explicit support for Python 3.12 + +### Fixed +- Edge case detection failure where a file would contain 'very-long' camel cased word (Issue #289) + +## [3.1.0](https://github.com/Ousret/charset_normalizer/compare/3.0.1...3.1.0) (2023-03-06) + +### Added +- Argument `should_rename_legacy` for legacy function `detect` and disregard any new arguments without errors (PR #262) + +### Removed +- Support for Python 3.6 (PR #260) + +### Changed +- Optional speedup provided by mypy/c 1.0.1 + +## [3.0.1](https://github.com/Ousret/charset_normalizer/compare/3.0.0...3.0.1) (2022-11-18) + +### Fixed +- Multi-bytes cutter/chunk generator did not always cut correctly (PR #233) + +### Changed +- Speedup provided by mypy/c 0.990 on Python >= 3.7 + +## [3.0.0](https://github.com/Ousret/charset_normalizer/compare/2.1.1...3.0.0) (2022-10-20) + +### Added +- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results +- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES +- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio +- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl) + +### Changed +- Build with static metadata using 'build' frontend +- Make the language detection stricter +- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1 + +### Fixed +- CLI with opt --normalize fail when using full path for files +- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it +- Sphinx warnings when generating the documentation + +### Removed +- Coherence detector no longer return 'Simple English' instead return 'English' +- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese' +- Breaking: Method `first()` and `best()` from CharsetMatch +- UTF-7 will no longer appear as "detected" without a recognized SIG/mark (is unreliable/conflict with ASCII) +- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches +- Breaking: Top-level function `normalize` +- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch +- Support for the backport `unicodedata2` + +## [3.0.0rc1](https://github.com/Ousret/charset_normalizer/compare/3.0.0b2...3.0.0rc1) (2022-10-18) + +### Added +- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results +- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES +- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio + +### Changed +- Build with static metadata using 'build' frontend +- Make the language detection stricter + +### Fixed +- CLI with opt --normalize fail when using full path for files +- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it + +### Removed +- Coherence detector no longer return 'Simple English' instead return 'English' +- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese' + +## [3.0.0b2](https://github.com/Ousret/charset_normalizer/compare/3.0.0b1...3.0.0b2) (2022-08-21) + +### Added +- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl) + +### Removed +- Breaking: Method `first()` and `best()` from CharsetMatch +- UTF-7 will no longer appear as "detected" without a recognized SIG/mark (is unreliable/conflict with ASCII) + +### Fixed +- Sphinx warnings when generating the documentation + +## [3.0.0b1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...3.0.0b1) (2022-08-15) + +### Changed +- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1 + +### Removed +- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches +- Breaking: Top-level function `normalize` +- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch +- Support for the backport `unicodedata2` + +## [2.1.1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...2.1.1) (2022-08-19) + +### Deprecated +- Function `normalize` scheduled for removal in 3.0 + +### Changed +- Removed useless call to decode in fn is_unprintable (#206) + +### Fixed +- Third-party library (i18n xgettext) crashing not recognizing utf_8 (PEP 263) with underscore from [@aleksandernovikov](https://github.com/aleksandernovikov) (#204) + +## [2.1.0](https://github.com/Ousret/charset_normalizer/compare/2.0.12...2.1.0) (2022-06-19) + +### Added +- Output the Unicode table version when running the CLI with `--version` (PR #194) + +### Changed +- Re-use decoded buffer for single byte character sets from [@nijel](https://github.com/nijel) (PR #175) +- Fixing some performance bottlenecks from [@deedy5](https://github.com/deedy5) (PR #183) + +### Fixed +- Workaround potential bug in cpython with Zero Width No-Break Space located in Arabic Presentation Forms-B, Unicode 1.1 not acknowledged as space (PR #175) +- CLI default threshold aligned with the API threshold from [@oleksandr-kuzmenko](https://github.com/oleksandr-kuzmenko) (PR #181) + +### Removed +- Support for Python 3.5 (PR #192) + +### Deprecated +- Use of backport unicodedata from `unicodedata2` as Python is quickly catching up, scheduled for removal in 3.0 (PR #194) + +## [2.0.12](https://github.com/Ousret/charset_normalizer/compare/2.0.11...2.0.12) (2022-02-12) + +### Fixed +- ASCII miss-detection on rare cases (PR #170) + +## [2.0.11](https://github.com/Ousret/charset_normalizer/compare/2.0.10...2.0.11) (2022-01-30) + +### Added +- Explicit support for Python 3.11 (PR #164) + +### Changed +- The logging behavior have been completely reviewed, now using only TRACE and DEBUG levels (PR #163 #165) + +## [2.0.10](https://github.com/Ousret/charset_normalizer/compare/2.0.9...2.0.10) (2022-01-04) + +### Fixed +- Fallback match entries might lead to UnicodeDecodeError for large bytes sequence (PR #154) + +### Changed +- Skipping the language-detection (CD) on ASCII (PR #155) + +## [2.0.9](https://github.com/Ousret/charset_normalizer/compare/2.0.8...2.0.9) (2021-12-03) + +### Changed +- Moderating the logging impact (since 2.0.8) for specific environments (PR #147) + +### Fixed +- Wrong logging level applied when setting kwarg `explain` to True (PR #146) + +## [2.0.8](https://github.com/Ousret/charset_normalizer/compare/2.0.7...2.0.8) (2021-11-24) +### Changed +- Improvement over Vietnamese detection (PR #126) +- MD improvement on trailing data and long foreign (non-pure latin) data (PR #124) +- Efficiency improvements in cd/alphabet_languages from [@adbar](https://github.com/adbar) (PR #122) +- call sum() without an intermediary list following PEP 289 recommendations from [@adbar](https://github.com/adbar) (PR #129) +- Code style as refactored by Sourcery-AI (PR #131) +- Minor adjustment on the MD around european words (PR #133) +- Remove and replace SRTs from assets / tests (PR #139) +- Initialize the library logger with a `NullHandler` by default from [@nmaynes](https://github.com/nmaynes) (PR #135) +- Setting kwarg `explain` to True will add provisionally (bounded to function lifespan) a specific stream handler (PR #135) + +### Fixed +- Fix large (misleading) sequence giving UnicodeDecodeError (PR #137) +- Avoid using too insignificant chunk (PR #137) + +### Added +- Add and expose function `set_logging_handler` to configure a specific StreamHandler from [@nmaynes](https://github.com/nmaynes) (PR #135) +- Add `CHANGELOG.md` entries, format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) (PR #141) + +## [2.0.7](https://github.com/Ousret/charset_normalizer/compare/2.0.6...2.0.7) (2021-10-11) +### Added +- Add support for Kazakh (Cyrillic) language detection (PR #109) + +### Changed +- Further, improve inferring the language from a given single-byte code page (PR #112) +- Vainly trying to leverage PEP263 when PEP3120 is not supported (PR #116) +- Refactoring for potential performance improvements in loops from [@adbar](https://github.com/adbar) (PR #113) +- Various detection improvement (MD+CD) (PR #117) + +### Removed +- Remove redundant logging entry about detected language(s) (PR #115) + +### Fixed +- Fix a minor inconsistency between Python 3.5 and other versions regarding language detection (PR #117 #102) + +## [2.0.6](https://github.com/Ousret/charset_normalizer/compare/2.0.5...2.0.6) (2021-09-18) +### Fixed +- Unforeseen regression with the loss of the backward-compatibility with some older minor of Python 3.5.x (PR #100) +- Fix CLI crash when using --minimal output in certain cases (PR #103) + +### Changed +- Minor improvement to the detection efficiency (less than 1%) (PR #106 #101) + +## [2.0.5](https://github.com/Ousret/charset_normalizer/compare/2.0.4...2.0.5) (2021-09-14) +### Changed +- The project now comply with: flake8, mypy, isort and black to ensure a better overall quality (PR #81) +- The BC-support with v1.x was improved, the old staticmethods are restored (PR #82) +- The Unicode detection is slightly improved (PR #93) +- Add syntax sugar \_\_bool\_\_ for results CharsetMatches list-container (PR #91) + +### Removed +- The project no longer raise warning on tiny content given for detection, will be simply logged as warning instead (PR #92) + +### Fixed +- In some rare case, the chunks extractor could cut in the middle of a multi-byte character and could mislead the mess detection (PR #95) +- Some rare 'space' characters could trip up the UnprintablePlugin/Mess detection (PR #96) +- The MANIFEST.in was not exhaustive (PR #78) + +## [2.0.4](https://github.com/Ousret/charset_normalizer/compare/2.0.3...2.0.4) (2021-07-30) +### Fixed +- The CLI no longer raise an unexpected exception when no encoding has been found (PR #70) +- Fix accessing the 'alphabets' property when the payload contains surrogate characters (PR #68) +- The logger could mislead (explain=True) on detected languages and the impact of one MBCS match (PR #72) +- Submatch factoring could be wrong in rare edge cases (PR #72) +- Multiple files given to the CLI were ignored when publishing results to STDOUT. (After the first path) (PR #72) +- Fix line endings from CRLF to LF for certain project files (PR #67) + +### Changed +- Adjust the MD to lower the sensitivity, thus improving the global detection reliability (PR #69 #76) +- Allow fallback on specified encoding if any (PR #71) + +## [2.0.3](https://github.com/Ousret/charset_normalizer/compare/2.0.2...2.0.3) (2021-07-16) +### Changed +- Part of the detection mechanism has been improved to be less sensitive, resulting in more accurate detection results. Especially ASCII. (PR #63) +- According to the community wishes, the detection will fall back on ASCII or UTF-8 in a last-resort case. (PR #64) + +## [2.0.2](https://github.com/Ousret/charset_normalizer/compare/2.0.1...2.0.2) (2021-07-15) +### Fixed +- Empty/Too small JSON payload miss-detection fixed. Report from [@tseaver](https://github.com/tseaver) (PR #59) + +### Changed +- Don't inject unicodedata2 into sys.modules from [@akx](https://github.com/akx) (PR #57) + +## [2.0.1](https://github.com/Ousret/charset_normalizer/compare/2.0.0...2.0.1) (2021-07-13) +### Fixed +- Make it work where there isn't a filesystem available, dropping assets frequencies.json. Report from [@sethmlarson](https://github.com/sethmlarson). (PR #55) +- Using explain=False permanently disable the verbose output in the current runtime (PR #47) +- One log entry (language target preemptive) was not show in logs when using explain=True (PR #47) +- Fix undesired exception (ValueError) on getitem of instance CharsetMatches (PR #52) + +### Changed +- Public function normalize default args values were not aligned with from_bytes (PR #53) + +### Added +- You may now use charset aliases in cp_isolation and cp_exclusion arguments (PR #47) + +## [2.0.0](https://github.com/Ousret/charset_normalizer/compare/1.4.1...2.0.0) (2021-07-02) +### Changed +- 4x to 5 times faster than the previous 1.4.0 release. At least 2x faster than Chardet. +- Accent has been made on UTF-8 detection, should perform rather instantaneous. +- The backward compatibility with Chardet has been greatly improved. The legacy detect function returns an identical charset name whenever possible. +- The detection mechanism has been slightly improved, now Turkish content is detected correctly (most of the time) +- The program has been rewritten to ease the readability and maintainability. (+Using static typing)+ +- utf_7 detection has been reinstated. + +### Removed +- This package no longer require anything when used with Python 3.5 (Dropped cached_property) +- Removed support for these languages: Catalan, Esperanto, Kazakh, Baque, Volapük, Azeri, Galician, Nynorsk, Macedonian, and Serbocroatian. +- The exception hook on UnicodeDecodeError has been removed. + +### Deprecated +- Methods coherence_non_latin, w_counter, chaos_secondary_pass of the class CharsetMatch are now deprecated and scheduled for removal in v3.0 + +### Fixed +- The CLI output used the relative path of the file(s). Should be absolute. + +## [1.4.1](https://github.com/Ousret/charset_normalizer/compare/1.4.0...1.4.1) (2021-05-28) +### Fixed +- Logger configuration/usage no longer conflict with others (PR #44) + +## [1.4.0](https://github.com/Ousret/charset_normalizer/compare/1.3.9...1.4.0) (2021-05-21) +### Removed +- Using standard logging instead of using the package loguru. +- Dropping nose test framework in favor of the maintained pytest. +- Choose to not use dragonmapper package to help with gibberish Chinese/CJK text. +- Require cached_property only for Python 3.5 due to constraint. Dropping for every other interpreter version. +- Stop support for UTF-7 that does not contain a SIG. +- Dropping PrettyTable, replaced with pure JSON output in CLI. + +### Fixed +- BOM marker in a CharsetNormalizerMatch instance could be False in rare cases even if obviously present. Due to the sub-match factoring process. +- Not searching properly for the BOM when trying utf32/16 parent codec. + +### Changed +- Improving the package final size by compressing frequencies.json. +- Huge improvement over the larges payload. + +### Added +- CLI now produces JSON consumable output. +- Return ASCII if given sequences fit. Given reasonable confidence. + +## [1.3.9](https://github.com/Ousret/charset_normalizer/compare/1.3.8...1.3.9) (2021-05-13) + +### Fixed +- In some very rare cases, you may end up getting encode/decode errors due to a bad bytes payload (PR #40) + +## [1.3.8](https://github.com/Ousret/charset_normalizer/compare/1.3.7...1.3.8) (2021-05-12) + +### Fixed +- Empty given payload for detection may cause an exception if trying to access the `alphabets` property. (PR #39) + +## [1.3.7](https://github.com/Ousret/charset_normalizer/compare/1.3.6...1.3.7) (2021-05-12) + +### Fixed +- The legacy detect function should return UTF-8-SIG if sig is present in the payload. (PR #38) + +## [1.3.6](https://github.com/Ousret/charset_normalizer/compare/1.3.5...1.3.6) (2021-02-09) + +### Changed +- Amend the previous release to allow prettytable 2.0 (PR #35) + +## [1.3.5](https://github.com/Ousret/charset_normalizer/compare/1.3.4...1.3.5) (2021-02-08) + +### Fixed +- Fix error while using the package with a python pre-release interpreter (PR #33) + +### Changed +- Dependencies refactoring, constraints revised. + +### Added +- Add python 3.9 and 3.10 to the supported interpreters + +MIT License + +Copyright (c) 2025 TAHRI Ahmed R. + +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/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/RECORD b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/RECORD new file mode 100644 index 0000000..088021d --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/RECORD @@ -0,0 +1,35 @@ +../../../bin/normalizer,sha256=mJvjR4ueWN3eha2m82gr-XNBgt0TEW5odM84x390nKk,262 +charset_normalizer-3.4.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +charset_normalizer-3.4.4.dist-info/METADATA,sha256=jVuUFBti8dav19YLvWissTihVdF2ozUY4KKMw7jdkBQ,37303 +charset_normalizer-3.4.4.dist-info/RECORD,, +charset_normalizer-3.4.4.dist-info/WHEEL,sha256=DxRnWQz-Kp9-4a4hdDHsSv0KUC3H7sN9Nbef3-8RjXU,190 +charset_normalizer-3.4.4.dist-info/entry_points.txt,sha256=ADSTKrkXZ3hhdOVFi6DcUEHQRS0xfxDIE_pEz4wLIXA,65 +charset_normalizer-3.4.4.dist-info/licenses/LICENSE,sha256=bQ1Bv-FwrGx9wkjJpj4lTQ-0WmDVCoJX0K-SxuJJuIc,1071 +charset_normalizer-3.4.4.dist-info/top_level.txt,sha256=7ASyzePr8_xuZWJsnqJjIBtyV8vhEo0wBCv1MPRRi3Q,19 +charset_normalizer/__init__.py,sha256=OKRxRv2Zhnqk00tqkN0c1BtJjm165fWXLydE52IKuHc,1590 +charset_normalizer/__main__.py,sha256=yzYxMR-IhKRHYwcSlavEv8oGdwxsR89mr2X09qXGdps,109 +charset_normalizer/__pycache__/__init__.cpython-312.pyc,, +charset_normalizer/__pycache__/__main__.cpython-312.pyc,, +charset_normalizer/__pycache__/api.cpython-312.pyc,, +charset_normalizer/__pycache__/cd.cpython-312.pyc,, +charset_normalizer/__pycache__/constant.cpython-312.pyc,, +charset_normalizer/__pycache__/legacy.cpython-312.pyc,, +charset_normalizer/__pycache__/md.cpython-312.pyc,, +charset_normalizer/__pycache__/models.cpython-312.pyc,, +charset_normalizer/__pycache__/utils.cpython-312.pyc,, +charset_normalizer/__pycache__/version.cpython-312.pyc,, +charset_normalizer/api.py,sha256=V07i8aVeCD8T2fSia3C-fn0i9t8qQguEBhsqszg32Ns,22668 +charset_normalizer/cd.py,sha256=WKTo1HDb-H9HfCDc3Bfwq5jzS25Ziy9SE2a74SgTq88,12522 +charset_normalizer/cli/__init__.py,sha256=D8I86lFk2-py45JvqxniTirSj_sFyE6sjaY_0-G1shc,136 +charset_normalizer/cli/__main__.py,sha256=dMaXG6IJXRvqq8z2tig7Qb83-BpWTln55ooiku5_uvg,12646 +charset_normalizer/cli/__pycache__/__init__.cpython-312.pyc,, +charset_normalizer/cli/__pycache__/__main__.cpython-312.pyc,, +charset_normalizer/constant.py,sha256=7UVY4ldYhmQMHUdgQ_sgZmzcQ0xxYxpBunqSZ-XJZ8U,42713 +charset_normalizer/legacy.py,sha256=sYBzSpzsRrg_wF4LP536pG64BItw7Tqtc3SMQAHvFLM,2731 +charset_normalizer/md.cpython-312-x86_64-linux-gnu.so,sha256=sZ7umtJLjKfA83NFJ7npkiDyr06zDT8cWtl6uIx2MsM,15912 +charset_normalizer/md.py,sha256=-_oN3h3_X99nkFfqamD3yu45DC_wfk5odH0Tr_CQiXs,20145 +charset_normalizer/md__mypyc.cpython-312-x86_64-linux-gnu.so,sha256=J2WWgLBQiO8sqdFsENp9u5V9uEH0tTwvTLszPdqhsv0,290584 +charset_normalizer/models.py,sha256=lKXhOnIPtiakbK3i__J9wpOfzx3JDTKj7Dn3Rg0VaRI,12394 +charset_normalizer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +charset_normalizer/utils.py,sha256=sTejPgrdlNsKNucZfJCxJ95lMTLA0ShHLLE3n5wpT9Q,12170 +charset_normalizer/version.py,sha256=nKE4qBNk5WA4LIJ_yIH_aSDfvtsyizkWMg-PUG-UZVk,115 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/WHEEL b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/WHEEL new file mode 100644 index 0000000..f3e8a97 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/WHEEL @@ -0,0 +1,7 @@ +Wheel-Version: 1.0 +Generator: setuptools (80.9.0) +Root-Is-Purelib: false +Tag: cp312-cp312-manylinux_2_17_x86_64 +Tag: cp312-cp312-manylinux2014_x86_64 +Tag: cp312-cp312-manylinux_2_28_x86_64 + diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/entry_points.txt b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/entry_points.txt new file mode 100644 index 0000000..65619e7 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[console_scripts] +normalizer = charset_normalizer.cli:cli_detect diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/licenses/LICENSE b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/licenses/LICENSE new file mode 100644 index 0000000..9725772 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/licenses/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 TAHRI Ahmed R. + +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/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/top_level.txt b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/top_level.txt new file mode 100644 index 0000000..66958f0 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info/top_level.txt @@ -0,0 +1 @@ +charset_normalizer diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__init__.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__init__.py new file mode 100644 index 0000000..0d3a379 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__init__.py @@ -0,0 +1,48 @@ +""" +Charset-Normalizer +~~~~~~~~~~~~~~ +The Real First Universal Charset Detector. +A library that helps you read text from an unknown charset encoding. +Motivated by chardet, This package is trying to resolve the issue by taking a new approach. +All IANA character set names for which the Python core library provides codecs are supported. + +Basic usage: + >>> from charset_normalizer import from_bytes + >>> results = from_bytes('Bсеки човек има право на образование. Oбразованието!'.encode('utf_8')) + >>> best_guess = results.best() + >>> str(best_guess) + 'Bсеки човек има право на образование. Oбразованието!' + +Others methods and usages are available - see the full documentation +at . +:copyright: (c) 2021 by Ahmed TAHRI +:license: MIT, see LICENSE for more details. +""" + +from __future__ import annotations + +import logging + +from .api import from_bytes, from_fp, from_path, is_binary +from .legacy import detect +from .models import CharsetMatch, CharsetMatches +from .utils import set_logging_handler +from .version import VERSION, __version__ + +__all__ = ( + "from_fp", + "from_path", + "from_bytes", + "is_binary", + "detect", + "CharsetMatch", + "CharsetMatches", + "__version__", + "VERSION", + "set_logging_handler", +) + +# Attach a NullHandler to the top level logger by default +# https://docs.python.org/3.3/howto/logging.html#configuring-logging-for-a-library + +logging.getLogger("charset_normalizer").addHandler(logging.NullHandler()) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__main__.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__main__.py new file mode 100644 index 0000000..e0e76f7 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__main__.py @@ -0,0 +1,6 @@ +from __future__ import annotations + +from .cli import cli_detect + +if __name__ == "__main__": + cli_detect() diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__init__.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a7c55931cfbba8cb20ad40aa81d2892c896f4b75 GIT binary patch literal 1772 zcmcIk&1>976d&!bcWtfh)b^oJD4kM>y{#=JHne3)4NhufL%c4I(}SRhS!ukIJ^El~ zwC?s$++6x6^lvD+xP?&D5BCq~MT;p0LC7J8lABBDC8xfTcD*UdwK_b#_h#OEzxOqN zOik$szN25L|6vuOr%D)pm4eZpr@(xNTx20vb4yGMN>)ize3_N4vRiS-SS1*<#)7I< z4Qf^`7`MjZyy8~bM4(%G&evEyn6xH?DQha1$Jumn&AOKJ6YPy(#+nIctyz$DYp#T7 z`CwrPWb}9I54A!%_+X?Ra=F#wP#XOo4%nfshI-}3Wb&YlkbcJ_Tu`~xig-Yn{}tu> z*Z=wSJ&)pDN*LboxsdpN=yxd>AP-FOr&Ll$M%>WXF!S4-@E(>Pk=Uaw7PuEBm{a0n zNxzhMpGN^EAx^@>FggmcQ^dzKbRyReJBGd;Nxw@Zb#c3wAG=g8;yuq7I3~^^=}-); z<7v$KepRFNyX3r@=2H!_>-5;7UpmFzeyjZKc}a-|807f{-^|;o~FO1 zCpi7Rf1I9x?hL2DDfuk@A=mtr-#h{3Y5K^(JFipsAEamR&Kr6C>B4*>_wA488;v2F zHWkwDBvdFs189a)E?iv^k}r&|M$=G&{cZlD6SQfw_|iPNn&3(^d_==|pjl`yEd< z@q*L9%Qu#9s)1Yc0+`snwawivy~%ushJrTn_SW8F4&d(Ao%Pne^?b$xHBvCt08tqF zGqs!zEvu6-j0#+$^-OJfqmt=rU5fF@YB|3jXA?OS6X|6WzOdVV2pb0;s^AkAu~Et< z2dlYFq~m4NFH2Ow%{dr)n?;=t?1=3_?HJ`?R{MN?_uke{E34bK+Hok6Z8vld4*^QBGZaYDKZHpn|-x*jW@HJZA1NSJJW4@KamNiw$0%YLRoD9CM%QJ zFQSZss(4wI(GGEXdEBfT!2U5Yil2=o5~^7QuMMylcoZ@fnJ@;CCpuK#g~Tb(bmF?3 zMebR>1;a5AzDLi&1ikpe^rC>8(53_5lu^WlNe+b#yB$i?=+dxj!fR*7`8%;<+*~$= zFX__YjS{aJAJew|(3iGt#Jv~ew;+jx(N+EqL{t41_kmoNHBI}wG^bVmc^_%-Jw?-h zq2@ViK1OdnK{prYVQvQn>?j%$|~X|u<*3pCS5GwJO0b2NW}miuTqUD-JK=wfA~ Rzp`<@viT?4;%|fJe*s~yTz~)o literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__main__.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__main__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39c9058fb91c68f115532aad8dcb3a86fd031b1b GIT binary patch literal 347 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 A9smFU literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/legacy.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/legacy.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59aec62731490c3084e3044ddc3ab9e9bd26610f GIT binary patch literal 3002 zcmZ`*Uu+yl8K1q~yW2b8o&Uv--PqA2p{-Ai?`Wf@Au4r)b8gbKcJLn{7pm3zc6?rY z|D0#%Y~OK~Tofd?m8gM-7}`pG;31Wf2)q=D7f_J^0g|0q;XG;rii)vXmQ<-jCPCDc!C$C-2DZ`g? z!&fekzTt`&tO_tmODeU#6nu&J47E*Vy21z-=pMdwVf9eqR8pbyfL3u$#`Op+#MMN$1 zD$HskP?AT5fr@ad5>3l)e4IFCgK?eJxWg!};ZfTnu1u_gt?5?L6=Bwu4b>`^)gq}T zW(-?p0b9IaTQj-_%w#kzxw4{Is!0^ZjVp?2Yh{De2}M~bt44FBRZ$)TO;J8Wdwd%Y zuV-g%lVq8y&*@oa+lG@>=N$!XS}dDcB-Ucq(5JJd3Y)d9Gnp4($~rnDgC(^v4?Iq` zFso9BFvYT|sTz8f(5yjK%P|<-U4H*9Xb^5xgT~dNklF zgn$ZK42TwlguNfa>`laYAiY)#Z8mB8GHV6_pcb^yTr+J0PX1@nU{njuah*@J&E`1J z8T>zj;C&(nBLOk+#cwsl5&_Lp0W}laYpDC;$B}%Z1^ZhOYvQ|!nmE_<1Op5$K?|=)uzn2IpEECg%rWzWwQXfnU;6RY*zLv*1~2uSx7=pmPz?*rQQR z>V*a1lxo~g>&M~*O1G(Rg5fxZ#`9kz4EsrsO#j$t@H8AUC}P@R!8S`!?WPTq@l@xURRZ(FjhA%8 zz^2Lyvv|1ajlE>yC8{$}jhAMLMHUIgCEIa49e7~WX4tkK`Q_;;TTZ!DvMD3rL&O(-;8CC4*1^$gCGDS$??Zov%f3(RJqJThE@a%h1Gn8uWt_M&QJ;-1L) zl1f$6LsS7o&-2LONkHDmm@Jfet>nIuW!2QJCXP)pA9#fluU7hz1Qip0JeCL;^8jkb zIEbd>nf6Tm-wrIoUUUi}r97@0p#b|rSqI-?+6@2JAQ}Dy1q!qiD19 zc+`zfS@RYojf;x@F=z}G|Mpkj{yX#JZ-{7W}S zsZCvpdrxIg%QS)T9++{%fSc{O;tD@ry^pP^p zXNO-G&1h0yD&2?=Ed44BcrAA(;r3ZY`+Z1mSvz~jNKO-ibc9+u5_x^OK=9`Cl+~4sOrC%O|$w6L;lPs~7I~ zAK!RqZQ;Y}`_ZLj#-dgx&^|R`4uHDIw_$z<<2CSSs_37Yx=la6Ur5`Q*xc~O# z>YI%Oigj+u$LopijZ=3L{q@9=Mo4UnKM(^a%xov%9TYhFuz8^idQQnSzKL%mS@v~7>OS+#? zGOtIFgv?7FFNxfCUtA%}j93nTWKw?n`_CDk2eg}a-n)h8$V2&6|JC&x{TdAU>%isu5_7C*>g9wt^?@2H0OJexM`n7!ozeWn3IoA-sE=207PXGTx T*8dNWc>nw1*8MQ7dp7?E%|j9= literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/md.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/md.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0d151a07c152b4387dcef2901d08a58aa234ca8 GIT binary patch literal 24339 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 literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/models.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0efbdece31f4047119d604c0e7be5d8362f270e6 GIT binary patch literal 17119 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 literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/utils.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d0ed8cabebe75555eeb3e6d9c228749dbd279e8 GIT binary patch literal 13748 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 BAg2HT literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/version.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/version.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6eb747654c04d84aeee8c7fe8417d3362973ce18 GIT binary patch literal 374 zcmYLEu}T9$5Z%4YC2^04O{z2jZBlrPCY6Ydq_BygU~ve`np@2#ce}^#CNZh>EA$t{ zPw*40#6r1Bu(DHvO)B?Df>X@AH}jY`^IWMQU}OBmxVH5(C#!H50M7O-xC0RgK?EZw zhKUn85JYb1GPl3BlKr`r1A2Fr56zD4-H(=&dA*7+k_Vm@r24*(^ literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/api.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/api.py new file mode 100644 index 0000000..ebd9639 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/api.py @@ -0,0 +1,669 @@ +from __future__ import annotations + +import logging +from os import PathLike +from typing import BinaryIO + +from .cd import ( + coherence_ratio, + encoding_languages, + mb_encoding_languages, + merge_coherence_ratios, +) +from .constant import IANA_SUPPORTED, TOO_BIG_SEQUENCE, TOO_SMALL_SEQUENCE, TRACE +from .md import mess_ratio +from .models import CharsetMatch, CharsetMatches +from .utils import ( + any_specified_encoding, + cut_sequence_chunks, + iana_name, + identify_sig_or_bom, + is_cp_similar, + is_multi_byte_encoding, + should_strip_sig_or_bom, +) + +logger = logging.getLogger("charset_normalizer") +explain_handler = logging.StreamHandler() +explain_handler.setFormatter( + logging.Formatter("%(asctime)s | %(levelname)s | %(message)s") +) + + +def from_bytes( + sequences: bytes | bytearray, + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.2, + cp_isolation: list[str] | None = None, + cp_exclusion: list[str] | None = None, + preemptive_behaviour: bool = True, + explain: bool = False, + language_threshold: float = 0.1, + enable_fallback: bool = True, +) -> CharsetMatches: + """ + Given a raw bytes sequence, return the best possibles charset usable to render str objects. + If there is no results, it is a strong indicator that the source is binary/not text. + By default, the process will extract 5 blocks of 512o each to assess the mess and coherence of a given sequence. + And will give up a particular code page after 20% of measured mess. Those criteria are customizable at will. + + The preemptive behavior DOES NOT replace the traditional detection workflow, it prioritize a particular code page + but never take it for granted. Can improve the performance. + + You may want to focus your attention to some code page or/and not others, use cp_isolation and cp_exclusion for that + purpose. + + This function will strip the SIG in the payload/sequence every time except on UTF-16, UTF-32. + By default the library does not setup any handler other than the NullHandler, if you choose to set the 'explain' + toggle to True it will alter the logger configuration to add a StreamHandler that is suitable for debugging. + Custom logging format and handler can be set manually. + """ + + if not isinstance(sequences, (bytearray, bytes)): + raise TypeError( + "Expected object of type bytes or bytearray, got: {}".format( + type(sequences) + ) + ) + + if explain: + previous_logger_level: int = logger.level + logger.addHandler(explain_handler) + logger.setLevel(TRACE) + + length: int = len(sequences) + + if length == 0: + logger.debug("Encoding detection on empty bytes, assuming utf_8 intention.") + if explain: # Defensive: ensure exit path clean handler + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level or logging.WARNING) + return CharsetMatches([CharsetMatch(sequences, "utf_8", 0.0, False, [], "")]) + + if cp_isolation is not None: + logger.log( + TRACE, + "cp_isolation is set. use this flag for debugging purpose. " + "limited list of encoding allowed : %s.", + ", ".join(cp_isolation), + ) + cp_isolation = [iana_name(cp, False) for cp in cp_isolation] + else: + cp_isolation = [] + + if cp_exclusion is not None: + logger.log( + TRACE, + "cp_exclusion is set. use this flag for debugging purpose. " + "limited list of encoding excluded : %s.", + ", ".join(cp_exclusion), + ) + cp_exclusion = [iana_name(cp, False) for cp in cp_exclusion] + else: + cp_exclusion = [] + + if length <= (chunk_size * steps): + logger.log( + TRACE, + "override steps (%i) and chunk_size (%i) as content does not fit (%i byte(s) given) parameters.", + steps, + chunk_size, + length, + ) + steps = 1 + chunk_size = length + + if steps > 1 and length / steps < chunk_size: + chunk_size = int(length / steps) + + is_too_small_sequence: bool = len(sequences) < TOO_SMALL_SEQUENCE + is_too_large_sequence: bool = len(sequences) >= TOO_BIG_SEQUENCE + + if is_too_small_sequence: + logger.log( + TRACE, + "Trying to detect encoding from a tiny portion of ({}) byte(s).".format( + length + ), + ) + elif is_too_large_sequence: + logger.log( + TRACE, + "Using lazy str decoding because the payload is quite large, ({}) byte(s).".format( + length + ), + ) + + prioritized_encodings: list[str] = [] + + specified_encoding: str | None = ( + any_specified_encoding(sequences) if preemptive_behaviour else None + ) + + if specified_encoding is not None: + prioritized_encodings.append(specified_encoding) + logger.log( + TRACE, + "Detected declarative mark in sequence. Priority +1 given for %s.", + specified_encoding, + ) + + tested: set[str] = set() + tested_but_hard_failure: list[str] = [] + tested_but_soft_failure: list[str] = [] + + fallback_ascii: CharsetMatch | None = None + fallback_u8: CharsetMatch | None = None + fallback_specified: CharsetMatch | None = None + + results: CharsetMatches = CharsetMatches() + + early_stop_results: CharsetMatches = CharsetMatches() + + sig_encoding, sig_payload = identify_sig_or_bom(sequences) + + if sig_encoding is not None: + prioritized_encodings.append(sig_encoding) + logger.log( + TRACE, + "Detected a SIG or BOM mark on first %i byte(s). Priority +1 given for %s.", + len(sig_payload), + sig_encoding, + ) + + prioritized_encodings.append("ascii") + + if "utf_8" not in prioritized_encodings: + prioritized_encodings.append("utf_8") + + for encoding_iana in prioritized_encodings + IANA_SUPPORTED: + if cp_isolation and encoding_iana not in cp_isolation: + continue + + if cp_exclusion and encoding_iana in cp_exclusion: + continue + + if encoding_iana in tested: + continue + + tested.add(encoding_iana) + + decoded_payload: str | None = None + bom_or_sig_available: bool = sig_encoding == encoding_iana + strip_sig_or_bom: bool = bom_or_sig_available and should_strip_sig_or_bom( + encoding_iana + ) + + if encoding_iana in {"utf_16", "utf_32"} and not bom_or_sig_available: + logger.log( + TRACE, + "Encoding %s won't be tested as-is because it require a BOM. Will try some sub-encoder LE/BE.", + encoding_iana, + ) + continue + if encoding_iana in {"utf_7"} and not bom_or_sig_available: + logger.log( + TRACE, + "Encoding %s won't be tested as-is because detection is unreliable without BOM/SIG.", + encoding_iana, + ) + continue + + try: + is_multi_byte_decoder: bool = is_multi_byte_encoding(encoding_iana) + except (ModuleNotFoundError, ImportError): + logger.log( + TRACE, + "Encoding %s does not provide an IncrementalDecoder", + encoding_iana, + ) + continue + + try: + if is_too_large_sequence and is_multi_byte_decoder is False: + str( + ( + sequences[: int(50e4)] + if strip_sig_or_bom is False + else sequences[len(sig_payload) : int(50e4)] + ), + encoding=encoding_iana, + ) + else: + decoded_payload = str( + ( + sequences + if strip_sig_or_bom is False + else sequences[len(sig_payload) :] + ), + encoding=encoding_iana, + ) + except (UnicodeDecodeError, LookupError) as e: + if not isinstance(e, LookupError): + logger.log( + TRACE, + "Code page %s does not fit given bytes sequence at ALL. %s", + encoding_iana, + str(e), + ) + tested_but_hard_failure.append(encoding_iana) + continue + + similar_soft_failure_test: bool = False + + for encoding_soft_failed in tested_but_soft_failure: + if is_cp_similar(encoding_iana, encoding_soft_failed): + similar_soft_failure_test = True + break + + if similar_soft_failure_test: + logger.log( + TRACE, + "%s is deemed too similar to code page %s and was consider unsuited already. Continuing!", + encoding_iana, + encoding_soft_failed, + ) + continue + + r_ = range( + 0 if not bom_or_sig_available else len(sig_payload), + length, + int(length / steps), + ) + + multi_byte_bonus: bool = ( + is_multi_byte_decoder + and decoded_payload is not None + and len(decoded_payload) < length + ) + + if multi_byte_bonus: + logger.log( + TRACE, + "Code page %s is a multi byte encoding table and it appear that at least one character " + "was encoded using n-bytes.", + encoding_iana, + ) + + max_chunk_gave_up: int = int(len(r_) / 4) + + max_chunk_gave_up = max(max_chunk_gave_up, 2) + early_stop_count: int = 0 + lazy_str_hard_failure = False + + md_chunks: list[str] = [] + md_ratios = [] + + try: + for chunk in cut_sequence_chunks( + sequences, + encoding_iana, + r_, + chunk_size, + bom_or_sig_available, + strip_sig_or_bom, + sig_payload, + is_multi_byte_decoder, + decoded_payload, + ): + md_chunks.append(chunk) + + md_ratios.append( + mess_ratio( + chunk, + threshold, + explain is True and 1 <= len(cp_isolation) <= 2, + ) + ) + + if md_ratios[-1] >= threshold: + early_stop_count += 1 + + if (early_stop_count >= max_chunk_gave_up) or ( + bom_or_sig_available and strip_sig_or_bom is False + ): + break + except ( + UnicodeDecodeError + ) as e: # Lazy str loading may have missed something there + logger.log( + TRACE, + "LazyStr Loading: After MD chunk decode, code page %s does not fit given bytes sequence at ALL. %s", + encoding_iana, + str(e), + ) + early_stop_count = max_chunk_gave_up + lazy_str_hard_failure = True + + # We might want to check the sequence again with the whole content + # Only if initial MD tests passes + if ( + not lazy_str_hard_failure + and is_too_large_sequence + and not is_multi_byte_decoder + ): + try: + sequences[int(50e3) :].decode(encoding_iana, errors="strict") + except UnicodeDecodeError as e: + logger.log( + TRACE, + "LazyStr Loading: After final lookup, code page %s does not fit given bytes sequence at ALL. %s", + encoding_iana, + str(e), + ) + tested_but_hard_failure.append(encoding_iana) + continue + + mean_mess_ratio: float = sum(md_ratios) / len(md_ratios) if md_ratios else 0.0 + if mean_mess_ratio >= threshold or early_stop_count >= max_chunk_gave_up: + tested_but_soft_failure.append(encoding_iana) + logger.log( + TRACE, + "%s was excluded because of initial chaos probing. Gave up %i time(s). " + "Computed mean chaos is %f %%.", + encoding_iana, + early_stop_count, + round(mean_mess_ratio * 100, ndigits=3), + ) + # Preparing those fallbacks in case we got nothing. + if ( + enable_fallback + and encoding_iana + in ["ascii", "utf_8", specified_encoding, "utf_16", "utf_32"] + and not lazy_str_hard_failure + ): + fallback_entry = CharsetMatch( + sequences, + encoding_iana, + threshold, + bom_or_sig_available, + [], + decoded_payload, + preemptive_declaration=specified_encoding, + ) + if encoding_iana == specified_encoding: + fallback_specified = fallback_entry + elif encoding_iana == "ascii": + fallback_ascii = fallback_entry + else: + fallback_u8 = fallback_entry + continue + + logger.log( + TRACE, + "%s passed initial chaos probing. Mean measured chaos is %f %%", + encoding_iana, + round(mean_mess_ratio * 100, ndigits=3), + ) + + if not is_multi_byte_decoder: + target_languages: list[str] = encoding_languages(encoding_iana) + else: + target_languages = mb_encoding_languages(encoding_iana) + + if target_languages: + logger.log( + TRACE, + "{} should target any language(s) of {}".format( + encoding_iana, str(target_languages) + ), + ) + + cd_ratios = [] + + # We shall skip the CD when its about ASCII + # Most of the time its not relevant to run "language-detection" on it. + if encoding_iana != "ascii": + for chunk in md_chunks: + chunk_languages = coherence_ratio( + chunk, + language_threshold, + ",".join(target_languages) if target_languages else None, + ) + + cd_ratios.append(chunk_languages) + + cd_ratios_merged = merge_coherence_ratios(cd_ratios) + + if cd_ratios_merged: + logger.log( + TRACE, + "We detected language {} using {}".format( + cd_ratios_merged, encoding_iana + ), + ) + + current_match = CharsetMatch( + sequences, + encoding_iana, + mean_mess_ratio, + bom_or_sig_available, + cd_ratios_merged, + ( + decoded_payload + if ( + is_too_large_sequence is False + or encoding_iana in [specified_encoding, "ascii", "utf_8"] + ) + else None + ), + preemptive_declaration=specified_encoding, + ) + + results.append(current_match) + + if ( + encoding_iana in [specified_encoding, "ascii", "utf_8"] + and mean_mess_ratio < 0.1 + ): + # If md says nothing to worry about, then... stop immediately! + if mean_mess_ratio == 0.0: + logger.debug( + "Encoding detection: %s is most likely the one.", + current_match.encoding, + ) + if explain: # Defensive: ensure exit path clean handler + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + return CharsetMatches([current_match]) + + early_stop_results.append(current_match) + + if ( + len(early_stop_results) + and (specified_encoding is None or specified_encoding in tested) + and "ascii" in tested + and "utf_8" in tested + ): + probable_result: CharsetMatch = early_stop_results.best() # type: ignore[assignment] + logger.debug( + "Encoding detection: %s is most likely the one.", + probable_result.encoding, + ) + if explain: # Defensive: ensure exit path clean handler + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + + return CharsetMatches([probable_result]) + + if encoding_iana == sig_encoding: + logger.debug( + "Encoding detection: %s is most likely the one as we detected a BOM or SIG within " + "the beginning of the sequence.", + encoding_iana, + ) + if explain: # Defensive: ensure exit path clean handler + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + return CharsetMatches([results[encoding_iana]]) + + if len(results) == 0: + if fallback_u8 or fallback_ascii or fallback_specified: + logger.log( + TRACE, + "Nothing got out of the detection process. Using ASCII/UTF-8/Specified fallback.", + ) + + if fallback_specified: + logger.debug( + "Encoding detection: %s will be used as a fallback match", + fallback_specified.encoding, + ) + results.append(fallback_specified) + elif ( + (fallback_u8 and fallback_ascii is None) + or ( + fallback_u8 + and fallback_ascii + and fallback_u8.fingerprint != fallback_ascii.fingerprint + ) + or (fallback_u8 is not None) + ): + logger.debug("Encoding detection: utf_8 will be used as a fallback match") + results.append(fallback_u8) + elif fallback_ascii: + logger.debug("Encoding detection: ascii will be used as a fallback match") + results.append(fallback_ascii) + + if results: + logger.debug( + "Encoding detection: Found %s as plausible (best-candidate) for content. With %i alternatives.", + results.best().encoding, # type: ignore + len(results) - 1, + ) + else: + logger.debug("Encoding detection: Unable to determine any suitable charset.") + + if explain: + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + + return results + + +def from_fp( + fp: BinaryIO, + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: list[str] | None = None, + cp_exclusion: list[str] | None = None, + preemptive_behaviour: bool = True, + explain: bool = False, + language_threshold: float = 0.1, + enable_fallback: bool = True, +) -> CharsetMatches: + """ + Same thing than the function from_bytes but using a file pointer that is already ready. + Will not close the file pointer. + """ + return from_bytes( + fp.read(), + steps, + chunk_size, + threshold, + cp_isolation, + cp_exclusion, + preemptive_behaviour, + explain, + language_threshold, + enable_fallback, + ) + + +def from_path( + path: str | bytes | PathLike, # type: ignore[type-arg] + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: list[str] | None = None, + cp_exclusion: list[str] | None = None, + preemptive_behaviour: bool = True, + explain: bool = False, + language_threshold: float = 0.1, + enable_fallback: bool = True, +) -> CharsetMatches: + """ + Same thing than the function from_bytes but with one extra step. Opening and reading given file path in binary mode. + Can raise IOError. + """ + with open(path, "rb") as fp: + return from_fp( + fp, + steps, + chunk_size, + threshold, + cp_isolation, + cp_exclusion, + preemptive_behaviour, + explain, + language_threshold, + enable_fallback, + ) + + +def is_binary( + fp_or_path_or_payload: PathLike | str | BinaryIO | bytes, # type: ignore[type-arg] + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: list[str] | None = None, + cp_exclusion: list[str] | None = None, + preemptive_behaviour: bool = True, + explain: bool = False, + language_threshold: float = 0.1, + enable_fallback: bool = False, +) -> bool: + """ + Detect if the given input (file, bytes, or path) points to a binary file. aka. not a string. + Based on the same main heuristic algorithms and default kwargs at the sole exception that fallbacks match + are disabled to be stricter around ASCII-compatible but unlikely to be a string. + """ + if isinstance(fp_or_path_or_payload, (str, PathLike)): + guesses = from_path( + fp_or_path_or_payload, + steps=steps, + chunk_size=chunk_size, + threshold=threshold, + cp_isolation=cp_isolation, + cp_exclusion=cp_exclusion, + preemptive_behaviour=preemptive_behaviour, + explain=explain, + language_threshold=language_threshold, + enable_fallback=enable_fallback, + ) + elif isinstance( + fp_or_path_or_payload, + ( + bytes, + bytearray, + ), + ): + guesses = from_bytes( + fp_or_path_or_payload, + steps=steps, + chunk_size=chunk_size, + threshold=threshold, + cp_isolation=cp_isolation, + cp_exclusion=cp_exclusion, + preemptive_behaviour=preemptive_behaviour, + explain=explain, + language_threshold=language_threshold, + enable_fallback=enable_fallback, + ) + else: + guesses = from_fp( + fp_or_path_or_payload, + steps=steps, + chunk_size=chunk_size, + threshold=threshold, + cp_isolation=cp_isolation, + cp_exclusion=cp_exclusion, + preemptive_behaviour=preemptive_behaviour, + explain=explain, + language_threshold=language_threshold, + enable_fallback=enable_fallback, + ) + + return not guesses diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/cd.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/cd.py new file mode 100644 index 0000000..71a3ed5 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/cd.py @@ -0,0 +1,395 @@ +from __future__ import annotations + +import importlib +from codecs import IncrementalDecoder +from collections import Counter +from functools import lru_cache +from typing import Counter as TypeCounter + +from .constant import ( + FREQUENCIES, + KO_NAMES, + LANGUAGE_SUPPORTED_COUNT, + TOO_SMALL_SEQUENCE, + ZH_NAMES, +) +from .md import is_suspiciously_successive_range +from .models import CoherenceMatches +from .utils import ( + is_accentuated, + is_latin, + is_multi_byte_encoding, + is_unicode_range_secondary, + unicode_range, +) + + +def encoding_unicode_range(iana_name: str) -> list[str]: + """ + Return associated unicode ranges in a single byte code page. + """ + if is_multi_byte_encoding(iana_name): + raise OSError("Function not supported on multi-byte code page") + + decoder = importlib.import_module(f"encodings.{iana_name}").IncrementalDecoder + + p: IncrementalDecoder = decoder(errors="ignore") + seen_ranges: dict[str, int] = {} + character_count: int = 0 + + for i in range(0x40, 0xFF): + chunk: str = p.decode(bytes([i])) + + if chunk: + character_range: str | None = unicode_range(chunk) + + if character_range is None: + continue + + if is_unicode_range_secondary(character_range) is False: + if character_range not in seen_ranges: + seen_ranges[character_range] = 0 + seen_ranges[character_range] += 1 + character_count += 1 + + return sorted( + [ + character_range + for character_range in seen_ranges + if seen_ranges[character_range] / character_count >= 0.15 + ] + ) + + +def unicode_range_languages(primary_range: str) -> list[str]: + """ + Return inferred languages used with a unicode range. + """ + languages: list[str] = [] + + for language, characters in FREQUENCIES.items(): + for character in characters: + if unicode_range(character) == primary_range: + languages.append(language) + break + + return languages + + +@lru_cache() +def encoding_languages(iana_name: str) -> list[str]: + """ + Single-byte encoding language association. Some code page are heavily linked to particular language(s). + This function does the correspondence. + """ + unicode_ranges: list[str] = encoding_unicode_range(iana_name) + primary_range: str | None = None + + for specified_range in unicode_ranges: + if "Latin" not in specified_range: + primary_range = specified_range + break + + if primary_range is None: + return ["Latin Based"] + + return unicode_range_languages(primary_range) + + +@lru_cache() +def mb_encoding_languages(iana_name: str) -> list[str]: + """ + Multi-byte encoding language association. Some code page are heavily linked to particular language(s). + This function does the correspondence. + """ + if ( + iana_name.startswith("shift_") + or iana_name.startswith("iso2022_jp") + or iana_name.startswith("euc_j") + or iana_name == "cp932" + ): + return ["Japanese"] + if iana_name.startswith("gb") or iana_name in ZH_NAMES: + return ["Chinese"] + if iana_name.startswith("iso2022_kr") or iana_name in KO_NAMES: + return ["Korean"] + + return [] + + +@lru_cache(maxsize=LANGUAGE_SUPPORTED_COUNT) +def get_target_features(language: str) -> tuple[bool, bool]: + """ + Determine main aspects from a supported language if it contains accents and if is pure Latin. + """ + target_have_accents: bool = False + target_pure_latin: bool = True + + for character in FREQUENCIES[language]: + if not target_have_accents and is_accentuated(character): + target_have_accents = True + if target_pure_latin and is_latin(character) is False: + target_pure_latin = False + + return target_have_accents, target_pure_latin + + +def alphabet_languages( + characters: list[str], ignore_non_latin: bool = False +) -> list[str]: + """ + Return associated languages associated to given characters. + """ + languages: list[tuple[str, float]] = [] + + source_have_accents = any(is_accentuated(character) for character in characters) + + for language, language_characters in FREQUENCIES.items(): + target_have_accents, target_pure_latin = get_target_features(language) + + if ignore_non_latin and target_pure_latin is False: + continue + + if target_have_accents is False and source_have_accents: + continue + + character_count: int = len(language_characters) + + character_match_count: int = len( + [c for c in language_characters if c in characters] + ) + + ratio: float = character_match_count / character_count + + if ratio >= 0.2: + languages.append((language, ratio)) + + languages = sorted(languages, key=lambda x: x[1], reverse=True) + + return [compatible_language[0] for compatible_language in languages] + + +def characters_popularity_compare( + language: str, ordered_characters: list[str] +) -> float: + """ + Determine if a ordered characters list (by occurrence from most appearance to rarest) match a particular language. + The result is a ratio between 0. (absolutely no correspondence) and 1. (near perfect fit). + Beware that is function is not strict on the match in order to ease the detection. (Meaning close match is 1.) + """ + if language not in FREQUENCIES: + raise ValueError(f"{language} not available") + + character_approved_count: int = 0 + FREQUENCIES_language_set = set(FREQUENCIES[language]) + + ordered_characters_count: int = len(ordered_characters) + target_language_characters_count: int = len(FREQUENCIES[language]) + + large_alphabet: bool = target_language_characters_count > 26 + + for character, character_rank in zip( + ordered_characters, range(0, ordered_characters_count) + ): + if character not in FREQUENCIES_language_set: + continue + + character_rank_in_language: int = FREQUENCIES[language].index(character) + expected_projection_ratio: float = ( + target_language_characters_count / ordered_characters_count + ) + character_rank_projection: int = int(character_rank * expected_projection_ratio) + + if ( + large_alphabet is False + and abs(character_rank_projection - character_rank_in_language) > 4 + ): + continue + + if ( + large_alphabet is True + and abs(character_rank_projection - character_rank_in_language) + < target_language_characters_count / 3 + ): + character_approved_count += 1 + continue + + characters_before_source: list[str] = FREQUENCIES[language][ + 0:character_rank_in_language + ] + characters_after_source: list[str] = FREQUENCIES[language][ + character_rank_in_language: + ] + characters_before: list[str] = ordered_characters[0:character_rank] + characters_after: list[str] = ordered_characters[character_rank:] + + before_match_count: int = len( + set(characters_before) & set(characters_before_source) + ) + + after_match_count: int = len( + set(characters_after) & set(characters_after_source) + ) + + if len(characters_before_source) == 0 and before_match_count <= 4: + character_approved_count += 1 + continue + + if len(characters_after_source) == 0 and after_match_count <= 4: + character_approved_count += 1 + continue + + if ( + before_match_count / len(characters_before_source) >= 0.4 + or after_match_count / len(characters_after_source) >= 0.4 + ): + character_approved_count += 1 + continue + + return character_approved_count / len(ordered_characters) + + +def alpha_unicode_split(decoded_sequence: str) -> list[str]: + """ + Given a decoded text sequence, return a list of str. Unicode range / alphabet separation. + Ex. a text containing English/Latin with a bit a Hebrew will return two items in the resulting list; + One containing the latin letters and the other hebrew. + """ + layers: dict[str, str] = {} + + for character in decoded_sequence: + if character.isalpha() is False: + continue + + character_range: str | None = unicode_range(character) + + if character_range is None: + continue + + layer_target_range: str | None = None + + for discovered_range in layers: + if ( + is_suspiciously_successive_range(discovered_range, character_range) + is False + ): + layer_target_range = discovered_range + break + + if layer_target_range is None: + layer_target_range = character_range + + if layer_target_range not in layers: + layers[layer_target_range] = character.lower() + continue + + layers[layer_target_range] += character.lower() + + return list(layers.values()) + + +def merge_coherence_ratios(results: list[CoherenceMatches]) -> CoherenceMatches: + """ + This function merge results previously given by the function coherence_ratio. + The return type is the same as coherence_ratio. + """ + per_language_ratios: dict[str, list[float]] = {} + for result in results: + for sub_result in result: + language, ratio = sub_result + if language not in per_language_ratios: + per_language_ratios[language] = [ratio] + continue + per_language_ratios[language].append(ratio) + + merge = [ + ( + language, + round( + sum(per_language_ratios[language]) / len(per_language_ratios[language]), + 4, + ), + ) + for language in per_language_ratios + ] + + return sorted(merge, key=lambda x: x[1], reverse=True) + + +def filter_alt_coherence_matches(results: CoherenceMatches) -> CoherenceMatches: + """ + We shall NOT return "English—" in CoherenceMatches because it is an alternative + of "English". This function only keeps the best match and remove the em-dash in it. + """ + index_results: dict[str, list[float]] = dict() + + for result in results: + language, ratio = result + no_em_name: str = language.replace("—", "") + + if no_em_name not in index_results: + index_results[no_em_name] = [] + + index_results[no_em_name].append(ratio) + + if any(len(index_results[e]) > 1 for e in index_results): + filtered_results: CoherenceMatches = [] + + for language in index_results: + filtered_results.append((language, max(index_results[language]))) + + return filtered_results + + return results + + +@lru_cache(maxsize=2048) +def coherence_ratio( + decoded_sequence: str, threshold: float = 0.1, lg_inclusion: str | None = None +) -> CoherenceMatches: + """ + Detect ANY language that can be identified in given sequence. The sequence will be analysed by layers. + A layer = Character extraction by alphabets/ranges. + """ + + results: list[tuple[str, float]] = [] + ignore_non_latin: bool = False + + sufficient_match_count: int = 0 + + lg_inclusion_list = lg_inclusion.split(",") if lg_inclusion is not None else [] + if "Latin Based" in lg_inclusion_list: + ignore_non_latin = True + lg_inclusion_list.remove("Latin Based") + + for layer in alpha_unicode_split(decoded_sequence): + sequence_frequencies: TypeCounter[str] = Counter(layer) + most_common = sequence_frequencies.most_common() + + character_count: int = sum(o for c, o in most_common) + + if character_count <= TOO_SMALL_SEQUENCE: + continue + + popular_character_ordered: list[str] = [c for c, o in most_common] + + for language in lg_inclusion_list or alphabet_languages( + popular_character_ordered, ignore_non_latin + ): + ratio: float = characters_popularity_compare( + language, popular_character_ordered + ) + + if ratio < threshold: + continue + elif ratio >= 0.8: + sufficient_match_count += 1 + + results.append((language, round(ratio, 4))) + + if sufficient_match_count >= 3: + break + + return sorted( + filter_alt_coherence_matches(results), key=lambda x: x[1], reverse=True + ) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__init__.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__init__.py new file mode 100644 index 0000000..543a5a4 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__init__.py @@ -0,0 +1,8 @@ +from __future__ import annotations + +from .__main__ import cli_detect, query_yes_no + +__all__ = ( + "cli_detect", + "query_yes_no", +) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__main__.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__main__.py new file mode 100644 index 0000000..cb64156 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__main__.py @@ -0,0 +1,381 @@ +from __future__ import annotations + +import argparse +import sys +import typing +from json import dumps +from os.path import abspath, basename, dirname, join, realpath +from platform import python_version +from unicodedata import unidata_version + +import charset_normalizer.md as md_module +from charset_normalizer import from_fp +from charset_normalizer.models import CliDetectionResult +from charset_normalizer.version import __version__ + + +def query_yes_no(question: str, default: str = "yes") -> bool: + """Ask a yes/no question via input() and return their answer. + + "question" is a string that is presented to the user. + "default" is the presumed answer if the user just hits . + It must be "yes" (the default), "no" or None (meaning + an answer is required of the user). + + The "answer" return value is True for "yes" or False for "no". + + Credit goes to (c) https://stackoverflow.com/questions/3041986/apt-command-line-interface-like-yes-no-input + """ + valid = {"yes": True, "y": True, "ye": True, "no": False, "n": False} + if default is None: + prompt = " [y/n] " + elif default == "yes": + prompt = " [Y/n] " + elif default == "no": + prompt = " [y/N] " + else: + raise ValueError("invalid default answer: '%s'" % default) + + while True: + sys.stdout.write(question + prompt) + choice = input().lower() + if default is not None and choice == "": + return valid[default] + elif choice in valid: + return valid[choice] + else: + sys.stdout.write("Please respond with 'yes' or 'no' (or 'y' or 'n').\n") + + +class FileType: + """Factory for creating file object types + + Instances of FileType are typically passed as type= arguments to the + ArgumentParser add_argument() method. + + Keyword Arguments: + - mode -- A string indicating how the file is to be opened. Accepts the + same values as the builtin open() function. + - bufsize -- The file's desired buffer size. Accepts the same values as + the builtin open() function. + - encoding -- The file's encoding. Accepts the same values as the + builtin open() function. + - errors -- A string indicating how encoding and decoding errors are to + be handled. Accepts the same value as the builtin open() function. + + Backported from CPython 3.12 + """ + + def __init__( + self, + mode: str = "r", + bufsize: int = -1, + encoding: str | None = None, + errors: str | None = None, + ): + self._mode = mode + self._bufsize = bufsize + self._encoding = encoding + self._errors = errors + + def __call__(self, string: str) -> typing.IO: # type: ignore[type-arg] + # the special argument "-" means sys.std{in,out} + if string == "-": + if "r" in self._mode: + return sys.stdin.buffer if "b" in self._mode else sys.stdin + elif any(c in self._mode for c in "wax"): + return sys.stdout.buffer if "b" in self._mode else sys.stdout + else: + msg = f'argument "-" with mode {self._mode}' + raise ValueError(msg) + + # all other arguments are used as file names + try: + return open(string, self._mode, self._bufsize, self._encoding, self._errors) + except OSError as e: + message = f"can't open '{string}': {e}" + raise argparse.ArgumentTypeError(message) + + def __repr__(self) -> str: + args = self._mode, self._bufsize + kwargs = [("encoding", self._encoding), ("errors", self._errors)] + args_str = ", ".join( + [repr(arg) for arg in args if arg != -1] + + [f"{kw}={arg!r}" for kw, arg in kwargs if arg is not None] + ) + return f"{type(self).__name__}({args_str})" + + +def cli_detect(argv: list[str] | None = None) -> int: + """ + CLI assistant using ARGV and ArgumentParser + :param argv: + :return: 0 if everything is fine, anything else equal trouble + """ + parser = argparse.ArgumentParser( + description="The Real First Universal Charset Detector. " + "Discover originating encoding used on text file. " + "Normalize text to unicode." + ) + + parser.add_argument( + "files", type=FileType("rb"), nargs="+", help="File(s) to be analysed" + ) + parser.add_argument( + "-v", + "--verbose", + action="store_true", + default=False, + dest="verbose", + help="Display complementary information about file if any. " + "Stdout will contain logs about the detection process.", + ) + parser.add_argument( + "-a", + "--with-alternative", + action="store_true", + default=False, + dest="alternatives", + help="Output complementary possibilities if any. Top-level JSON WILL be a list.", + ) + parser.add_argument( + "-n", + "--normalize", + action="store_true", + default=False, + dest="normalize", + help="Permit to normalize input file. If not set, program does not write anything.", + ) + parser.add_argument( + "-m", + "--minimal", + action="store_true", + default=False, + dest="minimal", + help="Only output the charset detected to STDOUT. Disabling JSON output.", + ) + parser.add_argument( + "-r", + "--replace", + action="store_true", + default=False, + dest="replace", + help="Replace file when trying to normalize it instead of creating a new one.", + ) + parser.add_argument( + "-f", + "--force", + action="store_true", + default=False, + dest="force", + help="Replace file without asking if you are sure, use this flag with caution.", + ) + parser.add_argument( + "-i", + "--no-preemptive", + action="store_true", + default=False, + dest="no_preemptive", + help="Disable looking at a charset declaration to hint the detector.", + ) + parser.add_argument( + "-t", + "--threshold", + action="store", + default=0.2, + type=float, + dest="threshold", + help="Define a custom maximum amount of noise allowed in decoded content. 0. <= noise <= 1.", + ) + parser.add_argument( + "--version", + action="version", + version="Charset-Normalizer {} - Python {} - Unicode {} - SpeedUp {}".format( + __version__, + python_version(), + unidata_version, + "OFF" if md_module.__file__.lower().endswith(".py") else "ON", + ), + help="Show version information and exit.", + ) + + args = parser.parse_args(argv) + + if args.replace is True and args.normalize is False: + if args.files: + for my_file in args.files: + my_file.close() + print("Use --replace in addition of --normalize only.", file=sys.stderr) + return 1 + + if args.force is True and args.replace is False: + if args.files: + for my_file in args.files: + my_file.close() + print("Use --force in addition of --replace only.", file=sys.stderr) + return 1 + + if args.threshold < 0.0 or args.threshold > 1.0: + if args.files: + for my_file in args.files: + my_file.close() + print("--threshold VALUE should be between 0. AND 1.", file=sys.stderr) + return 1 + + x_ = [] + + for my_file in args.files: + matches = from_fp( + my_file, + threshold=args.threshold, + explain=args.verbose, + preemptive_behaviour=args.no_preemptive is False, + ) + + best_guess = matches.best() + + if best_guess is None: + print( + 'Unable to identify originating encoding for "{}". {}'.format( + my_file.name, + ( + "Maybe try increasing maximum amount of chaos." + if args.threshold < 1.0 + else "" + ), + ), + file=sys.stderr, + ) + x_.append( + CliDetectionResult( + abspath(my_file.name), + None, + [], + [], + "Unknown", + [], + False, + 1.0, + 0.0, + None, + True, + ) + ) + else: + x_.append( + CliDetectionResult( + abspath(my_file.name), + best_guess.encoding, + best_guess.encoding_aliases, + [ + cp + for cp in best_guess.could_be_from_charset + if cp != best_guess.encoding + ], + best_guess.language, + best_guess.alphabets, + best_guess.bom, + best_guess.percent_chaos, + best_guess.percent_coherence, + None, + True, + ) + ) + + if len(matches) > 1 and args.alternatives: + for el in matches: + if el != best_guess: + x_.append( + CliDetectionResult( + abspath(my_file.name), + el.encoding, + el.encoding_aliases, + [ + cp + for cp in el.could_be_from_charset + if cp != el.encoding + ], + el.language, + el.alphabets, + el.bom, + el.percent_chaos, + el.percent_coherence, + None, + False, + ) + ) + + if args.normalize is True: + if best_guess.encoding.startswith("utf") is True: + print( + '"{}" file does not need to be normalized, as it already came from unicode.'.format( + my_file.name + ), + file=sys.stderr, + ) + if my_file.closed is False: + my_file.close() + continue + + dir_path = dirname(realpath(my_file.name)) + file_name = basename(realpath(my_file.name)) + + o_: list[str] = file_name.split(".") + + if args.replace is False: + o_.insert(-1, best_guess.encoding) + if my_file.closed is False: + my_file.close() + elif ( + args.force is False + and query_yes_no( + 'Are you sure to normalize "{}" by replacing it ?'.format( + my_file.name + ), + "no", + ) + is False + ): + if my_file.closed is False: + my_file.close() + continue + + try: + x_[0].unicode_path = join(dir_path, ".".join(o_)) + + with open(x_[0].unicode_path, "wb") as fp: + fp.write(best_guess.output()) + except OSError as e: + print(str(e), file=sys.stderr) + if my_file.closed is False: + my_file.close() + return 2 + + if my_file.closed is False: + my_file.close() + + if args.minimal is False: + print( + dumps( + [el.__dict__ for el in x_] if len(x_) > 1 else x_[0].__dict__, + ensure_ascii=True, + indent=4, + ) + ) + else: + for my_file in args.files: + print( + ", ".join( + [ + el.encoding or "undefined" + for el in x_ + if el.path == abspath(my_file.name) + ] + ) + ) + + return 0 + + +if __name__ == "__main__": + cli_detect() diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70715c4d24618cfe663c8e15b230d1d9fb7f695f GIT binary patch literal 335 zcmXw!J5B>Z42EZRHV-AF;RuK(1v>&-#1S~aHrB9f*dg->GqXWUN5>5~183j}++Zat z3Y0EVx>R_DaAE)7FI%=h7mFFAc=|y7O7(ky|H%FX-=C6rV>PR}VV0MivpTDV$*d@a z&C8rvl%pQL0r0b&oE|VuNlYjlPxZ zE;Zg=7Uvf->V#)&RjsHe%BoQzVxkj*RYpH!kaVL2&`u|SV%;64SJv09!RxS~jl(DL Xn9@#g&cE2n4=Z-Lm}f7OFem#LODtaG literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__main__.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__main__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76d4bebc44ada3b282126195a5a3f1add2a40cc5 GIT binary patch literal 14396 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 S)c#EG{LWFZyYzKr=>G!*{w}Tn literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/constant.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/constant.py new file mode 100644 index 0000000..cc71a01 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/constant.py @@ -0,0 +1,2015 @@ +from __future__ import annotations + +from codecs import BOM_UTF8, BOM_UTF16_BE, BOM_UTF16_LE, BOM_UTF32_BE, BOM_UTF32_LE +from encodings.aliases import aliases +from re import IGNORECASE +from re import compile as re_compile + +# Contain for each eligible encoding a list of/item bytes SIG/BOM +ENCODING_MARKS: dict[str, bytes | list[bytes]] = { + "utf_8": BOM_UTF8, + "utf_7": [ + b"\x2b\x2f\x76\x38", + b"\x2b\x2f\x76\x39", + b"\x2b\x2f\x76\x2b", + b"\x2b\x2f\x76\x2f", + b"\x2b\x2f\x76\x38\x2d", + ], + "gb18030": b"\x84\x31\x95\x33", + "utf_32": [BOM_UTF32_BE, BOM_UTF32_LE], + "utf_16": [BOM_UTF16_BE, BOM_UTF16_LE], +} + +TOO_SMALL_SEQUENCE: int = 32 +TOO_BIG_SEQUENCE: int = int(10e6) + +UTF8_MAXIMAL_ALLOCATION: int = 1_112_064 + +# Up-to-date Unicode ucd/15.0.0 +UNICODE_RANGES_COMBINED: dict[str, range] = { + "Control character": range(32), + "Basic Latin": range(32, 128), + "Latin-1 Supplement": range(128, 256), + "Latin Extended-A": range(256, 384), + "Latin Extended-B": range(384, 592), + "IPA Extensions": range(592, 688), + "Spacing Modifier Letters": range(688, 768), + "Combining Diacritical Marks": range(768, 880), + "Greek and Coptic": range(880, 1024), + "Cyrillic": range(1024, 1280), + "Cyrillic Supplement": range(1280, 1328), + "Armenian": range(1328, 1424), + "Hebrew": range(1424, 1536), + "Arabic": range(1536, 1792), + "Syriac": range(1792, 1872), + "Arabic Supplement": range(1872, 1920), + "Thaana": range(1920, 1984), + "NKo": range(1984, 2048), + "Samaritan": range(2048, 2112), + "Mandaic": range(2112, 2144), + "Syriac Supplement": range(2144, 2160), + "Arabic Extended-B": range(2160, 2208), + "Arabic Extended-A": range(2208, 2304), + "Devanagari": range(2304, 2432), + "Bengali": range(2432, 2560), + "Gurmukhi": range(2560, 2688), + "Gujarati": range(2688, 2816), + "Oriya": range(2816, 2944), + "Tamil": range(2944, 3072), + "Telugu": range(3072, 3200), + "Kannada": range(3200, 3328), + "Malayalam": range(3328, 3456), + "Sinhala": range(3456, 3584), + "Thai": range(3584, 3712), + "Lao": range(3712, 3840), + "Tibetan": range(3840, 4096), + "Myanmar": range(4096, 4256), + "Georgian": range(4256, 4352), + "Hangul Jamo": range(4352, 4608), + "Ethiopic": range(4608, 4992), + "Ethiopic Supplement": range(4992, 5024), + "Cherokee": range(5024, 5120), + "Unified Canadian Aboriginal Syllabics": range(5120, 5760), + "Ogham": range(5760, 5792), + "Runic": range(5792, 5888), + "Tagalog": range(5888, 5920), + "Hanunoo": range(5920, 5952), + "Buhid": range(5952, 5984), + "Tagbanwa": range(5984, 6016), + "Khmer": range(6016, 6144), + "Mongolian": range(6144, 6320), + "Unified Canadian Aboriginal Syllabics Extended": range(6320, 6400), + "Limbu": range(6400, 6480), + "Tai Le": range(6480, 6528), + "New Tai Lue": range(6528, 6624), + "Khmer Symbols": range(6624, 6656), + "Buginese": range(6656, 6688), + "Tai Tham": range(6688, 6832), + "Combining Diacritical Marks Extended": range(6832, 6912), + "Balinese": range(6912, 7040), + "Sundanese": range(7040, 7104), + "Batak": range(7104, 7168), + "Lepcha": range(7168, 7248), + "Ol Chiki": range(7248, 7296), + "Cyrillic Extended-C": range(7296, 7312), + "Georgian Extended": range(7312, 7360), + "Sundanese Supplement": range(7360, 7376), + "Vedic Extensions": range(7376, 7424), + "Phonetic Extensions": range(7424, 7552), + "Phonetic Extensions Supplement": range(7552, 7616), + "Combining Diacritical Marks Supplement": range(7616, 7680), + "Latin Extended Additional": range(7680, 7936), + "Greek Extended": range(7936, 8192), + "General Punctuation": range(8192, 8304), + "Superscripts and Subscripts": range(8304, 8352), + "Currency Symbols": range(8352, 8400), + "Combining Diacritical Marks for Symbols": range(8400, 8448), + "Letterlike Symbols": range(8448, 8528), + "Number Forms": range(8528, 8592), + "Arrows": range(8592, 8704), + "Mathematical Operators": range(8704, 8960), + "Miscellaneous Technical": range(8960, 9216), + "Control Pictures": range(9216, 9280), + "Optical Character Recognition": range(9280, 9312), + "Enclosed Alphanumerics": range(9312, 9472), + "Box Drawing": range(9472, 9600), + "Block Elements": range(9600, 9632), + "Geometric Shapes": range(9632, 9728), + "Miscellaneous Symbols": range(9728, 9984), + "Dingbats": range(9984, 10176), + "Miscellaneous Mathematical Symbols-A": range(10176, 10224), + "Supplemental Arrows-A": range(10224, 10240), + "Braille Patterns": range(10240, 10496), + "Supplemental Arrows-B": range(10496, 10624), + "Miscellaneous Mathematical Symbols-B": range(10624, 10752), + "Supplemental Mathematical Operators": range(10752, 11008), + "Miscellaneous Symbols and Arrows": range(11008, 11264), + "Glagolitic": range(11264, 11360), + "Latin Extended-C": range(11360, 11392), + "Coptic": range(11392, 11520), + "Georgian Supplement": range(11520, 11568), + "Tifinagh": range(11568, 11648), + "Ethiopic Extended": range(11648, 11744), + "Cyrillic Extended-A": range(11744, 11776), + "Supplemental Punctuation": range(11776, 11904), + "CJK Radicals Supplement": range(11904, 12032), + "Kangxi Radicals": range(12032, 12256), + "Ideographic Description Characters": range(12272, 12288), + "CJK Symbols and Punctuation": range(12288, 12352), + "Hiragana": range(12352, 12448), + "Katakana": range(12448, 12544), + "Bopomofo": range(12544, 12592), + "Hangul Compatibility Jamo": range(12592, 12688), + "Kanbun": range(12688, 12704), + "Bopomofo Extended": range(12704, 12736), + "CJK Strokes": range(12736, 12784), + "Katakana Phonetic Extensions": range(12784, 12800), + "Enclosed CJK Letters and Months": range(12800, 13056), + "CJK Compatibility": range(13056, 13312), + "CJK Unified Ideographs Extension A": range(13312, 19904), + "Yijing Hexagram Symbols": range(19904, 19968), + "CJK Unified Ideographs": range(19968, 40960), + "Yi Syllables": range(40960, 42128), + "Yi Radicals": range(42128, 42192), + "Lisu": range(42192, 42240), + "Vai": range(42240, 42560), + "Cyrillic Extended-B": range(42560, 42656), + "Bamum": range(42656, 42752), + "Modifier Tone Letters": range(42752, 42784), + "Latin Extended-D": range(42784, 43008), + "Syloti Nagri": range(43008, 43056), + "Common Indic Number Forms": range(43056, 43072), + "Phags-pa": range(43072, 43136), + "Saurashtra": range(43136, 43232), + "Devanagari Extended": range(43232, 43264), + "Kayah Li": range(43264, 43312), + "Rejang": range(43312, 43360), + "Hangul Jamo Extended-A": range(43360, 43392), + "Javanese": range(43392, 43488), + "Myanmar Extended-B": range(43488, 43520), + "Cham": range(43520, 43616), + "Myanmar Extended-A": range(43616, 43648), + "Tai Viet": range(43648, 43744), + "Meetei Mayek Extensions": range(43744, 43776), + "Ethiopic Extended-A": range(43776, 43824), + "Latin Extended-E": range(43824, 43888), + "Cherokee Supplement": range(43888, 43968), + "Meetei Mayek": range(43968, 44032), + "Hangul Syllables": range(44032, 55216), + "Hangul Jamo Extended-B": range(55216, 55296), + "High Surrogates": range(55296, 56192), + "High Private Use Surrogates": range(56192, 56320), + "Low Surrogates": range(56320, 57344), + "Private Use Area": range(57344, 63744), + "CJK Compatibility Ideographs": range(63744, 64256), + "Alphabetic Presentation Forms": range(64256, 64336), + "Arabic Presentation Forms-A": range(64336, 65024), + "Variation Selectors": range(65024, 65040), + "Vertical Forms": range(65040, 65056), + "Combining Half Marks": range(65056, 65072), + "CJK Compatibility Forms": range(65072, 65104), + "Small Form Variants": range(65104, 65136), + "Arabic Presentation Forms-B": range(65136, 65280), + "Halfwidth and Fullwidth Forms": range(65280, 65520), + "Specials": range(65520, 65536), + "Linear B Syllabary": range(65536, 65664), + "Linear B Ideograms": range(65664, 65792), + "Aegean Numbers": range(65792, 65856), + "Ancient Greek Numbers": range(65856, 65936), + "Ancient Symbols": range(65936, 66000), + "Phaistos Disc": range(66000, 66048), + "Lycian": range(66176, 66208), + "Carian": range(66208, 66272), + "Coptic Epact Numbers": range(66272, 66304), + "Old Italic": range(66304, 66352), + "Gothic": range(66352, 66384), + "Old Permic": range(66384, 66432), + "Ugaritic": range(66432, 66464), + "Old Persian": range(66464, 66528), + "Deseret": range(66560, 66640), + "Shavian": range(66640, 66688), + "Osmanya": range(66688, 66736), + "Osage": range(66736, 66816), + "Elbasan": range(66816, 66864), + "Caucasian Albanian": range(66864, 66928), + "Vithkuqi": range(66928, 67008), + "Linear A": range(67072, 67456), + "Latin Extended-F": range(67456, 67520), + "Cypriot Syllabary": range(67584, 67648), + "Imperial Aramaic": range(67648, 67680), + "Palmyrene": range(67680, 67712), + "Nabataean": range(67712, 67760), + "Hatran": range(67808, 67840), + "Phoenician": range(67840, 67872), + "Lydian": range(67872, 67904), + "Meroitic Hieroglyphs": range(67968, 68000), + "Meroitic Cursive": range(68000, 68096), + "Kharoshthi": range(68096, 68192), + "Old South Arabian": range(68192, 68224), + "Old North Arabian": range(68224, 68256), + "Manichaean": range(68288, 68352), + "Avestan": range(68352, 68416), + "Inscriptional Parthian": range(68416, 68448), + "Inscriptional Pahlavi": range(68448, 68480), + "Psalter Pahlavi": range(68480, 68528), + "Old Turkic": range(68608, 68688), + "Old Hungarian": range(68736, 68864), + "Hanifi Rohingya": range(68864, 68928), + "Rumi Numeral Symbols": range(69216, 69248), + "Yezidi": range(69248, 69312), + "Arabic Extended-C": range(69312, 69376), + "Old Sogdian": range(69376, 69424), + "Sogdian": range(69424, 69488), + "Old Uyghur": range(69488, 69552), + "Chorasmian": range(69552, 69600), + "Elymaic": range(69600, 69632), + "Brahmi": range(69632, 69760), + "Kaithi": range(69760, 69840), + "Sora Sompeng": range(69840, 69888), + "Chakma": range(69888, 69968), + "Mahajani": range(69968, 70016), + "Sharada": range(70016, 70112), + "Sinhala Archaic Numbers": range(70112, 70144), + "Khojki": range(70144, 70224), + "Multani": range(70272, 70320), + "Khudawadi": range(70320, 70400), + "Grantha": range(70400, 70528), + "Newa": range(70656, 70784), + "Tirhuta": range(70784, 70880), + "Siddham": range(71040, 71168), + "Modi": range(71168, 71264), + "Mongolian Supplement": range(71264, 71296), + "Takri": range(71296, 71376), + "Ahom": range(71424, 71504), + "Dogra": range(71680, 71760), + "Warang Citi": range(71840, 71936), + "Dives Akuru": range(71936, 72032), + "Nandinagari": range(72096, 72192), + "Zanabazar Square": range(72192, 72272), + "Soyombo": range(72272, 72368), + "Unified Canadian Aboriginal Syllabics Extended-A": range(72368, 72384), + "Pau Cin Hau": range(72384, 72448), + "Devanagari Extended-A": range(72448, 72544), + "Bhaiksuki": range(72704, 72816), + "Marchen": range(72816, 72896), + "Masaram Gondi": range(72960, 73056), + "Gunjala Gondi": range(73056, 73136), + "Makasar": range(73440, 73472), + "Kawi": range(73472, 73568), + "Lisu Supplement": range(73648, 73664), + "Tamil Supplement": range(73664, 73728), + "Cuneiform": range(73728, 74752), + "Cuneiform Numbers and Punctuation": range(74752, 74880), + "Early Dynastic Cuneiform": range(74880, 75088), + "Cypro-Minoan": range(77712, 77824), + "Egyptian Hieroglyphs": range(77824, 78896), + "Egyptian Hieroglyph Format Controls": range(78896, 78944), + "Anatolian Hieroglyphs": range(82944, 83584), + "Bamum Supplement": range(92160, 92736), + "Mro": range(92736, 92784), + "Tangsa": range(92784, 92880), + "Bassa Vah": range(92880, 92928), + "Pahawh Hmong": range(92928, 93072), + "Medefaidrin": range(93760, 93856), + "Miao": range(93952, 94112), + "Ideographic Symbols and Punctuation": range(94176, 94208), + "Tangut": range(94208, 100352), + "Tangut Components": range(100352, 101120), + "Khitan Small Script": range(101120, 101632), + "Tangut Supplement": range(101632, 101760), + "Kana Extended-B": range(110576, 110592), + "Kana Supplement": range(110592, 110848), + "Kana Extended-A": range(110848, 110896), + "Small Kana Extension": range(110896, 110960), + "Nushu": range(110960, 111360), + "Duployan": range(113664, 113824), + "Shorthand Format Controls": range(113824, 113840), + "Znamenny Musical Notation": range(118528, 118736), + "Byzantine Musical Symbols": range(118784, 119040), + "Musical Symbols": range(119040, 119296), + "Ancient Greek Musical Notation": range(119296, 119376), + "Kaktovik Numerals": range(119488, 119520), + "Mayan Numerals": range(119520, 119552), + "Tai Xuan Jing Symbols": range(119552, 119648), + "Counting Rod Numerals": range(119648, 119680), + "Mathematical Alphanumeric Symbols": range(119808, 120832), + "Sutton SignWriting": range(120832, 121520), + "Latin Extended-G": range(122624, 122880), + "Glagolitic Supplement": range(122880, 122928), + "Cyrillic Extended-D": range(122928, 123024), + "Nyiakeng Puachue Hmong": range(123136, 123216), + "Toto": range(123536, 123584), + "Wancho": range(123584, 123648), + "Nag Mundari": range(124112, 124160), + "Ethiopic Extended-B": range(124896, 124928), + "Mende Kikakui": range(124928, 125152), + "Adlam": range(125184, 125280), + "Indic Siyaq Numbers": range(126064, 126144), + "Ottoman Siyaq Numbers": range(126208, 126288), + "Arabic Mathematical Alphabetic Symbols": range(126464, 126720), + "Mahjong Tiles": range(126976, 127024), + "Domino Tiles": range(127024, 127136), + "Playing Cards": range(127136, 127232), + "Enclosed Alphanumeric Supplement": range(127232, 127488), + "Enclosed Ideographic Supplement": range(127488, 127744), + "Miscellaneous Symbols and Pictographs": range(127744, 128512), + "Emoticons range(Emoji)": range(128512, 128592), + "Ornamental Dingbats": range(128592, 128640), + "Transport and Map Symbols": range(128640, 128768), + "Alchemical Symbols": range(128768, 128896), + "Geometric Shapes Extended": range(128896, 129024), + "Supplemental Arrows-C": range(129024, 129280), + "Supplemental Symbols and Pictographs": range(129280, 129536), + "Chess Symbols": range(129536, 129648), + "Symbols and Pictographs Extended-A": range(129648, 129792), + "Symbols for Legacy Computing": range(129792, 130048), + "CJK Unified Ideographs Extension B": range(131072, 173792), + "CJK Unified Ideographs Extension C": range(173824, 177984), + "CJK Unified Ideographs Extension D": range(177984, 178208), + "CJK Unified Ideographs Extension E": range(178208, 183984), + "CJK Unified Ideographs Extension F": range(183984, 191472), + "CJK Compatibility Ideographs Supplement": range(194560, 195104), + "CJK Unified Ideographs Extension G": range(196608, 201552), + "CJK Unified Ideographs Extension H": range(201552, 205744), + "Tags": range(917504, 917632), + "Variation Selectors Supplement": range(917760, 918000), + "Supplementary Private Use Area-A": range(983040, 1048576), + "Supplementary Private Use Area-B": range(1048576, 1114112), +} + + +UNICODE_SECONDARY_RANGE_KEYWORD: list[str] = [ + "Supplement", + "Extended", + "Extensions", + "Modifier", + "Marks", + "Punctuation", + "Symbols", + "Forms", + "Operators", + "Miscellaneous", + "Drawing", + "Block", + "Shapes", + "Supplemental", + "Tags", +] + +RE_POSSIBLE_ENCODING_INDICATION = re_compile( + r"(?:(?:encoding)|(?:charset)|(?:coding))(?:[\:= ]{1,10})(?:[\"\']?)([a-zA-Z0-9\-_]+)(?:[\"\']?)", + IGNORECASE, +) + +IANA_NO_ALIASES = [ + "cp720", + "cp737", + "cp856", + "cp874", + "cp875", + "cp1006", + "koi8_r", + "koi8_t", + "koi8_u", +] + +IANA_SUPPORTED: list[str] = sorted( + filter( + lambda x: x.endswith("_codec") is False + and x not in {"rot_13", "tactis", "mbcs"}, + list(set(aliases.values())) + IANA_NO_ALIASES, + ) +) + +IANA_SUPPORTED_COUNT: int = len(IANA_SUPPORTED) + +# pre-computed code page that are similar using the function cp_similarity. +IANA_SUPPORTED_SIMILAR: dict[str, list[str]] = { + "cp037": ["cp1026", "cp1140", "cp273", "cp500"], + "cp1026": ["cp037", "cp1140", "cp273", "cp500"], + "cp1125": ["cp866"], + "cp1140": ["cp037", "cp1026", "cp273", "cp500"], + "cp1250": ["iso8859_2"], + "cp1251": ["kz1048", "ptcp154"], + "cp1252": ["iso8859_15", "iso8859_9", "latin_1"], + "cp1253": ["iso8859_7"], + "cp1254": ["iso8859_15", "iso8859_9", "latin_1"], + "cp1257": ["iso8859_13"], + "cp273": ["cp037", "cp1026", "cp1140", "cp500"], + "cp437": ["cp850", "cp858", "cp860", "cp861", "cp862", "cp863", "cp865"], + "cp500": ["cp037", "cp1026", "cp1140", "cp273"], + "cp850": ["cp437", "cp857", "cp858", "cp865"], + "cp857": ["cp850", "cp858", "cp865"], + "cp858": ["cp437", "cp850", "cp857", "cp865"], + "cp860": ["cp437", "cp861", "cp862", "cp863", "cp865"], + "cp861": ["cp437", "cp860", "cp862", "cp863", "cp865"], + "cp862": ["cp437", "cp860", "cp861", "cp863", "cp865"], + "cp863": ["cp437", "cp860", "cp861", "cp862", "cp865"], + "cp865": ["cp437", "cp850", "cp857", "cp858", "cp860", "cp861", "cp862", "cp863"], + "cp866": ["cp1125"], + "iso8859_10": ["iso8859_14", "iso8859_15", "iso8859_4", "iso8859_9", "latin_1"], + "iso8859_11": ["tis_620"], + "iso8859_13": ["cp1257"], + "iso8859_14": [ + "iso8859_10", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_9", + "latin_1", + ], + "iso8859_15": [ + "cp1252", + "cp1254", + "iso8859_10", + "iso8859_14", + "iso8859_16", + "iso8859_3", + "iso8859_9", + "latin_1", + ], + "iso8859_16": [ + "iso8859_14", + "iso8859_15", + "iso8859_2", + "iso8859_3", + "iso8859_9", + "latin_1", + ], + "iso8859_2": ["cp1250", "iso8859_16", "iso8859_4"], + "iso8859_3": ["iso8859_14", "iso8859_15", "iso8859_16", "iso8859_9", "latin_1"], + "iso8859_4": ["iso8859_10", "iso8859_2", "iso8859_9", "latin_1"], + "iso8859_7": ["cp1253"], + "iso8859_9": [ + "cp1252", + "cp1254", + "cp1258", + "iso8859_10", + "iso8859_14", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_4", + "latin_1", + ], + "kz1048": ["cp1251", "ptcp154"], + "latin_1": [ + "cp1252", + "cp1254", + "cp1258", + "iso8859_10", + "iso8859_14", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_4", + "iso8859_9", + ], + "mac_iceland": ["mac_roman", "mac_turkish"], + "mac_roman": ["mac_iceland", "mac_turkish"], + "mac_turkish": ["mac_iceland", "mac_roman"], + "ptcp154": ["cp1251", "kz1048"], + "tis_620": ["iso8859_11"], +} + + +CHARDET_CORRESPONDENCE: dict[str, str] = { + "iso2022_kr": "ISO-2022-KR", + "iso2022_jp": "ISO-2022-JP", + "euc_kr": "EUC-KR", + "tis_620": "TIS-620", + "utf_32": "UTF-32", + "euc_jp": "EUC-JP", + "koi8_r": "KOI8-R", + "iso8859_1": "ISO-8859-1", + "iso8859_2": "ISO-8859-2", + "iso8859_5": "ISO-8859-5", + "iso8859_6": "ISO-8859-6", + "iso8859_7": "ISO-8859-7", + "iso8859_8": "ISO-8859-8", + "utf_16": "UTF-16", + "cp855": "IBM855", + "mac_cyrillic": "MacCyrillic", + "gb2312": "GB2312", + "gb18030": "GB18030", + "cp932": "CP932", + "cp866": "IBM866", + "utf_8": "utf-8", + "utf_8_sig": "UTF-8-SIG", + "shift_jis": "SHIFT_JIS", + "big5": "Big5", + "cp1250": "windows-1250", + "cp1251": "windows-1251", + "cp1252": "Windows-1252", + "cp1253": "windows-1253", + "cp1255": "windows-1255", + "cp1256": "windows-1256", + "cp1254": "Windows-1254", + "cp949": "CP949", +} + + +COMMON_SAFE_ASCII_CHARACTERS: set[str] = { + "<", + ">", + "=", + ":", + "/", + "&", + ";", + "{", + "}", + "[", + "]", + ",", + "|", + '"', + "-", + "(", + ")", +} + +# Sample character sets — replace with full lists if needed +COMMON_CHINESE_CHARACTERS = "的一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能下过子说产种面而方后多定行学法所民得经十三之进着等部度家电力里如水化高自二理起小物现实加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间样与关各重新线内数正心反你明看原又么利比或但质气第向道命此变条只没结解问意建月公无系军很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资边流路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油思术极交受联什认六共权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类八离华名确才科张信马节话米整空元况今集温传土许步群广石记需段研界拉林律叫且究观越织装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳便团往酸历市克何除消构府太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该铁价严龙飞" + +COMMON_JAPANESE_CHARACTERS = "日一国年大十二本中長出三時行見月分後前生五間上東四今金九入学高円子外八六下来気小七山話女北午百書先名川千水半男西電校語土木聞食車何南万毎白天母火右読友左休父雨" + +COMMON_KOREAN_CHARACTERS = "一二三四五六七八九十百千萬上下左右中人女子大小山川日月火水木金土父母天地國名年時文校學生" + +# Combine all into a set +COMMON_CJK_CHARACTERS = set( + "".join( + [ + COMMON_CHINESE_CHARACTERS, + COMMON_JAPANESE_CHARACTERS, + COMMON_KOREAN_CHARACTERS, + ] + ) +) + +KO_NAMES: set[str] = {"johab", "cp949", "euc_kr"} +ZH_NAMES: set[str] = {"big5", "cp950", "big5hkscs", "hz"} + +# Logging LEVEL below DEBUG +TRACE: int = 5 + + +# Language label that contain the em dash "—" +# character are to be considered alternative seq to origin +FREQUENCIES: dict[str, list[str]] = { + "English": [ + "e", + "a", + "t", + "i", + "o", + "n", + "s", + "r", + "h", + "l", + "d", + "c", + "u", + "m", + "f", + "p", + "g", + "w", + "y", + "b", + "v", + "k", + "x", + "j", + "z", + "q", + ], + "English—": [ + "e", + "a", + "t", + "i", + "o", + "n", + "s", + "r", + "h", + "l", + "d", + "c", + "m", + "u", + "f", + "p", + "g", + "w", + "b", + "y", + "v", + "k", + "j", + "x", + "z", + "q", + ], + "German": [ + "e", + "n", + "i", + "r", + "s", + "t", + "a", + "d", + "h", + "u", + "l", + "g", + "o", + "c", + "m", + "b", + "f", + "k", + "w", + "z", + "p", + "v", + "ü", + "ä", + "ö", + "j", + ], + "French": [ + "e", + "a", + "s", + "n", + "i", + "t", + "r", + "l", + "u", + "o", + "d", + "c", + "p", + "m", + "é", + "v", + "g", + "f", + "b", + "h", + "q", + "à", + "x", + "è", + "y", + "j", + ], + "Dutch": [ + "e", + "n", + "a", + "i", + "r", + "t", + "o", + "d", + "s", + "l", + "g", + "h", + "v", + "m", + "u", + "k", + "c", + "p", + "b", + "w", + "j", + "z", + "f", + "y", + "x", + "ë", + ], + "Italian": [ + "e", + "i", + "a", + "o", + "n", + "l", + "t", + "r", + "s", + "c", + "d", + "u", + "p", + "m", + "g", + "v", + "f", + "b", + "z", + "h", + "q", + "è", + "à", + "k", + "y", + "ò", + ], + "Polish": [ + "a", + "i", + "o", + "e", + "n", + "r", + "z", + "w", + "s", + "c", + "t", + "k", + "y", + "d", + "p", + "m", + "u", + "l", + "j", + "ł", + "g", + "b", + "h", + "ą", + "ę", + "ó", + ], + "Spanish": [ + "e", + "a", + "o", + "n", + "s", + "r", + "i", + "l", + "d", + "t", + "c", + "u", + "m", + "p", + "b", + "g", + "v", + "f", + "y", + "ó", + "h", + "q", + "í", + "j", + "z", + "á", + ], + "Russian": [ + "о", + "а", + "е", + "и", + "н", + "с", + "т", + "р", + "в", + "л", + "к", + "м", + "д", + "п", + "у", + "г", + "я", + "ы", + "з", + "б", + "й", + "ь", + "ч", + "х", + "ж", + "ц", + ], + # Jap-Kanji + "Japanese": [ + "人", + "一", + "大", + "亅", + "丁", + "丨", + "竹", + "笑", + "口", + "日", + "今", + "二", + "彳", + "行", + "十", + "土", + "丶", + "寸", + "寺", + "時", + "乙", + "丿", + "乂", + "气", + "気", + "冂", + "巾", + "亠", + "市", + "目", + "儿", + "見", + "八", + "小", + "凵", + "県", + "月", + "彐", + "門", + "間", + "木", + "東", + "山", + "出", + "本", + "中", + "刀", + "分", + "耳", + "又", + "取", + "最", + "言", + "田", + "心", + "思", + "刂", + "前", + "京", + "尹", + "事", + "生", + "厶", + "云", + "会", + "未", + "来", + "白", + "冫", + "楽", + "灬", + "馬", + "尸", + "尺", + "駅", + "明", + "耂", + "者", + "了", + "阝", + "都", + "高", + "卜", + "占", + "厂", + "广", + "店", + "子", + "申", + "奄", + "亻", + "俺", + "上", + "方", + "冖", + "学", + "衣", + "艮", + "食", + "自", + ], + # Jap-Katakana + "Japanese—": [ + "ー", + "ン", + "ス", + "・", + "ル", + "ト", + "リ", + "イ", + "ア", + "ラ", + "ッ", + "ク", + "ド", + "シ", + "レ", + "ジ", + "タ", + "フ", + "ロ", + "カ", + "テ", + "マ", + "ィ", + "グ", + "バ", + "ム", + "プ", + "オ", + "コ", + "デ", + "ニ", + "ウ", + "メ", + "サ", + "ビ", + "ナ", + "ブ", + "ャ", + "エ", + "ュ", + "チ", + "キ", + "ズ", + "ダ", + "パ", + "ミ", + "ェ", + "ョ", + "ハ", + "セ", + "ベ", + "ガ", + "モ", + "ツ", + "ネ", + "ボ", + "ソ", + "ノ", + "ァ", + "ヴ", + "ワ", + "ポ", + "ペ", + "ピ", + "ケ", + "ゴ", + "ギ", + "ザ", + "ホ", + "ゲ", + "ォ", + "ヤ", + "ヒ", + "ユ", + "ヨ", + "ヘ", + "ゼ", + "ヌ", + "ゥ", + "ゾ", + "ヶ", + "ヂ", + "ヲ", + "ヅ", + "ヵ", + "ヱ", + "ヰ", + "ヮ", + "ヽ", + "゠", + "ヾ", + "ヷ", + "ヿ", + "ヸ", + "ヹ", + "ヺ", + ], + # Jap-Hiragana + "Japanese——": [ + "の", + "に", + "る", + "た", + "と", + "は", + "し", + "い", + "を", + "で", + "て", + "が", + "な", + "れ", + "か", + "ら", + "さ", + "っ", + "り", + "す", + "あ", + "も", + "こ", + "ま", + "う", + "く", + "よ", + "き", + "ん", + "め", + "お", + "け", + "そ", + "つ", + "だ", + "や", + "え", + "ど", + "わ", + "ち", + "み", + "せ", + "じ", + "ば", + "へ", + "び", + "ず", + "ろ", + "ほ", + "げ", + "む", + "べ", + "ひ", + "ょ", + "ゆ", + "ぶ", + "ご", + "ゃ", + "ね", + "ふ", + "ぐ", + "ぎ", + "ぼ", + "ゅ", + "づ", + "ざ", + "ぞ", + "ぬ", + "ぜ", + "ぱ", + "ぽ", + "ぷ", + "ぴ", + "ぃ", + "ぁ", + "ぇ", + "ぺ", + "ゞ", + "ぢ", + "ぉ", + "ぅ", + "ゐ", + "ゝ", + "ゑ", + "゛", + "゜", + "ゎ", + "ゔ", + "゚", + "ゟ", + "゙", + "ゕ", + "ゖ", + ], + "Portuguese": [ + "a", + "e", + "o", + "s", + "i", + "r", + "d", + "n", + "t", + "m", + "u", + "c", + "l", + "p", + "g", + "v", + "b", + "f", + "h", + "ã", + "q", + "é", + "ç", + "á", + "z", + "í", + ], + "Swedish": [ + "e", + "a", + "n", + "r", + "t", + "s", + "i", + "l", + "d", + "o", + "m", + "k", + "g", + "v", + "h", + "f", + "u", + "p", + "ä", + "c", + "b", + "ö", + "å", + "y", + "j", + "x", + ], + "Chinese": [ + "的", + "一", + "是", + "不", + "了", + "在", + "人", + "有", + "我", + "他", + "这", + "个", + "们", + "中", + "来", + "上", + "大", + "为", + "和", + "国", + "地", + "到", + "以", + "说", + "时", + "要", + "就", + "出", + "会", + "可", + "也", + "你", + "对", + "生", + "能", + "而", + "子", + "那", + "得", + "于", + "着", + "下", + "自", + "之", + "年", + "过", + "发", + "后", + "作", + "里", + "用", + "道", + "行", + "所", + "然", + "家", + "种", + "事", + "成", + "方", + "多", + "经", + "么", + "去", + "法", + "学", + "如", + "都", + "同", + "现", + "当", + "没", + "动", + "面", + "起", + "看", + "定", + "天", + "分", + "还", + "进", + "好", + "小", + "部", + "其", + "些", + "主", + "样", + "理", + "心", + "她", + "本", + "前", + "开", + "但", + "因", + "只", + "从", + "想", + "实", + ], + "Ukrainian": [ + "о", + "а", + "н", + "і", + "и", + "р", + "в", + "т", + "е", + "с", + "к", + "л", + "у", + "д", + "м", + "п", + "з", + "я", + "ь", + "б", + "г", + "й", + "ч", + "х", + "ц", + "ї", + ], + "Norwegian": [ + "e", + "r", + "n", + "t", + "a", + "s", + "i", + "o", + "l", + "d", + "g", + "k", + "m", + "v", + "f", + "p", + "u", + "b", + "h", + "å", + "y", + "j", + "ø", + "c", + "æ", + "w", + ], + "Finnish": [ + "a", + "i", + "n", + "t", + "e", + "s", + "l", + "o", + "u", + "k", + "ä", + "m", + "r", + "v", + "j", + "h", + "p", + "y", + "d", + "ö", + "g", + "c", + "b", + "f", + "w", + "z", + ], + "Vietnamese": [ + "n", + "h", + "t", + "i", + "c", + "g", + "a", + "o", + "u", + "m", + "l", + "r", + "à", + "đ", + "s", + "e", + "v", + "p", + "b", + "y", + "ư", + "d", + "á", + "k", + "ộ", + "ế", + ], + "Czech": [ + "o", + "e", + "a", + "n", + "t", + "s", + "i", + "l", + "v", + "r", + "k", + "d", + "u", + "m", + "p", + "í", + "c", + "h", + "z", + "á", + "y", + "j", + "b", + "ě", + "é", + "ř", + ], + "Hungarian": [ + "e", + "a", + "t", + "l", + "s", + "n", + "k", + "r", + "i", + "o", + "z", + "á", + "é", + "g", + "m", + "b", + "y", + "v", + "d", + "h", + "u", + "p", + "j", + "ö", + "f", + "c", + ], + "Korean": [ + "이", + "다", + "에", + "의", + "는", + "로", + "하", + "을", + "가", + "고", + "지", + "서", + "한", + "은", + "기", + "으", + "년", + "대", + "사", + "시", + "를", + "리", + "도", + "인", + "스", + "일", + ], + "Indonesian": [ + "a", + "n", + "e", + "i", + "r", + "t", + "u", + "s", + "d", + "k", + "m", + "l", + "g", + "p", + "b", + "o", + "h", + "y", + "j", + "c", + "w", + "f", + "v", + "z", + "x", + "q", + ], + "Turkish": [ + "a", + "e", + "i", + "n", + "r", + "l", + "ı", + "k", + "d", + "t", + "s", + "m", + "y", + "u", + "o", + "b", + "ü", + "ş", + "v", + "g", + "z", + "h", + "c", + "p", + "ç", + "ğ", + ], + "Romanian": [ + "e", + "i", + "a", + "r", + "n", + "t", + "u", + "l", + "o", + "c", + "s", + "d", + "p", + "m", + "ă", + "f", + "v", + "î", + "g", + "b", + "ș", + "ț", + "z", + "h", + "â", + "j", + ], + "Farsi": [ + "ا", + "ی", + "ر", + "د", + "ن", + "ه", + "و", + "م", + "ت", + "ب", + "س", + "ل", + "ک", + "ش", + "ز", + "ف", + "گ", + "ع", + "خ", + "ق", + "ج", + "آ", + "پ", + "ح", + "ط", + "ص", + ], + "Arabic": [ + "ا", + "ل", + "ي", + "م", + "و", + "ن", + "ر", + "ت", + "ب", + "ة", + "ع", + "د", + "س", + "ف", + "ه", + "ك", + "ق", + "أ", + "ح", + "ج", + "ش", + "ط", + "ص", + "ى", + "خ", + "إ", + ], + "Danish": [ + "e", + "r", + "n", + "t", + "a", + "i", + "s", + "d", + "l", + "o", + "g", + "m", + "k", + "f", + "v", + "u", + "b", + "h", + "p", + "å", + "y", + "ø", + "æ", + "c", + "j", + "w", + ], + "Serbian": [ + "а", + "и", + "о", + "е", + "н", + "р", + "с", + "у", + "т", + "к", + "ј", + "в", + "д", + "м", + "п", + "л", + "г", + "з", + "б", + "a", + "i", + "e", + "o", + "n", + "ц", + "ш", + ], + "Lithuanian": [ + "i", + "a", + "s", + "o", + "r", + "e", + "t", + "n", + "u", + "k", + "m", + "l", + "p", + "v", + "d", + "j", + "g", + "ė", + "b", + "y", + "ų", + "š", + "ž", + "c", + "ą", + "į", + ], + "Slovene": [ + "e", + "a", + "i", + "o", + "n", + "r", + "s", + "l", + "t", + "j", + "v", + "k", + "d", + "p", + "m", + "u", + "z", + "b", + "g", + "h", + "č", + "c", + "š", + "ž", + "f", + "y", + ], + "Slovak": [ + "o", + "a", + "e", + "n", + "i", + "r", + "v", + "t", + "s", + "l", + "k", + "d", + "m", + "p", + "u", + "c", + "h", + "j", + "b", + "z", + "á", + "y", + "ý", + "í", + "č", + "é", + ], + "Hebrew": [ + "י", + "ו", + "ה", + "ל", + "ר", + "ב", + "ת", + "מ", + "א", + "ש", + "נ", + "ע", + "ם", + "ד", + "ק", + "ח", + "פ", + "ס", + "כ", + "ג", + "ט", + "צ", + "ן", + "ז", + "ך", + ], + "Bulgarian": [ + "а", + "и", + "о", + "е", + "н", + "т", + "р", + "с", + "в", + "л", + "к", + "д", + "п", + "м", + "з", + "г", + "я", + "ъ", + "у", + "б", + "ч", + "ц", + "й", + "ж", + "щ", + "х", + ], + "Croatian": [ + "a", + "i", + "o", + "e", + "n", + "r", + "j", + "s", + "t", + "u", + "k", + "l", + "v", + "d", + "m", + "p", + "g", + "z", + "b", + "c", + "č", + "h", + "š", + "ž", + "ć", + "f", + ], + "Hindi": [ + "क", + "र", + "स", + "न", + "त", + "म", + "ह", + "प", + "य", + "ल", + "व", + "ज", + "द", + "ग", + "ब", + "श", + "ट", + "अ", + "ए", + "थ", + "भ", + "ड", + "च", + "ध", + "ष", + "इ", + ], + "Estonian": [ + "a", + "i", + "e", + "s", + "t", + "l", + "u", + "n", + "o", + "k", + "r", + "d", + "m", + "v", + "g", + "p", + "j", + "h", + "ä", + "b", + "õ", + "ü", + "f", + "c", + "ö", + "y", + ], + "Thai": [ + "า", + "น", + "ร", + "อ", + "ก", + "เ", + "ง", + "ม", + "ย", + "ล", + "ว", + "ด", + "ท", + "ส", + "ต", + "ะ", + "ป", + "บ", + "ค", + "ห", + "แ", + "จ", + "พ", + "ช", + "ข", + "ใ", + ], + "Greek": [ + "α", + "τ", + "ο", + "ι", + "ε", + "ν", + "ρ", + "σ", + "κ", + "η", + "π", + "ς", + "υ", + "μ", + "λ", + "ί", + "ό", + "ά", + "γ", + "έ", + "δ", + "ή", + "ω", + "χ", + "θ", + "ύ", + ], + "Tamil": [ + "க", + "த", + "ப", + "ட", + "ர", + "ம", + "ல", + "ன", + "வ", + "ற", + "ய", + "ள", + "ச", + "ந", + "இ", + "ண", + "அ", + "ஆ", + "ழ", + "ங", + "எ", + "உ", + "ஒ", + "ஸ", + ], + "Kazakh": [ + "а", + "ы", + "е", + "н", + "т", + "р", + "л", + "і", + "д", + "с", + "м", + "қ", + "к", + "о", + "б", + "и", + "у", + "ғ", + "ж", + "ң", + "з", + "ш", + "й", + "п", + "г", + "ө", + ], +} + +LANGUAGE_SUPPORTED_COUNT: int = len(FREQUENCIES) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/legacy.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/legacy.py new file mode 100644 index 0000000..360a310 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/legacy.py @@ -0,0 +1,80 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Any +from warnings import warn + +from .api import from_bytes +from .constant import CHARDET_CORRESPONDENCE, TOO_SMALL_SEQUENCE + +# TODO: remove this check when dropping Python 3.7 support +if TYPE_CHECKING: + from typing_extensions import TypedDict + + class ResultDict(TypedDict): + encoding: str | None + language: str + confidence: float | None + + +def detect( + byte_str: bytes, should_rename_legacy: bool = False, **kwargs: Any +) -> ResultDict: + """ + chardet legacy method + Detect the encoding of the given byte string. It should be mostly backward-compatible. + Encoding name will match Chardet own writing whenever possible. (Not on encoding name unsupported by it) + This function is deprecated and should be used to migrate your project easily, consult the documentation for + further information. Not planned for removal. + + :param byte_str: The byte sequence to examine. + :param should_rename_legacy: Should we rename legacy encodings + to their more modern equivalents? + """ + if len(kwargs): + warn( + f"charset-normalizer disregard arguments '{','.join(list(kwargs.keys()))}' in legacy function detect()" + ) + + if not isinstance(byte_str, (bytearray, bytes)): + raise TypeError( # pragma: nocover + f"Expected object of type bytes or bytearray, got: {type(byte_str)}" + ) + + if isinstance(byte_str, bytearray): + byte_str = bytes(byte_str) + + r = from_bytes(byte_str).best() + + encoding = r.encoding if r is not None else None + language = r.language if r is not None and r.language != "Unknown" else "" + confidence = 1.0 - r.chaos if r is not None else None + + # automatically lower confidence + # on small bytes samples. + # https://github.com/jawah/charset_normalizer/issues/391 + if ( + confidence is not None + and confidence >= 0.9 + and encoding + not in { + "utf_8", + "ascii", + } + and r.bom is False # type: ignore[union-attr] + and len(byte_str) < TOO_SMALL_SEQUENCE + ): + confidence -= 0.2 + + # Note: CharsetNormalizer does not return 'UTF-8-SIG' as the sig get stripped in the detection/normalization process + # but chardet does return 'utf-8-sig' and it is a valid codec name. + if r is not None and encoding == "utf_8" and r.bom: + encoding += "_sig" + + if should_rename_legacy is False and encoding in CHARDET_CORRESPONDENCE: + encoding = CHARDET_CORRESPONDENCE[encoding] + + return { + "encoding": encoding, + "language": language, + "confidence": confidence, + } diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/md.cpython-312-x86_64-linux-gnu.so b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/md.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..857d7474b7a5a0c5b81989346cf9d845174eed68 GIT binary patch literal 15912 zcmeHOYit}>6~4QU>E?m$LY@oYG8fH%?PpH|zK{20L*b8?}nUc)T;Vx7vp_ zJDb`eKqMy>CXHA{LZ}r#0^~&LRv*U3__xR5SCETnl^2!0!op{a?ZWy ztjCjenjZ)um}~8vbH4MsbLP(Y&hEWm?iuKfMk0b+m3Ts|NJ7L((fkNoAht)WhvQb! zC~eoRsBYnk)e2%N>XeK*q>5z5nbt>@9aF~9Pv+BMFr zKkVn7HZJ=xClVVaZaY{txamg||OF#AUa zP1|vu$z;xR+>ybqR5s&`SmP;2=_+f?#EfN5Br{ejdDIa@v;CQ*XQplB($iUptjJ*2 z&O@M~*#qOxI0?_}bG%N^a}RoMGBXKqmo=RO1H^~2$qaNrm_xH>w_~MJ*#yTm%_N35 zMJhQy?M=CkW$U@D-hy%hx!s~~pnqSN*`~MY?RdJ8Rew<_sXCzMm%#Eh$!|%*@QI4w zE4ASJmhZDT)wM|XCF6qd>j9kQH}MAg@=SNPA+)S(xNeUDRxm-rqq4~;L`SAz_E5) z95|GxP`A8Pg0}rNlyM5ZyeQ?Lpo~-AfdJQZ6(CkxnyB5@z2cAOf4pNm_=^0eMvb|SD_|*%`K#V02>mN~-77u~ z-74B}xLo~DP(}_z?s9(gUw#&p)SprCI$tBiK`3fN@tvD+M$qpG<8=EE05#@cH|8%E ze~j?_&y7=6Cl_Yc8*{~oF<<5FGEQFe9tTVGH|F0hE~43~QE~FOGaHP#zkt!G@N|r~ z87@%6p~I!6f-(Qc;*894Eq@8o)`dfdFHY#S+fHDaFpe?b-4rVxl)->|>t_=y>ca9N zz`?FO4$4wGYDU0$LEso@OtO6~HQMy85`Z}8;4_mFGK(Uxsvf%~5o5{A4 z4Ufe-8k3c5I7dIN2d-pO&1|BT~yj)>SSTH*@faoZ*Fy9M93N-M-Oz+m3;^Mn*fq++snE+)5_0?L^eI0ay-X|T>}*@a5F>Fv|QJkHJyy-&WZ`wN;{^VPp4%{9@l0J=im1j&$xD=z)OvW#?_TYpk)$!oQ&+u=!)H-5UKXyE){> z3*LWGdBX|Ihi`9uRQO#Qr?5Vj6?{85`zB zmi>9Y69)`qvp>(%nBsHM-zZ!eGJwN568rPKi0NjsfAQ`|>|b1s&7-o;cS|6uvpc06xnTJZVT10VFC0Ss%x^V;&mpZ*E({F%bYzA}## z2cq9!BR{6oeq-QCU8Y|O`1AaMX+Chl*q_6m2>A2=U8ekg!1h>cfBPy3n4*nAjToXw z87Ip1<8GY+9C^Ne$24Wgv`LBOV=(_&(D?n&YRZ&pL5bxf=V#z0U~rDb_6w{`OWnY@#lEI1_s9-`|~`A_qFo=RjwQ7 z<#F&P`1Te z=8?VyAIwkY2+79&_I>1=QG3!MEJMsOGUtCXyU)Rnj6U u@x2+}Rr$R6`HSzLeD2Ca9f$A-PH3+O@&`mY{jcPI?{4M4A>a@Y#lHYyFIRj3 literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/md.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/md.py new file mode 100644 index 0000000..12ce024 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/md.py @@ -0,0 +1,635 @@ +from __future__ import annotations + +from functools import lru_cache +from logging import getLogger + +from .constant import ( + COMMON_SAFE_ASCII_CHARACTERS, + TRACE, + UNICODE_SECONDARY_RANGE_KEYWORD, +) +from .utils import ( + is_accentuated, + is_arabic, + is_arabic_isolated_form, + is_case_variable, + is_cjk, + is_emoticon, + is_hangul, + is_hiragana, + is_katakana, + is_latin, + is_punctuation, + is_separator, + is_symbol, + is_thai, + is_unprintable, + remove_accent, + unicode_range, + is_cjk_uncommon, +) + + +class MessDetectorPlugin: + """ + Base abstract class used for mess detection plugins. + All detectors MUST extend and implement given methods. + """ + + def eligible(self, character: str) -> bool: + """ + Determine if given character should be fed in. + """ + raise NotImplementedError # pragma: nocover + + def feed(self, character: str) -> None: + """ + The main routine to be executed upon character. + Insert the logic in witch the text would be considered chaotic. + """ + raise NotImplementedError # pragma: nocover + + def reset(self) -> None: # pragma: no cover + """ + Permit to reset the plugin to the initial state. + """ + raise NotImplementedError + + @property + def ratio(self) -> float: + """ + Compute the chaos ratio based on what your feed() has seen. + Must NOT be lower than 0.; No restriction gt 0. + """ + raise NotImplementedError # pragma: nocover + + +class TooManySymbolOrPunctuationPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._punctuation_count: int = 0 + self._symbol_count: int = 0 + self._character_count: int = 0 + + self._last_printable_char: str | None = None + self._frenzy_symbol_in_word: bool = False + + def eligible(self, character: str) -> bool: + return character.isprintable() + + def feed(self, character: str) -> None: + self._character_count += 1 + + if ( + character != self._last_printable_char + and character not in COMMON_SAFE_ASCII_CHARACTERS + ): + if is_punctuation(character): + self._punctuation_count += 1 + elif ( + character.isdigit() is False + and is_symbol(character) + and is_emoticon(character) is False + ): + self._symbol_count += 2 + + self._last_printable_char = character + + def reset(self) -> None: # Abstract + self._punctuation_count = 0 + self._character_count = 0 + self._symbol_count = 0 + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + ratio_of_punctuation: float = ( + self._punctuation_count + self._symbol_count + ) / self._character_count + + return ratio_of_punctuation if ratio_of_punctuation >= 0.3 else 0.0 + + +class TooManyAccentuatedPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._character_count: int = 0 + self._accentuated_count: int = 0 + + def eligible(self, character: str) -> bool: + return character.isalpha() + + def feed(self, character: str) -> None: + self._character_count += 1 + + if is_accentuated(character): + self._accentuated_count += 1 + + def reset(self) -> None: # Abstract + self._character_count = 0 + self._accentuated_count = 0 + + @property + def ratio(self) -> float: + if self._character_count < 8: + return 0.0 + + ratio_of_accentuation: float = self._accentuated_count / self._character_count + return ratio_of_accentuation if ratio_of_accentuation >= 0.35 else 0.0 + + +class UnprintablePlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._unprintable_count: int = 0 + self._character_count: int = 0 + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + if is_unprintable(character): + self._unprintable_count += 1 + self._character_count += 1 + + def reset(self) -> None: # Abstract + self._unprintable_count = 0 + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + return (self._unprintable_count * 8) / self._character_count + + +class SuspiciousDuplicateAccentPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._successive_count: int = 0 + self._character_count: int = 0 + + self._last_latin_character: str | None = None + + def eligible(self, character: str) -> bool: + return character.isalpha() and is_latin(character) + + def feed(self, character: str) -> None: + self._character_count += 1 + if ( + self._last_latin_character is not None + and is_accentuated(character) + and is_accentuated(self._last_latin_character) + ): + if character.isupper() and self._last_latin_character.isupper(): + self._successive_count += 1 + # Worse if its the same char duplicated with different accent. + if remove_accent(character) == remove_accent(self._last_latin_character): + self._successive_count += 1 + self._last_latin_character = character + + def reset(self) -> None: # Abstract + self._successive_count = 0 + self._character_count = 0 + self._last_latin_character = None + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + return (self._successive_count * 2) / self._character_count + + +class SuspiciousRange(MessDetectorPlugin): + def __init__(self) -> None: + self._suspicious_successive_range_count: int = 0 + self._character_count: int = 0 + self._last_printable_seen: str | None = None + + def eligible(self, character: str) -> bool: + return character.isprintable() + + def feed(self, character: str) -> None: + self._character_count += 1 + + if ( + character.isspace() + or is_punctuation(character) + or character in COMMON_SAFE_ASCII_CHARACTERS + ): + self._last_printable_seen = None + return + + if self._last_printable_seen is None: + self._last_printable_seen = character + return + + unicode_range_a: str | None = unicode_range(self._last_printable_seen) + unicode_range_b: str | None = unicode_range(character) + + if is_suspiciously_successive_range(unicode_range_a, unicode_range_b): + self._suspicious_successive_range_count += 1 + + self._last_printable_seen = character + + def reset(self) -> None: # Abstract + self._character_count = 0 + self._suspicious_successive_range_count = 0 + self._last_printable_seen = None + + @property + def ratio(self) -> float: + if self._character_count <= 13: + return 0.0 + + ratio_of_suspicious_range_usage: float = ( + self._suspicious_successive_range_count * 2 + ) / self._character_count + + return ratio_of_suspicious_range_usage + + +class SuperWeirdWordPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._word_count: int = 0 + self._bad_word_count: int = 0 + self._foreign_long_count: int = 0 + + self._is_current_word_bad: bool = False + self._foreign_long_watch: bool = False + + self._character_count: int = 0 + self._bad_character_count: int = 0 + + self._buffer: str = "" + self._buffer_accent_count: int = 0 + self._buffer_glyph_count: int = 0 + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + if character.isalpha(): + self._buffer += character + if is_accentuated(character): + self._buffer_accent_count += 1 + if ( + self._foreign_long_watch is False + and (is_latin(character) is False or is_accentuated(character)) + and is_cjk(character) is False + and is_hangul(character) is False + and is_katakana(character) is False + and is_hiragana(character) is False + and is_thai(character) is False + ): + self._foreign_long_watch = True + if ( + is_cjk(character) + or is_hangul(character) + or is_katakana(character) + or is_hiragana(character) + or is_thai(character) + ): + self._buffer_glyph_count += 1 + return + if not self._buffer: + return + if ( + character.isspace() or is_punctuation(character) or is_separator(character) + ) and self._buffer: + self._word_count += 1 + buffer_length: int = len(self._buffer) + + self._character_count += buffer_length + + if buffer_length >= 4: + if self._buffer_accent_count / buffer_length >= 0.5: + self._is_current_word_bad = True + # Word/Buffer ending with an upper case accentuated letter are so rare, + # that we will consider them all as suspicious. Same weight as foreign_long suspicious. + elif ( + is_accentuated(self._buffer[-1]) + and self._buffer[-1].isupper() + and all(_.isupper() for _ in self._buffer) is False + ): + self._foreign_long_count += 1 + self._is_current_word_bad = True + elif self._buffer_glyph_count == 1: + self._is_current_word_bad = True + self._foreign_long_count += 1 + if buffer_length >= 24 and self._foreign_long_watch: + camel_case_dst = [ + i + for c, i in zip(self._buffer, range(0, buffer_length)) + if c.isupper() + ] + probable_camel_cased: bool = False + + if camel_case_dst and (len(camel_case_dst) / buffer_length <= 0.3): + probable_camel_cased = True + + if not probable_camel_cased: + self._foreign_long_count += 1 + self._is_current_word_bad = True + + if self._is_current_word_bad: + self._bad_word_count += 1 + self._bad_character_count += len(self._buffer) + self._is_current_word_bad = False + + self._foreign_long_watch = False + self._buffer = "" + self._buffer_accent_count = 0 + self._buffer_glyph_count = 0 + elif ( + character not in {"<", ">", "-", "=", "~", "|", "_"} + and character.isdigit() is False + and is_symbol(character) + ): + self._is_current_word_bad = True + self._buffer += character + + def reset(self) -> None: # Abstract + self._buffer = "" + self._is_current_word_bad = False + self._foreign_long_watch = False + self._bad_word_count = 0 + self._word_count = 0 + self._character_count = 0 + self._bad_character_count = 0 + self._foreign_long_count = 0 + + @property + def ratio(self) -> float: + if self._word_count <= 10 and self._foreign_long_count == 0: + return 0.0 + + return self._bad_character_count / self._character_count + + +class CjkUncommonPlugin(MessDetectorPlugin): + """ + Detect messy CJK text that probably means nothing. + """ + + def __init__(self) -> None: + self._character_count: int = 0 + self._uncommon_count: int = 0 + + def eligible(self, character: str) -> bool: + return is_cjk(character) + + def feed(self, character: str) -> None: + self._character_count += 1 + + if is_cjk_uncommon(character): + self._uncommon_count += 1 + return + + def reset(self) -> None: # Abstract + self._character_count = 0 + self._uncommon_count = 0 + + @property + def ratio(self) -> float: + if self._character_count < 8: + return 0.0 + + uncommon_form_usage: float = self._uncommon_count / self._character_count + + # we can be pretty sure it's garbage when uncommon characters are widely + # used. otherwise it could just be traditional chinese for example. + return uncommon_form_usage / 10 if uncommon_form_usage > 0.5 else 0.0 + + +class ArchaicUpperLowerPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._buf: bool = False + + self._character_count_since_last_sep: int = 0 + + self._successive_upper_lower_count: int = 0 + self._successive_upper_lower_count_final: int = 0 + + self._character_count: int = 0 + + self._last_alpha_seen: str | None = None + self._current_ascii_only: bool = True + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + is_concerned = character.isalpha() and is_case_variable(character) + chunk_sep = is_concerned is False + + if chunk_sep and self._character_count_since_last_sep > 0: + if ( + self._character_count_since_last_sep <= 64 + and character.isdigit() is False + and self._current_ascii_only is False + ): + self._successive_upper_lower_count_final += ( + self._successive_upper_lower_count + ) + + self._successive_upper_lower_count = 0 + self._character_count_since_last_sep = 0 + self._last_alpha_seen = None + self._buf = False + self._character_count += 1 + self._current_ascii_only = True + + return + + if self._current_ascii_only is True and character.isascii() is False: + self._current_ascii_only = False + + if self._last_alpha_seen is not None: + if (character.isupper() and self._last_alpha_seen.islower()) or ( + character.islower() and self._last_alpha_seen.isupper() + ): + if self._buf is True: + self._successive_upper_lower_count += 2 + self._buf = False + else: + self._buf = True + else: + self._buf = False + + self._character_count += 1 + self._character_count_since_last_sep += 1 + self._last_alpha_seen = character + + def reset(self) -> None: # Abstract + self._character_count = 0 + self._character_count_since_last_sep = 0 + self._successive_upper_lower_count = 0 + self._successive_upper_lower_count_final = 0 + self._last_alpha_seen = None + self._buf = False + self._current_ascii_only = True + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + return self._successive_upper_lower_count_final / self._character_count + + +class ArabicIsolatedFormPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._character_count: int = 0 + self._isolated_form_count: int = 0 + + def reset(self) -> None: # Abstract + self._character_count = 0 + self._isolated_form_count = 0 + + def eligible(self, character: str) -> bool: + return is_arabic(character) + + def feed(self, character: str) -> None: + self._character_count += 1 + + if is_arabic_isolated_form(character): + self._isolated_form_count += 1 + + @property + def ratio(self) -> float: + if self._character_count < 8: + return 0.0 + + isolated_form_usage: float = self._isolated_form_count / self._character_count + + return isolated_form_usage + + +@lru_cache(maxsize=1024) +def is_suspiciously_successive_range( + unicode_range_a: str | None, unicode_range_b: str | None +) -> bool: + """ + Determine if two Unicode range seen next to each other can be considered as suspicious. + """ + if unicode_range_a is None or unicode_range_b is None: + return True + + if unicode_range_a == unicode_range_b: + return False + + if "Latin" in unicode_range_a and "Latin" in unicode_range_b: + return False + + if "Emoticons" in unicode_range_a or "Emoticons" in unicode_range_b: + return False + + # Latin characters can be accompanied with a combining diacritical mark + # eg. Vietnamese. + if ("Latin" in unicode_range_a or "Latin" in unicode_range_b) and ( + "Combining" in unicode_range_a or "Combining" in unicode_range_b + ): + return False + + keywords_range_a, keywords_range_b = ( + unicode_range_a.split(" "), + unicode_range_b.split(" "), + ) + + for el in keywords_range_a: + if el in UNICODE_SECONDARY_RANGE_KEYWORD: + continue + if el in keywords_range_b: + return False + + # Japanese Exception + range_a_jp_chars, range_b_jp_chars = ( + unicode_range_a + in ( + "Hiragana", + "Katakana", + ), + unicode_range_b in ("Hiragana", "Katakana"), + ) + if (range_a_jp_chars or range_b_jp_chars) and ( + "CJK" in unicode_range_a or "CJK" in unicode_range_b + ): + return False + if range_a_jp_chars and range_b_jp_chars: + return False + + if "Hangul" in unicode_range_a or "Hangul" in unicode_range_b: + if "CJK" in unicode_range_a or "CJK" in unicode_range_b: + return False + if unicode_range_a == "Basic Latin" or unicode_range_b == "Basic Latin": + return False + + # Chinese/Japanese use dedicated range for punctuation and/or separators. + if ("CJK" in unicode_range_a or "CJK" in unicode_range_b) or ( + unicode_range_a in ["Katakana", "Hiragana"] + and unicode_range_b in ["Katakana", "Hiragana"] + ): + if "Punctuation" in unicode_range_a or "Punctuation" in unicode_range_b: + return False + if "Forms" in unicode_range_a or "Forms" in unicode_range_b: + return False + if unicode_range_a == "Basic Latin" or unicode_range_b == "Basic Latin": + return False + + return True + + +@lru_cache(maxsize=2048) +def mess_ratio( + decoded_sequence: str, maximum_threshold: float = 0.2, debug: bool = False +) -> float: + """ + Compute a mess ratio given a decoded bytes sequence. The maximum threshold does stop the computation earlier. + """ + + detectors: list[MessDetectorPlugin] = [ + md_class() for md_class in MessDetectorPlugin.__subclasses__() + ] + + length: int = len(decoded_sequence) + 1 + + mean_mess_ratio: float = 0.0 + + if length < 512: + intermediary_mean_mess_ratio_calc: int = 32 + elif length <= 1024: + intermediary_mean_mess_ratio_calc = 64 + else: + intermediary_mean_mess_ratio_calc = 128 + + for character, index in zip(decoded_sequence + "\n", range(length)): + for detector in detectors: + if detector.eligible(character): + detector.feed(character) + + if ( + index > 0 and index % intermediary_mean_mess_ratio_calc == 0 + ) or index == length - 1: + mean_mess_ratio = sum(dt.ratio for dt in detectors) + + if mean_mess_ratio >= maximum_threshold: + break + + if debug: + logger = getLogger("charset_normalizer") + + logger.log( + TRACE, + "Mess-detector extended-analysis start. " + f"intermediary_mean_mess_ratio_calc={intermediary_mean_mess_ratio_calc} mean_mess_ratio={mean_mess_ratio} " + f"maximum_threshold={maximum_threshold}", + ) + + if len(decoded_sequence) > 16: + logger.log(TRACE, f"Starting with: {decoded_sequence[:16]}") + logger.log(TRACE, f"Ending with: {decoded_sequence[-16::]}") + + for dt in detectors: + logger.log(TRACE, f"{dt.__class__}: {dt.ratio}") + + return round(mean_mess_ratio, 3) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/md__mypyc.cpython-312-x86_64-linux-gnu.so b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/md__mypyc.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..b21e77b522ce460c689d283cd4387a97e4d6ee7a GIT binary patch literal 290584 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 atVq$C}Kp=3Au6~ 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 bool: + if not isinstance(other, CharsetMatch): + if isinstance(other, str): + return iana_name(other) == self.encoding + return False + return self.encoding == other.encoding and self.fingerprint == other.fingerprint + + def __lt__(self, other: object) -> bool: + """ + Implemented to make sorted available upon CharsetMatches items. + """ + if not isinstance(other, CharsetMatch): + raise ValueError + + chaos_difference: float = abs(self.chaos - other.chaos) + coherence_difference: float = abs(self.coherence - other.coherence) + + # Below 1% difference --> Use Coherence + if chaos_difference < 0.01 and coherence_difference > 0.02: + return self.coherence > other.coherence + elif chaos_difference < 0.01 and coherence_difference <= 0.02: + # When having a difficult decision, use the result that decoded as many multi-byte as possible. + # preserve RAM usage! + if len(self._payload) >= TOO_BIG_SEQUENCE: + return self.chaos < other.chaos + return self.multi_byte_usage > other.multi_byte_usage + + return self.chaos < other.chaos + + @property + def multi_byte_usage(self) -> float: + return 1.0 - (len(str(self)) / len(self.raw)) + + def __str__(self) -> str: + # Lazy Str Loading + if self._string is None: + self._string = str(self._payload, self._encoding, "strict") + return self._string + + def __repr__(self) -> str: + return f"" + + def add_submatch(self, other: CharsetMatch) -> None: + if not isinstance(other, CharsetMatch) or other == self: + raise ValueError( + "Unable to add instance <{}> as a submatch of a CharsetMatch".format( + other.__class__ + ) + ) + + other._string = None # Unload RAM usage; dirty trick. + self._leaves.append(other) + + @property + def encoding(self) -> str: + return self._encoding + + @property + def encoding_aliases(self) -> list[str]: + """ + Encoding name are known by many name, using this could help when searching for IBM855 when it's listed as CP855. + """ + also_known_as: list[str] = [] + for u, p in aliases.items(): + if self.encoding == u: + also_known_as.append(p) + elif self.encoding == p: + also_known_as.append(u) + return also_known_as + + @property + def bom(self) -> bool: + return self._has_sig_or_bom + + @property + def byte_order_mark(self) -> bool: + return self._has_sig_or_bom + + @property + def languages(self) -> list[str]: + """ + Return the complete list of possible languages found in decoded sequence. + Usually not really useful. Returned list may be empty even if 'language' property return something != 'Unknown'. + """ + return [e[0] for e in self._languages] + + @property + def language(self) -> str: + """ + Most probable language found in decoded sequence. If none were detected or inferred, the property will return + "Unknown". + """ + if not self._languages: + # Trying to infer the language based on the given encoding + # Its either English or we should not pronounce ourselves in certain cases. + if "ascii" in self.could_be_from_charset: + return "English" + + # doing it there to avoid circular import + from charset_normalizer.cd import encoding_languages, mb_encoding_languages + + languages = ( + mb_encoding_languages(self.encoding) + if is_multi_byte_encoding(self.encoding) + else encoding_languages(self.encoding) + ) + + if len(languages) == 0 or "Latin Based" in languages: + return "Unknown" + + return languages[0] + + return self._languages[0][0] + + @property + def chaos(self) -> float: + return self._mean_mess_ratio + + @property + def coherence(self) -> float: + if not self._languages: + return 0.0 + return self._languages[0][1] + + @property + def percent_chaos(self) -> float: + return round(self.chaos * 100, ndigits=3) + + @property + def percent_coherence(self) -> float: + return round(self.coherence * 100, ndigits=3) + + @property + def raw(self) -> bytes: + """ + Original untouched bytes. + """ + return self._payload + + @property + def submatch(self) -> list[CharsetMatch]: + return self._leaves + + @property + def has_submatch(self) -> bool: + return len(self._leaves) > 0 + + @property + def alphabets(self) -> list[str]: + if self._unicode_ranges is not None: + return self._unicode_ranges + # list detected ranges + detected_ranges: list[str | None] = [unicode_range(char) for char in str(self)] + # filter and sort + self._unicode_ranges = sorted(list({r for r in detected_ranges if r})) + return self._unicode_ranges + + @property + def could_be_from_charset(self) -> list[str]: + """ + The complete list of encoding that output the exact SAME str result and therefore could be the originating + encoding. + This list does include the encoding available in property 'encoding'. + """ + return [self._encoding] + [m.encoding for m in self._leaves] + + def output(self, encoding: str = "utf_8") -> bytes: + """ + Method to get re-encoded bytes payload using given target encoding. Default to UTF-8. + Any errors will be simply ignored by the encoder NOT replaced. + """ + if self._output_encoding is None or self._output_encoding != encoding: + self._output_encoding = encoding + decoded_string = str(self) + if ( + self._preemptive_declaration is not None + and self._preemptive_declaration.lower() + not in ["utf-8", "utf8", "utf_8"] + ): + patched_header = sub( + RE_POSSIBLE_ENCODING_INDICATION, + lambda m: m.string[m.span()[0] : m.span()[1]].replace( + m.groups()[0], + iana_name(self._output_encoding).replace("_", "-"), # type: ignore[arg-type] + ), + decoded_string[:8192], + count=1, + ) + + decoded_string = patched_header + decoded_string[8192:] + + self._output_payload = decoded_string.encode(encoding, "replace") + + return self._output_payload # type: ignore + + @property + def fingerprint(self) -> str: + """ + Retrieve the unique SHA256 computed using the transformed (re-encoded) payload. Not the original one. + """ + return sha256(self.output()).hexdigest() + + +class CharsetMatches: + """ + Container with every CharsetMatch items ordered by default from most probable to the less one. + Act like a list(iterable) but does not implements all related methods. + """ + + def __init__(self, results: list[CharsetMatch] | None = None): + self._results: list[CharsetMatch] = sorted(results) if results else [] + + def __iter__(self) -> Iterator[CharsetMatch]: + yield from self._results + + def __getitem__(self, item: int | str) -> CharsetMatch: + """ + Retrieve a single item either by its position or encoding name (alias may be used here). + Raise KeyError upon invalid index or encoding not present in results. + """ + if isinstance(item, int): + return self._results[item] + if isinstance(item, str): + item = iana_name(item, False) + for result in self._results: + if item in result.could_be_from_charset: + return result + raise KeyError + + def __len__(self) -> int: + return len(self._results) + + def __bool__(self) -> bool: + return len(self._results) > 0 + + def append(self, item: CharsetMatch) -> None: + """ + Insert a single match. Will be inserted accordingly to preserve sort. + Can be inserted as a submatch. + """ + if not isinstance(item, CharsetMatch): + raise ValueError( + "Cannot append instance '{}' to CharsetMatches".format( + str(item.__class__) + ) + ) + # We should disable the submatch factoring when the input file is too heavy (conserve RAM usage) + if len(item.raw) < TOO_BIG_SEQUENCE: + for match in self._results: + if match.fingerprint == item.fingerprint and match.chaos == item.chaos: + match.add_submatch(item) + return + self._results.append(item) + self._results = sorted(self._results) + + def best(self) -> CharsetMatch | None: + """ + Simply return the first match. Strict equivalent to matches[0]. + """ + if not self._results: + return None + return self._results[0] + + def first(self) -> CharsetMatch | None: + """ + Redundant method, call the method best(). Kept for BC reasons. + """ + return self.best() + + +CoherenceMatch = Tuple[str, float] +CoherenceMatches = List[CoherenceMatch] + + +class CliDetectionResult: + def __init__( + self, + path: str, + encoding: str | None, + encoding_aliases: list[str], + alternative_encodings: list[str], + language: str, + alphabets: list[str], + has_sig_or_bom: bool, + chaos: float, + coherence: float, + unicode_path: str | None, + is_preferred: bool, + ): + self.path: str = path + self.unicode_path: str | None = unicode_path + self.encoding: str | None = encoding + self.encoding_aliases: list[str] = encoding_aliases + self.alternative_encodings: list[str] = alternative_encodings + self.language: str = language + self.alphabets: list[str] = alphabets + self.has_sig_or_bom: bool = has_sig_or_bom + self.chaos: float = chaos + self.coherence: float = coherence + self.is_preferred: bool = is_preferred + + @property + def __dict__(self) -> dict[str, Any]: # type: ignore + return { + "path": self.path, + "encoding": self.encoding, + "encoding_aliases": self.encoding_aliases, + "alternative_encodings": self.alternative_encodings, + "language": self.language, + "alphabets": self.alphabets, + "has_sig_or_bom": self.has_sig_or_bom, + "chaos": self.chaos, + "coherence": self.coherence, + "unicode_path": self.unicode_path, + "is_preferred": self.is_preferred, + } + + def to_json(self) -> str: + return dumps(self.__dict__, ensure_ascii=True, indent=4) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/py.typed b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/utils.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/utils.py new file mode 100644 index 0000000..6bf0384 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/utils.py @@ -0,0 +1,414 @@ +from __future__ import annotations + +import importlib +import logging +import unicodedata +from codecs import IncrementalDecoder +from encodings.aliases import aliases +from functools import lru_cache +from re import findall +from typing import Generator + +from _multibytecodec import ( # type: ignore[import-not-found,import] + MultibyteIncrementalDecoder, +) + +from .constant import ( + ENCODING_MARKS, + IANA_SUPPORTED_SIMILAR, + RE_POSSIBLE_ENCODING_INDICATION, + UNICODE_RANGES_COMBINED, + UNICODE_SECONDARY_RANGE_KEYWORD, + UTF8_MAXIMAL_ALLOCATION, + COMMON_CJK_CHARACTERS, +) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_accentuated(character: str) -> bool: + try: + description: str = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + return ( + "WITH GRAVE" in description + or "WITH ACUTE" in description + or "WITH CEDILLA" in description + or "WITH DIAERESIS" in description + or "WITH CIRCUMFLEX" in description + or "WITH TILDE" in description + or "WITH MACRON" in description + or "WITH RING ABOVE" in description + ) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def remove_accent(character: str) -> str: + decomposed: str = unicodedata.decomposition(character) + if not decomposed: + return character + + codes: list[str] = decomposed.split(" ") + + return chr(int(codes[0], 16)) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def unicode_range(character: str) -> str | None: + """ + Retrieve the Unicode range official name from a single character. + """ + character_ord: int = ord(character) + + for range_name, ord_range in UNICODE_RANGES_COMBINED.items(): + if character_ord in ord_range: + return range_name + + return None + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_latin(character: str) -> bool: + try: + description: str = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + return "LATIN" in description + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_punctuation(character: str) -> bool: + character_category: str = unicodedata.category(character) + + if "P" in character_category: + return True + + character_range: str | None = unicode_range(character) + + if character_range is None: + return False + + return "Punctuation" in character_range + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_symbol(character: str) -> bool: + character_category: str = unicodedata.category(character) + + if "S" in character_category or "N" in character_category: + return True + + character_range: str | None = unicode_range(character) + + if character_range is None: + return False + + return "Forms" in character_range and character_category != "Lo" + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_emoticon(character: str) -> bool: + character_range: str | None = unicode_range(character) + + if character_range is None: + return False + + return "Emoticons" in character_range or "Pictographs" in character_range + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_separator(character: str) -> bool: + if character.isspace() or character in {"|", "+", "<", ">"}: + return True + + character_category: str = unicodedata.category(character) + + return "Z" in character_category or character_category in {"Po", "Pd", "Pc"} + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_case_variable(character: str) -> bool: + return character.islower() != character.isupper() + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_cjk(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "CJK" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_hiragana(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "HIRAGANA" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_katakana(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "KATAKANA" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_hangul(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "HANGUL" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_thai(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "THAI" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_arabic(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "ARABIC" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_arabic_isolated_form(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "ARABIC" in character_name and "ISOLATED FORM" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_cjk_uncommon(character: str) -> bool: + return character not in COMMON_CJK_CHARACTERS + + +@lru_cache(maxsize=len(UNICODE_RANGES_COMBINED)) +def is_unicode_range_secondary(range_name: str) -> bool: + return any(keyword in range_name for keyword in UNICODE_SECONDARY_RANGE_KEYWORD) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_unprintable(character: str) -> bool: + return ( + character.isspace() is False # includes \n \t \r \v + and character.isprintable() is False + and character != "\x1a" # Why? Its the ASCII substitute character. + and character != "\ufeff" # bug discovered in Python, + # Zero Width No-Break Space located in Arabic Presentation Forms-B, Unicode 1.1 not acknowledged as space. + ) + + +def any_specified_encoding(sequence: bytes, search_zone: int = 8192) -> str | None: + """ + Extract using ASCII-only decoder any specified encoding in the first n-bytes. + """ + if not isinstance(sequence, bytes): + raise TypeError + + seq_len: int = len(sequence) + + results: list[str] = findall( + RE_POSSIBLE_ENCODING_INDICATION, + sequence[: min(seq_len, search_zone)].decode("ascii", errors="ignore"), + ) + + if len(results) == 0: + return None + + for specified_encoding in results: + specified_encoding = specified_encoding.lower().replace("-", "_") + + encoding_alias: str + encoding_iana: str + + for encoding_alias, encoding_iana in aliases.items(): + if encoding_alias == specified_encoding: + return encoding_iana + if encoding_iana == specified_encoding: + return encoding_iana + + return None + + +@lru_cache(maxsize=128) +def is_multi_byte_encoding(name: str) -> bool: + """ + Verify is a specific encoding is a multi byte one based on it IANA name + """ + return name in { + "utf_8", + "utf_8_sig", + "utf_16", + "utf_16_be", + "utf_16_le", + "utf_32", + "utf_32_le", + "utf_32_be", + "utf_7", + } or issubclass( + importlib.import_module(f"encodings.{name}").IncrementalDecoder, + MultibyteIncrementalDecoder, + ) + + +def identify_sig_or_bom(sequence: bytes) -> tuple[str | None, bytes]: + """ + Identify and extract SIG/BOM in given sequence. + """ + + for iana_encoding in ENCODING_MARKS: + marks: bytes | list[bytes] = ENCODING_MARKS[iana_encoding] + + if isinstance(marks, bytes): + marks = [marks] + + for mark in marks: + if sequence.startswith(mark): + return iana_encoding, mark + + return None, b"" + + +def should_strip_sig_or_bom(iana_encoding: str) -> bool: + return iana_encoding not in {"utf_16", "utf_32"} + + +def iana_name(cp_name: str, strict: bool = True) -> str: + """Returns the Python normalized encoding name (Not the IANA official name).""" + cp_name = cp_name.lower().replace("-", "_") + + encoding_alias: str + encoding_iana: str + + for encoding_alias, encoding_iana in aliases.items(): + if cp_name in [encoding_alias, encoding_iana]: + return encoding_iana + + if strict: + raise ValueError(f"Unable to retrieve IANA for '{cp_name}'") + + return cp_name + + +def cp_similarity(iana_name_a: str, iana_name_b: str) -> float: + if is_multi_byte_encoding(iana_name_a) or is_multi_byte_encoding(iana_name_b): + return 0.0 + + decoder_a = importlib.import_module(f"encodings.{iana_name_a}").IncrementalDecoder + decoder_b = importlib.import_module(f"encodings.{iana_name_b}").IncrementalDecoder + + id_a: IncrementalDecoder = decoder_a(errors="ignore") + id_b: IncrementalDecoder = decoder_b(errors="ignore") + + character_match_count: int = 0 + + for i in range(255): + to_be_decoded: bytes = bytes([i]) + if id_a.decode(to_be_decoded) == id_b.decode(to_be_decoded): + character_match_count += 1 + + return character_match_count / 254 + + +def is_cp_similar(iana_name_a: str, iana_name_b: str) -> bool: + """ + Determine if two code page are at least 80% similar. IANA_SUPPORTED_SIMILAR dict was generated using + the function cp_similarity. + """ + return ( + iana_name_a in IANA_SUPPORTED_SIMILAR + and iana_name_b in IANA_SUPPORTED_SIMILAR[iana_name_a] + ) + + +def set_logging_handler( + name: str = "charset_normalizer", + level: int = logging.INFO, + format_string: str = "%(asctime)s | %(levelname)s | %(message)s", +) -> None: + logger = logging.getLogger(name) + logger.setLevel(level) + + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter(format_string)) + logger.addHandler(handler) + + +def cut_sequence_chunks( + sequences: bytes, + encoding_iana: str, + offsets: range, + chunk_size: int, + bom_or_sig_available: bool, + strip_sig_or_bom: bool, + sig_payload: bytes, + is_multi_byte_decoder: bool, + decoded_payload: str | None = None, +) -> Generator[str, None, None]: + if decoded_payload and is_multi_byte_decoder is False: + for i in offsets: + chunk = decoded_payload[i : i + chunk_size] + if not chunk: + break + yield chunk + else: + for i in offsets: + chunk_end = i + chunk_size + if chunk_end > len(sequences) + 8: + continue + + cut_sequence = sequences[i : i + chunk_size] + + if bom_or_sig_available and strip_sig_or_bom is False: + cut_sequence = sig_payload + cut_sequence + + chunk = cut_sequence.decode( + encoding_iana, + errors="ignore" if is_multi_byte_decoder else "strict", + ) + + # multi-byte bad cutting detector and adjustment + # not the cleanest way to perform that fix but clever enough for now. + if is_multi_byte_decoder and i > 0: + chunk_partial_size_chk: int = min(chunk_size, 16) + + if ( + decoded_payload + and chunk[:chunk_partial_size_chk] not in decoded_payload + ): + for j in range(i, i - 4, -1): + cut_sequence = sequences[j:chunk_end] + + if bom_or_sig_available and strip_sig_or_bom is False: + cut_sequence = sig_payload + cut_sequence + + chunk = cut_sequence.decode(encoding_iana, errors="ignore") + + if chunk[:chunk_partial_size_chk] in decoded_payload: + break + + yield chunk diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/version.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/version.py new file mode 100644 index 0000000..c843e53 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/charset_normalizer/version.py @@ -0,0 +1,8 @@ +""" +Expose version +""" + +from __future__ import annotations + +__version__ = "3.4.4" +VERSION = __version__.split(".") diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/__init__.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/__init__.py new file mode 100644 index 0000000..dde24a0 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/__init__.py @@ -0,0 +1,51 @@ +from typing import Any, Optional + +from .main import dotenv_values, find_dotenv, get_key, load_dotenv, set_key, unset_key + + +def load_ipython_extension(ipython: Any) -> None: + from .ipython import load_ipython_extension + + load_ipython_extension(ipython) + + +def get_cli_string( + path: Optional[str] = None, + action: Optional[str] = None, + key: Optional[str] = None, + value: Optional[str] = None, + quote: Optional[str] = None, +): + """Returns a string suitable for running as a shell script. + + Useful for converting a arguments passed to a fabric task + to be passed to a `local` or `run` command. + """ + command = ["dotenv"] + if quote: + command.append(f"-q {quote}") + if path: + command.append(f"-f {path}") + if action: + command.append(action) + if key: + command.append(key) + if value: + if " " in value: + command.append(f'"{value}"') + else: + command.append(value) + + return " ".join(command).strip() + + +__all__ = [ + "get_cli_string", + "load_dotenv", + "dotenv_values", + "get_key", + "set_key", + "unset_key", + "find_dotenv", + "load_ipython_extension", +] diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/__main__.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/__main__.py new file mode 100644 index 0000000..3977f55 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/__main__.py @@ -0,0 +1,6 @@ +"""Entry point for cli, enables execution with `python -m dotenv`""" + +from .cli import cli + +if __name__ == "__main__": + cli() diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/__pycache__/__init__.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d7834c9f79ba8620f780a46063d58238b288ccf4 GIT binary patch literal 1683 zcmZ`(O>Y}T7@qxJdu=CeOlV0t;h+ZP};*@HXF~{S!X}o*|ovd zMha37_!Jij)lyX{;?%1A1AYP$0yS0bl@LK3P;Z9Za^jt}orEeK+t0l7&a>~wSI3f|bA`<1EsHanC{2>!WwRlUr2ysd3*h(K;+Od@xTa`4)-jno96_MNz zoStpTg~^w!zyco&pLnfU{k$I9zGpfwIp&q)Eb&9jYZ^_{X;?w5RcwzKLtm^^tj=oEK@6NP_I;G;m1P&gZ&OM07%3Uo=LRLafn9|7on#k zHiufMAe5*CyaE?bCuv8a4eM(tG=Sot@RW&8Cm2iu1Uvx7M{C7R-?fUNY1iyx==)Ak zG`9l7tXf`JTxvp_MaSMK4oh8LdjErBV29RX-7IebCnyfvE*ggI*`Z-9)my_HERoFe zWC3>2?_%*!@vZJh&&4Z;;6SlhH^a?XHp@)fSYV1tiJq}^rvdVoSwG{!>_m(k&@>aH z%56)LNb`|YJ1yFXPxwfDh#v7L5=H2>Tp>cQa5=hmcHD?N6_KacUc)+_SD^0_F%p`H zPM^&tQY1V?M0zBg#P-ge&5cfRh*)EayfPwb9Hn+zzY*){Xub)D`0kHiB&ROGCJsVs zdsQ4X?9kkBEL`y^rVYNB%{Icn+V@SOYxz};ocU{vXO9?-ghv)3B zuy_XpRPYf8-?@SSN2p%6JQ9mF-}YjO^-?d$bP9T8G^1Z3)?!x_*UVi35>3(T%ZLhIc zeZ01}@;v|E!N~XFe!g&^<#w;OuXa|SX_sDTbH8bG&$Rhp#d&%jDl4c-r8EULWj#@q z0eksUje){|UB`k{Vxy3Y<*-$Uzl*XHMB(KO*U>d?Z}@n^Phun?PXe(Ru>k5M31h`D zOvf>dCn%{S5%EY}aedNotZVcgV6(d!>;Mb|j^qA7_-}Ok1-dGPfC_ToSQ`yi9=+-!d~kiZ_u2zIWtFAo&9QW5N3 YZ+|>Uu~mAsI%E<4T}f&DH%e0Bf0Yo9!vFvP literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/__pycache__/__main__.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/__pycache__/__main__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..099b04beda871e4241414e39151325bb334fc465 GIT binary patch literal 351 zcmXv~u}T9$5S_g}$)TjPQ4qE?U~W-cNo88WHqB;pJDN3jyT{!o@zPlc{(;{heuAH1 zXO~ohSl9*9rE-rXQ_Rd`-pqTvjt01ea6tpL5d~AM@+^}Tf?T>4Ou_0 z+|Yw|#*}qvCjCF+54OmH`n5$QL?*Qn;-*Cx4Iz|Ggea(I)FUG^6ygn5wT1O9AKDDL zllnn(XKh+?IVy#`N8@-r@wa)Z2Ye%V8J}P9QafztG8uVJ$v66Zrx@qeI=afN8mHJP m>Sxu)$`hZKln^q9>t8thrUx&xFM2c&8_(S(h48qDJmViou46#} literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/__pycache__/cli.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/__pycache__/cli.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b516f7392a7f3bd4c653b7924360f40eebe29c2f GIT binary patch literal 10304 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 W;lE-}by0ucwg3BjnSTh=kp2$~@84Yj literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/__pycache__/ipython.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/__pycache__/ipython.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..084f12515a2521ef93e90c5a4f4ee72d32776bd9 GIT binary patch literal 1967 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 W#UMw2U}j`wyul~h$X&z& Optional[str]: + """ + Return a path for the ${pwd}/.env file. + + If pwd does not exist, return None. + """ + try: + cwd = os.getcwd() + except FileNotFoundError: + return None + path = os.path.join(cwd, ".env") + return path + + +@click.group() +@click.option( + "-f", + "--file", + default=enumerate_env(), + type=click.Path(file_okay=True), + help="Location of the .env file, defaults to .env file in current working directory.", +) +@click.option( + "-q", + "--quote", + default="always", + type=click.Choice(["always", "never", "auto"]), + help="Whether to quote or not the variable values. Default mode is always. This does not affect parsing.", +) +@click.option( + "-e", + "--export", + default=False, + type=click.BOOL, + help="Whether to write the dot file as an executable bash script.", +) +@click.version_option(version=__version__) +@click.pass_context +def cli(ctx: click.Context, file: Any, quote: Any, export: Any) -> None: + """This script is used to set, get or unset values from a .env file.""" + ctx.obj = {"QUOTE": quote, "EXPORT": export, "FILE": file} + + +@contextmanager +def stream_file(path: os.PathLike) -> Iterator[IO[str]]: + """ + Open a file and yield the corresponding (decoded) stream. + + Exits with error code 2 if the file cannot be opened. + """ + + try: + with open(path) as stream: + yield stream + except OSError as exc: + print(f"Error opening env file: {exc}", file=sys.stderr) + sys.exit(2) + + +@cli.command(name="list") +@click.pass_context +@click.option( + "--format", + "output_format", + default="simple", + type=click.Choice(["simple", "json", "shell", "export"]), + help="The format in which to display the list. Default format is simple, " + "which displays name=value without quotes.", +) +def list_values(ctx: click.Context, output_format: str) -> None: + """Display all the stored key/value.""" + file = ctx.obj["FILE"] + + with stream_file(file) as stream: + values = dotenv_values(stream=stream) + + if output_format == "json": + click.echo(json.dumps(values, indent=2, sort_keys=True)) + else: + prefix = "export " if output_format == "export" else "" + for k in sorted(values): + v = values[k] + if v is not None: + if output_format in ("export", "shell"): + v = shlex.quote(v) + click.echo(f"{prefix}{k}={v}") + + +@cli.command(name="set") +@click.pass_context +@click.argument("key", required=True) +@click.argument("value", required=True) +def set_value(ctx: click.Context, key: Any, value: Any) -> None: + """Store the given key/value.""" + file = ctx.obj["FILE"] + quote = ctx.obj["QUOTE"] + export = ctx.obj["EXPORT"] + success, key, value = set_key(file, key, value, quote, export) + if success: + click.echo(f"{key}={value}") + else: + sys.exit(1) + + +@cli.command() +@click.pass_context +@click.argument("key", required=True) +def get(ctx: click.Context, key: Any) -> None: + """Retrieve the value for the given key.""" + file = ctx.obj["FILE"] + + with stream_file(file) as stream: + values = dotenv_values(stream=stream) + + stored_value = values.get(key) + if stored_value: + click.echo(stored_value) + else: + sys.exit(1) + + +@cli.command() +@click.pass_context +@click.argument("key", required=True) +def unset(ctx: click.Context, key: Any) -> None: + """Removes the given key.""" + file = ctx.obj["FILE"] + quote = ctx.obj["QUOTE"] + success, key = unset_key(file, key, quote) + if success: + click.echo(f"Successfully removed {key}") + else: + sys.exit(1) + + +@cli.command(context_settings={"ignore_unknown_options": True}) +@click.pass_context +@click.option( + "--override/--no-override", + default=True, + help="Override variables from the environment file with those from the .env file.", +) +@click.argument("commandline", nargs=-1, type=click.UNPROCESSED) +def run(ctx: click.Context, override: bool, commandline: List[str]) -> None: + """Run command with environment variables present.""" + file = ctx.obj["FILE"] + if not os.path.isfile(file): + raise click.BadParameter( + f"Invalid value for '-f' \"{file}\" does not exist.", ctx=ctx + ) + dotenv_as_dict = { + k: v + for (k, v) in dotenv_values(file).items() + if v is not None and (override or k not in os.environ) + } + + if not commandline: + click.echo("No command given.") + sys.exit(1) + run_command(commandline, dotenv_as_dict) + + +def run_command(command: List[str], env: Dict[str, str]) -> None: + """Replace the current process with the specified command. + + Replaces the current process with the specified command and the variables from `env` + added in the current environment variables. + + Parameters + ---------- + command: List[str] + The command and it's parameters + env: Dict + The additional environment variables + + Returns + ------- + None + This function does not return any value. It replaces the current process with the new one. + + """ + # copy the current environment variables and add the vales from + # `env` + cmd_env = os.environ.copy() + cmd_env.update(env) + + if sys.platform == "win32": + # execvpe on Windows returns control immediately + # rather than once the command has finished. + p = Popen(command, universal_newlines=True, bufsize=0, shell=False, env=cmd_env) + _, _ = p.communicate() + + sys.exit(p.returncode) + else: + os.execvpe(command[0], args=command, env=cmd_env) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/ipython.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/ipython.py new file mode 100644 index 0000000..4e7edbb --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/ipython.py @@ -0,0 +1,50 @@ +from IPython.core.magic import Magics, line_magic, magics_class # type: ignore +from IPython.core.magic_arguments import ( + argument, + magic_arguments, + parse_argstring, +) # type: ignore + +from .main import find_dotenv, load_dotenv + + +@magics_class +class IPythonDotEnv(Magics): + @magic_arguments() + @argument( + "-o", + "--override", + action="store_true", + help="Indicate to override existing variables", + ) + @argument( + "-v", + "--verbose", + action="store_true", + help="Indicate function calls to be verbose", + ) + @argument( + "dotenv_path", + nargs="?", + type=str, + default=".env", + help="Search in increasingly higher folders for the `dotenv_path`", + ) + @line_magic + def dotenv(self, line): + args = parse_argstring(self.dotenv, line) + # Locate the .env file + dotenv_path = args.dotenv_path + try: + dotenv_path = find_dotenv(dotenv_path, True, True) + except IOError: + print("cannot find .env file") + return + + # Load the .env file + load_dotenv(dotenv_path, verbose=args.verbose, override=args.override) + + +def load_ipython_extension(ipython): + """Register the %dotenv magic.""" + ipython.register_magics(IPythonDotEnv) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/main.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/main.py new file mode 100644 index 0000000..1d6bf0b --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/main.py @@ -0,0 +1,435 @@ +import io +import logging +import os +import pathlib +import shutil +import stat +import sys +import tempfile +from collections import OrderedDict +from contextlib import contextmanager +from typing import IO, Dict, Iterable, Iterator, Mapping, Optional, Tuple, Union + +from .parser import Binding, parse_stream +from .variables import parse_variables + +# A type alias for a string path to be used for the paths in this file. +# These paths may flow to `open()` and `shutil.move()`; `shutil.move()` +# only accepts string paths, not byte paths or file descriptors. See +# https://github.com/python/typeshed/pull/6832. +StrPath = Union[str, "os.PathLike[str]"] + +logger = logging.getLogger(__name__) + + +def _load_dotenv_disabled() -> bool: + """ + Determine if dotenv loading has been disabled. + """ + if "PYTHON_DOTENV_DISABLED" not in os.environ: + return False + value = os.environ["PYTHON_DOTENV_DISABLED"].casefold() + return value in {"1", "true", "t", "yes", "y"} + + +def with_warn_for_invalid_lines(mappings: Iterator[Binding]) -> Iterator[Binding]: + for mapping in mappings: + if mapping.error: + logger.warning( + "python-dotenv could not parse statement starting at line %s", + mapping.original.line, + ) + yield mapping + + +class DotEnv: + def __init__( + self, + dotenv_path: Optional[StrPath], + stream: Optional[IO[str]] = None, + verbose: bool = False, + encoding: Optional[str] = None, + interpolate: bool = True, + override: bool = True, + ) -> None: + self.dotenv_path: Optional[StrPath] = dotenv_path + self.stream: Optional[IO[str]] = stream + self._dict: Optional[Dict[str, Optional[str]]] = None + self.verbose: bool = verbose + self.encoding: Optional[str] = encoding + self.interpolate: bool = interpolate + self.override: bool = override + + @contextmanager + def _get_stream(self) -> Iterator[IO[str]]: + if self.dotenv_path and _is_file_or_fifo(self.dotenv_path): + with open(self.dotenv_path, encoding=self.encoding) as stream: + yield stream + elif self.stream is not None: + yield self.stream + else: + if self.verbose: + logger.info( + "python-dotenv could not find configuration file %s.", + self.dotenv_path or ".env", + ) + yield io.StringIO("") + + def dict(self) -> Dict[str, Optional[str]]: + """Return dotenv as dict""" + if self._dict: + return self._dict + + raw_values = self.parse() + + if self.interpolate: + self._dict = OrderedDict( + resolve_variables(raw_values, override=self.override) + ) + else: + self._dict = OrderedDict(raw_values) + + return self._dict + + def parse(self) -> Iterator[Tuple[str, Optional[str]]]: + with self._get_stream() as stream: + for mapping in with_warn_for_invalid_lines(parse_stream(stream)): + if mapping.key is not None: + yield mapping.key, mapping.value + + def set_as_environment_variables(self) -> bool: + """ + Load the current dotenv as system environment variable. + """ + if not self.dict(): + return False + + for k, v in self.dict().items(): + if k in os.environ and not self.override: + continue + if v is not None: + os.environ[k] = v + + return True + + def get(self, key: str) -> Optional[str]: + """ """ + data = self.dict() + + if key in data: + return data[key] + + if self.verbose: + logger.warning("Key %s not found in %s.", key, self.dotenv_path) + + return None + + +def get_key( + dotenv_path: StrPath, + key_to_get: str, + encoding: Optional[str] = "utf-8", +) -> Optional[str]: + """ + Get the value of a given key from the given .env. + + Returns `None` if the key isn't found or doesn't have a value. + """ + return DotEnv(dotenv_path, verbose=True, encoding=encoding).get(key_to_get) + + +@contextmanager +def rewrite( + path: StrPath, + encoding: Optional[str], +) -> Iterator[Tuple[IO[str], IO[str]]]: + pathlib.Path(path).touch() + + with tempfile.NamedTemporaryFile(mode="w", encoding=encoding, delete=False) as dest: + error = None + try: + with open(path, encoding=encoding) as source: + yield (source, dest) + except BaseException as err: + error = err + + if error is None: + shutil.move(dest.name, path) + else: + os.unlink(dest.name) + raise error from None + + +def set_key( + dotenv_path: StrPath, + key_to_set: str, + value_to_set: str, + quote_mode: str = "always", + export: bool = False, + encoding: Optional[str] = "utf-8", +) -> Tuple[Optional[bool], str, str]: + """ + Adds or Updates a key/value to the given .env + + If the .env path given doesn't exist, fails instead of risking creating + an orphan .env somewhere in the filesystem + """ + if quote_mode not in ("always", "auto", "never"): + raise ValueError(f"Unknown quote_mode: {quote_mode}") + + quote = quote_mode == "always" or ( + quote_mode == "auto" and not value_to_set.isalnum() + ) + + if quote: + value_out = "'{}'".format(value_to_set.replace("'", "\\'")) + else: + value_out = value_to_set + if export: + line_out = f"export {key_to_set}={value_out}\n" + else: + line_out = f"{key_to_set}={value_out}\n" + + with rewrite(dotenv_path, encoding=encoding) as (source, dest): + replaced = False + missing_newline = False + for mapping in with_warn_for_invalid_lines(parse_stream(source)): + if mapping.key == key_to_set: + dest.write(line_out) + replaced = True + else: + dest.write(mapping.original.string) + missing_newline = not mapping.original.string.endswith("\n") + if not replaced: + if missing_newline: + dest.write("\n") + dest.write(line_out) + + return True, key_to_set, value_to_set + + +def unset_key( + dotenv_path: StrPath, + key_to_unset: str, + quote_mode: str = "always", + encoding: Optional[str] = "utf-8", +) -> Tuple[Optional[bool], str]: + """ + Removes a given key from the given `.env` file. + + If the .env path given doesn't exist, fails. + If the given key doesn't exist in the .env, fails. + """ + if not os.path.exists(dotenv_path): + logger.warning("Can't delete from %s - it doesn't exist.", dotenv_path) + return None, key_to_unset + + removed = False + with rewrite(dotenv_path, encoding=encoding) as (source, dest): + for mapping in with_warn_for_invalid_lines(parse_stream(source)): + if mapping.key == key_to_unset: + removed = True + else: + dest.write(mapping.original.string) + + if not removed: + logger.warning( + "Key %s not removed from %s - key doesn't exist.", key_to_unset, dotenv_path + ) + return None, key_to_unset + + return removed, key_to_unset + + +def resolve_variables( + values: Iterable[Tuple[str, Optional[str]]], + override: bool, +) -> Mapping[str, Optional[str]]: + new_values: Dict[str, Optional[str]] = {} + + for name, value in values: + if value is None: + result = None + else: + atoms = parse_variables(value) + env: Dict[str, Optional[str]] = {} + if override: + env.update(os.environ) # type: ignore + env.update(new_values) + else: + env.update(new_values) + env.update(os.environ) # type: ignore + result = "".join(atom.resolve(env) for atom in atoms) + + new_values[name] = result + + return new_values + + +def _walk_to_root(path: str) -> Iterator[str]: + """ + Yield directories starting from the given directory up to the root + """ + if not os.path.exists(path): + raise IOError("Starting path not found") + + if os.path.isfile(path): + path = os.path.dirname(path) + + last_dir = None + current_dir = os.path.abspath(path) + while last_dir != current_dir: + yield current_dir + parent_dir = os.path.abspath(os.path.join(current_dir, os.path.pardir)) + last_dir, current_dir = current_dir, parent_dir + + +def find_dotenv( + filename: str = ".env", + raise_error_if_not_found: bool = False, + usecwd: bool = False, +) -> str: + """ + Search in increasingly higher folders for the given file + + Returns path to the file if found, or an empty string otherwise + """ + + def _is_interactive(): + """Decide whether this is running in a REPL or IPython notebook""" + if hasattr(sys, "ps1") or hasattr(sys, "ps2"): + return True + try: + main = __import__("__main__", None, None, fromlist=["__file__"]) + except ModuleNotFoundError: + return False + return not hasattr(main, "__file__") + + def _is_debugger(): + return sys.gettrace() is not None + + if usecwd or _is_interactive() or _is_debugger() or getattr(sys, "frozen", False): + # Should work without __file__, e.g. in REPL or IPython notebook. + path = os.getcwd() + else: + # will work for .py files + frame = sys._getframe() + current_file = __file__ + + while frame.f_code.co_filename == current_file or not os.path.exists( + frame.f_code.co_filename + ): + assert frame.f_back is not None + frame = frame.f_back + frame_filename = frame.f_code.co_filename + path = os.path.dirname(os.path.abspath(frame_filename)) + + for dirname in _walk_to_root(path): + check_path = os.path.join(dirname, filename) + if _is_file_or_fifo(check_path): + return check_path + + if raise_error_if_not_found: + raise IOError("File not found") + + return "" + + +def load_dotenv( + dotenv_path: Optional[StrPath] = None, + stream: Optional[IO[str]] = None, + verbose: bool = False, + override: bool = False, + interpolate: bool = True, + encoding: Optional[str] = "utf-8", +) -> bool: + """Parse a .env file and then load all the variables found as environment variables. + + Parameters: + dotenv_path: Absolute or relative path to .env file. + stream: Text stream (such as `io.StringIO`) with .env content, used if + `dotenv_path` is `None`. + verbose: Whether to output a warning the .env file is missing. + override: Whether to override the system environment variables with the variables + from the `.env` file. + encoding: Encoding to be used to read the file. + Returns: + Bool: True if at least one environment variable is set else False + + If both `dotenv_path` and `stream` are `None`, `find_dotenv()` is used to find the + .env file with it's default parameters. If you need to change the default parameters + of `find_dotenv()`, you can explicitly call `find_dotenv()` and pass the result + to this function as `dotenv_path`. + + If the environment variable `PYTHON_DOTENV_DISABLED` is set to a truthy value, + .env loading is disabled. + """ + if _load_dotenv_disabled(): + logger.debug( + "python-dotenv: .env loading disabled by PYTHON_DOTENV_DISABLED environment variable" + ) + return False + + if dotenv_path is None and stream is None: + dotenv_path = find_dotenv() + + dotenv = DotEnv( + dotenv_path=dotenv_path, + stream=stream, + verbose=verbose, + interpolate=interpolate, + override=override, + encoding=encoding, + ) + return dotenv.set_as_environment_variables() + + +def dotenv_values( + dotenv_path: Optional[StrPath] = None, + stream: Optional[IO[str]] = None, + verbose: bool = False, + interpolate: bool = True, + encoding: Optional[str] = "utf-8", +) -> Dict[str, Optional[str]]: + """ + Parse a .env file and return its content as a dict. + + The returned dict will have `None` values for keys without values in the .env file. + For example, `foo=bar` results in `{"foo": "bar"}` whereas `foo` alone results in + `{"foo": None}` + + Parameters: + dotenv_path: Absolute or relative path to the .env file. + stream: `StringIO` object with .env content, used if `dotenv_path` is `None`. + verbose: Whether to output a warning if the .env file is missing. + encoding: Encoding to be used to read the file. + + If both `dotenv_path` and `stream` are `None`, `find_dotenv()` is used to find the + .env file. + """ + if dotenv_path is None and stream is None: + dotenv_path = find_dotenv() + + return DotEnv( + dotenv_path=dotenv_path, + stream=stream, + verbose=verbose, + interpolate=interpolate, + override=True, + encoding=encoding, + ).dict() + + +def _is_file_or_fifo(path: StrPath) -> bool: + """ + Return True if `path` exists and is either a regular file or a FIFO. + """ + if os.path.isfile(path): + return True + + try: + st = os.stat(path) + except (FileNotFoundError, OSError): + return False + + return stat.S_ISFIFO(st.st_mode) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/parser.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/parser.py new file mode 100644 index 0000000..eb100b4 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/parser.py @@ -0,0 +1,182 @@ +import codecs +import re +from typing import ( + IO, + Iterator, + Match, + NamedTuple, + Optional, + Pattern, + Sequence, +) + + +def make_regex(string: str, extra_flags: int = 0) -> Pattern[str]: + return re.compile(string, re.UNICODE | extra_flags) + + +_newline = make_regex(r"(\r\n|\n|\r)") +_multiline_whitespace = make_regex(r"\s*", extra_flags=re.MULTILINE) +_whitespace = make_regex(r"[^\S\r\n]*") +_export = make_regex(r"(?:export[^\S\r\n]+)?") +_single_quoted_key = make_regex(r"'([^']+)'") +_unquoted_key = make_regex(r"([^=\#\s]+)") +_equal_sign = make_regex(r"(=[^\S\r\n]*)") +_single_quoted_value = make_regex(r"'((?:\\'|[^'])*)'") +_double_quoted_value = make_regex(r'"((?:\\"|[^"])*)"') +_unquoted_value = make_regex(r"([^\r\n]*)") +_comment = make_regex(r"(?:[^\S\r\n]*#[^\r\n]*)?") +_end_of_line = make_regex(r"[^\S\r\n]*(?:\r\n|\n|\r|$)") +_rest_of_line = make_regex(r"[^\r\n]*(?:\r|\n|\r\n)?") +_double_quote_escapes = make_regex(r"\\[\\'\"abfnrtv]") +_single_quote_escapes = make_regex(r"\\[\\']") + + +class Original(NamedTuple): + string: str + line: int + + +class Binding(NamedTuple): + key: Optional[str] + value: Optional[str] + original: Original + error: bool + + +class Position: + def __init__(self, chars: int, line: int) -> None: + self.chars = chars + self.line = line + + @classmethod + def start(cls) -> "Position": + return cls(chars=0, line=1) + + def set(self, other: "Position") -> None: + self.chars = other.chars + self.line = other.line + + def advance(self, string: str) -> None: + self.chars += len(string) + self.line += len(re.findall(_newline, string)) + + +class Error(Exception): + pass + + +class Reader: + def __init__(self, stream: IO[str]) -> None: + self.string = stream.read() + self.position = Position.start() + self.mark = Position.start() + + def has_next(self) -> bool: + return self.position.chars < len(self.string) + + def set_mark(self) -> None: + self.mark.set(self.position) + + def get_marked(self) -> Original: + return Original( + string=self.string[self.mark.chars : self.position.chars], + line=self.mark.line, + ) + + def peek(self, count: int) -> str: + return self.string[self.position.chars : self.position.chars + count] + + def read(self, count: int) -> str: + result = self.string[self.position.chars : self.position.chars + count] + if len(result) < count: + raise Error("read: End of string") + self.position.advance(result) + return result + + def read_regex(self, regex: Pattern[str]) -> Sequence[str]: + match = regex.match(self.string, self.position.chars) + if match is None: + raise Error("read_regex: Pattern not found") + self.position.advance(self.string[match.start() : match.end()]) + return match.groups() + + +def decode_escapes(regex: Pattern[str], string: str) -> str: + def decode_match(match: Match[str]) -> str: + return codecs.decode(match.group(0), "unicode-escape") # type: ignore + + return regex.sub(decode_match, string) + + +def parse_key(reader: Reader) -> Optional[str]: + char = reader.peek(1) + if char == "#": + return None + elif char == "'": + (key,) = reader.read_regex(_single_quoted_key) + else: + (key,) = reader.read_regex(_unquoted_key) + return key + + +def parse_unquoted_value(reader: Reader) -> str: + (part,) = reader.read_regex(_unquoted_value) + return re.sub(r"\s+#.*", "", part).rstrip() + + +def parse_value(reader: Reader) -> str: + char = reader.peek(1) + if char == "'": + (value,) = reader.read_regex(_single_quoted_value) + return decode_escapes(_single_quote_escapes, value) + elif char == '"': + (value,) = reader.read_regex(_double_quoted_value) + return decode_escapes(_double_quote_escapes, value) + elif char in ("", "\n", "\r"): + return "" + else: + return parse_unquoted_value(reader) + + +def parse_binding(reader: Reader) -> Binding: + reader.set_mark() + try: + reader.read_regex(_multiline_whitespace) + if not reader.has_next(): + return Binding( + key=None, + value=None, + original=reader.get_marked(), + error=False, + ) + reader.read_regex(_export) + key = parse_key(reader) + reader.read_regex(_whitespace) + if reader.peek(1) == "=": + reader.read_regex(_equal_sign) + value: Optional[str] = parse_value(reader) + else: + value = None + reader.read_regex(_comment) + reader.read_regex(_end_of_line) + return Binding( + key=key, + value=value, + original=reader.get_marked(), + error=False, + ) + except Error: + reader.read_regex(_rest_of_line) + return Binding( + key=None, + value=None, + original=reader.get_marked(), + error=True, + ) + + +def parse_stream(stream: IO[str]) -> Iterator[Binding]: + reader = Reader(stream) + while reader.has_next(): + yield parse_binding(reader) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/py.typed b/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/py.typed new file mode 100644 index 0000000..7632ecf --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/py.typed @@ -0,0 +1 @@ +# Marker file for PEP 561 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/variables.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/variables.py new file mode 100644 index 0000000..667f2f2 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/variables.py @@ -0,0 +1,86 @@ +import re +from abc import ABCMeta, abstractmethod +from typing import Iterator, Mapping, Optional, Pattern + +_posix_variable: Pattern[str] = re.compile( + r""" + \$\{ + (?P[^\}:]*) + (?::- + (?P[^\}]*) + )? + \} + """, + re.VERBOSE, +) + + +class Atom(metaclass=ABCMeta): + def __ne__(self, other: object) -> bool: + result = self.__eq__(other) + if result is NotImplemented: + return NotImplemented + return not result + + @abstractmethod + def resolve(self, env: Mapping[str, Optional[str]]) -> str: ... + + +class Literal(Atom): + def __init__(self, value: str) -> None: + self.value = value + + def __repr__(self) -> str: + return f"Literal(value={self.value})" + + def __eq__(self, other: object) -> bool: + if not isinstance(other, self.__class__): + return NotImplemented + return self.value == other.value + + def __hash__(self) -> int: + return hash((self.__class__, self.value)) + + def resolve(self, env: Mapping[str, Optional[str]]) -> str: + return self.value + + +class Variable(Atom): + def __init__(self, name: str, default: Optional[str]) -> None: + self.name = name + self.default = default + + def __repr__(self) -> str: + return f"Variable(name={self.name}, default={self.default})" + + def __eq__(self, other: object) -> bool: + if not isinstance(other, self.__class__): + return NotImplemented + return (self.name, self.default) == (other.name, other.default) + + def __hash__(self) -> int: + return hash((self.__class__, self.name, self.default)) + + def resolve(self, env: Mapping[str, Optional[str]]) -> str: + default = self.default if self.default is not None else "" + result = env.get(self.name, default) + return result if result is not None else "" + + +def parse_variables(value: str) -> Iterator[Atom]: + cursor = 0 + + for match in _posix_variable.finditer(value): + (start, end) = match.span() + name = match["name"] + default = match["default"] + + if start > cursor: + yield Literal(value=value[cursor:start]) + + yield Variable(name=name, default=default) + cursor = end + + length = len(value) + if cursor < length: + yield Literal(value=value[cursor:length]) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/version.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/version.py new file mode 100644 index 0000000..a955fda --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/dotenv/version.py @@ -0,0 +1 @@ +__version__ = "1.2.1" diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/INSTALLER b/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/METADATA b/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/METADATA new file mode 100644 index 0000000..30d6653 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/METADATA @@ -0,0 +1,672 @@ +Metadata-Version: 2.4 +Name: frozenlist +Version: 1.8.0 +Summary: A list-like structure which implements collections.abc.MutableSequence +Home-page: https://github.com/aio-libs/frozenlist +Maintainer: aiohttp team +Maintainer-email: team@aiohttp.org +License: Apache-2.0 +Project-URL: Chat: Matrix, https://matrix.to/#/#aio-libs:matrix.org +Project-URL: Chat: Matrix Space, https://matrix.to/#/#aio-libs-space:matrix.org +Project-URL: CI: Github Actions, https://github.com/aio-libs/frozenlist/actions +Project-URL: Code of Conduct, https://github.com/aio-libs/.github/blob/master/CODE_OF_CONDUCT.md +Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/frozenlist +Project-URL: Docs: Changelog, https://github.com/aio-libs/frozenlist/blob/master/CHANGES.rst#changelog +Project-URL: Docs: RTD, https://frozenlist.aio-libs.org +Project-URL: GitHub: issues, https://github.com/aio-libs/frozenlist/issues +Project-URL: GitHub: repo, https://github.com/aio-libs/frozenlist +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Operating System :: POSIX +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Operating System :: Microsoft :: Windows +Classifier: Programming Language :: Cython +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Python: >=3.9 +Description-Content-Type: text/x-rst +License-File: LICENSE +Dynamic: license-file + +frozenlist +========== + +.. image:: https://github.com/aio-libs/frozenlist/workflows/CI/badge.svg + :target: https://github.com/aio-libs/frozenlist/actions + :alt: GitHub status for master branch + +.. image:: https://codecov.io/gh/aio-libs/frozenlist/branch/master/graph/badge.svg?flag=pytest + :target: https://codecov.io/gh/aio-libs/frozenlist?flags[]=pytest + :alt: codecov.io status for master branch + +.. image:: https://img.shields.io/pypi/v/frozenlist.svg?logo=Python&logoColor=white + :target: https://pypi.org/project/frozenlist + :alt: frozenlist @ PyPI + +.. image:: https://readthedocs.org/projects/frozenlist/badge/?version=latest + :target: https://frozenlist.aio-libs.org + :alt: Read The Docs build status badge + +.. image:: https://img.shields.io/matrix/aio-libs:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat + :target: https://matrix.to/#/%23aio-libs:matrix.org + :alt: Matrix Room — #aio-libs:matrix.org + +.. image:: https://img.shields.io/matrix/aio-libs-space:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs-space%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat + :target: https://matrix.to/#/%23aio-libs-space:matrix.org + :alt: Matrix Space — #aio-libs-space:matrix.org + +Introduction +------------ + +``frozenlist.FrozenList`` is a list-like structure which implements +``collections.abc.MutableSequence``. The list is *mutable* until ``FrozenList.freeze`` +is called, after which list modifications raise ``RuntimeError``: + + +>>> from frozenlist import FrozenList +>>> fl = FrozenList([17, 42]) +>>> fl.append('spam') +>>> fl.append('Vikings') +>>> fl + +>>> fl.freeze() +>>> fl + +>>> fl.frozen +True +>>> fl.append("Monty") +Traceback (most recent call last): + File "", line 1, in + File "frozenlist/_frozenlist.pyx", line 97, in frozenlist._frozenlist.FrozenList.append + self._check_frozen() + File "frozenlist/_frozenlist.pyx", line 19, in frozenlist._frozenlist.FrozenList._check_frozen + raise RuntimeError("Cannot modify frozen list.") +RuntimeError: Cannot modify frozen list. + + +FrozenList is also hashable, but only when frozen. Otherwise it also throws a RuntimeError: + + +>>> fl = FrozenList([17, 42, 'spam']) +>>> hash(fl) +Traceback (most recent call last): + File "", line 1, in + File "frozenlist/_frozenlist.pyx", line 111, in frozenlist._frozenlist.FrozenList.__hash__ + raise RuntimeError("Cannot hash unfrozen list.") +RuntimeError: Cannot hash unfrozen list. +>>> fl.freeze() +>>> hash(fl) +3713081631934410656 +>>> dictionary = {fl: 'Vikings'} # frozen fl can be a dict key +>>> dictionary +{: 'Vikings'} + + +Installation +------------ + +:: + + $ pip install frozenlist + + +Documentation +------------- + +https://frozenlist.aio-libs.org + +Communication channels +---------------------- + +We have a *Matrix Space* `#aio-libs-space:matrix.org +`_ which is +also accessible via Gitter. + +License +------- + +``frozenlist`` is offered under the Apache 2 license. + +Source code +----------- + +The project is hosted on GitHub_ + +Please file an issue in the `bug tracker +`_ if you have found a bug +or have some suggestions to improve the library. + +.. _GitHub: https://github.com/aio-libs/frozenlist + +========= +Changelog +========= + +.. + You should *NOT* be adding new change log entries to this file, this + file is managed by towncrier. You *may* edit previous change logs to + fix problems like typo corrections or such. + To add a new change log entry, please see + https://pip.pypa.io/en/latest/development/contributing/#news-entries + we named the news folder "changes". + + WARNING: Don't drop the next directive! + +.. towncrier release notes start + +v1.8.0 +====== + +*(2025-10-05)* + + +Contributor-facing changes +-------------------------- + +- The ``reusable-cibuildwheel.yml`` workflow has been refactored to + be more generic and ``ci-cd.yml`` now holds all the configuration + toggles -- by `@webknjaz `__. + + *Related issues and pull requests on GitHub:* + `#668 `__. + +- When building wheels, the source distribution is now passed directly + to the ``cibuildwheel`` invocation -- by `@webknjaz `__. + + *Related issues and pull requests on GitHub:* + `#669 `__. + +- Builds and tests have been added to + ``ci-cd.yml`` for arm64 Windows wheels -- by `@finnagin `__. + + *Related issues and pull requests on GitHub:* + `#677 `__. + +- Started building wheels for CPython 3.14 -- by `@kumaraditya303 `__. + + *Related issues and pull requests on GitHub:* + `#681 `__, `#682 `__. + +- Removed ``--config-settings=pure-python=false`` from ``requirements/dev.txt``. + Developers on CPython still get accelerated builds by default. To explicitly build + a pure Python wheel, use ``pip install -e . --config-settings=pure-python=true`` + -- by `@bdraco `__. + + *Related issues and pull requests on GitHub:* + `#687 `__. + + +---- + + +v1.7.0 +====== + +*(2025-06-09)* + + +Features +-------- + +- Added deepcopy support to FrozenList -- by `@bdraco `__. + + *Related issues and pull requests on GitHub:* + `#659 `__. + + +Packaging updates and notes for downstreams +------------------------------------------- + +- Fixed an issue where ``frozenlist`` binary wheels would be built with debugging symbols and line tracing enabled, which significantly impacted performance. Line tracing is now disabled by default and can only be enabled explicitly -- by `@bdraco `__. + + This change ensures that production builds are optimized for performance. Developers who need line tracing for debugging purposes can still enable it by: + + 1. Setting the ``FROZENLIST_CYTHON_TRACING`` environment variable + 2. Using the ``--config-setting=with-cython-tracing=true`` option with pip + + *Related issues and pull requests on GitHub:* + `#660 `__. + +- Enabled ``PIP_CONSTRAINT`` environment variable in the build configuration to ensure the pinned Cython version from ``requirements/cython.txt`` is used during wheel builds. + + *Related issues and pull requests on GitHub:* + `#661 `__. + + +---- + + +v1.6.2 +====== + +*(2025-06-03)* + + +No significant changes. + + +---- + + +v1.6.1 +====== + +*(2025-06-02)* + + +Bug fixes +--------- + +- Correctly use ``cimport`` for including ``PyBool_FromLong`` -- by `@lysnikolaou `__. + + *Related issues and pull requests on GitHub:* + `#653 `__. + + +Packaging updates and notes for downstreams +------------------------------------------- + +- Exclude ``_frozenlist.cpp`` from bdists/wheels -- by `@musicinmybrain `__. + + *Related issues and pull requests on GitHub:* + `#649 `__. + +- Updated to use Cython 3.1 universally across the build path -- by `@lysnikolaou `__. + + *Related issues and pull requests on GitHub:* + `#654 `__. + + +---- + + +v1.6.0 +====== + +*(2025-04-17)* + + +Bug fixes +--------- + +- Stopped implicitly allowing the use of Cython pre-release versions when + building the distribution package -- by `@ajsanchezsanz `__ and + `@markgreene74 `__. + + *Related commits on GitHub:* + `41591f2 `__. + + +Features +-------- + +- Implemented support for the free-threaded build of CPython 3.13 -- by `@lysnikolaou `__. + + *Related issues and pull requests on GitHub:* + `#618 `__. + +- Started building armv7l wheels -- by `@bdraco `__. + + *Related issues and pull requests on GitHub:* + `#642 `__. + + +Packaging updates and notes for downstreams +------------------------------------------- + +- Stopped implicitly allowing the use of Cython pre-release versions when + building the distribution package -- by `@ajsanchezsanz `__ and + `@markgreene74 `__. + + *Related commits on GitHub:* + `41591f2 `__. + +- Started building wheels for the free-threaded build of CPython 3.13 -- by `@lysnikolaou `__. + + *Related issues and pull requests on GitHub:* + `#618 `__. + +- The packaging metadata switched to including an SPDX license identifier introduced in `PEP 639 `__ -- by `@cdce8p `__. + + *Related issues and pull requests on GitHub:* + `#639 `__. + + +Contributor-facing changes +-------------------------- + +- GitHub Actions CI/CD is now configured to manage caching pip-ecosystem + dependencies using `re-actors/cache-python-deps`_ -- an action by + `@webknjaz `__ that takes into account ABI stability and the exact + version of Python runtime. + + .. _`re-actors/cache-python-deps`: + https://github.com/marketplace/actions/cache-python-deps + + *Related issues and pull requests on GitHub:* + `#633 `__. + +- Organized dependencies into test and lint dependencies so that no + unnecessary ones are installed during CI runs -- by `@lysnikolaou `__. + + *Related issues and pull requests on GitHub:* + `#636 `__. + + +---- + + +1.5.0 (2024-10-22) +================== + +Bug fixes +--------- + +- An incorrect signature of the ``__class_getitem__`` class method + has been fixed, adding a missing ``class_item`` argument under + Python 3.8 and older. + + This change also improves the code coverage of this method that + was previously missing -- by `@webknjaz `__. + + + *Related issues and pull requests on GitHub:* + `#567 `__, `#571 `__. + + +Improved documentation +---------------------- + +- Rendered issue, PR, and commit links now lead to + ``frozenlist``'s repo instead of ``yarl``'s repo. + + + *Related issues and pull requests on GitHub:* + `#573 `__. + +- On the ``Contributing docs`` page, + a link to the ``Towncrier philosophy`` has been fixed. + + + *Related issues and pull requests on GitHub:* + `#574 `__. + + +Packaging updates and notes for downstreams +------------------------------------------- + +- A name of a temporary building directory now reflects + that it's related to ``frozenlist``, not ``yarl``. + + + *Related issues and pull requests on GitHub:* + `#573 `__. + +- Declared Python 3.13 supported officially in the distribution package metadata. + + + *Related issues and pull requests on GitHub:* + `#595 `__. + + +---- + + +1.4.1 (2023-12-15) +================== + +Packaging updates and notes for downstreams +------------------------------------------- + +- Declared Python 3.12 and PyPy 3.8-3.10 supported officially + in the distribution package metadata. + + + *Related issues and pull requests on GitHub:* + `#553 `__. + +- Replaced the packaging is replaced from an old-fashioned ``setup.py`` to an + in-tree `PEP 517 `__ build backend -- by `@webknjaz `__. + + Whenever the end-users or downstream packagers need to build ``frozenlist`` + from source (a Git checkout or an sdist), they may pass a ``config_settings`` + flag ``pure-python``. If this flag is not set, a C-extension will be built + and included into the distribution. + + Here is how this can be done with ``pip``: + + .. code-block:: console + + $ python3 -m pip install . --config-settings=pure-python= + + This will also work with ``-e | --editable``. + + The same can be achieved via ``pypa/build``: + + .. code-block:: console + + $ python3 -m build --config-setting=pure-python= + + Adding ``-w | --wheel`` can force ``pypa/build`` produce a wheel from source + directly, as opposed to building an ``sdist`` and then building from it. + + + *Related issues and pull requests on GitHub:* + `#560 `__. + + +Contributor-facing changes +-------------------------- + +- It is now possible to request line tracing in Cython builds using the + ``with-cython-tracing`` `PEP 517 `__ config setting + -- `@webknjaz `__. + + This can be used in CI and development environment to measure coverage + on Cython modules, but is not normally useful to the end-users or + downstream packagers. + + Here's a usage example: + + .. code-block:: console + + $ python3 -Im pip install . --config-settings=with-cython-tracing=true + + For editable installs, this setting is on by default. Otherwise, it's + off unless requested explicitly. + + The following produces C-files required for the Cython coverage + plugin to map the measurements back to the PYX-files: + + .. code-block:: console + + $ python -Im pip install -e . + + Alternatively, the ``FROZENLIST_CYTHON_TRACING=1`` environment variable + can be set to do the same as the `PEP 517 `__ config setting. + + + *Related issues and pull requests on GitHub:* + `#560 `__. + +- Coverage collection has been implemented for the Cython modules + -- by `@webknjaz `__. + + It will also be reported to Codecov from any non-release CI jobs. + + + *Related issues and pull requests on GitHub:* + `#561 `__. + +- A step-by-step ``Release Guide`` guide has + been added, describing how to release *frozenlist* -- by `@webknjaz `__. + + This is primarily targeting the maintainers. + + + *Related issues and pull requests on GitHub:* + `#563 `__. + +- Detailed ``Contributing Guidelines`` on + authoring the changelog fragments have been published in the + documentation -- by `@webknjaz `__. + + + *Related issues and pull requests on GitHub:* + `#564 `__. + + +---- + + +1.4.0 (2023-07-12) +================== + +The published source distribution package became buildable +under Python 3.12. + + +---- + + +Bugfixes +-------- + +- Removed an unused ``typing.Tuple`` import + `#411 `_ + + +Deprecations and Removals +------------------------- + +- Dropped Python 3.7 support. + `#413 `_ + + +Misc +---- + +- `#410 `_, `#433 `_ + + +---- + + +1.3.3 (2022-11-08) +================== + +- Fixed CI runs when creating a new release, where new towncrier versions + fail when the current version section is already present. + + +---- + + +1.3.2 (2022-11-08) +================== + +Misc +---- + +- Updated the CI runs to better check for test results and to avoid deprecated syntax. `#327 `_ + + +---- + + +1.3.1 (2022-08-02) +================== + +The published source distribution package became buildable +under Python 3.11. + + +---- + + +1.3.0 (2022-01-18) +================== + +Bugfixes +-------- + +- Do not install C sources with binary distributions. + `#250 `_ + + +Deprecations and Removals +------------------------- + +- Dropped Python 3.6 support + `#274 `_ + + +---- + + +1.2.0 (2021-10-16) +================== + +Features +-------- + +- ``FrozenList`` now supports being used as a generic type as per PEP 585, e.g. ``frozen_int_list: FrozenList[int]`` (requires Python 3.9 or newer). + `#172 `_ +- Added support for Python 3.10. + `#227 `_ +- Started shipping platform-specific wheels with the ``musl`` tag targeting typical Alpine Linux runtimes. + `#227 `_ +- Started shipping platform-specific arm64 wheels for Apple Silicon. + `#227 `_ + + +---- + + +1.1.1 (2020-11-14) +================== + +Bugfixes +-------- + +- Provide x86 Windows wheels. + `#169 `_ + + +---- + + +1.1.0 (2020-10-13) +================== + +Features +-------- + +- Add support for hashing of a frozen list. + `#136 `_ + +- Support Python 3.8 and 3.9. + +- Provide wheels for ``aarch64``, ``i686``, ``ppc64le``, ``s390x`` architectures on + Linux as well as ``x86_64``. + + +---- + + +1.0.0 (2019-11-09) +================== + +Deprecations and Removals +------------------------- + +- Dropped support for Python 3.5; only 3.6, 3.7 and 3.8 are supported going forward. + `#24 `_ diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/RECORD b/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/RECORD new file mode 100644 index 0000000..cdf56a0 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/RECORD @@ -0,0 +1,12 @@ +frozenlist-1.8.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +frozenlist-1.8.0.dist-info/METADATA,sha256=lGwi3J9-LHby1pjwCkMG2-Sagg4rPxoOIv5ShsvsNfE,20333 +frozenlist-1.8.0.dist-info/RECORD,, +frozenlist-1.8.0.dist-info/WHEEL,sha256=mX4U4odf6w47aVjwZUmTYd1MF9BbrhVLKlaWSvZwHEk,186 +frozenlist-1.8.0.dist-info/licenses/LICENSE,sha256=b9UkPpLdf5jsacesN3co50kFcJ_1J6W_mNbQJjwE9bY,11332 +frozenlist-1.8.0.dist-info/top_level.txt,sha256=jivtxsPXA3nK3WBWW2LW5Mtu_GHt8UZA13NeCs2cKuA,11 +frozenlist/__init__.py,sha256=xAIE2u9ncAbjATGIPfno_OJfe8AQ-1h7z_uc73dYsEA,2108 +frozenlist/__init__.pyi,sha256=vMEoES1xGegPtVXoCi9XydEeHsyuIq-KdeXwP5PdsaA,1470 +frozenlist/__pycache__/__init__.cpython-312.pyc,, +frozenlist/_frozenlist.cpython-312-x86_64-linux-gnu.so,sha256=UzFjN2uN24Tz86SdErp07aJh4LOp8A0w9EhxkDP4i3E,786872 +frozenlist/_frozenlist.pyx,sha256=t-aGjuEiVt_MZPBJ0RnraavVmPBK6arz3i48ZvXuYsU,3708 +frozenlist/py.typed,sha256=sow9soTwP9T_gEAQSVh7Gb8855h04Nwmhs2We-JRgZM,7 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/WHEEL b/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/WHEEL new file mode 100644 index 0000000..9921a02 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/WHEEL @@ -0,0 +1,7 @@ +Wheel-Version: 1.0 +Generator: setuptools (80.9.0) +Root-Is-Purelib: false +Tag: cp312-cp312-manylinux_2_5_x86_64 +Tag: cp312-cp312-manylinux1_x86_64 +Tag: cp312-cp312-manylinux_2_28_x86_64 + diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/licenses/LICENSE b/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/licenses/LICENSE new file mode 100644 index 0000000..7082a2d --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/licenses/LICENSE @@ -0,0 +1,201 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2013-2019 Nikolay Kim and Andrew Svetlov + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/top_level.txt b/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/top_level.txt new file mode 100644 index 0000000..52f13fc --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info/top_level.txt @@ -0,0 +1 @@ +frozenlist diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist/__init__.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist/__init__.py new file mode 100644 index 0000000..41c8595 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist/__init__.py @@ -0,0 +1,86 @@ +import os +import types +from collections.abc import MutableSequence +from functools import total_ordering + +__version__ = "1.8.0" + +__all__ = ("FrozenList", "PyFrozenList") # type: Tuple[str, ...] + + +NO_EXTENSIONS = bool(os.environ.get("FROZENLIST_NO_EXTENSIONS")) # type: bool + + +@total_ordering +class FrozenList(MutableSequence): + __slots__ = ("_frozen", "_items") + __class_getitem__ = classmethod(types.GenericAlias) + + def __init__(self, items=None): + self._frozen = False + if items is not None: + items = list(items) + else: + items = [] + self._items = items + + @property + def frozen(self): + return self._frozen + + def freeze(self): + self._frozen = True + + def __getitem__(self, index): + return self._items[index] + + def __setitem__(self, index, value): + if self._frozen: + raise RuntimeError("Cannot modify frozen list.") + self._items[index] = value + + def __delitem__(self, index): + if self._frozen: + raise RuntimeError("Cannot modify frozen list.") + del self._items[index] + + def __len__(self): + return self._items.__len__() + + def __iter__(self): + return self._items.__iter__() + + def __reversed__(self): + return self._items.__reversed__() + + def __eq__(self, other): + return list(self) == other + + def __le__(self, other): + return list(self) <= other + + def insert(self, pos, item): + if self._frozen: + raise RuntimeError("Cannot modify frozen list.") + self._items.insert(pos, item) + + def __repr__(self): + return f"" + + def __hash__(self): + if self._frozen: + return hash(tuple(self)) + else: + raise RuntimeError("Cannot hash unfrozen list.") + + +PyFrozenList = FrozenList + + +if not NO_EXTENSIONS: + try: + from ._frozenlist import FrozenList as CFrozenList # type: ignore + except ImportError: # pragma: no cover + pass + else: + FrozenList = CFrozenList # type: ignore diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist/__init__.pyi b/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist/__init__.pyi new file mode 100644 index 0000000..ae803ef --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist/__init__.pyi @@ -0,0 +1,47 @@ +from typing import ( + Generic, + Iterable, + Iterator, + List, + MutableSequence, + Optional, + TypeVar, + Union, + overload, +) + +_T = TypeVar("_T") +_Arg = Union[List[_T], Iterable[_T]] + +class FrozenList(MutableSequence[_T], Generic[_T]): + def __init__(self, items: Optional[_Arg[_T]] = None) -> None: ... + @property + def frozen(self) -> bool: ... + def freeze(self) -> None: ... + @overload + def __getitem__(self, i: int) -> _T: ... + @overload + def __getitem__(self, s: slice) -> FrozenList[_T]: ... + @overload + def __setitem__(self, i: int, o: _T) -> None: ... + @overload + def __setitem__(self, s: slice, o: Iterable[_T]) -> None: ... + @overload + def __delitem__(self, i: int) -> None: ... + @overload + def __delitem__(self, i: slice) -> None: ... + def __len__(self) -> int: ... + def __iter__(self) -> Iterator[_T]: ... + def __reversed__(self) -> Iterator[_T]: ... + def __eq__(self, other: object) -> bool: ... + def __le__(self, other: FrozenList[_T]) -> bool: ... + def __ne__(self, other: object) -> bool: ... + def __lt__(self, other: FrozenList[_T]) -> bool: ... + def __ge__(self, other: FrozenList[_T]) -> bool: ... + def __gt__(self, other: FrozenList[_T]) -> bool: ... + def insert(self, pos: int, item: _T) -> None: ... + def __repr__(self) -> str: ... + def __hash__(self) -> int: ... + +# types for C accelerators are the same +CFrozenList = PyFrozenList = FrozenList diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist/__pycache__/__init__.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ccc4d02db948a8c069c96aba377829efcb2df1b3 GIT binary patch literal 4059 zcmcInO>7&-6`uX0R^(EoBulbo#ik^xHj_q-ZNyD$$*ti^hGCZuEEz~PK^8Q3WKmx3 z(z7c&WLQ8gRKV&F?4SiCzzyJ>3c(lm)I%@ztw1kSg~HCp1`M>9+!(Qk!l%Bs%Rf<6 zfELICeEa6jo7p$tyg&Xe91aqA?);f%r({C@iG%tRs4>;Q0<%tZqH_jO{Wqs_Fy;+D zC#V94GQkjYk}3f&ssUY6yLdunN|yTS+cn=y15Lip>48U_&)45-h)O)UK=iIvqRUix zB-G|>OH_p_YM6%XU^mgb^`Oy{Q`87YXhc;CT!9-WG#V!itb3mnxI5%y;eB$4ON73{ z^{E8sMt-vFq^}!vj^0|PW`=^O$FZEWp;=6)ENk8hEBVx|UqDay03rvrE~eV_AlsOy9J%^bKk{$;sQ)yqz?%*OU2zvuK&8CQqD9+OYo3 zd^&RzbnK*mM*K=r)3RpP(X`2Y!IkTSVt@0FC+os~__mz{vO=B>jocM~tvm}w%b}6y z2M%rw{Pxn_nM#15{5PSBKn8~H&O94DjH4pW!os`HDO52_}vdN`3 zIS&zd^}w`^3u7z_)D8G&DE78k>WdDeCOXs#c^T=yS6VBT<--gkahDMYrDp`rwBKa` zkWbAs3{^G=r0vU;7HQj;QFIhFyMZ7=cy`7AY~$)-s`1$v4E8&Fi8}e;p{)>N<7@B2n*Yu5;p~s0t8vAID9^BnwAsGS$cM%5cBUX zhWayu%b99C=i}|r2cmS{w*v6G^r;TN5qm{8(%_RT^dmk7Y@(EaAj{^Z1 zLXmq@znpsBccgsu%y!>YS($qF+Spz3UT7_Jf9CJ<@ZQU70CO33_@9B<2bO67g`w-P z7!uEY(Mwv6rBkEh?Kb4EgT6fqr1P)^LQg&L9PyiW+Po$&LY^^>d*mAqqiVawWe-g^bRbn`bp|} zr2qbpe^uPL298jc$Npctpu*JLlf4O>vq>QB#u#*uF(^8N`X`WhwWBovFumcpiiK;x zkl8mucFY4yU9eT#1APPk2$6$_t7nOX=#@l<(e4LaAZyx`InX^|k#vQ;WxFEgi(ToF z;l=O5++TJU#5Ov5=hPu9m=B-I!&~z3#;J$mKRUTLHcuWNnBx6f+Nq>JfTkIWL+wPM z+ISxDy6~AaM-pPH*gw_u+~W&gH#S}5zZ)y^iL(r=YkOkBzJ<{|1aMod`oitXG>T@mM8$yv@D)W7@oz64M}ojoY{!dWoO zjst04bN|rqr49W-XuCgNR^tC^se>LAe)BPe=$h#q1cV#ZG^p6i7#uESpj*pnqc+nG zrPr_=8zw>-BW>F`3azIO_7?Kgc9jd%g#Q$ob4E68ySG^kdfRj=av^BVG$>!t^S68J$?U z_{G8Thci#(r?=v#w-0`=EDlt~fHYExl0eVbJSUA*1>h>k?F4FMY$qT{<2yk?I=U0& zqzRn(4wBcAjMs<&GMK%v|#`vUWfMI?Shs+%Pi9spb>P#yZ(y#0O0>w z*ur-$?6lm_`DUECp^Le^#T>uex&XSq)!1sklBfJzKg+Jc5YJ%$0!T&RIPOc*{UuRe zkT+hC_{*MwmC(!J@s+Nx1EhE0{?&E$Q+55LPd_Th&u$O=a69^=l`#BA;G_TM&v4WC zk5&o10AxN|K|!U&k?8P>0*mE=3NJ~cFXSIoWHLCq7OaFp_8(ZR4DAq33V$Ih@Odfx Y%EsLMBoa7xh&(wYof{RN#5kb;1<&+M`v3p{ literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist/_frozenlist.cpython-312-x86_64-linux-gnu.so b/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist/_frozenlist.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..915d941b5c61e6ed95953609c73074e6998e1169 GIT binary patch literal 786872 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

    MA= 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 + return list(self) > other + if op == 5: # => + return list(self) >= other + + def insert(self, pos, item): + self._check_frozen() + self._items.insert(pos, item) + + def __contains__(self, item): + return item in self._items + + def __iadd__(self, items): + self._check_frozen() + self._items += list(items) + return self + + def index(self, item): + return self._items.index(item) + + def remove(self, item): + self._check_frozen() + self._items.remove(item) + + def clear(self): + self._check_frozen() + self._items.clear() + + def extend(self, items): + self._check_frozen() + self._items += list(items) + + def reverse(self): + self._check_frozen() + self._items.reverse() + + def pop(self, index=-1): + self._check_frozen() + return self._items.pop(index) + + def append(self, item): + self._check_frozen() + return self._items.append(item) + + def count(self, item): + return self._items.count(item) + + def __repr__(self): + return ''.format(self._frozen.load(), + self._items) + + def __hash__(self): + if self._frozen.load(): + return hash(tuple(self._items)) + else: + raise RuntimeError("Cannot hash unfrozen list.") + + def __deepcopy__(self, memo): + cdef FrozenList new_list + obj_id = id(self) + + # Return existing copy if already processed (circular reference) + if obj_id in memo: + return memo[obj_id] + + # Create new instance and register immediately + new_list = self.__class__([]) + memo[obj_id] = new_list + + # Deep copy items + new_list._items[:] = [copy.deepcopy(item, memo) for item in self._items] + + # Preserve frozen state + if self._frozen.load(): + new_list.freeze() + + return new_list + + +MutableSequence.register(FrozenList) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist/py.typed b/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist/py.typed new file mode 100644 index 0000000..f5642f7 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/frozenlist/py.typed @@ -0,0 +1 @@ +Marker diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna-3.11.dist-info/INSTALLER b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna-3.11.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna-3.11.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna-3.11.dist-info/METADATA b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna-3.11.dist-info/METADATA new file mode 100644 index 0000000..7a4a4b7 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna-3.11.dist-info/METADATA @@ -0,0 +1,209 @@ +Metadata-Version: 2.4 +Name: idna +Version: 3.11 +Summary: Internationalized Domain Names in Applications (IDNA) +Author-email: Kim Davies +Requires-Python: >=3.8 +Description-Content-Type: text/x-rst +License-Expression: BSD-3-Clause +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: System Administrators +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.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 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Internet :: Name Service (DNS) +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Utilities +License-File: LICENSE.md +Requires-Dist: ruff >= 0.6.2 ; extra == "all" +Requires-Dist: mypy >= 1.11.2 ; extra == "all" +Requires-Dist: pytest >= 8.3.2 ; extra == "all" +Requires-Dist: flake8 >= 7.1.1 ; extra == "all" +Project-URL: Changelog, https://github.com/kjd/idna/blob/master/HISTORY.rst +Project-URL: Issue tracker, https://github.com/kjd/idna/issues +Project-URL: Source, https://github.com/kjd/idna +Provides-Extra: all + +Internationalized Domain Names in Applications (IDNA) +===================================================== + +Support for `Internationalized Domain Names in +Applications (IDNA) `_ +and `Unicode IDNA Compatibility Processing +`_. + +The latest versions of these standards supplied here provide +more comprehensive language coverage and reduce the potential of +allowing domains with known security vulnerabilities. This library +is a suitable replacement for the “encodings.idna” +module that comes with the Python standard library, but which +only supports an older superseded IDNA specification from 2003. + +Basic functions are simply executed: + +.. code-block:: pycon + + >>> import idna + >>> idna.encode('ドメイン.テスト') + b'xn--eckwd4c7c.xn--zckzah' + >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) + ドメイン.テスト + + +Installation +------------ + +This package is available for installation from PyPI via the +typical mechanisms, such as: + +.. code-block:: bash + + $ python3 -m pip install idna + + +Usage +----- + +For typical usage, the ``encode`` and ``decode`` functions will take a +domain name argument and perform a conversion to ASCII compatible encoding +(known as A-labels), or to Unicode strings (known as U-labels) +respectively. + +.. code-block:: pycon + + >>> import idna + >>> idna.encode('ドメイン.テスト') + b'xn--eckwd4c7c.xn--zckzah' + >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) + ドメイン.テスト + +Conversions can be applied at a per-label basis using the ``ulabel`` or +``alabel`` functions if necessary: + +.. code-block:: pycon + + >>> idna.alabel('测试') + b'xn--0zwm56d' + + +Compatibility Mapping (UTS #46) ++++++++++++++++++++++++++++++++ + +This library provides support for `Unicode IDNA Compatibility +Processing `_ which normalizes input from +different potential ways a user may input a domain prior to performing the IDNA +conversion operations. This functionality, known as a +`mapping `_, is considered by the +specification to be a local user-interface issue distinct from IDNA +conversion functionality. + +For example, “Königsgäßchen” is not a permissible label as *LATIN +CAPITAL LETTER K* is not allowed (nor are capital letters in general). +UTS 46 will convert this into lower case prior to applying the IDNA +conversion. + +.. code-block:: pycon + + >>> import idna + >>> idna.encode('Königsgäßchen') + ... + idna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed + >>> idna.encode('Königsgäßchen', uts46=True) + b'xn--knigsgchen-b4a3dun' + >>> print(idna.decode('xn--knigsgchen-b4a3dun')) + königsgäßchen + + +Exceptions +---------- + +All errors raised during the conversion following the specification +should raise an exception derived from the ``idna.IDNAError`` base +class. + +More specific exceptions that may be generated as ``idna.IDNABidiError`` +when the error reflects an illegal combination of left-to-right and +right-to-left characters in a label; ``idna.InvalidCodepoint`` when +a specific codepoint is an illegal character in an IDN label (i.e. +INVALID); and ``idna.InvalidCodepointContext`` when the codepoint is +illegal based on its position in the string (i.e. it is CONTEXTO or CONTEXTJ +but the contextual requirements are not satisfied.) + +Building and Diagnostics +------------------------ + +The IDNA and UTS 46 functionality relies upon pre-calculated lookup +tables for performance. These tables are derived from computing against +eligibility criteria in the respective standards using the command-line +script ``tools/idna-data``. + +This tool will fetch relevant codepoint data from the Unicode repository +and perform the required calculations to identify eligibility. There are +three main modes: + +* ``idna-data make-libdata``. Generates ``idnadata.py`` and + ``uts46data.py``, the pre-calculated lookup tables used for IDNA and + UTS 46 conversions. Implementers who wish to track this library against + a different Unicode version may use this tool to manually generate a + different version of the ``idnadata.py`` and ``uts46data.py`` files. + +* ``idna-data make-table``. Generate a table of the IDNA disposition + (e.g. PVALID, CONTEXTJ, CONTEXTO) in the format found in Appendix + B.1 of RFC 5892 and the pre-computed tables published by `IANA + `_. + +* ``idna-data U+0061``. Prints debugging output on the various + properties associated with an individual Unicode codepoint (in this + case, U+0061), that are used to assess the IDNA and UTS 46 status of a + codepoint. This is helpful in debugging or analysis. + +The tool accepts a number of arguments, described using ``idna-data +-h``. Most notably, the ``--version`` argument allows the specification +of the version of Unicode to be used in computing the table data. For +example, ``idna-data --version 9.0.0 make-libdata`` will generate +library data against Unicode 9.0.0. + + +Additional Notes +---------------- + +* **Packages**. The latest tagged release version is published in the + `Python Package Index `_. + +* **Version support**. This library supports Python 3.8 and higher. + As this library serves as a low-level toolkit for a variety of + applications, many of which strive for broad compatibility with older + Python versions, there is no rush to remove older interpreter support. + Support for older versions are likely to be removed from new releases + as automated tests can no longer easily be run, i.e. once the Python + version is officially end-of-life. + +* **Testing**. The library has a test suite based on each rule of the + IDNA specification, as well as tests that are provided as part of the + Unicode Technical Standard 46, `Unicode IDNA Compatibility Processing + `_. + +* **Emoji**. It is an occasional request to support emoji domains in + this library. Encoding of symbols like emoji is expressly prohibited by + the technical standard IDNA 2008 and emoji domains are broadly phased + out across the domain industry due to associated security risks. For + now, applications that need to support these non-compliant labels + may wish to consider trying the encode/decode operation in this library + first, and then falling back to using `encodings.idna`. See `the Github + project `_ for more discussion. + +* **Transitional processing**. Unicode 16.0.0 removed transitional + processing so the `transitional` argument for the encode() method + no longer has any effect and will be removed at a later date. + diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna-3.11.dist-info/RECORD b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna-3.11.dist-info/RECORD new file mode 100644 index 0000000..8525b6d --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna-3.11.dist-info/RECORD @@ -0,0 +1,22 @@ +idna-3.11.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +idna-3.11.dist-info/METADATA,sha256=fCwSww9SuiN8TIHllFSASUQCW55hAs8dzKnr9RaEEbA,8378 +idna-3.11.dist-info/RECORD,, +idna-3.11.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82 +idna-3.11.dist-info/licenses/LICENSE.md,sha256=t6M2q_OwThgOwGXN0W5wXQeeHMehT5EKpukYfza5zYc,1541 +idna/__init__.py,sha256=MPqNDLZbXqGaNdXxAFhiqFPKEQXju2jNQhCey6-5eJM,868 +idna/__pycache__/__init__.cpython-312.pyc,, +idna/__pycache__/codec.cpython-312.pyc,, +idna/__pycache__/compat.cpython-312.pyc,, +idna/__pycache__/core.cpython-312.pyc,, +idna/__pycache__/idnadata.cpython-312.pyc,, +idna/__pycache__/intranges.cpython-312.pyc,, +idna/__pycache__/package_data.cpython-312.pyc,, +idna/__pycache__/uts46data.cpython-312.pyc,, +idna/codec.py,sha256=M2SGWN7cs_6B32QmKTyTN6xQGZeYQgQ2wiX3_DR6loE,3438 +idna/compat.py,sha256=RzLy6QQCdl9784aFhb2EX9EKGCJjg0P3PilGdeXXcx8,316 +idna/core.py,sha256=P26_XVycuMTZ1R2mNK1ZREVzM5mvTzdabBXfyZVU1Lc,13246 +idna/idnadata.py,sha256=SG8jhaGE53iiD6B49pt2pwTv_UvClciWE-N54oR2p4U,79623 +idna/intranges.py,sha256=amUtkdhYcQG8Zr-CoMM_kVRacxkivC1WgxN1b63KKdU,1898 +idna/package_data.py,sha256=_CUavOxobnbyNG2FLyHoN8QHP3QM9W1tKuw7eq9QwBk,21 +idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +idna/uts46data.py,sha256=H9J35VkD0F9L9mKOqjeNGd2A-Va6FlPoz6Jz4K7h-ps,243725 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna-3.11.dist-info/WHEEL b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna-3.11.dist-info/WHEEL new file mode 100644 index 0000000..d8b9936 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna-3.11.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/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna-3.11.dist-info/licenses/LICENSE.md b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna-3.11.dist-info/licenses/LICENSE.md new file mode 100644 index 0000000..256ba90 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna-3.11.dist-info/licenses/LICENSE.md @@ -0,0 +1,31 @@ +BSD 3-Clause License + +Copyright (c) 2013-2025, Kim Davies and contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__init__.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__init__.py new file mode 100644 index 0000000..cfdc030 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__init__.py @@ -0,0 +1,45 @@ +from .core import ( + IDNABidiError, + IDNAError, + InvalidCodepoint, + InvalidCodepointContext, + alabel, + check_bidi, + check_hyphen_ok, + check_initial_combiner, + check_label, + check_nfc, + decode, + encode, + ulabel, + uts46_remap, + valid_contextj, + valid_contexto, + valid_label_length, + valid_string_length, +) +from .intranges import intranges_contain +from .package_data import __version__ + +__all__ = [ + "__version__", + "IDNABidiError", + "IDNAError", + "InvalidCodepoint", + "InvalidCodepointContext", + "alabel", + "check_bidi", + "check_hyphen_ok", + "check_initial_combiner", + "check_label", + "check_nfc", + "decode", + "encode", + "intranges_contain", + "ulabel", + "uts46_remap", + "valid_contextj", + "valid_contexto", + "valid_label_length", + "valid_string_length", +] diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__pycache__/__init__.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7dc57dbd6534ae81d153976462f874dbfff9ab15 GIT binary patch literal 874 zcmbu7JCD;q5XX0&#CbT*`*IYB4v7>Oi-)KX5*!rQ9Q`({jlINs*@v~>1XA)T=;`o&Ih!Z;LDt7HaaY!_5@$<~s^Pd^devacFaOce@%CZIkU%m7D1P9~NIO9FY zKn6Jw5J3^3Kr~Q8G*MHuP)md;6m8TN9n=wB)D=C{6A_9;AN56yVlhAiF+@W#LL)Io zV=+M!==B0V6*Dxe>;^v)b2Nuw4YKA3h>rKIMfeT6(u;|W&t9BAd(JZUQfsAc*Sobj zI+HuXS$3*2S|}!sJ-!(^RnpM6#)gEG73H><<}}^lm6Nl>+RpbyP9;_wJFf#wGQ$YR zsS+zDskTuauNAtrBVVUB%xLOL+mOooxvf8mwx)da7;7p>VFy)L$8JPT?XP9(|A4W8iV*G4vRDj6EhEQ;(U$`Qnysrb^TQs`Jkhw)N`%~-^TL9;d=u@coj@xa0ULx&wBta RzJR+wnnzLauB~soj9 literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__pycache__/codec.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__pycache__/codec.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86ed9772f593c2043659d736d17c7637442204c3 GIT binary patch literal 4974 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 literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__pycache__/compat.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__pycache__/compat.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a04a8b2162f0a4859262d911bad421ba7b68765 GIT binary patch literal 878 zcmb7CJ#P~+7`E>#m!#n<0<}Uxw=kS&bEQ=!hJq9ULnLw%YP)0rU1GOAdUrnAPSGI- zgxFZJH6v@p!p=`%31T}TF)*NRk;2r8*O#VZ1WSHD{MfG_Kd-;kY83?IgESTG}^=_0H(pkZZI=%lq02 zoCm}Lqy$KX*c20!lp(J`Ud_sG^;BKvYPsG@vfSKDLYABYA+=-?+Gm937EKCoMnR88 zxy7j*@T9MHErt$(nzLmvCrDmkuhGZzcn6KK?_yqp9b?RGa6&=OS;sqMG4*5+z6d?Z zSR}mQNIVY?Xd=DlF-?xWDC~J@CJ$M%*}S{qiBQtDH0U3}9^r)~3A{dw(?B-UEHCY{ z*3QFrn_q(J7R=cam^bKq_3H5U`}-4Pc?LQ9fBw7*$KVC3CRa7*{CN$+yu8amJf#!A z2D$1kzpTs^g<|3V+kFHt^m>b3&40Dpe&n~DjrH|=4q;R{36su1hEXV}lLRqMIZd6E zGs*faa&cbwnQX^tL}L(-lE<7g4wUOa;%~P0;w--bh!RRD10q!#lUq-|RXP)+Q&4x8 za!Y1um>h7`V6HxAZuA+aa~)JWb6rTDo4rg@QK+7mRUB|0WQ7{VE#tWsgzP@e4Uq3*(jH<`jV&ZOxRM+G=TUwDrNA+`RMk`f34ws$YOU Q9_nh%$0Or+;fpu?0U8g&+yDRo literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__pycache__/core.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__pycache__/core.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3be515c5474d3e8ddcee2c8554e5fee73986c0f GIT binary patch literal 16186 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 EKe#BGl>h($ literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__pycache__/intranges.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__pycache__/intranges.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4cfc8ed4cef0ab3905567e18dfbdb1d8037ee19 GIT binary patch literal 2626 zcmZuyO>7&-6`uX0Xi}6!36|uaS|iI1vos>st+m{x zXP1$wQi)phAhiZ6paIO>=tBV+zA!ffx#Sq27s)bEVqvt0-$Yo_#DXX)p zL@bplOgjK}mc~@3S+SywTv4_9{-VyttT@Q_!KX2;7_$-}>$8%A2Wyb^touO|w^E=P zc-arE+Xw3gL7S+_`jEL#A|!F%{*1ZQq>k+e)GJck4OoeBKSRr=#b~vH!s$7$!irVL zsp(+qmrci^Znb=ianw4VTcW(``UzkPp6jzhH2}9S`6_tjN;P1xn6nCJK63*zuss)- z2Xl-TJzh>sPy2z%gX0;>T=@blmg%O5J>NnU`JOckGk}dR3b~VB`qldT8a^9J*qDC?0WNA z^63pimejgx$%|n2OSbbeA$+(l)l~!s&XKJEj=Ts^oSy~@>E3IgQzBi@<{(+p>N0}# z)e-FLN$Q%V2+x`&b$x>B5$uYi7pX+*>XLHr_bLgJkp^Osd)li+SIt9^ge$$B&qe!u`GsqX<)>}*0fyCTAiT)73$Viq33 zx80Jni}fyO>C6nxpP+U01tGd#fVKgG%FhaK&tJfJjzHm`3uT!bkDk_1~Ckxmny^cY7lg~@24ff)v@iZH{3V*+#+xE-)ivcpuN$~lx><3}>r`JaRc6vh{--bX*s0na{3fw}WTLdU4 zNQ?3x2I4-cLtkG6zAi07c|iflm!4D5JOql51HrMFd|X8--;aWU-tQ=C((qd*ZP@+F z>V-yrGkIh~J;KL88cKXmmLw<}swuZt|nyZ!LC3Wl!?=v?xStpZ(4nm-E(n+$e3SGTu8x5KnP!t=oR z1k$^tLXT7H5Y=6I{vfQ<>YC`8a!rA*rM%SXcKWZ-kL~sT3w~qhH|nl6rKalI;_0(2 zV7zR*&;W|`CZ^;jEyDBYV(*aSD@2dl(ZK4uEb8-_qznBFZ)c%z}( zU9N-8>+t!1g5NUvA$72EvYFmWO)Z~$mKgeX;_znTaN|bv##SP;e5Mm4@#MdkUq4Asv`5A|3hAd}&AqEoPk(sQH~wsR zq8V%Y50YEMnbkg6WQs+9odNT9a!9~RPlkPlVR;3^;8+%L$XW$DEJsXngi5I3K@go$ z0U=;R^%nFkaUKD4;Yu9)r}#|Sv#JhzpJ%}kapJGQucJtk^gmgX)a?Nx4g8lJ>BL5) z1C5}0=BrwV0J(m>m4B?X-hF6nBiqSH(nMpVLttv=#k8K^My?Z=q|Dk?6lEIMoB4I6 m`R-S+2-r@1P)aw>bO=oA``7)}nf1F5Cj|TW+K(s|k^T(2&7PY8 literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__pycache__/package_data.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__pycache__/package_data.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ccccbb86bb2d2ada2d3fb745ffc210151181708f GIT binary patch literal 205 zcmX@j%ge<81m(L^Gev>)V-N=h7@>^M96-i&h7^VE zFQ_cZ$j<{BWTao5S(2(-keHkeR8y>u*uC&Da}c>D`ErM Y0diL{$k`v585tRG@QE~X7qI}j0I7mEVgLXD literal 0 HcmV?d00001 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__pycache__/uts46data.cpython-312.pyc b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/__pycache__/uts46data.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e68ee09813794992db5eb9f32dbc714a6520d15 GIT binary patch literal 161833 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 Tuple[bytes, int]: + if errors != "strict": + raise IDNAError('Unsupported error handling "{}"'.format(errors)) + + if not data: + return b"", 0 + + return encode(data), len(data) + + def decode(self, data: bytes, errors: str = "strict") -> Tuple[str, int]: + if errors != "strict": + raise IDNAError('Unsupported error handling "{}"'.format(errors)) + + if not data: + return "", 0 + + return decode(data), len(data) + + +class IncrementalEncoder(codecs.BufferedIncrementalEncoder): + def _buffer_encode(self, data: str, errors: str, final: bool) -> Tuple[bytes, int]: + if errors != "strict": + raise IDNAError('Unsupported error handling "{}"'.format(errors)) + + if not data: + return b"", 0 + + labels = _unicode_dots_re.split(data) + trailing_dot = b"" + if labels: + if not labels[-1]: + trailing_dot = b"." + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = b"." + + result = [] + size = 0 + for label in labels: + result.append(alabel(label)) + if size: + size += 1 + size += len(label) + + # Join with U+002E + result_bytes = b".".join(result) + trailing_dot + size += len(trailing_dot) + return result_bytes, size + + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def _buffer_decode(self, data: Any, errors: str, final: bool) -> Tuple[str, int]: + if errors != "strict": + raise IDNAError('Unsupported error handling "{}"'.format(errors)) + + if not data: + return ("", 0) + + if not isinstance(data, str): + data = str(data, "ascii") + + labels = _unicode_dots_re.split(data) + trailing_dot = "" + if labels: + if not labels[-1]: + trailing_dot = "." + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = "." + + result = [] + size = 0 + for label in labels: + result.append(ulabel(label)) + if size: + size += 1 + size += len(label) + + result_str = ".".join(result) + trailing_dot + size += len(trailing_dot) + return (result_str, size) + + +class StreamWriter(Codec, codecs.StreamWriter): + pass + + +class StreamReader(Codec, codecs.StreamReader): + pass + + +def search_function(name: str) -> Optional[codecs.CodecInfo]: + if name != "idna2008": + return None + return codecs.CodecInfo( + name=name, + encode=Codec().encode, + decode=Codec().decode, # type: ignore + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) + + +codecs.register(search_function) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/compat.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/compat.py new file mode 100644 index 0000000..1df9f2a --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/compat.py @@ -0,0 +1,15 @@ +from typing import Any, Union + +from .core import decode, encode + + +def ToASCII(label: str) -> bytes: + return encode(label) + + +def ToUnicode(label: Union[bytes, bytearray]) -> str: + return decode(label) + + +def nameprep(s: Any) -> None: + raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol") diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/core.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/core.py new file mode 100644 index 0000000..8177bf7 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/core.py @@ -0,0 +1,437 @@ +import bisect +import re +import unicodedata +from typing import Optional, Union + +from . import idnadata +from .intranges import intranges_contain + +_virama_combining_class = 9 +_alabel_prefix = b"xn--" +_unicode_dots_re = re.compile("[\u002e\u3002\uff0e\uff61]") + + +class IDNAError(UnicodeError): + """Base exception for all IDNA-encoding related problems""" + + pass + + +class IDNABidiError(IDNAError): + """Exception when bidirectional requirements are not satisfied""" + + pass + + +class InvalidCodepoint(IDNAError): + """Exception when a disallowed or unallocated codepoint is used""" + + pass + + +class InvalidCodepointContext(IDNAError): + """Exception when the codepoint is not valid in the context it is used""" + + pass + + +def _combining_class(cp: int) -> int: + v = unicodedata.combining(chr(cp)) + if v == 0: + if not unicodedata.name(chr(cp)): + raise ValueError("Unknown character in unicodedata") + return v + + +def _is_script(cp: str, script: str) -> bool: + return intranges_contain(ord(cp), idnadata.scripts[script]) + + +def _punycode(s: str) -> bytes: + return s.encode("punycode") + + +def _unot(s: int) -> str: + return "U+{:04X}".format(s) + + +def valid_label_length(label: Union[bytes, str]) -> bool: + if len(label) > 63: + return False + return True + + +def valid_string_length(label: Union[bytes, str], trailing_dot: bool) -> bool: + if len(label) > (254 if trailing_dot else 253): + return False + return True + + +def check_bidi(label: str, check_ltr: bool = False) -> bool: + # Bidi rules should only be applied if string contains RTL characters + bidi_label = False + for idx, cp in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + if direction == "": + # String likely comes from a newer version of Unicode + raise IDNABidiError("Unknown directionality in label {} at position {}".format(repr(label), idx)) + if direction in ["R", "AL", "AN"]: + bidi_label = True + if not bidi_label and not check_ltr: + return True + + # Bidi rule 1 + direction = unicodedata.bidirectional(label[0]) + if direction in ["R", "AL"]: + rtl = True + elif direction == "L": + rtl = False + else: + raise IDNABidiError("First codepoint in label {} must be directionality L, R or AL".format(repr(label))) + + valid_ending = False + number_type: Optional[str] = None + for idx, cp in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + + if rtl: + # Bidi rule 2 + if direction not in [ + "R", + "AL", + "AN", + "EN", + "ES", + "CS", + "ET", + "ON", + "BN", + "NSM", + ]: + raise IDNABidiError("Invalid direction for codepoint at position {} in a right-to-left label".format(idx)) + # Bidi rule 3 + if direction in ["R", "AL", "EN", "AN"]: + valid_ending = True + elif direction != "NSM": + valid_ending = False + # Bidi rule 4 + if direction in ["AN", "EN"]: + if not number_type: + number_type = direction + else: + if number_type != direction: + raise IDNABidiError("Can not mix numeral types in a right-to-left label") + else: + # Bidi rule 5 + if direction not in ["L", "EN", "ES", "CS", "ET", "ON", "BN", "NSM"]: + raise IDNABidiError("Invalid direction for codepoint at position {} in a left-to-right label".format(idx)) + # Bidi rule 6 + if direction in ["L", "EN"]: + valid_ending = True + elif direction != "NSM": + valid_ending = False + + if not valid_ending: + raise IDNABidiError("Label ends with illegal codepoint directionality") + + return True + + +def check_initial_combiner(label: str) -> bool: + if unicodedata.category(label[0])[0] == "M": + raise IDNAError("Label begins with an illegal combining character") + return True + + +def check_hyphen_ok(label: str) -> bool: + if label[2:4] == "--": + raise IDNAError("Label has disallowed hyphens in 3rd and 4th position") + if label[0] == "-" or label[-1] == "-": + raise IDNAError("Label must not start or end with a hyphen") + return True + + +def check_nfc(label: str) -> None: + if unicodedata.normalize("NFC", label) != label: + raise IDNAError("Label must be in Normalization Form C") + + +def valid_contextj(label: str, pos: int) -> bool: + cp_value = ord(label[pos]) + + if cp_value == 0x200C: + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + + ok = False + for i in range(pos - 1, -1, -1): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord("T"): + continue + elif joining_type in [ord("L"), ord("D")]: + ok = True + break + else: + break + + if not ok: + return False + + ok = False + for i in range(pos + 1, len(label)): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord("T"): + continue + elif joining_type in [ord("R"), ord("D")]: + ok = True + break + else: + break + return ok + + if cp_value == 0x200D: + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + return False + + else: + return False + + +def valid_contexto(label: str, pos: int, exception: bool = False) -> bool: + cp_value = ord(label[pos]) + + if cp_value == 0x00B7: + if 0 < pos < len(label) - 1: + if ord(label[pos - 1]) == 0x006C and ord(label[pos + 1]) == 0x006C: + return True + return False + + elif cp_value == 0x0375: + if pos < len(label) - 1 and len(label) > 1: + return _is_script(label[pos + 1], "Greek") + return False + + elif cp_value == 0x05F3 or cp_value == 0x05F4: + if pos > 0: + return _is_script(label[pos - 1], "Hebrew") + return False + + elif cp_value == 0x30FB: + for cp in label: + if cp == "\u30fb": + continue + if _is_script(cp, "Hiragana") or _is_script(cp, "Katakana") or _is_script(cp, "Han"): + return True + return False + + elif 0x660 <= cp_value <= 0x669: + for cp in label: + if 0x6F0 <= ord(cp) <= 0x06F9: + return False + return True + + elif 0x6F0 <= cp_value <= 0x6F9: + for cp in label: + if 0x660 <= ord(cp) <= 0x0669: + return False + return True + + return False + + +def check_label(label: Union[str, bytes, bytearray]) -> None: + if isinstance(label, (bytes, bytearray)): + label = label.decode("utf-8") + if len(label) == 0: + raise IDNAError("Empty Label") + + check_nfc(label) + check_hyphen_ok(label) + check_initial_combiner(label) + + for pos, cp in enumerate(label): + cp_value = ord(cp) + if intranges_contain(cp_value, idnadata.codepoint_classes["PVALID"]): + continue + elif intranges_contain(cp_value, idnadata.codepoint_classes["CONTEXTJ"]): + try: + if not valid_contextj(label, pos): + raise InvalidCodepointContext( + "Joiner {} not allowed at position {} in {}".format(_unot(cp_value), pos + 1, repr(label)) + ) + except ValueError: + raise IDNAError( + "Unknown codepoint adjacent to joiner {} at position {} in {}".format( + _unot(cp_value), pos + 1, repr(label) + ) + ) + elif intranges_contain(cp_value, idnadata.codepoint_classes["CONTEXTO"]): + if not valid_contexto(label, pos): + raise InvalidCodepointContext( + "Codepoint {} not allowed at position {} in {}".format(_unot(cp_value), pos + 1, repr(label)) + ) + else: + raise InvalidCodepoint( + "Codepoint {} at position {} of {} not allowed".format(_unot(cp_value), pos + 1, repr(label)) + ) + + check_bidi(label) + + +def alabel(label: str) -> bytes: + try: + label_bytes = label.encode("ascii") + ulabel(label_bytes) + if not valid_label_length(label_bytes): + raise IDNAError("Label too long") + return label_bytes + except UnicodeEncodeError: + pass + + check_label(label) + label_bytes = _alabel_prefix + _punycode(label) + + if not valid_label_length(label_bytes): + raise IDNAError("Label too long") + + return label_bytes + + +def ulabel(label: Union[str, bytes, bytearray]) -> str: + if not isinstance(label, (bytes, bytearray)): + try: + label_bytes = label.encode("ascii") + except UnicodeEncodeError: + check_label(label) + return label + else: + label_bytes = bytes(label) + + label_bytes = label_bytes.lower() + if label_bytes.startswith(_alabel_prefix): + label_bytes = label_bytes[len(_alabel_prefix) :] + if not label_bytes: + raise IDNAError("Malformed A-label, no Punycode eligible content found") + if label_bytes.decode("ascii")[-1] == "-": + raise IDNAError("A-label must not end with a hyphen") + else: + check_label(label_bytes) + return label_bytes.decode("ascii") + + try: + label = label_bytes.decode("punycode") + except UnicodeError: + raise IDNAError("Invalid A-label") + check_label(label) + return label + + +def uts46_remap(domain: str, std3_rules: bool = True, transitional: bool = False) -> str: + """Re-map the characters in the string according to UTS46 processing.""" + from .uts46data import uts46data + + output = "" + + for pos, char in enumerate(domain): + code_point = ord(char) + try: + uts46row = uts46data[code_point if code_point < 256 else bisect.bisect_left(uts46data, (code_point, "Z")) - 1] + status = uts46row[1] + replacement: Optional[str] = None + if len(uts46row) == 3: + replacement = uts46row[2] + if ( + status == "V" + or (status == "D" and not transitional) + or (status == "3" and not std3_rules and replacement is None) + ): + output += char + elif replacement is not None and ( + status == "M" or (status == "3" and not std3_rules) or (status == "D" and transitional) + ): + output += replacement + elif status != "I": + raise IndexError() + except IndexError: + raise InvalidCodepoint( + "Codepoint {} not allowed at position {} in {}".format(_unot(code_point), pos + 1, repr(domain)) + ) + + return unicodedata.normalize("NFC", output) + + +def encode( + s: Union[str, bytes, bytearray], + strict: bool = False, + uts46: bool = False, + std3_rules: bool = False, + transitional: bool = False, +) -> bytes: + if not isinstance(s, str): + try: + s = str(s, "ascii") + except UnicodeDecodeError: + raise IDNAError("should pass a unicode string to the function rather than a byte string.") + if uts46: + s = uts46_remap(s, std3_rules, transitional) + trailing_dot = False + result = [] + if strict: + labels = s.split(".") + else: + labels = _unicode_dots_re.split(s) + if not labels or labels == [""]: + raise IDNAError("Empty domain") + if labels[-1] == "": + del labels[-1] + trailing_dot = True + for label in labels: + s = alabel(label) + if s: + result.append(s) + else: + raise IDNAError("Empty label") + if trailing_dot: + result.append(b"") + s = b".".join(result) + if not valid_string_length(s, trailing_dot): + raise IDNAError("Domain too long") + return s + + +def decode( + s: Union[str, bytes, bytearray], + strict: bool = False, + uts46: bool = False, + std3_rules: bool = False, +) -> str: + try: + if not isinstance(s, str): + s = str(s, "ascii") + except UnicodeDecodeError: + raise IDNAError("Invalid ASCII in A-label") + if uts46: + s = uts46_remap(s, std3_rules, False) + trailing_dot = False + result = [] + if not strict: + labels = _unicode_dots_re.split(s) + else: + labels = s.split(".") + if not labels or labels == [""]: + raise IDNAError("Empty domain") + if not labels[-1]: + del labels[-1] + trailing_dot = True + for label in labels: + s = ulabel(label) + if s: + result.append(s) + else: + raise IDNAError("Empty label") + if trailing_dot: + result.append("") + return ".".join(result) diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/idnadata.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/idnadata.py new file mode 100644 index 0000000..ded47ca --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/idnadata.py @@ -0,0 +1,4309 @@ +# This file is automatically generated by tools/idna-data + +__version__ = "16.0.0" + +scripts = { + "Greek": ( + 0x37000000374, + 0x37500000378, + 0x37A0000037E, + 0x37F00000380, + 0x38400000385, + 0x38600000387, + 0x3880000038B, + 0x38C0000038D, + 0x38E000003A2, + 0x3A3000003E2, + 0x3F000000400, + 0x1D2600001D2B, + 0x1D5D00001D62, + 0x1D6600001D6B, + 0x1DBF00001DC0, + 0x1F0000001F16, + 0x1F1800001F1E, + 0x1F2000001F46, + 0x1F4800001F4E, + 0x1F5000001F58, + 0x1F5900001F5A, + 0x1F5B00001F5C, + 0x1F5D00001F5E, + 0x1F5F00001F7E, + 0x1F8000001FB5, + 0x1FB600001FC5, + 0x1FC600001FD4, + 0x1FD600001FDC, + 0x1FDD00001FF0, + 0x1FF200001FF5, + 0x1FF600001FFF, + 0x212600002127, + 0xAB650000AB66, + 0x101400001018F, + 0x101A0000101A1, + 0x1D2000001D246, + ), + "Han": ( + 0x2E8000002E9A, + 0x2E9B00002EF4, + 0x2F0000002FD6, + 0x300500003006, + 0x300700003008, + 0x30210000302A, + 0x30380000303C, + 0x340000004DC0, + 0x4E000000A000, + 0xF9000000FA6E, + 0xFA700000FADA, + 0x16FE200016FE4, + 0x16FF000016FF2, + 0x200000002A6E0, + 0x2A7000002B73A, + 0x2B7400002B81E, + 0x2B8200002CEA2, + 0x2CEB00002EBE1, + 0x2EBF00002EE5E, + 0x2F8000002FA1E, + 0x300000003134B, + 0x31350000323B0, + ), + "Hebrew": ( + 0x591000005C8, + 0x5D0000005EB, + 0x5EF000005F5, + 0xFB1D0000FB37, + 0xFB380000FB3D, + 0xFB3E0000FB3F, + 0xFB400000FB42, + 0xFB430000FB45, + 0xFB460000FB50, + ), + "Hiragana": ( + 0x304100003097, + 0x309D000030A0, + 0x1B0010001B120, + 0x1B1320001B133, + 0x1B1500001B153, + 0x1F2000001F201, + ), + "Katakana": ( + 0x30A1000030FB, + 0x30FD00003100, + 0x31F000003200, + 0x32D0000032FF, + 0x330000003358, + 0xFF660000FF70, + 0xFF710000FF9E, + 0x1AFF00001AFF4, + 0x1AFF50001AFFC, + 0x1AFFD0001AFFF, + 0x1B0000001B001, + 0x1B1200001B123, + 0x1B1550001B156, + 0x1B1640001B168, + ), +} +joining_types = { + 0xAD: 84, + 0x300: 84, + 0x301: 84, + 0x302: 84, + 0x303: 84, + 0x304: 84, + 0x305: 84, + 0x306: 84, + 0x307: 84, + 0x308: 84, + 0x309: 84, + 0x30A: 84, + 0x30B: 84, + 0x30C: 84, + 0x30D: 84, + 0x30E: 84, + 0x30F: 84, + 0x310: 84, + 0x311: 84, + 0x312: 84, + 0x313: 84, + 0x314: 84, + 0x315: 84, + 0x316: 84, + 0x317: 84, + 0x318: 84, + 0x319: 84, + 0x31A: 84, + 0x31B: 84, + 0x31C: 84, + 0x31D: 84, + 0x31E: 84, + 0x31F: 84, + 0x320: 84, + 0x321: 84, + 0x322: 84, + 0x323: 84, + 0x324: 84, + 0x325: 84, + 0x326: 84, + 0x327: 84, + 0x328: 84, + 0x329: 84, + 0x32A: 84, + 0x32B: 84, + 0x32C: 84, + 0x32D: 84, + 0x32E: 84, + 0x32F: 84, + 0x330: 84, + 0x331: 84, + 0x332: 84, + 0x333: 84, + 0x334: 84, + 0x335: 84, + 0x336: 84, + 0x337: 84, + 0x338: 84, + 0x339: 84, + 0x33A: 84, + 0x33B: 84, + 0x33C: 84, + 0x33D: 84, + 0x33E: 84, + 0x33F: 84, + 0x340: 84, + 0x341: 84, + 0x342: 84, + 0x343: 84, + 0x344: 84, + 0x345: 84, + 0x346: 84, + 0x347: 84, + 0x348: 84, + 0x349: 84, + 0x34A: 84, + 0x34B: 84, + 0x34C: 84, + 0x34D: 84, + 0x34E: 84, + 0x34F: 84, + 0x350: 84, + 0x351: 84, + 0x352: 84, + 0x353: 84, + 0x354: 84, + 0x355: 84, + 0x356: 84, + 0x357: 84, + 0x358: 84, + 0x359: 84, + 0x35A: 84, + 0x35B: 84, + 0x35C: 84, + 0x35D: 84, + 0x35E: 84, + 0x35F: 84, + 0x360: 84, + 0x361: 84, + 0x362: 84, + 0x363: 84, + 0x364: 84, + 0x365: 84, + 0x366: 84, + 0x367: 84, + 0x368: 84, + 0x369: 84, + 0x36A: 84, + 0x36B: 84, + 0x36C: 84, + 0x36D: 84, + 0x36E: 84, + 0x36F: 84, + 0x483: 84, + 0x484: 84, + 0x485: 84, + 0x486: 84, + 0x487: 84, + 0x488: 84, + 0x489: 84, + 0x591: 84, + 0x592: 84, + 0x593: 84, + 0x594: 84, + 0x595: 84, + 0x596: 84, + 0x597: 84, + 0x598: 84, + 0x599: 84, + 0x59A: 84, + 0x59B: 84, + 0x59C: 84, + 0x59D: 84, + 0x59E: 84, + 0x59F: 84, + 0x5A0: 84, + 0x5A1: 84, + 0x5A2: 84, + 0x5A3: 84, + 0x5A4: 84, + 0x5A5: 84, + 0x5A6: 84, + 0x5A7: 84, + 0x5A8: 84, + 0x5A9: 84, + 0x5AA: 84, + 0x5AB: 84, + 0x5AC: 84, + 0x5AD: 84, + 0x5AE: 84, + 0x5AF: 84, + 0x5B0: 84, + 0x5B1: 84, + 0x5B2: 84, + 0x5B3: 84, + 0x5B4: 84, + 0x5B5: 84, + 0x5B6: 84, + 0x5B7: 84, + 0x5B8: 84, + 0x5B9: 84, + 0x5BA: 84, + 0x5BB: 84, + 0x5BC: 84, + 0x5BD: 84, + 0x5BF: 84, + 0x5C1: 84, + 0x5C2: 84, + 0x5C4: 84, + 0x5C5: 84, + 0x5C7: 84, + 0x610: 84, + 0x611: 84, + 0x612: 84, + 0x613: 84, + 0x614: 84, + 0x615: 84, + 0x616: 84, + 0x617: 84, + 0x618: 84, + 0x619: 84, + 0x61A: 84, + 0x61C: 84, + 0x620: 68, + 0x622: 82, + 0x623: 82, + 0x624: 82, + 0x625: 82, + 0x626: 68, + 0x627: 82, + 0x628: 68, + 0x629: 82, + 0x62A: 68, + 0x62B: 68, + 0x62C: 68, + 0x62D: 68, + 0x62E: 68, + 0x62F: 82, + 0x630: 82, + 0x631: 82, + 0x632: 82, + 0x633: 68, + 0x634: 68, + 0x635: 68, + 0x636: 68, + 0x637: 68, + 0x638: 68, + 0x639: 68, + 0x63A: 68, + 0x63B: 68, + 0x63C: 68, + 0x63D: 68, + 0x63E: 68, + 0x63F: 68, + 0x640: 67, + 0x641: 68, + 0x642: 68, + 0x643: 68, + 0x644: 68, + 0x645: 68, + 0x646: 68, + 0x647: 68, + 0x648: 82, + 0x649: 68, + 0x64A: 68, + 0x64B: 84, + 0x64C: 84, + 0x64D: 84, + 0x64E: 84, + 0x64F: 84, + 0x650: 84, + 0x651: 84, + 0x652: 84, + 0x653: 84, + 0x654: 84, + 0x655: 84, + 0x656: 84, + 0x657: 84, + 0x658: 84, + 0x659: 84, + 0x65A: 84, + 0x65B: 84, + 0x65C: 84, + 0x65D: 84, + 0x65E: 84, + 0x65F: 84, + 0x66E: 68, + 0x66F: 68, + 0x670: 84, + 0x671: 82, + 0x672: 82, + 0x673: 82, + 0x675: 82, + 0x676: 82, + 0x677: 82, + 0x678: 68, + 0x679: 68, + 0x67A: 68, + 0x67B: 68, + 0x67C: 68, + 0x67D: 68, + 0x67E: 68, + 0x67F: 68, + 0x680: 68, + 0x681: 68, + 0x682: 68, + 0x683: 68, + 0x684: 68, + 0x685: 68, + 0x686: 68, + 0x687: 68, + 0x688: 82, + 0x689: 82, + 0x68A: 82, + 0x68B: 82, + 0x68C: 82, + 0x68D: 82, + 0x68E: 82, + 0x68F: 82, + 0x690: 82, + 0x691: 82, + 0x692: 82, + 0x693: 82, + 0x694: 82, + 0x695: 82, + 0x696: 82, + 0x697: 82, + 0x698: 82, + 0x699: 82, + 0x69A: 68, + 0x69B: 68, + 0x69C: 68, + 0x69D: 68, + 0x69E: 68, + 0x69F: 68, + 0x6A0: 68, + 0x6A1: 68, + 0x6A2: 68, + 0x6A3: 68, + 0x6A4: 68, + 0x6A5: 68, + 0x6A6: 68, + 0x6A7: 68, + 0x6A8: 68, + 0x6A9: 68, + 0x6AA: 68, + 0x6AB: 68, + 0x6AC: 68, + 0x6AD: 68, + 0x6AE: 68, + 0x6AF: 68, + 0x6B0: 68, + 0x6B1: 68, + 0x6B2: 68, + 0x6B3: 68, + 0x6B4: 68, + 0x6B5: 68, + 0x6B6: 68, + 0x6B7: 68, + 0x6B8: 68, + 0x6B9: 68, + 0x6BA: 68, + 0x6BB: 68, + 0x6BC: 68, + 0x6BD: 68, + 0x6BE: 68, + 0x6BF: 68, + 0x6C0: 82, + 0x6C1: 68, + 0x6C2: 68, + 0x6C3: 82, + 0x6C4: 82, + 0x6C5: 82, + 0x6C6: 82, + 0x6C7: 82, + 0x6C8: 82, + 0x6C9: 82, + 0x6CA: 82, + 0x6CB: 82, + 0x6CC: 68, + 0x6CD: 82, + 0x6CE: 68, + 0x6CF: 82, + 0x6D0: 68, + 0x6D1: 68, + 0x6D2: 82, + 0x6D3: 82, + 0x6D5: 82, + 0x6D6: 84, + 0x6D7: 84, + 0x6D8: 84, + 0x6D9: 84, + 0x6DA: 84, + 0x6DB: 84, + 0x6DC: 84, + 0x6DF: 84, + 0x6E0: 84, + 0x6E1: 84, + 0x6E2: 84, + 0x6E3: 84, + 0x6E4: 84, + 0x6E7: 84, + 0x6E8: 84, + 0x6EA: 84, + 0x6EB: 84, + 0x6EC: 84, + 0x6ED: 84, + 0x6EE: 82, + 0x6EF: 82, + 0x6FA: 68, + 0x6FB: 68, + 0x6FC: 68, + 0x6FF: 68, + 0x70F: 84, + 0x710: 82, + 0x711: 84, + 0x712: 68, + 0x713: 68, + 0x714: 68, + 0x715: 82, + 0x716: 82, + 0x717: 82, + 0x718: 82, + 0x719: 82, + 0x71A: 68, + 0x71B: 68, + 0x71C: 68, + 0x71D: 68, + 0x71E: 82, + 0x71F: 68, + 0x720: 68, + 0x721: 68, + 0x722: 68, + 0x723: 68, + 0x724: 68, + 0x725: 68, + 0x726: 68, + 0x727: 68, + 0x728: 82, + 0x729: 68, + 0x72A: 82, + 0x72B: 68, + 0x72C: 82, + 0x72D: 68, + 0x72E: 68, + 0x72F: 82, + 0x730: 84, + 0x731: 84, + 0x732: 84, + 0x733: 84, + 0x734: 84, + 0x735: 84, + 0x736: 84, + 0x737: 84, + 0x738: 84, + 0x739: 84, + 0x73A: 84, + 0x73B: 84, + 0x73C: 84, + 0x73D: 84, + 0x73E: 84, + 0x73F: 84, + 0x740: 84, + 0x741: 84, + 0x742: 84, + 0x743: 84, + 0x744: 84, + 0x745: 84, + 0x746: 84, + 0x747: 84, + 0x748: 84, + 0x749: 84, + 0x74A: 84, + 0x74D: 82, + 0x74E: 68, + 0x74F: 68, + 0x750: 68, + 0x751: 68, + 0x752: 68, + 0x753: 68, + 0x754: 68, + 0x755: 68, + 0x756: 68, + 0x757: 68, + 0x758: 68, + 0x759: 82, + 0x75A: 82, + 0x75B: 82, + 0x75C: 68, + 0x75D: 68, + 0x75E: 68, + 0x75F: 68, + 0x760: 68, + 0x761: 68, + 0x762: 68, + 0x763: 68, + 0x764: 68, + 0x765: 68, + 0x766: 68, + 0x767: 68, + 0x768: 68, + 0x769: 68, + 0x76A: 68, + 0x76B: 82, + 0x76C: 82, + 0x76D: 68, + 0x76E: 68, + 0x76F: 68, + 0x770: 68, + 0x771: 82, + 0x772: 68, + 0x773: 82, + 0x774: 82, + 0x775: 68, + 0x776: 68, + 0x777: 68, + 0x778: 82, + 0x779: 82, + 0x77A: 68, + 0x77B: 68, + 0x77C: 68, + 0x77D: 68, + 0x77E: 68, + 0x77F: 68, + 0x7A6: 84, + 0x7A7: 84, + 0x7A8: 84, + 0x7A9: 84, + 0x7AA: 84, + 0x7AB: 84, + 0x7AC: 84, + 0x7AD: 84, + 0x7AE: 84, + 0x7AF: 84, + 0x7B0: 84, + 0x7CA: 68, + 0x7CB: 68, + 0x7CC: 68, + 0x7CD: 68, + 0x7CE: 68, + 0x7CF: 68, + 0x7D0: 68, + 0x7D1: 68, + 0x7D2: 68, + 0x7D3: 68, + 0x7D4: 68, + 0x7D5: 68, + 0x7D6: 68, + 0x7D7: 68, + 0x7D8: 68, + 0x7D9: 68, + 0x7DA: 68, + 0x7DB: 68, + 0x7DC: 68, + 0x7DD: 68, + 0x7DE: 68, + 0x7DF: 68, + 0x7E0: 68, + 0x7E1: 68, + 0x7E2: 68, + 0x7E3: 68, + 0x7E4: 68, + 0x7E5: 68, + 0x7E6: 68, + 0x7E7: 68, + 0x7E8: 68, + 0x7E9: 68, + 0x7EA: 68, + 0x7EB: 84, + 0x7EC: 84, + 0x7ED: 84, + 0x7EE: 84, + 0x7EF: 84, + 0x7F0: 84, + 0x7F1: 84, + 0x7F2: 84, + 0x7F3: 84, + 0x7FA: 67, + 0x7FD: 84, + 0x816: 84, + 0x817: 84, + 0x818: 84, + 0x819: 84, + 0x81B: 84, + 0x81C: 84, + 0x81D: 84, + 0x81E: 84, + 0x81F: 84, + 0x820: 84, + 0x821: 84, + 0x822: 84, + 0x823: 84, + 0x825: 84, + 0x826: 84, + 0x827: 84, + 0x829: 84, + 0x82A: 84, + 0x82B: 84, + 0x82C: 84, + 0x82D: 84, + 0x840: 82, + 0x841: 68, + 0x842: 68, + 0x843: 68, + 0x844: 68, + 0x845: 68, + 0x846: 82, + 0x847: 82, + 0x848: 68, + 0x849: 82, + 0x84A: 68, + 0x84B: 68, + 0x84C: 68, + 0x84D: 68, + 0x84E: 68, + 0x84F: 68, + 0x850: 68, + 0x851: 68, + 0x852: 68, + 0x853: 68, + 0x854: 82, + 0x855: 68, + 0x856: 82, + 0x857: 82, + 0x858: 82, + 0x859: 84, + 0x85A: 84, + 0x85B: 84, + 0x860: 68, + 0x862: 68, + 0x863: 68, + 0x864: 68, + 0x865: 68, + 0x867: 82, + 0x868: 68, + 0x869: 82, + 0x86A: 82, + 0x870: 82, + 0x871: 82, + 0x872: 82, + 0x873: 82, + 0x874: 82, + 0x875: 82, + 0x876: 82, + 0x877: 82, + 0x878: 82, + 0x879: 82, + 0x87A: 82, + 0x87B: 82, + 0x87C: 82, + 0x87D: 82, + 0x87E: 82, + 0x87F: 82, + 0x880: 82, + 0x881: 82, + 0x882: 82, + 0x883: 67, + 0x884: 67, + 0x885: 67, + 0x886: 68, + 0x889: 68, + 0x88A: 68, + 0x88B: 68, + 0x88C: 68, + 0x88D: 68, + 0x88E: 82, + 0x897: 84, + 0x898: 84, + 0x899: 84, + 0x89A: 84, + 0x89B: 84, + 0x89C: 84, + 0x89D: 84, + 0x89E: 84, + 0x89F: 84, + 0x8A0: 68, + 0x8A1: 68, + 0x8A2: 68, + 0x8A3: 68, + 0x8A4: 68, + 0x8A5: 68, + 0x8A6: 68, + 0x8A7: 68, + 0x8A8: 68, + 0x8A9: 68, + 0x8AA: 82, + 0x8AB: 82, + 0x8AC: 82, + 0x8AE: 82, + 0x8AF: 68, + 0x8B0: 68, + 0x8B1: 82, + 0x8B2: 82, + 0x8B3: 68, + 0x8B4: 68, + 0x8B5: 68, + 0x8B6: 68, + 0x8B7: 68, + 0x8B8: 68, + 0x8B9: 82, + 0x8BA: 68, + 0x8BB: 68, + 0x8BC: 68, + 0x8BD: 68, + 0x8BE: 68, + 0x8BF: 68, + 0x8C0: 68, + 0x8C1: 68, + 0x8C2: 68, + 0x8C3: 68, + 0x8C4: 68, + 0x8C5: 68, + 0x8C6: 68, + 0x8C7: 68, + 0x8C8: 68, + 0x8CA: 84, + 0x8CB: 84, + 0x8CC: 84, + 0x8CD: 84, + 0x8CE: 84, + 0x8CF: 84, + 0x8D0: 84, + 0x8D1: 84, + 0x8D2: 84, + 0x8D3: 84, + 0x8D4: 84, + 0x8D5: 84, + 0x8D6: 84, + 0x8D7: 84, + 0x8D8: 84, + 0x8D9: 84, + 0x8DA: 84, + 0x8DB: 84, + 0x8DC: 84, + 0x8DD: 84, + 0x8DE: 84, + 0x8DF: 84, + 0x8E0: 84, + 0x8E1: 84, + 0x8E3: 84, + 0x8E4: 84, + 0x8E5: 84, + 0x8E6: 84, + 0x8E7: 84, + 0x8E8: 84, + 0x8E9: 84, + 0x8EA: 84, + 0x8EB: 84, + 0x8EC: 84, + 0x8ED: 84, + 0x8EE: 84, + 0x8EF: 84, + 0x8F0: 84, + 0x8F1: 84, + 0x8F2: 84, + 0x8F3: 84, + 0x8F4: 84, + 0x8F5: 84, + 0x8F6: 84, + 0x8F7: 84, + 0x8F8: 84, + 0x8F9: 84, + 0x8FA: 84, + 0x8FB: 84, + 0x8FC: 84, + 0x8FD: 84, + 0x8FE: 84, + 0x8FF: 84, + 0x900: 84, + 0x901: 84, + 0x902: 84, + 0x93A: 84, + 0x93C: 84, + 0x941: 84, + 0x942: 84, + 0x943: 84, + 0x944: 84, + 0x945: 84, + 0x946: 84, + 0x947: 84, + 0x948: 84, + 0x94D: 84, + 0x951: 84, + 0x952: 84, + 0x953: 84, + 0x954: 84, + 0x955: 84, + 0x956: 84, + 0x957: 84, + 0x962: 84, + 0x963: 84, + 0x981: 84, + 0x9BC: 84, + 0x9C1: 84, + 0x9C2: 84, + 0x9C3: 84, + 0x9C4: 84, + 0x9CD: 84, + 0x9E2: 84, + 0x9E3: 84, + 0x9FE: 84, + 0xA01: 84, + 0xA02: 84, + 0xA3C: 84, + 0xA41: 84, + 0xA42: 84, + 0xA47: 84, + 0xA48: 84, + 0xA4B: 84, + 0xA4C: 84, + 0xA4D: 84, + 0xA51: 84, + 0xA70: 84, + 0xA71: 84, + 0xA75: 84, + 0xA81: 84, + 0xA82: 84, + 0xABC: 84, + 0xAC1: 84, + 0xAC2: 84, + 0xAC3: 84, + 0xAC4: 84, + 0xAC5: 84, + 0xAC7: 84, + 0xAC8: 84, + 0xACD: 84, + 0xAE2: 84, + 0xAE3: 84, + 0xAFA: 84, + 0xAFB: 84, + 0xAFC: 84, + 0xAFD: 84, + 0xAFE: 84, + 0xAFF: 84, + 0xB01: 84, + 0xB3C: 84, + 0xB3F: 84, + 0xB41: 84, + 0xB42: 84, + 0xB43: 84, + 0xB44: 84, + 0xB4D: 84, + 0xB55: 84, + 0xB56: 84, + 0xB62: 84, + 0xB63: 84, + 0xB82: 84, + 0xBC0: 84, + 0xBCD: 84, + 0xC00: 84, + 0xC04: 84, + 0xC3C: 84, + 0xC3E: 84, + 0xC3F: 84, + 0xC40: 84, + 0xC46: 84, + 0xC47: 84, + 0xC48: 84, + 0xC4A: 84, + 0xC4B: 84, + 0xC4C: 84, + 0xC4D: 84, + 0xC55: 84, + 0xC56: 84, + 0xC62: 84, + 0xC63: 84, + 0xC81: 84, + 0xCBC: 84, + 0xCBF: 84, + 0xCC6: 84, + 0xCCC: 84, + 0xCCD: 84, + 0xCE2: 84, + 0xCE3: 84, + 0xD00: 84, + 0xD01: 84, + 0xD3B: 84, + 0xD3C: 84, + 0xD41: 84, + 0xD42: 84, + 0xD43: 84, + 0xD44: 84, + 0xD4D: 84, + 0xD62: 84, + 0xD63: 84, + 0xD81: 84, + 0xDCA: 84, + 0xDD2: 84, + 0xDD3: 84, + 0xDD4: 84, + 0xDD6: 84, + 0xE31: 84, + 0xE34: 84, + 0xE35: 84, + 0xE36: 84, + 0xE37: 84, + 0xE38: 84, + 0xE39: 84, + 0xE3A: 84, + 0xE47: 84, + 0xE48: 84, + 0xE49: 84, + 0xE4A: 84, + 0xE4B: 84, + 0xE4C: 84, + 0xE4D: 84, + 0xE4E: 84, + 0xEB1: 84, + 0xEB4: 84, + 0xEB5: 84, + 0xEB6: 84, + 0xEB7: 84, + 0xEB8: 84, + 0xEB9: 84, + 0xEBA: 84, + 0xEBB: 84, + 0xEBC: 84, + 0xEC8: 84, + 0xEC9: 84, + 0xECA: 84, + 0xECB: 84, + 0xECC: 84, + 0xECD: 84, + 0xECE: 84, + 0xF18: 84, + 0xF19: 84, + 0xF35: 84, + 0xF37: 84, + 0xF39: 84, + 0xF71: 84, + 0xF72: 84, + 0xF73: 84, + 0xF74: 84, + 0xF75: 84, + 0xF76: 84, + 0xF77: 84, + 0xF78: 84, + 0xF79: 84, + 0xF7A: 84, + 0xF7B: 84, + 0xF7C: 84, + 0xF7D: 84, + 0xF7E: 84, + 0xF80: 84, + 0xF81: 84, + 0xF82: 84, + 0xF83: 84, + 0xF84: 84, + 0xF86: 84, + 0xF87: 84, + 0xF8D: 84, + 0xF8E: 84, + 0xF8F: 84, + 0xF90: 84, + 0xF91: 84, + 0xF92: 84, + 0xF93: 84, + 0xF94: 84, + 0xF95: 84, + 0xF96: 84, + 0xF97: 84, + 0xF99: 84, + 0xF9A: 84, + 0xF9B: 84, + 0xF9C: 84, + 0xF9D: 84, + 0xF9E: 84, + 0xF9F: 84, + 0xFA0: 84, + 0xFA1: 84, + 0xFA2: 84, + 0xFA3: 84, + 0xFA4: 84, + 0xFA5: 84, + 0xFA6: 84, + 0xFA7: 84, + 0xFA8: 84, + 0xFA9: 84, + 0xFAA: 84, + 0xFAB: 84, + 0xFAC: 84, + 0xFAD: 84, + 0xFAE: 84, + 0xFAF: 84, + 0xFB0: 84, + 0xFB1: 84, + 0xFB2: 84, + 0xFB3: 84, + 0xFB4: 84, + 0xFB5: 84, + 0xFB6: 84, + 0xFB7: 84, + 0xFB8: 84, + 0xFB9: 84, + 0xFBA: 84, + 0xFBB: 84, + 0xFBC: 84, + 0xFC6: 84, + 0x102D: 84, + 0x102E: 84, + 0x102F: 84, + 0x1030: 84, + 0x1032: 84, + 0x1033: 84, + 0x1034: 84, + 0x1035: 84, + 0x1036: 84, + 0x1037: 84, + 0x1039: 84, + 0x103A: 84, + 0x103D: 84, + 0x103E: 84, + 0x1058: 84, + 0x1059: 84, + 0x105E: 84, + 0x105F: 84, + 0x1060: 84, + 0x1071: 84, + 0x1072: 84, + 0x1073: 84, + 0x1074: 84, + 0x1082: 84, + 0x1085: 84, + 0x1086: 84, + 0x108D: 84, + 0x109D: 84, + 0x135D: 84, + 0x135E: 84, + 0x135F: 84, + 0x1712: 84, + 0x1713: 84, + 0x1714: 84, + 0x1732: 84, + 0x1733: 84, + 0x1752: 84, + 0x1753: 84, + 0x1772: 84, + 0x1773: 84, + 0x17B4: 84, + 0x17B5: 84, + 0x17B7: 84, + 0x17B8: 84, + 0x17B9: 84, + 0x17BA: 84, + 0x17BB: 84, + 0x17BC: 84, + 0x17BD: 84, + 0x17C6: 84, + 0x17C9: 84, + 0x17CA: 84, + 0x17CB: 84, + 0x17CC: 84, + 0x17CD: 84, + 0x17CE: 84, + 0x17CF: 84, + 0x17D0: 84, + 0x17D1: 84, + 0x17D2: 84, + 0x17D3: 84, + 0x17DD: 84, + 0x1807: 68, + 0x180A: 67, + 0x180B: 84, + 0x180C: 84, + 0x180D: 84, + 0x180F: 84, + 0x1820: 68, + 0x1821: 68, + 0x1822: 68, + 0x1823: 68, + 0x1824: 68, + 0x1825: 68, + 0x1826: 68, + 0x1827: 68, + 0x1828: 68, + 0x1829: 68, + 0x182A: 68, + 0x182B: 68, + 0x182C: 68, + 0x182D: 68, + 0x182E: 68, + 0x182F: 68, + 0x1830: 68, + 0x1831: 68, + 0x1832: 68, + 0x1833: 68, + 0x1834: 68, + 0x1835: 68, + 0x1836: 68, + 0x1837: 68, + 0x1838: 68, + 0x1839: 68, + 0x183A: 68, + 0x183B: 68, + 0x183C: 68, + 0x183D: 68, + 0x183E: 68, + 0x183F: 68, + 0x1840: 68, + 0x1841: 68, + 0x1842: 68, + 0x1843: 68, + 0x1844: 68, + 0x1845: 68, + 0x1846: 68, + 0x1847: 68, + 0x1848: 68, + 0x1849: 68, + 0x184A: 68, + 0x184B: 68, + 0x184C: 68, + 0x184D: 68, + 0x184E: 68, + 0x184F: 68, + 0x1850: 68, + 0x1851: 68, + 0x1852: 68, + 0x1853: 68, + 0x1854: 68, + 0x1855: 68, + 0x1856: 68, + 0x1857: 68, + 0x1858: 68, + 0x1859: 68, + 0x185A: 68, + 0x185B: 68, + 0x185C: 68, + 0x185D: 68, + 0x185E: 68, + 0x185F: 68, + 0x1860: 68, + 0x1861: 68, + 0x1862: 68, + 0x1863: 68, + 0x1864: 68, + 0x1865: 68, + 0x1866: 68, + 0x1867: 68, + 0x1868: 68, + 0x1869: 68, + 0x186A: 68, + 0x186B: 68, + 0x186C: 68, + 0x186D: 68, + 0x186E: 68, + 0x186F: 68, + 0x1870: 68, + 0x1871: 68, + 0x1872: 68, + 0x1873: 68, + 0x1874: 68, + 0x1875: 68, + 0x1876: 68, + 0x1877: 68, + 0x1878: 68, + 0x1885: 84, + 0x1886: 84, + 0x1887: 68, + 0x1888: 68, + 0x1889: 68, + 0x188A: 68, + 0x188B: 68, + 0x188C: 68, + 0x188D: 68, + 0x188E: 68, + 0x188F: 68, + 0x1890: 68, + 0x1891: 68, + 0x1892: 68, + 0x1893: 68, + 0x1894: 68, + 0x1895: 68, + 0x1896: 68, + 0x1897: 68, + 0x1898: 68, + 0x1899: 68, + 0x189A: 68, + 0x189B: 68, + 0x189C: 68, + 0x189D: 68, + 0x189E: 68, + 0x189F: 68, + 0x18A0: 68, + 0x18A1: 68, + 0x18A2: 68, + 0x18A3: 68, + 0x18A4: 68, + 0x18A5: 68, + 0x18A6: 68, + 0x18A7: 68, + 0x18A8: 68, + 0x18A9: 84, + 0x18AA: 68, + 0x1920: 84, + 0x1921: 84, + 0x1922: 84, + 0x1927: 84, + 0x1928: 84, + 0x1932: 84, + 0x1939: 84, + 0x193A: 84, + 0x193B: 84, + 0x1A17: 84, + 0x1A18: 84, + 0x1A1B: 84, + 0x1A56: 84, + 0x1A58: 84, + 0x1A59: 84, + 0x1A5A: 84, + 0x1A5B: 84, + 0x1A5C: 84, + 0x1A5D: 84, + 0x1A5E: 84, + 0x1A60: 84, + 0x1A62: 84, + 0x1A65: 84, + 0x1A66: 84, + 0x1A67: 84, + 0x1A68: 84, + 0x1A69: 84, + 0x1A6A: 84, + 0x1A6B: 84, + 0x1A6C: 84, + 0x1A73: 84, + 0x1A74: 84, + 0x1A75: 84, + 0x1A76: 84, + 0x1A77: 84, + 0x1A78: 84, + 0x1A79: 84, + 0x1A7A: 84, + 0x1A7B: 84, + 0x1A7C: 84, + 0x1A7F: 84, + 0x1AB0: 84, + 0x1AB1: 84, + 0x1AB2: 84, + 0x1AB3: 84, + 0x1AB4: 84, + 0x1AB5: 84, + 0x1AB6: 84, + 0x1AB7: 84, + 0x1AB8: 84, + 0x1AB9: 84, + 0x1ABA: 84, + 0x1ABB: 84, + 0x1ABC: 84, + 0x1ABD: 84, + 0x1ABE: 84, + 0x1ABF: 84, + 0x1AC0: 84, + 0x1AC1: 84, + 0x1AC2: 84, + 0x1AC3: 84, + 0x1AC4: 84, + 0x1AC5: 84, + 0x1AC6: 84, + 0x1AC7: 84, + 0x1AC8: 84, + 0x1AC9: 84, + 0x1ACA: 84, + 0x1ACB: 84, + 0x1ACC: 84, + 0x1ACD: 84, + 0x1ACE: 84, + 0x1B00: 84, + 0x1B01: 84, + 0x1B02: 84, + 0x1B03: 84, + 0x1B34: 84, + 0x1B36: 84, + 0x1B37: 84, + 0x1B38: 84, + 0x1B39: 84, + 0x1B3A: 84, + 0x1B3C: 84, + 0x1B42: 84, + 0x1B6B: 84, + 0x1B6C: 84, + 0x1B6D: 84, + 0x1B6E: 84, + 0x1B6F: 84, + 0x1B70: 84, + 0x1B71: 84, + 0x1B72: 84, + 0x1B73: 84, + 0x1B80: 84, + 0x1B81: 84, + 0x1BA2: 84, + 0x1BA3: 84, + 0x1BA4: 84, + 0x1BA5: 84, + 0x1BA8: 84, + 0x1BA9: 84, + 0x1BAB: 84, + 0x1BAC: 84, + 0x1BAD: 84, + 0x1BE6: 84, + 0x1BE8: 84, + 0x1BE9: 84, + 0x1BED: 84, + 0x1BEF: 84, + 0x1BF0: 84, + 0x1BF1: 84, + 0x1C2C: 84, + 0x1C2D: 84, + 0x1C2E: 84, + 0x1C2F: 84, + 0x1C30: 84, + 0x1C31: 84, + 0x1C32: 84, + 0x1C33: 84, + 0x1C36: 84, + 0x1C37: 84, + 0x1CD0: 84, + 0x1CD1: 84, + 0x1CD2: 84, + 0x1CD4: 84, + 0x1CD5: 84, + 0x1CD6: 84, + 0x1CD7: 84, + 0x1CD8: 84, + 0x1CD9: 84, + 0x1CDA: 84, + 0x1CDB: 84, + 0x1CDC: 84, + 0x1CDD: 84, + 0x1CDE: 84, + 0x1CDF: 84, + 0x1CE0: 84, + 0x1CE2: 84, + 0x1CE3: 84, + 0x1CE4: 84, + 0x1CE5: 84, + 0x1CE6: 84, + 0x1CE7: 84, + 0x1CE8: 84, + 0x1CED: 84, + 0x1CF4: 84, + 0x1CF8: 84, + 0x1CF9: 84, + 0x1DC0: 84, + 0x1DC1: 84, + 0x1DC2: 84, + 0x1DC3: 84, + 0x1DC4: 84, + 0x1DC5: 84, + 0x1DC6: 84, + 0x1DC7: 84, + 0x1DC8: 84, + 0x1DC9: 84, + 0x1DCA: 84, + 0x1DCB: 84, + 0x1DCC: 84, + 0x1DCD: 84, + 0x1DCE: 84, + 0x1DCF: 84, + 0x1DD0: 84, + 0x1DD1: 84, + 0x1DD2: 84, + 0x1DD3: 84, + 0x1DD4: 84, + 0x1DD5: 84, + 0x1DD6: 84, + 0x1DD7: 84, + 0x1DD8: 84, + 0x1DD9: 84, + 0x1DDA: 84, + 0x1DDB: 84, + 0x1DDC: 84, + 0x1DDD: 84, + 0x1DDE: 84, + 0x1DDF: 84, + 0x1DE0: 84, + 0x1DE1: 84, + 0x1DE2: 84, + 0x1DE3: 84, + 0x1DE4: 84, + 0x1DE5: 84, + 0x1DE6: 84, + 0x1DE7: 84, + 0x1DE8: 84, + 0x1DE9: 84, + 0x1DEA: 84, + 0x1DEB: 84, + 0x1DEC: 84, + 0x1DED: 84, + 0x1DEE: 84, + 0x1DEF: 84, + 0x1DF0: 84, + 0x1DF1: 84, + 0x1DF2: 84, + 0x1DF3: 84, + 0x1DF4: 84, + 0x1DF5: 84, + 0x1DF6: 84, + 0x1DF7: 84, + 0x1DF8: 84, + 0x1DF9: 84, + 0x1DFA: 84, + 0x1DFB: 84, + 0x1DFC: 84, + 0x1DFD: 84, + 0x1DFE: 84, + 0x1DFF: 84, + 0x200B: 84, + 0x200D: 67, + 0x200E: 84, + 0x200F: 84, + 0x202A: 84, + 0x202B: 84, + 0x202C: 84, + 0x202D: 84, + 0x202E: 84, + 0x2060: 84, + 0x2061: 84, + 0x2062: 84, + 0x2063: 84, + 0x2064: 84, + 0x206A: 84, + 0x206B: 84, + 0x206C: 84, + 0x206D: 84, + 0x206E: 84, + 0x206F: 84, + 0x20D0: 84, + 0x20D1: 84, + 0x20D2: 84, + 0x20D3: 84, + 0x20D4: 84, + 0x20D5: 84, + 0x20D6: 84, + 0x20D7: 84, + 0x20D8: 84, + 0x20D9: 84, + 0x20DA: 84, + 0x20DB: 84, + 0x20DC: 84, + 0x20DD: 84, + 0x20DE: 84, + 0x20DF: 84, + 0x20E0: 84, + 0x20E1: 84, + 0x20E2: 84, + 0x20E3: 84, + 0x20E4: 84, + 0x20E5: 84, + 0x20E6: 84, + 0x20E7: 84, + 0x20E8: 84, + 0x20E9: 84, + 0x20EA: 84, + 0x20EB: 84, + 0x20EC: 84, + 0x20ED: 84, + 0x20EE: 84, + 0x20EF: 84, + 0x20F0: 84, + 0x2CEF: 84, + 0x2CF0: 84, + 0x2CF1: 84, + 0x2D7F: 84, + 0x2DE0: 84, + 0x2DE1: 84, + 0x2DE2: 84, + 0x2DE3: 84, + 0x2DE4: 84, + 0x2DE5: 84, + 0x2DE6: 84, + 0x2DE7: 84, + 0x2DE8: 84, + 0x2DE9: 84, + 0x2DEA: 84, + 0x2DEB: 84, + 0x2DEC: 84, + 0x2DED: 84, + 0x2DEE: 84, + 0x2DEF: 84, + 0x2DF0: 84, + 0x2DF1: 84, + 0x2DF2: 84, + 0x2DF3: 84, + 0x2DF4: 84, + 0x2DF5: 84, + 0x2DF6: 84, + 0x2DF7: 84, + 0x2DF8: 84, + 0x2DF9: 84, + 0x2DFA: 84, + 0x2DFB: 84, + 0x2DFC: 84, + 0x2DFD: 84, + 0x2DFE: 84, + 0x2DFF: 84, + 0x302A: 84, + 0x302B: 84, + 0x302C: 84, + 0x302D: 84, + 0x3099: 84, + 0x309A: 84, + 0xA66F: 84, + 0xA670: 84, + 0xA671: 84, + 0xA672: 84, + 0xA674: 84, + 0xA675: 84, + 0xA676: 84, + 0xA677: 84, + 0xA678: 84, + 0xA679: 84, + 0xA67A: 84, + 0xA67B: 84, + 0xA67C: 84, + 0xA67D: 84, + 0xA69E: 84, + 0xA69F: 84, + 0xA6F0: 84, + 0xA6F1: 84, + 0xA802: 84, + 0xA806: 84, + 0xA80B: 84, + 0xA825: 84, + 0xA826: 84, + 0xA82C: 84, + 0xA840: 68, + 0xA841: 68, + 0xA842: 68, + 0xA843: 68, + 0xA844: 68, + 0xA845: 68, + 0xA846: 68, + 0xA847: 68, + 0xA848: 68, + 0xA849: 68, + 0xA84A: 68, + 0xA84B: 68, + 0xA84C: 68, + 0xA84D: 68, + 0xA84E: 68, + 0xA84F: 68, + 0xA850: 68, + 0xA851: 68, + 0xA852: 68, + 0xA853: 68, + 0xA854: 68, + 0xA855: 68, + 0xA856: 68, + 0xA857: 68, + 0xA858: 68, + 0xA859: 68, + 0xA85A: 68, + 0xA85B: 68, + 0xA85C: 68, + 0xA85D: 68, + 0xA85E: 68, + 0xA85F: 68, + 0xA860: 68, + 0xA861: 68, + 0xA862: 68, + 0xA863: 68, + 0xA864: 68, + 0xA865: 68, + 0xA866: 68, + 0xA867: 68, + 0xA868: 68, + 0xA869: 68, + 0xA86A: 68, + 0xA86B: 68, + 0xA86C: 68, + 0xA86D: 68, + 0xA86E: 68, + 0xA86F: 68, + 0xA870: 68, + 0xA871: 68, + 0xA872: 76, + 0xA8C4: 84, + 0xA8C5: 84, + 0xA8E0: 84, + 0xA8E1: 84, + 0xA8E2: 84, + 0xA8E3: 84, + 0xA8E4: 84, + 0xA8E5: 84, + 0xA8E6: 84, + 0xA8E7: 84, + 0xA8E8: 84, + 0xA8E9: 84, + 0xA8EA: 84, + 0xA8EB: 84, + 0xA8EC: 84, + 0xA8ED: 84, + 0xA8EE: 84, + 0xA8EF: 84, + 0xA8F0: 84, + 0xA8F1: 84, + 0xA8FF: 84, + 0xA926: 84, + 0xA927: 84, + 0xA928: 84, + 0xA929: 84, + 0xA92A: 84, + 0xA92B: 84, + 0xA92C: 84, + 0xA92D: 84, + 0xA947: 84, + 0xA948: 84, + 0xA949: 84, + 0xA94A: 84, + 0xA94B: 84, + 0xA94C: 84, + 0xA94D: 84, + 0xA94E: 84, + 0xA94F: 84, + 0xA950: 84, + 0xA951: 84, + 0xA980: 84, + 0xA981: 84, + 0xA982: 84, + 0xA9B3: 84, + 0xA9B6: 84, + 0xA9B7: 84, + 0xA9B8: 84, + 0xA9B9: 84, + 0xA9BC: 84, + 0xA9BD: 84, + 0xA9E5: 84, + 0xAA29: 84, + 0xAA2A: 84, + 0xAA2B: 84, + 0xAA2C: 84, + 0xAA2D: 84, + 0xAA2E: 84, + 0xAA31: 84, + 0xAA32: 84, + 0xAA35: 84, + 0xAA36: 84, + 0xAA43: 84, + 0xAA4C: 84, + 0xAA7C: 84, + 0xAAB0: 84, + 0xAAB2: 84, + 0xAAB3: 84, + 0xAAB4: 84, + 0xAAB7: 84, + 0xAAB8: 84, + 0xAABE: 84, + 0xAABF: 84, + 0xAAC1: 84, + 0xAAEC: 84, + 0xAAED: 84, + 0xAAF6: 84, + 0xABE5: 84, + 0xABE8: 84, + 0xABED: 84, + 0xFB1E: 84, + 0xFE00: 84, + 0xFE01: 84, + 0xFE02: 84, + 0xFE03: 84, + 0xFE04: 84, + 0xFE05: 84, + 0xFE06: 84, + 0xFE07: 84, + 0xFE08: 84, + 0xFE09: 84, + 0xFE0A: 84, + 0xFE0B: 84, + 0xFE0C: 84, + 0xFE0D: 84, + 0xFE0E: 84, + 0xFE0F: 84, + 0xFE20: 84, + 0xFE21: 84, + 0xFE22: 84, + 0xFE23: 84, + 0xFE24: 84, + 0xFE25: 84, + 0xFE26: 84, + 0xFE27: 84, + 0xFE28: 84, + 0xFE29: 84, + 0xFE2A: 84, + 0xFE2B: 84, + 0xFE2C: 84, + 0xFE2D: 84, + 0xFE2E: 84, + 0xFE2F: 84, + 0xFEFF: 84, + 0xFFF9: 84, + 0xFFFA: 84, + 0xFFFB: 84, + 0x101FD: 84, + 0x102E0: 84, + 0x10376: 84, + 0x10377: 84, + 0x10378: 84, + 0x10379: 84, + 0x1037A: 84, + 0x10A01: 84, + 0x10A02: 84, + 0x10A03: 84, + 0x10A05: 84, + 0x10A06: 84, + 0x10A0C: 84, + 0x10A0D: 84, + 0x10A0E: 84, + 0x10A0F: 84, + 0x10A38: 84, + 0x10A39: 84, + 0x10A3A: 84, + 0x10A3F: 84, + 0x10AC0: 68, + 0x10AC1: 68, + 0x10AC2: 68, + 0x10AC3: 68, + 0x10AC4: 68, + 0x10AC5: 82, + 0x10AC7: 82, + 0x10AC9: 82, + 0x10ACA: 82, + 0x10ACD: 76, + 0x10ACE: 82, + 0x10ACF: 82, + 0x10AD0: 82, + 0x10AD1: 82, + 0x10AD2: 82, + 0x10AD3: 68, + 0x10AD4: 68, + 0x10AD5: 68, + 0x10AD6: 68, + 0x10AD7: 76, + 0x10AD8: 68, + 0x10AD9: 68, + 0x10ADA: 68, + 0x10ADB: 68, + 0x10ADC: 68, + 0x10ADD: 82, + 0x10ADE: 68, + 0x10ADF: 68, + 0x10AE0: 68, + 0x10AE1: 82, + 0x10AE4: 82, + 0x10AE5: 84, + 0x10AE6: 84, + 0x10AEB: 68, + 0x10AEC: 68, + 0x10AED: 68, + 0x10AEE: 68, + 0x10AEF: 82, + 0x10B80: 68, + 0x10B81: 82, + 0x10B82: 68, + 0x10B83: 82, + 0x10B84: 82, + 0x10B85: 82, + 0x10B86: 68, + 0x10B87: 68, + 0x10B88: 68, + 0x10B89: 82, + 0x10B8A: 68, + 0x10B8B: 68, + 0x10B8C: 82, + 0x10B8D: 68, + 0x10B8E: 82, + 0x10B8F: 82, + 0x10B90: 68, + 0x10B91: 82, + 0x10BA9: 82, + 0x10BAA: 82, + 0x10BAB: 82, + 0x10BAC: 82, + 0x10BAD: 68, + 0x10BAE: 68, + 0x10D00: 76, + 0x10D01: 68, + 0x10D02: 68, + 0x10D03: 68, + 0x10D04: 68, + 0x10D05: 68, + 0x10D06: 68, + 0x10D07: 68, + 0x10D08: 68, + 0x10D09: 68, + 0x10D0A: 68, + 0x10D0B: 68, + 0x10D0C: 68, + 0x10D0D: 68, + 0x10D0E: 68, + 0x10D0F: 68, + 0x10D10: 68, + 0x10D11: 68, + 0x10D12: 68, + 0x10D13: 68, + 0x10D14: 68, + 0x10D15: 68, + 0x10D16: 68, + 0x10D17: 68, + 0x10D18: 68, + 0x10D19: 68, + 0x10D1A: 68, + 0x10D1B: 68, + 0x10D1C: 68, + 0x10D1D: 68, + 0x10D1E: 68, + 0x10D1F: 68, + 0x10D20: 68, + 0x10D21: 68, + 0x10D22: 82, + 0x10D23: 68, + 0x10D24: 84, + 0x10D25: 84, + 0x10D26: 84, + 0x10D27: 84, + 0x10D69: 84, + 0x10D6A: 84, + 0x10D6B: 84, + 0x10D6C: 84, + 0x10D6D: 84, + 0x10EAB: 84, + 0x10EAC: 84, + 0x10EC2: 82, + 0x10EC3: 68, + 0x10EC4: 68, + 0x10EFC: 84, + 0x10EFD: 84, + 0x10EFE: 84, + 0x10EFF: 84, + 0x10F30: 68, + 0x10F31: 68, + 0x10F32: 68, + 0x10F33: 82, + 0x10F34: 68, + 0x10F35: 68, + 0x10F36: 68, + 0x10F37: 68, + 0x10F38: 68, + 0x10F39: 68, + 0x10F3A: 68, + 0x10F3B: 68, + 0x10F3C: 68, + 0x10F3D: 68, + 0x10F3E: 68, + 0x10F3F: 68, + 0x10F40: 68, + 0x10F41: 68, + 0x10F42: 68, + 0x10F43: 68, + 0x10F44: 68, + 0x10F46: 84, + 0x10F47: 84, + 0x10F48: 84, + 0x10F49: 84, + 0x10F4A: 84, + 0x10F4B: 84, + 0x10F4C: 84, + 0x10F4D: 84, + 0x10F4E: 84, + 0x10F4F: 84, + 0x10F50: 84, + 0x10F51: 68, + 0x10F52: 68, + 0x10F53: 68, + 0x10F54: 82, + 0x10F70: 68, + 0x10F71: 68, + 0x10F72: 68, + 0x10F73: 68, + 0x10F74: 82, + 0x10F75: 82, + 0x10F76: 68, + 0x10F77: 68, + 0x10F78: 68, + 0x10F79: 68, + 0x10F7A: 68, + 0x10F7B: 68, + 0x10F7C: 68, + 0x10F7D: 68, + 0x10F7E: 68, + 0x10F7F: 68, + 0x10F80: 68, + 0x10F81: 68, + 0x10F82: 84, + 0x10F83: 84, + 0x10F84: 84, + 0x10F85: 84, + 0x10FB0: 68, + 0x10FB2: 68, + 0x10FB3: 68, + 0x10FB4: 82, + 0x10FB5: 82, + 0x10FB6: 82, + 0x10FB8: 68, + 0x10FB9: 82, + 0x10FBA: 82, + 0x10FBB: 68, + 0x10FBC: 68, + 0x10FBD: 82, + 0x10FBE: 68, + 0x10FBF: 68, + 0x10FC1: 68, + 0x10FC2: 82, + 0x10FC3: 82, + 0x10FC4: 68, + 0x10FC9: 82, + 0x10FCA: 68, + 0x10FCB: 76, + 0x11001: 84, + 0x11038: 84, + 0x11039: 84, + 0x1103A: 84, + 0x1103B: 84, + 0x1103C: 84, + 0x1103D: 84, + 0x1103E: 84, + 0x1103F: 84, + 0x11040: 84, + 0x11041: 84, + 0x11042: 84, + 0x11043: 84, + 0x11044: 84, + 0x11045: 84, + 0x11046: 84, + 0x11070: 84, + 0x11073: 84, + 0x11074: 84, + 0x1107F: 84, + 0x11080: 84, + 0x11081: 84, + 0x110B3: 84, + 0x110B4: 84, + 0x110B5: 84, + 0x110B6: 84, + 0x110B9: 84, + 0x110BA: 84, + 0x110C2: 84, + 0x11100: 84, + 0x11101: 84, + 0x11102: 84, + 0x11127: 84, + 0x11128: 84, + 0x11129: 84, + 0x1112A: 84, + 0x1112B: 84, + 0x1112D: 84, + 0x1112E: 84, + 0x1112F: 84, + 0x11130: 84, + 0x11131: 84, + 0x11132: 84, + 0x11133: 84, + 0x11134: 84, + 0x11173: 84, + 0x11180: 84, + 0x11181: 84, + 0x111B6: 84, + 0x111B7: 84, + 0x111B8: 84, + 0x111B9: 84, + 0x111BA: 84, + 0x111BB: 84, + 0x111BC: 84, + 0x111BD: 84, + 0x111BE: 84, + 0x111C9: 84, + 0x111CA: 84, + 0x111CB: 84, + 0x111CC: 84, + 0x111CF: 84, + 0x1122F: 84, + 0x11230: 84, + 0x11231: 84, + 0x11234: 84, + 0x11236: 84, + 0x11237: 84, + 0x1123E: 84, + 0x11241: 84, + 0x112DF: 84, + 0x112E3: 84, + 0x112E4: 84, + 0x112E5: 84, + 0x112E6: 84, + 0x112E7: 84, + 0x112E8: 84, + 0x112E9: 84, + 0x112EA: 84, + 0x11300: 84, + 0x11301: 84, + 0x1133B: 84, + 0x1133C: 84, + 0x11340: 84, + 0x11366: 84, + 0x11367: 84, + 0x11368: 84, + 0x11369: 84, + 0x1136A: 84, + 0x1136B: 84, + 0x1136C: 84, + 0x11370: 84, + 0x11371: 84, + 0x11372: 84, + 0x11373: 84, + 0x11374: 84, + 0x113BB: 84, + 0x113BC: 84, + 0x113BD: 84, + 0x113BE: 84, + 0x113BF: 84, + 0x113C0: 84, + 0x113CE: 84, + 0x113D0: 84, + 0x113D2: 84, + 0x113E1: 84, + 0x113E2: 84, + 0x11438: 84, + 0x11439: 84, + 0x1143A: 84, + 0x1143B: 84, + 0x1143C: 84, + 0x1143D: 84, + 0x1143E: 84, + 0x1143F: 84, + 0x11442: 84, + 0x11443: 84, + 0x11444: 84, + 0x11446: 84, + 0x1145E: 84, + 0x114B3: 84, + 0x114B4: 84, + 0x114B5: 84, + 0x114B6: 84, + 0x114B7: 84, + 0x114B8: 84, + 0x114BA: 84, + 0x114BF: 84, + 0x114C0: 84, + 0x114C2: 84, + 0x114C3: 84, + 0x115B2: 84, + 0x115B3: 84, + 0x115B4: 84, + 0x115B5: 84, + 0x115BC: 84, + 0x115BD: 84, + 0x115BF: 84, + 0x115C0: 84, + 0x115DC: 84, + 0x115DD: 84, + 0x11633: 84, + 0x11634: 84, + 0x11635: 84, + 0x11636: 84, + 0x11637: 84, + 0x11638: 84, + 0x11639: 84, + 0x1163A: 84, + 0x1163D: 84, + 0x1163F: 84, + 0x11640: 84, + 0x116AB: 84, + 0x116AD: 84, + 0x116B0: 84, + 0x116B1: 84, + 0x116B2: 84, + 0x116B3: 84, + 0x116B4: 84, + 0x116B5: 84, + 0x116B7: 84, + 0x1171D: 84, + 0x1171F: 84, + 0x11722: 84, + 0x11723: 84, + 0x11724: 84, + 0x11725: 84, + 0x11727: 84, + 0x11728: 84, + 0x11729: 84, + 0x1172A: 84, + 0x1172B: 84, + 0x1182F: 84, + 0x11830: 84, + 0x11831: 84, + 0x11832: 84, + 0x11833: 84, + 0x11834: 84, + 0x11835: 84, + 0x11836: 84, + 0x11837: 84, + 0x11839: 84, + 0x1183A: 84, + 0x1193B: 84, + 0x1193C: 84, + 0x1193E: 84, + 0x11943: 84, + 0x119D4: 84, + 0x119D5: 84, + 0x119D6: 84, + 0x119D7: 84, + 0x119DA: 84, + 0x119DB: 84, + 0x119E0: 84, + 0x11A01: 84, + 0x11A02: 84, + 0x11A03: 84, + 0x11A04: 84, + 0x11A05: 84, + 0x11A06: 84, + 0x11A07: 84, + 0x11A08: 84, + 0x11A09: 84, + 0x11A0A: 84, + 0x11A33: 84, + 0x11A34: 84, + 0x11A35: 84, + 0x11A36: 84, + 0x11A37: 84, + 0x11A38: 84, + 0x11A3B: 84, + 0x11A3C: 84, + 0x11A3D: 84, + 0x11A3E: 84, + 0x11A47: 84, + 0x11A51: 84, + 0x11A52: 84, + 0x11A53: 84, + 0x11A54: 84, + 0x11A55: 84, + 0x11A56: 84, + 0x11A59: 84, + 0x11A5A: 84, + 0x11A5B: 84, + 0x11A8A: 84, + 0x11A8B: 84, + 0x11A8C: 84, + 0x11A8D: 84, + 0x11A8E: 84, + 0x11A8F: 84, + 0x11A90: 84, + 0x11A91: 84, + 0x11A92: 84, + 0x11A93: 84, + 0x11A94: 84, + 0x11A95: 84, + 0x11A96: 84, + 0x11A98: 84, + 0x11A99: 84, + 0x11C30: 84, + 0x11C31: 84, + 0x11C32: 84, + 0x11C33: 84, + 0x11C34: 84, + 0x11C35: 84, + 0x11C36: 84, + 0x11C38: 84, + 0x11C39: 84, + 0x11C3A: 84, + 0x11C3B: 84, + 0x11C3C: 84, + 0x11C3D: 84, + 0x11C3F: 84, + 0x11C92: 84, + 0x11C93: 84, + 0x11C94: 84, + 0x11C95: 84, + 0x11C96: 84, + 0x11C97: 84, + 0x11C98: 84, + 0x11C99: 84, + 0x11C9A: 84, + 0x11C9B: 84, + 0x11C9C: 84, + 0x11C9D: 84, + 0x11C9E: 84, + 0x11C9F: 84, + 0x11CA0: 84, + 0x11CA1: 84, + 0x11CA2: 84, + 0x11CA3: 84, + 0x11CA4: 84, + 0x11CA5: 84, + 0x11CA6: 84, + 0x11CA7: 84, + 0x11CAA: 84, + 0x11CAB: 84, + 0x11CAC: 84, + 0x11CAD: 84, + 0x11CAE: 84, + 0x11CAF: 84, + 0x11CB0: 84, + 0x11CB2: 84, + 0x11CB3: 84, + 0x11CB5: 84, + 0x11CB6: 84, + 0x11D31: 84, + 0x11D32: 84, + 0x11D33: 84, + 0x11D34: 84, + 0x11D35: 84, + 0x11D36: 84, + 0x11D3A: 84, + 0x11D3C: 84, + 0x11D3D: 84, + 0x11D3F: 84, + 0x11D40: 84, + 0x11D41: 84, + 0x11D42: 84, + 0x11D43: 84, + 0x11D44: 84, + 0x11D45: 84, + 0x11D47: 84, + 0x11D90: 84, + 0x11D91: 84, + 0x11D95: 84, + 0x11D97: 84, + 0x11EF3: 84, + 0x11EF4: 84, + 0x11F00: 84, + 0x11F01: 84, + 0x11F36: 84, + 0x11F37: 84, + 0x11F38: 84, + 0x11F39: 84, + 0x11F3A: 84, + 0x11F40: 84, + 0x11F42: 84, + 0x11F5A: 84, + 0x13430: 84, + 0x13431: 84, + 0x13432: 84, + 0x13433: 84, + 0x13434: 84, + 0x13435: 84, + 0x13436: 84, + 0x13437: 84, + 0x13438: 84, + 0x13439: 84, + 0x1343A: 84, + 0x1343B: 84, + 0x1343C: 84, + 0x1343D: 84, + 0x1343E: 84, + 0x1343F: 84, + 0x13440: 84, + 0x13447: 84, + 0x13448: 84, + 0x13449: 84, + 0x1344A: 84, + 0x1344B: 84, + 0x1344C: 84, + 0x1344D: 84, + 0x1344E: 84, + 0x1344F: 84, + 0x13450: 84, + 0x13451: 84, + 0x13452: 84, + 0x13453: 84, + 0x13454: 84, + 0x13455: 84, + 0x1611E: 84, + 0x1611F: 84, + 0x16120: 84, + 0x16121: 84, + 0x16122: 84, + 0x16123: 84, + 0x16124: 84, + 0x16125: 84, + 0x16126: 84, + 0x16127: 84, + 0x16128: 84, + 0x16129: 84, + 0x1612D: 84, + 0x1612E: 84, + 0x1612F: 84, + 0x16AF0: 84, + 0x16AF1: 84, + 0x16AF2: 84, + 0x16AF3: 84, + 0x16AF4: 84, + 0x16B30: 84, + 0x16B31: 84, + 0x16B32: 84, + 0x16B33: 84, + 0x16B34: 84, + 0x16B35: 84, + 0x16B36: 84, + 0x16F4F: 84, + 0x16F8F: 84, + 0x16F90: 84, + 0x16F91: 84, + 0x16F92: 84, + 0x16FE4: 84, + 0x1BC9D: 84, + 0x1BC9E: 84, + 0x1BCA0: 84, + 0x1BCA1: 84, + 0x1BCA2: 84, + 0x1BCA3: 84, + 0x1CF00: 84, + 0x1CF01: 84, + 0x1CF02: 84, + 0x1CF03: 84, + 0x1CF04: 84, + 0x1CF05: 84, + 0x1CF06: 84, + 0x1CF07: 84, + 0x1CF08: 84, + 0x1CF09: 84, + 0x1CF0A: 84, + 0x1CF0B: 84, + 0x1CF0C: 84, + 0x1CF0D: 84, + 0x1CF0E: 84, + 0x1CF0F: 84, + 0x1CF10: 84, + 0x1CF11: 84, + 0x1CF12: 84, + 0x1CF13: 84, + 0x1CF14: 84, + 0x1CF15: 84, + 0x1CF16: 84, + 0x1CF17: 84, + 0x1CF18: 84, + 0x1CF19: 84, + 0x1CF1A: 84, + 0x1CF1B: 84, + 0x1CF1C: 84, + 0x1CF1D: 84, + 0x1CF1E: 84, + 0x1CF1F: 84, + 0x1CF20: 84, + 0x1CF21: 84, + 0x1CF22: 84, + 0x1CF23: 84, + 0x1CF24: 84, + 0x1CF25: 84, + 0x1CF26: 84, + 0x1CF27: 84, + 0x1CF28: 84, + 0x1CF29: 84, + 0x1CF2A: 84, + 0x1CF2B: 84, + 0x1CF2C: 84, + 0x1CF2D: 84, + 0x1CF30: 84, + 0x1CF31: 84, + 0x1CF32: 84, + 0x1CF33: 84, + 0x1CF34: 84, + 0x1CF35: 84, + 0x1CF36: 84, + 0x1CF37: 84, + 0x1CF38: 84, + 0x1CF39: 84, + 0x1CF3A: 84, + 0x1CF3B: 84, + 0x1CF3C: 84, + 0x1CF3D: 84, + 0x1CF3E: 84, + 0x1CF3F: 84, + 0x1CF40: 84, + 0x1CF41: 84, + 0x1CF42: 84, + 0x1CF43: 84, + 0x1CF44: 84, + 0x1CF45: 84, + 0x1CF46: 84, + 0x1D167: 84, + 0x1D168: 84, + 0x1D169: 84, + 0x1D173: 84, + 0x1D174: 84, + 0x1D175: 84, + 0x1D176: 84, + 0x1D177: 84, + 0x1D178: 84, + 0x1D179: 84, + 0x1D17A: 84, + 0x1D17B: 84, + 0x1D17C: 84, + 0x1D17D: 84, + 0x1D17E: 84, + 0x1D17F: 84, + 0x1D180: 84, + 0x1D181: 84, + 0x1D182: 84, + 0x1D185: 84, + 0x1D186: 84, + 0x1D187: 84, + 0x1D188: 84, + 0x1D189: 84, + 0x1D18A: 84, + 0x1D18B: 84, + 0x1D1AA: 84, + 0x1D1AB: 84, + 0x1D1AC: 84, + 0x1D1AD: 84, + 0x1D242: 84, + 0x1D243: 84, + 0x1D244: 84, + 0x1DA00: 84, + 0x1DA01: 84, + 0x1DA02: 84, + 0x1DA03: 84, + 0x1DA04: 84, + 0x1DA05: 84, + 0x1DA06: 84, + 0x1DA07: 84, + 0x1DA08: 84, + 0x1DA09: 84, + 0x1DA0A: 84, + 0x1DA0B: 84, + 0x1DA0C: 84, + 0x1DA0D: 84, + 0x1DA0E: 84, + 0x1DA0F: 84, + 0x1DA10: 84, + 0x1DA11: 84, + 0x1DA12: 84, + 0x1DA13: 84, + 0x1DA14: 84, + 0x1DA15: 84, + 0x1DA16: 84, + 0x1DA17: 84, + 0x1DA18: 84, + 0x1DA19: 84, + 0x1DA1A: 84, + 0x1DA1B: 84, + 0x1DA1C: 84, + 0x1DA1D: 84, + 0x1DA1E: 84, + 0x1DA1F: 84, + 0x1DA20: 84, + 0x1DA21: 84, + 0x1DA22: 84, + 0x1DA23: 84, + 0x1DA24: 84, + 0x1DA25: 84, + 0x1DA26: 84, + 0x1DA27: 84, + 0x1DA28: 84, + 0x1DA29: 84, + 0x1DA2A: 84, + 0x1DA2B: 84, + 0x1DA2C: 84, + 0x1DA2D: 84, + 0x1DA2E: 84, + 0x1DA2F: 84, + 0x1DA30: 84, + 0x1DA31: 84, + 0x1DA32: 84, + 0x1DA33: 84, + 0x1DA34: 84, + 0x1DA35: 84, + 0x1DA36: 84, + 0x1DA3B: 84, + 0x1DA3C: 84, + 0x1DA3D: 84, + 0x1DA3E: 84, + 0x1DA3F: 84, + 0x1DA40: 84, + 0x1DA41: 84, + 0x1DA42: 84, + 0x1DA43: 84, + 0x1DA44: 84, + 0x1DA45: 84, + 0x1DA46: 84, + 0x1DA47: 84, + 0x1DA48: 84, + 0x1DA49: 84, + 0x1DA4A: 84, + 0x1DA4B: 84, + 0x1DA4C: 84, + 0x1DA4D: 84, + 0x1DA4E: 84, + 0x1DA4F: 84, + 0x1DA50: 84, + 0x1DA51: 84, + 0x1DA52: 84, + 0x1DA53: 84, + 0x1DA54: 84, + 0x1DA55: 84, + 0x1DA56: 84, + 0x1DA57: 84, + 0x1DA58: 84, + 0x1DA59: 84, + 0x1DA5A: 84, + 0x1DA5B: 84, + 0x1DA5C: 84, + 0x1DA5D: 84, + 0x1DA5E: 84, + 0x1DA5F: 84, + 0x1DA60: 84, + 0x1DA61: 84, + 0x1DA62: 84, + 0x1DA63: 84, + 0x1DA64: 84, + 0x1DA65: 84, + 0x1DA66: 84, + 0x1DA67: 84, + 0x1DA68: 84, + 0x1DA69: 84, + 0x1DA6A: 84, + 0x1DA6B: 84, + 0x1DA6C: 84, + 0x1DA75: 84, + 0x1DA84: 84, + 0x1DA9B: 84, + 0x1DA9C: 84, + 0x1DA9D: 84, + 0x1DA9E: 84, + 0x1DA9F: 84, + 0x1DAA1: 84, + 0x1DAA2: 84, + 0x1DAA3: 84, + 0x1DAA4: 84, + 0x1DAA5: 84, + 0x1DAA6: 84, + 0x1DAA7: 84, + 0x1DAA8: 84, + 0x1DAA9: 84, + 0x1DAAA: 84, + 0x1DAAB: 84, + 0x1DAAC: 84, + 0x1DAAD: 84, + 0x1DAAE: 84, + 0x1DAAF: 84, + 0x1E000: 84, + 0x1E001: 84, + 0x1E002: 84, + 0x1E003: 84, + 0x1E004: 84, + 0x1E005: 84, + 0x1E006: 84, + 0x1E008: 84, + 0x1E009: 84, + 0x1E00A: 84, + 0x1E00B: 84, + 0x1E00C: 84, + 0x1E00D: 84, + 0x1E00E: 84, + 0x1E00F: 84, + 0x1E010: 84, + 0x1E011: 84, + 0x1E012: 84, + 0x1E013: 84, + 0x1E014: 84, + 0x1E015: 84, + 0x1E016: 84, + 0x1E017: 84, + 0x1E018: 84, + 0x1E01B: 84, + 0x1E01C: 84, + 0x1E01D: 84, + 0x1E01E: 84, + 0x1E01F: 84, + 0x1E020: 84, + 0x1E021: 84, + 0x1E023: 84, + 0x1E024: 84, + 0x1E026: 84, + 0x1E027: 84, + 0x1E028: 84, + 0x1E029: 84, + 0x1E02A: 84, + 0x1E08F: 84, + 0x1E130: 84, + 0x1E131: 84, + 0x1E132: 84, + 0x1E133: 84, + 0x1E134: 84, + 0x1E135: 84, + 0x1E136: 84, + 0x1E2AE: 84, + 0x1E2EC: 84, + 0x1E2ED: 84, + 0x1E2EE: 84, + 0x1E2EF: 84, + 0x1E4EC: 84, + 0x1E4ED: 84, + 0x1E4EE: 84, + 0x1E4EF: 84, + 0x1E5EE: 84, + 0x1E5EF: 84, + 0x1E8D0: 84, + 0x1E8D1: 84, + 0x1E8D2: 84, + 0x1E8D3: 84, + 0x1E8D4: 84, + 0x1E8D5: 84, + 0x1E8D6: 84, + 0x1E900: 68, + 0x1E901: 68, + 0x1E902: 68, + 0x1E903: 68, + 0x1E904: 68, + 0x1E905: 68, + 0x1E906: 68, + 0x1E907: 68, + 0x1E908: 68, + 0x1E909: 68, + 0x1E90A: 68, + 0x1E90B: 68, + 0x1E90C: 68, + 0x1E90D: 68, + 0x1E90E: 68, + 0x1E90F: 68, + 0x1E910: 68, + 0x1E911: 68, + 0x1E912: 68, + 0x1E913: 68, + 0x1E914: 68, + 0x1E915: 68, + 0x1E916: 68, + 0x1E917: 68, + 0x1E918: 68, + 0x1E919: 68, + 0x1E91A: 68, + 0x1E91B: 68, + 0x1E91C: 68, + 0x1E91D: 68, + 0x1E91E: 68, + 0x1E91F: 68, + 0x1E920: 68, + 0x1E921: 68, + 0x1E922: 68, + 0x1E923: 68, + 0x1E924: 68, + 0x1E925: 68, + 0x1E926: 68, + 0x1E927: 68, + 0x1E928: 68, + 0x1E929: 68, + 0x1E92A: 68, + 0x1E92B: 68, + 0x1E92C: 68, + 0x1E92D: 68, + 0x1E92E: 68, + 0x1E92F: 68, + 0x1E930: 68, + 0x1E931: 68, + 0x1E932: 68, + 0x1E933: 68, + 0x1E934: 68, + 0x1E935: 68, + 0x1E936: 68, + 0x1E937: 68, + 0x1E938: 68, + 0x1E939: 68, + 0x1E93A: 68, + 0x1E93B: 68, + 0x1E93C: 68, + 0x1E93D: 68, + 0x1E93E: 68, + 0x1E93F: 68, + 0x1E940: 68, + 0x1E941: 68, + 0x1E942: 68, + 0x1E943: 68, + 0x1E944: 84, + 0x1E945: 84, + 0x1E946: 84, + 0x1E947: 84, + 0x1E948: 84, + 0x1E949: 84, + 0x1E94A: 84, + 0x1E94B: 84, + 0xE0001: 84, + 0xE0020: 84, + 0xE0021: 84, + 0xE0022: 84, + 0xE0023: 84, + 0xE0024: 84, + 0xE0025: 84, + 0xE0026: 84, + 0xE0027: 84, + 0xE0028: 84, + 0xE0029: 84, + 0xE002A: 84, + 0xE002B: 84, + 0xE002C: 84, + 0xE002D: 84, + 0xE002E: 84, + 0xE002F: 84, + 0xE0030: 84, + 0xE0031: 84, + 0xE0032: 84, + 0xE0033: 84, + 0xE0034: 84, + 0xE0035: 84, + 0xE0036: 84, + 0xE0037: 84, + 0xE0038: 84, + 0xE0039: 84, + 0xE003A: 84, + 0xE003B: 84, + 0xE003C: 84, + 0xE003D: 84, + 0xE003E: 84, + 0xE003F: 84, + 0xE0040: 84, + 0xE0041: 84, + 0xE0042: 84, + 0xE0043: 84, + 0xE0044: 84, + 0xE0045: 84, + 0xE0046: 84, + 0xE0047: 84, + 0xE0048: 84, + 0xE0049: 84, + 0xE004A: 84, + 0xE004B: 84, + 0xE004C: 84, + 0xE004D: 84, + 0xE004E: 84, + 0xE004F: 84, + 0xE0050: 84, + 0xE0051: 84, + 0xE0052: 84, + 0xE0053: 84, + 0xE0054: 84, + 0xE0055: 84, + 0xE0056: 84, + 0xE0057: 84, + 0xE0058: 84, + 0xE0059: 84, + 0xE005A: 84, + 0xE005B: 84, + 0xE005C: 84, + 0xE005D: 84, + 0xE005E: 84, + 0xE005F: 84, + 0xE0060: 84, + 0xE0061: 84, + 0xE0062: 84, + 0xE0063: 84, + 0xE0064: 84, + 0xE0065: 84, + 0xE0066: 84, + 0xE0067: 84, + 0xE0068: 84, + 0xE0069: 84, + 0xE006A: 84, + 0xE006B: 84, + 0xE006C: 84, + 0xE006D: 84, + 0xE006E: 84, + 0xE006F: 84, + 0xE0070: 84, + 0xE0071: 84, + 0xE0072: 84, + 0xE0073: 84, + 0xE0074: 84, + 0xE0075: 84, + 0xE0076: 84, + 0xE0077: 84, + 0xE0078: 84, + 0xE0079: 84, + 0xE007A: 84, + 0xE007B: 84, + 0xE007C: 84, + 0xE007D: 84, + 0xE007E: 84, + 0xE007F: 84, + 0xE0100: 84, + 0xE0101: 84, + 0xE0102: 84, + 0xE0103: 84, + 0xE0104: 84, + 0xE0105: 84, + 0xE0106: 84, + 0xE0107: 84, + 0xE0108: 84, + 0xE0109: 84, + 0xE010A: 84, + 0xE010B: 84, + 0xE010C: 84, + 0xE010D: 84, + 0xE010E: 84, + 0xE010F: 84, + 0xE0110: 84, + 0xE0111: 84, + 0xE0112: 84, + 0xE0113: 84, + 0xE0114: 84, + 0xE0115: 84, + 0xE0116: 84, + 0xE0117: 84, + 0xE0118: 84, + 0xE0119: 84, + 0xE011A: 84, + 0xE011B: 84, + 0xE011C: 84, + 0xE011D: 84, + 0xE011E: 84, + 0xE011F: 84, + 0xE0120: 84, + 0xE0121: 84, + 0xE0122: 84, + 0xE0123: 84, + 0xE0124: 84, + 0xE0125: 84, + 0xE0126: 84, + 0xE0127: 84, + 0xE0128: 84, + 0xE0129: 84, + 0xE012A: 84, + 0xE012B: 84, + 0xE012C: 84, + 0xE012D: 84, + 0xE012E: 84, + 0xE012F: 84, + 0xE0130: 84, + 0xE0131: 84, + 0xE0132: 84, + 0xE0133: 84, + 0xE0134: 84, + 0xE0135: 84, + 0xE0136: 84, + 0xE0137: 84, + 0xE0138: 84, + 0xE0139: 84, + 0xE013A: 84, + 0xE013B: 84, + 0xE013C: 84, + 0xE013D: 84, + 0xE013E: 84, + 0xE013F: 84, + 0xE0140: 84, + 0xE0141: 84, + 0xE0142: 84, + 0xE0143: 84, + 0xE0144: 84, + 0xE0145: 84, + 0xE0146: 84, + 0xE0147: 84, + 0xE0148: 84, + 0xE0149: 84, + 0xE014A: 84, + 0xE014B: 84, + 0xE014C: 84, + 0xE014D: 84, + 0xE014E: 84, + 0xE014F: 84, + 0xE0150: 84, + 0xE0151: 84, + 0xE0152: 84, + 0xE0153: 84, + 0xE0154: 84, + 0xE0155: 84, + 0xE0156: 84, + 0xE0157: 84, + 0xE0158: 84, + 0xE0159: 84, + 0xE015A: 84, + 0xE015B: 84, + 0xE015C: 84, + 0xE015D: 84, + 0xE015E: 84, + 0xE015F: 84, + 0xE0160: 84, + 0xE0161: 84, + 0xE0162: 84, + 0xE0163: 84, + 0xE0164: 84, + 0xE0165: 84, + 0xE0166: 84, + 0xE0167: 84, + 0xE0168: 84, + 0xE0169: 84, + 0xE016A: 84, + 0xE016B: 84, + 0xE016C: 84, + 0xE016D: 84, + 0xE016E: 84, + 0xE016F: 84, + 0xE0170: 84, + 0xE0171: 84, + 0xE0172: 84, + 0xE0173: 84, + 0xE0174: 84, + 0xE0175: 84, + 0xE0176: 84, + 0xE0177: 84, + 0xE0178: 84, + 0xE0179: 84, + 0xE017A: 84, + 0xE017B: 84, + 0xE017C: 84, + 0xE017D: 84, + 0xE017E: 84, + 0xE017F: 84, + 0xE0180: 84, + 0xE0181: 84, + 0xE0182: 84, + 0xE0183: 84, + 0xE0184: 84, + 0xE0185: 84, + 0xE0186: 84, + 0xE0187: 84, + 0xE0188: 84, + 0xE0189: 84, + 0xE018A: 84, + 0xE018B: 84, + 0xE018C: 84, + 0xE018D: 84, + 0xE018E: 84, + 0xE018F: 84, + 0xE0190: 84, + 0xE0191: 84, + 0xE0192: 84, + 0xE0193: 84, + 0xE0194: 84, + 0xE0195: 84, + 0xE0196: 84, + 0xE0197: 84, + 0xE0198: 84, + 0xE0199: 84, + 0xE019A: 84, + 0xE019B: 84, + 0xE019C: 84, + 0xE019D: 84, + 0xE019E: 84, + 0xE019F: 84, + 0xE01A0: 84, + 0xE01A1: 84, + 0xE01A2: 84, + 0xE01A3: 84, + 0xE01A4: 84, + 0xE01A5: 84, + 0xE01A6: 84, + 0xE01A7: 84, + 0xE01A8: 84, + 0xE01A9: 84, + 0xE01AA: 84, + 0xE01AB: 84, + 0xE01AC: 84, + 0xE01AD: 84, + 0xE01AE: 84, + 0xE01AF: 84, + 0xE01B0: 84, + 0xE01B1: 84, + 0xE01B2: 84, + 0xE01B3: 84, + 0xE01B4: 84, + 0xE01B5: 84, + 0xE01B6: 84, + 0xE01B7: 84, + 0xE01B8: 84, + 0xE01B9: 84, + 0xE01BA: 84, + 0xE01BB: 84, + 0xE01BC: 84, + 0xE01BD: 84, + 0xE01BE: 84, + 0xE01BF: 84, + 0xE01C0: 84, + 0xE01C1: 84, + 0xE01C2: 84, + 0xE01C3: 84, + 0xE01C4: 84, + 0xE01C5: 84, + 0xE01C6: 84, + 0xE01C7: 84, + 0xE01C8: 84, + 0xE01C9: 84, + 0xE01CA: 84, + 0xE01CB: 84, + 0xE01CC: 84, + 0xE01CD: 84, + 0xE01CE: 84, + 0xE01CF: 84, + 0xE01D0: 84, + 0xE01D1: 84, + 0xE01D2: 84, + 0xE01D3: 84, + 0xE01D4: 84, + 0xE01D5: 84, + 0xE01D6: 84, + 0xE01D7: 84, + 0xE01D8: 84, + 0xE01D9: 84, + 0xE01DA: 84, + 0xE01DB: 84, + 0xE01DC: 84, + 0xE01DD: 84, + 0xE01DE: 84, + 0xE01DF: 84, + 0xE01E0: 84, + 0xE01E1: 84, + 0xE01E2: 84, + 0xE01E3: 84, + 0xE01E4: 84, + 0xE01E5: 84, + 0xE01E6: 84, + 0xE01E7: 84, + 0xE01E8: 84, + 0xE01E9: 84, + 0xE01EA: 84, + 0xE01EB: 84, + 0xE01EC: 84, + 0xE01ED: 84, + 0xE01EE: 84, + 0xE01EF: 84, +} +codepoint_classes = { + "PVALID": ( + 0x2D0000002E, + 0x300000003A, + 0x610000007B, + 0xDF000000F7, + 0xF800000100, + 0x10100000102, + 0x10300000104, + 0x10500000106, + 0x10700000108, + 0x1090000010A, + 0x10B0000010C, + 0x10D0000010E, + 0x10F00000110, + 0x11100000112, + 0x11300000114, + 0x11500000116, + 0x11700000118, + 0x1190000011A, + 0x11B0000011C, + 0x11D0000011E, + 0x11F00000120, + 0x12100000122, + 0x12300000124, + 0x12500000126, + 0x12700000128, + 0x1290000012A, + 0x12B0000012C, + 0x12D0000012E, + 0x12F00000130, + 0x13100000132, + 0x13500000136, + 0x13700000139, + 0x13A0000013B, + 0x13C0000013D, + 0x13E0000013F, + 0x14200000143, + 0x14400000145, + 0x14600000147, + 0x14800000149, + 0x14B0000014C, + 0x14D0000014E, + 0x14F00000150, + 0x15100000152, + 0x15300000154, + 0x15500000156, + 0x15700000158, + 0x1590000015A, + 0x15B0000015C, + 0x15D0000015E, + 0x15F00000160, + 0x16100000162, + 0x16300000164, + 0x16500000166, + 0x16700000168, + 0x1690000016A, + 0x16B0000016C, + 0x16D0000016E, + 0x16F00000170, + 0x17100000172, + 0x17300000174, + 0x17500000176, + 0x17700000178, + 0x17A0000017B, + 0x17C0000017D, + 0x17E0000017F, + 0x18000000181, + 0x18300000184, + 0x18500000186, + 0x18800000189, + 0x18C0000018E, + 0x19200000193, + 0x19500000196, + 0x1990000019C, + 0x19E0000019F, + 0x1A1000001A2, + 0x1A3000001A4, + 0x1A5000001A6, + 0x1A8000001A9, + 0x1AA000001AC, + 0x1AD000001AE, + 0x1B0000001B1, + 0x1B4000001B5, + 0x1B6000001B7, + 0x1B9000001BC, + 0x1BD000001C4, + 0x1CE000001CF, + 0x1D0000001D1, + 0x1D2000001D3, + 0x1D4000001D5, + 0x1D6000001D7, + 0x1D8000001D9, + 0x1DA000001DB, + 0x1DC000001DE, + 0x1DF000001E0, + 0x1E1000001E2, + 0x1E3000001E4, + 0x1E5000001E6, + 0x1E7000001E8, + 0x1E9000001EA, + 0x1EB000001EC, + 0x1ED000001EE, + 0x1EF000001F1, + 0x1F5000001F6, + 0x1F9000001FA, + 0x1FB000001FC, + 0x1FD000001FE, + 0x1FF00000200, + 0x20100000202, + 0x20300000204, + 0x20500000206, + 0x20700000208, + 0x2090000020A, + 0x20B0000020C, + 0x20D0000020E, + 0x20F00000210, + 0x21100000212, + 0x21300000214, + 0x21500000216, + 0x21700000218, + 0x2190000021A, + 0x21B0000021C, + 0x21D0000021E, + 0x21F00000220, + 0x22100000222, + 0x22300000224, + 0x22500000226, + 0x22700000228, + 0x2290000022A, + 0x22B0000022C, + 0x22D0000022E, + 0x22F00000230, + 0x23100000232, + 0x2330000023A, + 0x23C0000023D, + 0x23F00000241, + 0x24200000243, + 0x24700000248, + 0x2490000024A, + 0x24B0000024C, + 0x24D0000024E, + 0x24F000002B0, + 0x2B9000002C2, + 0x2C6000002D2, + 0x2EC000002ED, + 0x2EE000002EF, + 0x30000000340, + 0x34200000343, + 0x3460000034F, + 0x35000000370, + 0x37100000372, + 0x37300000374, + 0x37700000378, + 0x37B0000037E, + 0x39000000391, + 0x3AC000003CF, + 0x3D7000003D8, + 0x3D9000003DA, + 0x3DB000003DC, + 0x3DD000003DE, + 0x3DF000003E0, + 0x3E1000003E2, + 0x3E3000003E4, + 0x3E5000003E6, + 0x3E7000003E8, + 0x3E9000003EA, + 0x3EB000003EC, + 0x3ED000003EE, + 0x3EF000003F0, + 0x3F3000003F4, + 0x3F8000003F9, + 0x3FB000003FD, + 0x43000000460, + 0x46100000462, + 0x46300000464, + 0x46500000466, + 0x46700000468, + 0x4690000046A, + 0x46B0000046C, + 0x46D0000046E, + 0x46F00000470, + 0x47100000472, + 0x47300000474, + 0x47500000476, + 0x47700000478, + 0x4790000047A, + 0x47B0000047C, + 0x47D0000047E, + 0x47F00000480, + 0x48100000482, + 0x48300000488, + 0x48B0000048C, + 0x48D0000048E, + 0x48F00000490, + 0x49100000492, + 0x49300000494, + 0x49500000496, + 0x49700000498, + 0x4990000049A, + 0x49B0000049C, + 0x49D0000049E, + 0x49F000004A0, + 0x4A1000004A2, + 0x4A3000004A4, + 0x4A5000004A6, + 0x4A7000004A8, + 0x4A9000004AA, + 0x4AB000004AC, + 0x4AD000004AE, + 0x4AF000004B0, + 0x4B1000004B2, + 0x4B3000004B4, + 0x4B5000004B6, + 0x4B7000004B8, + 0x4B9000004BA, + 0x4BB000004BC, + 0x4BD000004BE, + 0x4BF000004C0, + 0x4C2000004C3, + 0x4C4000004C5, + 0x4C6000004C7, + 0x4C8000004C9, + 0x4CA000004CB, + 0x4CC000004CD, + 0x4CE000004D0, + 0x4D1000004D2, + 0x4D3000004D4, + 0x4D5000004D6, + 0x4D7000004D8, + 0x4D9000004DA, + 0x4DB000004DC, + 0x4DD000004DE, + 0x4DF000004E0, + 0x4E1000004E2, + 0x4E3000004E4, + 0x4E5000004E6, + 0x4E7000004E8, + 0x4E9000004EA, + 0x4EB000004EC, + 0x4ED000004EE, + 0x4EF000004F0, + 0x4F1000004F2, + 0x4F3000004F4, + 0x4F5000004F6, + 0x4F7000004F8, + 0x4F9000004FA, + 0x4FB000004FC, + 0x4FD000004FE, + 0x4FF00000500, + 0x50100000502, + 0x50300000504, + 0x50500000506, + 0x50700000508, + 0x5090000050A, + 0x50B0000050C, + 0x50D0000050E, + 0x50F00000510, + 0x51100000512, + 0x51300000514, + 0x51500000516, + 0x51700000518, + 0x5190000051A, + 0x51B0000051C, + 0x51D0000051E, + 0x51F00000520, + 0x52100000522, + 0x52300000524, + 0x52500000526, + 0x52700000528, + 0x5290000052A, + 0x52B0000052C, + 0x52D0000052E, + 0x52F00000530, + 0x5590000055A, + 0x56000000587, + 0x58800000589, + 0x591000005BE, + 0x5BF000005C0, + 0x5C1000005C3, + 0x5C4000005C6, + 0x5C7000005C8, + 0x5D0000005EB, + 0x5EF000005F3, + 0x6100000061B, + 0x62000000640, + 0x64100000660, + 0x66E00000675, + 0x679000006D4, + 0x6D5000006DD, + 0x6DF000006E9, + 0x6EA000006F0, + 0x6FA00000700, + 0x7100000074B, + 0x74D000007B2, + 0x7C0000007F6, + 0x7FD000007FE, + 0x8000000082E, + 0x8400000085C, + 0x8600000086B, + 0x87000000888, + 0x8890000088F, + 0x897000008E2, + 0x8E300000958, + 0x96000000964, + 0x96600000970, + 0x97100000984, + 0x9850000098D, + 0x98F00000991, + 0x993000009A9, + 0x9AA000009B1, + 0x9B2000009B3, + 0x9B6000009BA, + 0x9BC000009C5, + 0x9C7000009C9, + 0x9CB000009CF, + 0x9D7000009D8, + 0x9E0000009E4, + 0x9E6000009F2, + 0x9FC000009FD, + 0x9FE000009FF, + 0xA0100000A04, + 0xA0500000A0B, + 0xA0F00000A11, + 0xA1300000A29, + 0xA2A00000A31, + 0xA3200000A33, + 0xA3500000A36, + 0xA3800000A3A, + 0xA3C00000A3D, + 0xA3E00000A43, + 0xA4700000A49, + 0xA4B00000A4E, + 0xA5100000A52, + 0xA5C00000A5D, + 0xA6600000A76, + 0xA8100000A84, + 0xA8500000A8E, + 0xA8F00000A92, + 0xA9300000AA9, + 0xAAA00000AB1, + 0xAB200000AB4, + 0xAB500000ABA, + 0xABC00000AC6, + 0xAC700000ACA, + 0xACB00000ACE, + 0xAD000000AD1, + 0xAE000000AE4, + 0xAE600000AF0, + 0xAF900000B00, + 0xB0100000B04, + 0xB0500000B0D, + 0xB0F00000B11, + 0xB1300000B29, + 0xB2A00000B31, + 0xB3200000B34, + 0xB3500000B3A, + 0xB3C00000B45, + 0xB4700000B49, + 0xB4B00000B4E, + 0xB5500000B58, + 0xB5F00000B64, + 0xB6600000B70, + 0xB7100000B72, + 0xB8200000B84, + 0xB8500000B8B, + 0xB8E00000B91, + 0xB9200000B96, + 0xB9900000B9B, + 0xB9C00000B9D, + 0xB9E00000BA0, + 0xBA300000BA5, + 0xBA800000BAB, + 0xBAE00000BBA, + 0xBBE00000BC3, + 0xBC600000BC9, + 0xBCA00000BCE, + 0xBD000000BD1, + 0xBD700000BD8, + 0xBE600000BF0, + 0xC0000000C0D, + 0xC0E00000C11, + 0xC1200000C29, + 0xC2A00000C3A, + 0xC3C00000C45, + 0xC4600000C49, + 0xC4A00000C4E, + 0xC5500000C57, + 0xC5800000C5B, + 0xC5D00000C5E, + 0xC6000000C64, + 0xC6600000C70, + 0xC8000000C84, + 0xC8500000C8D, + 0xC8E00000C91, + 0xC9200000CA9, + 0xCAA00000CB4, + 0xCB500000CBA, + 0xCBC00000CC5, + 0xCC600000CC9, + 0xCCA00000CCE, + 0xCD500000CD7, + 0xCDD00000CDF, + 0xCE000000CE4, + 0xCE600000CF0, + 0xCF100000CF4, + 0xD0000000D0D, + 0xD0E00000D11, + 0xD1200000D45, + 0xD4600000D49, + 0xD4A00000D4F, + 0xD5400000D58, + 0xD5F00000D64, + 0xD6600000D70, + 0xD7A00000D80, + 0xD8100000D84, + 0xD8500000D97, + 0xD9A00000DB2, + 0xDB300000DBC, + 0xDBD00000DBE, + 0xDC000000DC7, + 0xDCA00000DCB, + 0xDCF00000DD5, + 0xDD600000DD7, + 0xDD800000DE0, + 0xDE600000DF0, + 0xDF200000DF4, + 0xE0100000E33, + 0xE3400000E3B, + 0xE4000000E4F, + 0xE5000000E5A, + 0xE8100000E83, + 0xE8400000E85, + 0xE8600000E8B, + 0xE8C00000EA4, + 0xEA500000EA6, + 0xEA700000EB3, + 0xEB400000EBE, + 0xEC000000EC5, + 0xEC600000EC7, + 0xEC800000ECF, + 0xED000000EDA, + 0xEDE00000EE0, + 0xF0000000F01, + 0xF0B00000F0C, + 0xF1800000F1A, + 0xF2000000F2A, + 0xF3500000F36, + 0xF3700000F38, + 0xF3900000F3A, + 0xF3E00000F43, + 0xF4400000F48, + 0xF4900000F4D, + 0xF4E00000F52, + 0xF5300000F57, + 0xF5800000F5C, + 0xF5D00000F69, + 0xF6A00000F6D, + 0xF7100000F73, + 0xF7400000F75, + 0xF7A00000F81, + 0xF8200000F85, + 0xF8600000F93, + 0xF9400000F98, + 0xF9900000F9D, + 0xF9E00000FA2, + 0xFA300000FA7, + 0xFA800000FAC, + 0xFAD00000FB9, + 0xFBA00000FBD, + 0xFC600000FC7, + 0x10000000104A, + 0x10500000109E, + 0x10D0000010FB, + 0x10FD00001100, + 0x120000001249, + 0x124A0000124E, + 0x125000001257, + 0x125800001259, + 0x125A0000125E, + 0x126000001289, + 0x128A0000128E, + 0x1290000012B1, + 0x12B2000012B6, + 0x12B8000012BF, + 0x12C0000012C1, + 0x12C2000012C6, + 0x12C8000012D7, + 0x12D800001311, + 0x131200001316, + 0x13180000135B, + 0x135D00001360, + 0x138000001390, + 0x13A0000013F6, + 0x14010000166D, + 0x166F00001680, + 0x16810000169B, + 0x16A0000016EB, + 0x16F1000016F9, + 0x170000001716, + 0x171F00001735, + 0x174000001754, + 0x17600000176D, + 0x176E00001771, + 0x177200001774, + 0x1780000017B4, + 0x17B6000017D4, + 0x17D7000017D8, + 0x17DC000017DE, + 0x17E0000017EA, + 0x18100000181A, + 0x182000001879, + 0x1880000018AB, + 0x18B0000018F6, + 0x19000000191F, + 0x19200000192C, + 0x19300000193C, + 0x19460000196E, + 0x197000001975, + 0x1980000019AC, + 0x19B0000019CA, + 0x19D0000019DA, + 0x1A0000001A1C, + 0x1A2000001A5F, + 0x1A6000001A7D, + 0x1A7F00001A8A, + 0x1A9000001A9A, + 0x1AA700001AA8, + 0x1AB000001ABE, + 0x1ABF00001ACF, + 0x1B0000001B4D, + 0x1B5000001B5A, + 0x1B6B00001B74, + 0x1B8000001BF4, + 0x1C0000001C38, + 0x1C4000001C4A, + 0x1C4D00001C7E, + 0x1C8A00001C8B, + 0x1CD000001CD3, + 0x1CD400001CFB, + 0x1D0000001D2C, + 0x1D2F00001D30, + 0x1D3B00001D3C, + 0x1D4E00001D4F, + 0x1D6B00001D78, + 0x1D7900001D9B, + 0x1DC000001E00, + 0x1E0100001E02, + 0x1E0300001E04, + 0x1E0500001E06, + 0x1E0700001E08, + 0x1E0900001E0A, + 0x1E0B00001E0C, + 0x1E0D00001E0E, + 0x1E0F00001E10, + 0x1E1100001E12, + 0x1E1300001E14, + 0x1E1500001E16, + 0x1E1700001E18, + 0x1E1900001E1A, + 0x1E1B00001E1C, + 0x1E1D00001E1E, + 0x1E1F00001E20, + 0x1E2100001E22, + 0x1E2300001E24, + 0x1E2500001E26, + 0x1E2700001E28, + 0x1E2900001E2A, + 0x1E2B00001E2C, + 0x1E2D00001E2E, + 0x1E2F00001E30, + 0x1E3100001E32, + 0x1E3300001E34, + 0x1E3500001E36, + 0x1E3700001E38, + 0x1E3900001E3A, + 0x1E3B00001E3C, + 0x1E3D00001E3E, + 0x1E3F00001E40, + 0x1E4100001E42, + 0x1E4300001E44, + 0x1E4500001E46, + 0x1E4700001E48, + 0x1E4900001E4A, + 0x1E4B00001E4C, + 0x1E4D00001E4E, + 0x1E4F00001E50, + 0x1E5100001E52, + 0x1E5300001E54, + 0x1E5500001E56, + 0x1E5700001E58, + 0x1E5900001E5A, + 0x1E5B00001E5C, + 0x1E5D00001E5E, + 0x1E5F00001E60, + 0x1E6100001E62, + 0x1E6300001E64, + 0x1E6500001E66, + 0x1E6700001E68, + 0x1E6900001E6A, + 0x1E6B00001E6C, + 0x1E6D00001E6E, + 0x1E6F00001E70, + 0x1E7100001E72, + 0x1E7300001E74, + 0x1E7500001E76, + 0x1E7700001E78, + 0x1E7900001E7A, + 0x1E7B00001E7C, + 0x1E7D00001E7E, + 0x1E7F00001E80, + 0x1E8100001E82, + 0x1E8300001E84, + 0x1E8500001E86, + 0x1E8700001E88, + 0x1E8900001E8A, + 0x1E8B00001E8C, + 0x1E8D00001E8E, + 0x1E8F00001E90, + 0x1E9100001E92, + 0x1E9300001E94, + 0x1E9500001E9A, + 0x1E9C00001E9E, + 0x1E9F00001EA0, + 0x1EA100001EA2, + 0x1EA300001EA4, + 0x1EA500001EA6, + 0x1EA700001EA8, + 0x1EA900001EAA, + 0x1EAB00001EAC, + 0x1EAD00001EAE, + 0x1EAF00001EB0, + 0x1EB100001EB2, + 0x1EB300001EB4, + 0x1EB500001EB6, + 0x1EB700001EB8, + 0x1EB900001EBA, + 0x1EBB00001EBC, + 0x1EBD00001EBE, + 0x1EBF00001EC0, + 0x1EC100001EC2, + 0x1EC300001EC4, + 0x1EC500001EC6, + 0x1EC700001EC8, + 0x1EC900001ECA, + 0x1ECB00001ECC, + 0x1ECD00001ECE, + 0x1ECF00001ED0, + 0x1ED100001ED2, + 0x1ED300001ED4, + 0x1ED500001ED6, + 0x1ED700001ED8, + 0x1ED900001EDA, + 0x1EDB00001EDC, + 0x1EDD00001EDE, + 0x1EDF00001EE0, + 0x1EE100001EE2, + 0x1EE300001EE4, + 0x1EE500001EE6, + 0x1EE700001EE8, + 0x1EE900001EEA, + 0x1EEB00001EEC, + 0x1EED00001EEE, + 0x1EEF00001EF0, + 0x1EF100001EF2, + 0x1EF300001EF4, + 0x1EF500001EF6, + 0x1EF700001EF8, + 0x1EF900001EFA, + 0x1EFB00001EFC, + 0x1EFD00001EFE, + 0x1EFF00001F08, + 0x1F1000001F16, + 0x1F2000001F28, + 0x1F3000001F38, + 0x1F4000001F46, + 0x1F5000001F58, + 0x1F6000001F68, + 0x1F7000001F71, + 0x1F7200001F73, + 0x1F7400001F75, + 0x1F7600001F77, + 0x1F7800001F79, + 0x1F7A00001F7B, + 0x1F7C00001F7D, + 0x1FB000001FB2, + 0x1FB600001FB7, + 0x1FC600001FC7, + 0x1FD000001FD3, + 0x1FD600001FD8, + 0x1FE000001FE3, + 0x1FE400001FE8, + 0x1FF600001FF7, + 0x214E0000214F, + 0x218400002185, + 0x2C3000002C60, + 0x2C6100002C62, + 0x2C6500002C67, + 0x2C6800002C69, + 0x2C6A00002C6B, + 0x2C6C00002C6D, + 0x2C7100002C72, + 0x2C7300002C75, + 0x2C7600002C7C, + 0x2C8100002C82, + 0x2C8300002C84, + 0x2C8500002C86, + 0x2C8700002C88, + 0x2C8900002C8A, + 0x2C8B00002C8C, + 0x2C8D00002C8E, + 0x2C8F00002C90, + 0x2C9100002C92, + 0x2C9300002C94, + 0x2C9500002C96, + 0x2C9700002C98, + 0x2C9900002C9A, + 0x2C9B00002C9C, + 0x2C9D00002C9E, + 0x2C9F00002CA0, + 0x2CA100002CA2, + 0x2CA300002CA4, + 0x2CA500002CA6, + 0x2CA700002CA8, + 0x2CA900002CAA, + 0x2CAB00002CAC, + 0x2CAD00002CAE, + 0x2CAF00002CB0, + 0x2CB100002CB2, + 0x2CB300002CB4, + 0x2CB500002CB6, + 0x2CB700002CB8, + 0x2CB900002CBA, + 0x2CBB00002CBC, + 0x2CBD00002CBE, + 0x2CBF00002CC0, + 0x2CC100002CC2, + 0x2CC300002CC4, + 0x2CC500002CC6, + 0x2CC700002CC8, + 0x2CC900002CCA, + 0x2CCB00002CCC, + 0x2CCD00002CCE, + 0x2CCF00002CD0, + 0x2CD100002CD2, + 0x2CD300002CD4, + 0x2CD500002CD6, + 0x2CD700002CD8, + 0x2CD900002CDA, + 0x2CDB00002CDC, + 0x2CDD00002CDE, + 0x2CDF00002CE0, + 0x2CE100002CE2, + 0x2CE300002CE5, + 0x2CEC00002CED, + 0x2CEE00002CF2, + 0x2CF300002CF4, + 0x2D0000002D26, + 0x2D2700002D28, + 0x2D2D00002D2E, + 0x2D3000002D68, + 0x2D7F00002D97, + 0x2DA000002DA7, + 0x2DA800002DAF, + 0x2DB000002DB7, + 0x2DB800002DBF, + 0x2DC000002DC7, + 0x2DC800002DCF, + 0x2DD000002DD7, + 0x2DD800002DDF, + 0x2DE000002E00, + 0x2E2F00002E30, + 0x300500003008, + 0x302A0000302E, + 0x303C0000303D, + 0x304100003097, + 0x30990000309B, + 0x309D0000309F, + 0x30A1000030FB, + 0x30FC000030FF, + 0x310500003130, + 0x31A0000031C0, + 0x31F000003200, + 0x340000004DC0, + 0x4E000000A48D, + 0xA4D00000A4FE, + 0xA5000000A60D, + 0xA6100000A62C, + 0xA6410000A642, + 0xA6430000A644, + 0xA6450000A646, + 0xA6470000A648, + 0xA6490000A64A, + 0xA64B0000A64C, + 0xA64D0000A64E, + 0xA64F0000A650, + 0xA6510000A652, + 0xA6530000A654, + 0xA6550000A656, + 0xA6570000A658, + 0xA6590000A65A, + 0xA65B0000A65C, + 0xA65D0000A65E, + 0xA65F0000A660, + 0xA6610000A662, + 0xA6630000A664, + 0xA6650000A666, + 0xA6670000A668, + 0xA6690000A66A, + 0xA66B0000A66C, + 0xA66D0000A670, + 0xA6740000A67E, + 0xA67F0000A680, + 0xA6810000A682, + 0xA6830000A684, + 0xA6850000A686, + 0xA6870000A688, + 0xA6890000A68A, + 0xA68B0000A68C, + 0xA68D0000A68E, + 0xA68F0000A690, + 0xA6910000A692, + 0xA6930000A694, + 0xA6950000A696, + 0xA6970000A698, + 0xA6990000A69A, + 0xA69B0000A69C, + 0xA69E0000A6E6, + 0xA6F00000A6F2, + 0xA7170000A720, + 0xA7230000A724, + 0xA7250000A726, + 0xA7270000A728, + 0xA7290000A72A, + 0xA72B0000A72C, + 0xA72D0000A72E, + 0xA72F0000A732, + 0xA7330000A734, + 0xA7350000A736, + 0xA7370000A738, + 0xA7390000A73A, + 0xA73B0000A73C, + 0xA73D0000A73E, + 0xA73F0000A740, + 0xA7410000A742, + 0xA7430000A744, + 0xA7450000A746, + 0xA7470000A748, + 0xA7490000A74A, + 0xA74B0000A74C, + 0xA74D0000A74E, + 0xA74F0000A750, + 0xA7510000A752, + 0xA7530000A754, + 0xA7550000A756, + 0xA7570000A758, + 0xA7590000A75A, + 0xA75B0000A75C, + 0xA75D0000A75E, + 0xA75F0000A760, + 0xA7610000A762, + 0xA7630000A764, + 0xA7650000A766, + 0xA7670000A768, + 0xA7690000A76A, + 0xA76B0000A76C, + 0xA76D0000A76E, + 0xA76F0000A770, + 0xA7710000A779, + 0xA77A0000A77B, + 0xA77C0000A77D, + 0xA77F0000A780, + 0xA7810000A782, + 0xA7830000A784, + 0xA7850000A786, + 0xA7870000A789, + 0xA78C0000A78D, + 0xA78E0000A790, + 0xA7910000A792, + 0xA7930000A796, + 0xA7970000A798, + 0xA7990000A79A, + 0xA79B0000A79C, + 0xA79D0000A79E, + 0xA79F0000A7A0, + 0xA7A10000A7A2, + 0xA7A30000A7A4, + 0xA7A50000A7A6, + 0xA7A70000A7A8, + 0xA7A90000A7AA, + 0xA7AF0000A7B0, + 0xA7B50000A7B6, + 0xA7B70000A7B8, + 0xA7B90000A7BA, + 0xA7BB0000A7BC, + 0xA7BD0000A7BE, + 0xA7BF0000A7C0, + 0xA7C10000A7C2, + 0xA7C30000A7C4, + 0xA7C80000A7C9, + 0xA7CA0000A7CB, + 0xA7CD0000A7CE, + 0xA7D10000A7D2, + 0xA7D30000A7D4, + 0xA7D50000A7D6, + 0xA7D70000A7D8, + 0xA7D90000A7DA, + 0xA7DB0000A7DC, + 0xA7F60000A7F8, + 0xA7FA0000A828, + 0xA82C0000A82D, + 0xA8400000A874, + 0xA8800000A8C6, + 0xA8D00000A8DA, + 0xA8E00000A8F8, + 0xA8FB0000A8FC, + 0xA8FD0000A92E, + 0xA9300000A954, + 0xA9800000A9C1, + 0xA9CF0000A9DA, + 0xA9E00000A9FF, + 0xAA000000AA37, + 0xAA400000AA4E, + 0xAA500000AA5A, + 0xAA600000AA77, + 0xAA7A0000AAC3, + 0xAADB0000AADE, + 0xAAE00000AAF0, + 0xAAF20000AAF7, + 0xAB010000AB07, + 0xAB090000AB0F, + 0xAB110000AB17, + 0xAB200000AB27, + 0xAB280000AB2F, + 0xAB300000AB5B, + 0xAB600000AB69, + 0xABC00000ABEB, + 0xABEC0000ABEE, + 0xABF00000ABFA, + 0xAC000000D7A4, + 0xFA0E0000FA10, + 0xFA110000FA12, + 0xFA130000FA15, + 0xFA1F0000FA20, + 0xFA210000FA22, + 0xFA230000FA25, + 0xFA270000FA2A, + 0xFB1E0000FB1F, + 0xFE200000FE30, + 0xFE730000FE74, + 0x100000001000C, + 0x1000D00010027, + 0x100280001003B, + 0x1003C0001003E, + 0x1003F0001004E, + 0x100500001005E, + 0x10080000100FB, + 0x101FD000101FE, + 0x102800001029D, + 0x102A0000102D1, + 0x102E0000102E1, + 0x1030000010320, + 0x1032D00010341, + 0x103420001034A, + 0x103500001037B, + 0x103800001039E, + 0x103A0000103C4, + 0x103C8000103D0, + 0x104280001049E, + 0x104A0000104AA, + 0x104D8000104FC, + 0x1050000010528, + 0x1053000010564, + 0x10597000105A2, + 0x105A3000105B2, + 0x105B3000105BA, + 0x105BB000105BD, + 0x105C0000105F4, + 0x1060000010737, + 0x1074000010756, + 0x1076000010768, + 0x1078000010781, + 0x1080000010806, + 0x1080800010809, + 0x1080A00010836, + 0x1083700010839, + 0x1083C0001083D, + 0x1083F00010856, + 0x1086000010877, + 0x108800001089F, + 0x108E0000108F3, + 0x108F4000108F6, + 0x1090000010916, + 0x109200001093A, + 0x10980000109B8, + 0x109BE000109C0, + 0x10A0000010A04, + 0x10A0500010A07, + 0x10A0C00010A14, + 0x10A1500010A18, + 0x10A1900010A36, + 0x10A3800010A3B, + 0x10A3F00010A40, + 0x10A6000010A7D, + 0x10A8000010A9D, + 0x10AC000010AC8, + 0x10AC900010AE7, + 0x10B0000010B36, + 0x10B4000010B56, + 0x10B6000010B73, + 0x10B8000010B92, + 0x10C0000010C49, + 0x10CC000010CF3, + 0x10D0000010D28, + 0x10D3000010D3A, + 0x10D4000010D50, + 0x10D6900010D6E, + 0x10D6F00010D86, + 0x10E8000010EAA, + 0x10EAB00010EAD, + 0x10EB000010EB2, + 0x10EC200010EC5, + 0x10EFC00010F1D, + 0x10F2700010F28, + 0x10F3000010F51, + 0x10F7000010F86, + 0x10FB000010FC5, + 0x10FE000010FF7, + 0x1100000011047, + 0x1106600011076, + 0x1107F000110BB, + 0x110C2000110C3, + 0x110D0000110E9, + 0x110F0000110FA, + 0x1110000011135, + 0x1113600011140, + 0x1114400011148, + 0x1115000011174, + 0x1117600011177, + 0x11180000111C5, + 0x111C9000111CD, + 0x111CE000111DB, + 0x111DC000111DD, + 0x1120000011212, + 0x1121300011238, + 0x1123E00011242, + 0x1128000011287, + 0x1128800011289, + 0x1128A0001128E, + 0x1128F0001129E, + 0x1129F000112A9, + 0x112B0000112EB, + 0x112F0000112FA, + 0x1130000011304, + 0x113050001130D, + 0x1130F00011311, + 0x1131300011329, + 0x1132A00011331, + 0x1133200011334, + 0x113350001133A, + 0x1133B00011345, + 0x1134700011349, + 0x1134B0001134E, + 0x1135000011351, + 0x1135700011358, + 0x1135D00011364, + 0x113660001136D, + 0x1137000011375, + 0x113800001138A, + 0x1138B0001138C, + 0x1138E0001138F, + 0x11390000113B6, + 0x113B7000113C1, + 0x113C2000113C3, + 0x113C5000113C6, + 0x113C7000113CB, + 0x113CC000113D4, + 0x113E1000113E3, + 0x114000001144B, + 0x114500001145A, + 0x1145E00011462, + 0x11480000114C6, + 0x114C7000114C8, + 0x114D0000114DA, + 0x11580000115B6, + 0x115B8000115C1, + 0x115D8000115DE, + 0x1160000011641, + 0x1164400011645, + 0x116500001165A, + 0x11680000116B9, + 0x116C0000116CA, + 0x116D0000116E4, + 0x117000001171B, + 0x1171D0001172C, + 0x117300001173A, + 0x1174000011747, + 0x118000001183B, + 0x118C0000118EA, + 0x118FF00011907, + 0x119090001190A, + 0x1190C00011914, + 0x1191500011917, + 0x1191800011936, + 0x1193700011939, + 0x1193B00011944, + 0x119500001195A, + 0x119A0000119A8, + 0x119AA000119D8, + 0x119DA000119E2, + 0x119E3000119E5, + 0x11A0000011A3F, + 0x11A4700011A48, + 0x11A5000011A9A, + 0x11A9D00011A9E, + 0x11AB000011AF9, + 0x11BC000011BE1, + 0x11BF000011BFA, + 0x11C0000011C09, + 0x11C0A00011C37, + 0x11C3800011C41, + 0x11C5000011C5A, + 0x11C7200011C90, + 0x11C9200011CA8, + 0x11CA900011CB7, + 0x11D0000011D07, + 0x11D0800011D0A, + 0x11D0B00011D37, + 0x11D3A00011D3B, + 0x11D3C00011D3E, + 0x11D3F00011D48, + 0x11D5000011D5A, + 0x11D6000011D66, + 0x11D6700011D69, + 0x11D6A00011D8F, + 0x11D9000011D92, + 0x11D9300011D99, + 0x11DA000011DAA, + 0x11EE000011EF7, + 0x11F0000011F11, + 0x11F1200011F3B, + 0x11F3E00011F43, + 0x11F5000011F5B, + 0x11FB000011FB1, + 0x120000001239A, + 0x1248000012544, + 0x12F9000012FF1, + 0x1300000013430, + 0x1344000013456, + 0x13460000143FB, + 0x1440000014647, + 0x161000001613A, + 0x1680000016A39, + 0x16A4000016A5F, + 0x16A6000016A6A, + 0x16A7000016ABF, + 0x16AC000016ACA, + 0x16AD000016AEE, + 0x16AF000016AF5, + 0x16B0000016B37, + 0x16B4000016B44, + 0x16B5000016B5A, + 0x16B6300016B78, + 0x16B7D00016B90, + 0x16D4000016D6D, + 0x16D7000016D7A, + 0x16E6000016E80, + 0x16F0000016F4B, + 0x16F4F00016F88, + 0x16F8F00016FA0, + 0x16FE000016FE2, + 0x16FE300016FE5, + 0x16FF000016FF2, + 0x17000000187F8, + 0x1880000018CD6, + 0x18CFF00018D09, + 0x1AFF00001AFF4, + 0x1AFF50001AFFC, + 0x1AFFD0001AFFF, + 0x1B0000001B123, + 0x1B1320001B133, + 0x1B1500001B153, + 0x1B1550001B156, + 0x1B1640001B168, + 0x1B1700001B2FC, + 0x1BC000001BC6B, + 0x1BC700001BC7D, + 0x1BC800001BC89, + 0x1BC900001BC9A, + 0x1BC9D0001BC9F, + 0x1CCF00001CCFA, + 0x1CF000001CF2E, + 0x1CF300001CF47, + 0x1DA000001DA37, + 0x1DA3B0001DA6D, + 0x1DA750001DA76, + 0x1DA840001DA85, + 0x1DA9B0001DAA0, + 0x1DAA10001DAB0, + 0x1DF000001DF1F, + 0x1DF250001DF2B, + 0x1E0000001E007, + 0x1E0080001E019, + 0x1E01B0001E022, + 0x1E0230001E025, + 0x1E0260001E02B, + 0x1E08F0001E090, + 0x1E1000001E12D, + 0x1E1300001E13E, + 0x1E1400001E14A, + 0x1E14E0001E14F, + 0x1E2900001E2AF, + 0x1E2C00001E2FA, + 0x1E4D00001E4FA, + 0x1E5D00001E5FB, + 0x1E7E00001E7E7, + 0x1E7E80001E7EC, + 0x1E7ED0001E7EF, + 0x1E7F00001E7FF, + 0x1E8000001E8C5, + 0x1E8D00001E8D7, + 0x1E9220001E94C, + 0x1E9500001E95A, + 0x200000002A6E0, + 0x2A7000002B73A, + 0x2B7400002B81E, + 0x2B8200002CEA2, + 0x2CEB00002EBE1, + 0x2EBF00002EE5E, + 0x300000003134B, + 0x31350000323B0, + ), + "CONTEXTJ": (0x200C0000200E,), + "CONTEXTO": ( + 0xB7000000B8, + 0x37500000376, + 0x5F3000005F5, + 0x6600000066A, + 0x6F0000006FA, + 0x30FB000030FC, + ), +} diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/intranges.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/intranges.py new file mode 100644 index 0000000..7bfaa8d --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/intranges.py @@ -0,0 +1,57 @@ +""" +Given a list of integers, made up of (hopefully) a small number of long runs +of consecutive integers, compute a representation of the form +((start1, end1), (start2, end2) ...). Then answer the question "was x present +in the original list?" in time O(log(# runs)). +""" + +import bisect +from typing import List, Tuple + + +def intranges_from_list(list_: List[int]) -> Tuple[int, ...]: + """Represent a list of integers as a sequence of ranges: + ((start_0, end_0), (start_1, end_1), ...), such that the original + integers are exactly those x such that start_i <= x < end_i for some i. + + Ranges are encoded as single integers (start << 32 | end), not as tuples. + """ + + sorted_list = sorted(list_) + ranges = [] + last_write = -1 + for i in range(len(sorted_list)): + if i + 1 < len(sorted_list): + if sorted_list[i] == sorted_list[i + 1] - 1: + continue + current_range = sorted_list[last_write + 1 : i + 1] + ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) + last_write = i + + return tuple(ranges) + + +def _encode_range(start: int, end: int) -> int: + return (start << 32) | end + + +def _decode_range(r: int) -> Tuple[int, int]: + return (r >> 32), (r & ((1 << 32) - 1)) + + +def intranges_contain(int_: int, ranges: Tuple[int, ...]) -> bool: + """Determine if `int_` falls into one of the ranges in `ranges`.""" + tuple_ = _encode_range(int_, 0) + pos = bisect.bisect_left(ranges, tuple_) + # we could be immediately ahead of a tuple (start, end) + # with start < int_ <= end + if pos > 0: + left, right = _decode_range(ranges[pos - 1]) + if left <= int_ < right: + return True + # or we could be immediately behind a tuple (int_, end) + if pos < len(ranges): + left, _ = _decode_range(ranges[pos]) + if left == int_: + return True + return False diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/package_data.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/package_data.py new file mode 100644 index 0000000..7272c8d --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/package_data.py @@ -0,0 +1 @@ +__version__ = "3.11" diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/py.typed b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/uts46data.py b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/uts46data.py new file mode 100644 index 0000000..4610b71 --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/idna/uts46data.py @@ -0,0 +1,8841 @@ +# This file is automatically generated by tools/idna-data +# vim: set fileencoding=utf-8 : + +from typing import List, Tuple, Union + +"""IDNA Mapping Table from UTS46.""" + + +__version__ = "16.0.0" + + +def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x0, "V"), + (0x1, "V"), + (0x2, "V"), + (0x3, "V"), + (0x4, "V"), + (0x5, "V"), + (0x6, "V"), + (0x7, "V"), + (0x8, "V"), + (0x9, "V"), + (0xA, "V"), + (0xB, "V"), + (0xC, "V"), + (0xD, "V"), + (0xE, "V"), + (0xF, "V"), + (0x10, "V"), + (0x11, "V"), + (0x12, "V"), + (0x13, "V"), + (0x14, "V"), + (0x15, "V"), + (0x16, "V"), + (0x17, "V"), + (0x18, "V"), + (0x19, "V"), + (0x1A, "V"), + (0x1B, "V"), + (0x1C, "V"), + (0x1D, "V"), + (0x1E, "V"), + (0x1F, "V"), + (0x20, "V"), + (0x21, "V"), + (0x22, "V"), + (0x23, "V"), + (0x24, "V"), + (0x25, "V"), + (0x26, "V"), + (0x27, "V"), + (0x28, "V"), + (0x29, "V"), + (0x2A, "V"), + (0x2B, "V"), + (0x2C, "V"), + (0x2D, "V"), + (0x2E, "V"), + (0x2F, "V"), + (0x30, "V"), + (0x31, "V"), + (0x32, "V"), + (0x33, "V"), + (0x34, "V"), + (0x35, "V"), + (0x36, "V"), + (0x37, "V"), + (0x38, "V"), + (0x39, "V"), + (0x3A, "V"), + (0x3B, "V"), + (0x3C, "V"), + (0x3D, "V"), + (0x3E, "V"), + (0x3F, "V"), + (0x40, "V"), + (0x41, "M", "a"), + (0x42, "M", "b"), + (0x43, "M", "c"), + (0x44, "M", "d"), + (0x45, "M", "e"), + (0x46, "M", "f"), + (0x47, "M", "g"), + (0x48, "M", "h"), + (0x49, "M", "i"), + (0x4A, "M", "j"), + (0x4B, "M", "k"), + (0x4C, "M", "l"), + (0x4D, "M", "m"), + (0x4E, "M", "n"), + (0x4F, "M", "o"), + (0x50, "M", "p"), + (0x51, "M", "q"), + (0x52, "M", "r"), + (0x53, "M", "s"), + (0x54, "M", "t"), + (0x55, "M", "u"), + (0x56, "M", "v"), + (0x57, "M", "w"), + (0x58, "M", "x"), + (0x59, "M", "y"), + (0x5A, "M", "z"), + (0x5B, "V"), + (0x5C, "V"), + (0x5D, "V"), + (0x5E, "V"), + (0x5F, "V"), + (0x60, "V"), + (0x61, "V"), + (0x62, "V"), + (0x63, "V"), + ] + + +def _seg_1() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x64, "V"), + (0x65, "V"), + (0x66, "V"), + (0x67, "V"), + (0x68, "V"), + (0x69, "V"), + (0x6A, "V"), + (0x6B, "V"), + (0x6C, "V"), + (0x6D, "V"), + (0x6E, "V"), + (0x6F, "V"), + (0x70, "V"), + (0x71, "V"), + (0x72, "V"), + (0x73, "V"), + (0x74, "V"), + (0x75, "V"), + (0x76, "V"), + (0x77, "V"), + (0x78, "V"), + (0x79, "V"), + (0x7A, "V"), + (0x7B, "V"), + (0x7C, "V"), + (0x7D, "V"), + (0x7E, "V"), + (0x7F, "V"), + (0x80, "X"), + (0x81, "X"), + (0x82, "X"), + (0x83, "X"), + (0x84, "X"), + (0x85, "X"), + (0x86, "X"), + (0x87, "X"), + (0x88, "X"), + (0x89, "X"), + (0x8A, "X"), + (0x8B, "X"), + (0x8C, "X"), + (0x8D, "X"), + (0x8E, "X"), + (0x8F, "X"), + (0x90, "X"), + (0x91, "X"), + (0x92, "X"), + (0x93, "X"), + (0x94, "X"), + (0x95, "X"), + (0x96, "X"), + (0x97, "X"), + (0x98, "X"), + (0x99, "X"), + (0x9A, "X"), + (0x9B, "X"), + (0x9C, "X"), + (0x9D, "X"), + (0x9E, "X"), + (0x9F, "X"), + (0xA0, "M", " "), + (0xA1, "V"), + (0xA2, "V"), + (0xA3, "V"), + (0xA4, "V"), + (0xA5, "V"), + (0xA6, "V"), + (0xA7, "V"), + (0xA8, "M", " ̈"), + (0xA9, "V"), + (0xAA, "M", "a"), + (0xAB, "V"), + (0xAC, "V"), + (0xAD, "I"), + (0xAE, "V"), + (0xAF, "M", " ̄"), + (0xB0, "V"), + (0xB1, "V"), + (0xB2, "M", "2"), + (0xB3, "M", "3"), + (0xB4, "M", " ́"), + (0xB5, "M", "μ"), + (0xB6, "V"), + (0xB7, "V"), + (0xB8, "M", " ̧"), + (0xB9, "M", "1"), + (0xBA, "M", "o"), + (0xBB, "V"), + (0xBC, "M", "1⁄4"), + (0xBD, "M", "1⁄2"), + (0xBE, "M", "3⁄4"), + (0xBF, "V"), + (0xC0, "M", "à"), + (0xC1, "M", "á"), + (0xC2, "M", "â"), + (0xC3, "M", "ã"), + (0xC4, "M", "ä"), + (0xC5, "M", "å"), + (0xC6, "M", "æ"), + (0xC7, "M", "ç"), + ] + + +def _seg_2() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xC8, "M", "è"), + (0xC9, "M", "é"), + (0xCA, "M", "ê"), + (0xCB, "M", "ë"), + (0xCC, "M", "ì"), + (0xCD, "M", "í"), + (0xCE, "M", "î"), + (0xCF, "M", "ï"), + (0xD0, "M", "ð"), + (0xD1, "M", "ñ"), + (0xD2, "M", "ò"), + (0xD3, "M", "ó"), + (0xD4, "M", "ô"), + (0xD5, "M", "õ"), + (0xD6, "M", "ö"), + (0xD7, "V"), + (0xD8, "M", "ø"), + (0xD9, "M", "ù"), + (0xDA, "M", "ú"), + (0xDB, "M", "û"), + (0xDC, "M", "ü"), + (0xDD, "M", "ý"), + (0xDE, "M", "þ"), + (0xDF, "D", "ss"), + (0xE0, "V"), + (0xE1, "V"), + (0xE2, "V"), + (0xE3, "V"), + (0xE4, "V"), + (0xE5, "V"), + (0xE6, "V"), + (0xE7, "V"), + (0xE8, "V"), + (0xE9, "V"), + (0xEA, "V"), + (0xEB, "V"), + (0xEC, "V"), + (0xED, "V"), + (0xEE, "V"), + (0xEF, "V"), + (0xF0, "V"), + (0xF1, "V"), + (0xF2, "V"), + (0xF3, "V"), + (0xF4, "V"), + (0xF5, "V"), + (0xF6, "V"), + (0xF7, "V"), + (0xF8, "V"), + (0xF9, "V"), + (0xFA, "V"), + (0xFB, "V"), + (0xFC, "V"), + (0xFD, "V"), + (0xFE, "V"), + (0xFF, "V"), + (0x100, "M", "ā"), + (0x101, "V"), + (0x102, "M", "ă"), + (0x103, "V"), + (0x104, "M", "ą"), + (0x105, "V"), + (0x106, "M", "ć"), + (0x107, "V"), + (0x108, "M", "ĉ"), + (0x109, "V"), + (0x10A, "M", "ċ"), + (0x10B, "V"), + (0x10C, "M", "č"), + (0x10D, "V"), + (0x10E, "M", "ď"), + (0x10F, "V"), + (0x110, "M", "đ"), + (0x111, "V"), + (0x112, "M", "ē"), + (0x113, "V"), + (0x114, "M", "ĕ"), + (0x115, "V"), + (0x116, "M", "ė"), + (0x117, "V"), + (0x118, "M", "ę"), + (0x119, "V"), + (0x11A, "M", "ě"), + (0x11B, "V"), + (0x11C, "M", "ĝ"), + (0x11D, "V"), + (0x11E, "M", "ğ"), + (0x11F, "V"), + (0x120, "M", "ġ"), + (0x121, "V"), + (0x122, "M", "ģ"), + (0x123, "V"), + (0x124, "M", "ĥ"), + (0x125, "V"), + (0x126, "M", "ħ"), + (0x127, "V"), + (0x128, "M", "ĩ"), + (0x129, "V"), + (0x12A, "M", "ī"), + (0x12B, "V"), + ] + + +def _seg_3() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x12C, "M", "ĭ"), + (0x12D, "V"), + (0x12E, "M", "į"), + (0x12F, "V"), + (0x130, "M", "i̇"), + (0x131, "V"), + (0x132, "M", "ij"), + (0x134, "M", "ĵ"), + (0x135, "V"), + (0x136, "M", "ķ"), + (0x137, "V"), + (0x139, "M", "ĺ"), + (0x13A, "V"), + (0x13B, "M", "ļ"), + (0x13C, "V"), + (0x13D, "M", "ľ"), + (0x13E, "V"), + (0x13F, "M", "l·"), + (0x141, "M", "ł"), + (0x142, "V"), + (0x143, "M", "ń"), + (0x144, "V"), + (0x145, "M", "ņ"), + (0x146, "V"), + (0x147, "M", "ň"), + (0x148, "V"), + (0x149, "M", "ʼn"), + (0x14A, "M", "ŋ"), + (0x14B, "V"), + (0x14C, "M", "ō"), + (0x14D, "V"), + (0x14E, "M", "ŏ"), + (0x14F, "V"), + (0x150, "M", "ő"), + (0x151, "V"), + (0x152, "M", "œ"), + (0x153, "V"), + (0x154, "M", "ŕ"), + (0x155, "V"), + (0x156, "M", "ŗ"), + (0x157, "V"), + (0x158, "M", "ř"), + (0x159, "V"), + (0x15A, "M", "ś"), + (0x15B, "V"), + (0x15C, "M", "ŝ"), + (0x15D, "V"), + (0x15E, "M", "ş"), + (0x15F, "V"), + (0x160, "M", "š"), + (0x161, "V"), + (0x162, "M", "ţ"), + (0x163, "V"), + (0x164, "M", "ť"), + (0x165, "V"), + (0x166, "M", "ŧ"), + (0x167, "V"), + (0x168, "M", "ũ"), + (0x169, "V"), + (0x16A, "M", "ū"), + (0x16B, "V"), + (0x16C, "M", "ŭ"), + (0x16D, "V"), + (0x16E, "M", "ů"), + (0x16F, "V"), + (0x170, "M", "ű"), + (0x171, "V"), + (0x172, "M", "ų"), + (0x173, "V"), + (0x174, "M", "ŵ"), + (0x175, "V"), + (0x176, "M", "ŷ"), + (0x177, "V"), + (0x178, "M", "ÿ"), + (0x179, "M", "ź"), + (0x17A, "V"), + (0x17B, "M", "ż"), + (0x17C, "V"), + (0x17D, "M", "ž"), + (0x17E, "V"), + (0x17F, "M", "s"), + (0x180, "V"), + (0x181, "M", "ɓ"), + (0x182, "M", "ƃ"), + (0x183, "V"), + (0x184, "M", "ƅ"), + (0x185, "V"), + (0x186, "M", "ɔ"), + (0x187, "M", "ƈ"), + (0x188, "V"), + (0x189, "M", "ɖ"), + (0x18A, "M", "ɗ"), + (0x18B, "M", "ƌ"), + (0x18C, "V"), + (0x18E, "M", "ǝ"), + (0x18F, "M", "ə"), + (0x190, "M", "ɛ"), + (0x191, "M", "ƒ"), + (0x192, "V"), + (0x193, "M", "ɠ"), + ] + + +def _seg_4() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x194, "M", "ɣ"), + (0x195, "V"), + (0x196, "M", "ɩ"), + (0x197, "M", "ɨ"), + (0x198, "M", "ƙ"), + (0x199, "V"), + (0x19C, "M", "ɯ"), + (0x19D, "M", "ɲ"), + (0x19E, "V"), + (0x19F, "M", "ɵ"), + (0x1A0, "M", "ơ"), + (0x1A1, "V"), + (0x1A2, "M", "ƣ"), + (0x1A3, "V"), + (0x1A4, "M", "ƥ"), + (0x1A5, "V"), + (0x1A6, "M", "ʀ"), + (0x1A7, "M", "ƨ"), + (0x1A8, "V"), + (0x1A9, "M", "ʃ"), + (0x1AA, "V"), + (0x1AC, "M", "ƭ"), + (0x1AD, "V"), + (0x1AE, "M", "ʈ"), + (0x1AF, "M", "ư"), + (0x1B0, "V"), + (0x1B1, "M", "ʊ"), + (0x1B2, "M", "ʋ"), + (0x1B3, "M", "ƴ"), + (0x1B4, "V"), + (0x1B5, "M", "ƶ"), + (0x1B6, "V"), + (0x1B7, "M", "ʒ"), + (0x1B8, "M", "ƹ"), + (0x1B9, "V"), + (0x1BC, "M", "ƽ"), + (0x1BD, "V"), + (0x1C4, "M", "dž"), + (0x1C7, "M", "lj"), + (0x1CA, "M", "nj"), + (0x1CD, "M", "ǎ"), + (0x1CE, "V"), + (0x1CF, "M", "ǐ"), + (0x1D0, "V"), + (0x1D1, "M", "ǒ"), + (0x1D2, "V"), + (0x1D3, "M", "ǔ"), + (0x1D4, "V"), + (0x1D5, "M", "ǖ"), + (0x1D6, "V"), + (0x1D7, "M", "ǘ"), + (0x1D8, "V"), + (0x1D9, "M", "ǚ"), + (0x1DA, "V"), + (0x1DB, "M", "ǜ"), + (0x1DC, "V"), + (0x1DE, "M", "ǟ"), + (0x1DF, "V"), + (0x1E0, "M", "ǡ"), + (0x1E1, "V"), + (0x1E2, "M", "ǣ"), + (0x1E3, "V"), + (0x1E4, "M", "ǥ"), + (0x1E5, "V"), + (0x1E6, "M", "ǧ"), + (0x1E7, "V"), + (0x1E8, "M", "ǩ"), + (0x1E9, "V"), + (0x1EA, "M", "ǫ"), + (0x1EB, "V"), + (0x1EC, "M", "ǭ"), + (0x1ED, "V"), + (0x1EE, "M", "ǯ"), + (0x1EF, "V"), + (0x1F1, "M", "dz"), + (0x1F4, "M", "ǵ"), + (0x1F5, "V"), + (0x1F6, "M", "ƕ"), + (0x1F7, "M", "ƿ"), + (0x1F8, "M", "ǹ"), + (0x1F9, "V"), + (0x1FA, "M", "ǻ"), + (0x1FB, "V"), + (0x1FC, "M", "ǽ"), + (0x1FD, "V"), + (0x1FE, "M", "ǿ"), + (0x1FF, "V"), + (0x200, "M", "ȁ"), + (0x201, "V"), + (0x202, "M", "ȃ"), + (0x203, "V"), + (0x204, "M", "ȅ"), + (0x205, "V"), + (0x206, "M", "ȇ"), + (0x207, "V"), + (0x208, "M", "ȉ"), + (0x209, "V"), + (0x20A, "M", "ȋ"), + (0x20B, "V"), + (0x20C, "M", "ȍ"), + ] + + +def _seg_5() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x20D, "V"), + (0x20E, "M", "ȏ"), + (0x20F, "V"), + (0x210, "M", "ȑ"), + (0x211, "V"), + (0x212, "M", "ȓ"), + (0x213, "V"), + (0x214, "M", "ȕ"), + (0x215, "V"), + (0x216, "M", "ȗ"), + (0x217, "V"), + (0x218, "M", "ș"), + (0x219, "V"), + (0x21A, "M", "ț"), + (0x21B, "V"), + (0x21C, "M", "ȝ"), + (0x21D, "V"), + (0x21E, "M", "ȟ"), + (0x21F, "V"), + (0x220, "M", "ƞ"), + (0x221, "V"), + (0x222, "M", "ȣ"), + (0x223, "V"), + (0x224, "M", "ȥ"), + (0x225, "V"), + (0x226, "M", "ȧ"), + (0x227, "V"), + (0x228, "M", "ȩ"), + (0x229, "V"), + (0x22A, "M", "ȫ"), + (0x22B, "V"), + (0x22C, "M", "ȭ"), + (0x22D, "V"), + (0x22E, "M", "ȯ"), + (0x22F, "V"), + (0x230, "M", "ȱ"), + (0x231, "V"), + (0x232, "M", "ȳ"), + (0x233, "V"), + (0x23A, "M", "ⱥ"), + (0x23B, "M", "ȼ"), + (0x23C, "V"), + (0x23D, "M", "ƚ"), + (0x23E, "M", "ⱦ"), + (0x23F, "V"), + (0x241, "M", "ɂ"), + (0x242, "V"), + (0x243, "M", "ƀ"), + (0x244, "M", "ʉ"), + (0x245, "M", "ʌ"), + (0x246, "M", "ɇ"), + (0x247, "V"), + (0x248, "M", "ɉ"), + (0x249, "V"), + (0x24A, "M", "ɋ"), + (0x24B, "V"), + (0x24C, "M", "ɍ"), + (0x24D, "V"), + (0x24E, "M", "ɏ"), + (0x24F, "V"), + (0x2B0, "M", "h"), + (0x2B1, "M", "ɦ"), + (0x2B2, "M", "j"), + (0x2B3, "M", "r"), + (0x2B4, "M", "ɹ"), + (0x2B5, "M", "ɻ"), + (0x2B6, "M", "ʁ"), + (0x2B7, "M", "w"), + (0x2B8, "M", "y"), + (0x2B9, "V"), + (0x2D8, "M", " ̆"), + (0x2D9, "M", " ̇"), + (0x2DA, "M", " ̊"), + (0x2DB, "M", " ̨"), + (0x2DC, "M", " ̃"), + (0x2DD, "M", " ̋"), + (0x2DE, "V"), + (0x2E0, "M", "ɣ"), + (0x2E1, "M", "l"), + (0x2E2, "M", "s"), + (0x2E3, "M", "x"), + (0x2E4, "M", "ʕ"), + (0x2E5, "V"), + (0x340, "M", "̀"), + (0x341, "M", "́"), + (0x342, "V"), + (0x343, "M", "̓"), + (0x344, "M", "̈́"), + (0x345, "M", "ι"), + (0x346, "V"), + (0x34F, "I"), + (0x350, "V"), + (0x370, "M", "ͱ"), + (0x371, "V"), + (0x372, "M", "ͳ"), + (0x373, "V"), + (0x374, "M", "ʹ"), + (0x375, "V"), + (0x376, "M", "ͷ"), + (0x377, "V"), + ] + + +def _seg_6() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x378, "X"), + (0x37A, "M", " ι"), + (0x37B, "V"), + (0x37E, "M", ";"), + (0x37F, "M", "ϳ"), + (0x380, "X"), + (0x384, "M", " ́"), + (0x385, "M", " ̈́"), + (0x386, "M", "ά"), + (0x387, "M", "·"), + (0x388, "M", "έ"), + (0x389, "M", "ή"), + (0x38A, "M", "ί"), + (0x38B, "X"), + (0x38C, "M", "ό"), + (0x38D, "X"), + (0x38E, "M", "ύ"), + (0x38F, "M", "ώ"), + (0x390, "V"), + (0x391, "M", "α"), + (0x392, "M", "β"), + (0x393, "M", "γ"), + (0x394, "M", "δ"), + (0x395, "M", "ε"), + (0x396, "M", "ζ"), + (0x397, "M", "η"), + (0x398, "M", "θ"), + (0x399, "M", "ι"), + (0x39A, "M", "κ"), + (0x39B, "M", "λ"), + (0x39C, "M", "μ"), + (0x39D, "M", "ν"), + (0x39E, "M", "ξ"), + (0x39F, "M", "ο"), + (0x3A0, "M", "π"), + (0x3A1, "M", "ρ"), + (0x3A2, "X"), + (0x3A3, "M", "σ"), + (0x3A4, "M", "τ"), + (0x3A5, "M", "υ"), + (0x3A6, "M", "φ"), + (0x3A7, "M", "χ"), + (0x3A8, "M", "ψ"), + (0x3A9, "M", "ω"), + (0x3AA, "M", "ϊ"), + (0x3AB, "M", "ϋ"), + (0x3AC, "V"), + (0x3C2, "D", "σ"), + (0x3C3, "V"), + (0x3CF, "M", "ϗ"), + (0x3D0, "M", "β"), + (0x3D1, "M", "θ"), + (0x3D2, "M", "υ"), + (0x3D3, "M", "ύ"), + (0x3D4, "M", "ϋ"), + (0x3D5, "M", "φ"), + (0x3D6, "M", "π"), + (0x3D7, "V"), + (0x3D8, "M", "ϙ"), + (0x3D9, "V"), + (0x3DA, "M", "ϛ"), + (0x3DB, "V"), + (0x3DC, "M", "ϝ"), + (0x3DD, "V"), + (0x3DE, "M", "ϟ"), + (0x3DF, "V"), + (0x3E0, "M", "ϡ"), + (0x3E1, "V"), + (0x3E2, "M", "ϣ"), + (0x3E3, "V"), + (0x3E4, "M", "ϥ"), + (0x3E5, "V"), + (0x3E6, "M", "ϧ"), + (0x3E7, "V"), + (0x3E8, "M", "ϩ"), + (0x3E9, "V"), + (0x3EA, "M", "ϫ"), + (0x3EB, "V"), + (0x3EC, "M", "ϭ"), + (0x3ED, "V"), + (0x3EE, "M", "ϯ"), + (0x3EF, "V"), + (0x3F0, "M", "κ"), + (0x3F1, "M", "ρ"), + (0x3F2, "M", "σ"), + (0x3F3, "V"), + (0x3F4, "M", "θ"), + (0x3F5, "M", "ε"), + (0x3F6, "V"), + (0x3F7, "M", "ϸ"), + (0x3F8, "V"), + (0x3F9, "M", "σ"), + (0x3FA, "M", "ϻ"), + (0x3FB, "V"), + (0x3FD, "M", "ͻ"), + (0x3FE, "M", "ͼ"), + (0x3FF, "M", "ͽ"), + (0x400, "M", "ѐ"), + (0x401, "M", "ё"), + (0x402, "M", "ђ"), + ] + + +def _seg_7() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x403, "M", "ѓ"), + (0x404, "M", "є"), + (0x405, "M", "ѕ"), + (0x406, "M", "і"), + (0x407, "M", "ї"), + (0x408, "M", "ј"), + (0x409, "M", "љ"), + (0x40A, "M", "њ"), + (0x40B, "M", "ћ"), + (0x40C, "M", "ќ"), + (0x40D, "M", "ѝ"), + (0x40E, "M", "ў"), + (0x40F, "M", "џ"), + (0x410, "M", "а"), + (0x411, "M", "б"), + (0x412, "M", "в"), + (0x413, "M", "г"), + (0x414, "M", "д"), + (0x415, "M", "е"), + (0x416, "M", "ж"), + (0x417, "M", "з"), + (0x418, "M", "и"), + (0x419, "M", "й"), + (0x41A, "M", "к"), + (0x41B, "M", "л"), + (0x41C, "M", "м"), + (0x41D, "M", "н"), + (0x41E, "M", "о"), + (0x41F, "M", "п"), + (0x420, "M", "р"), + (0x421, "M", "с"), + (0x422, "M", "т"), + (0x423, "M", "у"), + (0x424, "M", "ф"), + (0x425, "M", "х"), + (0x426, "M", "ц"), + (0x427, "M", "ч"), + (0x428, "M", "ш"), + (0x429, "M", "щ"), + (0x42A, "M", "ъ"), + (0x42B, "M", "ы"), + (0x42C, "M", "ь"), + (0x42D, "M", "э"), + (0x42E, "M", "ю"), + (0x42F, "M", "я"), + (0x430, "V"), + (0x460, "M", "ѡ"), + (0x461, "V"), + (0x462, "M", "ѣ"), + (0x463, "V"), + (0x464, "M", "ѥ"), + (0x465, "V"), + (0x466, "M", "ѧ"), + (0x467, "V"), + (0x468, "M", "ѩ"), + (0x469, "V"), + (0x46A, "M", "ѫ"), + (0x46B, "V"), + (0x46C, "M", "ѭ"), + (0x46D, "V"), + (0x46E, "M", "ѯ"), + (0x46F, "V"), + (0x470, "M", "ѱ"), + (0x471, "V"), + (0x472, "M", "ѳ"), + (0x473, "V"), + (0x474, "M", "ѵ"), + (0x475, "V"), + (0x476, "M", "ѷ"), + (0x477, "V"), + (0x478, "M", "ѹ"), + (0x479, "V"), + (0x47A, "M", "ѻ"), + (0x47B, "V"), + (0x47C, "M", "ѽ"), + (0x47D, "V"), + (0x47E, "M", "ѿ"), + (0x47F, "V"), + (0x480, "M", "ҁ"), + (0x481, "V"), + (0x48A, "M", "ҋ"), + (0x48B, "V"), + (0x48C, "M", "ҍ"), + (0x48D, "V"), + (0x48E, "M", "ҏ"), + (0x48F, "V"), + (0x490, "M", "ґ"), + (0x491, "V"), + (0x492, "M", "ғ"), + (0x493, "V"), + (0x494, "M", "ҕ"), + (0x495, "V"), + (0x496, "M", "җ"), + (0x497, "V"), + (0x498, "M", "ҙ"), + (0x499, "V"), + (0x49A, "M", "қ"), + (0x49B, "V"), + (0x49C, "M", "ҝ"), + (0x49D, "V"), + ] + + +def _seg_8() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x49E, "M", "ҟ"), + (0x49F, "V"), + (0x4A0, "M", "ҡ"), + (0x4A1, "V"), + (0x4A2, "M", "ң"), + (0x4A3, "V"), + (0x4A4, "M", "ҥ"), + (0x4A5, "V"), + (0x4A6, "M", "ҧ"), + (0x4A7, "V"), + (0x4A8, "M", "ҩ"), + (0x4A9, "V"), + (0x4AA, "M", "ҫ"), + (0x4AB, "V"), + (0x4AC, "M", "ҭ"), + (0x4AD, "V"), + (0x4AE, "M", "ү"), + (0x4AF, "V"), + (0x4B0, "M", "ұ"), + (0x4B1, "V"), + (0x4B2, "M", "ҳ"), + (0x4B3, "V"), + (0x4B4, "M", "ҵ"), + (0x4B5, "V"), + (0x4B6, "M", "ҷ"), + (0x4B7, "V"), + (0x4B8, "M", "ҹ"), + (0x4B9, "V"), + (0x4BA, "M", "һ"), + (0x4BB, "V"), + (0x4BC, "M", "ҽ"), + (0x4BD, "V"), + (0x4BE, "M", "ҿ"), + (0x4BF, "V"), + (0x4C0, "M", "ӏ"), + (0x4C1, "M", "ӂ"), + (0x4C2, "V"), + (0x4C3, "M", "ӄ"), + (0x4C4, "V"), + (0x4C5, "M", "ӆ"), + (0x4C6, "V"), + (0x4C7, "M", "ӈ"), + (0x4C8, "V"), + (0x4C9, "M", "ӊ"), + (0x4CA, "V"), + (0x4CB, "M", "ӌ"), + (0x4CC, "V"), + (0x4CD, "M", "ӎ"), + (0x4CE, "V"), + (0x4D0, "M", "ӑ"), + (0x4D1, "V"), + (0x4D2, "M", "ӓ"), + (0x4D3, "V"), + (0x4D4, "M", "ӕ"), + (0x4D5, "V"), + (0x4D6, "M", "ӗ"), + (0x4D7, "V"), + (0x4D8, "M", "ә"), + (0x4D9, "V"), + (0x4DA, "M", "ӛ"), + (0x4DB, "V"), + (0x4DC, "M", "ӝ"), + (0x4DD, "V"), + (0x4DE, "M", "ӟ"), + (0x4DF, "V"), + (0x4E0, "M", "ӡ"), + (0x4E1, "V"), + (0x4E2, "M", "ӣ"), + (0x4E3, "V"), + (0x4E4, "M", "ӥ"), + (0x4E5, "V"), + (0x4E6, "M", "ӧ"), + (0x4E7, "V"), + (0x4E8, "M", "ө"), + (0x4E9, "V"), + (0x4EA, "M", "ӫ"), + (0x4EB, "V"), + (0x4EC, "M", "ӭ"), + (0x4ED, "V"), + (0x4EE, "M", "ӯ"), + (0x4EF, "V"), + (0x4F0, "M", "ӱ"), + (0x4F1, "V"), + (0x4F2, "M", "ӳ"), + (0x4F3, "V"), + (0x4F4, "M", "ӵ"), + (0x4F5, "V"), + (0x4F6, "M", "ӷ"), + (0x4F7, "V"), + (0x4F8, "M", "ӹ"), + (0x4F9, "V"), + (0x4FA, "M", "ӻ"), + (0x4FB, "V"), + (0x4FC, "M", "ӽ"), + (0x4FD, "V"), + (0x4FE, "M", "ӿ"), + (0x4FF, "V"), + (0x500, "M", "ԁ"), + (0x501, "V"), + (0x502, "M", "ԃ"), + ] + + +def _seg_9() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x503, "V"), + (0x504, "M", "ԅ"), + (0x505, "V"), + (0x506, "M", "ԇ"), + (0x507, "V"), + (0x508, "M", "ԉ"), + (0x509, "V"), + (0x50A, "M", "ԋ"), + (0x50B, "V"), + (0x50C, "M", "ԍ"), + (0x50D, "V"), + (0x50E, "M", "ԏ"), + (0x50F, "V"), + (0x510, "M", "ԑ"), + (0x511, "V"), + (0x512, "M", "ԓ"), + (0x513, "V"), + (0x514, "M", "ԕ"), + (0x515, "V"), + (0x516, "M", "ԗ"), + (0x517, "V"), + (0x518, "M", "ԙ"), + (0x519, "V"), + (0x51A, "M", "ԛ"), + (0x51B, "V"), + (0x51C, "M", "ԝ"), + (0x51D, "V"), + (0x51E, "M", "ԟ"), + (0x51F, "V"), + (0x520, "M", "ԡ"), + (0x521, "V"), + (0x522, "M", "ԣ"), + (0x523, "V"), + (0x524, "M", "ԥ"), + (0x525, "V"), + (0x526, "M", "ԧ"), + (0x527, "V"), + (0x528, "M", "ԩ"), + (0x529, "V"), + (0x52A, "M", "ԫ"), + (0x52B, "V"), + (0x52C, "M", "ԭ"), + (0x52D, "V"), + (0x52E, "M", "ԯ"), + (0x52F, "V"), + (0x530, "X"), + (0x531, "M", "ա"), + (0x532, "M", "բ"), + (0x533, "M", "գ"), + (0x534, "M", "դ"), + (0x535, "M", "ե"), + (0x536, "M", "զ"), + (0x537, "M", "է"), + (0x538, "M", "ը"), + (0x539, "M", "թ"), + (0x53A, "M", "ժ"), + (0x53B, "M", "ի"), + (0x53C, "M", "լ"), + (0x53D, "M", "խ"), + (0x53E, "M", "ծ"), + (0x53F, "M", "կ"), + (0x540, "M", "հ"), + (0x541, "M", "ձ"), + (0x542, "M", "ղ"), + (0x543, "M", "ճ"), + (0x544, "M", "մ"), + (0x545, "M", "յ"), + (0x546, "M", "ն"), + (0x547, "M", "շ"), + (0x548, "M", "ո"), + (0x549, "M", "չ"), + (0x54A, "M", "պ"), + (0x54B, "M", "ջ"), + (0x54C, "M", "ռ"), + (0x54D, "M", "ս"), + (0x54E, "M", "վ"), + (0x54F, "M", "տ"), + (0x550, "M", "ր"), + (0x551, "M", "ց"), + (0x552, "M", "ւ"), + (0x553, "M", "փ"), + (0x554, "M", "ք"), + (0x555, "M", "օ"), + (0x556, "M", "ֆ"), + (0x557, "X"), + (0x559, "V"), + (0x587, "M", "եւ"), + (0x588, "V"), + (0x58B, "X"), + (0x58D, "V"), + (0x590, "X"), + (0x591, "V"), + (0x5C8, "X"), + (0x5D0, "V"), + (0x5EB, "X"), + (0x5EF, "V"), + (0x5F5, "X"), + (0x606, "V"), + (0x61C, "X"), + (0x61D, "V"), + ] + + +def _seg_10() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x675, "M", "اٴ"), + (0x676, "M", "وٴ"), + (0x677, "M", "ۇٴ"), + (0x678, "M", "يٴ"), + (0x679, "V"), + (0x6DD, "X"), + (0x6DE, "V"), + (0x70E, "X"), + (0x710, "V"), + (0x74B, "X"), + (0x74D, "V"), + (0x7B2, "X"), + (0x7C0, "V"), + (0x7FB, "X"), + (0x7FD, "V"), + (0x82E, "X"), + (0x830, "V"), + (0x83F, "X"), + (0x840, "V"), + (0x85C, "X"), + (0x85E, "V"), + (0x85F, "X"), + (0x860, "V"), + (0x86B, "X"), + (0x870, "V"), + (0x88F, "X"), + (0x897, "V"), + (0x8E2, "X"), + (0x8E3, "V"), + (0x958, "M", "क़"), + (0x959, "M", "ख़"), + (0x95A, "M", "ग़"), + (0x95B, "M", "ज़"), + (0x95C, "M", "ड़"), + (0x95D, "M", "ढ़"), + (0x95E, "M", "फ़"), + (0x95F, "M", "य़"), + (0x960, "V"), + (0x984, "X"), + (0x985, "V"), + (0x98D, "X"), + (0x98F, "V"), + (0x991, "X"), + (0x993, "V"), + (0x9A9, "X"), + (0x9AA, "V"), + (0x9B1, "X"), + (0x9B2, "V"), + (0x9B3, "X"), + (0x9B6, "V"), + (0x9BA, "X"), + (0x9BC, "V"), + (0x9C5, "X"), + (0x9C7, "V"), + (0x9C9, "X"), + (0x9CB, "V"), + (0x9CF, "X"), + (0x9D7, "V"), + (0x9D8, "X"), + (0x9DC, "M", "ড়"), + (0x9DD, "M", "ঢ়"), + (0x9DE, "X"), + (0x9DF, "M", "য়"), + (0x9E0, "V"), + (0x9E4, "X"), + (0x9E6, "V"), + (0x9FF, "X"), + (0xA01, "V"), + (0xA04, "X"), + (0xA05, "V"), + (0xA0B, "X"), + (0xA0F, "V"), + (0xA11, "X"), + (0xA13, "V"), + (0xA29, "X"), + (0xA2A, "V"), + (0xA31, "X"), + (0xA32, "V"), + (0xA33, "M", "ਲ਼"), + (0xA34, "X"), + (0xA35, "V"), + (0xA36, "M", "ਸ਼"), + (0xA37, "X"), + (0xA38, "V"), + (0xA3A, "X"), + (0xA3C, "V"), + (0xA3D, "X"), + (0xA3E, "V"), + (0xA43, "X"), + (0xA47, "V"), + (0xA49, "X"), + (0xA4B, "V"), + (0xA4E, "X"), + (0xA51, "V"), + (0xA52, "X"), + (0xA59, "M", "ਖ਼"), + (0xA5A, "M", "ਗ਼"), + (0xA5B, "M", "ਜ਼"), + (0xA5C, "V"), + (0xA5D, "X"), + ] + + +def _seg_11() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA5E, "M", "ਫ਼"), + (0xA5F, "X"), + (0xA66, "V"), + (0xA77, "X"), + (0xA81, "V"), + (0xA84, "X"), + (0xA85, "V"), + (0xA8E, "X"), + (0xA8F, "V"), + (0xA92, "X"), + (0xA93, "V"), + (0xAA9, "X"), + (0xAAA, "V"), + (0xAB1, "X"), + (0xAB2, "V"), + (0xAB4, "X"), + (0xAB5, "V"), + (0xABA, "X"), + (0xABC, "V"), + (0xAC6, "X"), + (0xAC7, "V"), + (0xACA, "X"), + (0xACB, "V"), + (0xACE, "X"), + (0xAD0, "V"), + (0xAD1, "X"), + (0xAE0, "V"), + (0xAE4, "X"), + (0xAE6, "V"), + (0xAF2, "X"), + (0xAF9, "V"), + (0xB00, "X"), + (0xB01, "V"), + (0xB04, "X"), + (0xB05, "V"), + (0xB0D, "X"), + (0xB0F, "V"), + (0xB11, "X"), + (0xB13, "V"), + (0xB29, "X"), + (0xB2A, "V"), + (0xB31, "X"), + (0xB32, "V"), + (0xB34, "X"), + (0xB35, "V"), + (0xB3A, "X"), + (0xB3C, "V"), + (0xB45, "X"), + (0xB47, "V"), + (0xB49, "X"), + (0xB4B, "V"), + (0xB4E, "X"), + (0xB55, "V"), + (0xB58, "X"), + (0xB5C, "M", "ଡ଼"), + (0xB5D, "M", "ଢ଼"), + (0xB5E, "X"), + (0xB5F, "V"), + (0xB64, "X"), + (0xB66, "V"), + (0xB78, "X"), + (0xB82, "V"), + (0xB84, "X"), + (0xB85, "V"), + (0xB8B, "X"), + (0xB8E, "V"), + (0xB91, "X"), + (0xB92, "V"), + (0xB96, "X"), + (0xB99, "V"), + (0xB9B, "X"), + (0xB9C, "V"), + (0xB9D, "X"), + (0xB9E, "V"), + (0xBA0, "X"), + (0xBA3, "V"), + (0xBA5, "X"), + (0xBA8, "V"), + (0xBAB, "X"), + (0xBAE, "V"), + (0xBBA, "X"), + (0xBBE, "V"), + (0xBC3, "X"), + (0xBC6, "V"), + (0xBC9, "X"), + (0xBCA, "V"), + (0xBCE, "X"), + (0xBD0, "V"), + (0xBD1, "X"), + (0xBD7, "V"), + (0xBD8, "X"), + (0xBE6, "V"), + (0xBFB, "X"), + (0xC00, "V"), + (0xC0D, "X"), + (0xC0E, "V"), + (0xC11, "X"), + (0xC12, "V"), + (0xC29, "X"), + (0xC2A, "V"), + ] + + +def _seg_12() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xC3A, "X"), + (0xC3C, "V"), + (0xC45, "X"), + (0xC46, "V"), + (0xC49, "X"), + (0xC4A, "V"), + (0xC4E, "X"), + (0xC55, "V"), + (0xC57, "X"), + (0xC58, "V"), + (0xC5B, "X"), + (0xC5D, "V"), + (0xC5E, "X"), + (0xC60, "V"), + (0xC64, "X"), + (0xC66, "V"), + (0xC70, "X"), + (0xC77, "V"), + (0xC8D, "X"), + (0xC8E, "V"), + (0xC91, "X"), + (0xC92, "V"), + (0xCA9, "X"), + (0xCAA, "V"), + (0xCB4, "X"), + (0xCB5, "V"), + (0xCBA, "X"), + (0xCBC, "V"), + (0xCC5, "X"), + (0xCC6, "V"), + (0xCC9, "X"), + (0xCCA, "V"), + (0xCCE, "X"), + (0xCD5, "V"), + (0xCD7, "X"), + (0xCDD, "V"), + (0xCDF, "X"), + (0xCE0, "V"), + (0xCE4, "X"), + (0xCE6, "V"), + (0xCF0, "X"), + (0xCF1, "V"), + (0xCF4, "X"), + (0xD00, "V"), + (0xD0D, "X"), + (0xD0E, "V"), + (0xD11, "X"), + (0xD12, "V"), + (0xD45, "X"), + (0xD46, "V"), + (0xD49, "X"), + (0xD4A, "V"), + (0xD50, "X"), + (0xD54, "V"), + (0xD64, "X"), + (0xD66, "V"), + (0xD80, "X"), + (0xD81, "V"), + (0xD84, "X"), + (0xD85, "V"), + (0xD97, "X"), + (0xD9A, "V"), + (0xDB2, "X"), + (0xDB3, "V"), + (0xDBC, "X"), + (0xDBD, "V"), + (0xDBE, "X"), + (0xDC0, "V"), + (0xDC7, "X"), + (0xDCA, "V"), + (0xDCB, "X"), + (0xDCF, "V"), + (0xDD5, "X"), + (0xDD6, "V"), + (0xDD7, "X"), + (0xDD8, "V"), + (0xDE0, "X"), + (0xDE6, "V"), + (0xDF0, "X"), + (0xDF2, "V"), + (0xDF5, "X"), + (0xE01, "V"), + (0xE33, "M", "ํา"), + (0xE34, "V"), + (0xE3B, "X"), + (0xE3F, "V"), + (0xE5C, "X"), + (0xE81, "V"), + (0xE83, "X"), + (0xE84, "V"), + (0xE85, "X"), + (0xE86, "V"), + (0xE8B, "X"), + (0xE8C, "V"), + (0xEA4, "X"), + (0xEA5, "V"), + (0xEA6, "X"), + (0xEA7, "V"), + (0xEB3, "M", "ໍາ"), + (0xEB4, "V"), + ] + + +def _seg_13() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xEBE, "X"), + (0xEC0, "V"), + (0xEC5, "X"), + (0xEC6, "V"), + (0xEC7, "X"), + (0xEC8, "V"), + (0xECF, "X"), + (0xED0, "V"), + (0xEDA, "X"), + (0xEDC, "M", "ຫນ"), + (0xEDD, "M", "ຫມ"), + (0xEDE, "V"), + (0xEE0, "X"), + (0xF00, "V"), + (0xF0C, "M", "་"), + (0xF0D, "V"), + (0xF43, "M", "གྷ"), + (0xF44, "V"), + (0xF48, "X"), + (0xF49, "V"), + (0xF4D, "M", "ཌྷ"), + (0xF4E, "V"), + (0xF52, "M", "དྷ"), + (0xF53, "V"), + (0xF57, "M", "བྷ"), + (0xF58, "V"), + (0xF5C, "M", "ཛྷ"), + (0xF5D, "V"), + (0xF69, "M", "ཀྵ"), + (0xF6A, "V"), + (0xF6D, "X"), + (0xF71, "V"), + (0xF73, "M", "ཱི"), + (0xF74, "V"), + (0xF75, "M", "ཱུ"), + (0xF76, "M", "ྲྀ"), + (0xF77, "M", "ྲཱྀ"), + (0xF78, "M", "ླྀ"), + (0xF79, "M", "ླཱྀ"), + (0xF7A, "V"), + (0xF81, "M", "ཱྀ"), + (0xF82, "V"), + (0xF93, "M", "ྒྷ"), + (0xF94, "V"), + (0xF98, "X"), + (0xF99, "V"), + (0xF9D, "M", "ྜྷ"), + (0xF9E, "V"), + (0xFA2, "M", "ྡྷ"), + (0xFA3, "V"), + (0xFA7, "M", "ྦྷ"), + (0xFA8, "V"), + (0xFAC, "M", "ྫྷ"), + (0xFAD, "V"), + (0xFB9, "M", "ྐྵ"), + (0xFBA, "V"), + (0xFBD, "X"), + (0xFBE, "V"), + (0xFCD, "X"), + (0xFCE, "V"), + (0xFDB, "X"), + (0x1000, "V"), + (0x10A0, "M", "ⴀ"), + (0x10A1, "M", "ⴁ"), + (0x10A2, "M", "ⴂ"), + (0x10A3, "M", "ⴃ"), + (0x10A4, "M", "ⴄ"), + (0x10A5, "M", "ⴅ"), + (0x10A6, "M", "ⴆ"), + (0x10A7, "M", "ⴇ"), + (0x10A8, "M", "ⴈ"), + (0x10A9, "M", "ⴉ"), + (0x10AA, "M", "ⴊ"), + (0x10AB, "M", "ⴋ"), + (0x10AC, "M", "ⴌ"), + (0x10AD, "M", "ⴍ"), + (0x10AE, "M", "ⴎ"), + (0x10AF, "M", "ⴏ"), + (0x10B0, "M", "ⴐ"), + (0x10B1, "M", "ⴑ"), + (0x10B2, "M", "ⴒ"), + (0x10B3, "M", "ⴓ"), + (0x10B4, "M", "ⴔ"), + (0x10B5, "M", "ⴕ"), + (0x10B6, "M", "ⴖ"), + (0x10B7, "M", "ⴗ"), + (0x10B8, "M", "ⴘ"), + (0x10B9, "M", "ⴙ"), + (0x10BA, "M", "ⴚ"), + (0x10BB, "M", "ⴛ"), + (0x10BC, "M", "ⴜ"), + (0x10BD, "M", "ⴝ"), + (0x10BE, "M", "ⴞ"), + (0x10BF, "M", "ⴟ"), + (0x10C0, "M", "ⴠ"), + (0x10C1, "M", "ⴡ"), + (0x10C2, "M", "ⴢ"), + (0x10C3, "M", "ⴣ"), + (0x10C4, "M", "ⴤ"), + (0x10C5, "M", "ⴥ"), + ] + + +def _seg_14() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x10C6, "X"), + (0x10C7, "M", "ⴧ"), + (0x10C8, "X"), + (0x10CD, "M", "ⴭ"), + (0x10CE, "X"), + (0x10D0, "V"), + (0x10FC, "M", "ნ"), + (0x10FD, "V"), + (0x115F, "I"), + (0x1161, "V"), + (0x1249, "X"), + (0x124A, "V"), + (0x124E, "X"), + (0x1250, "V"), + (0x1257, "X"), + (0x1258, "V"), + (0x1259, "X"), + (0x125A, "V"), + (0x125E, "X"), + (0x1260, "V"), + (0x1289, "X"), + (0x128A, "V"), + (0x128E, "X"), + (0x1290, "V"), + (0x12B1, "X"), + (0x12B2, "V"), + (0x12B6, "X"), + (0x12B8, "V"), + (0x12BF, "X"), + (0x12C0, "V"), + (0x12C1, "X"), + (0x12C2, "V"), + (0x12C6, "X"), + (0x12C8, "V"), + (0x12D7, "X"), + (0x12D8, "V"), + (0x1311, "X"), + (0x1312, "V"), + (0x1316, "X"), + (0x1318, "V"), + (0x135B, "X"), + (0x135D, "V"), + (0x137D, "X"), + (0x1380, "V"), + (0x139A, "X"), + (0x13A0, "V"), + (0x13F6, "X"), + (0x13F8, "M", "Ᏸ"), + (0x13F9, "M", "Ᏹ"), + (0x13FA, "M", "Ᏺ"), + (0x13FB, "M", "Ᏻ"), + (0x13FC, "M", "Ᏼ"), + (0x13FD, "M", "Ᏽ"), + (0x13FE, "X"), + (0x1400, "V"), + (0x1680, "X"), + (0x1681, "V"), + (0x169D, "X"), + (0x16A0, "V"), + (0x16F9, "X"), + (0x1700, "V"), + (0x1716, "X"), + (0x171F, "V"), + (0x1737, "X"), + (0x1740, "V"), + (0x1754, "X"), + (0x1760, "V"), + (0x176D, "X"), + (0x176E, "V"), + (0x1771, "X"), + (0x1772, "V"), + (0x1774, "X"), + (0x1780, "V"), + (0x17B4, "I"), + (0x17B6, "V"), + (0x17DE, "X"), + (0x17E0, "V"), + (0x17EA, "X"), + (0x17F0, "V"), + (0x17FA, "X"), + (0x1800, "V"), + (0x180B, "I"), + (0x1810, "V"), + (0x181A, "X"), + (0x1820, "V"), + (0x1879, "X"), + (0x1880, "V"), + (0x18AB, "X"), + (0x18B0, "V"), + (0x18F6, "X"), + (0x1900, "V"), + (0x191F, "X"), + (0x1920, "V"), + (0x192C, "X"), + (0x1930, "V"), + (0x193C, "X"), + (0x1940, "V"), + (0x1941, "X"), + (0x1944, "V"), + (0x196E, "X"), + ] + + +def _seg_15() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1970, "V"), + (0x1975, "X"), + (0x1980, "V"), + (0x19AC, "X"), + (0x19B0, "V"), + (0x19CA, "X"), + (0x19D0, "V"), + (0x19DB, "X"), + (0x19DE, "V"), + (0x1A1C, "X"), + (0x1A1E, "V"), + (0x1A5F, "X"), + (0x1A60, "V"), + (0x1A7D, "X"), + (0x1A7F, "V"), + (0x1A8A, "X"), + (0x1A90, "V"), + (0x1A9A, "X"), + (0x1AA0, "V"), + (0x1AAE, "X"), + (0x1AB0, "V"), + (0x1ACF, "X"), + (0x1B00, "V"), + (0x1B4D, "X"), + (0x1B4E, "V"), + (0x1BF4, "X"), + (0x1BFC, "V"), + (0x1C38, "X"), + (0x1C3B, "V"), + (0x1C4A, "X"), + (0x1C4D, "V"), + (0x1C80, "M", "в"), + (0x1C81, "M", "д"), + (0x1C82, "M", "о"), + (0x1C83, "M", "с"), + (0x1C84, "M", "т"), + (0x1C86, "M", "ъ"), + (0x1C87, "M", "ѣ"), + (0x1C88, "M", "ꙋ"), + (0x1C89, "M", "ᲊ"), + (0x1C8A, "V"), + (0x1C8B, "X"), + (0x1C90, "M", "ა"), + (0x1C91, "M", "ბ"), + (0x1C92, "M", "გ"), + (0x1C93, "M", "დ"), + (0x1C94, "M", "ე"), + (0x1C95, "M", "ვ"), + (0x1C96, "M", "ზ"), + (0x1C97, "M", "თ"), + (0x1C98, "M", "ი"), + (0x1C99, "M", "კ"), + (0x1C9A, "M", "ლ"), + (0x1C9B, "M", "მ"), + (0x1C9C, "M", "ნ"), + (0x1C9D, "M", "ო"), + (0x1C9E, "M", "პ"), + (0x1C9F, "M", "ჟ"), + (0x1CA0, "M", "რ"), + (0x1CA1, "M", "ს"), + (0x1CA2, "M", "ტ"), + (0x1CA3, "M", "უ"), + (0x1CA4, "M", "ფ"), + (0x1CA5, "M", "ქ"), + (0x1CA6, "M", "ღ"), + (0x1CA7, "M", "ყ"), + (0x1CA8, "M", "შ"), + (0x1CA9, "M", "ჩ"), + (0x1CAA, "M", "ც"), + (0x1CAB, "M", "ძ"), + (0x1CAC, "M", "წ"), + (0x1CAD, "M", "ჭ"), + (0x1CAE, "M", "ხ"), + (0x1CAF, "M", "ჯ"), + (0x1CB0, "M", "ჰ"), + (0x1CB1, "M", "ჱ"), + (0x1CB2, "M", "ჲ"), + (0x1CB3, "M", "ჳ"), + (0x1CB4, "M", "ჴ"), + (0x1CB5, "M", "ჵ"), + (0x1CB6, "M", "ჶ"), + (0x1CB7, "M", "ჷ"), + (0x1CB8, "M", "ჸ"), + (0x1CB9, "M", "ჹ"), + (0x1CBA, "M", "ჺ"), + (0x1CBB, "X"), + (0x1CBD, "M", "ჽ"), + (0x1CBE, "M", "ჾ"), + (0x1CBF, "M", "ჿ"), + (0x1CC0, "V"), + (0x1CC8, "X"), + (0x1CD0, "V"), + (0x1CFB, "X"), + (0x1D00, "V"), + (0x1D2C, "M", "a"), + (0x1D2D, "M", "æ"), + (0x1D2E, "M", "b"), + (0x1D2F, "V"), + (0x1D30, "M", "d"), + (0x1D31, "M", "e"), + ] + + +def _seg_16() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D32, "M", "ǝ"), + (0x1D33, "M", "g"), + (0x1D34, "M", "h"), + (0x1D35, "M", "i"), + (0x1D36, "M", "j"), + (0x1D37, "M", "k"), + (0x1D38, "M", "l"), + (0x1D39, "M", "m"), + (0x1D3A, "M", "n"), + (0x1D3B, "V"), + (0x1D3C, "M", "o"), + (0x1D3D, "M", "ȣ"), + (0x1D3E, "M", "p"), + (0x1D3F, "M", "r"), + (0x1D40, "M", "t"), + (0x1D41, "M", "u"), + (0x1D42, "M", "w"), + (0x1D43, "M", "a"), + (0x1D44, "M", "ɐ"), + (0x1D45, "M", "ɑ"), + (0x1D46, "M", "ᴂ"), + (0x1D47, "M", "b"), + (0x1D48, "M", "d"), + (0x1D49, "M", "e"), + (0x1D4A, "M", "ə"), + (0x1D4B, "M", "ɛ"), + (0x1D4C, "M", "ɜ"), + (0x1D4D, "M", "g"), + (0x1D4E, "V"), + (0x1D4F, "M", "k"), + (0x1D50, "M", "m"), + (0x1D51, "M", "ŋ"), + (0x1D52, "M", "o"), + (0x1D53, "M", "ɔ"), + (0x1D54, "M", "ᴖ"), + (0x1D55, "M", "ᴗ"), + (0x1D56, "M", "p"), + (0x1D57, "M", "t"), + (0x1D58, "M", "u"), + (0x1D59, "M", "ᴝ"), + (0x1D5A, "M", "ɯ"), + (0x1D5B, "M", "v"), + (0x1D5C, "M", "ᴥ"), + (0x1D5D, "M", "β"), + (0x1D5E, "M", "γ"), + (0x1D5F, "M", "δ"), + (0x1D60, "M", "φ"), + (0x1D61, "M", "χ"), + (0x1D62, "M", "i"), + (0x1D63, "M", "r"), + (0x1D64, "M", "u"), + (0x1D65, "M", "v"), + (0x1D66, "M", "β"), + (0x1D67, "M", "γ"), + (0x1D68, "M", "ρ"), + (0x1D69, "M", "φ"), + (0x1D6A, "M", "χ"), + (0x1D6B, "V"), + (0x1D78, "M", "н"), + (0x1D79, "V"), + (0x1D9B, "M", "ɒ"), + (0x1D9C, "M", "c"), + (0x1D9D, "M", "ɕ"), + (0x1D9E, "M", "ð"), + (0x1D9F, "M", "ɜ"), + (0x1DA0, "M", "f"), + (0x1DA1, "M", "ɟ"), + (0x1DA2, "M", "ɡ"), + (0x1DA3, "M", "ɥ"), + (0x1DA4, "M", "ɨ"), + (0x1DA5, "M", "ɩ"), + (0x1DA6, "M", "ɪ"), + (0x1DA7, "M", "ᵻ"), + (0x1DA8, "M", "ʝ"), + (0x1DA9, "M", "ɭ"), + (0x1DAA, "M", "ᶅ"), + (0x1DAB, "M", "ʟ"), + (0x1DAC, "M", "ɱ"), + (0x1DAD, "M", "ɰ"), + (0x1DAE, "M", "ɲ"), + (0x1DAF, "M", "ɳ"), + (0x1DB0, "M", "ɴ"), + (0x1DB1, "M", "ɵ"), + (0x1DB2, "M", "ɸ"), + (0x1DB3, "M", "ʂ"), + (0x1DB4, "M", "ʃ"), + (0x1DB5, "M", "ƫ"), + (0x1DB6, "M", "ʉ"), + (0x1DB7, "M", "ʊ"), + (0x1DB8, "M", "ᴜ"), + (0x1DB9, "M", "ʋ"), + (0x1DBA, "M", "ʌ"), + (0x1DBB, "M", "z"), + (0x1DBC, "M", "ʐ"), + (0x1DBD, "M", "ʑ"), + (0x1DBE, "M", "ʒ"), + (0x1DBF, "M", "θ"), + (0x1DC0, "V"), + (0x1E00, "M", "ḁ"), + (0x1E01, "V"), + ] + + +def _seg_17() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1E02, "M", "ḃ"), + (0x1E03, "V"), + (0x1E04, "M", "ḅ"), + (0x1E05, "V"), + (0x1E06, "M", "ḇ"), + (0x1E07, "V"), + (0x1E08, "M", "ḉ"), + (0x1E09, "V"), + (0x1E0A, "M", "ḋ"), + (0x1E0B, "V"), + (0x1E0C, "M", "ḍ"), + (0x1E0D, "V"), + (0x1E0E, "M", "ḏ"), + (0x1E0F, "V"), + (0x1E10, "M", "ḑ"), + (0x1E11, "V"), + (0x1E12, "M", "ḓ"), + (0x1E13, "V"), + (0x1E14, "M", "ḕ"), + (0x1E15, "V"), + (0x1E16, "M", "ḗ"), + (0x1E17, "V"), + (0x1E18, "M", "ḙ"), + (0x1E19, "V"), + (0x1E1A, "M", "ḛ"), + (0x1E1B, "V"), + (0x1E1C, "M", "ḝ"), + (0x1E1D, "V"), + (0x1E1E, "M", "ḟ"), + (0x1E1F, "V"), + (0x1E20, "M", "ḡ"), + (0x1E21, "V"), + (0x1E22, "M", "ḣ"), + (0x1E23, "V"), + (0x1E24, "M", "ḥ"), + (0x1E25, "V"), + (0x1E26, "M", "ḧ"), + (0x1E27, "V"), + (0x1E28, "M", "ḩ"), + (0x1E29, "V"), + (0x1E2A, "M", "ḫ"), + (0x1E2B, "V"), + (0x1E2C, "M", "ḭ"), + (0x1E2D, "V"), + (0x1E2E, "M", "ḯ"), + (0x1E2F, "V"), + (0x1E30, "M", "ḱ"), + (0x1E31, "V"), + (0x1E32, "M", "ḳ"), + (0x1E33, "V"), + (0x1E34, "M", "ḵ"), + (0x1E35, "V"), + (0x1E36, "M", "ḷ"), + (0x1E37, "V"), + (0x1E38, "M", "ḹ"), + (0x1E39, "V"), + (0x1E3A, "M", "ḻ"), + (0x1E3B, "V"), + (0x1E3C, "M", "ḽ"), + (0x1E3D, "V"), + (0x1E3E, "M", "ḿ"), + (0x1E3F, "V"), + (0x1E40, "M", "ṁ"), + (0x1E41, "V"), + (0x1E42, "M", "ṃ"), + (0x1E43, "V"), + (0x1E44, "M", "ṅ"), + (0x1E45, "V"), + (0x1E46, "M", "ṇ"), + (0x1E47, "V"), + (0x1E48, "M", "ṉ"), + (0x1E49, "V"), + (0x1E4A, "M", "ṋ"), + (0x1E4B, "V"), + (0x1E4C, "M", "ṍ"), + (0x1E4D, "V"), + (0x1E4E, "M", "ṏ"), + (0x1E4F, "V"), + (0x1E50, "M", "ṑ"), + (0x1E51, "V"), + (0x1E52, "M", "ṓ"), + (0x1E53, "V"), + (0x1E54, "M", "ṕ"), + (0x1E55, "V"), + (0x1E56, "M", "ṗ"), + (0x1E57, "V"), + (0x1E58, "M", "ṙ"), + (0x1E59, "V"), + (0x1E5A, "M", "ṛ"), + (0x1E5B, "V"), + (0x1E5C, "M", "ṝ"), + (0x1E5D, "V"), + (0x1E5E, "M", "ṟ"), + (0x1E5F, "V"), + (0x1E60, "M", "ṡ"), + (0x1E61, "V"), + (0x1E62, "M", "ṣ"), + (0x1E63, "V"), + (0x1E64, "M", "ṥ"), + (0x1E65, "V"), + ] + + +def _seg_18() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1E66, "M", "ṧ"), + (0x1E67, "V"), + (0x1E68, "M", "ṩ"), + (0x1E69, "V"), + (0x1E6A, "M", "ṫ"), + (0x1E6B, "V"), + (0x1E6C, "M", "ṭ"), + (0x1E6D, "V"), + (0x1E6E, "M", "ṯ"), + (0x1E6F, "V"), + (0x1E70, "M", "ṱ"), + (0x1E71, "V"), + (0x1E72, "M", "ṳ"), + (0x1E73, "V"), + (0x1E74, "M", "ṵ"), + (0x1E75, "V"), + (0x1E76, "M", "ṷ"), + (0x1E77, "V"), + (0x1E78, "M", "ṹ"), + (0x1E79, "V"), + (0x1E7A, "M", "ṻ"), + (0x1E7B, "V"), + (0x1E7C, "M", "ṽ"), + (0x1E7D, "V"), + (0x1E7E, "M", "ṿ"), + (0x1E7F, "V"), + (0x1E80, "M", "ẁ"), + (0x1E81, "V"), + (0x1E82, "M", "ẃ"), + (0x1E83, "V"), + (0x1E84, "M", "ẅ"), + (0x1E85, "V"), + (0x1E86, "M", "ẇ"), + (0x1E87, "V"), + (0x1E88, "M", "ẉ"), + (0x1E89, "V"), + (0x1E8A, "M", "ẋ"), + (0x1E8B, "V"), + (0x1E8C, "M", "ẍ"), + (0x1E8D, "V"), + (0x1E8E, "M", "ẏ"), + (0x1E8F, "V"), + (0x1E90, "M", "ẑ"), + (0x1E91, "V"), + (0x1E92, "M", "ẓ"), + (0x1E93, "V"), + (0x1E94, "M", "ẕ"), + (0x1E95, "V"), + (0x1E9A, "M", "aʾ"), + (0x1E9B, "M", "ṡ"), + (0x1E9C, "V"), + (0x1E9E, "M", "ß"), + (0x1E9F, "V"), + (0x1EA0, "M", "ạ"), + (0x1EA1, "V"), + (0x1EA2, "M", "ả"), + (0x1EA3, "V"), + (0x1EA4, "M", "ấ"), + (0x1EA5, "V"), + (0x1EA6, "M", "ầ"), + (0x1EA7, "V"), + (0x1EA8, "M", "ẩ"), + (0x1EA9, "V"), + (0x1EAA, "M", "ẫ"), + (0x1EAB, "V"), + (0x1EAC, "M", "ậ"), + (0x1EAD, "V"), + (0x1EAE, "M", "ắ"), + (0x1EAF, "V"), + (0x1EB0, "M", "ằ"), + (0x1EB1, "V"), + (0x1EB2, "M", "ẳ"), + (0x1EB3, "V"), + (0x1EB4, "M", "ẵ"), + (0x1EB5, "V"), + (0x1EB6, "M", "ặ"), + (0x1EB7, "V"), + (0x1EB8, "M", "ẹ"), + (0x1EB9, "V"), + (0x1EBA, "M", "ẻ"), + (0x1EBB, "V"), + (0x1EBC, "M", "ẽ"), + (0x1EBD, "V"), + (0x1EBE, "M", "ế"), + (0x1EBF, "V"), + (0x1EC0, "M", "ề"), + (0x1EC1, "V"), + (0x1EC2, "M", "ể"), + (0x1EC3, "V"), + (0x1EC4, "M", "ễ"), + (0x1EC5, "V"), + (0x1EC6, "M", "ệ"), + (0x1EC7, "V"), + (0x1EC8, "M", "ỉ"), + (0x1EC9, "V"), + (0x1ECA, "M", "ị"), + (0x1ECB, "V"), + (0x1ECC, "M", "ọ"), + (0x1ECD, "V"), + (0x1ECE, "M", "ỏ"), + ] + + +def _seg_19() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1ECF, "V"), + (0x1ED0, "M", "ố"), + (0x1ED1, "V"), + (0x1ED2, "M", "ồ"), + (0x1ED3, "V"), + (0x1ED4, "M", "ổ"), + (0x1ED5, "V"), + (0x1ED6, "M", "ỗ"), + (0x1ED7, "V"), + (0x1ED8, "M", "ộ"), + (0x1ED9, "V"), + (0x1EDA, "M", "ớ"), + (0x1EDB, "V"), + (0x1EDC, "M", "ờ"), + (0x1EDD, "V"), + (0x1EDE, "M", "ở"), + (0x1EDF, "V"), + (0x1EE0, "M", "ỡ"), + (0x1EE1, "V"), + (0x1EE2, "M", "ợ"), + (0x1EE3, "V"), + (0x1EE4, "M", "ụ"), + (0x1EE5, "V"), + (0x1EE6, "M", "ủ"), + (0x1EE7, "V"), + (0x1EE8, "M", "ứ"), + (0x1EE9, "V"), + (0x1EEA, "M", "ừ"), + (0x1EEB, "V"), + (0x1EEC, "M", "ử"), + (0x1EED, "V"), + (0x1EEE, "M", "ữ"), + (0x1EEF, "V"), + (0x1EF0, "M", "ự"), + (0x1EF1, "V"), + (0x1EF2, "M", "ỳ"), + (0x1EF3, "V"), + (0x1EF4, "M", "ỵ"), + (0x1EF5, "V"), + (0x1EF6, "M", "ỷ"), + (0x1EF7, "V"), + (0x1EF8, "M", "ỹ"), + (0x1EF9, "V"), + (0x1EFA, "M", "ỻ"), + (0x1EFB, "V"), + (0x1EFC, "M", "ỽ"), + (0x1EFD, "V"), + (0x1EFE, "M", "ỿ"), + (0x1EFF, "V"), + (0x1F08, "M", "ἀ"), + (0x1F09, "M", "ἁ"), + (0x1F0A, "M", "ἂ"), + (0x1F0B, "M", "ἃ"), + (0x1F0C, "M", "ἄ"), + (0x1F0D, "M", "ἅ"), + (0x1F0E, "M", "ἆ"), + (0x1F0F, "M", "ἇ"), + (0x1F10, "V"), + (0x1F16, "X"), + (0x1F18, "M", "ἐ"), + (0x1F19, "M", "ἑ"), + (0x1F1A, "M", "ἒ"), + (0x1F1B, "M", "ἓ"), + (0x1F1C, "M", "ἔ"), + (0x1F1D, "M", "ἕ"), + (0x1F1E, "X"), + (0x1F20, "V"), + (0x1F28, "M", "ἠ"), + (0x1F29, "M", "ἡ"), + (0x1F2A, "M", "ἢ"), + (0x1F2B, "M", "ἣ"), + (0x1F2C, "M", "ἤ"), + (0x1F2D, "M", "ἥ"), + (0x1F2E, "M", "ἦ"), + (0x1F2F, "M", "ἧ"), + (0x1F30, "V"), + (0x1F38, "M", "ἰ"), + (0x1F39, "M", "ἱ"), + (0x1F3A, "M", "ἲ"), + (0x1F3B, "M", "ἳ"), + (0x1F3C, "M", "ἴ"), + (0x1F3D, "M", "ἵ"), + (0x1F3E, "M", "ἶ"), + (0x1F3F, "M", "ἷ"), + (0x1F40, "V"), + (0x1F46, "X"), + (0x1F48, "M", "ὀ"), + (0x1F49, "M", "ὁ"), + (0x1F4A, "M", "ὂ"), + (0x1F4B, "M", "ὃ"), + (0x1F4C, "M", "ὄ"), + (0x1F4D, "M", "ὅ"), + (0x1F4E, "X"), + (0x1F50, "V"), + (0x1F58, "X"), + (0x1F59, "M", "ὑ"), + (0x1F5A, "X"), + (0x1F5B, "M", "ὓ"), + (0x1F5C, "X"), + (0x1F5D, "M", "ὕ"), + ] + + +def _seg_20() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1F5E, "X"), + (0x1F5F, "M", "ὗ"), + (0x1F60, "V"), + (0x1F68, "M", "ὠ"), + (0x1F69, "M", "ὡ"), + (0x1F6A, "M", "ὢ"), + (0x1F6B, "M", "ὣ"), + (0x1F6C, "M", "ὤ"), + (0x1F6D, "M", "ὥ"), + (0x1F6E, "M", "ὦ"), + (0x1F6F, "M", "ὧ"), + (0x1F70, "V"), + (0x1F71, "M", "ά"), + (0x1F72, "V"), + (0x1F73, "M", "έ"), + (0x1F74, "V"), + (0x1F75, "M", "ή"), + (0x1F76, "V"), + (0x1F77, "M", "ί"), + (0x1F78, "V"), + (0x1F79, "M", "ό"), + (0x1F7A, "V"), + (0x1F7B, "M", "ύ"), + (0x1F7C, "V"), + (0x1F7D, "M", "ώ"), + (0x1F7E, "X"), + (0x1F80, "M", "ἀι"), + (0x1F81, "M", "ἁι"), + (0x1F82, "M", "ἂι"), + (0x1F83, "M", "ἃι"), + (0x1F84, "M", "ἄι"), + (0x1F85, "M", "ἅι"), + (0x1F86, "M", "ἆι"), + (0x1F87, "M", "ἇι"), + (0x1F88, "M", "ἀι"), + (0x1F89, "M", "ἁι"), + (0x1F8A, "M", "ἂι"), + (0x1F8B, "M", "ἃι"), + (0x1F8C, "M", "ἄι"), + (0x1F8D, "M", "ἅι"), + (0x1F8E, "M", "ἆι"), + (0x1F8F, "M", "ἇι"), + (0x1F90, "M", "ἠι"), + (0x1F91, "M", "ἡι"), + (0x1F92, "M", "ἢι"), + (0x1F93, "M", "ἣι"), + (0x1F94, "M", "ἤι"), + (0x1F95, "M", "ἥι"), + (0x1F96, "M", "ἦι"), + (0x1F97, "M", "ἧι"), + (0x1F98, "M", "ἠι"), + (0x1F99, "M", "ἡι"), + (0x1F9A, "M", "ἢι"), + (0x1F9B, "M", "ἣι"), + (0x1F9C, "M", "ἤι"), + (0x1F9D, "M", "ἥι"), + (0x1F9E, "M", "ἦι"), + (0x1F9F, "M", "ἧι"), + (0x1FA0, "M", "ὠι"), + (0x1FA1, "M", "ὡι"), + (0x1FA2, "M", "ὢι"), + (0x1FA3, "M", "ὣι"), + (0x1FA4, "M", "ὤι"), + (0x1FA5, "M", "ὥι"), + (0x1FA6, "M", "ὦι"), + (0x1FA7, "M", "ὧι"), + (0x1FA8, "M", "ὠι"), + (0x1FA9, "M", "ὡι"), + (0x1FAA, "M", "ὢι"), + (0x1FAB, "M", "ὣι"), + (0x1FAC, "M", "ὤι"), + (0x1FAD, "M", "ὥι"), + (0x1FAE, "M", "ὦι"), + (0x1FAF, "M", "ὧι"), + (0x1FB0, "V"), + (0x1FB2, "M", "ὰι"), + (0x1FB3, "M", "αι"), + (0x1FB4, "M", "άι"), + (0x1FB5, "X"), + (0x1FB6, "V"), + (0x1FB7, "M", "ᾶι"), + (0x1FB8, "M", "ᾰ"), + (0x1FB9, "M", "ᾱ"), + (0x1FBA, "M", "ὰ"), + (0x1FBB, "M", "ά"), + (0x1FBC, "M", "αι"), + (0x1FBD, "M", " ̓"), + (0x1FBE, "M", "ι"), + (0x1FBF, "M", " ̓"), + (0x1FC0, "M", " ͂"), + (0x1FC1, "M", " ̈͂"), + (0x1FC2, "M", "ὴι"), + (0x1FC3, "M", "ηι"), + (0x1FC4, "M", "ήι"), + (0x1FC5, "X"), + (0x1FC6, "V"), + (0x1FC7, "M", "ῆι"), + (0x1FC8, "M", "ὲ"), + (0x1FC9, "M", "έ"), + (0x1FCA, "M", "ὴ"), + ] + + +def _seg_21() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1FCB, "M", "ή"), + (0x1FCC, "M", "ηι"), + (0x1FCD, "M", " ̓̀"), + (0x1FCE, "M", " ̓́"), + (0x1FCF, "M", " ̓͂"), + (0x1FD0, "V"), + (0x1FD3, "M", "ΐ"), + (0x1FD4, "X"), + (0x1FD6, "V"), + (0x1FD8, "M", "ῐ"), + (0x1FD9, "M", "ῑ"), + (0x1FDA, "M", "ὶ"), + (0x1FDB, "M", "ί"), + (0x1FDC, "X"), + (0x1FDD, "M", " ̔̀"), + (0x1FDE, "M", " ̔́"), + (0x1FDF, "M", " ̔͂"), + (0x1FE0, "V"), + (0x1FE3, "M", "ΰ"), + (0x1FE4, "V"), + (0x1FE8, "M", "ῠ"), + (0x1FE9, "M", "ῡ"), + (0x1FEA, "M", "ὺ"), + (0x1FEB, "M", "ύ"), + (0x1FEC, "M", "ῥ"), + (0x1FED, "M", " ̈̀"), + (0x1FEE, "M", " ̈́"), + (0x1FEF, "M", "`"), + (0x1FF0, "X"), + (0x1FF2, "M", "ὼι"), + (0x1FF3, "M", "ωι"), + (0x1FF4, "M", "ώι"), + (0x1FF5, "X"), + (0x1FF6, "V"), + (0x1FF7, "M", "ῶι"), + (0x1FF8, "M", "ὸ"), + (0x1FF9, "M", "ό"), + (0x1FFA, "M", "ὼ"), + (0x1FFB, "M", "ώ"), + (0x1FFC, "M", "ωι"), + (0x1FFD, "M", " ́"), + (0x1FFE, "M", " ̔"), + (0x1FFF, "X"), + (0x2000, "M", " "), + (0x200B, "I"), + (0x200C, "D", ""), + (0x200E, "X"), + (0x2010, "V"), + (0x2011, "M", "‐"), + (0x2012, "V"), + (0x2017, "M", " ̳"), + (0x2018, "V"), + (0x2024, "X"), + (0x2027, "V"), + (0x2028, "X"), + (0x202F, "M", " "), + (0x2030, "V"), + (0x2033, "M", "′′"), + (0x2034, "M", "′′′"), + (0x2035, "V"), + (0x2036, "M", "‵‵"), + (0x2037, "M", "‵‵‵"), + (0x2038, "V"), + (0x203C, "M", "!!"), + (0x203D, "V"), + (0x203E, "M", " ̅"), + (0x203F, "V"), + (0x2047, "M", "??"), + (0x2048, "M", "?!"), + (0x2049, "M", "!?"), + (0x204A, "V"), + (0x2057, "M", "′′′′"), + (0x2058, "V"), + (0x205F, "M", " "), + (0x2060, "I"), + (0x2065, "X"), + (0x206A, "I"), + (0x2070, "M", "0"), + (0x2071, "M", "i"), + (0x2072, "X"), + (0x2074, "M", "4"), + (0x2075, "M", "5"), + (0x2076, "M", "6"), + (0x2077, "M", "7"), + (0x2078, "M", "8"), + (0x2079, "M", "9"), + (0x207A, "M", "+"), + (0x207B, "M", "−"), + (0x207C, "M", "="), + (0x207D, "M", "("), + (0x207E, "M", ")"), + (0x207F, "M", "n"), + (0x2080, "M", "0"), + (0x2081, "M", "1"), + (0x2082, "M", "2"), + (0x2083, "M", "3"), + (0x2084, "M", "4"), + (0x2085, "M", "5"), + (0x2086, "M", "6"), + (0x2087, "M", "7"), + ] + + +def _seg_22() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2088, "M", "8"), + (0x2089, "M", "9"), + (0x208A, "M", "+"), + (0x208B, "M", "−"), + (0x208C, "M", "="), + (0x208D, "M", "("), + (0x208E, "M", ")"), + (0x208F, "X"), + (0x2090, "M", "a"), + (0x2091, "M", "e"), + (0x2092, "M", "o"), + (0x2093, "M", "x"), + (0x2094, "M", "ə"), + (0x2095, "M", "h"), + (0x2096, "M", "k"), + (0x2097, "M", "l"), + (0x2098, "M", "m"), + (0x2099, "M", "n"), + (0x209A, "M", "p"), + (0x209B, "M", "s"), + (0x209C, "M", "t"), + (0x209D, "X"), + (0x20A0, "V"), + (0x20A8, "M", "rs"), + (0x20A9, "V"), + (0x20C1, "X"), + (0x20D0, "V"), + (0x20F1, "X"), + (0x2100, "M", "a/c"), + (0x2101, "M", "a/s"), + (0x2102, "M", "c"), + (0x2103, "M", "°c"), + (0x2104, "V"), + (0x2105, "M", "c/o"), + (0x2106, "M", "c/u"), + (0x2107, "M", "ɛ"), + (0x2108, "V"), + (0x2109, "M", "°f"), + (0x210A, "M", "g"), + (0x210B, "M", "h"), + (0x210F, "M", "ħ"), + (0x2110, "M", "i"), + (0x2112, "M", "l"), + (0x2114, "V"), + (0x2115, "M", "n"), + (0x2116, "M", "no"), + (0x2117, "V"), + (0x2119, "M", "p"), + (0x211A, "M", "q"), + (0x211B, "M", "r"), + (0x211E, "V"), + (0x2120, "M", "sm"), + (0x2121, "M", "tel"), + (0x2122, "M", "tm"), + (0x2123, "V"), + (0x2124, "M", "z"), + (0x2125, "V"), + (0x2126, "M", "ω"), + (0x2127, "V"), + (0x2128, "M", "z"), + (0x2129, "V"), + (0x212A, "M", "k"), + (0x212B, "M", "å"), + (0x212C, "M", "b"), + (0x212D, "M", "c"), + (0x212E, "V"), + (0x212F, "M", "e"), + (0x2131, "M", "f"), + (0x2132, "M", "ⅎ"), + (0x2133, "M", "m"), + (0x2134, "M", "o"), + (0x2135, "M", "א"), + (0x2136, "M", "ב"), + (0x2137, "M", "ג"), + (0x2138, "M", "ד"), + (0x2139, "M", "i"), + (0x213A, "V"), + (0x213B, "M", "fax"), + (0x213C, "M", "π"), + (0x213D, "M", "γ"), + (0x213F, "M", "π"), + (0x2140, "M", "∑"), + (0x2141, "V"), + (0x2145, "M", "d"), + (0x2147, "M", "e"), + (0x2148, "M", "i"), + (0x2149, "M", "j"), + (0x214A, "V"), + (0x2150, "M", "1⁄7"), + (0x2151, "M", "1⁄9"), + (0x2152, "M", "1⁄10"), + (0x2153, "M", "1⁄3"), + (0x2154, "M", "2⁄3"), + (0x2155, "M", "1⁄5"), + (0x2156, "M", "2⁄5"), + (0x2157, "M", "3⁄5"), + (0x2158, "M", "4⁄5"), + (0x2159, "M", "1⁄6"), + (0x215A, "M", "5⁄6"), + (0x215B, "M", "1⁄8"), + ] + + +def _seg_23() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x215C, "M", "3⁄8"), + (0x215D, "M", "5⁄8"), + (0x215E, "M", "7⁄8"), + (0x215F, "M", "1⁄"), + (0x2160, "M", "i"), + (0x2161, "M", "ii"), + (0x2162, "M", "iii"), + (0x2163, "M", "iv"), + (0x2164, "M", "v"), + (0x2165, "M", "vi"), + (0x2166, "M", "vii"), + (0x2167, "M", "viii"), + (0x2168, "M", "ix"), + (0x2169, "M", "x"), + (0x216A, "M", "xi"), + (0x216B, "M", "xii"), + (0x216C, "M", "l"), + (0x216D, "M", "c"), + (0x216E, "M", "d"), + (0x216F, "M", "m"), + (0x2170, "M", "i"), + (0x2171, "M", "ii"), + (0x2172, "M", "iii"), + (0x2173, "M", "iv"), + (0x2174, "M", "v"), + (0x2175, "M", "vi"), + (0x2176, "M", "vii"), + (0x2177, "M", "viii"), + (0x2178, "M", "ix"), + (0x2179, "M", "x"), + (0x217A, "M", "xi"), + (0x217B, "M", "xii"), + (0x217C, "M", "l"), + (0x217D, "M", "c"), + (0x217E, "M", "d"), + (0x217F, "M", "m"), + (0x2180, "V"), + (0x2183, "M", "ↄ"), + (0x2184, "V"), + (0x2189, "M", "0⁄3"), + (0x218A, "V"), + (0x218C, "X"), + (0x2190, "V"), + (0x222C, "M", "∫∫"), + (0x222D, "M", "∫∫∫"), + (0x222E, "V"), + (0x222F, "M", "∮∮"), + (0x2230, "M", "∮∮∮"), + (0x2231, "V"), + (0x2329, "M", "〈"), + (0x232A, "M", "〉"), + (0x232B, "V"), + (0x242A, "X"), + (0x2440, "V"), + (0x244B, "X"), + (0x2460, "M", "1"), + (0x2461, "M", "2"), + (0x2462, "M", "3"), + (0x2463, "M", "4"), + (0x2464, "M", "5"), + (0x2465, "M", "6"), + (0x2466, "M", "7"), + (0x2467, "M", "8"), + (0x2468, "M", "9"), + (0x2469, "M", "10"), + (0x246A, "M", "11"), + (0x246B, "M", "12"), + (0x246C, "M", "13"), + (0x246D, "M", "14"), + (0x246E, "M", "15"), + (0x246F, "M", "16"), + (0x2470, "M", "17"), + (0x2471, "M", "18"), + (0x2472, "M", "19"), + (0x2473, "M", "20"), + (0x2474, "M", "(1)"), + (0x2475, "M", "(2)"), + (0x2476, "M", "(3)"), + (0x2477, "M", "(4)"), + (0x2478, "M", "(5)"), + (0x2479, "M", "(6)"), + (0x247A, "M", "(7)"), + (0x247B, "M", "(8)"), + (0x247C, "M", "(9)"), + (0x247D, "M", "(10)"), + (0x247E, "M", "(11)"), + (0x247F, "M", "(12)"), + (0x2480, "M", "(13)"), + (0x2481, "M", "(14)"), + (0x2482, "M", "(15)"), + (0x2483, "M", "(16)"), + (0x2484, "M", "(17)"), + (0x2485, "M", "(18)"), + (0x2486, "M", "(19)"), + (0x2487, "M", "(20)"), + (0x2488, "X"), + (0x249C, "M", "(a)"), + (0x249D, "M", "(b)"), + (0x249E, "M", "(c)"), + (0x249F, "M", "(d)"), + ] + + +def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x24A0, "M", "(e)"), + (0x24A1, "M", "(f)"), + (0x24A2, "M", "(g)"), + (0x24A3, "M", "(h)"), + (0x24A4, "M", "(i)"), + (0x24A5, "M", "(j)"), + (0x24A6, "M", "(k)"), + (0x24A7, "M", "(l)"), + (0x24A8, "M", "(m)"), + (0x24A9, "M", "(n)"), + (0x24AA, "M", "(o)"), + (0x24AB, "M", "(p)"), + (0x24AC, "M", "(q)"), + (0x24AD, "M", "(r)"), + (0x24AE, "M", "(s)"), + (0x24AF, "M", "(t)"), + (0x24B0, "M", "(u)"), + (0x24B1, "M", "(v)"), + (0x24B2, "M", "(w)"), + (0x24B3, "M", "(x)"), + (0x24B4, "M", "(y)"), + (0x24B5, "M", "(z)"), + (0x24B6, "M", "a"), + (0x24B7, "M", "b"), + (0x24B8, "M", "c"), + (0x24B9, "M", "d"), + (0x24BA, "M", "e"), + (0x24BB, "M", "f"), + (0x24BC, "M", "g"), + (0x24BD, "M", "h"), + (0x24BE, "M", "i"), + (0x24BF, "M", "j"), + (0x24C0, "M", "k"), + (0x24C1, "M", "l"), + (0x24C2, "M", "m"), + (0x24C3, "M", "n"), + (0x24C4, "M", "o"), + (0x24C5, "M", "p"), + (0x24C6, "M", "q"), + (0x24C7, "M", "r"), + (0x24C8, "M", "s"), + (0x24C9, "M", "t"), + (0x24CA, "M", "u"), + (0x24CB, "M", "v"), + (0x24CC, "M", "w"), + (0x24CD, "M", "x"), + (0x24CE, "M", "y"), + (0x24CF, "M", "z"), + (0x24D0, "M", "a"), + (0x24D1, "M", "b"), + (0x24D2, "M", "c"), + (0x24D3, "M", "d"), + (0x24D4, "M", "e"), + (0x24D5, "M", "f"), + (0x24D6, "M", "g"), + (0x24D7, "M", "h"), + (0x24D8, "M", "i"), + (0x24D9, "M", "j"), + (0x24DA, "M", "k"), + (0x24DB, "M", "l"), + (0x24DC, "M", "m"), + (0x24DD, "M", "n"), + (0x24DE, "M", "o"), + (0x24DF, "M", "p"), + (0x24E0, "M", "q"), + (0x24E1, "M", "r"), + (0x24E2, "M", "s"), + (0x24E3, "M", "t"), + (0x24E4, "M", "u"), + (0x24E5, "M", "v"), + (0x24E6, "M", "w"), + (0x24E7, "M", "x"), + (0x24E8, "M", "y"), + (0x24E9, "M", "z"), + (0x24EA, "M", "0"), + (0x24EB, "V"), + (0x2A0C, "M", "∫∫∫∫"), + (0x2A0D, "V"), + (0x2A74, "M", "::="), + (0x2A75, "M", "=="), + (0x2A76, "M", "==="), + (0x2A77, "V"), + (0x2ADC, "M", "⫝̸"), + (0x2ADD, "V"), + (0x2B74, "X"), + (0x2B76, "V"), + (0x2B96, "X"), + (0x2B97, "V"), + (0x2C00, "M", "ⰰ"), + (0x2C01, "M", "ⰱ"), + (0x2C02, "M", "ⰲ"), + (0x2C03, "M", "ⰳ"), + (0x2C04, "M", "ⰴ"), + (0x2C05, "M", "ⰵ"), + (0x2C06, "M", "ⰶ"), + (0x2C07, "M", "ⰷ"), + (0x2C08, "M", "ⰸ"), + (0x2C09, "M", "ⰹ"), + (0x2C0A, "M", "ⰺ"), + (0x2C0B, "M", "ⰻ"), + ] + + +def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2C0C, "M", "ⰼ"), + (0x2C0D, "M", "ⰽ"), + (0x2C0E, "M", "ⰾ"), + (0x2C0F, "M", "ⰿ"), + (0x2C10, "M", "ⱀ"), + (0x2C11, "M", "ⱁ"), + (0x2C12, "M", "ⱂ"), + (0x2C13, "M", "ⱃ"), + (0x2C14, "M", "ⱄ"), + (0x2C15, "M", "ⱅ"), + (0x2C16, "M", "ⱆ"), + (0x2C17, "M", "ⱇ"), + (0x2C18, "M", "ⱈ"), + (0x2C19, "M", "ⱉ"), + (0x2C1A, "M", "ⱊ"), + (0x2C1B, "M", "ⱋ"), + (0x2C1C, "M", "ⱌ"), + (0x2C1D, "M", "ⱍ"), + (0x2C1E, "M", "ⱎ"), + (0x2C1F, "M", "ⱏ"), + (0x2C20, "M", "ⱐ"), + (0x2C21, "M", "ⱑ"), + (0x2C22, "M", "ⱒ"), + (0x2C23, "M", "ⱓ"), + (0x2C24, "M", "ⱔ"), + (0x2C25, "M", "ⱕ"), + (0x2C26, "M", "ⱖ"), + (0x2C27, "M", "ⱗ"), + (0x2C28, "M", "ⱘ"), + (0x2C29, "M", "ⱙ"), + (0x2C2A, "M", "ⱚ"), + (0x2C2B, "M", "ⱛ"), + (0x2C2C, "M", "ⱜ"), + (0x2C2D, "M", "ⱝ"), + (0x2C2E, "M", "ⱞ"), + (0x2C2F, "M", "ⱟ"), + (0x2C30, "V"), + (0x2C60, "M", "ⱡ"), + (0x2C61, "V"), + (0x2C62, "M", "ɫ"), + (0x2C63, "M", "ᵽ"), + (0x2C64, "M", "ɽ"), + (0x2C65, "V"), + (0x2C67, "M", "ⱨ"), + (0x2C68, "V"), + (0x2C69, "M", "ⱪ"), + (0x2C6A, "V"), + (0x2C6B, "M", "ⱬ"), + (0x2C6C, "V"), + (0x2C6D, "M", "ɑ"), + (0x2C6E, "M", "ɱ"), + (0x2C6F, "M", "ɐ"), + (0x2C70, "M", "ɒ"), + (0x2C71, "V"), + (0x2C72, "M", "ⱳ"), + (0x2C73, "V"), + (0x2C75, "M", "ⱶ"), + (0x2C76, "V"), + (0x2C7C, "M", "j"), + (0x2C7D, "M", "v"), + (0x2C7E, "M", "ȿ"), + (0x2C7F, "M", "ɀ"), + (0x2C80, "M", "ⲁ"), + (0x2C81, "V"), + (0x2C82, "M", "ⲃ"), + (0x2C83, "V"), + (0x2C84, "M", "ⲅ"), + (0x2C85, "V"), + (0x2C86, "M", "ⲇ"), + (0x2C87, "V"), + (0x2C88, "M", "ⲉ"), + (0x2C89, "V"), + (0x2C8A, "M", "ⲋ"), + (0x2C8B, "V"), + (0x2C8C, "M", "ⲍ"), + (0x2C8D, "V"), + (0x2C8E, "M", "ⲏ"), + (0x2C8F, "V"), + (0x2C90, "M", "ⲑ"), + (0x2C91, "V"), + (0x2C92, "M", "ⲓ"), + (0x2C93, "V"), + (0x2C94, "M", "ⲕ"), + (0x2C95, "V"), + (0x2C96, "M", "ⲗ"), + (0x2C97, "V"), + (0x2C98, "M", "ⲙ"), + (0x2C99, "V"), + (0x2C9A, "M", "ⲛ"), + (0x2C9B, "V"), + (0x2C9C, "M", "ⲝ"), + (0x2C9D, "V"), + (0x2C9E, "M", "ⲟ"), + (0x2C9F, "V"), + (0x2CA0, "M", "ⲡ"), + (0x2CA1, "V"), + (0x2CA2, "M", "ⲣ"), + (0x2CA3, "V"), + (0x2CA4, "M", "ⲥ"), + (0x2CA5, "V"), + ] + + +def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2CA6, "M", "ⲧ"), + (0x2CA7, "V"), + (0x2CA8, "M", "ⲩ"), + (0x2CA9, "V"), + (0x2CAA, "M", "ⲫ"), + (0x2CAB, "V"), + (0x2CAC, "M", "ⲭ"), + (0x2CAD, "V"), + (0x2CAE, "M", "ⲯ"), + (0x2CAF, "V"), + (0x2CB0, "M", "ⲱ"), + (0x2CB1, "V"), + (0x2CB2, "M", "ⲳ"), + (0x2CB3, "V"), + (0x2CB4, "M", "ⲵ"), + (0x2CB5, "V"), + (0x2CB6, "M", "ⲷ"), + (0x2CB7, "V"), + (0x2CB8, "M", "ⲹ"), + (0x2CB9, "V"), + (0x2CBA, "M", "ⲻ"), + (0x2CBB, "V"), + (0x2CBC, "M", "ⲽ"), + (0x2CBD, "V"), + (0x2CBE, "M", "ⲿ"), + (0x2CBF, "V"), + (0x2CC0, "M", "ⳁ"), + (0x2CC1, "V"), + (0x2CC2, "M", "ⳃ"), + (0x2CC3, "V"), + (0x2CC4, "M", "ⳅ"), + (0x2CC5, "V"), + (0x2CC6, "M", "ⳇ"), + (0x2CC7, "V"), + (0x2CC8, "M", "ⳉ"), + (0x2CC9, "V"), + (0x2CCA, "M", "ⳋ"), + (0x2CCB, "V"), + (0x2CCC, "M", "ⳍ"), + (0x2CCD, "V"), + (0x2CCE, "M", "ⳏ"), + (0x2CCF, "V"), + (0x2CD0, "M", "ⳑ"), + (0x2CD1, "V"), + (0x2CD2, "M", "ⳓ"), + (0x2CD3, "V"), + (0x2CD4, "M", "ⳕ"), + (0x2CD5, "V"), + (0x2CD6, "M", "ⳗ"), + (0x2CD7, "V"), + (0x2CD8, "M", "ⳙ"), + (0x2CD9, "V"), + (0x2CDA, "M", "ⳛ"), + (0x2CDB, "V"), + (0x2CDC, "M", "ⳝ"), + (0x2CDD, "V"), + (0x2CDE, "M", "ⳟ"), + (0x2CDF, "V"), + (0x2CE0, "M", "ⳡ"), + (0x2CE1, "V"), + (0x2CE2, "M", "ⳣ"), + (0x2CE3, "V"), + (0x2CEB, "M", "ⳬ"), + (0x2CEC, "V"), + (0x2CED, "M", "ⳮ"), + (0x2CEE, "V"), + (0x2CF2, "M", "ⳳ"), + (0x2CF3, "V"), + (0x2CF4, "X"), + (0x2CF9, "V"), + (0x2D26, "X"), + (0x2D27, "V"), + (0x2D28, "X"), + (0x2D2D, "V"), + (0x2D2E, "X"), + (0x2D30, "V"), + (0x2D68, "X"), + (0x2D6F, "M", "ⵡ"), + (0x2D70, "V"), + (0x2D71, "X"), + (0x2D7F, "V"), + (0x2D97, "X"), + (0x2DA0, "V"), + (0x2DA7, "X"), + (0x2DA8, "V"), + (0x2DAF, "X"), + (0x2DB0, "V"), + (0x2DB7, "X"), + (0x2DB8, "V"), + (0x2DBF, "X"), + (0x2DC0, "V"), + (0x2DC7, "X"), + (0x2DC8, "V"), + (0x2DCF, "X"), + (0x2DD0, "V"), + (0x2DD7, "X"), + (0x2DD8, "V"), + (0x2DDF, "X"), + (0x2DE0, "V"), + (0x2E5E, "X"), + ] + + +def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2E80, "V"), + (0x2E9A, "X"), + (0x2E9B, "V"), + (0x2E9F, "M", "母"), + (0x2EA0, "V"), + (0x2EF3, "M", "龟"), + (0x2EF4, "X"), + (0x2F00, "M", "一"), + (0x2F01, "M", "丨"), + (0x2F02, "M", "丶"), + (0x2F03, "M", "丿"), + (0x2F04, "M", "乙"), + (0x2F05, "M", "亅"), + (0x2F06, "M", "二"), + (0x2F07, "M", "亠"), + (0x2F08, "M", "人"), + (0x2F09, "M", "儿"), + (0x2F0A, "M", "入"), + (0x2F0B, "M", "八"), + (0x2F0C, "M", "冂"), + (0x2F0D, "M", "冖"), + (0x2F0E, "M", "冫"), + (0x2F0F, "M", "几"), + (0x2F10, "M", "凵"), + (0x2F11, "M", "刀"), + (0x2F12, "M", "力"), + (0x2F13, "M", "勹"), + (0x2F14, "M", "匕"), + (0x2F15, "M", "匚"), + (0x2F16, "M", "匸"), + (0x2F17, "M", "十"), + (0x2F18, "M", "卜"), + (0x2F19, "M", "卩"), + (0x2F1A, "M", "厂"), + (0x2F1B, "M", "厶"), + (0x2F1C, "M", "又"), + (0x2F1D, "M", "口"), + (0x2F1E, "M", "囗"), + (0x2F1F, "M", "土"), + (0x2F20, "M", "士"), + (0x2F21, "M", "夂"), + (0x2F22, "M", "夊"), + (0x2F23, "M", "夕"), + (0x2F24, "M", "大"), + (0x2F25, "M", "女"), + (0x2F26, "M", "子"), + (0x2F27, "M", "宀"), + (0x2F28, "M", "寸"), + (0x2F29, "M", "小"), + (0x2F2A, "M", "尢"), + (0x2F2B, "M", "尸"), + (0x2F2C, "M", "屮"), + (0x2F2D, "M", "山"), + (0x2F2E, "M", "巛"), + (0x2F2F, "M", "工"), + (0x2F30, "M", "己"), + (0x2F31, "M", "巾"), + (0x2F32, "M", "干"), + (0x2F33, "M", "幺"), + (0x2F34, "M", "广"), + (0x2F35, "M", "廴"), + (0x2F36, "M", "廾"), + (0x2F37, "M", "弋"), + (0x2F38, "M", "弓"), + (0x2F39, "M", "彐"), + (0x2F3A, "M", "彡"), + (0x2F3B, "M", "彳"), + (0x2F3C, "M", "心"), + (0x2F3D, "M", "戈"), + (0x2F3E, "M", "戶"), + (0x2F3F, "M", "手"), + (0x2F40, "M", "支"), + (0x2F41, "M", "攴"), + (0x2F42, "M", "文"), + (0x2F43, "M", "斗"), + (0x2F44, "M", "斤"), + (0x2F45, "M", "方"), + (0x2F46, "M", "无"), + (0x2F47, "M", "日"), + (0x2F48, "M", "曰"), + (0x2F49, "M", "月"), + (0x2F4A, "M", "木"), + (0x2F4B, "M", "欠"), + (0x2F4C, "M", "止"), + (0x2F4D, "M", "歹"), + (0x2F4E, "M", "殳"), + (0x2F4F, "M", "毋"), + (0x2F50, "M", "比"), + (0x2F51, "M", "毛"), + (0x2F52, "M", "氏"), + (0x2F53, "M", "气"), + (0x2F54, "M", "水"), + (0x2F55, "M", "火"), + (0x2F56, "M", "爪"), + (0x2F57, "M", "父"), + (0x2F58, "M", "爻"), + (0x2F59, "M", "爿"), + (0x2F5A, "M", "片"), + (0x2F5B, "M", "牙"), + (0x2F5C, "M", "牛"), + ] + + +def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F5D, "M", "犬"), + (0x2F5E, "M", "玄"), + (0x2F5F, "M", "玉"), + (0x2F60, "M", "瓜"), + (0x2F61, "M", "瓦"), + (0x2F62, "M", "甘"), + (0x2F63, "M", "生"), + (0x2F64, "M", "用"), + (0x2F65, "M", "田"), + (0x2F66, "M", "疋"), + (0x2F67, "M", "疒"), + (0x2F68, "M", "癶"), + (0x2F69, "M", "白"), + (0x2F6A, "M", "皮"), + (0x2F6B, "M", "皿"), + (0x2F6C, "M", "目"), + (0x2F6D, "M", "矛"), + (0x2F6E, "M", "矢"), + (0x2F6F, "M", "石"), + (0x2F70, "M", "示"), + (0x2F71, "M", "禸"), + (0x2F72, "M", "禾"), + (0x2F73, "M", "穴"), + (0x2F74, "M", "立"), + (0x2F75, "M", "竹"), + (0x2F76, "M", "米"), + (0x2F77, "M", "糸"), + (0x2F78, "M", "缶"), + (0x2F79, "M", "网"), + (0x2F7A, "M", "羊"), + (0x2F7B, "M", "羽"), + (0x2F7C, "M", "老"), + (0x2F7D, "M", "而"), + (0x2F7E, "M", "耒"), + (0x2F7F, "M", "耳"), + (0x2F80, "M", "聿"), + (0x2F81, "M", "肉"), + (0x2F82, "M", "臣"), + (0x2F83, "M", "自"), + (0x2F84, "M", "至"), + (0x2F85, "M", "臼"), + (0x2F86, "M", "舌"), + (0x2F87, "M", "舛"), + (0x2F88, "M", "舟"), + (0x2F89, "M", "艮"), + (0x2F8A, "M", "色"), + (0x2F8B, "M", "艸"), + (0x2F8C, "M", "虍"), + (0x2F8D, "M", "虫"), + (0x2F8E, "M", "血"), + (0x2F8F, "M", "行"), + (0x2F90, "M", "衣"), + (0x2F91, "M", "襾"), + (0x2F92, "M", "見"), + (0x2F93, "M", "角"), + (0x2F94, "M", "言"), + (0x2F95, "M", "谷"), + (0x2F96, "M", "豆"), + (0x2F97, "M", "豕"), + (0x2F98, "M", "豸"), + (0x2F99, "M", "貝"), + (0x2F9A, "M", "赤"), + (0x2F9B, "M", "走"), + (0x2F9C, "M", "足"), + (0x2F9D, "M", "身"), + (0x2F9E, "M", "車"), + (0x2F9F, "M", "辛"), + (0x2FA0, "M", "辰"), + (0x2FA1, "M", "辵"), + (0x2FA2, "M", "邑"), + (0x2FA3, "M", "酉"), + (0x2FA4, "M", "釆"), + (0x2FA5, "M", "里"), + (0x2FA6, "M", "金"), + (0x2FA7, "M", "長"), + (0x2FA8, "M", "門"), + (0x2FA9, "M", "阜"), + (0x2FAA, "M", "隶"), + (0x2FAB, "M", "隹"), + (0x2FAC, "M", "雨"), + (0x2FAD, "M", "靑"), + (0x2FAE, "M", "非"), + (0x2FAF, "M", "面"), + (0x2FB0, "M", "革"), + (0x2FB1, "M", "韋"), + (0x2FB2, "M", "韭"), + (0x2FB3, "M", "音"), + (0x2FB4, "M", "頁"), + (0x2FB5, "M", "風"), + (0x2FB6, "M", "飛"), + (0x2FB7, "M", "食"), + (0x2FB8, "M", "首"), + (0x2FB9, "M", "香"), + (0x2FBA, "M", "馬"), + (0x2FBB, "M", "骨"), + (0x2FBC, "M", "高"), + (0x2FBD, "M", "髟"), + (0x2FBE, "M", "鬥"), + (0x2FBF, "M", "鬯"), + (0x2FC0, "M", "鬲"), + ] + + +def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2FC1, "M", "鬼"), + (0x2FC2, "M", "魚"), + (0x2FC3, "M", "鳥"), + (0x2FC4, "M", "鹵"), + (0x2FC5, "M", "鹿"), + (0x2FC6, "M", "麥"), + (0x2FC7, "M", "麻"), + (0x2FC8, "M", "黃"), + (0x2FC9, "M", "黍"), + (0x2FCA, "M", "黑"), + (0x2FCB, "M", "黹"), + (0x2FCC, "M", "黽"), + (0x2FCD, "M", "鼎"), + (0x2FCE, "M", "鼓"), + (0x2FCF, "M", "鼠"), + (0x2FD0, "M", "鼻"), + (0x2FD1, "M", "齊"), + (0x2FD2, "M", "齒"), + (0x2FD3, "M", "龍"), + (0x2FD4, "M", "龜"), + (0x2FD5, "M", "龠"), + (0x2FD6, "X"), + (0x3000, "M", " "), + (0x3001, "V"), + (0x3002, "M", "."), + (0x3003, "V"), + (0x3036, "M", "〒"), + (0x3037, "V"), + (0x3038, "M", "十"), + (0x3039, "M", "卄"), + (0x303A, "M", "卅"), + (0x303B, "V"), + (0x3040, "X"), + (0x3041, "V"), + (0x3097, "X"), + (0x3099, "V"), + (0x309B, "M", " ゙"), + (0x309C, "M", " ゚"), + (0x309D, "V"), + (0x309F, "M", "より"), + (0x30A0, "V"), + (0x30FF, "M", "コト"), + (0x3100, "X"), + (0x3105, "V"), + (0x3130, "X"), + (0x3131, "M", "ᄀ"), + (0x3132, "M", "ᄁ"), + (0x3133, "M", "ᆪ"), + (0x3134, "M", "ᄂ"), + (0x3135, "M", "ᆬ"), + (0x3136, "M", "ᆭ"), + (0x3137, "M", "ᄃ"), + (0x3138, "M", "ᄄ"), + (0x3139, "M", "ᄅ"), + (0x313A, "M", "ᆰ"), + (0x313B, "M", "ᆱ"), + (0x313C, "M", "ᆲ"), + (0x313D, "M", "ᆳ"), + (0x313E, "M", "ᆴ"), + (0x313F, "M", "ᆵ"), + (0x3140, "M", "ᄚ"), + (0x3141, "M", "ᄆ"), + (0x3142, "M", "ᄇ"), + (0x3143, "M", "ᄈ"), + (0x3144, "M", "ᄡ"), + (0x3145, "M", "ᄉ"), + (0x3146, "M", "ᄊ"), + (0x3147, "M", "ᄋ"), + (0x3148, "M", "ᄌ"), + (0x3149, "M", "ᄍ"), + (0x314A, "M", "ᄎ"), + (0x314B, "M", "ᄏ"), + (0x314C, "M", "ᄐ"), + (0x314D, "M", "ᄑ"), + (0x314E, "M", "ᄒ"), + (0x314F, "M", "ᅡ"), + (0x3150, "M", "ᅢ"), + (0x3151, "M", "ᅣ"), + (0x3152, "M", "ᅤ"), + (0x3153, "M", "ᅥ"), + (0x3154, "M", "ᅦ"), + (0x3155, "M", "ᅧ"), + (0x3156, "M", "ᅨ"), + (0x3157, "M", "ᅩ"), + (0x3158, "M", "ᅪ"), + (0x3159, "M", "ᅫ"), + (0x315A, "M", "ᅬ"), + (0x315B, "M", "ᅭ"), + (0x315C, "M", "ᅮ"), + (0x315D, "M", "ᅯ"), + (0x315E, "M", "ᅰ"), + (0x315F, "M", "ᅱ"), + (0x3160, "M", "ᅲ"), + (0x3161, "M", "ᅳ"), + (0x3162, "M", "ᅴ"), + (0x3163, "M", "ᅵ"), + (0x3164, "I"), + (0x3165, "M", "ᄔ"), + (0x3166, "M", "ᄕ"), + (0x3167, "M", "ᇇ"), + ] + + +def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3168, "M", "ᇈ"), + (0x3169, "M", "ᇌ"), + (0x316A, "M", "ᇎ"), + (0x316B, "M", "ᇓ"), + (0x316C, "M", "ᇗ"), + (0x316D, "M", "ᇙ"), + (0x316E, "M", "ᄜ"), + (0x316F, "M", "ᇝ"), + (0x3170, "M", "ᇟ"), + (0x3171, "M", "ᄝ"), + (0x3172, "M", "ᄞ"), + (0x3173, "M", "ᄠ"), + (0x3174, "M", "ᄢ"), + (0x3175, "M", "ᄣ"), + (0x3176, "M", "ᄧ"), + (0x3177, "M", "ᄩ"), + (0x3178, "M", "ᄫ"), + (0x3179, "M", "ᄬ"), + (0x317A, "M", "ᄭ"), + (0x317B, "M", "ᄮ"), + (0x317C, "M", "ᄯ"), + (0x317D, "M", "ᄲ"), + (0x317E, "M", "ᄶ"), + (0x317F, "M", "ᅀ"), + (0x3180, "M", "ᅇ"), + (0x3181, "M", "ᅌ"), + (0x3182, "M", "ᇱ"), + (0x3183, "M", "ᇲ"), + (0x3184, "M", "ᅗ"), + (0x3185, "M", "ᅘ"), + (0x3186, "M", "ᅙ"), + (0x3187, "M", "ᆄ"), + (0x3188, "M", "ᆅ"), + (0x3189, "M", "ᆈ"), + (0x318A, "M", "ᆑ"), + (0x318B, "M", "ᆒ"), + (0x318C, "M", "ᆔ"), + (0x318D, "M", "ᆞ"), + (0x318E, "M", "ᆡ"), + (0x318F, "X"), + (0x3190, "V"), + (0x3192, "M", "一"), + (0x3193, "M", "二"), + (0x3194, "M", "三"), + (0x3195, "M", "四"), + (0x3196, "M", "上"), + (0x3197, "M", "中"), + (0x3198, "M", "下"), + (0x3199, "M", "甲"), + (0x319A, "M", "乙"), + (0x319B, "M", "丙"), + (0x319C, "M", "丁"), + (0x319D, "M", "天"), + (0x319E, "M", "地"), + (0x319F, "M", "人"), + (0x31A0, "V"), + (0x31E6, "X"), + (0x31F0, "V"), + (0x3200, "M", "(ᄀ)"), + (0x3201, "M", "(ᄂ)"), + (0x3202, "M", "(ᄃ)"), + (0x3203, "M", "(ᄅ)"), + (0x3204, "M", "(ᄆ)"), + (0x3205, "M", "(ᄇ)"), + (0x3206, "M", "(ᄉ)"), + (0x3207, "M", "(ᄋ)"), + (0x3208, "M", "(ᄌ)"), + (0x3209, "M", "(ᄎ)"), + (0x320A, "M", "(ᄏ)"), + (0x320B, "M", "(ᄐ)"), + (0x320C, "M", "(ᄑ)"), + (0x320D, "M", "(ᄒ)"), + (0x320E, "M", "(가)"), + (0x320F, "M", "(나)"), + (0x3210, "M", "(다)"), + (0x3211, "M", "(라)"), + (0x3212, "M", "(마)"), + (0x3213, "M", "(바)"), + (0x3214, "M", "(사)"), + (0x3215, "M", "(아)"), + (0x3216, "M", "(자)"), + (0x3217, "M", "(차)"), + (0x3218, "M", "(카)"), + (0x3219, "M", "(타)"), + (0x321A, "M", "(파)"), + (0x321B, "M", "(하)"), + (0x321C, "M", "(주)"), + (0x321D, "M", "(오전)"), + (0x321E, "M", "(오후)"), + (0x321F, "X"), + (0x3220, "M", "(一)"), + (0x3221, "M", "(二)"), + (0x3222, "M", "(三)"), + (0x3223, "M", "(四)"), + (0x3224, "M", "(五)"), + (0x3225, "M", "(六)"), + (0x3226, "M", "(七)"), + (0x3227, "M", "(八)"), + (0x3228, "M", "(九)"), + (0x3229, "M", "(十)"), + ] + + +def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x322A, "M", "(月)"), + (0x322B, "M", "(火)"), + (0x322C, "M", "(水)"), + (0x322D, "M", "(木)"), + (0x322E, "M", "(金)"), + (0x322F, "M", "(土)"), + (0x3230, "M", "(日)"), + (0x3231, "M", "(株)"), + (0x3232, "M", "(有)"), + (0x3233, "M", "(社)"), + (0x3234, "M", "(名)"), + (0x3235, "M", "(特)"), + (0x3236, "M", "(財)"), + (0x3237, "M", "(祝)"), + (0x3238, "M", "(労)"), + (0x3239, "M", "(代)"), + (0x323A, "M", "(呼)"), + (0x323B, "M", "(学)"), + (0x323C, "M", "(監)"), + (0x323D, "M", "(企)"), + (0x323E, "M", "(資)"), + (0x323F, "M", "(協)"), + (0x3240, "M", "(祭)"), + (0x3241, "M", "(休)"), + (0x3242, "M", "(自)"), + (0x3243, "M", "(至)"), + (0x3244, "M", "問"), + (0x3245, "M", "幼"), + (0x3246, "M", "文"), + (0x3247, "M", "箏"), + (0x3248, "V"), + (0x3250, "M", "pte"), + (0x3251, "M", "21"), + (0x3252, "M", "22"), + (0x3253, "M", "23"), + (0x3254, "M", "24"), + (0x3255, "M", "25"), + (0x3256, "M", "26"), + (0x3257, "M", "27"), + (0x3258, "M", "28"), + (0x3259, "M", "29"), + (0x325A, "M", "30"), + (0x325B, "M", "31"), + (0x325C, "M", "32"), + (0x325D, "M", "33"), + (0x325E, "M", "34"), + (0x325F, "M", "35"), + (0x3260, "M", "ᄀ"), + (0x3261, "M", "ᄂ"), + (0x3262, "M", "ᄃ"), + (0x3263, "M", "ᄅ"), + (0x3264, "M", "ᄆ"), + (0x3265, "M", "ᄇ"), + (0x3266, "M", "ᄉ"), + (0x3267, "M", "ᄋ"), + (0x3268, "M", "ᄌ"), + (0x3269, "M", "ᄎ"), + (0x326A, "M", "ᄏ"), + (0x326B, "M", "ᄐ"), + (0x326C, "M", "ᄑ"), + (0x326D, "M", "ᄒ"), + (0x326E, "M", "가"), + (0x326F, "M", "나"), + (0x3270, "M", "다"), + (0x3271, "M", "라"), + (0x3272, "M", "마"), + (0x3273, "M", "바"), + (0x3274, "M", "사"), + (0x3275, "M", "아"), + (0x3276, "M", "자"), + (0x3277, "M", "차"), + (0x3278, "M", "카"), + (0x3279, "M", "타"), + (0x327A, "M", "파"), + (0x327B, "M", "하"), + (0x327C, "M", "참고"), + (0x327D, "M", "주의"), + (0x327E, "M", "우"), + (0x327F, "V"), + (0x3280, "M", "一"), + (0x3281, "M", "二"), + (0x3282, "M", "三"), + (0x3283, "M", "四"), + (0x3284, "M", "五"), + (0x3285, "M", "六"), + (0x3286, "M", "七"), + (0x3287, "M", "八"), + (0x3288, "M", "九"), + (0x3289, "M", "十"), + (0x328A, "M", "月"), + (0x328B, "M", "火"), + (0x328C, "M", "水"), + (0x328D, "M", "木"), + (0x328E, "M", "金"), + (0x328F, "M", "土"), + (0x3290, "M", "日"), + (0x3291, "M", "株"), + (0x3292, "M", "有"), + (0x3293, "M", "社"), + (0x3294, "M", "名"), + ] + + +def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3295, "M", "特"), + (0x3296, "M", "財"), + (0x3297, "M", "祝"), + (0x3298, "M", "労"), + (0x3299, "M", "秘"), + (0x329A, "M", "男"), + (0x329B, "M", "女"), + (0x329C, "M", "適"), + (0x329D, "M", "優"), + (0x329E, "M", "印"), + (0x329F, "M", "注"), + (0x32A0, "M", "項"), + (0x32A1, "M", "休"), + (0x32A2, "M", "写"), + (0x32A3, "M", "正"), + (0x32A4, "M", "上"), + (0x32A5, "M", "中"), + (0x32A6, "M", "下"), + (0x32A7, "M", "左"), + (0x32A8, "M", "右"), + (0x32A9, "M", "医"), + (0x32AA, "M", "宗"), + (0x32AB, "M", "学"), + (0x32AC, "M", "監"), + (0x32AD, "M", "企"), + (0x32AE, "M", "資"), + (0x32AF, "M", "協"), + (0x32B0, "M", "夜"), + (0x32B1, "M", "36"), + (0x32B2, "M", "37"), + (0x32B3, "M", "38"), + (0x32B4, "M", "39"), + (0x32B5, "M", "40"), + (0x32B6, "M", "41"), + (0x32B7, "M", "42"), + (0x32B8, "M", "43"), + (0x32B9, "M", "44"), + (0x32BA, "M", "45"), + (0x32BB, "M", "46"), + (0x32BC, "M", "47"), + (0x32BD, "M", "48"), + (0x32BE, "M", "49"), + (0x32BF, "M", "50"), + (0x32C0, "M", "1月"), + (0x32C1, "M", "2月"), + (0x32C2, "M", "3月"), + (0x32C3, "M", "4月"), + (0x32C4, "M", "5月"), + (0x32C5, "M", "6月"), + (0x32C6, "M", "7月"), + (0x32C7, "M", "8月"), + (0x32C8, "M", "9月"), + (0x32C9, "M", "10月"), + (0x32CA, "M", "11月"), + (0x32CB, "M", "12月"), + (0x32CC, "M", "hg"), + (0x32CD, "M", "erg"), + (0x32CE, "M", "ev"), + (0x32CF, "M", "ltd"), + (0x32D0, "M", "ア"), + (0x32D1, "M", "イ"), + (0x32D2, "M", "ウ"), + (0x32D3, "M", "エ"), + (0x32D4, "M", "オ"), + (0x32D5, "M", "カ"), + (0x32D6, "M", "キ"), + (0x32D7, "M", "ク"), + (0x32D8, "M", "ケ"), + (0x32D9, "M", "コ"), + (0x32DA, "M", "サ"), + (0x32DB, "M", "シ"), + (0x32DC, "M", "ス"), + (0x32DD, "M", "セ"), + (0x32DE, "M", "ソ"), + (0x32DF, "M", "タ"), + (0x32E0, "M", "チ"), + (0x32E1, "M", "ツ"), + (0x32E2, "M", "テ"), + (0x32E3, "M", "ト"), + (0x32E4, "M", "ナ"), + (0x32E5, "M", "ニ"), + (0x32E6, "M", "ヌ"), + (0x32E7, "M", "ネ"), + (0x32E8, "M", "ノ"), + (0x32E9, "M", "ハ"), + (0x32EA, "M", "ヒ"), + (0x32EB, "M", "フ"), + (0x32EC, "M", "ヘ"), + (0x32ED, "M", "ホ"), + (0x32EE, "M", "マ"), + (0x32EF, "M", "ミ"), + (0x32F0, "M", "ム"), + (0x32F1, "M", "メ"), + (0x32F2, "M", "モ"), + (0x32F3, "M", "ヤ"), + (0x32F4, "M", "ユ"), + (0x32F5, "M", "ヨ"), + (0x32F6, "M", "ラ"), + (0x32F7, "M", "リ"), + (0x32F8, "M", "ル"), + ] + + +def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x32F9, "M", "レ"), + (0x32FA, "M", "ロ"), + (0x32FB, "M", "ワ"), + (0x32FC, "M", "ヰ"), + (0x32FD, "M", "ヱ"), + (0x32FE, "M", "ヲ"), + (0x32FF, "M", "令和"), + (0x3300, "M", "アパート"), + (0x3301, "M", "アルファ"), + (0x3302, "M", "アンペア"), + (0x3303, "M", "アール"), + (0x3304, "M", "イニング"), + (0x3305, "M", "インチ"), + (0x3306, "M", "ウォン"), + (0x3307, "M", "エスクード"), + (0x3308, "M", "エーカー"), + (0x3309, "M", "オンス"), + (0x330A, "M", "オーム"), + (0x330B, "M", "カイリ"), + (0x330C, "M", "カラット"), + (0x330D, "M", "カロリー"), + (0x330E, "M", "ガロン"), + (0x330F, "M", "ガンマ"), + (0x3310, "M", "ギガ"), + (0x3311, "M", "ギニー"), + (0x3312, "M", "キュリー"), + (0x3313, "M", "ギルダー"), + (0x3314, "M", "キロ"), + (0x3315, "M", "キログラム"), + (0x3316, "M", "キロメートル"), + (0x3317, "M", "キロワット"), + (0x3318, "M", "グラム"), + (0x3319, "M", "グラムトン"), + (0x331A, "M", "クルゼイロ"), + (0x331B, "M", "クローネ"), + (0x331C, "M", "ケース"), + (0x331D, "M", "コルナ"), + (0x331E, "M", "コーポ"), + (0x331F, "M", "サイクル"), + (0x3320, "M", "サンチーム"), + (0x3321, "M", "シリング"), + (0x3322, "M", "センチ"), + (0x3323, "M", "セント"), + (0x3324, "M", "ダース"), + (0x3325, "M", "デシ"), + (0x3326, "M", "ドル"), + (0x3327, "M", "トン"), + (0x3328, "M", "ナノ"), + (0x3329, "M", "ノット"), + (0x332A, "M", "ハイツ"), + (0x332B, "M", "パーセント"), + (0x332C, "M", "パーツ"), + (0x332D, "M", "バーレル"), + (0x332E, "M", "ピアストル"), + (0x332F, "M", "ピクル"), + (0x3330, "M", "ピコ"), + (0x3331, "M", "ビル"), + (0x3332, "M", "ファラッド"), + (0x3333, "M", "フィート"), + (0x3334, "M", "ブッシェル"), + (0x3335, "M", "フラン"), + (0x3336, "M", "ヘクタール"), + (0x3337, "M", "ペソ"), + (0x3338, "M", "ペニヒ"), + (0x3339, "M", "ヘルツ"), + (0x333A, "M", "ペンス"), + (0x333B, "M", "ページ"), + (0x333C, "M", "ベータ"), + (0x333D, "M", "ポイント"), + (0x333E, "M", "ボルト"), + (0x333F, "M", "ホン"), + (0x3340, "M", "ポンド"), + (0x3341, "M", "ホール"), + (0x3342, "M", "ホーン"), + (0x3343, "M", "マイクロ"), + (0x3344, "M", "マイル"), + (0x3345, "M", "マッハ"), + (0x3346, "M", "マルク"), + (0x3347, "M", "マンション"), + (0x3348, "M", "ミクロン"), + (0x3349, "M", "ミリ"), + (0x334A, "M", "ミリバール"), + (0x334B, "M", "メガ"), + (0x334C, "M", "メガトン"), + (0x334D, "M", "メートル"), + (0x334E, "M", "ヤード"), + (0x334F, "M", "ヤール"), + (0x3350, "M", "ユアン"), + (0x3351, "M", "リットル"), + (0x3352, "M", "リラ"), + (0x3353, "M", "ルピー"), + (0x3354, "M", "ルーブル"), + (0x3355, "M", "レム"), + (0x3356, "M", "レントゲン"), + (0x3357, "M", "ワット"), + (0x3358, "M", "0点"), + (0x3359, "M", "1点"), + (0x335A, "M", "2点"), + (0x335B, "M", "3点"), + (0x335C, "M", "4点"), + ] + + +def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x335D, "M", "5点"), + (0x335E, "M", "6点"), + (0x335F, "M", "7点"), + (0x3360, "M", "8点"), + (0x3361, "M", "9点"), + (0x3362, "M", "10点"), + (0x3363, "M", "11点"), + (0x3364, "M", "12点"), + (0x3365, "M", "13点"), + (0x3366, "M", "14点"), + (0x3367, "M", "15点"), + (0x3368, "M", "16点"), + (0x3369, "M", "17点"), + (0x336A, "M", "18点"), + (0x336B, "M", "19点"), + (0x336C, "M", "20点"), + (0x336D, "M", "21点"), + (0x336E, "M", "22点"), + (0x336F, "M", "23点"), + (0x3370, "M", "24点"), + (0x3371, "M", "hpa"), + (0x3372, "M", "da"), + (0x3373, "M", "au"), + (0x3374, "M", "bar"), + (0x3375, "M", "ov"), + (0x3376, "M", "pc"), + (0x3377, "M", "dm"), + (0x3378, "M", "dm2"), + (0x3379, "M", "dm3"), + (0x337A, "M", "iu"), + (0x337B, "M", "平成"), + (0x337C, "M", "昭和"), + (0x337D, "M", "大正"), + (0x337E, "M", "明治"), + (0x337F, "M", "株式会社"), + (0x3380, "M", "pa"), + (0x3381, "M", "na"), + (0x3382, "M", "μa"), + (0x3383, "M", "ma"), + (0x3384, "M", "ka"), + (0x3385, "M", "kb"), + (0x3386, "M", "mb"), + (0x3387, "M", "gb"), + (0x3388, "M", "cal"), + (0x3389, "M", "kcal"), + (0x338A, "M", "pf"), + (0x338B, "M", "nf"), + (0x338C, "M", "μf"), + (0x338D, "M", "μg"), + (0x338E, "M", "mg"), + (0x338F, "M", "kg"), + (0x3390, "M", "hz"), + (0x3391, "M", "khz"), + (0x3392, "M", "mhz"), + (0x3393, "M", "ghz"), + (0x3394, "M", "thz"), + (0x3395, "M", "μl"), + (0x3396, "M", "ml"), + (0x3397, "M", "dl"), + (0x3398, "M", "kl"), + (0x3399, "M", "fm"), + (0x339A, "M", "nm"), + (0x339B, "M", "μm"), + (0x339C, "M", "mm"), + (0x339D, "M", "cm"), + (0x339E, "M", "km"), + (0x339F, "M", "mm2"), + (0x33A0, "M", "cm2"), + (0x33A1, "M", "m2"), + (0x33A2, "M", "km2"), + (0x33A3, "M", "mm3"), + (0x33A4, "M", "cm3"), + (0x33A5, "M", "m3"), + (0x33A6, "M", "km3"), + (0x33A7, "M", "m∕s"), + (0x33A8, "M", "m∕s2"), + (0x33A9, "M", "pa"), + (0x33AA, "M", "kpa"), + (0x33AB, "M", "mpa"), + (0x33AC, "M", "gpa"), + (0x33AD, "M", "rad"), + (0x33AE, "M", "rad∕s"), + (0x33AF, "M", "rad∕s2"), + (0x33B0, "M", "ps"), + (0x33B1, "M", "ns"), + (0x33B2, "M", "μs"), + (0x33B3, "M", "ms"), + (0x33B4, "M", "pv"), + (0x33B5, "M", "nv"), + (0x33B6, "M", "μv"), + (0x33B7, "M", "mv"), + (0x33B8, "M", "kv"), + (0x33B9, "M", "mv"), + (0x33BA, "M", "pw"), + (0x33BB, "M", "nw"), + (0x33BC, "M", "μw"), + (0x33BD, "M", "mw"), + (0x33BE, "M", "kw"), + (0x33BF, "M", "mw"), + (0x33C0, "M", "kω"), + ] + + +def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x33C1, "M", "mω"), + (0x33C2, "X"), + (0x33C3, "M", "bq"), + (0x33C4, "M", "cc"), + (0x33C5, "M", "cd"), + (0x33C6, "M", "c∕kg"), + (0x33C7, "X"), + (0x33C8, "M", "db"), + (0x33C9, "M", "gy"), + (0x33CA, "M", "ha"), + (0x33CB, "M", "hp"), + (0x33CC, "M", "in"), + (0x33CD, "M", "kk"), + (0x33CE, "M", "km"), + (0x33CF, "M", "kt"), + (0x33D0, "M", "lm"), + (0x33D1, "M", "ln"), + (0x33D2, "M", "log"), + (0x33D3, "M", "lx"), + (0x33D4, "M", "mb"), + (0x33D5, "M", "mil"), + (0x33D6, "M", "mol"), + (0x33D7, "M", "ph"), + (0x33D8, "X"), + (0x33D9, "M", "ppm"), + (0x33DA, "M", "pr"), + (0x33DB, "M", "sr"), + (0x33DC, "M", "sv"), + (0x33DD, "M", "wb"), + (0x33DE, "M", "v∕m"), + (0x33DF, "M", "a∕m"), + (0x33E0, "M", "1日"), + (0x33E1, "M", "2日"), + (0x33E2, "M", "3日"), + (0x33E3, "M", "4日"), + (0x33E4, "M", "5日"), + (0x33E5, "M", "6日"), + (0x33E6, "M", "7日"), + (0x33E7, "M", "8日"), + (0x33E8, "M", "9日"), + (0x33E9, "M", "10日"), + (0x33EA, "M", "11日"), + (0x33EB, "M", "12日"), + (0x33EC, "M", "13日"), + (0x33ED, "M", "14日"), + (0x33EE, "M", "15日"), + (0x33EF, "M", "16日"), + (0x33F0, "M", "17日"), + (0x33F1, "M", "18日"), + (0x33F2, "M", "19日"), + (0x33F3, "M", "20日"), + (0x33F4, "M", "21日"), + (0x33F5, "M", "22日"), + (0x33F6, "M", "23日"), + (0x33F7, "M", "24日"), + (0x33F8, "M", "25日"), + (0x33F9, "M", "26日"), + (0x33FA, "M", "27日"), + (0x33FB, "M", "28日"), + (0x33FC, "M", "29日"), + (0x33FD, "M", "30日"), + (0x33FE, "M", "31日"), + (0x33FF, "M", "gal"), + (0x3400, "V"), + (0xA48D, "X"), + (0xA490, "V"), + (0xA4C7, "X"), + (0xA4D0, "V"), + (0xA62C, "X"), + (0xA640, "M", "ꙁ"), + (0xA641, "V"), + (0xA642, "M", "ꙃ"), + (0xA643, "V"), + (0xA644, "M", "ꙅ"), + (0xA645, "V"), + (0xA646, "M", "ꙇ"), + (0xA647, "V"), + (0xA648, "M", "ꙉ"), + (0xA649, "V"), + (0xA64A, "M", "ꙋ"), + (0xA64B, "V"), + (0xA64C, "M", "ꙍ"), + (0xA64D, "V"), + (0xA64E, "M", "ꙏ"), + (0xA64F, "V"), + (0xA650, "M", "ꙑ"), + (0xA651, "V"), + (0xA652, "M", "ꙓ"), + (0xA653, "V"), + (0xA654, "M", "ꙕ"), + (0xA655, "V"), + (0xA656, "M", "ꙗ"), + (0xA657, "V"), + (0xA658, "M", "ꙙ"), + (0xA659, "V"), + (0xA65A, "M", "ꙛ"), + (0xA65B, "V"), + (0xA65C, "M", "ꙝ"), + (0xA65D, "V"), + (0xA65E, "M", "ꙟ"), + ] + + +def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA65F, "V"), + (0xA660, "M", "ꙡ"), + (0xA661, "V"), + (0xA662, "M", "ꙣ"), + (0xA663, "V"), + (0xA664, "M", "ꙥ"), + (0xA665, "V"), + (0xA666, "M", "ꙧ"), + (0xA667, "V"), + (0xA668, "M", "ꙩ"), + (0xA669, "V"), + (0xA66A, "M", "ꙫ"), + (0xA66B, "V"), + (0xA66C, "M", "ꙭ"), + (0xA66D, "V"), + (0xA680, "M", "ꚁ"), + (0xA681, "V"), + (0xA682, "M", "ꚃ"), + (0xA683, "V"), + (0xA684, "M", "ꚅ"), + (0xA685, "V"), + (0xA686, "M", "ꚇ"), + (0xA687, "V"), + (0xA688, "M", "ꚉ"), + (0xA689, "V"), + (0xA68A, "M", "ꚋ"), + (0xA68B, "V"), + (0xA68C, "M", "ꚍ"), + (0xA68D, "V"), + (0xA68E, "M", "ꚏ"), + (0xA68F, "V"), + (0xA690, "M", "ꚑ"), + (0xA691, "V"), + (0xA692, "M", "ꚓ"), + (0xA693, "V"), + (0xA694, "M", "ꚕ"), + (0xA695, "V"), + (0xA696, "M", "ꚗ"), + (0xA697, "V"), + (0xA698, "M", "ꚙ"), + (0xA699, "V"), + (0xA69A, "M", "ꚛ"), + (0xA69B, "V"), + (0xA69C, "M", "ъ"), + (0xA69D, "M", "ь"), + (0xA69E, "V"), + (0xA6F8, "X"), + (0xA700, "V"), + (0xA722, "M", "ꜣ"), + (0xA723, "V"), + (0xA724, "M", "ꜥ"), + (0xA725, "V"), + (0xA726, "M", "ꜧ"), + (0xA727, "V"), + (0xA728, "M", "ꜩ"), + (0xA729, "V"), + (0xA72A, "M", "ꜫ"), + (0xA72B, "V"), + (0xA72C, "M", "ꜭ"), + (0xA72D, "V"), + (0xA72E, "M", "ꜯ"), + (0xA72F, "V"), + (0xA732, "M", "ꜳ"), + (0xA733, "V"), + (0xA734, "M", "ꜵ"), + (0xA735, "V"), + (0xA736, "M", "ꜷ"), + (0xA737, "V"), + (0xA738, "M", "ꜹ"), + (0xA739, "V"), + (0xA73A, "M", "ꜻ"), + (0xA73B, "V"), + (0xA73C, "M", "ꜽ"), + (0xA73D, "V"), + (0xA73E, "M", "ꜿ"), + (0xA73F, "V"), + (0xA740, "M", "ꝁ"), + (0xA741, "V"), + (0xA742, "M", "ꝃ"), + (0xA743, "V"), + (0xA744, "M", "ꝅ"), + (0xA745, "V"), + (0xA746, "M", "ꝇ"), + (0xA747, "V"), + (0xA748, "M", "ꝉ"), + (0xA749, "V"), + (0xA74A, "M", "ꝋ"), + (0xA74B, "V"), + (0xA74C, "M", "ꝍ"), + (0xA74D, "V"), + (0xA74E, "M", "ꝏ"), + (0xA74F, "V"), + (0xA750, "M", "ꝑ"), + (0xA751, "V"), + (0xA752, "M", "ꝓ"), + (0xA753, "V"), + (0xA754, "M", "ꝕ"), + (0xA755, "V"), + (0xA756, "M", "ꝗ"), + (0xA757, "V"), + ] + + +def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA758, "M", "ꝙ"), + (0xA759, "V"), + (0xA75A, "M", "ꝛ"), + (0xA75B, "V"), + (0xA75C, "M", "ꝝ"), + (0xA75D, "V"), + (0xA75E, "M", "ꝟ"), + (0xA75F, "V"), + (0xA760, "M", "ꝡ"), + (0xA761, "V"), + (0xA762, "M", "ꝣ"), + (0xA763, "V"), + (0xA764, "M", "ꝥ"), + (0xA765, "V"), + (0xA766, "M", "ꝧ"), + (0xA767, "V"), + (0xA768, "M", "ꝩ"), + (0xA769, "V"), + (0xA76A, "M", "ꝫ"), + (0xA76B, "V"), + (0xA76C, "M", "ꝭ"), + (0xA76D, "V"), + (0xA76E, "M", "ꝯ"), + (0xA76F, "V"), + (0xA770, "M", "ꝯ"), + (0xA771, "V"), + (0xA779, "M", "ꝺ"), + (0xA77A, "V"), + (0xA77B, "M", "ꝼ"), + (0xA77C, "V"), + (0xA77D, "M", "ᵹ"), + (0xA77E, "M", "ꝿ"), + (0xA77F, "V"), + (0xA780, "M", "ꞁ"), + (0xA781, "V"), + (0xA782, "M", "ꞃ"), + (0xA783, "V"), + (0xA784, "M", "ꞅ"), + (0xA785, "V"), + (0xA786, "M", "ꞇ"), + (0xA787, "V"), + (0xA78B, "M", "ꞌ"), + (0xA78C, "V"), + (0xA78D, "M", "ɥ"), + (0xA78E, "V"), + (0xA790, "M", "ꞑ"), + (0xA791, "V"), + (0xA792, "M", "ꞓ"), + (0xA793, "V"), + (0xA796, "M", "ꞗ"), + (0xA797, "V"), + (0xA798, "M", "ꞙ"), + (0xA799, "V"), + (0xA79A, "M", "ꞛ"), + (0xA79B, "V"), + (0xA79C, "M", "ꞝ"), + (0xA79D, "V"), + (0xA79E, "M", "ꞟ"), + (0xA79F, "V"), + (0xA7A0, "M", "ꞡ"), + (0xA7A1, "V"), + (0xA7A2, "M", "ꞣ"), + (0xA7A3, "V"), + (0xA7A4, "M", "ꞥ"), + (0xA7A5, "V"), + (0xA7A6, "M", "ꞧ"), + (0xA7A7, "V"), + (0xA7A8, "M", "ꞩ"), + (0xA7A9, "V"), + (0xA7AA, "M", "ɦ"), + (0xA7AB, "M", "ɜ"), + (0xA7AC, "M", "ɡ"), + (0xA7AD, "M", "ɬ"), + (0xA7AE, "M", "ɪ"), + (0xA7AF, "V"), + (0xA7B0, "M", "ʞ"), + (0xA7B1, "M", "ʇ"), + (0xA7B2, "M", "ʝ"), + (0xA7B3, "M", "ꭓ"), + (0xA7B4, "M", "ꞵ"), + (0xA7B5, "V"), + (0xA7B6, "M", "ꞷ"), + (0xA7B7, "V"), + (0xA7B8, "M", "ꞹ"), + (0xA7B9, "V"), + (0xA7BA, "M", "ꞻ"), + (0xA7BB, "V"), + (0xA7BC, "M", "ꞽ"), + (0xA7BD, "V"), + (0xA7BE, "M", "ꞿ"), + (0xA7BF, "V"), + (0xA7C0, "M", "ꟁ"), + (0xA7C1, "V"), + (0xA7C2, "M", "ꟃ"), + (0xA7C3, "V"), + (0xA7C4, "M", "ꞔ"), + (0xA7C5, "M", "ʂ"), + (0xA7C6, "M", "ᶎ"), + (0xA7C7, "M", "ꟈ"), + (0xA7C8, "V"), + ] + + +def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA7C9, "M", "ꟊ"), + (0xA7CA, "V"), + (0xA7CB, "M", "ɤ"), + (0xA7CC, "M", "ꟍ"), + (0xA7CD, "V"), + (0xA7CE, "X"), + (0xA7D0, "M", "ꟑ"), + (0xA7D1, "V"), + (0xA7D2, "X"), + (0xA7D3, "V"), + (0xA7D4, "X"), + (0xA7D5, "V"), + (0xA7D6, "M", "ꟗ"), + (0xA7D7, "V"), + (0xA7D8, "M", "ꟙ"), + (0xA7D9, "V"), + (0xA7DA, "M", "ꟛ"), + (0xA7DB, "V"), + (0xA7DC, "M", "ƛ"), + (0xA7DD, "X"), + (0xA7F2, "M", "c"), + (0xA7F3, "M", "f"), + (0xA7F4, "M", "q"), + (0xA7F5, "M", "ꟶ"), + (0xA7F6, "V"), + (0xA7F8, "M", "ħ"), + (0xA7F9, "M", "œ"), + (0xA7FA, "V"), + (0xA82D, "X"), + (0xA830, "V"), + (0xA83A, "X"), + (0xA840, "V"), + (0xA878, "X"), + (0xA880, "V"), + (0xA8C6, "X"), + (0xA8CE, "V"), + (0xA8DA, "X"), + (0xA8E0, "V"), + (0xA954, "X"), + (0xA95F, "V"), + (0xA97D, "X"), + (0xA980, "V"), + (0xA9CE, "X"), + (0xA9CF, "V"), + (0xA9DA, "X"), + (0xA9DE, "V"), + (0xA9FF, "X"), + (0xAA00, "V"), + (0xAA37, "X"), + (0xAA40, "V"), + (0xAA4E, "X"), + (0xAA50, "V"), + (0xAA5A, "X"), + (0xAA5C, "V"), + (0xAAC3, "X"), + (0xAADB, "V"), + (0xAAF7, "X"), + (0xAB01, "V"), + (0xAB07, "X"), + (0xAB09, "V"), + (0xAB0F, "X"), + (0xAB11, "V"), + (0xAB17, "X"), + (0xAB20, "V"), + (0xAB27, "X"), + (0xAB28, "V"), + (0xAB2F, "X"), + (0xAB30, "V"), + (0xAB5C, "M", "ꜧ"), + (0xAB5D, "M", "ꬷ"), + (0xAB5E, "M", "ɫ"), + (0xAB5F, "M", "ꭒ"), + (0xAB60, "V"), + (0xAB69, "M", "ʍ"), + (0xAB6A, "V"), + (0xAB6C, "X"), + (0xAB70, "M", "Ꭰ"), + (0xAB71, "M", "Ꭱ"), + (0xAB72, "M", "Ꭲ"), + (0xAB73, "M", "Ꭳ"), + (0xAB74, "M", "Ꭴ"), + (0xAB75, "M", "Ꭵ"), + (0xAB76, "M", "Ꭶ"), + (0xAB77, "M", "Ꭷ"), + (0xAB78, "M", "Ꭸ"), + (0xAB79, "M", "Ꭹ"), + (0xAB7A, "M", "Ꭺ"), + (0xAB7B, "M", "Ꭻ"), + (0xAB7C, "M", "Ꭼ"), + (0xAB7D, "M", "Ꭽ"), + (0xAB7E, "M", "Ꭾ"), + (0xAB7F, "M", "Ꭿ"), + (0xAB80, "M", "Ꮀ"), + (0xAB81, "M", "Ꮁ"), + (0xAB82, "M", "Ꮂ"), + (0xAB83, "M", "Ꮃ"), + (0xAB84, "M", "Ꮄ"), + (0xAB85, "M", "Ꮅ"), + (0xAB86, "M", "Ꮆ"), + (0xAB87, "M", "Ꮇ"), + ] + + +def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xAB88, "M", "Ꮈ"), + (0xAB89, "M", "Ꮉ"), + (0xAB8A, "M", "Ꮊ"), + (0xAB8B, "M", "Ꮋ"), + (0xAB8C, "M", "Ꮌ"), + (0xAB8D, "M", "Ꮍ"), + (0xAB8E, "M", "Ꮎ"), + (0xAB8F, "M", "Ꮏ"), + (0xAB90, "M", "Ꮐ"), + (0xAB91, "M", "Ꮑ"), + (0xAB92, "M", "Ꮒ"), + (0xAB93, "M", "Ꮓ"), + (0xAB94, "M", "Ꮔ"), + (0xAB95, "M", "Ꮕ"), + (0xAB96, "M", "Ꮖ"), + (0xAB97, "M", "Ꮗ"), + (0xAB98, "M", "Ꮘ"), + (0xAB99, "M", "Ꮙ"), + (0xAB9A, "M", "Ꮚ"), + (0xAB9B, "M", "Ꮛ"), + (0xAB9C, "M", "Ꮜ"), + (0xAB9D, "M", "Ꮝ"), + (0xAB9E, "M", "Ꮞ"), + (0xAB9F, "M", "Ꮟ"), + (0xABA0, "M", "Ꮠ"), + (0xABA1, "M", "Ꮡ"), + (0xABA2, "M", "Ꮢ"), + (0xABA3, "M", "Ꮣ"), + (0xABA4, "M", "Ꮤ"), + (0xABA5, "M", "Ꮥ"), + (0xABA6, "M", "Ꮦ"), + (0xABA7, "M", "Ꮧ"), + (0xABA8, "M", "Ꮨ"), + (0xABA9, "M", "Ꮩ"), + (0xABAA, "M", "Ꮪ"), + (0xABAB, "M", "Ꮫ"), + (0xABAC, "M", "Ꮬ"), + (0xABAD, "M", "Ꮭ"), + (0xABAE, "M", "Ꮮ"), + (0xABAF, "M", "Ꮯ"), + (0xABB0, "M", "Ꮰ"), + (0xABB1, "M", "Ꮱ"), + (0xABB2, "M", "Ꮲ"), + (0xABB3, "M", "Ꮳ"), + (0xABB4, "M", "Ꮴ"), + (0xABB5, "M", "Ꮵ"), + (0xABB6, "M", "Ꮶ"), + (0xABB7, "M", "Ꮷ"), + (0xABB8, "M", "Ꮸ"), + (0xABB9, "M", "Ꮹ"), + (0xABBA, "M", "Ꮺ"), + (0xABBB, "M", "Ꮻ"), + (0xABBC, "M", "Ꮼ"), + (0xABBD, "M", "Ꮽ"), + (0xABBE, "M", "Ꮾ"), + (0xABBF, "M", "Ꮿ"), + (0xABC0, "V"), + (0xABEE, "X"), + (0xABF0, "V"), + (0xABFA, "X"), + (0xAC00, "V"), + (0xD7A4, "X"), + (0xD7B0, "V"), + (0xD7C7, "X"), + (0xD7CB, "V"), + (0xD7FC, "X"), + (0xF900, "M", "豈"), + (0xF901, "M", "更"), + (0xF902, "M", "車"), + (0xF903, "M", "賈"), + (0xF904, "M", "滑"), + (0xF905, "M", "串"), + (0xF906, "M", "句"), + (0xF907, "M", "龜"), + (0xF909, "M", "契"), + (0xF90A, "M", "金"), + (0xF90B, "M", "喇"), + (0xF90C, "M", "奈"), + (0xF90D, "M", "懶"), + (0xF90E, "M", "癩"), + (0xF90F, "M", "羅"), + (0xF910, "M", "蘿"), + (0xF911, "M", "螺"), + (0xF912, "M", "裸"), + (0xF913, "M", "邏"), + (0xF914, "M", "樂"), + (0xF915, "M", "洛"), + (0xF916, "M", "烙"), + (0xF917, "M", "珞"), + (0xF918, "M", "落"), + (0xF919, "M", "酪"), + (0xF91A, "M", "駱"), + (0xF91B, "M", "亂"), + (0xF91C, "M", "卵"), + (0xF91D, "M", "欄"), + (0xF91E, "M", "爛"), + (0xF91F, "M", "蘭"), + (0xF920, "M", "鸞"), + (0xF921, "M", "嵐"), + (0xF922, "M", "濫"), + ] + + +def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xF923, "M", "藍"), + (0xF924, "M", "襤"), + (0xF925, "M", "拉"), + (0xF926, "M", "臘"), + (0xF927, "M", "蠟"), + (0xF928, "M", "廊"), + (0xF929, "M", "朗"), + (0xF92A, "M", "浪"), + (0xF92B, "M", "狼"), + (0xF92C, "M", "郎"), + (0xF92D, "M", "來"), + (0xF92E, "M", "冷"), + (0xF92F, "M", "勞"), + (0xF930, "M", "擄"), + (0xF931, "M", "櫓"), + (0xF932, "M", "爐"), + (0xF933, "M", "盧"), + (0xF934, "M", "老"), + (0xF935, "M", "蘆"), + (0xF936, "M", "虜"), + (0xF937, "M", "路"), + (0xF938, "M", "露"), + (0xF939, "M", "魯"), + (0xF93A, "M", "鷺"), + (0xF93B, "M", "碌"), + (0xF93C, "M", "祿"), + (0xF93D, "M", "綠"), + (0xF93E, "M", "菉"), + (0xF93F, "M", "錄"), + (0xF940, "M", "鹿"), + (0xF941, "M", "論"), + (0xF942, "M", "壟"), + (0xF943, "M", "弄"), + (0xF944, "M", "籠"), + (0xF945, "M", "聾"), + (0xF946, "M", "牢"), + (0xF947, "M", "磊"), + (0xF948, "M", "賂"), + (0xF949, "M", "雷"), + (0xF94A, "M", "壘"), + (0xF94B, "M", "屢"), + (0xF94C, "M", "樓"), + (0xF94D, "M", "淚"), + (0xF94E, "M", "漏"), + (0xF94F, "M", "累"), + (0xF950, "M", "縷"), + (0xF951, "M", "陋"), + (0xF952, "M", "勒"), + (0xF953, "M", "肋"), + (0xF954, "M", "凜"), + (0xF955, "M", "凌"), + (0xF956, "M", "稜"), + (0xF957, "M", "綾"), + (0xF958, "M", "菱"), + (0xF959, "M", "陵"), + (0xF95A, "M", "讀"), + (0xF95B, "M", "拏"), + (0xF95C, "M", "樂"), + (0xF95D, "M", "諾"), + (0xF95E, "M", "丹"), + (0xF95F, "M", "寧"), + (0xF960, "M", "怒"), + (0xF961, "M", "率"), + (0xF962, "M", "異"), + (0xF963, "M", "北"), + (0xF964, "M", "磻"), + (0xF965, "M", "便"), + (0xF966, "M", "復"), + (0xF967, "M", "不"), + (0xF968, "M", "泌"), + (0xF969, "M", "數"), + (0xF96A, "M", "索"), + (0xF96B, "M", "參"), + (0xF96C, "M", "塞"), + (0xF96D, "M", "省"), + (0xF96E, "M", "葉"), + (0xF96F, "M", "說"), + (0xF970, "M", "殺"), + (0xF971, "M", "辰"), + (0xF972, "M", "沈"), + (0xF973, "M", "拾"), + (0xF974, "M", "若"), + (0xF975, "M", "掠"), + (0xF976, "M", "略"), + (0xF977, "M", "亮"), + (0xF978, "M", "兩"), + (0xF979, "M", "凉"), + (0xF97A, "M", "梁"), + (0xF97B, "M", "糧"), + (0xF97C, "M", "良"), + (0xF97D, "M", "諒"), + (0xF97E, "M", "量"), + (0xF97F, "M", "勵"), + (0xF980, "M", "呂"), + (0xF981, "M", "女"), + (0xF982, "M", "廬"), + (0xF983, "M", "旅"), + (0xF984, "M", "濾"), + (0xF985, "M", "礪"), + (0xF986, "M", "閭"), + ] + + +def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xF987, "M", "驪"), + (0xF988, "M", "麗"), + (0xF989, "M", "黎"), + (0xF98A, "M", "力"), + (0xF98B, "M", "曆"), + (0xF98C, "M", "歷"), + (0xF98D, "M", "轢"), + (0xF98E, "M", "年"), + (0xF98F, "M", "憐"), + (0xF990, "M", "戀"), + (0xF991, "M", "撚"), + (0xF992, "M", "漣"), + (0xF993, "M", "煉"), + (0xF994, "M", "璉"), + (0xF995, "M", "秊"), + (0xF996, "M", "練"), + (0xF997, "M", "聯"), + (0xF998, "M", "輦"), + (0xF999, "M", "蓮"), + (0xF99A, "M", "連"), + (0xF99B, "M", "鍊"), + (0xF99C, "M", "列"), + (0xF99D, "M", "劣"), + (0xF99E, "M", "咽"), + (0xF99F, "M", "烈"), + (0xF9A0, "M", "裂"), + (0xF9A1, "M", "說"), + (0xF9A2, "M", "廉"), + (0xF9A3, "M", "念"), + (0xF9A4, "M", "捻"), + (0xF9A5, "M", "殮"), + (0xF9A6, "M", "簾"), + (0xF9A7, "M", "獵"), + (0xF9A8, "M", "令"), + (0xF9A9, "M", "囹"), + (0xF9AA, "M", "寧"), + (0xF9AB, "M", "嶺"), + (0xF9AC, "M", "怜"), + (0xF9AD, "M", "玲"), + (0xF9AE, "M", "瑩"), + (0xF9AF, "M", "羚"), + (0xF9B0, "M", "聆"), + (0xF9B1, "M", "鈴"), + (0xF9B2, "M", "零"), + (0xF9B3, "M", "靈"), + (0xF9B4, "M", "領"), + (0xF9B5, "M", "例"), + (0xF9B6, "M", "禮"), + (0xF9B7, "M", "醴"), + (0xF9B8, "M", "隸"), + (0xF9B9, "M", "惡"), + (0xF9BA, "M", "了"), + (0xF9BB, "M", "僚"), + (0xF9BC, "M", "寮"), + (0xF9BD, "M", "尿"), + (0xF9BE, "M", "料"), + (0xF9BF, "M", "樂"), + (0xF9C0, "M", "燎"), + (0xF9C1, "M", "療"), + (0xF9C2, "M", "蓼"), + (0xF9C3, "M", "遼"), + (0xF9C4, "M", "龍"), + (0xF9C5, "M", "暈"), + (0xF9C6, "M", "阮"), + (0xF9C7, "M", "劉"), + (0xF9C8, "M", "杻"), + (0xF9C9, "M", "柳"), + (0xF9CA, "M", "流"), + (0xF9CB, "M", "溜"), + (0xF9CC, "M", "琉"), + (0xF9CD, "M", "留"), + (0xF9CE, "M", "硫"), + (0xF9CF, "M", "紐"), + (0xF9D0, "M", "類"), + (0xF9D1, "M", "六"), + (0xF9D2, "M", "戮"), + (0xF9D3, "M", "陸"), + (0xF9D4, "M", "倫"), + (0xF9D5, "M", "崙"), + (0xF9D6, "M", "淪"), + (0xF9D7, "M", "輪"), + (0xF9D8, "M", "律"), + (0xF9D9, "M", "慄"), + (0xF9DA, "M", "栗"), + (0xF9DB, "M", "率"), + (0xF9DC, "M", "隆"), + (0xF9DD, "M", "利"), + (0xF9DE, "M", "吏"), + (0xF9DF, "M", "履"), + (0xF9E0, "M", "易"), + (0xF9E1, "M", "李"), + (0xF9E2, "M", "梨"), + (0xF9E3, "M", "泥"), + (0xF9E4, "M", "理"), + (0xF9E5, "M", "痢"), + (0xF9E6, "M", "罹"), + (0xF9E7, "M", "裏"), + (0xF9E8, "M", "裡"), + (0xF9E9, "M", "里"), + (0xF9EA, "M", "離"), + ] + + +def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xF9EB, "M", "匿"), + (0xF9EC, "M", "溺"), + (0xF9ED, "M", "吝"), + (0xF9EE, "M", "燐"), + (0xF9EF, "M", "璘"), + (0xF9F0, "M", "藺"), + (0xF9F1, "M", "隣"), + (0xF9F2, "M", "鱗"), + (0xF9F3, "M", "麟"), + (0xF9F4, "M", "林"), + (0xF9F5, "M", "淋"), + (0xF9F6, "M", "臨"), + (0xF9F7, "M", "立"), + (0xF9F8, "M", "笠"), + (0xF9F9, "M", "粒"), + (0xF9FA, "M", "狀"), + (0xF9FB, "M", "炙"), + (0xF9FC, "M", "識"), + (0xF9FD, "M", "什"), + (0xF9FE, "M", "茶"), + (0xF9FF, "M", "刺"), + (0xFA00, "M", "切"), + (0xFA01, "M", "度"), + (0xFA02, "M", "拓"), + (0xFA03, "M", "糖"), + (0xFA04, "M", "宅"), + (0xFA05, "M", "洞"), + (0xFA06, "M", "暴"), + (0xFA07, "M", "輻"), + (0xFA08, "M", "行"), + (0xFA09, "M", "降"), + (0xFA0A, "M", "見"), + (0xFA0B, "M", "廓"), + (0xFA0C, "M", "兀"), + (0xFA0D, "M", "嗀"), + (0xFA0E, "V"), + (0xFA10, "M", "塚"), + (0xFA11, "V"), + (0xFA12, "M", "晴"), + (0xFA13, "V"), + (0xFA15, "M", "凞"), + (0xFA16, "M", "猪"), + (0xFA17, "M", "益"), + (0xFA18, "M", "礼"), + (0xFA19, "M", "神"), + (0xFA1A, "M", "祥"), + (0xFA1B, "M", "福"), + (0xFA1C, "M", "靖"), + (0xFA1D, "M", "精"), + (0xFA1E, "M", "羽"), + (0xFA1F, "V"), + (0xFA20, "M", "蘒"), + (0xFA21, "V"), + (0xFA22, "M", "諸"), + (0xFA23, "V"), + (0xFA25, "M", "逸"), + (0xFA26, "M", "都"), + (0xFA27, "V"), + (0xFA2A, "M", "飯"), + (0xFA2B, "M", "飼"), + (0xFA2C, "M", "館"), + (0xFA2D, "M", "鶴"), + (0xFA2E, "M", "郞"), + (0xFA2F, "M", "隷"), + (0xFA30, "M", "侮"), + (0xFA31, "M", "僧"), + (0xFA32, "M", "免"), + (0xFA33, "M", "勉"), + (0xFA34, "M", "勤"), + (0xFA35, "M", "卑"), + (0xFA36, "M", "喝"), + (0xFA37, "M", "嘆"), + (0xFA38, "M", "器"), + (0xFA39, "M", "塀"), + (0xFA3A, "M", "墨"), + (0xFA3B, "M", "層"), + (0xFA3C, "M", "屮"), + (0xFA3D, "M", "悔"), + (0xFA3E, "M", "慨"), + (0xFA3F, "M", "憎"), + (0xFA40, "M", "懲"), + (0xFA41, "M", "敏"), + (0xFA42, "M", "既"), + (0xFA43, "M", "暑"), + (0xFA44, "M", "梅"), + (0xFA45, "M", "海"), + (0xFA46, "M", "渚"), + (0xFA47, "M", "漢"), + (0xFA48, "M", "煮"), + (0xFA49, "M", "爫"), + (0xFA4A, "M", "琢"), + (0xFA4B, "M", "碑"), + (0xFA4C, "M", "社"), + (0xFA4D, "M", "祉"), + (0xFA4E, "M", "祈"), + (0xFA4F, "M", "祐"), + (0xFA50, "M", "祖"), + (0xFA51, "M", "祝"), + (0xFA52, "M", "禍"), + (0xFA53, "M", "禎"), + ] + + +def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFA54, "M", "穀"), + (0xFA55, "M", "突"), + (0xFA56, "M", "節"), + (0xFA57, "M", "練"), + (0xFA58, "M", "縉"), + (0xFA59, "M", "繁"), + (0xFA5A, "M", "署"), + (0xFA5B, "M", "者"), + (0xFA5C, "M", "臭"), + (0xFA5D, "M", "艹"), + (0xFA5F, "M", "著"), + (0xFA60, "M", "褐"), + (0xFA61, "M", "視"), + (0xFA62, "M", "謁"), + (0xFA63, "M", "謹"), + (0xFA64, "M", "賓"), + (0xFA65, "M", "贈"), + (0xFA66, "M", "辶"), + (0xFA67, "M", "逸"), + (0xFA68, "M", "難"), + (0xFA69, "M", "響"), + (0xFA6A, "M", "頻"), + (0xFA6B, "M", "恵"), + (0xFA6C, "M", "𤋮"), + (0xFA6D, "M", "舘"), + (0xFA6E, "X"), + (0xFA70, "M", "並"), + (0xFA71, "M", "况"), + (0xFA72, "M", "全"), + (0xFA73, "M", "侀"), + (0xFA74, "M", "充"), + (0xFA75, "M", "冀"), + (0xFA76, "M", "勇"), + (0xFA77, "M", "勺"), + (0xFA78, "M", "喝"), + (0xFA79, "M", "啕"), + (0xFA7A, "M", "喙"), + (0xFA7B, "M", "嗢"), + (0xFA7C, "M", "塚"), + (0xFA7D, "M", "墳"), + (0xFA7E, "M", "奄"), + (0xFA7F, "M", "奔"), + (0xFA80, "M", "婢"), + (0xFA81, "M", "嬨"), + (0xFA82, "M", "廒"), + (0xFA83, "M", "廙"), + (0xFA84, "M", "彩"), + (0xFA85, "M", "徭"), + (0xFA86, "M", "惘"), + (0xFA87, "M", "慎"), + (0xFA88, "M", "愈"), + (0xFA89, "M", "憎"), + (0xFA8A, "M", "慠"), + (0xFA8B, "M", "懲"), + (0xFA8C, "M", "戴"), + (0xFA8D, "M", "揄"), + (0xFA8E, "M", "搜"), + (0xFA8F, "M", "摒"), + (0xFA90, "M", "敖"), + (0xFA91, "M", "晴"), + (0xFA92, "M", "朗"), + (0xFA93, "M", "望"), + (0xFA94, "M", "杖"), + (0xFA95, "M", "歹"), + (0xFA96, "M", "殺"), + (0xFA97, "M", "流"), + (0xFA98, "M", "滛"), + (0xFA99, "M", "滋"), + (0xFA9A, "M", "漢"), + (0xFA9B, "M", "瀞"), + (0xFA9C, "M", "煮"), + (0xFA9D, "M", "瞧"), + (0xFA9E, "M", "爵"), + (0xFA9F, "M", "犯"), + (0xFAA0, "M", "猪"), + (0xFAA1, "M", "瑱"), + (0xFAA2, "M", "甆"), + (0xFAA3, "M", "画"), + (0xFAA4, "M", "瘝"), + (0xFAA5, "M", "瘟"), + (0xFAA6, "M", "益"), + (0xFAA7, "M", "盛"), + (0xFAA8, "M", "直"), + (0xFAA9, "M", "睊"), + (0xFAAA, "M", "着"), + (0xFAAB, "M", "磌"), + (0xFAAC, "M", "窱"), + (0xFAAD, "M", "節"), + (0xFAAE, "M", "类"), + (0xFAAF, "M", "絛"), + (0xFAB0, "M", "練"), + (0xFAB1, "M", "缾"), + (0xFAB2, "M", "者"), + (0xFAB3, "M", "荒"), + (0xFAB4, "M", "華"), + (0xFAB5, "M", "蝹"), + (0xFAB6, "M", "襁"), + (0xFAB7, "M", "覆"), + (0xFAB8, "M", "視"), + (0xFAB9, "M", "調"), + ] + + +def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFABA, "M", "諸"), + (0xFABB, "M", "請"), + (0xFABC, "M", "謁"), + (0xFABD, "M", "諾"), + (0xFABE, "M", "諭"), + (0xFABF, "M", "謹"), + (0xFAC0, "M", "變"), + (0xFAC1, "M", "贈"), + (0xFAC2, "M", "輸"), + (0xFAC3, "M", "遲"), + (0xFAC4, "M", "醙"), + (0xFAC5, "M", "鉶"), + (0xFAC6, "M", "陼"), + (0xFAC7, "M", "難"), + (0xFAC8, "M", "靖"), + (0xFAC9, "M", "韛"), + (0xFACA, "M", "響"), + (0xFACB, "M", "頋"), + (0xFACC, "M", "頻"), + (0xFACD, "M", "鬒"), + (0xFACE, "M", "龜"), + (0xFACF, "M", "𢡊"), + (0xFAD0, "M", "𢡄"), + (0xFAD1, "M", "𣏕"), + (0xFAD2, "M", "㮝"), + (0xFAD3, "M", "䀘"), + (0xFAD4, "M", "䀹"), + (0xFAD5, "M", "𥉉"), + (0xFAD6, "M", "𥳐"), + (0xFAD7, "M", "𧻓"), + (0xFAD8, "M", "齃"), + (0xFAD9, "M", "龎"), + (0xFADA, "X"), + (0xFB00, "M", "ff"), + (0xFB01, "M", "fi"), + (0xFB02, "M", "fl"), + (0xFB03, "M", "ffi"), + (0xFB04, "M", "ffl"), + (0xFB05, "M", "st"), + (0xFB07, "X"), + (0xFB13, "M", "մն"), + (0xFB14, "M", "մե"), + (0xFB15, "M", "մի"), + (0xFB16, "M", "վն"), + (0xFB17, "M", "մխ"), + (0xFB18, "X"), + (0xFB1D, "M", "יִ"), + (0xFB1E, "V"), + (0xFB1F, "M", "ײַ"), + (0xFB20, "M", "ע"), + (0xFB21, "M", "א"), + (0xFB22, "M", "ד"), + (0xFB23, "M", "ה"), + (0xFB24, "M", "כ"), + (0xFB25, "M", "ל"), + (0xFB26, "M", "ם"), + (0xFB27, "M", "ר"), + (0xFB28, "M", "ת"), + (0xFB29, "M", "+"), + (0xFB2A, "M", "שׁ"), + (0xFB2B, "M", "שׂ"), + (0xFB2C, "M", "שּׁ"), + (0xFB2D, "M", "שּׂ"), + (0xFB2E, "M", "אַ"), + (0xFB2F, "M", "אָ"), + (0xFB30, "M", "אּ"), + (0xFB31, "M", "בּ"), + (0xFB32, "M", "גּ"), + (0xFB33, "M", "דּ"), + (0xFB34, "M", "הּ"), + (0xFB35, "M", "וּ"), + (0xFB36, "M", "זּ"), + (0xFB37, "X"), + (0xFB38, "M", "טּ"), + (0xFB39, "M", "יּ"), + (0xFB3A, "M", "ךּ"), + (0xFB3B, "M", "כּ"), + (0xFB3C, "M", "לּ"), + (0xFB3D, "X"), + (0xFB3E, "M", "מּ"), + (0xFB3F, "X"), + (0xFB40, "M", "נּ"), + (0xFB41, "M", "סּ"), + (0xFB42, "X"), + (0xFB43, "M", "ףּ"), + (0xFB44, "M", "פּ"), + (0xFB45, "X"), + (0xFB46, "M", "צּ"), + (0xFB47, "M", "קּ"), + (0xFB48, "M", "רּ"), + (0xFB49, "M", "שּ"), + (0xFB4A, "M", "תּ"), + (0xFB4B, "M", "וֹ"), + (0xFB4C, "M", "בֿ"), + (0xFB4D, "M", "כֿ"), + (0xFB4E, "M", "פֿ"), + (0xFB4F, "M", "אל"), + (0xFB50, "M", "ٱ"), + (0xFB52, "M", "ٻ"), + (0xFB56, "M", "پ"), + ] + + +def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFB5A, "M", "ڀ"), + (0xFB5E, "M", "ٺ"), + (0xFB62, "M", "ٿ"), + (0xFB66, "M", "ٹ"), + (0xFB6A, "M", "ڤ"), + (0xFB6E, "M", "ڦ"), + (0xFB72, "M", "ڄ"), + (0xFB76, "M", "ڃ"), + (0xFB7A, "M", "چ"), + (0xFB7E, "M", "ڇ"), + (0xFB82, "M", "ڍ"), + (0xFB84, "M", "ڌ"), + (0xFB86, "M", "ڎ"), + (0xFB88, "M", "ڈ"), + (0xFB8A, "M", "ژ"), + (0xFB8C, "M", "ڑ"), + (0xFB8E, "M", "ک"), + (0xFB92, "M", "گ"), + (0xFB96, "M", "ڳ"), + (0xFB9A, "M", "ڱ"), + (0xFB9E, "M", "ں"), + (0xFBA0, "M", "ڻ"), + (0xFBA4, "M", "ۀ"), + (0xFBA6, "M", "ہ"), + (0xFBAA, "M", "ھ"), + (0xFBAE, "M", "ے"), + (0xFBB0, "M", "ۓ"), + (0xFBB2, "V"), + (0xFBC3, "X"), + (0xFBD3, "M", "ڭ"), + (0xFBD7, "M", "ۇ"), + (0xFBD9, "M", "ۆ"), + (0xFBDB, "M", "ۈ"), + (0xFBDD, "M", "ۇٴ"), + (0xFBDE, "M", "ۋ"), + (0xFBE0, "M", "ۅ"), + (0xFBE2, "M", "ۉ"), + (0xFBE4, "M", "ې"), + (0xFBE8, "M", "ى"), + (0xFBEA, "M", "ئا"), + (0xFBEC, "M", "ئە"), + (0xFBEE, "M", "ئو"), + (0xFBF0, "M", "ئۇ"), + (0xFBF2, "M", "ئۆ"), + (0xFBF4, "M", "ئۈ"), + (0xFBF6, "M", "ئې"), + (0xFBF9, "M", "ئى"), + (0xFBFC, "M", "ی"), + (0xFC00, "M", "ئج"), + (0xFC01, "M", "ئح"), + (0xFC02, "M", "ئم"), + (0xFC03, "M", "ئى"), + (0xFC04, "M", "ئي"), + (0xFC05, "M", "بج"), + (0xFC06, "M", "بح"), + (0xFC07, "M", "بخ"), + (0xFC08, "M", "بم"), + (0xFC09, "M", "بى"), + (0xFC0A, "M", "بي"), + (0xFC0B, "M", "تج"), + (0xFC0C, "M", "تح"), + (0xFC0D, "M", "تخ"), + (0xFC0E, "M", "تم"), + (0xFC0F, "M", "تى"), + (0xFC10, "M", "تي"), + (0xFC11, "M", "ثج"), + (0xFC12, "M", "ثم"), + (0xFC13, "M", "ثى"), + (0xFC14, "M", "ثي"), + (0xFC15, "M", "جح"), + (0xFC16, "M", "جم"), + (0xFC17, "M", "حج"), + (0xFC18, "M", "حم"), + (0xFC19, "M", "خج"), + (0xFC1A, "M", "خح"), + (0xFC1B, "M", "خم"), + (0xFC1C, "M", "سج"), + (0xFC1D, "M", "سح"), + (0xFC1E, "M", "سخ"), + (0xFC1F, "M", "سم"), + (0xFC20, "M", "صح"), + (0xFC21, "M", "صم"), + (0xFC22, "M", "ضج"), + (0xFC23, "M", "ضح"), + (0xFC24, "M", "ضخ"), + (0xFC25, "M", "ضم"), + (0xFC26, "M", "طح"), + (0xFC27, "M", "طم"), + (0xFC28, "M", "ظم"), + (0xFC29, "M", "عج"), + (0xFC2A, "M", "عم"), + (0xFC2B, "M", "غج"), + (0xFC2C, "M", "غم"), + (0xFC2D, "M", "فج"), + (0xFC2E, "M", "فح"), + (0xFC2F, "M", "فخ"), + (0xFC30, "M", "فم"), + (0xFC31, "M", "فى"), + (0xFC32, "M", "في"), + (0xFC33, "M", "قح"), + ] + + +def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFC34, "M", "قم"), + (0xFC35, "M", "قى"), + (0xFC36, "M", "قي"), + (0xFC37, "M", "كا"), + (0xFC38, "M", "كج"), + (0xFC39, "M", "كح"), + (0xFC3A, "M", "كخ"), + (0xFC3B, "M", "كل"), + (0xFC3C, "M", "كم"), + (0xFC3D, "M", "كى"), + (0xFC3E, "M", "كي"), + (0xFC3F, "M", "لج"), + (0xFC40, "M", "لح"), + (0xFC41, "M", "لخ"), + (0xFC42, "M", "لم"), + (0xFC43, "M", "لى"), + (0xFC44, "M", "لي"), + (0xFC45, "M", "مج"), + (0xFC46, "M", "مح"), + (0xFC47, "M", "مخ"), + (0xFC48, "M", "مم"), + (0xFC49, "M", "مى"), + (0xFC4A, "M", "مي"), + (0xFC4B, "M", "نج"), + (0xFC4C, "M", "نح"), + (0xFC4D, "M", "نخ"), + (0xFC4E, "M", "نم"), + (0xFC4F, "M", "نى"), + (0xFC50, "M", "ني"), + (0xFC51, "M", "هج"), + (0xFC52, "M", "هم"), + (0xFC53, "M", "هى"), + (0xFC54, "M", "هي"), + (0xFC55, "M", "يج"), + (0xFC56, "M", "يح"), + (0xFC57, "M", "يخ"), + (0xFC58, "M", "يم"), + (0xFC59, "M", "يى"), + (0xFC5A, "M", "يي"), + (0xFC5B, "M", "ذٰ"), + (0xFC5C, "M", "رٰ"), + (0xFC5D, "M", "ىٰ"), + (0xFC5E, "M", " ٌّ"), + (0xFC5F, "M", " ٍّ"), + (0xFC60, "M", " َّ"), + (0xFC61, "M", " ُّ"), + (0xFC62, "M", " ِّ"), + (0xFC63, "M", " ّٰ"), + (0xFC64, "M", "ئر"), + (0xFC65, "M", "ئز"), + (0xFC66, "M", "ئم"), + (0xFC67, "M", "ئن"), + (0xFC68, "M", "ئى"), + (0xFC69, "M", "ئي"), + (0xFC6A, "M", "بر"), + (0xFC6B, "M", "بز"), + (0xFC6C, "M", "بم"), + (0xFC6D, "M", "بن"), + (0xFC6E, "M", "بى"), + (0xFC6F, "M", "بي"), + (0xFC70, "M", "تر"), + (0xFC71, "M", "تز"), + (0xFC72, "M", "تم"), + (0xFC73, "M", "تن"), + (0xFC74, "M", "تى"), + (0xFC75, "M", "تي"), + (0xFC76, "M", "ثر"), + (0xFC77, "M", "ثز"), + (0xFC78, "M", "ثم"), + (0xFC79, "M", "ثن"), + (0xFC7A, "M", "ثى"), + (0xFC7B, "M", "ثي"), + (0xFC7C, "M", "فى"), + (0xFC7D, "M", "في"), + (0xFC7E, "M", "قى"), + (0xFC7F, "M", "قي"), + (0xFC80, "M", "كا"), + (0xFC81, "M", "كل"), + (0xFC82, "M", "كم"), + (0xFC83, "M", "كى"), + (0xFC84, "M", "كي"), + (0xFC85, "M", "لم"), + (0xFC86, "M", "لى"), + (0xFC87, "M", "لي"), + (0xFC88, "M", "ما"), + (0xFC89, "M", "مم"), + (0xFC8A, "M", "نر"), + (0xFC8B, "M", "نز"), + (0xFC8C, "M", "نم"), + (0xFC8D, "M", "نن"), + (0xFC8E, "M", "نى"), + (0xFC8F, "M", "ني"), + (0xFC90, "M", "ىٰ"), + (0xFC91, "M", "ير"), + (0xFC92, "M", "يز"), + (0xFC93, "M", "يم"), + (0xFC94, "M", "ين"), + (0xFC95, "M", "يى"), + (0xFC96, "M", "يي"), + (0xFC97, "M", "ئج"), + ] + + +def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFC98, "M", "ئح"), + (0xFC99, "M", "ئخ"), + (0xFC9A, "M", "ئم"), + (0xFC9B, "M", "ئه"), + (0xFC9C, "M", "بج"), + (0xFC9D, "M", "بح"), + (0xFC9E, "M", "بخ"), + (0xFC9F, "M", "بم"), + (0xFCA0, "M", "به"), + (0xFCA1, "M", "تج"), + (0xFCA2, "M", "تح"), + (0xFCA3, "M", "تخ"), + (0xFCA4, "M", "تم"), + (0xFCA5, "M", "ته"), + (0xFCA6, "M", "ثم"), + (0xFCA7, "M", "جح"), + (0xFCA8, "M", "جم"), + (0xFCA9, "M", "حج"), + (0xFCAA, "M", "حم"), + (0xFCAB, "M", "خج"), + (0xFCAC, "M", "خم"), + (0xFCAD, "M", "سج"), + (0xFCAE, "M", "سح"), + (0xFCAF, "M", "سخ"), + (0xFCB0, "M", "سم"), + (0xFCB1, "M", "صح"), + (0xFCB2, "M", "صخ"), + (0xFCB3, "M", "صم"), + (0xFCB4, "M", "ضج"), + (0xFCB5, "M", "ضح"), + (0xFCB6, "M", "ضخ"), + (0xFCB7, "M", "ضم"), + (0xFCB8, "M", "طح"), + (0xFCB9, "M", "ظم"), + (0xFCBA, "M", "عج"), + (0xFCBB, "M", "عم"), + (0xFCBC, "M", "غج"), + (0xFCBD, "M", "غم"), + (0xFCBE, "M", "فج"), + (0xFCBF, "M", "فح"), + (0xFCC0, "M", "فخ"), + (0xFCC1, "M", "فم"), + (0xFCC2, "M", "قح"), + (0xFCC3, "M", "قم"), + (0xFCC4, "M", "كج"), + (0xFCC5, "M", "كح"), + (0xFCC6, "M", "كخ"), + (0xFCC7, "M", "كل"), + (0xFCC8, "M", "كم"), + (0xFCC9, "M", "لج"), + (0xFCCA, "M", "لح"), + (0xFCCB, "M", "لخ"), + (0xFCCC, "M", "لم"), + (0xFCCD, "M", "له"), + (0xFCCE, "M", "مج"), + (0xFCCF, "M", "مح"), + (0xFCD0, "M", "مخ"), + (0xFCD1, "M", "مم"), + (0xFCD2, "M", "نج"), + (0xFCD3, "M", "نح"), + (0xFCD4, "M", "نخ"), + (0xFCD5, "M", "نم"), + (0xFCD6, "M", "نه"), + (0xFCD7, "M", "هج"), + (0xFCD8, "M", "هم"), + (0xFCD9, "M", "هٰ"), + (0xFCDA, "M", "يج"), + (0xFCDB, "M", "يح"), + (0xFCDC, "M", "يخ"), + (0xFCDD, "M", "يم"), + (0xFCDE, "M", "يه"), + (0xFCDF, "M", "ئم"), + (0xFCE0, "M", "ئه"), + (0xFCE1, "M", "بم"), + (0xFCE2, "M", "به"), + (0xFCE3, "M", "تم"), + (0xFCE4, "M", "ته"), + (0xFCE5, "M", "ثم"), + (0xFCE6, "M", "ثه"), + (0xFCE7, "M", "سم"), + (0xFCE8, "M", "سه"), + (0xFCE9, "M", "شم"), + (0xFCEA, "M", "شه"), + (0xFCEB, "M", "كل"), + (0xFCEC, "M", "كم"), + (0xFCED, "M", "لم"), + (0xFCEE, "M", "نم"), + (0xFCEF, "M", "نه"), + (0xFCF0, "M", "يم"), + (0xFCF1, "M", "يه"), + (0xFCF2, "M", "ـَّ"), + (0xFCF3, "M", "ـُّ"), + (0xFCF4, "M", "ـِّ"), + (0xFCF5, "M", "طى"), + (0xFCF6, "M", "طي"), + (0xFCF7, "M", "عى"), + (0xFCF8, "M", "عي"), + (0xFCF9, "M", "غى"), + (0xFCFA, "M", "غي"), + (0xFCFB, "M", "سى"), + ] + + +def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFCFC, "M", "سي"), + (0xFCFD, "M", "شى"), + (0xFCFE, "M", "شي"), + (0xFCFF, "M", "حى"), + (0xFD00, "M", "حي"), + (0xFD01, "M", "جى"), + (0xFD02, "M", "جي"), + (0xFD03, "M", "خى"), + (0xFD04, "M", "خي"), + (0xFD05, "M", "صى"), + (0xFD06, "M", "صي"), + (0xFD07, "M", "ضى"), + (0xFD08, "M", "ضي"), + (0xFD09, "M", "شج"), + (0xFD0A, "M", "شح"), + (0xFD0B, "M", "شخ"), + (0xFD0C, "M", "شم"), + (0xFD0D, "M", "شر"), + (0xFD0E, "M", "سر"), + (0xFD0F, "M", "صر"), + (0xFD10, "M", "ضر"), + (0xFD11, "M", "طى"), + (0xFD12, "M", "طي"), + (0xFD13, "M", "عى"), + (0xFD14, "M", "عي"), + (0xFD15, "M", "غى"), + (0xFD16, "M", "غي"), + (0xFD17, "M", "سى"), + (0xFD18, "M", "سي"), + (0xFD19, "M", "شى"), + (0xFD1A, "M", "شي"), + (0xFD1B, "M", "حى"), + (0xFD1C, "M", "حي"), + (0xFD1D, "M", "جى"), + (0xFD1E, "M", "جي"), + (0xFD1F, "M", "خى"), + (0xFD20, "M", "خي"), + (0xFD21, "M", "صى"), + (0xFD22, "M", "صي"), + (0xFD23, "M", "ضى"), + (0xFD24, "M", "ضي"), + (0xFD25, "M", "شج"), + (0xFD26, "M", "شح"), + (0xFD27, "M", "شخ"), + (0xFD28, "M", "شم"), + (0xFD29, "M", "شر"), + (0xFD2A, "M", "سر"), + (0xFD2B, "M", "صر"), + (0xFD2C, "M", "ضر"), + (0xFD2D, "M", "شج"), + (0xFD2E, "M", "شح"), + (0xFD2F, "M", "شخ"), + (0xFD30, "M", "شم"), + (0xFD31, "M", "سه"), + (0xFD32, "M", "شه"), + (0xFD33, "M", "طم"), + (0xFD34, "M", "سج"), + (0xFD35, "M", "سح"), + (0xFD36, "M", "سخ"), + (0xFD37, "M", "شج"), + (0xFD38, "M", "شح"), + (0xFD39, "M", "شخ"), + (0xFD3A, "M", "طم"), + (0xFD3B, "M", "ظم"), + (0xFD3C, "M", "اً"), + (0xFD3E, "V"), + (0xFD50, "M", "تجم"), + (0xFD51, "M", "تحج"), + (0xFD53, "M", "تحم"), + (0xFD54, "M", "تخم"), + (0xFD55, "M", "تمج"), + (0xFD56, "M", "تمح"), + (0xFD57, "M", "تمخ"), + (0xFD58, "M", "جمح"), + (0xFD5A, "M", "حمي"), + (0xFD5B, "M", "حمى"), + (0xFD5C, "M", "سحج"), + (0xFD5D, "M", "سجح"), + (0xFD5E, "M", "سجى"), + (0xFD5F, "M", "سمح"), + (0xFD61, "M", "سمج"), + (0xFD62, "M", "سمم"), + (0xFD64, "M", "صحح"), + (0xFD66, "M", "صمم"), + (0xFD67, "M", "شحم"), + (0xFD69, "M", "شجي"), + (0xFD6A, "M", "شمخ"), + (0xFD6C, "M", "شمم"), + (0xFD6E, "M", "ضحى"), + (0xFD6F, "M", "ضخم"), + (0xFD71, "M", "طمح"), + (0xFD73, "M", "طمم"), + (0xFD74, "M", "طمي"), + (0xFD75, "M", "عجم"), + (0xFD76, "M", "عمم"), + (0xFD78, "M", "عمى"), + (0xFD79, "M", "غمم"), + (0xFD7A, "M", "غمي"), + (0xFD7B, "M", "غمى"), + (0xFD7C, "M", "فخم"), + ] + + +def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFD7E, "M", "قمح"), + (0xFD7F, "M", "قمم"), + (0xFD80, "M", "لحم"), + (0xFD81, "M", "لحي"), + (0xFD82, "M", "لحى"), + (0xFD83, "M", "لجج"), + (0xFD85, "M", "لخم"), + (0xFD87, "M", "لمح"), + (0xFD89, "M", "محج"), + (0xFD8A, "M", "محم"), + (0xFD8B, "M", "محي"), + (0xFD8C, "M", "مجح"), + (0xFD8D, "M", "مجم"), + (0xFD8E, "M", "مخج"), + (0xFD8F, "M", "مخم"), + (0xFD90, "X"), + (0xFD92, "M", "مجخ"), + (0xFD93, "M", "همج"), + (0xFD94, "M", "همم"), + (0xFD95, "M", "نحم"), + (0xFD96, "M", "نحى"), + (0xFD97, "M", "نجم"), + (0xFD99, "M", "نجى"), + (0xFD9A, "M", "نمي"), + (0xFD9B, "M", "نمى"), + (0xFD9C, "M", "يمم"), + (0xFD9E, "M", "بخي"), + (0xFD9F, "M", "تجي"), + (0xFDA0, "M", "تجى"), + (0xFDA1, "M", "تخي"), + (0xFDA2, "M", "تخى"), + (0xFDA3, "M", "تمي"), + (0xFDA4, "M", "تمى"), + (0xFDA5, "M", "جمي"), + (0xFDA6, "M", "جحى"), + (0xFDA7, "M", "جمى"), + (0xFDA8, "M", "سخى"), + (0xFDA9, "M", "صحي"), + (0xFDAA, "M", "شحي"), + (0xFDAB, "M", "ضحي"), + (0xFDAC, "M", "لجي"), + (0xFDAD, "M", "لمي"), + (0xFDAE, "M", "يحي"), + (0xFDAF, "M", "يجي"), + (0xFDB0, "M", "يمي"), + (0xFDB1, "M", "ممي"), + (0xFDB2, "M", "قمي"), + (0xFDB3, "M", "نحي"), + (0xFDB4, "M", "قمح"), + (0xFDB5, "M", "لحم"), + (0xFDB6, "M", "عمي"), + (0xFDB7, "M", "كمي"), + (0xFDB8, "M", "نجح"), + (0xFDB9, "M", "مخي"), + (0xFDBA, "M", "لجم"), + (0xFDBB, "M", "كمم"), + (0xFDBC, "M", "لجم"), + (0xFDBD, "M", "نجح"), + (0xFDBE, "M", "جحي"), + (0xFDBF, "M", "حجي"), + (0xFDC0, "M", "مجي"), + (0xFDC1, "M", "فمي"), + (0xFDC2, "M", "بحي"), + (0xFDC3, "M", "كمم"), + (0xFDC4, "M", "عجم"), + (0xFDC5, "M", "صمم"), + (0xFDC6, "M", "سخي"), + (0xFDC7, "M", "نجي"), + (0xFDC8, "X"), + (0xFDCF, "V"), + (0xFDD0, "X"), + (0xFDF0, "M", "صلے"), + (0xFDF1, "M", "قلے"), + (0xFDF2, "M", "الله"), + (0xFDF3, "M", "اكبر"), + (0xFDF4, "M", "محمد"), + (0xFDF5, "M", "صلعم"), + (0xFDF6, "M", "رسول"), + (0xFDF7, "M", "عليه"), + (0xFDF8, "M", "وسلم"), + (0xFDF9, "M", "صلى"), + (0xFDFA, "M", "صلى الله عليه وسلم"), + (0xFDFB, "M", "جل جلاله"), + (0xFDFC, "M", "ریال"), + (0xFDFD, "V"), + (0xFE00, "I"), + (0xFE10, "M", ","), + (0xFE11, "M", "、"), + (0xFE12, "X"), + (0xFE13, "M", ":"), + (0xFE14, "M", ";"), + (0xFE15, "M", "!"), + (0xFE16, "M", "?"), + (0xFE17, "M", "〖"), + (0xFE18, "M", "〗"), + (0xFE19, "X"), + (0xFE20, "V"), + (0xFE30, "X"), + (0xFE31, "M", "—"), + (0xFE32, "M", "–"), + ] + + +def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFE33, "M", "_"), + (0xFE35, "M", "("), + (0xFE36, "M", ")"), + (0xFE37, "M", "{"), + (0xFE38, "M", "}"), + (0xFE39, "M", "〔"), + (0xFE3A, "M", "〕"), + (0xFE3B, "M", "【"), + (0xFE3C, "M", "】"), + (0xFE3D, "M", "《"), + (0xFE3E, "M", "》"), + (0xFE3F, "M", "〈"), + (0xFE40, "M", "〉"), + (0xFE41, "M", "「"), + (0xFE42, "M", "」"), + (0xFE43, "M", "『"), + (0xFE44, "M", "』"), + (0xFE45, "V"), + (0xFE47, "M", "["), + (0xFE48, "M", "]"), + (0xFE49, "M", " ̅"), + (0xFE4D, "M", "_"), + (0xFE50, "M", ","), + (0xFE51, "M", "、"), + (0xFE52, "X"), + (0xFE54, "M", ";"), + (0xFE55, "M", ":"), + (0xFE56, "M", "?"), + (0xFE57, "M", "!"), + (0xFE58, "M", "—"), + (0xFE59, "M", "("), + (0xFE5A, "M", ")"), + (0xFE5B, "M", "{"), + (0xFE5C, "M", "}"), + (0xFE5D, "M", "〔"), + (0xFE5E, "M", "〕"), + (0xFE5F, "M", "#"), + (0xFE60, "M", "&"), + (0xFE61, "M", "*"), + (0xFE62, "M", "+"), + (0xFE63, "M", "-"), + (0xFE64, "M", "<"), + (0xFE65, "M", ">"), + (0xFE66, "M", "="), + (0xFE67, "X"), + (0xFE68, "M", "\\"), + (0xFE69, "M", "$"), + (0xFE6A, "M", "%"), + (0xFE6B, "M", "@"), + (0xFE6C, "X"), + (0xFE70, "M", " ً"), + (0xFE71, "M", "ـً"), + (0xFE72, "M", " ٌ"), + (0xFE73, "V"), + (0xFE74, "M", " ٍ"), + (0xFE75, "X"), + (0xFE76, "M", " َ"), + (0xFE77, "M", "ـَ"), + (0xFE78, "M", " ُ"), + (0xFE79, "M", "ـُ"), + (0xFE7A, "M", " ِ"), + (0xFE7B, "M", "ـِ"), + (0xFE7C, "M", " ّ"), + (0xFE7D, "M", "ـّ"), + (0xFE7E, "M", " ْ"), + (0xFE7F, "M", "ـْ"), + (0xFE80, "M", "ء"), + (0xFE81, "M", "آ"), + (0xFE83, "M", "أ"), + (0xFE85, "M", "ؤ"), + (0xFE87, "M", "إ"), + (0xFE89, "M", "ئ"), + (0xFE8D, "M", "ا"), + (0xFE8F, "M", "ب"), + (0xFE93, "M", "ة"), + (0xFE95, "M", "ت"), + (0xFE99, "M", "ث"), + (0xFE9D, "M", "ج"), + (0xFEA1, "M", "ح"), + (0xFEA5, "M", "خ"), + (0xFEA9, "M", "د"), + (0xFEAB, "M", "ذ"), + (0xFEAD, "M", "ر"), + (0xFEAF, "M", "ز"), + (0xFEB1, "M", "س"), + (0xFEB5, "M", "ش"), + (0xFEB9, "M", "ص"), + (0xFEBD, "M", "ض"), + (0xFEC1, "M", "ط"), + (0xFEC5, "M", "ظ"), + (0xFEC9, "M", "ع"), + (0xFECD, "M", "غ"), + (0xFED1, "M", "ف"), + (0xFED5, "M", "ق"), + (0xFED9, "M", "ك"), + (0xFEDD, "M", "ل"), + (0xFEE1, "M", "م"), + (0xFEE5, "M", "ن"), + (0xFEE9, "M", "ه"), + (0xFEED, "M", "و"), + ] + + +def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFEEF, "M", "ى"), + (0xFEF1, "M", "ي"), + (0xFEF5, "M", "لآ"), + (0xFEF7, "M", "لأ"), + (0xFEF9, "M", "لإ"), + (0xFEFB, "M", "لا"), + (0xFEFD, "X"), + (0xFEFF, "I"), + (0xFF00, "X"), + (0xFF01, "M", "!"), + (0xFF02, "M", '"'), + (0xFF03, "M", "#"), + (0xFF04, "M", "$"), + (0xFF05, "M", "%"), + (0xFF06, "M", "&"), + (0xFF07, "M", "'"), + (0xFF08, "M", "("), + (0xFF09, "M", ")"), + (0xFF0A, "M", "*"), + (0xFF0B, "M", "+"), + (0xFF0C, "M", ","), + (0xFF0D, "M", "-"), + (0xFF0E, "M", "."), + (0xFF0F, "M", "/"), + (0xFF10, "M", "0"), + (0xFF11, "M", "1"), + (0xFF12, "M", "2"), + (0xFF13, "M", "3"), + (0xFF14, "M", "4"), + (0xFF15, "M", "5"), + (0xFF16, "M", "6"), + (0xFF17, "M", "7"), + (0xFF18, "M", "8"), + (0xFF19, "M", "9"), + (0xFF1A, "M", ":"), + (0xFF1B, "M", ";"), + (0xFF1C, "M", "<"), + (0xFF1D, "M", "="), + (0xFF1E, "M", ">"), + (0xFF1F, "M", "?"), + (0xFF20, "M", "@"), + (0xFF21, "M", "a"), + (0xFF22, "M", "b"), + (0xFF23, "M", "c"), + (0xFF24, "M", "d"), + (0xFF25, "M", "e"), + (0xFF26, "M", "f"), + (0xFF27, "M", "g"), + (0xFF28, "M", "h"), + (0xFF29, "M", "i"), + (0xFF2A, "M", "j"), + (0xFF2B, "M", "k"), + (0xFF2C, "M", "l"), + (0xFF2D, "M", "m"), + (0xFF2E, "M", "n"), + (0xFF2F, "M", "o"), + (0xFF30, "M", "p"), + (0xFF31, "M", "q"), + (0xFF32, "M", "r"), + (0xFF33, "M", "s"), + (0xFF34, "M", "t"), + (0xFF35, "M", "u"), + (0xFF36, "M", "v"), + (0xFF37, "M", "w"), + (0xFF38, "M", "x"), + (0xFF39, "M", "y"), + (0xFF3A, "M", "z"), + (0xFF3B, "M", "["), + (0xFF3C, "M", "\\"), + (0xFF3D, "M", "]"), + (0xFF3E, "M", "^"), + (0xFF3F, "M", "_"), + (0xFF40, "M", "`"), + (0xFF41, "M", "a"), + (0xFF42, "M", "b"), + (0xFF43, "M", "c"), + (0xFF44, "M", "d"), + (0xFF45, "M", "e"), + (0xFF46, "M", "f"), + (0xFF47, "M", "g"), + (0xFF48, "M", "h"), + (0xFF49, "M", "i"), + (0xFF4A, "M", "j"), + (0xFF4B, "M", "k"), + (0xFF4C, "M", "l"), + (0xFF4D, "M", "m"), + (0xFF4E, "M", "n"), + (0xFF4F, "M", "o"), + (0xFF50, "M", "p"), + (0xFF51, "M", "q"), + (0xFF52, "M", "r"), + (0xFF53, "M", "s"), + (0xFF54, "M", "t"), + (0xFF55, "M", "u"), + (0xFF56, "M", "v"), + (0xFF57, "M", "w"), + (0xFF58, "M", "x"), + (0xFF59, "M", "y"), + (0xFF5A, "M", "z"), + (0xFF5B, "M", "{"), + ] + + +def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFF5C, "M", "|"), + (0xFF5D, "M", "}"), + (0xFF5E, "M", "~"), + (0xFF5F, "M", "⦅"), + (0xFF60, "M", "⦆"), + (0xFF61, "M", "."), + (0xFF62, "M", "「"), + (0xFF63, "M", "」"), + (0xFF64, "M", "、"), + (0xFF65, "M", "・"), + (0xFF66, "M", "ヲ"), + (0xFF67, "M", "ァ"), + (0xFF68, "M", "ィ"), + (0xFF69, "M", "ゥ"), + (0xFF6A, "M", "ェ"), + (0xFF6B, "M", "ォ"), + (0xFF6C, "M", "ャ"), + (0xFF6D, "M", "ュ"), + (0xFF6E, "M", "ョ"), + (0xFF6F, "M", "ッ"), + (0xFF70, "M", "ー"), + (0xFF71, "M", "ア"), + (0xFF72, "M", "イ"), + (0xFF73, "M", "ウ"), + (0xFF74, "M", "エ"), + (0xFF75, "M", "オ"), + (0xFF76, "M", "カ"), + (0xFF77, "M", "キ"), + (0xFF78, "M", "ク"), + (0xFF79, "M", "ケ"), + (0xFF7A, "M", "コ"), + (0xFF7B, "M", "サ"), + (0xFF7C, "M", "シ"), + (0xFF7D, "M", "ス"), + (0xFF7E, "M", "セ"), + (0xFF7F, "M", "ソ"), + (0xFF80, "M", "タ"), + (0xFF81, "M", "チ"), + (0xFF82, "M", "ツ"), + (0xFF83, "M", "テ"), + (0xFF84, "M", "ト"), + (0xFF85, "M", "ナ"), + (0xFF86, "M", "ニ"), + (0xFF87, "M", "ヌ"), + (0xFF88, "M", "ネ"), + (0xFF89, "M", "ノ"), + (0xFF8A, "M", "ハ"), + (0xFF8B, "M", "ヒ"), + (0xFF8C, "M", "フ"), + (0xFF8D, "M", "ヘ"), + (0xFF8E, "M", "ホ"), + (0xFF8F, "M", "マ"), + (0xFF90, "M", "ミ"), + (0xFF91, "M", "ム"), + (0xFF92, "M", "メ"), + (0xFF93, "M", "モ"), + (0xFF94, "M", "ヤ"), + (0xFF95, "M", "ユ"), + (0xFF96, "M", "ヨ"), + (0xFF97, "M", "ラ"), + (0xFF98, "M", "リ"), + (0xFF99, "M", "ル"), + (0xFF9A, "M", "レ"), + (0xFF9B, "M", "ロ"), + (0xFF9C, "M", "ワ"), + (0xFF9D, "M", "ン"), + (0xFF9E, "M", "゙"), + (0xFF9F, "M", "゚"), + (0xFFA0, "I"), + (0xFFA1, "M", "ᄀ"), + (0xFFA2, "M", "ᄁ"), + (0xFFA3, "M", "ᆪ"), + (0xFFA4, "M", "ᄂ"), + (0xFFA5, "M", "ᆬ"), + (0xFFA6, "M", "ᆭ"), + (0xFFA7, "M", "ᄃ"), + (0xFFA8, "M", "ᄄ"), + (0xFFA9, "M", "ᄅ"), + (0xFFAA, "M", "ᆰ"), + (0xFFAB, "M", "ᆱ"), + (0xFFAC, "M", "ᆲ"), + (0xFFAD, "M", "ᆳ"), + (0xFFAE, "M", "ᆴ"), + (0xFFAF, "M", "ᆵ"), + (0xFFB0, "M", "ᄚ"), + (0xFFB1, "M", "ᄆ"), + (0xFFB2, "M", "ᄇ"), + (0xFFB3, "M", "ᄈ"), + (0xFFB4, "M", "ᄡ"), + (0xFFB5, "M", "ᄉ"), + (0xFFB6, "M", "ᄊ"), + (0xFFB7, "M", "ᄋ"), + (0xFFB8, "M", "ᄌ"), + (0xFFB9, "M", "ᄍ"), + (0xFFBA, "M", "ᄎ"), + (0xFFBB, "M", "ᄏ"), + (0xFFBC, "M", "ᄐ"), + (0xFFBD, "M", "ᄑ"), + (0xFFBE, "M", "ᄒ"), + (0xFFBF, "X"), + ] + + +def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFFC2, "M", "ᅡ"), + (0xFFC3, "M", "ᅢ"), + (0xFFC4, "M", "ᅣ"), + (0xFFC5, "M", "ᅤ"), + (0xFFC6, "M", "ᅥ"), + (0xFFC7, "M", "ᅦ"), + (0xFFC8, "X"), + (0xFFCA, "M", "ᅧ"), + (0xFFCB, "M", "ᅨ"), + (0xFFCC, "M", "ᅩ"), + (0xFFCD, "M", "ᅪ"), + (0xFFCE, "M", "ᅫ"), + (0xFFCF, "M", "ᅬ"), + (0xFFD0, "X"), + (0xFFD2, "M", "ᅭ"), + (0xFFD3, "M", "ᅮ"), + (0xFFD4, "M", "ᅯ"), + (0xFFD5, "M", "ᅰ"), + (0xFFD6, "M", "ᅱ"), + (0xFFD7, "M", "ᅲ"), + (0xFFD8, "X"), + (0xFFDA, "M", "ᅳ"), + (0xFFDB, "M", "ᅴ"), + (0xFFDC, "M", "ᅵ"), + (0xFFDD, "X"), + (0xFFE0, "M", "¢"), + (0xFFE1, "M", "£"), + (0xFFE2, "M", "¬"), + (0xFFE3, "M", " ̄"), + (0xFFE4, "M", "¦"), + (0xFFE5, "M", "¥"), + (0xFFE6, "M", "₩"), + (0xFFE7, "X"), + (0xFFE8, "M", "│"), + (0xFFE9, "M", "←"), + (0xFFEA, "M", "↑"), + (0xFFEB, "M", "→"), + (0xFFEC, "M", "↓"), + (0xFFED, "M", "■"), + (0xFFEE, "M", "○"), + (0xFFEF, "X"), + (0x10000, "V"), + (0x1000C, "X"), + (0x1000D, "V"), + (0x10027, "X"), + (0x10028, "V"), + (0x1003B, "X"), + (0x1003C, "V"), + (0x1003E, "X"), + (0x1003F, "V"), + (0x1004E, "X"), + (0x10050, "V"), + (0x1005E, "X"), + (0x10080, "V"), + (0x100FB, "X"), + (0x10100, "V"), + (0x10103, "X"), + (0x10107, "V"), + (0x10134, "X"), + (0x10137, "V"), + (0x1018F, "X"), + (0x10190, "V"), + (0x1019D, "X"), + (0x101A0, "V"), + (0x101A1, "X"), + (0x101D0, "V"), + (0x101FE, "X"), + (0x10280, "V"), + (0x1029D, "X"), + (0x102A0, "V"), + (0x102D1, "X"), + (0x102E0, "V"), + (0x102FC, "X"), + (0x10300, "V"), + (0x10324, "X"), + (0x1032D, "V"), + (0x1034B, "X"), + (0x10350, "V"), + (0x1037B, "X"), + (0x10380, "V"), + (0x1039E, "X"), + (0x1039F, "V"), + (0x103C4, "X"), + (0x103C8, "V"), + (0x103D6, "X"), + (0x10400, "M", "𐐨"), + (0x10401, "M", "𐐩"), + (0x10402, "M", "𐐪"), + (0x10403, "M", "𐐫"), + (0x10404, "M", "𐐬"), + (0x10405, "M", "𐐭"), + (0x10406, "M", "𐐮"), + (0x10407, "M", "𐐯"), + (0x10408, "M", "𐐰"), + (0x10409, "M", "𐐱"), + (0x1040A, "M", "𐐲"), + (0x1040B, "M", "𐐳"), + (0x1040C, "M", "𐐴"), + (0x1040D, "M", "𐐵"), + (0x1040E, "M", "𐐶"), + ] + + +def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1040F, "M", "𐐷"), + (0x10410, "M", "𐐸"), + (0x10411, "M", "𐐹"), + (0x10412, "M", "𐐺"), + (0x10413, "M", "𐐻"), + (0x10414, "M", "𐐼"), + (0x10415, "M", "𐐽"), + (0x10416, "M", "𐐾"), + (0x10417, "M", "𐐿"), + (0x10418, "M", "𐑀"), + (0x10419, "M", "𐑁"), + (0x1041A, "M", "𐑂"), + (0x1041B, "M", "𐑃"), + (0x1041C, "M", "𐑄"), + (0x1041D, "M", "𐑅"), + (0x1041E, "M", "𐑆"), + (0x1041F, "M", "𐑇"), + (0x10420, "M", "𐑈"), + (0x10421, "M", "𐑉"), + (0x10422, "M", "𐑊"), + (0x10423, "M", "𐑋"), + (0x10424, "M", "𐑌"), + (0x10425, "M", "𐑍"), + (0x10426, "M", "𐑎"), + (0x10427, "M", "𐑏"), + (0x10428, "V"), + (0x1049E, "X"), + (0x104A0, "V"), + (0x104AA, "X"), + (0x104B0, "M", "𐓘"), + (0x104B1, "M", "𐓙"), + (0x104B2, "M", "𐓚"), + (0x104B3, "M", "𐓛"), + (0x104B4, "M", "𐓜"), + (0x104B5, "M", "𐓝"), + (0x104B6, "M", "𐓞"), + (0x104B7, "M", "𐓟"), + (0x104B8, "M", "𐓠"), + (0x104B9, "M", "𐓡"), + (0x104BA, "M", "𐓢"), + (0x104BB, "M", "𐓣"), + (0x104BC, "M", "𐓤"), + (0x104BD, "M", "𐓥"), + (0x104BE, "M", "𐓦"), + (0x104BF, "M", "𐓧"), + (0x104C0, "M", "𐓨"), + (0x104C1, "M", "𐓩"), + (0x104C2, "M", "𐓪"), + (0x104C3, "M", "𐓫"), + (0x104C4, "M", "𐓬"), + (0x104C5, "M", "𐓭"), + (0x104C6, "M", "𐓮"), + (0x104C7, "M", "𐓯"), + (0x104C8, "M", "𐓰"), + (0x104C9, "M", "𐓱"), + (0x104CA, "M", "𐓲"), + (0x104CB, "M", "𐓳"), + (0x104CC, "M", "𐓴"), + (0x104CD, "M", "𐓵"), + (0x104CE, "M", "𐓶"), + (0x104CF, "M", "𐓷"), + (0x104D0, "M", "𐓸"), + (0x104D1, "M", "𐓹"), + (0x104D2, "M", "𐓺"), + (0x104D3, "M", "𐓻"), + (0x104D4, "X"), + (0x104D8, "V"), + (0x104FC, "X"), + (0x10500, "V"), + (0x10528, "X"), + (0x10530, "V"), + (0x10564, "X"), + (0x1056F, "V"), + (0x10570, "M", "𐖗"), + (0x10571, "M", "𐖘"), + (0x10572, "M", "𐖙"), + (0x10573, "M", "𐖚"), + (0x10574, "M", "𐖛"), + (0x10575, "M", "𐖜"), + (0x10576, "M", "𐖝"), + (0x10577, "M", "𐖞"), + (0x10578, "M", "𐖟"), + (0x10579, "M", "𐖠"), + (0x1057A, "M", "𐖡"), + (0x1057B, "X"), + (0x1057C, "M", "𐖣"), + (0x1057D, "M", "𐖤"), + (0x1057E, "M", "𐖥"), + (0x1057F, "M", "𐖦"), + (0x10580, "M", "𐖧"), + (0x10581, "M", "𐖨"), + (0x10582, "M", "𐖩"), + (0x10583, "M", "𐖪"), + (0x10584, "M", "𐖫"), + (0x10585, "M", "𐖬"), + (0x10586, "M", "𐖭"), + (0x10587, "M", "𐖮"), + (0x10588, "M", "𐖯"), + (0x10589, "M", "𐖰"), + (0x1058A, "M", "𐖱"), + ] + + +def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1058B, "X"), + (0x1058C, "M", "𐖳"), + (0x1058D, "M", "𐖴"), + (0x1058E, "M", "𐖵"), + (0x1058F, "M", "𐖶"), + (0x10590, "M", "𐖷"), + (0x10591, "M", "𐖸"), + (0x10592, "M", "𐖹"), + (0x10593, "X"), + (0x10594, "M", "𐖻"), + (0x10595, "M", "𐖼"), + (0x10596, "X"), + (0x10597, "V"), + (0x105A2, "X"), + (0x105A3, "V"), + (0x105B2, "X"), + (0x105B3, "V"), + (0x105BA, "X"), + (0x105BB, "V"), + (0x105BD, "X"), + (0x105C0, "V"), + (0x105F4, "X"), + (0x10600, "V"), + (0x10737, "X"), + (0x10740, "V"), + (0x10756, "X"), + (0x10760, "V"), + (0x10768, "X"), + (0x10780, "V"), + (0x10781, "M", "ː"), + (0x10782, "M", "ˑ"), + (0x10783, "M", "æ"), + (0x10784, "M", "ʙ"), + (0x10785, "M", "ɓ"), + (0x10786, "X"), + (0x10787, "M", "ʣ"), + (0x10788, "M", "ꭦ"), + (0x10789, "M", "ʥ"), + (0x1078A, "M", "ʤ"), + (0x1078B, "M", "ɖ"), + (0x1078C, "M", "ɗ"), + (0x1078D, "M", "ᶑ"), + (0x1078E, "M", "ɘ"), + (0x1078F, "M", "ɞ"), + (0x10790, "M", "ʩ"), + (0x10791, "M", "ɤ"), + (0x10792, "M", "ɢ"), + (0x10793, "M", "ɠ"), + (0x10794, "M", "ʛ"), + (0x10795, "M", "ħ"), + (0x10796, "M", "ʜ"), + (0x10797, "M", "ɧ"), + (0x10798, "M", "ʄ"), + (0x10799, "M", "ʪ"), + (0x1079A, "M", "ʫ"), + (0x1079B, "M", "ɬ"), + (0x1079C, "M", "𝼄"), + (0x1079D, "M", "ꞎ"), + (0x1079E, "M", "ɮ"), + (0x1079F, "M", "𝼅"), + (0x107A0, "M", "ʎ"), + (0x107A1, "M", "𝼆"), + (0x107A2, "M", "ø"), + (0x107A3, "M", "ɶ"), + (0x107A4, "M", "ɷ"), + (0x107A5, "M", "q"), + (0x107A6, "M", "ɺ"), + (0x107A7, "M", "𝼈"), + (0x107A8, "M", "ɽ"), + (0x107A9, "M", "ɾ"), + (0x107AA, "M", "ʀ"), + (0x107AB, "M", "ʨ"), + (0x107AC, "M", "ʦ"), + (0x107AD, "M", "ꭧ"), + (0x107AE, "M", "ʧ"), + (0x107AF, "M", "ʈ"), + (0x107B0, "M", "ⱱ"), + (0x107B1, "X"), + (0x107B2, "M", "ʏ"), + (0x107B3, "M", "ʡ"), + (0x107B4, "M", "ʢ"), + (0x107B5, "M", "ʘ"), + (0x107B6, "M", "ǀ"), + (0x107B7, "M", "ǁ"), + (0x107B8, "M", "ǂ"), + (0x107B9, "M", "𝼊"), + (0x107BA, "M", "𝼞"), + (0x107BB, "X"), + (0x10800, "V"), + (0x10806, "X"), + (0x10808, "V"), + (0x10809, "X"), + (0x1080A, "V"), + (0x10836, "X"), + (0x10837, "V"), + (0x10839, "X"), + (0x1083C, "V"), + (0x1083D, "X"), + (0x1083F, "V"), + (0x10856, "X"), + ] + + +def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x10857, "V"), + (0x1089F, "X"), + (0x108A7, "V"), + (0x108B0, "X"), + (0x108E0, "V"), + (0x108F3, "X"), + (0x108F4, "V"), + (0x108F6, "X"), + (0x108FB, "V"), + (0x1091C, "X"), + (0x1091F, "V"), + (0x1093A, "X"), + (0x1093F, "V"), + (0x10940, "X"), + (0x10980, "V"), + (0x109B8, "X"), + (0x109BC, "V"), + (0x109D0, "X"), + (0x109D2, "V"), + (0x10A04, "X"), + (0x10A05, "V"), + (0x10A07, "X"), + (0x10A0C, "V"), + (0x10A14, "X"), + (0x10A15, "V"), + (0x10A18, "X"), + (0x10A19, "V"), + (0x10A36, "X"), + (0x10A38, "V"), + (0x10A3B, "X"), + (0x10A3F, "V"), + (0x10A49, "X"), + (0x10A50, "V"), + (0x10A59, "X"), + (0x10A60, "V"), + (0x10AA0, "X"), + (0x10AC0, "V"), + (0x10AE7, "X"), + (0x10AEB, "V"), + (0x10AF7, "X"), + (0x10B00, "V"), + (0x10B36, "X"), + (0x10B39, "V"), + (0x10B56, "X"), + (0x10B58, "V"), + (0x10B73, "X"), + (0x10B78, "V"), + (0x10B92, "X"), + (0x10B99, "V"), + (0x10B9D, "X"), + (0x10BA9, "V"), + (0x10BB0, "X"), + (0x10C00, "V"), + (0x10C49, "X"), + (0x10C80, "M", "𐳀"), + (0x10C81, "M", "𐳁"), + (0x10C82, "M", "𐳂"), + (0x10C83, "M", "𐳃"), + (0x10C84, "M", "𐳄"), + (0x10C85, "M", "𐳅"), + (0x10C86, "M", "𐳆"), + (0x10C87, "M", "𐳇"), + (0x10C88, "M", "𐳈"), + (0x10C89, "M", "𐳉"), + (0x10C8A, "M", "𐳊"), + (0x10C8B, "M", "𐳋"), + (0x10C8C, "M", "𐳌"), + (0x10C8D, "M", "𐳍"), + (0x10C8E, "M", "𐳎"), + (0x10C8F, "M", "𐳏"), + (0x10C90, "M", "𐳐"), + (0x10C91, "M", "𐳑"), + (0x10C92, "M", "𐳒"), + (0x10C93, "M", "𐳓"), + (0x10C94, "M", "𐳔"), + (0x10C95, "M", "𐳕"), + (0x10C96, "M", "𐳖"), + (0x10C97, "M", "𐳗"), + (0x10C98, "M", "𐳘"), + (0x10C99, "M", "𐳙"), + (0x10C9A, "M", "𐳚"), + (0x10C9B, "M", "𐳛"), + (0x10C9C, "M", "𐳜"), + (0x10C9D, "M", "𐳝"), + (0x10C9E, "M", "𐳞"), + (0x10C9F, "M", "𐳟"), + (0x10CA0, "M", "𐳠"), + (0x10CA1, "M", "𐳡"), + (0x10CA2, "M", "𐳢"), + (0x10CA3, "M", "𐳣"), + (0x10CA4, "M", "𐳤"), + (0x10CA5, "M", "𐳥"), + (0x10CA6, "M", "𐳦"), + (0x10CA7, "M", "𐳧"), + (0x10CA8, "M", "𐳨"), + (0x10CA9, "M", "𐳩"), + (0x10CAA, "M", "𐳪"), + (0x10CAB, "M", "𐳫"), + (0x10CAC, "M", "𐳬"), + (0x10CAD, "M", "𐳭"), + ] + + +def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x10CAE, "M", "𐳮"), + (0x10CAF, "M", "𐳯"), + (0x10CB0, "M", "𐳰"), + (0x10CB1, "M", "𐳱"), + (0x10CB2, "M", "𐳲"), + (0x10CB3, "X"), + (0x10CC0, "V"), + (0x10CF3, "X"), + (0x10CFA, "V"), + (0x10D28, "X"), + (0x10D30, "V"), + (0x10D3A, "X"), + (0x10D40, "V"), + (0x10D50, "M", "𐵰"), + (0x10D51, "M", "𐵱"), + (0x10D52, "M", "𐵲"), + (0x10D53, "M", "𐵳"), + (0x10D54, "M", "𐵴"), + (0x10D55, "M", "𐵵"), + (0x10D56, "M", "𐵶"), + (0x10D57, "M", "𐵷"), + (0x10D58, "M", "𐵸"), + (0x10D59, "M", "𐵹"), + (0x10D5A, "M", "𐵺"), + (0x10D5B, "M", "𐵻"), + (0x10D5C, "M", "𐵼"), + (0x10D5D, "M", "𐵽"), + (0x10D5E, "M", "𐵾"), + (0x10D5F, "M", "𐵿"), + (0x10D60, "M", "𐶀"), + (0x10D61, "M", "𐶁"), + (0x10D62, "M", "𐶂"), + (0x10D63, "M", "𐶃"), + (0x10D64, "M", "𐶄"), + (0x10D65, "M", "𐶅"), + (0x10D66, "X"), + (0x10D69, "V"), + (0x10D86, "X"), + (0x10D8E, "V"), + (0x10D90, "X"), + (0x10E60, "V"), + (0x10E7F, "X"), + (0x10E80, "V"), + (0x10EAA, "X"), + (0x10EAB, "V"), + (0x10EAE, "X"), + (0x10EB0, "V"), + (0x10EB2, "X"), + (0x10EC2, "V"), + (0x10EC5, "X"), + (0x10EFC, "V"), + (0x10F28, "X"), + (0x10F30, "V"), + (0x10F5A, "X"), + (0x10F70, "V"), + (0x10F8A, "X"), + (0x10FB0, "V"), + (0x10FCC, "X"), + (0x10FE0, "V"), + (0x10FF7, "X"), + (0x11000, "V"), + (0x1104E, "X"), + (0x11052, "V"), + (0x11076, "X"), + (0x1107F, "V"), + (0x110BD, "X"), + (0x110BE, "V"), + (0x110C3, "X"), + (0x110D0, "V"), + (0x110E9, "X"), + (0x110F0, "V"), + (0x110FA, "X"), + (0x11100, "V"), + (0x11135, "X"), + (0x11136, "V"), + (0x11148, "X"), + (0x11150, "V"), + (0x11177, "X"), + (0x11180, "V"), + (0x111E0, "X"), + (0x111E1, "V"), + (0x111F5, "X"), + (0x11200, "V"), + (0x11212, "X"), + (0x11213, "V"), + (0x11242, "X"), + (0x11280, "V"), + (0x11287, "X"), + (0x11288, "V"), + (0x11289, "X"), + (0x1128A, "V"), + (0x1128E, "X"), + (0x1128F, "V"), + (0x1129E, "X"), + (0x1129F, "V"), + (0x112AA, "X"), + (0x112B0, "V"), + (0x112EB, "X"), + (0x112F0, "V"), + (0x112FA, "X"), + ] + + +def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x11300, "V"), + (0x11304, "X"), + (0x11305, "V"), + (0x1130D, "X"), + (0x1130F, "V"), + (0x11311, "X"), + (0x11313, "V"), + (0x11329, "X"), + (0x1132A, "V"), + (0x11331, "X"), + (0x11332, "V"), + (0x11334, "X"), + (0x11335, "V"), + (0x1133A, "X"), + (0x1133B, "V"), + (0x11345, "X"), + (0x11347, "V"), + (0x11349, "X"), + (0x1134B, "V"), + (0x1134E, "X"), + (0x11350, "V"), + (0x11351, "X"), + (0x11357, "V"), + (0x11358, "X"), + (0x1135D, "V"), + (0x11364, "X"), + (0x11366, "V"), + (0x1136D, "X"), + (0x11370, "V"), + (0x11375, "X"), + (0x11380, "V"), + (0x1138A, "X"), + (0x1138B, "V"), + (0x1138C, "X"), + (0x1138E, "V"), + (0x1138F, "X"), + (0x11390, "V"), + (0x113B6, "X"), + (0x113B7, "V"), + (0x113C1, "X"), + (0x113C2, "V"), + (0x113C3, "X"), + (0x113C5, "V"), + (0x113C6, "X"), + (0x113C7, "V"), + (0x113CB, "X"), + (0x113CC, "V"), + (0x113D6, "X"), + (0x113D7, "V"), + (0x113D9, "X"), + (0x113E1, "V"), + (0x113E3, "X"), + (0x11400, "V"), + (0x1145C, "X"), + (0x1145D, "V"), + (0x11462, "X"), + (0x11480, "V"), + (0x114C8, "X"), + (0x114D0, "V"), + (0x114DA, "X"), + (0x11580, "V"), + (0x115B6, "X"), + (0x115B8, "V"), + (0x115DE, "X"), + (0x11600, "V"), + (0x11645, "X"), + (0x11650, "V"), + (0x1165A, "X"), + (0x11660, "V"), + (0x1166D, "X"), + (0x11680, "V"), + (0x116BA, "X"), + (0x116C0, "V"), + (0x116CA, "X"), + (0x116D0, "V"), + (0x116E4, "X"), + (0x11700, "V"), + (0x1171B, "X"), + (0x1171D, "V"), + (0x1172C, "X"), + (0x11730, "V"), + (0x11747, "X"), + (0x11800, "V"), + (0x1183C, "X"), + (0x118A0, "M", "𑣀"), + (0x118A1, "M", "𑣁"), + (0x118A2, "M", "𑣂"), + (0x118A3, "M", "𑣃"), + (0x118A4, "M", "𑣄"), + (0x118A5, "M", "𑣅"), + (0x118A6, "M", "𑣆"), + (0x118A7, "M", "𑣇"), + (0x118A8, "M", "𑣈"), + (0x118A9, "M", "𑣉"), + (0x118AA, "M", "𑣊"), + (0x118AB, "M", "𑣋"), + (0x118AC, "M", "𑣌"), + (0x118AD, "M", "𑣍"), + (0x118AE, "M", "𑣎"), + (0x118AF, "M", "𑣏"), + ] + + +def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x118B0, "M", "𑣐"), + (0x118B1, "M", "𑣑"), + (0x118B2, "M", "𑣒"), + (0x118B3, "M", "𑣓"), + (0x118B4, "M", "𑣔"), + (0x118B5, "M", "𑣕"), + (0x118B6, "M", "𑣖"), + (0x118B7, "M", "𑣗"), + (0x118B8, "M", "𑣘"), + (0x118B9, "M", "𑣙"), + (0x118BA, "M", "𑣚"), + (0x118BB, "M", "𑣛"), + (0x118BC, "M", "𑣜"), + (0x118BD, "M", "𑣝"), + (0x118BE, "M", "𑣞"), + (0x118BF, "M", "𑣟"), + (0x118C0, "V"), + (0x118F3, "X"), + (0x118FF, "V"), + (0x11907, "X"), + (0x11909, "V"), + (0x1190A, "X"), + (0x1190C, "V"), + (0x11914, "X"), + (0x11915, "V"), + (0x11917, "X"), + (0x11918, "V"), + (0x11936, "X"), + (0x11937, "V"), + (0x11939, "X"), + (0x1193B, "V"), + (0x11947, "X"), + (0x11950, "V"), + (0x1195A, "X"), + (0x119A0, "V"), + (0x119A8, "X"), + (0x119AA, "V"), + (0x119D8, "X"), + (0x119DA, "V"), + (0x119E5, "X"), + (0x11A00, "V"), + (0x11A48, "X"), + (0x11A50, "V"), + (0x11AA3, "X"), + (0x11AB0, "V"), + (0x11AF9, "X"), + (0x11B00, "V"), + (0x11B0A, "X"), + (0x11BC0, "V"), + (0x11BE2, "X"), + (0x11BF0, "V"), + (0x11BFA, "X"), + (0x11C00, "V"), + (0x11C09, "X"), + (0x11C0A, "V"), + (0x11C37, "X"), + (0x11C38, "V"), + (0x11C46, "X"), + (0x11C50, "V"), + (0x11C6D, "X"), + (0x11C70, "V"), + (0x11C90, "X"), + (0x11C92, "V"), + (0x11CA8, "X"), + (0x11CA9, "V"), + (0x11CB7, "X"), + (0x11D00, "V"), + (0x11D07, "X"), + (0x11D08, "V"), + (0x11D0A, "X"), + (0x11D0B, "V"), + (0x11D37, "X"), + (0x11D3A, "V"), + (0x11D3B, "X"), + (0x11D3C, "V"), + (0x11D3E, "X"), + (0x11D3F, "V"), + (0x11D48, "X"), + (0x11D50, "V"), + (0x11D5A, "X"), + (0x11D60, "V"), + (0x11D66, "X"), + (0x11D67, "V"), + (0x11D69, "X"), + (0x11D6A, "V"), + (0x11D8F, "X"), + (0x11D90, "V"), + (0x11D92, "X"), + (0x11D93, "V"), + (0x11D99, "X"), + (0x11DA0, "V"), + (0x11DAA, "X"), + (0x11EE0, "V"), + (0x11EF9, "X"), + (0x11F00, "V"), + (0x11F11, "X"), + (0x11F12, "V"), + (0x11F3B, "X"), + (0x11F3E, "V"), + (0x11F5B, "X"), + ] + + +def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x11FB0, "V"), + (0x11FB1, "X"), + (0x11FC0, "V"), + (0x11FF2, "X"), + (0x11FFF, "V"), + (0x1239A, "X"), + (0x12400, "V"), + (0x1246F, "X"), + (0x12470, "V"), + (0x12475, "X"), + (0x12480, "V"), + (0x12544, "X"), + (0x12F90, "V"), + (0x12FF3, "X"), + (0x13000, "V"), + (0x13430, "X"), + (0x13440, "V"), + (0x13456, "X"), + (0x13460, "V"), + (0x143FB, "X"), + (0x14400, "V"), + (0x14647, "X"), + (0x16100, "V"), + (0x1613A, "X"), + (0x16800, "V"), + (0x16A39, "X"), + (0x16A40, "V"), + (0x16A5F, "X"), + (0x16A60, "V"), + (0x16A6A, "X"), + (0x16A6E, "V"), + (0x16ABF, "X"), + (0x16AC0, "V"), + (0x16ACA, "X"), + (0x16AD0, "V"), + (0x16AEE, "X"), + (0x16AF0, "V"), + (0x16AF6, "X"), + (0x16B00, "V"), + (0x16B46, "X"), + (0x16B50, "V"), + (0x16B5A, "X"), + (0x16B5B, "V"), + (0x16B62, "X"), + (0x16B63, "V"), + (0x16B78, "X"), + (0x16B7D, "V"), + (0x16B90, "X"), + (0x16D40, "V"), + (0x16D7A, "X"), + (0x16E40, "M", "𖹠"), + (0x16E41, "M", "𖹡"), + (0x16E42, "M", "𖹢"), + (0x16E43, "M", "𖹣"), + (0x16E44, "M", "𖹤"), + (0x16E45, "M", "𖹥"), + (0x16E46, "M", "𖹦"), + (0x16E47, "M", "𖹧"), + (0x16E48, "M", "𖹨"), + (0x16E49, "M", "𖹩"), + (0x16E4A, "M", "𖹪"), + (0x16E4B, "M", "𖹫"), + (0x16E4C, "M", "𖹬"), + (0x16E4D, "M", "𖹭"), + (0x16E4E, "M", "𖹮"), + (0x16E4F, "M", "𖹯"), + (0x16E50, "M", "𖹰"), + (0x16E51, "M", "𖹱"), + (0x16E52, "M", "𖹲"), + (0x16E53, "M", "𖹳"), + (0x16E54, "M", "𖹴"), + (0x16E55, "M", "𖹵"), + (0x16E56, "M", "𖹶"), + (0x16E57, "M", "𖹷"), + (0x16E58, "M", "𖹸"), + (0x16E59, "M", "𖹹"), + (0x16E5A, "M", "𖹺"), + (0x16E5B, "M", "𖹻"), + (0x16E5C, "M", "𖹼"), + (0x16E5D, "M", "𖹽"), + (0x16E5E, "M", "𖹾"), + (0x16E5F, "M", "𖹿"), + (0x16E60, "V"), + (0x16E9B, "X"), + (0x16F00, "V"), + (0x16F4B, "X"), + (0x16F4F, "V"), + (0x16F88, "X"), + (0x16F8F, "V"), + (0x16FA0, "X"), + (0x16FE0, "V"), + (0x16FE5, "X"), + (0x16FF0, "V"), + (0x16FF2, "X"), + (0x17000, "V"), + (0x187F8, "X"), + (0x18800, "V"), + (0x18CD6, "X"), + (0x18CFF, "V"), + (0x18D09, "X"), + ] + + +def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1AFF0, "V"), + (0x1AFF4, "X"), + (0x1AFF5, "V"), + (0x1AFFC, "X"), + (0x1AFFD, "V"), + (0x1AFFF, "X"), + (0x1B000, "V"), + (0x1B123, "X"), + (0x1B132, "V"), + (0x1B133, "X"), + (0x1B150, "V"), + (0x1B153, "X"), + (0x1B155, "V"), + (0x1B156, "X"), + (0x1B164, "V"), + (0x1B168, "X"), + (0x1B170, "V"), + (0x1B2FC, "X"), + (0x1BC00, "V"), + (0x1BC6B, "X"), + (0x1BC70, "V"), + (0x1BC7D, "X"), + (0x1BC80, "V"), + (0x1BC89, "X"), + (0x1BC90, "V"), + (0x1BC9A, "X"), + (0x1BC9C, "V"), + (0x1BCA0, "I"), + (0x1BCA4, "X"), + (0x1CC00, "V"), + (0x1CCD6, "M", "a"), + (0x1CCD7, "M", "b"), + (0x1CCD8, "M", "c"), + (0x1CCD9, "M", "d"), + (0x1CCDA, "M", "e"), + (0x1CCDB, "M", "f"), + (0x1CCDC, "M", "g"), + (0x1CCDD, "M", "h"), + (0x1CCDE, "M", "i"), + (0x1CCDF, "M", "j"), + (0x1CCE0, "M", "k"), + (0x1CCE1, "M", "l"), + (0x1CCE2, "M", "m"), + (0x1CCE3, "M", "n"), + (0x1CCE4, "M", "o"), + (0x1CCE5, "M", "p"), + (0x1CCE6, "M", "q"), + (0x1CCE7, "M", "r"), + (0x1CCE8, "M", "s"), + (0x1CCE9, "M", "t"), + (0x1CCEA, "M", "u"), + (0x1CCEB, "M", "v"), + (0x1CCEC, "M", "w"), + (0x1CCED, "M", "x"), + (0x1CCEE, "M", "y"), + (0x1CCEF, "M", "z"), + (0x1CCF0, "M", "0"), + (0x1CCF1, "M", "1"), + (0x1CCF2, "M", "2"), + (0x1CCF3, "M", "3"), + (0x1CCF4, "M", "4"), + (0x1CCF5, "M", "5"), + (0x1CCF6, "M", "6"), + (0x1CCF7, "M", "7"), + (0x1CCF8, "M", "8"), + (0x1CCF9, "M", "9"), + (0x1CCFA, "X"), + (0x1CD00, "V"), + (0x1CEB4, "X"), + (0x1CF00, "V"), + (0x1CF2E, "X"), + (0x1CF30, "V"), + (0x1CF47, "X"), + (0x1CF50, "V"), + (0x1CFC4, "X"), + (0x1D000, "V"), + (0x1D0F6, "X"), + (0x1D100, "V"), + (0x1D127, "X"), + (0x1D129, "V"), + (0x1D15E, "M", "𝅗𝅥"), + (0x1D15F, "M", "𝅘𝅥"), + (0x1D160, "M", "𝅘𝅥𝅮"), + (0x1D161, "M", "𝅘𝅥𝅯"), + (0x1D162, "M", "𝅘𝅥𝅰"), + (0x1D163, "M", "𝅘𝅥𝅱"), + (0x1D164, "M", "𝅘𝅥𝅲"), + (0x1D165, "V"), + (0x1D173, "I"), + (0x1D17B, "V"), + (0x1D1BB, "M", "𝆹𝅥"), + (0x1D1BC, "M", "𝆺𝅥"), + (0x1D1BD, "M", "𝆹𝅥𝅮"), + (0x1D1BE, "M", "𝆺𝅥𝅮"), + (0x1D1BF, "M", "𝆹𝅥𝅯"), + (0x1D1C0, "M", "𝆺𝅥𝅯"), + (0x1D1C1, "V"), + (0x1D1EB, "X"), + (0x1D200, "V"), + (0x1D246, "X"), + ] + + +def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D2C0, "V"), + (0x1D2D4, "X"), + (0x1D2E0, "V"), + (0x1D2F4, "X"), + (0x1D300, "V"), + (0x1D357, "X"), + (0x1D360, "V"), + (0x1D379, "X"), + (0x1D400, "M", "a"), + (0x1D401, "M", "b"), + (0x1D402, "M", "c"), + (0x1D403, "M", "d"), + (0x1D404, "M", "e"), + (0x1D405, "M", "f"), + (0x1D406, "M", "g"), + (0x1D407, "M", "h"), + (0x1D408, "M", "i"), + (0x1D409, "M", "j"), + (0x1D40A, "M", "k"), + (0x1D40B, "M", "l"), + (0x1D40C, "M", "m"), + (0x1D40D, "M", "n"), + (0x1D40E, "M", "o"), + (0x1D40F, "M", "p"), + (0x1D410, "M", "q"), + (0x1D411, "M", "r"), + (0x1D412, "M", "s"), + (0x1D413, "M", "t"), + (0x1D414, "M", "u"), + (0x1D415, "M", "v"), + (0x1D416, "M", "w"), + (0x1D417, "M", "x"), + (0x1D418, "M", "y"), + (0x1D419, "M", "z"), + (0x1D41A, "M", "a"), + (0x1D41B, "M", "b"), + (0x1D41C, "M", "c"), + (0x1D41D, "M", "d"), + (0x1D41E, "M", "e"), + (0x1D41F, "M", "f"), + (0x1D420, "M", "g"), + (0x1D421, "M", "h"), + (0x1D422, "M", "i"), + (0x1D423, "M", "j"), + (0x1D424, "M", "k"), + (0x1D425, "M", "l"), + (0x1D426, "M", "m"), + (0x1D427, "M", "n"), + (0x1D428, "M", "o"), + (0x1D429, "M", "p"), + (0x1D42A, "M", "q"), + (0x1D42B, "M", "r"), + (0x1D42C, "M", "s"), + (0x1D42D, "M", "t"), + (0x1D42E, "M", "u"), + (0x1D42F, "M", "v"), + (0x1D430, "M", "w"), + (0x1D431, "M", "x"), + (0x1D432, "M", "y"), + (0x1D433, "M", "z"), + (0x1D434, "M", "a"), + (0x1D435, "M", "b"), + (0x1D436, "M", "c"), + (0x1D437, "M", "d"), + (0x1D438, "M", "e"), + (0x1D439, "M", "f"), + (0x1D43A, "M", "g"), + (0x1D43B, "M", "h"), + (0x1D43C, "M", "i"), + (0x1D43D, "M", "j"), + (0x1D43E, "M", "k"), + (0x1D43F, "M", "l"), + (0x1D440, "M", "m"), + (0x1D441, "M", "n"), + (0x1D442, "M", "o"), + (0x1D443, "M", "p"), + (0x1D444, "M", "q"), + (0x1D445, "M", "r"), + (0x1D446, "M", "s"), + (0x1D447, "M", "t"), + (0x1D448, "M", "u"), + (0x1D449, "M", "v"), + (0x1D44A, "M", "w"), + (0x1D44B, "M", "x"), + (0x1D44C, "M", "y"), + (0x1D44D, "M", "z"), + (0x1D44E, "M", "a"), + (0x1D44F, "M", "b"), + (0x1D450, "M", "c"), + (0x1D451, "M", "d"), + (0x1D452, "M", "e"), + (0x1D453, "M", "f"), + (0x1D454, "M", "g"), + (0x1D455, "X"), + (0x1D456, "M", "i"), + (0x1D457, "M", "j"), + (0x1D458, "M", "k"), + (0x1D459, "M", "l"), + (0x1D45A, "M", "m"), + (0x1D45B, "M", "n"), + ] + + +def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D45C, "M", "o"), + (0x1D45D, "M", "p"), + (0x1D45E, "M", "q"), + (0x1D45F, "M", "r"), + (0x1D460, "M", "s"), + (0x1D461, "M", "t"), + (0x1D462, "M", "u"), + (0x1D463, "M", "v"), + (0x1D464, "M", "w"), + (0x1D465, "M", "x"), + (0x1D466, "M", "y"), + (0x1D467, "M", "z"), + (0x1D468, "M", "a"), + (0x1D469, "M", "b"), + (0x1D46A, "M", "c"), + (0x1D46B, "M", "d"), + (0x1D46C, "M", "e"), + (0x1D46D, "M", "f"), + (0x1D46E, "M", "g"), + (0x1D46F, "M", "h"), + (0x1D470, "M", "i"), + (0x1D471, "M", "j"), + (0x1D472, "M", "k"), + (0x1D473, "M", "l"), + (0x1D474, "M", "m"), + (0x1D475, "M", "n"), + (0x1D476, "M", "o"), + (0x1D477, "M", "p"), + (0x1D478, "M", "q"), + (0x1D479, "M", "r"), + (0x1D47A, "M", "s"), + (0x1D47B, "M", "t"), + (0x1D47C, "M", "u"), + (0x1D47D, "M", "v"), + (0x1D47E, "M", "w"), + (0x1D47F, "M", "x"), + (0x1D480, "M", "y"), + (0x1D481, "M", "z"), + (0x1D482, "M", "a"), + (0x1D483, "M", "b"), + (0x1D484, "M", "c"), + (0x1D485, "M", "d"), + (0x1D486, "M", "e"), + (0x1D487, "M", "f"), + (0x1D488, "M", "g"), + (0x1D489, "M", "h"), + (0x1D48A, "M", "i"), + (0x1D48B, "M", "j"), + (0x1D48C, "M", "k"), + (0x1D48D, "M", "l"), + (0x1D48E, "M", "m"), + (0x1D48F, "M", "n"), + (0x1D490, "M", "o"), + (0x1D491, "M", "p"), + (0x1D492, "M", "q"), + (0x1D493, "M", "r"), + (0x1D494, "M", "s"), + (0x1D495, "M", "t"), + (0x1D496, "M", "u"), + (0x1D497, "M", "v"), + (0x1D498, "M", "w"), + (0x1D499, "M", "x"), + (0x1D49A, "M", "y"), + (0x1D49B, "M", "z"), + (0x1D49C, "M", "a"), + (0x1D49D, "X"), + (0x1D49E, "M", "c"), + (0x1D49F, "M", "d"), + (0x1D4A0, "X"), + (0x1D4A2, "M", "g"), + (0x1D4A3, "X"), + (0x1D4A5, "M", "j"), + (0x1D4A6, "M", "k"), + (0x1D4A7, "X"), + (0x1D4A9, "M", "n"), + (0x1D4AA, "M", "o"), + (0x1D4AB, "M", "p"), + (0x1D4AC, "M", "q"), + (0x1D4AD, "X"), + (0x1D4AE, "M", "s"), + (0x1D4AF, "M", "t"), + (0x1D4B0, "M", "u"), + (0x1D4B1, "M", "v"), + (0x1D4B2, "M", "w"), + (0x1D4B3, "M", "x"), + (0x1D4B4, "M", "y"), + (0x1D4B5, "M", "z"), + (0x1D4B6, "M", "a"), + (0x1D4B7, "M", "b"), + (0x1D4B8, "M", "c"), + (0x1D4B9, "M", "d"), + (0x1D4BA, "X"), + (0x1D4BB, "M", "f"), + (0x1D4BC, "X"), + (0x1D4BD, "M", "h"), + (0x1D4BE, "M", "i"), + (0x1D4BF, "M", "j"), + (0x1D4C0, "M", "k"), + (0x1D4C1, "M", "l"), + (0x1D4C2, "M", "m"), + ] + + +def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D4C3, "M", "n"), + (0x1D4C4, "X"), + (0x1D4C5, "M", "p"), + (0x1D4C6, "M", "q"), + (0x1D4C7, "M", "r"), + (0x1D4C8, "M", "s"), + (0x1D4C9, "M", "t"), + (0x1D4CA, "M", "u"), + (0x1D4CB, "M", "v"), + (0x1D4CC, "M", "w"), + (0x1D4CD, "M", "x"), + (0x1D4CE, "M", "y"), + (0x1D4CF, "M", "z"), + (0x1D4D0, "M", "a"), + (0x1D4D1, "M", "b"), + (0x1D4D2, "M", "c"), + (0x1D4D3, "M", "d"), + (0x1D4D4, "M", "e"), + (0x1D4D5, "M", "f"), + (0x1D4D6, "M", "g"), + (0x1D4D7, "M", "h"), + (0x1D4D8, "M", "i"), + (0x1D4D9, "M", "j"), + (0x1D4DA, "M", "k"), + (0x1D4DB, "M", "l"), + (0x1D4DC, "M", "m"), + (0x1D4DD, "M", "n"), + (0x1D4DE, "M", "o"), + (0x1D4DF, "M", "p"), + (0x1D4E0, "M", "q"), + (0x1D4E1, "M", "r"), + (0x1D4E2, "M", "s"), + (0x1D4E3, "M", "t"), + (0x1D4E4, "M", "u"), + (0x1D4E5, "M", "v"), + (0x1D4E6, "M", "w"), + (0x1D4E7, "M", "x"), + (0x1D4E8, "M", "y"), + (0x1D4E9, "M", "z"), + (0x1D4EA, "M", "a"), + (0x1D4EB, "M", "b"), + (0x1D4EC, "M", "c"), + (0x1D4ED, "M", "d"), + (0x1D4EE, "M", "e"), + (0x1D4EF, "M", "f"), + (0x1D4F0, "M", "g"), + (0x1D4F1, "M", "h"), + (0x1D4F2, "M", "i"), + (0x1D4F3, "M", "j"), + (0x1D4F4, "M", "k"), + (0x1D4F5, "M", "l"), + (0x1D4F6, "M", "m"), + (0x1D4F7, "M", "n"), + (0x1D4F8, "M", "o"), + (0x1D4F9, "M", "p"), + (0x1D4FA, "M", "q"), + (0x1D4FB, "M", "r"), + (0x1D4FC, "M", "s"), + (0x1D4FD, "M", "t"), + (0x1D4FE, "M", "u"), + (0x1D4FF, "M", "v"), + (0x1D500, "M", "w"), + (0x1D501, "M", "x"), + (0x1D502, "M", "y"), + (0x1D503, "M", "z"), + (0x1D504, "M", "a"), + (0x1D505, "M", "b"), + (0x1D506, "X"), + (0x1D507, "M", "d"), + (0x1D508, "M", "e"), + (0x1D509, "M", "f"), + (0x1D50A, "M", "g"), + (0x1D50B, "X"), + (0x1D50D, "M", "j"), + (0x1D50E, "M", "k"), + (0x1D50F, "M", "l"), + (0x1D510, "M", "m"), + (0x1D511, "M", "n"), + (0x1D512, "M", "o"), + (0x1D513, "M", "p"), + (0x1D514, "M", "q"), + (0x1D515, "X"), + (0x1D516, "M", "s"), + (0x1D517, "M", "t"), + (0x1D518, "M", "u"), + (0x1D519, "M", "v"), + (0x1D51A, "M", "w"), + (0x1D51B, "M", "x"), + (0x1D51C, "M", "y"), + (0x1D51D, "X"), + (0x1D51E, "M", "a"), + (0x1D51F, "M", "b"), + (0x1D520, "M", "c"), + (0x1D521, "M", "d"), + (0x1D522, "M", "e"), + (0x1D523, "M", "f"), + (0x1D524, "M", "g"), + (0x1D525, "M", "h"), + (0x1D526, "M", "i"), + (0x1D527, "M", "j"), + ] + + +def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D528, "M", "k"), + (0x1D529, "M", "l"), + (0x1D52A, "M", "m"), + (0x1D52B, "M", "n"), + (0x1D52C, "M", "o"), + (0x1D52D, "M", "p"), + (0x1D52E, "M", "q"), + (0x1D52F, "M", "r"), + (0x1D530, "M", "s"), + (0x1D531, "M", "t"), + (0x1D532, "M", "u"), + (0x1D533, "M", "v"), + (0x1D534, "M", "w"), + (0x1D535, "M", "x"), + (0x1D536, "M", "y"), + (0x1D537, "M", "z"), + (0x1D538, "M", "a"), + (0x1D539, "M", "b"), + (0x1D53A, "X"), + (0x1D53B, "M", "d"), + (0x1D53C, "M", "e"), + (0x1D53D, "M", "f"), + (0x1D53E, "M", "g"), + (0x1D53F, "X"), + (0x1D540, "M", "i"), + (0x1D541, "M", "j"), + (0x1D542, "M", "k"), + (0x1D543, "M", "l"), + (0x1D544, "M", "m"), + (0x1D545, "X"), + (0x1D546, "M", "o"), + (0x1D547, "X"), + (0x1D54A, "M", "s"), + (0x1D54B, "M", "t"), + (0x1D54C, "M", "u"), + (0x1D54D, "M", "v"), + (0x1D54E, "M", "w"), + (0x1D54F, "M", "x"), + (0x1D550, "M", "y"), + (0x1D551, "X"), + (0x1D552, "M", "a"), + (0x1D553, "M", "b"), + (0x1D554, "M", "c"), + (0x1D555, "M", "d"), + (0x1D556, "M", "e"), + (0x1D557, "M", "f"), + (0x1D558, "M", "g"), + (0x1D559, "M", "h"), + (0x1D55A, "M", "i"), + (0x1D55B, "M", "j"), + (0x1D55C, "M", "k"), + (0x1D55D, "M", "l"), + (0x1D55E, "M", "m"), + (0x1D55F, "M", "n"), + (0x1D560, "M", "o"), + (0x1D561, "M", "p"), + (0x1D562, "M", "q"), + (0x1D563, "M", "r"), + (0x1D564, "M", "s"), + (0x1D565, "M", "t"), + (0x1D566, "M", "u"), + (0x1D567, "M", "v"), + (0x1D568, "M", "w"), + (0x1D569, "M", "x"), + (0x1D56A, "M", "y"), + (0x1D56B, "M", "z"), + (0x1D56C, "M", "a"), + (0x1D56D, "M", "b"), + (0x1D56E, "M", "c"), + (0x1D56F, "M", "d"), + (0x1D570, "M", "e"), + (0x1D571, "M", "f"), + (0x1D572, "M", "g"), + (0x1D573, "M", "h"), + (0x1D574, "M", "i"), + (0x1D575, "M", "j"), + (0x1D576, "M", "k"), + (0x1D577, "M", "l"), + (0x1D578, "M", "m"), + (0x1D579, "M", "n"), + (0x1D57A, "M", "o"), + (0x1D57B, "M", "p"), + (0x1D57C, "M", "q"), + (0x1D57D, "M", "r"), + (0x1D57E, "M", "s"), + (0x1D57F, "M", "t"), + (0x1D580, "M", "u"), + (0x1D581, "M", "v"), + (0x1D582, "M", "w"), + (0x1D583, "M", "x"), + (0x1D584, "M", "y"), + (0x1D585, "M", "z"), + (0x1D586, "M", "a"), + (0x1D587, "M", "b"), + (0x1D588, "M", "c"), + (0x1D589, "M", "d"), + (0x1D58A, "M", "e"), + (0x1D58B, "M", "f"), + (0x1D58C, "M", "g"), + (0x1D58D, "M", "h"), + ] + + +def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D58E, "M", "i"), + (0x1D58F, "M", "j"), + (0x1D590, "M", "k"), + (0x1D591, "M", "l"), + (0x1D592, "M", "m"), + (0x1D593, "M", "n"), + (0x1D594, "M", "o"), + (0x1D595, "M", "p"), + (0x1D596, "M", "q"), + (0x1D597, "M", "r"), + (0x1D598, "M", "s"), + (0x1D599, "M", "t"), + (0x1D59A, "M", "u"), + (0x1D59B, "M", "v"), + (0x1D59C, "M", "w"), + (0x1D59D, "M", "x"), + (0x1D59E, "M", "y"), + (0x1D59F, "M", "z"), + (0x1D5A0, "M", "a"), + (0x1D5A1, "M", "b"), + (0x1D5A2, "M", "c"), + (0x1D5A3, "M", "d"), + (0x1D5A4, "M", "e"), + (0x1D5A5, "M", "f"), + (0x1D5A6, "M", "g"), + (0x1D5A7, "M", "h"), + (0x1D5A8, "M", "i"), + (0x1D5A9, "M", "j"), + (0x1D5AA, "M", "k"), + (0x1D5AB, "M", "l"), + (0x1D5AC, "M", "m"), + (0x1D5AD, "M", "n"), + (0x1D5AE, "M", "o"), + (0x1D5AF, "M", "p"), + (0x1D5B0, "M", "q"), + (0x1D5B1, "M", "r"), + (0x1D5B2, "M", "s"), + (0x1D5B3, "M", "t"), + (0x1D5B4, "M", "u"), + (0x1D5B5, "M", "v"), + (0x1D5B6, "M", "w"), + (0x1D5B7, "M", "x"), + (0x1D5B8, "M", "y"), + (0x1D5B9, "M", "z"), + (0x1D5BA, "M", "a"), + (0x1D5BB, "M", "b"), + (0x1D5BC, "M", "c"), + (0x1D5BD, "M", "d"), + (0x1D5BE, "M", "e"), + (0x1D5BF, "M", "f"), + (0x1D5C0, "M", "g"), + (0x1D5C1, "M", "h"), + (0x1D5C2, "M", "i"), + (0x1D5C3, "M", "j"), + (0x1D5C4, "M", "k"), + (0x1D5C5, "M", "l"), + (0x1D5C6, "M", "m"), + (0x1D5C7, "M", "n"), + (0x1D5C8, "M", "o"), + (0x1D5C9, "M", "p"), + (0x1D5CA, "M", "q"), + (0x1D5CB, "M", "r"), + (0x1D5CC, "M", "s"), + (0x1D5CD, "M", "t"), + (0x1D5CE, "M", "u"), + (0x1D5CF, "M", "v"), + (0x1D5D0, "M", "w"), + (0x1D5D1, "M", "x"), + (0x1D5D2, "M", "y"), + (0x1D5D3, "M", "z"), + (0x1D5D4, "M", "a"), + (0x1D5D5, "M", "b"), + (0x1D5D6, "M", "c"), + (0x1D5D7, "M", "d"), + (0x1D5D8, "M", "e"), + (0x1D5D9, "M", "f"), + (0x1D5DA, "M", "g"), + (0x1D5DB, "M", "h"), + (0x1D5DC, "M", "i"), + (0x1D5DD, "M", "j"), + (0x1D5DE, "M", "k"), + (0x1D5DF, "M", "l"), + (0x1D5E0, "M", "m"), + (0x1D5E1, "M", "n"), + (0x1D5E2, "M", "o"), + (0x1D5E3, "M", "p"), + (0x1D5E4, "M", "q"), + (0x1D5E5, "M", "r"), + (0x1D5E6, "M", "s"), + (0x1D5E7, "M", "t"), + (0x1D5E8, "M", "u"), + (0x1D5E9, "M", "v"), + (0x1D5EA, "M", "w"), + (0x1D5EB, "M", "x"), + (0x1D5EC, "M", "y"), + (0x1D5ED, "M", "z"), + (0x1D5EE, "M", "a"), + (0x1D5EF, "M", "b"), + (0x1D5F0, "M", "c"), + (0x1D5F1, "M", "d"), + ] + + +def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D5F2, "M", "e"), + (0x1D5F3, "M", "f"), + (0x1D5F4, "M", "g"), + (0x1D5F5, "M", "h"), + (0x1D5F6, "M", "i"), + (0x1D5F7, "M", "j"), + (0x1D5F8, "M", "k"), + (0x1D5F9, "M", "l"), + (0x1D5FA, "M", "m"), + (0x1D5FB, "M", "n"), + (0x1D5FC, "M", "o"), + (0x1D5FD, "M", "p"), + (0x1D5FE, "M", "q"), + (0x1D5FF, "M", "r"), + (0x1D600, "M", "s"), + (0x1D601, "M", "t"), + (0x1D602, "M", "u"), + (0x1D603, "M", "v"), + (0x1D604, "M", "w"), + (0x1D605, "M", "x"), + (0x1D606, "M", "y"), + (0x1D607, "M", "z"), + (0x1D608, "M", "a"), + (0x1D609, "M", "b"), + (0x1D60A, "M", "c"), + (0x1D60B, "M", "d"), + (0x1D60C, "M", "e"), + (0x1D60D, "M", "f"), + (0x1D60E, "M", "g"), + (0x1D60F, "M", "h"), + (0x1D610, "M", "i"), + (0x1D611, "M", "j"), + (0x1D612, "M", "k"), + (0x1D613, "M", "l"), + (0x1D614, "M", "m"), + (0x1D615, "M", "n"), + (0x1D616, "M", "o"), + (0x1D617, "M", "p"), + (0x1D618, "M", "q"), + (0x1D619, "M", "r"), + (0x1D61A, "M", "s"), + (0x1D61B, "M", "t"), + (0x1D61C, "M", "u"), + (0x1D61D, "M", "v"), + (0x1D61E, "M", "w"), + (0x1D61F, "M", "x"), + (0x1D620, "M", "y"), + (0x1D621, "M", "z"), + (0x1D622, "M", "a"), + (0x1D623, "M", "b"), + (0x1D624, "M", "c"), + (0x1D625, "M", "d"), + (0x1D626, "M", "e"), + (0x1D627, "M", "f"), + (0x1D628, "M", "g"), + (0x1D629, "M", "h"), + (0x1D62A, "M", "i"), + (0x1D62B, "M", "j"), + (0x1D62C, "M", "k"), + (0x1D62D, "M", "l"), + (0x1D62E, "M", "m"), + (0x1D62F, "M", "n"), + (0x1D630, "M", "o"), + (0x1D631, "M", "p"), + (0x1D632, "M", "q"), + (0x1D633, "M", "r"), + (0x1D634, "M", "s"), + (0x1D635, "M", "t"), + (0x1D636, "M", "u"), + (0x1D637, "M", "v"), + (0x1D638, "M", "w"), + (0x1D639, "M", "x"), + (0x1D63A, "M", "y"), + (0x1D63B, "M", "z"), + (0x1D63C, "M", "a"), + (0x1D63D, "M", "b"), + (0x1D63E, "M", "c"), + (0x1D63F, "M", "d"), + (0x1D640, "M", "e"), + (0x1D641, "M", "f"), + (0x1D642, "M", "g"), + (0x1D643, "M", "h"), + (0x1D644, "M", "i"), + (0x1D645, "M", "j"), + (0x1D646, "M", "k"), + (0x1D647, "M", "l"), + (0x1D648, "M", "m"), + (0x1D649, "M", "n"), + (0x1D64A, "M", "o"), + (0x1D64B, "M", "p"), + (0x1D64C, "M", "q"), + (0x1D64D, "M", "r"), + (0x1D64E, "M", "s"), + (0x1D64F, "M", "t"), + (0x1D650, "M", "u"), + (0x1D651, "M", "v"), + (0x1D652, "M", "w"), + (0x1D653, "M", "x"), + (0x1D654, "M", "y"), + (0x1D655, "M", "z"), + ] + + +def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D656, "M", "a"), + (0x1D657, "M", "b"), + (0x1D658, "M", "c"), + (0x1D659, "M", "d"), + (0x1D65A, "M", "e"), + (0x1D65B, "M", "f"), + (0x1D65C, "M", "g"), + (0x1D65D, "M", "h"), + (0x1D65E, "M", "i"), + (0x1D65F, "M", "j"), + (0x1D660, "M", "k"), + (0x1D661, "M", "l"), + (0x1D662, "M", "m"), + (0x1D663, "M", "n"), + (0x1D664, "M", "o"), + (0x1D665, "M", "p"), + (0x1D666, "M", "q"), + (0x1D667, "M", "r"), + (0x1D668, "M", "s"), + (0x1D669, "M", "t"), + (0x1D66A, "M", "u"), + (0x1D66B, "M", "v"), + (0x1D66C, "M", "w"), + (0x1D66D, "M", "x"), + (0x1D66E, "M", "y"), + (0x1D66F, "M", "z"), + (0x1D670, "M", "a"), + (0x1D671, "M", "b"), + (0x1D672, "M", "c"), + (0x1D673, "M", "d"), + (0x1D674, "M", "e"), + (0x1D675, "M", "f"), + (0x1D676, "M", "g"), + (0x1D677, "M", "h"), + (0x1D678, "M", "i"), + (0x1D679, "M", "j"), + (0x1D67A, "M", "k"), + (0x1D67B, "M", "l"), + (0x1D67C, "M", "m"), + (0x1D67D, "M", "n"), + (0x1D67E, "M", "o"), + (0x1D67F, "M", "p"), + (0x1D680, "M", "q"), + (0x1D681, "M", "r"), + (0x1D682, "M", "s"), + (0x1D683, "M", "t"), + (0x1D684, "M", "u"), + (0x1D685, "M", "v"), + (0x1D686, "M", "w"), + (0x1D687, "M", "x"), + (0x1D688, "M", "y"), + (0x1D689, "M", "z"), + (0x1D68A, "M", "a"), + (0x1D68B, "M", "b"), + (0x1D68C, "M", "c"), + (0x1D68D, "M", "d"), + (0x1D68E, "M", "e"), + (0x1D68F, "M", "f"), + (0x1D690, "M", "g"), + (0x1D691, "M", "h"), + (0x1D692, "M", "i"), + (0x1D693, "M", "j"), + (0x1D694, "M", "k"), + (0x1D695, "M", "l"), + (0x1D696, "M", "m"), + (0x1D697, "M", "n"), + (0x1D698, "M", "o"), + (0x1D699, "M", "p"), + (0x1D69A, "M", "q"), + (0x1D69B, "M", "r"), + (0x1D69C, "M", "s"), + (0x1D69D, "M", "t"), + (0x1D69E, "M", "u"), + (0x1D69F, "M", "v"), + (0x1D6A0, "M", "w"), + (0x1D6A1, "M", "x"), + (0x1D6A2, "M", "y"), + (0x1D6A3, "M", "z"), + (0x1D6A4, "M", "ı"), + (0x1D6A5, "M", "ȷ"), + (0x1D6A6, "X"), + (0x1D6A8, "M", "α"), + (0x1D6A9, "M", "β"), + (0x1D6AA, "M", "γ"), + (0x1D6AB, "M", "δ"), + (0x1D6AC, "M", "ε"), + (0x1D6AD, "M", "ζ"), + (0x1D6AE, "M", "η"), + (0x1D6AF, "M", "θ"), + (0x1D6B0, "M", "ι"), + (0x1D6B1, "M", "κ"), + (0x1D6B2, "M", "λ"), + (0x1D6B3, "M", "μ"), + (0x1D6B4, "M", "ν"), + (0x1D6B5, "M", "ξ"), + (0x1D6B6, "M", "ο"), + (0x1D6B7, "M", "π"), + (0x1D6B8, "M", "ρ"), + (0x1D6B9, "M", "θ"), + (0x1D6BA, "M", "σ"), + ] + + +def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D6BB, "M", "τ"), + (0x1D6BC, "M", "υ"), + (0x1D6BD, "M", "φ"), + (0x1D6BE, "M", "χ"), + (0x1D6BF, "M", "ψ"), + (0x1D6C0, "M", "ω"), + (0x1D6C1, "M", "∇"), + (0x1D6C2, "M", "α"), + (0x1D6C3, "M", "β"), + (0x1D6C4, "M", "γ"), + (0x1D6C5, "M", "δ"), + (0x1D6C6, "M", "ε"), + (0x1D6C7, "M", "ζ"), + (0x1D6C8, "M", "η"), + (0x1D6C9, "M", "θ"), + (0x1D6CA, "M", "ι"), + (0x1D6CB, "M", "κ"), + (0x1D6CC, "M", "λ"), + (0x1D6CD, "M", "μ"), + (0x1D6CE, "M", "ν"), + (0x1D6CF, "M", "ξ"), + (0x1D6D0, "M", "ο"), + (0x1D6D1, "M", "π"), + (0x1D6D2, "M", "ρ"), + (0x1D6D3, "M", "σ"), + (0x1D6D5, "M", "τ"), + (0x1D6D6, "M", "υ"), + (0x1D6D7, "M", "φ"), + (0x1D6D8, "M", "χ"), + (0x1D6D9, "M", "ψ"), + (0x1D6DA, "M", "ω"), + (0x1D6DB, "M", "∂"), + (0x1D6DC, "M", "ε"), + (0x1D6DD, "M", "θ"), + (0x1D6DE, "M", "κ"), + (0x1D6DF, "M", "φ"), + (0x1D6E0, "M", "ρ"), + (0x1D6E1, "M", "π"), + (0x1D6E2, "M", "α"), + (0x1D6E3, "M", "β"), + (0x1D6E4, "M", "γ"), + (0x1D6E5, "M", "δ"), + (0x1D6E6, "M", "ε"), + (0x1D6E7, "M", "ζ"), + (0x1D6E8, "M", "η"), + (0x1D6E9, "M", "θ"), + (0x1D6EA, "M", "ι"), + (0x1D6EB, "M", "κ"), + (0x1D6EC, "M", "λ"), + (0x1D6ED, "M", "μ"), + (0x1D6EE, "M", "ν"), + (0x1D6EF, "M", "ξ"), + (0x1D6F0, "M", "ο"), + (0x1D6F1, "M", "π"), + (0x1D6F2, "M", "ρ"), + (0x1D6F3, "M", "θ"), + (0x1D6F4, "M", "σ"), + (0x1D6F5, "M", "τ"), + (0x1D6F6, "M", "υ"), + (0x1D6F7, "M", "φ"), + (0x1D6F8, "M", "χ"), + (0x1D6F9, "M", "ψ"), + (0x1D6FA, "M", "ω"), + (0x1D6FB, "M", "∇"), + (0x1D6FC, "M", "α"), + (0x1D6FD, "M", "β"), + (0x1D6FE, "M", "γ"), + (0x1D6FF, "M", "δ"), + (0x1D700, "M", "ε"), + (0x1D701, "M", "ζ"), + (0x1D702, "M", "η"), + (0x1D703, "M", "θ"), + (0x1D704, "M", "ι"), + (0x1D705, "M", "κ"), + (0x1D706, "M", "λ"), + (0x1D707, "M", "μ"), + (0x1D708, "M", "ν"), + (0x1D709, "M", "ξ"), + (0x1D70A, "M", "ο"), + (0x1D70B, "M", "π"), + (0x1D70C, "M", "ρ"), + (0x1D70D, "M", "σ"), + (0x1D70F, "M", "τ"), + (0x1D710, "M", "υ"), + (0x1D711, "M", "φ"), + (0x1D712, "M", "χ"), + (0x1D713, "M", "ψ"), + (0x1D714, "M", "ω"), + (0x1D715, "M", "∂"), + (0x1D716, "M", "ε"), + (0x1D717, "M", "θ"), + (0x1D718, "M", "κ"), + (0x1D719, "M", "φ"), + (0x1D71A, "M", "ρ"), + (0x1D71B, "M", "π"), + (0x1D71C, "M", "α"), + (0x1D71D, "M", "β"), + (0x1D71E, "M", "γ"), + (0x1D71F, "M", "δ"), + (0x1D720, "M", "ε"), + ] + + +def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D721, "M", "ζ"), + (0x1D722, "M", "η"), + (0x1D723, "M", "θ"), + (0x1D724, "M", "ι"), + (0x1D725, "M", "κ"), + (0x1D726, "M", "λ"), + (0x1D727, "M", "μ"), + (0x1D728, "M", "ν"), + (0x1D729, "M", "ξ"), + (0x1D72A, "M", "ο"), + (0x1D72B, "M", "π"), + (0x1D72C, "M", "ρ"), + (0x1D72D, "M", "θ"), + (0x1D72E, "M", "σ"), + (0x1D72F, "M", "τ"), + (0x1D730, "M", "υ"), + (0x1D731, "M", "φ"), + (0x1D732, "M", "χ"), + (0x1D733, "M", "ψ"), + (0x1D734, "M", "ω"), + (0x1D735, "M", "∇"), + (0x1D736, "M", "α"), + (0x1D737, "M", "β"), + (0x1D738, "M", "γ"), + (0x1D739, "M", "δ"), + (0x1D73A, "M", "ε"), + (0x1D73B, "M", "ζ"), + (0x1D73C, "M", "η"), + (0x1D73D, "M", "θ"), + (0x1D73E, "M", "ι"), + (0x1D73F, "M", "κ"), + (0x1D740, "M", "λ"), + (0x1D741, "M", "μ"), + (0x1D742, "M", "ν"), + (0x1D743, "M", "ξ"), + (0x1D744, "M", "ο"), + (0x1D745, "M", "π"), + (0x1D746, "M", "ρ"), + (0x1D747, "M", "σ"), + (0x1D749, "M", "τ"), + (0x1D74A, "M", "υ"), + (0x1D74B, "M", "φ"), + (0x1D74C, "M", "χ"), + (0x1D74D, "M", "ψ"), + (0x1D74E, "M", "ω"), + (0x1D74F, "M", "∂"), + (0x1D750, "M", "ε"), + (0x1D751, "M", "θ"), + (0x1D752, "M", "κ"), + (0x1D753, "M", "φ"), + (0x1D754, "M", "ρ"), + (0x1D755, "M", "π"), + (0x1D756, "M", "α"), + (0x1D757, "M", "β"), + (0x1D758, "M", "γ"), + (0x1D759, "M", "δ"), + (0x1D75A, "M", "ε"), + (0x1D75B, "M", "ζ"), + (0x1D75C, "M", "η"), + (0x1D75D, "M", "θ"), + (0x1D75E, "M", "ι"), + (0x1D75F, "M", "κ"), + (0x1D760, "M", "λ"), + (0x1D761, "M", "μ"), + (0x1D762, "M", "ν"), + (0x1D763, "M", "ξ"), + (0x1D764, "M", "ο"), + (0x1D765, "M", "π"), + (0x1D766, "M", "ρ"), + (0x1D767, "M", "θ"), + (0x1D768, "M", "σ"), + (0x1D769, "M", "τ"), + (0x1D76A, "M", "υ"), + (0x1D76B, "M", "φ"), + (0x1D76C, "M", "χ"), + (0x1D76D, "M", "ψ"), + (0x1D76E, "M", "ω"), + (0x1D76F, "M", "∇"), + (0x1D770, "M", "α"), + (0x1D771, "M", "β"), + (0x1D772, "M", "γ"), + (0x1D773, "M", "δ"), + (0x1D774, "M", "ε"), + (0x1D775, "M", "ζ"), + (0x1D776, "M", "η"), + (0x1D777, "M", "θ"), + (0x1D778, "M", "ι"), + (0x1D779, "M", "κ"), + (0x1D77A, "M", "λ"), + (0x1D77B, "M", "μ"), + (0x1D77C, "M", "ν"), + (0x1D77D, "M", "ξ"), + (0x1D77E, "M", "ο"), + (0x1D77F, "M", "π"), + (0x1D780, "M", "ρ"), + (0x1D781, "M", "σ"), + (0x1D783, "M", "τ"), + (0x1D784, "M", "υ"), + (0x1D785, "M", "φ"), + (0x1D786, "M", "χ"), + ] + + +def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D787, "M", "ψ"), + (0x1D788, "M", "ω"), + (0x1D789, "M", "∂"), + (0x1D78A, "M", "ε"), + (0x1D78B, "M", "θ"), + (0x1D78C, "M", "κ"), + (0x1D78D, "M", "φ"), + (0x1D78E, "M", "ρ"), + (0x1D78F, "M", "π"), + (0x1D790, "M", "α"), + (0x1D791, "M", "β"), + (0x1D792, "M", "γ"), + (0x1D793, "M", "δ"), + (0x1D794, "M", "ε"), + (0x1D795, "M", "ζ"), + (0x1D796, "M", "η"), + (0x1D797, "M", "θ"), + (0x1D798, "M", "ι"), + (0x1D799, "M", "κ"), + (0x1D79A, "M", "λ"), + (0x1D79B, "M", "μ"), + (0x1D79C, "M", "ν"), + (0x1D79D, "M", "ξ"), + (0x1D79E, "M", "ο"), + (0x1D79F, "M", "π"), + (0x1D7A0, "M", "ρ"), + (0x1D7A1, "M", "θ"), + (0x1D7A2, "M", "σ"), + (0x1D7A3, "M", "τ"), + (0x1D7A4, "M", "υ"), + (0x1D7A5, "M", "φ"), + (0x1D7A6, "M", "χ"), + (0x1D7A7, "M", "ψ"), + (0x1D7A8, "M", "ω"), + (0x1D7A9, "M", "∇"), + (0x1D7AA, "M", "α"), + (0x1D7AB, "M", "β"), + (0x1D7AC, "M", "γ"), + (0x1D7AD, "M", "δ"), + (0x1D7AE, "M", "ε"), + (0x1D7AF, "M", "ζ"), + (0x1D7B0, "M", "η"), + (0x1D7B1, "M", "θ"), + (0x1D7B2, "M", "ι"), + (0x1D7B3, "M", "κ"), + (0x1D7B4, "M", "λ"), + (0x1D7B5, "M", "μ"), + (0x1D7B6, "M", "ν"), + (0x1D7B7, "M", "ξ"), + (0x1D7B8, "M", "ο"), + (0x1D7B9, "M", "π"), + (0x1D7BA, "M", "ρ"), + (0x1D7BB, "M", "σ"), + (0x1D7BD, "M", "τ"), + (0x1D7BE, "M", "υ"), + (0x1D7BF, "M", "φ"), + (0x1D7C0, "M", "χ"), + (0x1D7C1, "M", "ψ"), + (0x1D7C2, "M", "ω"), + (0x1D7C3, "M", "∂"), + (0x1D7C4, "M", "ε"), + (0x1D7C5, "M", "θ"), + (0x1D7C6, "M", "κ"), + (0x1D7C7, "M", "φ"), + (0x1D7C8, "M", "ρ"), + (0x1D7C9, "M", "π"), + (0x1D7CA, "M", "ϝ"), + (0x1D7CC, "X"), + (0x1D7CE, "M", "0"), + (0x1D7CF, "M", "1"), + (0x1D7D0, "M", "2"), + (0x1D7D1, "M", "3"), + (0x1D7D2, "M", "4"), + (0x1D7D3, "M", "5"), + (0x1D7D4, "M", "6"), + (0x1D7D5, "M", "7"), + (0x1D7D6, "M", "8"), + (0x1D7D7, "M", "9"), + (0x1D7D8, "M", "0"), + (0x1D7D9, "M", "1"), + (0x1D7DA, "M", "2"), + (0x1D7DB, "M", "3"), + (0x1D7DC, "M", "4"), + (0x1D7DD, "M", "5"), + (0x1D7DE, "M", "6"), + (0x1D7DF, "M", "7"), + (0x1D7E0, "M", "8"), + (0x1D7E1, "M", "9"), + (0x1D7E2, "M", "0"), + (0x1D7E3, "M", "1"), + (0x1D7E4, "M", "2"), + (0x1D7E5, "M", "3"), + (0x1D7E6, "M", "4"), + (0x1D7E7, "M", "5"), + (0x1D7E8, "M", "6"), + (0x1D7E9, "M", "7"), + (0x1D7EA, "M", "8"), + (0x1D7EB, "M", "9"), + (0x1D7EC, "M", "0"), + (0x1D7ED, "M", "1"), + ] + + +def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D7EE, "M", "2"), + (0x1D7EF, "M", "3"), + (0x1D7F0, "M", "4"), + (0x1D7F1, "M", "5"), + (0x1D7F2, "M", "6"), + (0x1D7F3, "M", "7"), + (0x1D7F4, "M", "8"), + (0x1D7F5, "M", "9"), + (0x1D7F6, "M", "0"), + (0x1D7F7, "M", "1"), + (0x1D7F8, "M", "2"), + (0x1D7F9, "M", "3"), + (0x1D7FA, "M", "4"), + (0x1D7FB, "M", "5"), + (0x1D7FC, "M", "6"), + (0x1D7FD, "M", "7"), + (0x1D7FE, "M", "8"), + (0x1D7FF, "M", "9"), + (0x1D800, "V"), + (0x1DA8C, "X"), + (0x1DA9B, "V"), + (0x1DAA0, "X"), + (0x1DAA1, "V"), + (0x1DAB0, "X"), + (0x1DF00, "V"), + (0x1DF1F, "X"), + (0x1DF25, "V"), + (0x1DF2B, "X"), + (0x1E000, "V"), + (0x1E007, "X"), + (0x1E008, "V"), + (0x1E019, "X"), + (0x1E01B, "V"), + (0x1E022, "X"), + (0x1E023, "V"), + (0x1E025, "X"), + (0x1E026, "V"), + (0x1E02B, "X"), + (0x1E030, "M", "а"), + (0x1E031, "M", "б"), + (0x1E032, "M", "в"), + (0x1E033, "M", "г"), + (0x1E034, "M", "д"), + (0x1E035, "M", "е"), + (0x1E036, "M", "ж"), + (0x1E037, "M", "з"), + (0x1E038, "M", "и"), + (0x1E039, "M", "к"), + (0x1E03A, "M", "л"), + (0x1E03B, "M", "м"), + (0x1E03C, "M", "о"), + (0x1E03D, "M", "п"), + (0x1E03E, "M", "р"), + (0x1E03F, "M", "с"), + (0x1E040, "M", "т"), + (0x1E041, "M", "у"), + (0x1E042, "M", "ф"), + (0x1E043, "M", "х"), + (0x1E044, "M", "ц"), + (0x1E045, "M", "ч"), + (0x1E046, "M", "ш"), + (0x1E047, "M", "ы"), + (0x1E048, "M", "э"), + (0x1E049, "M", "ю"), + (0x1E04A, "M", "ꚉ"), + (0x1E04B, "M", "ә"), + (0x1E04C, "M", "і"), + (0x1E04D, "M", "ј"), + (0x1E04E, "M", "ө"), + (0x1E04F, "M", "ү"), + (0x1E050, "M", "ӏ"), + (0x1E051, "M", "а"), + (0x1E052, "M", "б"), + (0x1E053, "M", "в"), + (0x1E054, "M", "г"), + (0x1E055, "M", "д"), + (0x1E056, "M", "е"), + (0x1E057, "M", "ж"), + (0x1E058, "M", "з"), + (0x1E059, "M", "и"), + (0x1E05A, "M", "к"), + (0x1E05B, "M", "л"), + (0x1E05C, "M", "о"), + (0x1E05D, "M", "п"), + (0x1E05E, "M", "с"), + (0x1E05F, "M", "у"), + (0x1E060, "M", "ф"), + (0x1E061, "M", "х"), + (0x1E062, "M", "ц"), + (0x1E063, "M", "ч"), + (0x1E064, "M", "ш"), + (0x1E065, "M", "ъ"), + (0x1E066, "M", "ы"), + (0x1E067, "M", "ґ"), + (0x1E068, "M", "і"), + (0x1E069, "M", "ѕ"), + (0x1E06A, "M", "џ"), + (0x1E06B, "M", "ҫ"), + (0x1E06C, "M", "ꙑ"), + (0x1E06D, "M", "ұ"), + ] + + +def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1E06E, "X"), + (0x1E08F, "V"), + (0x1E090, "X"), + (0x1E100, "V"), + (0x1E12D, "X"), + (0x1E130, "V"), + (0x1E13E, "X"), + (0x1E140, "V"), + (0x1E14A, "X"), + (0x1E14E, "V"), + (0x1E150, "X"), + (0x1E290, "V"), + (0x1E2AF, "X"), + (0x1E2C0, "V"), + (0x1E2FA, "X"), + (0x1E2FF, "V"), + (0x1E300, "X"), + (0x1E4D0, "V"), + (0x1E4FA, "X"), + (0x1E5D0, "V"), + (0x1E5FB, "X"), + (0x1E5FF, "V"), + (0x1E600, "X"), + (0x1E7E0, "V"), + (0x1E7E7, "X"), + (0x1E7E8, "V"), + (0x1E7EC, "X"), + (0x1E7ED, "V"), + (0x1E7EF, "X"), + (0x1E7F0, "V"), + (0x1E7FF, "X"), + (0x1E800, "V"), + (0x1E8C5, "X"), + (0x1E8C7, "V"), + (0x1E8D7, "X"), + (0x1E900, "M", "𞤢"), + (0x1E901, "M", "𞤣"), + (0x1E902, "M", "𞤤"), + (0x1E903, "M", "𞤥"), + (0x1E904, "M", "𞤦"), + (0x1E905, "M", "𞤧"), + (0x1E906, "M", "𞤨"), + (0x1E907, "M", "𞤩"), + (0x1E908, "M", "𞤪"), + (0x1E909, "M", "𞤫"), + (0x1E90A, "M", "𞤬"), + (0x1E90B, "M", "𞤭"), + (0x1E90C, "M", "𞤮"), + (0x1E90D, "M", "𞤯"), + (0x1E90E, "M", "𞤰"), + (0x1E90F, "M", "𞤱"), + (0x1E910, "M", "𞤲"), + (0x1E911, "M", "𞤳"), + (0x1E912, "M", "𞤴"), + (0x1E913, "M", "𞤵"), + (0x1E914, "M", "𞤶"), + (0x1E915, "M", "𞤷"), + (0x1E916, "M", "𞤸"), + (0x1E917, "M", "𞤹"), + (0x1E918, "M", "𞤺"), + (0x1E919, "M", "𞤻"), + (0x1E91A, "M", "𞤼"), + (0x1E91B, "M", "𞤽"), + (0x1E91C, "M", "𞤾"), + (0x1E91D, "M", "𞤿"), + (0x1E91E, "M", "𞥀"), + (0x1E91F, "M", "𞥁"), + (0x1E920, "M", "𞥂"), + (0x1E921, "M", "𞥃"), + (0x1E922, "V"), + (0x1E94C, "X"), + (0x1E950, "V"), + (0x1E95A, "X"), + (0x1E95E, "V"), + (0x1E960, "X"), + (0x1EC71, "V"), + (0x1ECB5, "X"), + (0x1ED01, "V"), + (0x1ED3E, "X"), + (0x1EE00, "M", "ا"), + (0x1EE01, "M", "ب"), + (0x1EE02, "M", "ج"), + (0x1EE03, "M", "د"), + (0x1EE04, "X"), + (0x1EE05, "M", "و"), + (0x1EE06, "M", "ز"), + (0x1EE07, "M", "ح"), + (0x1EE08, "M", "ط"), + (0x1EE09, "M", "ي"), + (0x1EE0A, "M", "ك"), + (0x1EE0B, "M", "ل"), + (0x1EE0C, "M", "م"), + (0x1EE0D, "M", "ن"), + (0x1EE0E, "M", "س"), + (0x1EE0F, "M", "ع"), + (0x1EE10, "M", "ف"), + (0x1EE11, "M", "ص"), + (0x1EE12, "M", "ق"), + (0x1EE13, "M", "ر"), + (0x1EE14, "M", "ش"), + ] + + +def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1EE15, "M", "ت"), + (0x1EE16, "M", "ث"), + (0x1EE17, "M", "خ"), + (0x1EE18, "M", "ذ"), + (0x1EE19, "M", "ض"), + (0x1EE1A, "M", "ظ"), + (0x1EE1B, "M", "غ"), + (0x1EE1C, "M", "ٮ"), + (0x1EE1D, "M", "ں"), + (0x1EE1E, "M", "ڡ"), + (0x1EE1F, "M", "ٯ"), + (0x1EE20, "X"), + (0x1EE21, "M", "ب"), + (0x1EE22, "M", "ج"), + (0x1EE23, "X"), + (0x1EE24, "M", "ه"), + (0x1EE25, "X"), + (0x1EE27, "M", "ح"), + (0x1EE28, "X"), + (0x1EE29, "M", "ي"), + (0x1EE2A, "M", "ك"), + (0x1EE2B, "M", "ل"), + (0x1EE2C, "M", "م"), + (0x1EE2D, "M", "ن"), + (0x1EE2E, "M", "س"), + (0x1EE2F, "M", "ع"), + (0x1EE30, "M", "ف"), + (0x1EE31, "M", "ص"), + (0x1EE32, "M", "ق"), + (0x1EE33, "X"), + (0x1EE34, "M", "ش"), + (0x1EE35, "M", "ت"), + (0x1EE36, "M", "ث"), + (0x1EE37, "M", "خ"), + (0x1EE38, "X"), + (0x1EE39, "M", "ض"), + (0x1EE3A, "X"), + (0x1EE3B, "M", "غ"), + (0x1EE3C, "X"), + (0x1EE42, "M", "ج"), + (0x1EE43, "X"), + (0x1EE47, "M", "ح"), + (0x1EE48, "X"), + (0x1EE49, "M", "ي"), + (0x1EE4A, "X"), + (0x1EE4B, "M", "ل"), + (0x1EE4C, "X"), + (0x1EE4D, "M", "ن"), + (0x1EE4E, "M", "س"), + (0x1EE4F, "M", "ع"), + (0x1EE50, "X"), + (0x1EE51, "M", "ص"), + (0x1EE52, "M", "ق"), + (0x1EE53, "X"), + (0x1EE54, "M", "ش"), + (0x1EE55, "X"), + (0x1EE57, "M", "خ"), + (0x1EE58, "X"), + (0x1EE59, "M", "ض"), + (0x1EE5A, "X"), + (0x1EE5B, "M", "غ"), + (0x1EE5C, "X"), + (0x1EE5D, "M", "ں"), + (0x1EE5E, "X"), + (0x1EE5F, "M", "ٯ"), + (0x1EE60, "X"), + (0x1EE61, "M", "ب"), + (0x1EE62, "M", "ج"), + (0x1EE63, "X"), + (0x1EE64, "M", "ه"), + (0x1EE65, "X"), + (0x1EE67, "M", "ح"), + (0x1EE68, "M", "ط"), + (0x1EE69, "M", "ي"), + (0x1EE6A, "M", "ك"), + (0x1EE6B, "X"), + (0x1EE6C, "M", "م"), + (0x1EE6D, "M", "ن"), + (0x1EE6E, "M", "س"), + (0x1EE6F, "M", "ع"), + (0x1EE70, "M", "ف"), + (0x1EE71, "M", "ص"), + (0x1EE72, "M", "ق"), + (0x1EE73, "X"), + (0x1EE74, "M", "ش"), + (0x1EE75, "M", "ت"), + (0x1EE76, "M", "ث"), + (0x1EE77, "M", "خ"), + (0x1EE78, "X"), + (0x1EE79, "M", "ض"), + (0x1EE7A, "M", "ظ"), + (0x1EE7B, "M", "غ"), + (0x1EE7C, "M", "ٮ"), + (0x1EE7D, "X"), + (0x1EE7E, "M", "ڡ"), + (0x1EE7F, "X"), + (0x1EE80, "M", "ا"), + (0x1EE81, "M", "ب"), + (0x1EE82, "M", "ج"), + (0x1EE83, "M", "د"), + ] + + +def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1EE84, "M", "ه"), + (0x1EE85, "M", "و"), + (0x1EE86, "M", "ز"), + (0x1EE87, "M", "ح"), + (0x1EE88, "M", "ط"), + (0x1EE89, "M", "ي"), + (0x1EE8A, "X"), + (0x1EE8B, "M", "ل"), + (0x1EE8C, "M", "م"), + (0x1EE8D, "M", "ن"), + (0x1EE8E, "M", "س"), + (0x1EE8F, "M", "ع"), + (0x1EE90, "M", "ف"), + (0x1EE91, "M", "ص"), + (0x1EE92, "M", "ق"), + (0x1EE93, "M", "ر"), + (0x1EE94, "M", "ش"), + (0x1EE95, "M", "ت"), + (0x1EE96, "M", "ث"), + (0x1EE97, "M", "خ"), + (0x1EE98, "M", "ذ"), + (0x1EE99, "M", "ض"), + (0x1EE9A, "M", "ظ"), + (0x1EE9B, "M", "غ"), + (0x1EE9C, "X"), + (0x1EEA1, "M", "ب"), + (0x1EEA2, "M", "ج"), + (0x1EEA3, "M", "د"), + (0x1EEA4, "X"), + (0x1EEA5, "M", "و"), + (0x1EEA6, "M", "ز"), + (0x1EEA7, "M", "ح"), + (0x1EEA8, "M", "ط"), + (0x1EEA9, "M", "ي"), + (0x1EEAA, "X"), + (0x1EEAB, "M", "ل"), + (0x1EEAC, "M", "م"), + (0x1EEAD, "M", "ن"), + (0x1EEAE, "M", "س"), + (0x1EEAF, "M", "ع"), + (0x1EEB0, "M", "ف"), + (0x1EEB1, "M", "ص"), + (0x1EEB2, "M", "ق"), + (0x1EEB3, "M", "ر"), + (0x1EEB4, "M", "ش"), + (0x1EEB5, "M", "ت"), + (0x1EEB6, "M", "ث"), + (0x1EEB7, "M", "خ"), + (0x1EEB8, "M", "ذ"), + (0x1EEB9, "M", "ض"), + (0x1EEBA, "M", "ظ"), + (0x1EEBB, "M", "غ"), + (0x1EEBC, "X"), + (0x1EEF0, "V"), + (0x1EEF2, "X"), + (0x1F000, "V"), + (0x1F02C, "X"), + (0x1F030, "V"), + (0x1F094, "X"), + (0x1F0A0, "V"), + (0x1F0AF, "X"), + (0x1F0B1, "V"), + (0x1F0C0, "X"), + (0x1F0C1, "V"), + (0x1F0D0, "X"), + (0x1F0D1, "V"), + (0x1F0F6, "X"), + (0x1F101, "M", "0,"), + (0x1F102, "M", "1,"), + (0x1F103, "M", "2,"), + (0x1F104, "M", "3,"), + (0x1F105, "M", "4,"), + (0x1F106, "M", "5,"), + (0x1F107, "M", "6,"), + (0x1F108, "M", "7,"), + (0x1F109, "M", "8,"), + (0x1F10A, "M", "9,"), + (0x1F10B, "V"), + (0x1F110, "M", "(a)"), + (0x1F111, "M", "(b)"), + (0x1F112, "M", "(c)"), + (0x1F113, "M", "(d)"), + (0x1F114, "M", "(e)"), + (0x1F115, "M", "(f)"), + (0x1F116, "M", "(g)"), + (0x1F117, "M", "(h)"), + (0x1F118, "M", "(i)"), + (0x1F119, "M", "(j)"), + (0x1F11A, "M", "(k)"), + (0x1F11B, "M", "(l)"), + (0x1F11C, "M", "(m)"), + (0x1F11D, "M", "(n)"), + (0x1F11E, "M", "(o)"), + (0x1F11F, "M", "(p)"), + (0x1F120, "M", "(q)"), + (0x1F121, "M", "(r)"), + (0x1F122, "M", "(s)"), + (0x1F123, "M", "(t)"), + (0x1F124, "M", "(u)"), + (0x1F125, "M", "(v)"), + ] + + +def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1F126, "M", "(w)"), + (0x1F127, "M", "(x)"), + (0x1F128, "M", "(y)"), + (0x1F129, "M", "(z)"), + (0x1F12A, "M", "〔s〕"), + (0x1F12B, "M", "c"), + (0x1F12C, "M", "r"), + (0x1F12D, "M", "cd"), + (0x1F12E, "M", "wz"), + (0x1F12F, "V"), + (0x1F130, "M", "a"), + (0x1F131, "M", "b"), + (0x1F132, "M", "c"), + (0x1F133, "M", "d"), + (0x1F134, "M", "e"), + (0x1F135, "M", "f"), + (0x1F136, "M", "g"), + (0x1F137, "M", "h"), + (0x1F138, "M", "i"), + (0x1F139, "M", "j"), + (0x1F13A, "M", "k"), + (0x1F13B, "M", "l"), + (0x1F13C, "M", "m"), + (0x1F13D, "M", "n"), + (0x1F13E, "M", "o"), + (0x1F13F, "M", "p"), + (0x1F140, "M", "q"), + (0x1F141, "M", "r"), + (0x1F142, "M", "s"), + (0x1F143, "M", "t"), + (0x1F144, "M", "u"), + (0x1F145, "M", "v"), + (0x1F146, "M", "w"), + (0x1F147, "M", "x"), + (0x1F148, "M", "y"), + (0x1F149, "M", "z"), + (0x1F14A, "M", "hv"), + (0x1F14B, "M", "mv"), + (0x1F14C, "M", "sd"), + (0x1F14D, "M", "ss"), + (0x1F14E, "M", "ppv"), + (0x1F14F, "M", "wc"), + (0x1F150, "V"), + (0x1F16A, "M", "mc"), + (0x1F16B, "M", "md"), + (0x1F16C, "M", "mr"), + (0x1F16D, "V"), + (0x1F190, "M", "dj"), + (0x1F191, "V"), + (0x1F1AE, "X"), + (0x1F1E6, "V"), + (0x1F200, "M", "ほか"), + (0x1F201, "M", "ココ"), + (0x1F202, "M", "サ"), + (0x1F203, "X"), + (0x1F210, "M", "手"), + (0x1F211, "M", "字"), + (0x1F212, "M", "双"), + (0x1F213, "M", "デ"), + (0x1F214, "M", "二"), + (0x1F215, "M", "多"), + (0x1F216, "M", "解"), + (0x1F217, "M", "天"), + (0x1F218, "M", "交"), + (0x1F219, "M", "映"), + (0x1F21A, "M", "無"), + (0x1F21B, "M", "料"), + (0x1F21C, "M", "前"), + (0x1F21D, "M", "後"), + (0x1F21E, "M", "再"), + (0x1F21F, "M", "新"), + (0x1F220, "M", "初"), + (0x1F221, "M", "終"), + (0x1F222, "M", "生"), + (0x1F223, "M", "販"), + (0x1F224, "M", "声"), + (0x1F225, "M", "吹"), + (0x1F226, "M", "演"), + (0x1F227, "M", "投"), + (0x1F228, "M", "捕"), + (0x1F229, "M", "一"), + (0x1F22A, "M", "三"), + (0x1F22B, "M", "遊"), + (0x1F22C, "M", "左"), + (0x1F22D, "M", "中"), + (0x1F22E, "M", "右"), + (0x1F22F, "M", "指"), + (0x1F230, "M", "走"), + (0x1F231, "M", "打"), + (0x1F232, "M", "禁"), + (0x1F233, "M", "空"), + (0x1F234, "M", "合"), + (0x1F235, "M", "満"), + (0x1F236, "M", "有"), + (0x1F237, "M", "月"), + (0x1F238, "M", "申"), + (0x1F239, "M", "割"), + (0x1F23A, "M", "営"), + (0x1F23B, "M", "配"), + (0x1F23C, "X"), + ] + + +def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1F240, "M", "〔本〕"), + (0x1F241, "M", "〔三〕"), + (0x1F242, "M", "〔二〕"), + (0x1F243, "M", "〔安〕"), + (0x1F244, "M", "〔点〕"), + (0x1F245, "M", "〔打〕"), + (0x1F246, "M", "〔盗〕"), + (0x1F247, "M", "〔勝〕"), + (0x1F248, "M", "〔敗〕"), + (0x1F249, "X"), + (0x1F250, "M", "得"), + (0x1F251, "M", "可"), + (0x1F252, "X"), + (0x1F260, "V"), + (0x1F266, "X"), + (0x1F300, "V"), + (0x1F6D8, "X"), + (0x1F6DC, "V"), + (0x1F6ED, "X"), + (0x1F6F0, "V"), + (0x1F6FD, "X"), + (0x1F700, "V"), + (0x1F777, "X"), + (0x1F77B, "V"), + (0x1F7DA, "X"), + (0x1F7E0, "V"), + (0x1F7EC, "X"), + (0x1F7F0, "V"), + (0x1F7F1, "X"), + (0x1F800, "V"), + (0x1F80C, "X"), + (0x1F810, "V"), + (0x1F848, "X"), + (0x1F850, "V"), + (0x1F85A, "X"), + (0x1F860, "V"), + (0x1F888, "X"), + (0x1F890, "V"), + (0x1F8AE, "X"), + (0x1F8B0, "V"), + (0x1F8BC, "X"), + (0x1F8C0, "V"), + (0x1F8C2, "X"), + (0x1F900, "V"), + (0x1FA54, "X"), + (0x1FA60, "V"), + (0x1FA6E, "X"), + (0x1FA70, "V"), + (0x1FA7D, "X"), + (0x1FA80, "V"), + (0x1FA8A, "X"), + (0x1FA8F, "V"), + (0x1FAC7, "X"), + (0x1FACE, "V"), + (0x1FADD, "X"), + (0x1FADF, "V"), + (0x1FAEA, "X"), + (0x1FAF0, "V"), + (0x1FAF9, "X"), + (0x1FB00, "V"), + (0x1FB93, "X"), + (0x1FB94, "V"), + (0x1FBF0, "M", "0"), + (0x1FBF1, "M", "1"), + (0x1FBF2, "M", "2"), + (0x1FBF3, "M", "3"), + (0x1FBF4, "M", "4"), + (0x1FBF5, "M", "5"), + (0x1FBF6, "M", "6"), + (0x1FBF7, "M", "7"), + (0x1FBF8, "M", "8"), + (0x1FBF9, "M", "9"), + (0x1FBFA, "X"), + (0x20000, "V"), + (0x2A6E0, "X"), + (0x2A700, "V"), + (0x2B73A, "X"), + (0x2B740, "V"), + (0x2B81E, "X"), + (0x2B820, "V"), + (0x2CEA2, "X"), + (0x2CEB0, "V"), + (0x2EBE1, "X"), + (0x2EBF0, "V"), + (0x2EE5E, "X"), + (0x2F800, "M", "丽"), + (0x2F801, "M", "丸"), + (0x2F802, "M", "乁"), + (0x2F803, "M", "𠄢"), + (0x2F804, "M", "你"), + (0x2F805, "M", "侮"), + (0x2F806, "M", "侻"), + (0x2F807, "M", "倂"), + (0x2F808, "M", "偺"), + (0x2F809, "M", "備"), + (0x2F80A, "M", "僧"), + (0x2F80B, "M", "像"), + (0x2F80C, "M", "㒞"), + (0x2F80D, "M", "𠘺"), + (0x2F80E, "M", "免"), + ] + + +def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F80F, "M", "兔"), + (0x2F810, "M", "兤"), + (0x2F811, "M", "具"), + (0x2F812, "M", "𠔜"), + (0x2F813, "M", "㒹"), + (0x2F814, "M", "內"), + (0x2F815, "M", "再"), + (0x2F816, "M", "𠕋"), + (0x2F817, "M", "冗"), + (0x2F818, "M", "冤"), + (0x2F819, "M", "仌"), + (0x2F81A, "M", "冬"), + (0x2F81B, "M", "况"), + (0x2F81C, "M", "𩇟"), + (0x2F81D, "M", "凵"), + (0x2F81E, "M", "刃"), + (0x2F81F, "M", "㓟"), + (0x2F820, "M", "刻"), + (0x2F821, "M", "剆"), + (0x2F822, "M", "割"), + (0x2F823, "M", "剷"), + (0x2F824, "M", "㔕"), + (0x2F825, "M", "勇"), + (0x2F826, "M", "勉"), + (0x2F827, "M", "勤"), + (0x2F828, "M", "勺"), + (0x2F829, "M", "包"), + (0x2F82A, "M", "匆"), + (0x2F82B, "M", "北"), + (0x2F82C, "M", "卉"), + (0x2F82D, "M", "卑"), + (0x2F82E, "M", "博"), + (0x2F82F, "M", "即"), + (0x2F830, "M", "卽"), + (0x2F831, "M", "卿"), + (0x2F834, "M", "𠨬"), + (0x2F835, "M", "灰"), + (0x2F836, "M", "及"), + (0x2F837, "M", "叟"), + (0x2F838, "M", "𠭣"), + (0x2F839, "M", "叫"), + (0x2F83A, "M", "叱"), + (0x2F83B, "M", "吆"), + (0x2F83C, "M", "咞"), + (0x2F83D, "M", "吸"), + (0x2F83E, "M", "呈"), + (0x2F83F, "M", "周"), + (0x2F840, "M", "咢"), + (0x2F841, "M", "哶"), + (0x2F842, "M", "唐"), + (0x2F843, "M", "啓"), + (0x2F844, "M", "啣"), + (0x2F845, "M", "善"), + (0x2F847, "M", "喙"), + (0x2F848, "M", "喫"), + (0x2F849, "M", "喳"), + (0x2F84A, "M", "嗂"), + (0x2F84B, "M", "圖"), + (0x2F84C, "M", "嘆"), + (0x2F84D, "M", "圗"), + (0x2F84E, "M", "噑"), + (0x2F84F, "M", "噴"), + (0x2F850, "M", "切"), + (0x2F851, "M", "壮"), + (0x2F852, "M", "城"), + (0x2F853, "M", "埴"), + (0x2F854, "M", "堍"), + (0x2F855, "M", "型"), + (0x2F856, "M", "堲"), + (0x2F857, "M", "報"), + (0x2F858, "M", "墬"), + (0x2F859, "M", "𡓤"), + (0x2F85A, "M", "売"), + (0x2F85B, "M", "壷"), + (0x2F85C, "M", "夆"), + (0x2F85D, "M", "多"), + (0x2F85E, "M", "夢"), + (0x2F85F, "M", "奢"), + (0x2F860, "M", "𡚨"), + (0x2F861, "M", "𡛪"), + (0x2F862, "M", "姬"), + (0x2F863, "M", "娛"), + (0x2F864, "M", "娧"), + (0x2F865, "M", "姘"), + (0x2F866, "M", "婦"), + (0x2F867, "M", "㛮"), + (0x2F868, "M", "㛼"), + (0x2F869, "M", "嬈"), + (0x2F86A, "M", "嬾"), + (0x2F86C, "M", "𡧈"), + (0x2F86D, "M", "寃"), + (0x2F86E, "M", "寘"), + (0x2F86F, "M", "寧"), + (0x2F870, "M", "寳"), + (0x2F871, "M", "𡬘"), + (0x2F872, "M", "寿"), + (0x2F873, "M", "将"), + (0x2F874, "M", "当"), + (0x2F875, "M", "尢"), + (0x2F876, "M", "㞁"), + ] + + +def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F877, "M", "屠"), + (0x2F878, "M", "屮"), + (0x2F879, "M", "峀"), + (0x2F87A, "M", "岍"), + (0x2F87B, "M", "𡷤"), + (0x2F87C, "M", "嵃"), + (0x2F87D, "M", "𡷦"), + (0x2F87E, "M", "嵮"), + (0x2F87F, "M", "嵫"), + (0x2F880, "M", "嵼"), + (0x2F881, "M", "巡"), + (0x2F882, "M", "巢"), + (0x2F883, "M", "㠯"), + (0x2F884, "M", "巽"), + (0x2F885, "M", "帨"), + (0x2F886, "M", "帽"), + (0x2F887, "M", "幩"), + (0x2F888, "M", "㡢"), + (0x2F889, "M", "𢆃"), + (0x2F88A, "M", "㡼"), + (0x2F88B, "M", "庰"), + (0x2F88C, "M", "庳"), + (0x2F88D, "M", "庶"), + (0x2F88E, "M", "廊"), + (0x2F88F, "M", "𪎒"), + (0x2F890, "M", "廾"), + (0x2F891, "M", "𢌱"), + (0x2F893, "M", "舁"), + (0x2F894, "M", "弢"), + (0x2F896, "M", "㣇"), + (0x2F897, "M", "𣊸"), + (0x2F898, "M", "𦇚"), + (0x2F899, "M", "形"), + (0x2F89A, "M", "彫"), + (0x2F89B, "M", "㣣"), + (0x2F89C, "M", "徚"), + (0x2F89D, "M", "忍"), + (0x2F89E, "M", "志"), + (0x2F89F, "M", "忹"), + (0x2F8A0, "M", "悁"), + (0x2F8A1, "M", "㤺"), + (0x2F8A2, "M", "㤜"), + (0x2F8A3, "M", "悔"), + (0x2F8A4, "M", "𢛔"), + (0x2F8A5, "M", "惇"), + (0x2F8A6, "M", "慈"), + (0x2F8A7, "M", "慌"), + (0x2F8A8, "M", "慎"), + (0x2F8A9, "M", "慌"), + (0x2F8AA, "M", "慺"), + (0x2F8AB, "M", "憎"), + (0x2F8AC, "M", "憲"), + (0x2F8AD, "M", "憤"), + (0x2F8AE, "M", "憯"), + (0x2F8AF, "M", "懞"), + (0x2F8B0, "M", "懲"), + (0x2F8B1, "M", "懶"), + (0x2F8B2, "M", "成"), + (0x2F8B3, "M", "戛"), + (0x2F8B4, "M", "扝"), + (0x2F8B5, "M", "抱"), + (0x2F8B6, "M", "拔"), + (0x2F8B7, "M", "捐"), + (0x2F8B8, "M", "𢬌"), + (0x2F8B9, "M", "挽"), + (0x2F8BA, "M", "拼"), + (0x2F8BB, "M", "捨"), + (0x2F8BC, "M", "掃"), + (0x2F8BD, "M", "揤"), + (0x2F8BE, "M", "𢯱"), + (0x2F8BF, "M", "搢"), + (0x2F8C0, "M", "揅"), + (0x2F8C1, "M", "掩"), + (0x2F8C2, "M", "㨮"), + (0x2F8C3, "M", "摩"), + (0x2F8C4, "M", "摾"), + (0x2F8C5, "M", "撝"), + (0x2F8C6, "M", "摷"), + (0x2F8C7, "M", "㩬"), + (0x2F8C8, "M", "敏"), + (0x2F8C9, "M", "敬"), + (0x2F8CA, "M", "𣀊"), + (0x2F8CB, "M", "旣"), + (0x2F8CC, "M", "書"), + (0x2F8CD, "M", "晉"), + (0x2F8CE, "M", "㬙"), + (0x2F8CF, "M", "暑"), + (0x2F8D0, "M", "㬈"), + (0x2F8D1, "M", "㫤"), + (0x2F8D2, "M", "冒"), + (0x2F8D3, "M", "冕"), + (0x2F8D4, "M", "最"), + (0x2F8D5, "M", "暜"), + (0x2F8D6, "M", "肭"), + (0x2F8D7, "M", "䏙"), + (0x2F8D8, "M", "朗"), + (0x2F8D9, "M", "望"), + (0x2F8DA, "M", "朡"), + (0x2F8DB, "M", "杞"), + (0x2F8DC, "M", "杓"), + ] + + +def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F8DD, "M", "𣏃"), + (0x2F8DE, "M", "㭉"), + (0x2F8DF, "M", "柺"), + (0x2F8E0, "M", "枅"), + (0x2F8E1, "M", "桒"), + (0x2F8E2, "M", "梅"), + (0x2F8E3, "M", "𣑭"), + (0x2F8E4, "M", "梎"), + (0x2F8E5, "M", "栟"), + (0x2F8E6, "M", "椔"), + (0x2F8E7, "M", "㮝"), + (0x2F8E8, "M", "楂"), + (0x2F8E9, "M", "榣"), + (0x2F8EA, "M", "槪"), + (0x2F8EB, "M", "檨"), + (0x2F8EC, "M", "𣚣"), + (0x2F8ED, "M", "櫛"), + (0x2F8EE, "M", "㰘"), + (0x2F8EF, "M", "次"), + (0x2F8F0, "M", "𣢧"), + (0x2F8F1, "M", "歔"), + (0x2F8F2, "M", "㱎"), + (0x2F8F3, "M", "歲"), + (0x2F8F4, "M", "殟"), + (0x2F8F5, "M", "殺"), + (0x2F8F6, "M", "殻"), + (0x2F8F7, "M", "𣪍"), + (0x2F8F8, "M", "𡴋"), + (0x2F8F9, "M", "𣫺"), + (0x2F8FA, "M", "汎"), + (0x2F8FB, "M", "𣲼"), + (0x2F8FC, "M", "沿"), + (0x2F8FD, "M", "泍"), + (0x2F8FE, "M", "汧"), + (0x2F8FF, "M", "洖"), + (0x2F900, "M", "派"), + (0x2F901, "M", "海"), + (0x2F902, "M", "流"), + (0x2F903, "M", "浩"), + (0x2F904, "M", "浸"), + (0x2F905, "M", "涅"), + (0x2F906, "M", "𣴞"), + (0x2F907, "M", "洴"), + (0x2F908, "M", "港"), + (0x2F909, "M", "湮"), + (0x2F90A, "M", "㴳"), + (0x2F90B, "M", "滋"), + (0x2F90C, "M", "滇"), + (0x2F90D, "M", "𣻑"), + (0x2F90E, "M", "淹"), + (0x2F90F, "M", "潮"), + (0x2F910, "M", "𣽞"), + (0x2F911, "M", "𣾎"), + (0x2F912, "M", "濆"), + (0x2F913, "M", "瀹"), + (0x2F914, "M", "瀞"), + (0x2F915, "M", "瀛"), + (0x2F916, "M", "㶖"), + (0x2F917, "M", "灊"), + (0x2F918, "M", "災"), + (0x2F919, "M", "灷"), + (0x2F91A, "M", "炭"), + (0x2F91B, "M", "𠔥"), + (0x2F91C, "M", "煅"), + (0x2F91D, "M", "𤉣"), + (0x2F91E, "M", "熜"), + (0x2F91F, "M", "𤎫"), + (0x2F920, "M", "爨"), + (0x2F921, "M", "爵"), + (0x2F922, "M", "牐"), + (0x2F923, "M", "𤘈"), + (0x2F924, "M", "犀"), + (0x2F925, "M", "犕"), + (0x2F926, "M", "𤜵"), + (0x2F927, "M", "𤠔"), + (0x2F928, "M", "獺"), + (0x2F929, "M", "王"), + (0x2F92A, "M", "㺬"), + (0x2F92B, "M", "玥"), + (0x2F92C, "M", "㺸"), + (0x2F92E, "M", "瑇"), + (0x2F92F, "M", "瑜"), + (0x2F930, "M", "瑱"), + (0x2F931, "M", "璅"), + (0x2F932, "M", "瓊"), + (0x2F933, "M", "㼛"), + (0x2F934, "M", "甤"), + (0x2F935, "M", "𤰶"), + (0x2F936, "M", "甾"), + (0x2F937, "M", "𤲒"), + (0x2F938, "M", "異"), + (0x2F939, "M", "𢆟"), + (0x2F93A, "M", "瘐"), + (0x2F93B, "M", "𤾡"), + (0x2F93C, "M", "𤾸"), + (0x2F93D, "M", "𥁄"), + (0x2F93E, "M", "㿼"), + (0x2F93F, "M", "䀈"), + (0x2F940, "M", "直"), + (0x2F941, "M", "𥃳"), + ] + + +def _seg_81() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F942, "M", "𥃲"), + (0x2F943, "M", "𥄙"), + (0x2F944, "M", "𥄳"), + (0x2F945, "M", "眞"), + (0x2F946, "M", "真"), + (0x2F948, "M", "睊"), + (0x2F949, "M", "䀹"), + (0x2F94A, "M", "瞋"), + (0x2F94B, "M", "䁆"), + (0x2F94C, "M", "䂖"), + (0x2F94D, "M", "𥐝"), + (0x2F94E, "M", "硎"), + (0x2F94F, "M", "碌"), + (0x2F950, "M", "磌"), + (0x2F951, "M", "䃣"), + (0x2F952, "M", "𥘦"), + (0x2F953, "M", "祖"), + (0x2F954, "M", "𥚚"), + (0x2F955, "M", "𥛅"), + (0x2F956, "M", "福"), + (0x2F957, "M", "秫"), + (0x2F958, "M", "䄯"), + (0x2F959, "M", "穀"), + (0x2F95A, "M", "穊"), + (0x2F95B, "M", "穏"), + (0x2F95C, "M", "𥥼"), + (0x2F95D, "M", "𥪧"), + (0x2F95F, "M", "竮"), + (0x2F960, "M", "䈂"), + (0x2F961, "M", "𥮫"), + (0x2F962, "M", "篆"), + (0x2F963, "M", "築"), + (0x2F964, "M", "䈧"), + (0x2F965, "M", "𥲀"), + (0x2F966, "M", "糒"), + (0x2F967, "M", "䊠"), + (0x2F968, "M", "糨"), + (0x2F969, "M", "糣"), + (0x2F96A, "M", "紀"), + (0x2F96B, "M", "𥾆"), + (0x2F96C, "M", "絣"), + (0x2F96D, "M", "䌁"), + (0x2F96E, "M", "緇"), + (0x2F96F, "M", "縂"), + (0x2F970, "M", "繅"), + (0x2F971, "M", "䌴"), + (0x2F972, "M", "𦈨"), + (0x2F973, "M", "𦉇"), + (0x2F974, "M", "䍙"), + (0x2F975, "M", "𦋙"), + (0x2F976, "M", "罺"), + (0x2F977, "M", "𦌾"), + (0x2F978, "M", "羕"), + (0x2F979, "M", "翺"), + (0x2F97A, "M", "者"), + (0x2F97B, "M", "𦓚"), + (0x2F97C, "M", "𦔣"), + (0x2F97D, "M", "聠"), + (0x2F97E, "M", "𦖨"), + (0x2F97F, "M", "聰"), + (0x2F980, "M", "𣍟"), + (0x2F981, "M", "䏕"), + (0x2F982, "M", "育"), + (0x2F983, "M", "脃"), + (0x2F984, "M", "䐋"), + (0x2F985, "M", "脾"), + (0x2F986, "M", "媵"), + (0x2F987, "M", "𦞧"), + (0x2F988, "M", "𦞵"), + (0x2F989, "M", "𣎓"), + (0x2F98A, "M", "𣎜"), + (0x2F98B, "M", "舁"), + (0x2F98C, "M", "舄"), + (0x2F98D, "M", "辞"), + (0x2F98E, "M", "䑫"), + (0x2F98F, "M", "芑"), + (0x2F990, "M", "芋"), + (0x2F991, "M", "芝"), + (0x2F992, "M", "劳"), + (0x2F993, "M", "花"), + (0x2F994, "M", "芳"), + (0x2F995, "M", "芽"), + (0x2F996, "M", "苦"), + (0x2F997, "M", "𦬼"), + (0x2F998, "M", "若"), + (0x2F999, "M", "茝"), + (0x2F99A, "M", "荣"), + (0x2F99B, "M", "莭"), + (0x2F99C, "M", "茣"), + (0x2F99D, "M", "莽"), + (0x2F99E, "M", "菧"), + (0x2F99F, "M", "著"), + (0x2F9A0, "M", "荓"), + (0x2F9A1, "M", "菊"), + (0x2F9A2, "M", "菌"), + (0x2F9A3, "M", "菜"), + (0x2F9A4, "M", "𦰶"), + (0x2F9A5, "M", "𦵫"), + (0x2F9A6, "M", "𦳕"), + (0x2F9A7, "M", "䔫"), + ] + + +def _seg_82() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F9A8, "M", "蓱"), + (0x2F9A9, "M", "蓳"), + (0x2F9AA, "M", "蔖"), + (0x2F9AB, "M", "𧏊"), + (0x2F9AC, "M", "蕤"), + (0x2F9AD, "M", "𦼬"), + (0x2F9AE, "M", "䕝"), + (0x2F9AF, "M", "䕡"), + (0x2F9B0, "M", "𦾱"), + (0x2F9B1, "M", "𧃒"), + (0x2F9B2, "M", "䕫"), + (0x2F9B3, "M", "虐"), + (0x2F9B4, "M", "虜"), + (0x2F9B5, "M", "虧"), + (0x2F9B6, "M", "虩"), + (0x2F9B7, "M", "蚩"), + (0x2F9B8, "M", "蚈"), + (0x2F9B9, "M", "蜎"), + (0x2F9BA, "M", "蛢"), + (0x2F9BB, "M", "蝹"), + (0x2F9BC, "M", "蜨"), + (0x2F9BD, "M", "蝫"), + (0x2F9BE, "M", "螆"), + (0x2F9BF, "M", "䗗"), + (0x2F9C0, "M", "蟡"), + (0x2F9C1, "M", "蠁"), + (0x2F9C2, "M", "䗹"), + (0x2F9C3, "M", "衠"), + (0x2F9C4, "M", "衣"), + (0x2F9C5, "M", "𧙧"), + (0x2F9C6, "M", "裗"), + (0x2F9C7, "M", "裞"), + (0x2F9C8, "M", "䘵"), + (0x2F9C9, "M", "裺"), + (0x2F9CA, "M", "㒻"), + (0x2F9CB, "M", "𧢮"), + (0x2F9CC, "M", "𧥦"), + (0x2F9CD, "M", "䚾"), + (0x2F9CE, "M", "䛇"), + (0x2F9CF, "M", "誠"), + (0x2F9D0, "M", "諭"), + (0x2F9D1, "M", "變"), + (0x2F9D2, "M", "豕"), + (0x2F9D3, "M", "𧲨"), + (0x2F9D4, "M", "貫"), + (0x2F9D5, "M", "賁"), + (0x2F9D6, "M", "贛"), + (0x2F9D7, "M", "起"), + (0x2F9D8, "M", "𧼯"), + (0x2F9D9, "M", "𠠄"), + (0x2F9DA, "M", "跋"), + (0x2F9DB, "M", "趼"), + (0x2F9DC, "M", "跰"), + (0x2F9DD, "M", "𠣞"), + (0x2F9DE, "M", "軔"), + (0x2F9DF, "M", "輸"), + (0x2F9E0, "M", "𨗒"), + (0x2F9E1, "M", "𨗭"), + (0x2F9E2, "M", "邔"), + (0x2F9E3, "M", "郱"), + (0x2F9E4, "M", "鄑"), + (0x2F9E5, "M", "𨜮"), + (0x2F9E6, "M", "鄛"), + (0x2F9E7, "M", "鈸"), + (0x2F9E8, "M", "鋗"), + (0x2F9E9, "M", "鋘"), + (0x2F9EA, "M", "鉼"), + (0x2F9EB, "M", "鏹"), + (0x2F9EC, "M", "鐕"), + (0x2F9ED, "M", "𨯺"), + (0x2F9EE, "M", "開"), + (0x2F9EF, "M", "䦕"), + (0x2F9F0, "M", "閷"), + (0x2F9F1, "M", "𨵷"), + (0x2F9F2, "M", "䧦"), + (0x2F9F3, "M", "雃"), + (0x2F9F4, "M", "嶲"), + (0x2F9F5, "M", "霣"), + (0x2F9F6, "M", "𩅅"), + (0x2F9F7, "M", "𩈚"), + (0x2F9F8, "M", "䩮"), + (0x2F9F9, "M", "䩶"), + (0x2F9FA, "M", "韠"), + (0x2F9FB, "M", "𩐊"), + (0x2F9FC, "M", "䪲"), + (0x2F9FD, "M", "𩒖"), + (0x2F9FE, "M", "頋"), + (0x2FA00, "M", "頩"), + (0x2FA01, "M", "𩖶"), + (0x2FA02, "M", "飢"), + (0x2FA03, "M", "䬳"), + (0x2FA04, "M", "餩"), + (0x2FA05, "M", "馧"), + (0x2FA06, "M", "駂"), + (0x2FA07, "M", "駾"), + (0x2FA08, "M", "䯎"), + (0x2FA09, "M", "𩬰"), + (0x2FA0A, "M", "鬒"), + (0x2FA0B, "M", "鱀"), + (0x2FA0C, "M", "鳽"), + ] + + +def _seg_83() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2FA0D, "M", "䳎"), + (0x2FA0E, "M", "䳭"), + (0x2FA0F, "M", "鵧"), + (0x2FA10, "M", "𪃎"), + (0x2FA11, "M", "䳸"), + (0x2FA12, "M", "𪄅"), + (0x2FA13, "M", "𪈎"), + (0x2FA14, "M", "𪊑"), + (0x2FA15, "M", "麻"), + (0x2FA16, "M", "䵖"), + (0x2FA17, "M", "黹"), + (0x2FA18, "M", "黾"), + (0x2FA19, "M", "鼅"), + (0x2FA1A, "M", "鼏"), + (0x2FA1B, "M", "鼖"), + (0x2FA1C, "M", "鼻"), + (0x2FA1D, "M", "𪘀"), + (0x2FA1E, "X"), + (0x30000, "V"), + (0x3134B, "X"), + (0x31350, "V"), + (0x323B0, "X"), + (0xE0100, "I"), + (0xE01F0, "X"), + ] + + +uts46data = tuple( + _seg_0() + + _seg_1() + + _seg_2() + + _seg_3() + + _seg_4() + + _seg_5() + + _seg_6() + + _seg_7() + + _seg_8() + + _seg_9() + + _seg_10() + + _seg_11() + + _seg_12() + + _seg_13() + + _seg_14() + + _seg_15() + + _seg_16() + + _seg_17() + + _seg_18() + + _seg_19() + + _seg_20() + + _seg_21() + + _seg_22() + + _seg_23() + + _seg_24() + + _seg_25() + + _seg_26() + + _seg_27() + + _seg_28() + + _seg_29() + + _seg_30() + + _seg_31() + + _seg_32() + + _seg_33() + + _seg_34() + + _seg_35() + + _seg_36() + + _seg_37() + + _seg_38() + + _seg_39() + + _seg_40() + + _seg_41() + + _seg_42() + + _seg_43() + + _seg_44() + + _seg_45() + + _seg_46() + + _seg_47() + + _seg_48() + + _seg_49() + + _seg_50() + + _seg_51() + + _seg_52() + + _seg_53() + + _seg_54() + + _seg_55() + + _seg_56() + + _seg_57() + + _seg_58() + + _seg_59() + + _seg_60() + + _seg_61() + + _seg_62() + + _seg_63() + + _seg_64() + + _seg_65() + + _seg_66() + + _seg_67() + + _seg_68() + + _seg_69() + + _seg_70() + + _seg_71() + + _seg_72() + + _seg_73() + + _seg_74() + + _seg_75() + + _seg_76() + + _seg_77() + + _seg_78() + + _seg_79() + + _seg_80() + + _seg_81() + + _seg_82() + + _seg_83() +) # type: Tuple[Union[Tuple[int, str], Tuple[int, str, str]], ...] diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru-0.7.3.dist-info/INSTALLER b/search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru-0.7.3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru-0.7.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru-0.7.3.dist-info/METADATA b/search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru-0.7.3.dist-info/METADATA new file mode 100644 index 0000000..09505ab --- /dev/null +++ b/search_agent/search_agent/.venv/lib/python3.12/site-packages/loguru-0.7.3.dist-info/METADATA @@ -0,0 +1,462 @@ +Metadata-Version: 2.3 +Name: loguru +Version: 0.7.3 +Summary: Python logging made (stupidly) simple +Keywords: loguru,logging,logger,log +Author-email: Delgan +Requires-Python: >=3.5,<4.0 +Description-Content-Type: text/markdown +Classifier: Development Status :: 5 - Production/Stable +Classifier: Topic :: System :: Logging +Classifier: Intended Audience :: Developers +Classifier: Natural Language :: English +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Programming Language :: Python :: Implementation :: CPython +Requires-Dist: colorama>=0.3.4 ; sys_platform=='win32' +Requires-Dist: aiocontextvars>=0.2.0 ; python_version<'3.7' +Requires-Dist: win32-setctime>=1.0.0 ; sys_platform=='win32' +Requires-Dist: pre-commit==4.0.1 ; extra == "dev" and ( python_version>='3.9') +Requires-Dist: tox==3.27.1 ; extra == "dev" and ( python_version<'3.8') +Requires-Dist: tox==4.23.2 ; extra == "dev" and ( python_version>='3.8') +Requires-Dist: pytest==6.1.2 ; extra == "dev" and ( python_version<'3.8') +Requires-Dist: pytest==8.3.2 ; extra == "dev" and ( python_version>='3.8') +Requires-Dist: pytest-cov==2.12.1 ; extra == "dev" and ( python_version<'3.8') +Requires-Dist: pytest-cov==5.0.0 ; extra == "dev" and ( python_version>='3.8' and python_version<'3.9') +Requires-Dist: pytest-cov==6.0.0 ; extra == "dev" and ( python_version>='3.9') +Requires-Dist: pytest-mypy-plugins==1.9.3 ; extra == "dev" and ( python_version>='3.6' and python_version<'3.8') +Requires-Dist: pytest-mypy-plugins==3.1.0 ; extra == "dev" and ( python_version>='3.8') +Requires-Dist: colorama==0.4.5 ; extra == "dev" and ( python_version<'3.8') +Requires-Dist: colorama==0.4.6 ; extra == "dev" and ( python_version>='3.8') +Requires-Dist: freezegun==1.1.0 ; extra == "dev" and ( python_version<'3.8') +Requires-Dist: freezegun==1.5.0 ; extra == "dev" and ( python_version>='3.8') +Requires-Dist: exceptiongroup==1.1.3 ; extra == "dev" and ( python_version>='3.7' and python_version<'3.11') +Requires-Dist: mypy==v0.910 ; extra == "dev" and ( python_version<'3.6') +Requires-Dist: mypy==v0.971 ; extra == "dev" and ( python_version>='3.6' and python_version<'3.7') +Requires-Dist: mypy==v1.4.1 ; extra == "dev" and ( python_version>='3.7' and python_version<'3.8') +Requires-Dist: mypy==v1.13.0 ; extra == "dev" and ( python_version>='3.8') +Requires-Dist: Sphinx==8.1.3 ; extra == "dev" and ( python_version>='3.11') +Requires-Dist: sphinx-rtd-theme==3.0.2 ; extra == "dev" and ( python_version>='3.11') +Requires-Dist: myst-parser==4.0.0 ; extra == "dev" and ( python_version>='3.11') +Requires-Dist: build==1.2.2 ; extra == "dev" and ( python_version>='3.11') +Requires-Dist: twine==6.0.1 ; extra == "dev" and ( python_version>='3.11') +Project-URL: Changelog, https://github.com/Delgan/loguru/blob/master/CHANGELOG.rst +Project-URL: Documentation, https://loguru.readthedocs.io/en/stable/index.html +Project-URL: Homepage, https://github.com/Delgan/loguru +Provides-Extra: dev + +

    + + Loguru logo + + + +

    +

    + Pypi version + Python versions + Documentation + Build status + Coverage + Code quality + License +

    +

    + + Loguru logo + +

    + +______________________________________________________________________ + +**Loguru** is a library which aims to bring enjoyable logging in Python. + +Did you ever feel lazy about configuring a logger and used `print()` instead?... I did, yet logging is fundamental to every application and eases the process of debugging. Using **Loguru** you have no excuse not to use logging from the start, this is as simple as `from loguru import logger`. + +Also, this library is intended to make Python logging less painful by adding a bunch of useful functionalities that solve caveats of the standard loggers. Using logs in your application should be an automatism, **Loguru** tries to make it both pleasant and powerful. + + + +## Installation + +``` +pip install loguru +``` + +## Features + +- [Ready to use out of the box without boilerplate](#ready-to-use-out-of-the-box-without-boilerplate) +- [No Handler, no Formatter, no Filter: one function to rule them all](#no-handler-no-formatter-no-filter-one-function-to-rule-them-all) +- [Easier file logging with rotation / retention / compression](#easier-file-logging-with-rotation--retention--compression) +- [Modern string formatting using braces style](#modern-string-formatting-using-braces-style) +- [Exceptions catching within threads or main](#exceptions-catching-within-threads-or-main) +- [Pretty logging with colors](#pretty-logging-with-colors) +- [Asynchronous, Thread-safe, Multiprocess-safe](#asynchronous-thread-safe-multiprocess-safe) +- [Fully descriptive exceptions](#fully-descriptive-exceptions) +- [Structured logging as needed](#structured-logging-as-needed) +- [Lazy evaluation of expensive functions](#lazy-evaluation-of-expensive-functions) +- [Customizable levels](#customizable-levels) +- [Better datetime handling](#better-datetime-handling) +- [Suitable for scripts and libraries](#suitable-for-scripts-and-libraries) +- [Entirely compatible with standard logging](#entirely-compatible-with-standard-logging) +- [Personalizable defaults through environment variables](#personalizable-defaults-through-environment-variables) +- [Convenient parser](#convenient-parser) +- [Exhaustive notifier](#exhaustive-notifier) +- [10x faster than built-in logging](#10x-faster-than-built-in-logging) + +## Take the tour + +### Ready to use out of the box without boilerplate + +The main concept of Loguru is that **there is one and only one** [`logger`](https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger). + +For convenience, it is pre-configured and outputs to `stderr` to begin with (but that's entirely configurable). + +```python +from loguru import logger + +logger.debug("That's it, beautiful and simple logging!") +``` + +The [`logger`](https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger) is just an interface which dispatches log messages to configured handlers. Simple, right? + +### No Handler, no Formatter, no Filter: one function to rule them all + +How to add a handler? How to set up logs formatting? How to filter messages? How to set level? + +One answer: the [`add()`](https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger.add) function. + +```python +logger.add(sys.stderr, format="{time} {level} {message}", filter="my_module", level="INFO") +``` + +This function should be used to register [sinks](https://loguru.readthedocs.io/en/stable/api/logger.html#sink) which are responsible for managing [log messages](https://loguru.readthedocs.io/en/stable/api/logger.html#message) contextualized with a [record dict](https://loguru.readthedocs.io/en/stable/api/logger.html#record). A sink can take many forms: a simple function, a string path, a file-like object, a coroutine function or a built-in Handler. + +Note that you may also a previously added handler by using the identifier returned while adding it. This is particularly useful if you want to supersede the default `stderr` handler: just call [`logger.remove()`](https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger.remove) to make a fresh start. + +### Easier file logging with rotation / retention / compression + +If you want to send logged messages to a file, you just have to use a string path as the sink. It can be automatically timed too for convenience: + +```python +logger.add("file_{time}.log") +``` + +It is also [easily configurable](https://loguru.readthedocs.io/en/stable/api/logger.html#file) if you need rotating logger, if you want to remove older logs, or if you wish to compress your files at closure. + +```python +logger.add("file_1.log", rotation="500 MB") # Automatically rotate too big file +logger.add("file_2.log", rotation="12:00") # New file is created each day at noon +logger.add("file_3.log", rotation="1 week") # Once the file is too old, it's rotated + +logger.add("file_X.log", retention="10 days") # Cleanup after some time + +logger.add("file_Y.log", compression="zip") # Save some loved space +``` + +### Modern string formatting using braces style + +Loguru favors the much more elegant and powerful `{}` formatting over `%`, logging functions are actually equivalent to `str.format()`. + +```python +logger.info("If you're using Python {}, prefer {feature} of course!", 3.6, feature="f-strings") +``` + +### Exceptions catching within threads or main + +Have you ever seen your program crashing unexpectedly without seeing anything in the log file? Did you ever notice that exceptions occurring in threads were not logged? This can be solved using the [`catch()`](https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger.catch) decorator / context manager which ensures that any error is correctly propagated to the [`logger`](https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger). + +```python +@logger.catch +def my_function(x, y, z): + # An error? It's caught anyway! + return 1 / (x + y + z) +``` + +### Pretty logging with colors + +Loguru automatically adds colors to your logs if your terminal is compatible. You can define your favorite style by using [markup tags](https://loguru.readthedocs.io/en/stable/api/logger.html#color) in the sink format. + +```python +logger.add(sys.stdout, colorize=True, format="{time} {message}") +``` + +### Asynchronous, Thread-safe, Multiprocess-safe + +All sinks added to the [`logger`](https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger) are thread-safe by default. They are not multiprocess-safe, but you can `enqueue` the messages to ensure logs integrity. This same argument can also be used if you want async logging. + +```python +logger.add("somefile.log", enqueue=True) +``` + +Coroutine functions used as sinks are also supported and should be awaited with [`complete()`](https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger.complete). + +### Fully descriptive exceptions + +Logging exceptions that occur in your code is important to track bugs, but it's quite useless if you don't know why it failed. Loguru helps you identify problems by allowing the entire stack trace to be displayed, including values of variables (thanks [`better_exceptions`](https://github.com/Qix-/better-exceptions) for this!). + +The code: + +```python +# Caution, "diagnose=True" is the default and may leak sensitive data in prod +logger.add("out.log", backtrace=True, diagnose=True) + +def func(a, b): + return a / b + +def nested(c): + try: + func(5, c) + except ZeroDivisionError: + logger.exception("What?!") + +nested(0) +``` + +Would result in: + +```none +2018-07-17 01:38:43.975 | ERROR | __main__:nested:10 - What?! +Traceback (most recent call last): + + File "test.py", line 12, in + nested(0) + └ + +> File "test.py", line 8, in nested + func(5, c) + │ └ 0 + └ + + File "test.py", line 4, in func + return a / b + │ └ 0 + └ 5 + +ZeroDivisionError: division by zero +``` + +Note that this feature won't work on default Python REPL due to unavailable frame data. + +See also: [Security considerations when using Loguru](https://loguru.readthedocs.io/en/stable/resources/recipes.html#security-considerations-when-using-loguru). + +### Structured logging as needed + +Want your logs to be serialized for easier parsing or to pass them around? Using the `serialize` argument, each log message will be converted to a JSON string before being sent to the configured sink. + +```python +logger.add(custom_sink_function, serialize=True) +``` + +Using [`bind()`](https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger.bind) you can contextualize your logger messages by modifying the `extra` record attribute. + +```python +logger.add("file.log", format="{extra[ip]} {extra[user]} {message}") +context_logger = logger.bind(ip="192.168.0.1", user="someone") +context_logger.info("Contextualize your logger easily") +context_logger.bind(user="someone_else").info("Inline binding of extra attribute") +context_logger.info("Use kwargs to add context during formatting: {user}", user="anybody") +``` + +It is possible to modify a context-local state temporarily with [`contextualize()`](https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger.contextualize): + +```python +with logger.contextualize(task=task_id): + do_something() + logger.info("End of task") +``` + +You can also have more fine-grained control over your logs by combining [`bind()`](https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger.bind) and `filter`: + +```python +logger.add("special.log", filter=lambda record: "special" in record["extra"]) +logger.debug("This message is not logged to the file") +logger.bind(special=True).info("This message, though, is logged to the file!") +``` + +Finally, the [`patch()`](https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger.patch) method allows dynamic values to be attached to the record dict of each new message: + +```python +logger.add(sys.stderr, format="{extra[utc]} {message}") +logger = logger.patch(lambda record: record["extra"].update(utc=datetime.utcnow())) +``` + +### Lazy evaluation of expensive functions + +Sometime you would like to log verbose information without performance penalty in production, you can use the [`opt()`](https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger.opt) method to achieve this. + +```python +logger.opt(lazy=True).debug("If sink level <= DEBUG: {x}", x=lambda: expensive_function(2**64)) + +# By the way, "opt()" serves many usages +logger.opt(exception=True).info("Error stacktrace added to the log message (tuple accepted too)") +logger.opt(colors=True).info("Per message colors") +logger.opt(record=True).info("Display values from the record (eg. {record[thread]})") +logger.opt(raw=True).info("Bypass sink formatting\n") +logger.opt(depth=1).info("Use parent stack context (useful within wrapped functions)") +logger.opt(capture=False).info("Keyword arguments not added to {dest} dict", dest="extra") +``` + +### Customizable levels + +Loguru comes with all standard [logging levels](https://loguru.readthedocs.io/en/stable/api/logger.html#levels) to which [`trace()`](https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger.trace) and [`success()`](https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger.success) are added. Do you need more? Then, just create it by using the [`level()`](https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger.level) function. + +```python +new_level = logger.level("SNAKY", no=38, color="", icon="🐍") + +logger.log("SNAKY", "Here we go!") +``` + +### Better datetime handling + +The standard logging is bloated with arguments like `datefmt` or `msecs`, `%(asctime)s` and `%(created)s`, naive datetimes without timezone information, not intuitive formatting, etc. Loguru [fixes it](https://loguru.readthedocs.io/en/stable/api/logger.html#time): + +```python +logger.add("file.log", format="{time:YYYY-MM-DD at HH:mm:ss} | {level} | {message}") +``` + +### Suitable for scripts and libraries + +Using the logger in your scripts is easy, and you can [`configure()`](https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger.configure) it at start. To use Loguru from inside a library, remember to never call [`add()`](https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger.add) but use [`disable()`](https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger.disable) instead so logging functions become no-op. If a developer wishes to see your library's logs, they can [`enable()`](https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger.enable) it again. + +```python +# For scripts +config = { + "handlers": [ + {"sink": sys.stdout, "format": "{time} - {message}"}, + {"sink": "file.log", "serialize": True}, + ], + "extra": {"user": "someone"} +} +logger.configure(**config) + +# For libraries, should be your library's `__name__` +logger.disable("my_library") +logger.info("No matter added sinks, this message is not displayed") + +# In your application, enable the logger in the library +logger.enable("my_library") +logger.info("This message however is propagated to the sinks") +``` + +For additional convenience, you can also use the [`loguru-config`](https://github.com/erezinman/loguru-config) library to setup the `logger` directly from a configuration file. + +### Entirely compatible with standard logging + +Wish to use built-in logging `Handler` as a Loguru sink? + +```python +handler = logging.handlers.SysLogHandler(address=('localhost', 514)) +logger.add(handler) +``` + +Need to propagate Loguru messages to standard `logging`? + +```python +class PropagateHandler(logging.Handler): + def emit(self, record: logging.LogRecord) -> None: + logging.getLogger(record.name).handle(record) + +logger.add(PropagateHandler(), format="{message}") +``` + +Want to intercept standard `logging` messages toward your Loguru sinks? + +```python +class InterceptHandler(logging.Handler): + def emit(self, record: logging.LogRecord) -> None: + # Get corresponding Loguru level if it exists. + level: str | int + try: + level = logger.level(record.levelname).name + except ValueError: + level = record.levelno + + # Find caller from where originated the logged message. + frame, depth = inspect.currentframe(), 0 + while frame and (depth == 0 or frame.f_code.co_filename == logging.__file__): + frame = frame.f_back + depth += 1 + + logger.opt(depth=depth, exception=record.exc_info).log(level, record.getMessage()) + +logging.basicConfig(handlers=[InterceptHandler()], level=0, force=True) +``` + +### Personalizable defaults through environment variables + +Don't like the default logger formatting? Would prefer another `DEBUG` color? [No problem](https://loguru.readthedocs.io/en/stable/api/logger.html#env): + +```bash +# Linux / OSX +export LOGURU_FORMAT="{time} | {message}" + +# Windows +setx LOGURU_DEBUG_COLOR "" +``` + +### Convenient parser + +It is often useful to extract specific information from generated logs, this is why Loguru provides a [`parse()`](https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger.parse) method which helps to deal with logs and regexes. + +```python +pattern = r"(?P

    +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