From 9d4ca0714ab7dd4913068907bdff06bcd77b510b Mon Sep 17 00:00:00 2001 From: ahnaf-talukder <81837075+AhnafTalukder@users.noreply.github.com> Date: Tue, 12 Mar 2024 14:14:03 -0400 Subject: [PATCH 1/3] Delete .venv directory --- .../site-packages/_distutils_hack/__init__.py | 222 - .../__pycache__/__init__.cpython-311.pyc | Bin 11178 -> 0 bytes .../__pycache__/override.cpython-311.pyc | Bin 335 -> 0 bytes .../site-packages/_distutils_hack/override.py | 1 - .../aiohttp-3.9.3.dist-info/INSTALLER | 1 - .../aiohttp-3.9.3.dist-info/LICENSE.txt | 13 - .../aiohttp-3.9.3.dist-info/METADATA | 243 - .../aiohttp-3.9.3.dist-info/RECORD | 119 - .../aiohttp-3.9.3.dist-info/WHEEL | 5 - .../aiohttp-3.9.3.dist-info/top_level.txt | 1 - .../aiohttp/.hash/_cparser.pxd.hash | 1 - .../aiohttp/.hash/_find_header.pxd.hash | 1 - .../aiohttp/.hash/_helpers.pyi.hash | 1 - .../aiohttp/.hash/_helpers.pyx.hash | 1 - .../aiohttp/.hash/_http_parser.pyx.hash | 1 - .../aiohttp/.hash/_http_writer.pyx.hash | 1 - .../aiohttp/.hash/_websocket.pyx.hash | 1 - .../site-packages/aiohttp/.hash/hdrs.py.hash | 1 - .venv/Lib/site-packages/aiohttp/__init__.py | 240 - .../__pycache__/__init__.cpython-311.pyc | Bin 5644 -> 0 bytes .../aiohttp/__pycache__/abc.cpython-311.pyc | Bin 11605 -> 0 bytes .../__pycache__/base_protocol.cpython-311.pyc | Bin 4543 -> 0 bytes .../__pycache__/client.cpython-311.pyc | Bin 52600 -> 0 bytes .../client_exceptions.cpython-311.pyc | Bin 16579 -> 0 bytes .../__pycache__/client_proto.cpython-311.pyc | Bin 11780 -> 0 bytes .../__pycache__/client_reqrep.cpython-311.pyc | Bin 57388 -> 0 bytes .../__pycache__/client_ws.cpython-311.pyc | Bin 17615 -> 0 bytes .../compression_utils.cpython-311.pyc | Bin 9137 -> 0 bytes .../__pycache__/connector.cpython-311.pyc | Bin 65861 -> 0 bytes .../__pycache__/cookiejar.cpython-311.pyc | Bin 20245 -> 0 bytes .../__pycache__/formdata.cpython-311.pyc | Bin 8060 -> 0 bytes .../aiohttp/__pycache__/hdrs.cpython-311.pyc | Bin 9627 -> 0 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 50471 -> 0 bytes .../aiohttp/__pycache__/http.cpython-311.pyc | Bin 2129 -> 0 bytes .../http_exceptions.cpython-311.pyc | Bin 6753 -> 0 bytes .../__pycache__/http_parser.cpython-311.pyc | Bin 37707 -> 0 bytes .../http_websocket.cpython-311.pyc | Bin 29927 -> 0 bytes .../__pycache__/http_writer.cpython-311.pyc | Bin 9473 -> 0 bytes .../aiohttp/__pycache__/locks.cpython-311.pyc | Bin 2605 -> 0 bytes .../aiohttp/__pycache__/log.cpython-311.pyc | Bin 721 -> 0 bytes .../__pycache__/multipart.cpython-311.pyc | Bin 48979 -> 0 bytes .../__pycache__/payload.cpython-311.pyc | Bin 24230 -> 0 bytes .../payload_streamer.cpython-311.pyc | Bin 4719 -> 0 bytes .../__pycache__/pytest_plugin.cpython-311.pyc | Bin 17789 -> 0 bytes .../__pycache__/resolver.cpython-311.pyc | Bin 6832 -> 0 bytes .../__pycache__/streams.cpython-311.pyc | Bin 31611 -> 0 bytes .../__pycache__/tcp_helpers.cpython-311.pyc | Bin 2024 -> 0 bytes .../__pycache__/test_utils.cpython-311.pyc | Bin 34323 -> 0 bytes .../__pycache__/tracing.cpython-311.pyc | Bin 24287 -> 0 bytes .../__pycache__/typedefs.cpython-311.pyc | Bin 2140 -> 0 bytes .../aiohttp/__pycache__/web.cpython-311.pyc | Bin 19979 -> 0 bytes .../__pycache__/web_app.cpython-311.pyc | Bin 28762 -> 0 bytes .../web_exceptions.cpython-311.pyc | Bin 18199 -> 0 bytes .../web_fileresponse.cpython-311.pyc | Bin 12897 -> 0 bytes .../__pycache__/web_log.cpython-311.pyc | Bin 11424 -> 0 bytes .../web_middlewares.cpython-311.pyc | Bin 6100 -> 0 bytes .../__pycache__/web_protocol.cpython-311.pyc | Bin 31082 -> 0 bytes .../__pycache__/web_request.cpython-311.pyc | Bin 40370 -> 0 bytes .../__pycache__/web_response.cpython-311.pyc | Bin 38974 -> 0 bytes .../__pycache__/web_routedef.cpython-311.pyc | Bin 12894 -> 0 bytes .../__pycache__/web_runner.cpython-311.pyc | Bin 20823 -> 0 bytes .../__pycache__/web_server.cpython-311.pyc | Bin 5049 -> 0 bytes .../web_urldispatcher.cpython-311.pyc | Bin 72643 -> 0 bytes .../__pycache__/web_ws.cpython-311.pyc | Bin 27629 -> 0 bytes .../__pycache__/worker.cpython-311.pyc | Bin 12230 -> 0 bytes .venv/Lib/site-packages/aiohttp/_cparser.pxd | 158 - .../site-packages/aiohttp/_find_header.pxd | 2 - .venv/Lib/site-packages/aiohttp/_headers.pxi | 83 - .../aiohttp/_helpers.cp311-win_amd64.pyd | Bin 54272 -> 0 bytes .venv/Lib/site-packages/aiohttp/_helpers.pyi | 6 - .venv/Lib/site-packages/aiohttp/_helpers.pyx | 35 - .../aiohttp/_http_parser.cp311-win_amd64.pyd | Bin 255488 -> 0 bytes .../site-packages/aiohttp/_http_parser.pyx | 836 -- .../aiohttp/_http_writer.cp311-win_amd64.pyd | Bin 49152 -> 0 bytes .../site-packages/aiohttp/_http_writer.pyx | 163 - .../aiohttp/_websocket.cp311-win_amd64.pyd | Bin 36352 -> 0 bytes .../Lib/site-packages/aiohttp/_websocket.pyx | 56 - .venv/Lib/site-packages/aiohttp/abc.py | 209 - .../site-packages/aiohttp/base_protocol.py | 90 - .venv/Lib/site-packages/aiohttp/client.py | 1363 --- .../aiohttp/client_exceptions.py | 346 - .../Lib/site-packages/aiohttp/client_proto.py | 264 - .../site-packages/aiohttp/client_reqrep.py | 1197 --- .venv/Lib/site-packages/aiohttp/client_ws.py | 315 - .../aiohttp/compression_utils.py | 157 - .venv/Lib/site-packages/aiohttp/connector.py | 1489 --- .venv/Lib/site-packages/aiohttp/cookiejar.py | 419 - .venv/Lib/site-packages/aiohttp/formdata.py | 172 - .venv/Lib/site-packages/aiohttp/hdrs.py | 108 - .venv/Lib/site-packages/aiohttp/helpers.py | 999 -- .venv/Lib/site-packages/aiohttp/http.py | 72 - .../site-packages/aiohttp/http_exceptions.py | 106 - .../Lib/site-packages/aiohttp/http_parser.py | 1013 -- .../site-packages/aiohttp/http_websocket.py | 740 -- .../Lib/site-packages/aiohttp/http_writer.py | 198 - .venv/Lib/site-packages/aiohttp/locks.py | 41 - .venv/Lib/site-packages/aiohttp/log.py | 8 - .venv/Lib/site-packages/aiohttp/multipart.py | 969 -- .venv/Lib/site-packages/aiohttp/payload.py | 463 - .../site-packages/aiohttp/payload_streamer.py | 75 - .venv/Lib/site-packages/aiohttp/py.typed | 1 - .../site-packages/aiohttp/pytest_plugin.py | 381 - .venv/Lib/site-packages/aiohttp/resolver.py | 160 - .venv/Lib/site-packages/aiohttp/streams.py | 666 -- .../Lib/site-packages/aiohttp/tcp_helpers.py | 37 - .venv/Lib/site-packages/aiohttp/test_utils.py | 675 -- .venv/Lib/site-packages/aiohttp/tracing.py | 471 - .venv/Lib/site-packages/aiohttp/typedefs.py | 54 - .venv/Lib/site-packages/aiohttp/web.py | 616 -- .venv/Lib/site-packages/aiohttp/web_app.py | 596 -- .../site-packages/aiohttp/web_exceptions.py | 452 - .../site-packages/aiohttp/web_fileresponse.py | 301 - .venv/Lib/site-packages/aiohttp/web_log.py | 213 - .../site-packages/aiohttp/web_middlewares.py | 116 - .../Lib/site-packages/aiohttp/web_protocol.py | 698 -- .../Lib/site-packages/aiohttp/web_request.py | 898 -- .../Lib/site-packages/aiohttp/web_response.py | 817 -- .../Lib/site-packages/aiohttp/web_routedef.py | 216 - .venv/Lib/site-packages/aiohttp/web_runner.py | 406 - .venv/Lib/site-packages/aiohttp/web_server.py | 77 - .../aiohttp/web_urldispatcher.py | 1232 --- .venv/Lib/site-packages/aiohttp/web_ws.py | 529 - .venv/Lib/site-packages/aiohttp/worker.py | 247 - .../aiosignal-1.3.1.dist-info/INSTALLER | 1 - .../aiosignal-1.3.1.dist-info/LICENSE | 201 - .../aiosignal-1.3.1.dist-info/METADATA | 128 - .../aiosignal-1.3.1.dist-info/RECORD | 10 - .../aiosignal-1.3.1.dist-info/WHEEL | 5 - .../aiosignal-1.3.1.dist-info/top_level.txt | 1 - .venv/Lib/site-packages/aiosignal/__init__.py | 36 - .../Lib/site-packages/aiosignal/__init__.pyi | 12 - .../__pycache__/__init__.cpython-311.pyc | Bin 1875 -> 0 bytes .venv/Lib/site-packages/aiosignal/py.typed | 0 .venv/Lib/site-packages/attr/__init__.py | 134 - .venv/Lib/site-packages/attr/__init__.pyi | 555 -- .../attr/__pycache__/__init__.cpython-311.pyc | Bin 4376 -> 0 bytes .../attr/__pycache__/_cmp.cpython-311.pyc | Bin 5307 -> 0 bytes .../attr/__pycache__/_compat.cpython-311.pyc | Bin 3315 -> 0 bytes .../attr/__pycache__/_config.cpython-311.pyc | Bin 1191 -> 0 bytes .../attr/__pycache__/_funcs.cpython-311.pyc | Bin 17028 -> 0 bytes .../attr/__pycache__/_make.cpython-311.pyc | Bin 110920 -> 0 bytes .../__pycache__/_next_gen.cpython-311.pyc | Bin 6729 -> 0 bytes .../__pycache__/_version_info.cpython-311.pyc | Bin 3631 -> 0 bytes .../__pycache__/converters.cpython-311.pyc | Bin 4684 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 4173 -> 0 bytes .../attr/__pycache__/filters.cpython-311.pyc | Bin 2872 -> 0 bytes .../attr/__pycache__/setters.cpython-311.pyc | Bin 1937 -> 0 bytes .../__pycache__/validators.cpython-311.pyc | Bin 27904 -> 0 bytes .venv/Lib/site-packages/attr/_cmp.py | 150 - .venv/Lib/site-packages/attr/_cmp.pyi | 13 - .venv/Lib/site-packages/attr/_compat.py | 87 - .venv/Lib/site-packages/attr/_config.py | 31 - .venv/Lib/site-packages/attr/_funcs.py | 483 - .venv/Lib/site-packages/attr/_make.py | 3119 ------ .venv/Lib/site-packages/attr/_next_gen.py | 229 - .../Lib/site-packages/attr/_typing_compat.pyi | 15 - .venv/Lib/site-packages/attr/_version_info.py | 86 - .../Lib/site-packages/attr/_version_info.pyi | 9 - .venv/Lib/site-packages/attr/converters.py | 144 - .venv/Lib/site-packages/attr/converters.pyi | 13 - .venv/Lib/site-packages/attr/exceptions.py | 95 - .venv/Lib/site-packages/attr/exceptions.pyi | 17 - .venv/Lib/site-packages/attr/filters.py | 66 - .venv/Lib/site-packages/attr/filters.pyi | 6 - .venv/Lib/site-packages/attr/py.typed | 0 .venv/Lib/site-packages/attr/setters.py | 73 - .venv/Lib/site-packages/attr/setters.pyi | 19 - .venv/Lib/site-packages/attr/validators.py | 681 -- .venv/Lib/site-packages/attr/validators.pyi | 88 - .../attrs-23.2.0.dist-info/INSTALLER | 1 - .../attrs-23.2.0.dist-info/METADATA | 202 - .../attrs-23.2.0.dist-info/RECORD | 55 - .../attrs-23.2.0.dist-info/WHEEL | 4 - .../attrs-23.2.0.dist-info/licenses/LICENSE | 21 - .venv/Lib/site-packages/attrs/__init__.py | 65 - .venv/Lib/site-packages/attrs/__init__.pyi | 67 - .../__pycache__/__init__.cpython-311.pyc | Bin 1349 -> 0 bytes .../__pycache__/converters.cpython-311.pyc | Bin 247 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 247 -> 0 bytes .../attrs/__pycache__/filters.cpython-311.pyc | Bin 241 -> 0 bytes .../attrs/__pycache__/setters.cpython-311.pyc | Bin 241 -> 0 bytes .../__pycache__/validators.cpython-311.pyc | Bin 247 -> 0 bytes .venv/Lib/site-packages/attrs/converters.py | 3 - .venv/Lib/site-packages/attrs/exceptions.py | 3 - .venv/Lib/site-packages/attrs/filters.py | 3 - .venv/Lib/site-packages/attrs/py.typed | 0 .venv/Lib/site-packages/attrs/setters.py | 3 - .venv/Lib/site-packages/attrs/validators.py | 3 - .../discord.py-2.3.2.dist-info/INSTALLER | 1 - .../discord.py-2.3.2.dist-info/LICENSE | 21 - .../discord.py-2.3.2.dist-info/METADATA | 166 - .../discord.py-2.3.2.dist-info/RECORD | 244 - .../discord.py-2.3.2.dist-info/REQUESTED | 0 .../discord.py-2.3.2.dist-info/WHEEL | 5 - .../discord.py-2.3.2.dist-info/top_level.txt | 1 - .venv/Lib/site-packages/discord/__init__.py | 85 - .venv/Lib/site-packages/discord/__main__.py | 351 - .../__pycache__/__init__.cpython-311.pyc | Bin 2999 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 16694 -> 0 bytes .../__pycache__/_types.cpython-311.pyc | Bin 1757 -> 0 bytes .../discord/__pycache__/abc.cpython-311.pyc | Bin 82570 -> 0 bytes .../__pycache__/activity.cpython-311.pyc | Bin 37512 -> 0 bytes .../__pycache__/appinfo.cpython-311.pyc | Bin 15218 -> 0 bytes .../discord/__pycache__/asset.cpython-311.pyc | Bin 21672 -> 0 bytes .../__pycache__/audit_logs.cpython-311.pyc | Bin 48036 -> 0 bytes .../__pycache__/automod.cpython-311.pyc | Bin 31602 -> 0 bytes .../__pycache__/backoff.cpython-311.pyc | Bin 5263 -> 0 bytes .../__pycache__/channel.cpython-311.pyc | Bin 146846 -> 0 bytes .../__pycache__/client.cpython-311.pyc | Bin 104580 -> 0 bytes .../__pycache__/colour.cpython-311.pyc | Bin 22064 -> 0 bytes .../__pycache__/components.cpython-311.pyc | Bin 23210 -> 0 bytes .../context_managers.cpython-311.pyc | Bin 5396 -> 0 bytes .../__pycache__/embeds.cpython-311.pyc | Bin 29858 -> 0 bytes .../discord/__pycache__/emoji.cpython-311.pyc | Bin 12767 -> 0 bytes .../discord/__pycache__/enums.cpython-311.pyc | Bin 34085 -> 0 bytes .../__pycache__/errors.cpython-311.pyc | Bin 13532 -> 0 bytes .../discord/__pycache__/file.cpython-311.pyc | Bin 6826 -> 0 bytes .../discord/__pycache__/flags.cpython-311.pyc | Bin 72900 -> 0 bytes .../__pycache__/gateway.cpython-311.pyc | Bin 51644 -> 0 bytes .../discord/__pycache__/guild.cpython-311.pyc | Bin 181515 -> 0 bytes .../discord/__pycache__/http.cpython-311.pyc | Bin 110847 -> 0 bytes .../__pycache__/integrations.cpython-311.pyc | Bin 17529 -> 0 bytes .../__pycache__/interactions.cpython-311.pyc | Bin 53109 -> 0 bytes .../__pycache__/invite.cpython-311.pyc | Bin 25208 -> 0 bytes .../__pycache__/member.cpython-311.pyc | Bin 54695 -> 0 bytes .../__pycache__/mentions.cpython-311.pyc | Bin 7555 -> 0 bytes .../__pycache__/message.cpython-311.pyc | Bin 106218 -> 0 bytes .../__pycache__/mixins.cpython-311.pyc | Bin 2439 -> 0 bytes .../__pycache__/object.cpython-311.pyc | Bin 5137 -> 0 bytes .../__pycache__/oggparse.cpython-311.pyc | Bin 5889 -> 0 bytes .../discord/__pycache__/opus.cpython-311.pyc | Bin 23902 -> 0 bytes .../__pycache__/partial_emoji.cpython-311.pyc | Bin 11771 -> 0 bytes .../__pycache__/permissions.cpython-311.pyc | Bin 39480 -> 0 bytes .../__pycache__/player.cpython-311.pyc | Bin 38773 -> 0 bytes .../__pycache__/raw_models.cpython-311.pyc | Bin 23144 -> 0 bytes .../__pycache__/reaction.cpython-311.pyc | Bin 10925 -> 0 bytes .../discord/__pycache__/role.cpython-311.pyc | Bin 23831 -> 0 bytes .../scheduled_event.cpython-311.pyc | Bin 28086 -> 0 bytes .../discord/__pycache__/shard.cpython-311.pyc | Bin 32768 -> 0 bytes .../stage_instance.cpython-311.pyc | Bin 8290 -> 0 bytes .../discord/__pycache__/state.cpython-311.pyc | Bin 110132 -> 0 bytes .../__pycache__/sticker.cpython-311.pyc | Bin 23160 -> 0 bytes .../discord/__pycache__/team.cpython-311.pyc | Bin 7052 -> 0 bytes .../__pycache__/template.cpython-311.pyc | Bin 13718 -> 0 bytes .../__pycache__/threads.cpython-311.pyc | Bin 41821 -> 0 bytes .../discord/__pycache__/user.cpython-311.pyc | Bin 23343 -> 0 bytes .../discord/__pycache__/utils.cpython-311.pyc | Bin 63387 -> 0 bytes .../__pycache__/voice_client.cpython-311.pyc | Bin 35903 -> 0 bytes .../welcome_screen.cpython-311.pyc | Bin 9983 -> 0 bytes .../__pycache__/widget.cpython-311.pyc | Bin 14384 -> 0 bytes .venv/Lib/site-packages/discord/_types.py | 34 - .venv/Lib/site-packages/discord/abc.py | 1915 ---- .venv/Lib/site-packages/discord/activity.py | 842 -- .../discord/app_commands/__init__.py | 20 - .../__pycache__/__init__.cpython-311.pyc | Bin 728 -> 0 bytes .../__pycache__/checks.cpython-311.pyc | Bin 23596 -> 0 bytes .../__pycache__/commands.cpython-311.pyc | Bin 107775 -> 0 bytes .../__pycache__/errors.cpython-311.pyc | Bin 28547 -> 0 bytes .../__pycache__/models.cpython-311.pyc | Bin 51946 -> 0 bytes .../__pycache__/namespace.cpython-311.pyc | Bin 16011 -> 0 bytes .../__pycache__/transformers.cpython-311.pyc | Bin 45958 -> 0 bytes .../__pycache__/translator.cpython-311.pyc | Bin 13953 -> 0 bytes .../__pycache__/tree.cpython-311.pyc | Bin 56286 -> 0 bytes .../discord/app_commands/checks.py | 537 - .../discord/app_commands/commands.py | 2479 ----- .../discord/app_commands/errors.py | 537 - .../discord/app_commands/models.py | 1091 --- .../discord/app_commands/namespace.py | 263 - .../discord/app_commands/transformers.py | 877 -- .../discord/app_commands/translator.py | 305 - .../discord/app_commands/tree.py | 1255 --- .venv/Lib/site-packages/discord/appinfo.py | 362 - .venv/Lib/site-packages/discord/asset.py | 516 - .venv/Lib/site-packages/discord/audit_logs.py | 865 -- .venv/Lib/site-packages/discord/automod.py | 600 -- .venv/Lib/site-packages/discord/backoff.py | 108 - .../discord/bin/libopus-0.x64.dll | Bin 441856 -> 0 bytes .../discord/bin/libopus-0.x86.dll | Bin 366080 -> 0 bytes .venv/Lib/site-packages/discord/channel.py | 3332 ------- .venv/Lib/site-packages/discord/client.py | 2724 ------ .venv/Lib/site-packages/discord/colour.py | 523 - .venv/Lib/site-packages/discord/components.py | 533 - .../site-packages/discord/context_managers.py | 92 - .venv/Lib/site-packages/discord/embeds.py | 757 -- .venv/Lib/site-packages/discord/emoji.py | 257 - .venv/Lib/site-packages/discord/enums.py | 776 -- .venv/Lib/site-packages/discord/errors.py | 280 - .../discord/ext/commands/__init__.py | 21 - .../__pycache__/__init__.cpython-311.pyc | Bin 743 -> 0 bytes .../__pycache__/_types.cpython-311.pyc | Bin 3928 -> 0 bytes .../commands/__pycache__/bot.cpython-311.pyc | Bin 64002 -> 0 bytes .../commands/__pycache__/cog.cpython-311.pyc | Bin 35735 -> 0 bytes .../__pycache__/context.cpython-311.pyc | Bin 43389 -> 0 bytes .../__pycache__/converter.cpython-311.pyc | Bin 63896 -> 0 bytes .../__pycache__/cooldowns.cpython-311.pyc | Bin 16131 -> 0 bytes .../commands/__pycache__/core.cpython-311.pyc | Bin 113736 -> 0 bytes .../__pycache__/errors.cpython-311.pyc | Bin 59595 -> 0 bytes .../__pycache__/flags.cpython-311.pyc | Bin 28895 -> 0 bytes .../commands/__pycache__/help.cpython-311.pyc | Bin 76188 -> 0 bytes .../__pycache__/hybrid.cpython-311.pyc | Bin 46746 -> 0 bytes .../__pycache__/parameters.cpython-311.pyc | Bin 11511 -> 0 bytes .../commands/__pycache__/view.cpython-311.pyc | Bin 8444 -> 0 bytes .../discord/ext/commands/_types.py | 73 - .../site-packages/discord/ext/commands/bot.py | 1500 --- .../site-packages/discord/ext/commands/cog.py | 787 -- .../discord/ext/commands/context.py | 1065 -- .../discord/ext/commands/converter.py | 1355 --- .../discord/ext/commands/cooldowns.py | 285 - .../discord/ext/commands/core.py | 2640 ----- .../discord/ext/commands/errors.py | 1231 --- .../discord/ext/commands/flags.py | 633 -- .../discord/ext/commands/help.py | 1579 --- .../discord/ext/commands/hybrid.py | 928 -- .../discord/ext/commands/parameters.py | 314 - .../discord/ext/commands/view.py | 196 - .../discord/ext/tasks/__init__.py | 826 -- .../__pycache__/__init__.cpython-311.pyc | Bin 38346 -> 0 bytes .venv/Lib/site-packages/discord/file.py | 159 - .venv/Lib/site-packages/discord/flags.py | 1812 ---- .venv/Lib/site-packages/discord/gateway.py | 1018 -- .venv/Lib/site-packages/discord/guild.py | 4279 -------- .venv/Lib/site-packages/discord/http.py | 2407 ----- .../Lib/site-packages/discord/integrations.py | 417 - .../Lib/site-packages/discord/interactions.py | 1232 --- .venv/Lib/site-packages/discord/invite.py | 564 -- .venv/Lib/site-packages/discord/member.py | 1127 --- .venv/Lib/site-packages/discord/mentions.py | 153 - .venv/Lib/site-packages/discord/message.py | 2336 ----- .venv/Lib/site-packages/discord/mixins.py | 46 - .venv/Lib/site-packages/discord/object.py | 117 - .venv/Lib/site-packages/discord/oggparse.py | 117 - .venv/Lib/site-packages/discord/opus.py | 468 - .../site-packages/discord/partial_emoji.py | 269 - .../Lib/site-packages/discord/permissions.py | 905 -- .venv/Lib/site-packages/discord/player.py | 752 -- .venv/Lib/site-packages/discord/py.typed | 0 .venv/Lib/site-packages/discord/raw_models.py | 469 - .venv/Lib/site-packages/discord/reaction.py | 253 - .venv/Lib/site-packages/discord/role.py | 534 - .../site-packages/discord/scheduled_event.py | 682 -- .venv/Lib/site-packages/discord/shard.py | 572 -- .../site-packages/discord/stage_instance.py | 192 - .venv/Lib/site-packages/discord/state.py | 1760 ---- .venv/Lib/site-packages/discord/sticker.py | 521 - .venv/Lib/site-packages/discord/team.py | 147 - .venv/Lib/site-packages/discord/template.py | 316 - .venv/Lib/site-packages/discord/threads.py | 964 -- .../site-packages/discord/types/__init__.py | 10 - .../__pycache__/__init__.cpython-311.pyc | Bin 375 -> 0 bytes .../__pycache__/activity.cpython-311.pyc | Bin 5381 -> 0 bytes .../types/__pycache__/appinfo.cpython-311.pyc | Bin 4179 -> 0 bytes .../__pycache__/audit_log.cpython-311.pyc | Bin 12743 -> 0 bytes .../types/__pycache__/automod.cpython-311.pyc | Bin 7476 -> 0 bytes .../types/__pycache__/channel.cpython-311.pyc | Bin 9995 -> 0 bytes .../types/__pycache__/command.cpython-311.pyc | Bin 10216 -> 0 bytes .../__pycache__/components.cpython-311.pyc | Bin 5708 -> 0 bytes .../types/__pycache__/embed.cpython-311.pyc | Bin 4600 -> 0 bytes .../types/__pycache__/emoji.cpython-311.pyc | Bin 2621 -> 0 bytes .../types/__pycache__/gateway.cpython-311.pyc | Bin 17863 -> 0 bytes .../types/__pycache__/guild.cpython-311.pyc | Bin 9343 -> 0 bytes .../__pycache__/integration.cpython-311.pyc | Bin 4050 -> 0 bytes .../__pycache__/interactions.cpython-311.pyc | Bin 12165 -> 0 bytes .../types/__pycache__/invite.cpython-311.pyc | Bin 4746 -> 0 bytes .../types/__pycache__/member.cpython-311.pyc | Bin 3603 -> 0 bytes .../types/__pycache__/message.cpython-311.pyc | Bin 7625 -> 0 bytes .../types/__pycache__/role.cpython-311.pyc | Bin 2705 -> 0 bytes .../scheduled_event.cpython-311.pyc | Bin 6039 -> 0 bytes .../__pycache__/snowflake.cpython-311.pyc | Bin 1487 -> 0 bytes .../types/__pycache__/sticker.cpython-311.pyc | Bin 4257 -> 0 bytes .../types/__pycache__/team.cpython-311.pyc | Bin 2388 -> 0 bytes .../__pycache__/template.cpython-311.pyc | Bin 2574 -> 0 bytes .../types/__pycache__/threads.cpython-311.pyc | Bin 4189 -> 0 bytes .../types/__pycache__/user.cpython-311.pyc | Bin 2541 -> 0 bytes .../types/__pycache__/voice.cpython-311.pyc | Bin 4405 -> 0 bytes .../types/__pycache__/webhook.cpython-311.pyc | Bin 3536 -> 0 bytes .../welcome_screen.cpython-311.pyc | Bin 2301 -> 0 bytes .../types/__pycache__/widget.cpython-311.pyc | Bin 3477 -> 0 bytes .../site-packages/discord/types/activity.py | 105 - .../site-packages/discord/types/appinfo.py | 81 - .../site-packages/discord/types/audit_log.py | 336 - .../site-packages/discord/types/automod.py | 132 - .../site-packages/discord/types/channel.py | 185 - .../site-packages/discord/types/command.py | 218 - .../site-packages/discord/types/components.py | 110 - .../Lib/site-packages/discord/types/embed.py | 90 - .../Lib/site-packages/discord/types/emoji.py | 46 - .../site-packages/discord/types/gateway.py | 345 - .../Lib/site-packages/discord/types/guild.py | 181 - .../discord/types/integration.py | 82 - .../discord/types/interactions.py | 240 - .../Lib/site-packages/discord/types/invite.py | 93 - .../Lib/site-packages/discord/types/member.py | 66 - .../site-packages/discord/types/message.py | 149 - .venv/Lib/site-packages/discord/types/role.py | 53 - .../discord/types/scheduled_event.py | 111 - .../site-packages/discord/types/snowflake.py | 28 - .../site-packages/discord/types/sticker.py | 83 - .venv/Lib/site-packages/discord/types/team.py | 45 - .../site-packages/discord/types/template.py | 49 - .../site-packages/discord/types/threads.py | 80 - .venv/Lib/site-packages/discord/types/user.py | 49 - .../Lib/site-packages/discord/types/voice.py | 84 - .../site-packages/discord/types/webhook.py | 67 - .../discord/types/welcome_screen.py | 40 - .../Lib/site-packages/discord/types/widget.py | 65 - .../Lib/site-packages/discord/ui/__init__.py | 17 - .../ui/__pycache__/__init__.cpython-311.pyc | Bin 551 -> 0 bytes .../ui/__pycache__/button.cpython-311.pyc | Bin 14346 -> 0 bytes .../ui/__pycache__/dynamic.cpython-311.pyc | Bin 9236 -> 0 bytes .../ui/__pycache__/item.cpython-311.pyc | Bin 6748 -> 0 bytes .../ui/__pycache__/modal.cpython-311.pyc | Bin 9995 -> 0 bytes .../ui/__pycache__/select.cpython-311.pyc | Bin 42131 -> 0 bytes .../ui/__pycache__/text_input.cpython-311.pyc | Bin 11861 -> 0 bytes .../ui/__pycache__/view.cpython-311.pyc | Bin 32690 -> 0 bytes .venv/Lib/site-packages/discord/ui/button.py | 295 - .venv/Lib/site-packages/discord/ui/dynamic.py | 166 - .venv/Lib/site-packages/discord/ui/item.py | 135 - .venv/Lib/site-packages/discord/ui/modal.py | 208 - .venv/Lib/site-packages/discord/ui/select.py | 860 -- .../site-packages/discord/ui/text_input.py | 245 - .venv/Lib/site-packages/discord/ui/view.py | 662 -- .venv/Lib/site-packages/discord/user.py | 531 - .venv/Lib/site-packages/discord/utils.py | 1382 --- .../Lib/site-packages/discord/voice_client.py | 692 -- .../site-packages/discord/webhook/__init__.py | 13 - .../__pycache__/__init__.cpython-311.pyc | Bin 429 -> 0 bytes .../__pycache__/async_.cpython-311.pyc | Bin 78506 -> 0 bytes .../webhook/__pycache__/sync.cpython-311.pyc | Bin 47379 -> 0 bytes .../site-packages/discord/webhook/async_.py | 2049 ---- .../Lib/site-packages/discord/webhook/sync.py | 1220 --- .../site-packages/discord/welcome_screen.py | 217 - .venv/Lib/site-packages/discord/widget.py | 325 - .../site-packages/distutils-precedence.pth | 1 - .../frozenlist-1.4.1.dist-info/INSTALLER | 1 - .../frozenlist-1.4.1.dist-info/LICENSE | 201 - .../frozenlist-1.4.1.dist-info/METADATA | 420 - .../frozenlist-1.4.1.dist-info/RECORD | 12 - .../frozenlist-1.4.1.dist-info/WHEEL | 5 - .../frozenlist-1.4.1.dist-info/top_level.txt | 1 - .../Lib/site-packages/frozenlist/__init__.py | 95 - .../Lib/site-packages/frozenlist/__init__.pyi | 47 - .../__pycache__/__init__.cpython-311.pyc | Bin 4801 -> 0 bytes .../_frozenlist.cp311-win_amd64.pyd | Bin 86016 -> 0 bytes .../site-packages/frozenlist/_frozenlist.pyx | 123 - .venv/Lib/site-packages/frozenlist/py.typed | 1 - .../idna-3.6.dist-info/INSTALLER | 1 - .../idna-3.6.dist-info/LICENSE.md | 31 - .../site-packages/idna-3.6.dist-info/METADATA | 243 - .../site-packages/idna-3.6.dist-info/RECORD | 22 - .../site-packages/idna-3.6.dist-info/WHEEL | 4 - .venv/Lib/site-packages/idna/__init__.py | 44 - .../idna/__pycache__/__init__.cpython-311.pyc | Bin 1104 -> 0 bytes .../idna/__pycache__/codec.cpython-311.pyc | Bin 5791 -> 0 bytes .../idna/__pycache__/compat.cpython-311.pyc | Bin 1021 -> 0 bytes .../idna/__pycache__/core.cpython-311.pyc | Bin 19370 -> 0 bytes .../idna/__pycache__/idnadata.cpython-311.pyc | Bin 38959 -> 0 bytes .../__pycache__/intranges.cpython-311.pyc | Bin 2989 -> 0 bytes .../__pycache__/package_data.cpython-311.pyc | Bin 224 -> 0 bytes .../__pycache__/uts46data.cpython-311.pyc | Bin 163182 -> 0 bytes .venv/Lib/site-packages/idna/codec.py | 118 - .venv/Lib/site-packages/idna/compat.py | 13 - .venv/Lib/site-packages/idna/core.py | 400 - .venv/Lib/site-packages/idna/idnadata.py | 2150 ----- .venv/Lib/site-packages/idna/intranges.py | 54 - .venv/Lib/site-packages/idna/package_data.py | 2 - .venv/Lib/site-packages/idna/py.typed | 0 .venv/Lib/site-packages/idna/uts46data.py | 8598 ---------------- .../multidict-6.0.5.dist-info/INSTALLER | 1 - .../multidict-6.0.5.dist-info/LICENSE | 13 - .../multidict-6.0.5.dist-info/METADATA | 132 - .../multidict-6.0.5.dist-info/RECORD | 19 - .../multidict-6.0.5.dist-info/WHEEL | 5 - .../multidict-6.0.5.dist-info/top_level.txt | 1 - .venv/Lib/site-packages/multidict/__init__.py | 48 - .../Lib/site-packages/multidict/__init__.pyi | 152 - .../__pycache__/__init__.cpython-311.pyc | Bin 1169 -> 0 bytes .../__pycache__/_abc.cpython-311.pyc | Bin 2773 -> 0 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 736 -> 0 bytes .../_multidict_base.cpython-311.pyc | Bin 6770 -> 0 bytes .../__pycache__/_multidict_py.cpython-311.pyc | Bin 29059 -> 0 bytes .venv/Lib/site-packages/multidict/_abc.py | 48 - .venv/Lib/site-packages/multidict/_compat.py | 14 - .../multidict/_multidict.cp311-win_amd64.pyd | Bin 46592 -> 0 bytes .../multidict/_multidict_base.py | 144 - .../site-packages/multidict/_multidict_py.py | 527 - .venv/Lib/site-packages/multidict/py.typed | 1 - .../pip-22.3.1.dist-info/INSTALLER | 1 - .../pip-22.3.1.dist-info/LICENSE.txt | 20 - .../pip-22.3.1.dist-info/METADATA | 88 - .../site-packages/pip-22.3.1.dist-info/RECORD | 992 -- .../pip-22.3.1.dist-info/REQUESTED | 0 .../site-packages/pip-22.3.1.dist-info/WHEEL | 5 - .../pip-22.3.1.dist-info/entry_points.txt | 4 - .../pip-22.3.1.dist-info/top_level.txt | 1 - .venv/Lib/site-packages/pip/__init__.py | 13 - .venv/Lib/site-packages/pip/__main__.py | 31 - .venv/Lib/site-packages/pip/__pip-runner__.py | 50 - .../pip/__pycache__/__init__.cpython-311.pyc | Bin 790 -> 0 bytes .../pip/__pycache__/__main__.cpython-311.pyc | Bin 1099 -> 0 bytes .../__pip-runner__.cpython-311.pyc | Bin 2527 -> 0 bytes .../site-packages/pip/_internal/__init__.py | 19 - .../__pycache__/__init__.cpython-311.pyc | Bin 973 -> 0 bytes .../__pycache__/build_env.cpython-311.pyc | Bin 15920 -> 0 bytes .../__pycache__/cache.cpython-311.pyc | Bin 14718 -> 0 bytes .../__pycache__/configuration.cpython-311.pyc | Bin 19249 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 33953 -> 0 bytes .../__pycache__/main.cpython-311.pyc | Bin 773 -> 0 bytes .../__pycache__/pyproject.cpython-311.pyc | Bin 5545 -> 0 bytes .../self_outdated_check.cpython-311.pyc | Bin 11187 -> 0 bytes .../__pycache__/wheel_builder.cpython-311.pyc | Bin 16013 -> 0 bytes .../site-packages/pip/_internal/build_env.py | 310 - .../Lib/site-packages/pip/_internal/cache.py | 293 - .../pip/_internal/cli/__init__.py | 4 - .../cli/__pycache__/__init__.cpython-311.pyc | Bin 308 -> 0 bytes .../autocompletion.cpython-311.pyc | Bin 10098 -> 0 bytes .../__pycache__/base_command.cpython-311.pyc | Bin 11096 -> 0 bytes .../__pycache__/cmdoptions.cpython-311.pyc | Bin 32862 -> 0 bytes .../command_context.cpython-311.pyc | Bin 2130 -> 0 bytes .../cli/__pycache__/main.cpython-311.pyc | Bin 2385 -> 0 bytes .../__pycache__/main_parser.cpython-311.pyc | Bin 5544 -> 0 bytes .../cli/__pycache__/parser.cpython-311.pyc | Bin 17045 -> 0 bytes .../__pycache__/progress_bars.cpython-311.pyc | Bin 3192 -> 0 bytes .../__pycache__/req_command.cpython-311.pyc | Bin 20157 -> 0 bytes .../cli/__pycache__/spinners.cpython-311.pyc | Bin 8857 -> 0 bytes .../__pycache__/status_codes.cpython-311.pyc | Bin 396 -> 0 bytes .../pip/_internal/cli/autocompletion.py | 171 - .../pip/_internal/cli/base_command.py | 216 - .../pip/_internal/cli/cmdoptions.py | 1049 -- .../pip/_internal/cli/command_context.py | 27 - .../site-packages/pip/_internal/cli/main.py | 70 - .../pip/_internal/cli/main_parser.py | 134 - .../site-packages/pip/_internal/cli/parser.py | 294 - .../pip/_internal/cli/progress_bars.py | 68 - .../pip/_internal/cli/req_command.py | 502 - .../pip/_internal/cli/spinners.py | 159 - .../pip/_internal/cli/status_codes.py | 6 - .../pip/_internal/commands/__init__.py | 132 - .../__pycache__/__init__.cpython-311.pyc | Bin 4476 -> 0 bytes .../__pycache__/cache.cpython-311.pyc | Bin 10575 -> 0 bytes .../__pycache__/check.cpython-311.pyc | Bin 2326 -> 0 bytes .../__pycache__/completion.cpython-311.pyc | Bin 5488 -> 0 bytes .../__pycache__/configuration.cpython-311.pyc | Bin 14917 -> 0 bytes .../__pycache__/debug.cpython-311.pyc | Bin 11952 -> 0 bytes .../__pycache__/download.cpython-311.pyc | Bin 7832 -> 0 bytes .../__pycache__/freeze.cpython-311.pyc | Bin 4162 -> 0 bytes .../commands/__pycache__/hash.cpython-311.pyc | Bin 3378 -> 0 bytes .../commands/__pycache__/help.cpython-311.pyc | Bin 1990 -> 0 bytes .../__pycache__/index.cpython-311.pyc | Bin 7779 -> 0 bytes .../__pycache__/inspect.cpython-311.pyc | Bin 4685 -> 0 bytes .../__pycache__/install.cpython-311.pyc | Bin 35123 -> 0 bytes .../commands/__pycache__/list.cpython-311.pyc | Bin 17170 -> 0 bytes .../__pycache__/search.cpython-311.pyc | Bin 8972 -> 0 bytes .../commands/__pycache__/show.cpython-311.pyc | Bin 11079 -> 0 bytes .../__pycache__/uninstall.cpython-311.pyc | Bin 4889 -> 0 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 9972 -> 0 bytes .../pip/_internal/commands/cache.py | 223 - .../pip/_internal/commands/check.py | 53 - .../pip/_internal/commands/completion.py | 126 - .../pip/_internal/commands/configuration.py | 282 - .../pip/_internal/commands/debug.py | 199 - .../pip/_internal/commands/download.py | 149 - .../pip/_internal/commands/freeze.py | 97 - .../pip/_internal/commands/hash.py | 59 - .../pip/_internal/commands/help.py | 41 - .../pip/_internal/commands/index.py | 138 - .../pip/_internal/commands/inspect.py | 97 - .../pip/_internal/commands/install.py | 860 -- .../pip/_internal/commands/list.py | 365 - .../pip/_internal/commands/search.py | 174 - .../pip/_internal/commands/show.py | 183 - .../pip/_internal/commands/uninstall.py | 106 - .../pip/_internal/commands/wheel.py | 203 - .../pip/_internal/configuration.py | 374 - .../pip/_internal/distributions/__init__.py | 21 - .../__pycache__/__init__.cpython-311.pyc | Bin 1058 -> 0 bytes .../__pycache__/base.cpython-311.pyc | Bin 2430 -> 0 bytes .../__pycache__/installed.cpython-311.pyc | Bin 1567 -> 0 bytes .../__pycache__/sdist.cpython-311.pyc | Bin 8969 -> 0 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 2161 -> 0 bytes .../pip/_internal/distributions/base.py | 39 - .../pip/_internal/distributions/installed.py | 23 - .../pip/_internal/distributions/sdist.py | 150 - .../pip/_internal/distributions/wheel.py | 34 - .../site-packages/pip/_internal/exceptions.py | 660 -- .../pip/_internal/index/__init__.py | 2 - .../__pycache__/__init__.cpython-311.pyc | Bin 262 -> 0 bytes .../__pycache__/collector.cpython-311.pyc | Bin 24568 -> 0 bytes .../package_finder.cpython-311.pyc | Bin 43631 -> 0 bytes .../index/__pycache__/sources.cpython-311.pyc | Bin 11044 -> 0 bytes .../pip/_internal/index/collector.py | 505 - .../pip/_internal/index/package_finder.py | 1025 -- .../pip/_internal/index/sources.py | 224 - .../pip/_internal/locations/__init__.py | 528 - .../__pycache__/__init__.cpython-311.pyc | Bin 20687 -> 0 bytes .../__pycache__/_distutils.cpython-311.pyc | Bin 7928 -> 0 bytes .../__pycache__/_sysconfig.cpython-311.pyc | Bin 9260 -> 0 bytes .../__pycache__/base.cpython-311.pyc | Bin 4054 -> 0 bytes .../pip/_internal/locations/_distutils.py | 180 - .../pip/_internal/locations/_sysconfig.py | 218 - .../pip/_internal/locations/base.py | 81 - .venv/Lib/site-packages/pip/_internal/main.py | 12 - .../pip/_internal/metadata/__init__.py | 127 - .../__pycache__/__init__.cpython-311.pyc | Bin 6433 -> 0 bytes .../__pycache__/_json.cpython-311.pyc | Bin 3587 -> 0 bytes .../metadata/__pycache__/base.cpython-311.pyc | Bin 38032 -> 0 bytes .../__pycache__/pkg_resources.cpython-311.pyc | Bin 16880 -> 0 bytes .../pip/_internal/metadata/_json.py | 84 - .../pip/_internal/metadata/base.py | 688 -- .../_internal/metadata/importlib/__init__.py | 4 - .../__pycache__/__init__.cpython-311.pyc | Bin 379 -> 0 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 3586 -> 0 bytes .../__pycache__/_dists.cpython-311.pyc | Bin 14602 -> 0 bytes .../__pycache__/_envs.cpython-311.pyc | Bin 12440 -> 0 bytes .../_internal/metadata/importlib/_compat.py | 55 - .../_internal/metadata/importlib/_dists.py | 224 - .../pip/_internal/metadata/importlib/_envs.py | 188 - .../pip/_internal/metadata/pkg_resources.py | 270 - .../pip/_internal/models/__init__.py | 2 - .../__pycache__/__init__.cpython-311.pyc | Bin 296 -> 0 bytes .../__pycache__/candidate.cpython-311.pyc | Bin 2115 -> 0 bytes .../__pycache__/direct_url.cpython-311.pyc | Bin 11620 -> 0 bytes .../format_control.cpython-311.pyc | Bin 4679 -> 0 bytes .../models/__pycache__/index.cpython-311.pyc | Bin 1921 -> 0 bytes .../installation_report.cpython-311.pyc | Bin 2635 -> 0 bytes .../models/__pycache__/link.cpython-311.pyc | Bin 25031 -> 0 bytes .../models/__pycache__/scheme.cpython-311.pyc | Bin 1287 -> 0 bytes .../__pycache__/search_scope.cpython-311.pyc | Bin 5850 -> 0 bytes .../selection_prefs.cpython-311.pyc | Bin 2018 -> 0 bytes .../__pycache__/target_python.cpython-311.pyc | Bin 4780 -> 0 bytes .../models/__pycache__/wheel.cpython-311.pyc | Bin 6443 -> 0 bytes .../pip/_internal/models/candidate.py | 34 - .../pip/_internal/models/direct_url.py | 212 - .../pip/_internal/models/format_control.py | 80 - .../pip/_internal/models/index.py | 28 - .../_internal/models/installation_report.py | 53 - .../pip/_internal/models/link.py | 507 - .../pip/_internal/models/scheme.py | 31 - .../pip/_internal/models/search_scope.py | 133 - .../pip/_internal/models/selection_prefs.py | 51 - .../pip/_internal/models/target_python.py | 110 - .../pip/_internal/models/wheel.py | 92 - .../pip/_internal/network/__init__.py | 2 - .../__pycache__/__init__.cpython-311.pyc | Bin 284 -> 0 bytes .../network/__pycache__/auth.cpython-311.pyc | Bin 12203 -> 0 bytes .../network/__pycache__/cache.cpython-311.pyc | Bin 5207 -> 0 bytes .../__pycache__/download.cpython-311.pyc | Bin 9599 -> 0 bytes .../__pycache__/lazy_wheel.cpython-311.pyc | Bin 13045 -> 0 bytes .../__pycache__/session.cpython-311.pyc | Bin 21312 -> 0 bytes .../network/__pycache__/utils.cpython-311.pyc | Bin 2433 -> 0 bytes .../__pycache__/xmlrpc.cpython-311.pyc | Bin 3212 -> 0 bytes .../pip/_internal/network/auth.py | 323 - .../pip/_internal/network/cache.py | 69 - .../pip/_internal/network/download.py | 186 - .../pip/_internal/network/lazy_wheel.py | 210 - .../pip/_internal/network/session.py | 518 - .../pip/_internal/network/utils.py | 96 - .../pip/_internal/network/xmlrpc.py | 60 - .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 222 -> 0 bytes .../__pycache__/check.cpython-311.pyc | Bin 6634 -> 0 bytes .../__pycache__/freeze.cpython-311.pyc | Bin 11618 -> 0 bytes .../__pycache__/prepare.cpython-311.pyc | Bin 26402 -> 0 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 228 -> 0 bytes .../__pycache__/build_tracker.cpython-311.pyc | Bin 8151 -> 0 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 2293 -> 0 bytes .../metadata_editable.cpython-311.pyc | Bin 2329 -> 0 bytes .../metadata_legacy.cpython-311.pyc | Bin 3735 -> 0 bytes .../build/__pycache__/wheel.cpython-311.pyc | Bin 1959 -> 0 bytes .../wheel_editable.cpython-311.pyc | Bin 2403 -> 0 bytes .../__pycache__/wheel_legacy.cpython-311.pyc | Bin 4516 -> 0 bytes .../operations/build/build_tracker.py | 124 - .../_internal/operations/build/metadata.py | 39 - .../operations/build/metadata_editable.py | 41 - .../operations/build/metadata_legacy.py | 74 - .../pip/_internal/operations/build/wheel.py | 37 - .../operations/build/wheel_editable.py | 46 - .../operations/build/wheel_legacy.py | 102 - .../pip/_internal/operations/check.py | 149 - .../pip/_internal/operations/freeze.py | 254 - .../_internal/operations/install/__init__.py | 2 - .../__pycache__/__init__.cpython-311.pyc | Bin 296 -> 0 bytes .../editable_legacy.cpython-311.pyc | Bin 2292 -> 0 bytes .../__pycache__/legacy.cpython-311.pyc | Bin 6132 -> 0 bytes .../install/__pycache__/wheel.cpython-311.pyc | Bin 40018 -> 0 bytes .../operations/install/editable_legacy.py | 47 - .../_internal/operations/install/legacy.py | 120 - .../pip/_internal/operations/install/wheel.py | 738 -- .../pip/_internal/operations/prepare.py | 667 -- .../site-packages/pip/_internal/pyproject.py | 175 - .../pip/_internal/req/__init__.py | 94 - .../req/__pycache__/__init__.cpython-311.pyc | Bin 4468 -> 0 bytes .../__pycache__/constructors.cpython-311.pyc | Bin 20727 -> 0 bytes .../req/__pycache__/req_file.cpython-311.pyc | Bin 22456 -> 0 bytes .../__pycache__/req_install.cpython-311.pyc | Bin 40306 -> 0 bytes .../req/__pycache__/req_set.cpython-311.pyc | Bin 6024 -> 0 bytes .../__pycache__/req_uninstall.cpython-311.pyc | Bin 37022 -> 0 bytes .../pip/_internal/req/constructors.py | 501 - .../pip/_internal/req/req_file.py | 544 -- .../pip/_internal/req/req_install.py | 942 -- .../pip/_internal/req/req_set.py | 82 - .../pip/_internal/req/req_uninstall.py | 640 -- .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 222 -> 0 bytes .../__pycache__/base.cpython-311.pyc | Bin 1393 -> 0 bytes .../pip/_internal/resolution/base.py | 20 - .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 229 -> 0 bytes .../__pycache__/resolver.cpython-311.pyc | Bin 23815 -> 0 bytes .../_internal/resolution/legacy/resolver.py | 600 -- .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 233 -> 0 bytes .../__pycache__/base.cpython-311.pyc | Bin 9646 -> 0 bytes .../__pycache__/candidates.cpython-311.pyc | Bin 28856 -> 0 bytes .../__pycache__/factory.cpython-311.pyc | Bin 32000 -> 0 bytes .../found_candidates.cpython-311.pyc | Bin 6781 -> 0 bytes .../__pycache__/provider.cpython-311.pyc | Bin 11075 -> 0 bytes .../__pycache__/reporter.cpython-311.pyc | Bin 4678 -> 0 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 11143 -> 0 bytes .../__pycache__/resolver.cpython-311.pyc | Bin 12330 -> 0 bytes .../_internal/resolution/resolvelib/base.py | 141 - .../resolution/resolvelib/candidates.py | 556 -- .../resolution/resolvelib/factory.py | 731 -- .../resolution/resolvelib/found_candidates.py | 155 - .../resolution/resolvelib/provider.py | 248 - .../resolution/resolvelib/reporter.py | 68 - .../resolution/resolvelib/requirements.py | 166 - .../resolution/resolvelib/resolver.py | 296 - .../pip/_internal/self_outdated_check.py | 239 - .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 217 -> 0 bytes .../utils/__pycache__/_log.cpython-311.pyc | Bin 2038 -> 0 bytes .../utils/__pycache__/appdirs.cpython-311.pyc | Bin 2576 -> 0 bytes .../utils/__pycache__/compat.cpython-311.pyc | Bin 2284 -> 0 bytes .../compatibility_tags.cpython-311.pyc | Bin 6776 -> 0 bytes .../__pycache__/datetime.cpython-311.pyc | Bin 734 -> 0 bytes .../__pycache__/deprecation.cpython-311.pyc | Bin 7107 -> 0 bytes .../direct_url_helpers.cpython-311.pyc | Bin 3740 -> 0 bytes .../distutils_args.cpython-311.pyc | Bin 1484 -> 0 bytes .../__pycache__/egg_link.cpython-311.pyc | Bin 3236 -> 0 bytes .../__pycache__/encoding.cpython-311.pyc | Bin 2340 -> 0 bytes .../__pycache__/entrypoints.cpython-311.pyc | Bin 4262 -> 0 bytes .../__pycache__/filesystem.cpython-311.pyc | Bin 8247 -> 0 bytes .../__pycache__/filetypes.cpython-311.pyc | Bin 1333 -> 0 bytes .../utils/__pycache__/glibc.cpython-311.pyc | Bin 2576 -> 0 bytes .../utils/__pycache__/hashes.cpython-311.pyc | Bin 8354 -> 0 bytes .../inject_securetransport.cpython-311.pyc | Bin 1351 -> 0 bytes .../utils/__pycache__/logging.cpython-311.pyc | Bin 15476 -> 0 bytes .../utils/__pycache__/misc.cpython-311.pyc | Bin 35790 -> 0 bytes .../utils/__pycache__/models.cpython-311.pyc | Bin 2957 -> 0 bytes .../__pycache__/packaging.cpython-311.pyc | Bin 2824 -> 0 bytes .../setuptools_build.cpython-311.pyc | Bin 6121 -> 0 bytes .../__pycache__/subprocess.cpython-311.pyc | Bin 9908 -> 0 bytes .../__pycache__/temp_dir.cpython-311.pyc | Bin 11438 -> 0 bytes .../__pycache__/unpacking.cpython-311.pyc | Bin 12913 -> 0 bytes .../utils/__pycache__/urls.cpython-311.pyc | Bin 2710 -> 0 bytes .../__pycache__/virtualenv.cpython-311.pyc | Bin 4957 -> 0 bytes .../utils/__pycache__/wheel.cpython-311.pyc | Bin 7127 -> 0 bytes .../site-packages/pip/_internal/utils/_log.py | 38 - .../pip/_internal/utils/appdirs.py | 52 - .../pip/_internal/utils/compat.py | 63 - .../pip/_internal/utils/compatibility_tags.py | 165 - .../pip/_internal/utils/datetime.py | 11 - .../pip/_internal/utils/deprecation.py | 188 - .../pip/_internal/utils/direct_url_helpers.py | 87 - .../pip/_internal/utils/distutils_args.py | 43 - .../pip/_internal/utils/egg_link.py | 75 - .../pip/_internal/utils/encoding.py | 36 - .../pip/_internal/utils/entrypoints.py | 84 - .../pip/_internal/utils/filesystem.py | 153 - .../pip/_internal/utils/filetypes.py | 27 - .../pip/_internal/utils/glibc.py | 88 - .../pip/_internal/utils/hashes.py | 144 - .../_internal/utils/inject_securetransport.py | 35 - .../pip/_internal/utils/logging.py | 348 - .../site-packages/pip/_internal/utils/misc.py | 723 -- .../pip/_internal/utils/models.py | 39 - .../pip/_internal/utils/packaging.py | 57 - .../pip/_internal/utils/setuptools_build.py | 195 - .../pip/_internal/utils/subprocess.py | 260 - .../pip/_internal/utils/temp_dir.py | 246 - .../pip/_internal/utils/unpacking.py | 257 - .../site-packages/pip/_internal/utils/urls.py | 62 - .../pip/_internal/utils/virtualenv.py | 104 - .../pip/_internal/utils/wheel.py | 136 - .../pip/_internal/vcs/__init__.py | 15 - .../vcs/__pycache__/__init__.cpython-311.pyc | Bin 652 -> 0 bytes .../vcs/__pycache__/bazaar.cpython-311.pyc | Bin 5877 -> 0 bytes .../vcs/__pycache__/git.cpython-311.pyc | Bin 21541 -> 0 bytes .../vcs/__pycache__/mercurial.cpython-311.pyc | Bin 8723 -> 0 bytes .../__pycache__/subversion.cpython-311.pyc | Bin 14620 -> 0 bytes .../versioncontrol.cpython-311.pyc | Bin 31889 -> 0 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 112 - .../site-packages/pip/_internal/vcs/git.py | 526 - .../pip/_internal/vcs/mercurial.py | 163 - .../pip/_internal/vcs/subversion.py | 324 - .../pip/_internal/vcs/versioncontrol.py | 705 -- .../pip/_internal/wheel_builder.py | 382 - .../Lib/site-packages/pip/_vendor/__init__.py | 120 - .../__pycache__/__init__.cpython-311.pyc | Bin 5630 -> 0 bytes .../_vendor/__pycache__/six.cpython-311.pyc | Bin 46432 -> 0 bytes .../typing_extensions.cpython-311.pyc | Bin 97462 -> 0 bytes .../pip/_vendor/cachecontrol/__init__.py | 18 - .../__pycache__/__init__.cpython-311.pyc | Bin 859 -> 0 bytes .../__pycache__/_cmd.cpython-311.pyc | Bin 2714 -> 0 bytes .../__pycache__/adapter.cpython-311.pyc | Bin 5521 -> 0 bytes .../__pycache__/cache.cpython-311.pyc | Bin 3795 -> 0 bytes .../__pycache__/compat.cpython-311.pyc | Bin 1152 -> 0 bytes .../__pycache__/controller.cpython-311.pyc | Bin 16467 -> 0 bytes .../__pycache__/filewrapper.cpython-311.pyc | Bin 4254 -> 0 bytes .../__pycache__/heuristics.cpython-311.pyc | Bin 6699 -> 0 bytes .../__pycache__/serialize.cpython-311.pyc | Bin 8414 -> 0 bytes .../__pycache__/wrapper.cpython-311.pyc | Bin 980 -> 0 bytes .../pip/_vendor/cachecontrol/_cmd.py | 61 - .../pip/_vendor/cachecontrol/adapter.py | 137 - .../pip/_vendor/cachecontrol/cache.py | 65 - .../_vendor/cachecontrol/caches/__init__.py | 9 - .../__pycache__/__init__.cpython-311.pyc | Bin 434 -> 0 bytes .../__pycache__/file_cache.cpython-311.pyc | Bin 8417 -> 0 bytes .../__pycache__/redis_cache.cpython-311.pyc | Bin 2514 -> 0 bytes .../_vendor/cachecontrol/caches/file_cache.py | 188 - .../cachecontrol/caches/redis_cache.py | 39 - .../pip/_vendor/cachecontrol/compat.py | 32 - .../pip/_vendor/cachecontrol/controller.py | 439 - .../pip/_vendor/cachecontrol/filewrapper.py | 111 - .../pip/_vendor/cachecontrol/heuristics.py | 139 - .../pip/_vendor/cachecontrol/serialize.py | 190 - .../pip/_vendor/cachecontrol/wrapper.py | 33 - .../pip/_vendor/certifi/__init__.py | 4 - .../pip/_vendor/certifi/__main__.py | 12 - .../__pycache__/__init__.cpython-311.pyc | Bin 359 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 760 -> 0 bytes .../certifi/__pycache__/core.cpython-311.pyc | Bin 3382 -> 0 bytes .../pip/_vendor/certifi/cacert.pem | 4708 --------- .../site-packages/pip/_vendor/certifi/core.py | 108 - .../pip/_vendor/chardet/__init__.py | 93 - .../__pycache__/__init__.cpython-311.pyc | Bin 3985 -> 0 bytes .../__pycache__/big5freq.cpython-311.pyc | Bin 27221 -> 0 bytes .../__pycache__/big5prober.cpython-311.pyc | Bin 1631 -> 0 bytes .../chardistribution.cpython-311.pyc | Bin 10413 -> 0 bytes .../charsetgroupprober.cpython-311.pyc | Bin 3947 -> 0 bytes .../__pycache__/charsetprober.cpython-311.pyc | Bin 4761 -> 0 bytes .../codingstatemachine.cpython-311.pyc | Bin 3706 -> 0 bytes .../__pycache__/cp949prober.cpython-311.pyc | Bin 1640 -> 0 bytes .../chardet/__pycache__/enums.cpython-311.pyc | Bin 3270 -> 0 bytes .../__pycache__/escprober.cpython-311.pyc | Bin 4549 -> 0 bytes .../chardet/__pycache__/escsm.cpython-311.pyc | Bin 12418 -> 0 bytes .../__pycache__/eucjpprober.cpython-311.pyc | Bin 4398 -> 0 bytes .../__pycache__/euckrfreq.cpython-311.pyc | Bin 12104 -> 0 bytes .../__pycache__/euckrprober.cpython-311.pyc | Bin 1632 -> 0 bytes .../__pycache__/euctwfreq.cpython-311.pyc | Bin 27226 -> 0 bytes .../__pycache__/euctwprober.cpython-311.pyc | Bin 1632 -> 0 bytes .../__pycache__/gb2312freq.cpython-311.pyc | Bin 19148 -> 0 bytes .../__pycache__/gb2312prober.cpython-311.pyc | Bin 1647 -> 0 bytes .../__pycache__/hebrewprober.cpython-311.pyc | Bin 4961 -> 0 bytes .../__pycache__/jisfreq.cpython-311.pyc | Bin 22177 -> 0 bytes .../__pycache__/johabfreq.cpython-311.pyc | Bin 84681 -> 0 bytes .../__pycache__/johabprober.cpython-311.pyc | Bin 1638 -> 0 bytes .../__pycache__/jpcntx.cpython-311.pyc | Bin 39547 -> 0 bytes .../langbulgarianmodel.cpython-311.pyc | Bin 85855 -> 0 bytes .../langgreekmodel.cpython-311.pyc | Bin 79277 -> 0 bytes .../langhebrewmodel.cpython-311.pyc | Bin 80039 -> 0 bytes .../langhungarianmodel.cpython-311.pyc | Bin 85809 -> 0 bytes .../langrussianmodel.cpython-311.pyc | Bin 108756 -> 0 bytes .../__pycache__/langthaimodel.cpython-311.pyc | Bin 80217 -> 0 bytes .../langturkishmodel.cpython-311.pyc | Bin 80056 -> 0 bytes .../__pycache__/latin1prober.cpython-311.pyc | Bin 7079 -> 0 bytes .../mbcharsetprober.cpython-311.pyc | Bin 3898 -> 0 bytes .../mbcsgroupprober.cpython-311.pyc | Bin 1882 -> 0 bytes .../__pycache__/mbcssm.cpython-311.pyc | Bin 31274 -> 0 bytes .../sbcharsetprober.cpython-311.pyc | Bin 5604 -> 0 bytes .../sbcsgroupprober.cpython-311.pyc | Bin 2936 -> 0 bytes .../__pycache__/sjisprober.cpython-311.pyc | Bin 4503 -> 0 bytes .../universaldetector.cpython-311.pyc | Bin 11326 -> 0 bytes .../__pycache__/utf1632prober.cpython-311.pyc | Bin 10096 -> 0 bytes .../__pycache__/utf8prober.cpython-311.pyc | Bin 3244 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 522 -> 0 bytes .../pip/_vendor/chardet/big5freq.py | 386 - .../pip/_vendor/chardet/big5prober.py | 47 - .../pip/_vendor/chardet/chardistribution.py | 259 - .../pip/_vendor/chardet/charsetgroupprober.py | 109 - .../pip/_vendor/chardet/charsetprober.py | 138 - .../pip/_vendor/chardet/cli/__init__.py | 0 .../cli/__pycache__/__init__.cpython-311.pyc | Bin 221 -> 0 bytes .../__pycache__/chardetect.cpython-311.pyc | Bin 3406 -> 0 bytes .../pip/_vendor/chardet/cli/chardetect.py | 86 - .../pip/_vendor/chardet/codingstatemachine.py | 88 - .../pip/_vendor/chardet/cp949prober.py | 49 - .../pip/_vendor/chardet/enums.py | 82 - .../pip/_vendor/chardet/escprober.py | 102 - .../pip/_vendor/chardet/escsm.py | 260 - .../pip/_vendor/chardet/eucjpprober.py | 95 - .../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 | 302 - .../pip/_vendor/chardet/jisfreq.py | 325 - .../pip/_vendor/chardet/johabfreq.py | 2382 ----- .../pip/_vendor/chardet/johabprober.py | 47 - .../pip/_vendor/chardet/jpcntx.py | 237 - .../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 | 145 - .../pip/_vendor/chardet/mbcharsetprober.py | 95 - .../pip/_vendor/chardet/mbcsgroupprober.py | 56 - .../pip/_vendor/chardet/mbcssm.py | 660 -- .../pip/_vendor/chardet/metadata/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 226 -> 0 bytes .../__pycache__/languages.cpython-311.pyc | Bin 10433 -> 0 bytes .../pip/_vendor/chardet/metadata/languages.py | 351 - .../pip/_vendor/chardet/sbcharsetprober.py | 160 - .../pip/_vendor/chardet/sbcsgroupprober.py | 88 - .../pip/_vendor/chardet/sjisprober.py | 98 - .../pip/_vendor/chardet/universaldetector.py | 328 - .../pip/_vendor/chardet/utf1632prober.py | 223 - .../pip/_vendor/chardet/utf8prober.py | 80 - .../pip/_vendor/chardet/version.py | 9 - .../pip/_vendor/colorama/__init__.py | 6 - .../__pycache__/__init__.cpython-311.pyc | Bin 552 -> 0 bytes .../colorama/__pycache__/ansi.cpython-311.pyc | Bin 4591 -> 0 bytes .../__pycache__/ansitowin32.cpython-311.pyc | Bin 15758 -> 0 bytes .../__pycache__/initialise.cpython-311.pyc | Bin 2913 -> 0 bytes .../__pycache__/win32.cpython-311.pyc | Bin 6932 -> 0 bytes .../__pycache__/winterm.cpython-311.pyc | Bin 8051 -> 0 bytes .../pip/_vendor/colorama/ansi.py | 102 - .../pip/_vendor/colorama/ansitowin32.py | 266 - .../pip/_vendor/colorama/initialise.py | 80 - .../pip/_vendor/colorama/win32.py | 152 - .../pip/_vendor/colorama/winterm.py | 169 - .../pip/_vendor/distlib/__init__.py | 23 - .../__pycache__/__init__.cpython-311.pyc | Bin 1462 -> 0 bytes .../__pycache__/compat.cpython-311.pyc | Bin 52328 -> 0 bytes .../__pycache__/database.cpython-311.pyc | Bin 72116 -> 0 bytes .../distlib/__pycache__/index.cpython-311.pyc | Bin 26705 -> 0 bytes .../__pycache__/locators.cpython-311.pyc | Bin 65881 -> 0 bytes .../__pycache__/manifest.cpython-311.pyc | Bin 17048 -> 0 bytes .../__pycache__/markers.cpython-311.pyc | Bin 8184 -> 0 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 47132 -> 0 bytes .../__pycache__/resources.cpython-311.pyc | Bin 19011 -> 0 bytes .../__pycache__/scripts.cpython-311.pyc | Bin 21287 -> 0 bytes .../distlib/__pycache__/util.cpython-311.pyc | Bin 97466 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 34593 -> 0 bytes .../distlib/__pycache__/wheel.cpython-311.pyc | Bin 60397 -> 0 bytes .../pip/_vendor/distlib/compat.py | 1116 --- .../pip/_vendor/distlib/database.py | 1350 --- .../pip/_vendor/distlib/index.py | 508 - .../pip/_vendor/distlib/locators.py | 1300 --- .../pip/_vendor/distlib/manifest.py | 393 - .../pip/_vendor/distlib/markers.py | 152 - .../pip/_vendor/distlib/metadata.py | 1076 --- .../pip/_vendor/distlib/resources.py | 358 - .../pip/_vendor/distlib/scripts.py | 437 - .../site-packages/pip/_vendor/distlib/t32.exe | Bin 97792 -> 0 bytes .../pip/_vendor/distlib/t64-arm.exe | Bin 182784 -> 0 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 108032 -> 0 bytes .../site-packages/pip/_vendor/distlib/util.py | 1932 ---- .../pip/_vendor/distlib/version.py | 739 -- .../site-packages/pip/_vendor/distlib/w32.exe | Bin 91648 -> 0 bytes .../pip/_vendor/distlib/w64-arm.exe | Bin 168448 -> 0 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 101888 -> 0 bytes .../pip/_vendor/distlib/wheel.py | 1082 --- .../pip/_vendor/distro/__init__.py | 54 - .../pip/_vendor/distro/__main__.py | 4 - .../__pycache__/__init__.cpython-311.pyc | Bin 1215 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 349 -> 0 bytes .../distro/__pycache__/distro.cpython-311.pyc | Bin 56235 -> 0 bytes .../pip/_vendor/distro/distro.py | 1374 --- .../pip/_vendor/idna/__init__.py | 44 - .../idna/__pycache__/__init__.cpython-311.pyc | Bin 1116 -> 0 bytes .../idna/__pycache__/codec.cpython-311.pyc | Bin 5407 -> 0 bytes .../idna/__pycache__/compat.cpython-311.pyc | Bin 1033 -> 0 bytes .../idna/__pycache__/core.cpython-311.pyc | Bin 19468 -> 0 bytes .../idna/__pycache__/idnadata.cpython-311.pyc | Bin 38992 -> 0 bytes .../__pycache__/intranges.cpython-311.pyc | Bin 3001 -> 0 bytes .../__pycache__/package_data.cpython-311.pyc | Bin 236 -> 0 bytes .../__pycache__/uts46data.cpython-311.pyc | Bin 163216 -> 0 bytes .../site-packages/pip/_vendor/idna/codec.py | 112 - .../site-packages/pip/_vendor/idna/compat.py | 13 - .../site-packages/pip/_vendor/idna/core.py | 400 - .../pip/_vendor/idna/idnadata.py | 2151 ----- .../pip/_vendor/idna/intranges.py | 54 - .../pip/_vendor/idna/package_data.py | 2 - .../pip/_vendor/idna/uts46data.py | 8600 ----------------- .../pip/_vendor/msgpack/__init__.py | 57 - .../__pycache__/__init__.cpython-311.pyc | Bin 2095 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 2396 -> 0 bytes .../msgpack/__pycache__/ext.cpython-311.pyc | Bin 9182 -> 0 bytes .../__pycache__/fallback.cpython-311.pyc | Bin 47209 -> 0 bytes .../pip/_vendor/msgpack/exceptions.py | 48 - .../site-packages/pip/_vendor/msgpack/ext.py | 193 - .../pip/_vendor/msgpack/fallback.py | 1010 -- .../pip/_vendor/packaging/__about__.py | 26 - .../pip/_vendor/packaging/__init__.py | 25 - .../__pycache__/__about__.cpython-311.pyc | Bin 660 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 581 -> 0 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 13247 -> 0 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 8015 -> 0 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 3703 -> 0 bytes .../__pycache__/markers.cpython-311.pyc | Bin 16543 -> 0 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 7658 -> 0 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 34381 -> 0 bytes .../__pycache__/tags.cpython-311.pyc | Bin 21366 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 6701 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 21893 -> 0 bytes .../pip/_vendor/packaging/_manylinux.py | 301 - .../pip/_vendor/packaging/_musllinux.py | 136 - .../pip/_vendor/packaging/_structures.py | 61 - .../pip/_vendor/packaging/markers.py | 304 - .../pip/_vendor/packaging/requirements.py | 146 - .../pip/_vendor/packaging/specifiers.py | 802 -- .../pip/_vendor/packaging/tags.py | 487 - .../pip/_vendor/packaging/utils.py | 136 - .../pip/_vendor/packaging/version.py | 504 - .../pip/_vendor/pep517/__init__.py | 6 - .../__pycache__/__init__.cpython-311.pyc | Bin 360 -> 0 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 413 -> 0 bytes .../pep517/__pycache__/build.cpython-311.pyc | Bin 6656 -> 0 bytes .../pep517/__pycache__/check.cpython-311.pyc | Bin 11818 -> 0 bytes .../__pycache__/colorlog.cpython-311.pyc | Bin 4863 -> 0 bytes .../__pycache__/dirtools.cpython-311.pyc | Bin 1341 -> 0 bytes .../__pycache__/envbuild.cpython-311.pyc | Bin 7500 -> 0 bytes .../pep517/__pycache__/meta.cpython-311.pyc | Bin 5767 -> 0 bytes .../__pycache__/wrappers.cpython-311.pyc | Bin 18315 -> 0 bytes .../pip/_vendor/pep517/_compat.py | 8 - .../site-packages/pip/_vendor/pep517/build.py | 126 - .../site-packages/pip/_vendor/pep517/check.py | 207 - .../pip/_vendor/pep517/colorlog.py | 113 - .../pip/_vendor/pep517/dirtools.py | 19 - .../pip/_vendor/pep517/envbuild.py | 170 - .../pip/_vendor/pep517/in_process/__init__.py | 26 - .../__pycache__/__init__.cpython-311.pyc | Bin 1807 -> 0 bytes .../__pycache__/_in_process.cpython-311.pyc | Bin 16496 -> 0 bytes .../_vendor/pep517/in_process/_in_process.py | 351 - .../site-packages/pip/_vendor/pep517/meta.py | 93 - .../pip/_vendor/pep517/wrappers.py | 362 - .../pip/_vendor/pkg_resources/__init__.py | 3296 ------- .../__pycache__/__init__.cpython-311.pyc | Bin 158249 -> 0 bytes .../__pycache__/py31compat.cpython-311.pyc | Bin 1002 -> 0 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 - .../pip/_vendor/platformdirs/__init__.py | 340 - .../pip/_vendor/platformdirs/__main__.py | 46 - .../__pycache__/__init__.cpython-311.pyc | Bin 12807 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 2145 -> 0 bytes .../__pycache__/android.cpython-311.pyc | Bin 6375 -> 0 bytes .../__pycache__/api.cpython-311.pyc | Bin 7202 -> 0 bytes .../__pycache__/macos.cpython-311.pyc | Bin 4612 -> 0 bytes .../__pycache__/unix.cpython-311.pyc | Bin 11043 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 328 -> 0 bytes .../__pycache__/windows.cpython-311.pyc | Bin 9850 -> 0 bytes .../pip/_vendor/platformdirs/android.py | 120 - .../pip/_vendor/platformdirs/api.py | 156 - .../pip/_vendor/platformdirs/macos.py | 64 - .../pip/_vendor/platformdirs/unix.py | 181 - .../pip/_vendor/platformdirs/version.py | 4 - .../pip/_vendor/platformdirs/windows.py | 182 - .../pip/_vendor/pygments/__init__.py | 82 - .../pip/_vendor/pygments/__main__.py | 17 - .../__pycache__/__init__.cpython-311.pyc | Bin 3863 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 799 -> 0 bytes .../__pycache__/cmdline.cpython-311.pyc | Bin 30310 -> 0 bytes .../__pycache__/console.cpython-311.pyc | Bin 3062 -> 0 bytes .../__pycache__/filter.cpython-311.pyc | Bin 3523 -> 0 bytes .../__pycache__/formatter.cpython-311.pyc | Bin 3889 -> 0 bytes .../__pycache__/lexer.cpython-311.pyc | Bin 40417 -> 0 bytes .../__pycache__/modeline.cpython-311.pyc | Bin 1742 -> 0 bytes .../__pycache__/plugin.cpython-311.pyc | Bin 3755 -> 0 bytes .../__pycache__/regexopt.cpython-311.pyc | Bin 5049 -> 0 bytes .../__pycache__/scanner.cpython-311.pyc | Bin 4904 -> 0 bytes .../__pycache__/sphinxext.cpython-311.pyc | Bin 8335 -> 0 bytes .../__pycache__/style.cpython-311.pyc | Bin 7443 -> 0 bytes .../__pycache__/token.cpython-311.pyc | Bin 7483 -> 0 bytes .../__pycache__/unistring.cpython-311.pyc | Bin 33817 -> 0 bytes .../pygments/__pycache__/util.cpython-311.pyc | Bin 14610 -> 0 bytes .../pip/_vendor/pygments/cmdline.py | 668 -- .../pip/_vendor/pygments/console.py | 70 - .../pip/_vendor/pygments/filter.py | 71 - .../pip/_vendor/pygments/filters/__init__.py | 940 -- .../__pycache__/__init__.cpython-311.pyc | Bin 40123 -> 0 bytes .../pip/_vendor/pygments/formatter.py | 94 - .../_vendor/pygments/formatters/__init__.py | 143 - .../__pycache__/__init__.cpython-311.pyc | Bin 6889 -> 0 bytes .../__pycache__/_mapping.cpython-311.pyc | Bin 4171 -> 0 bytes .../__pycache__/bbcode.cpython-311.pyc | Bin 4497 -> 0 bytes .../__pycache__/groff.cpython-311.pyc | Bin 7830 -> 0 bytes .../__pycache__/html.cpython-311.pyc | Bin 42615 -> 0 bytes .../__pycache__/img.cpython-311.pyc | Bin 28587 -> 0 bytes .../__pycache__/irc.cpython-311.pyc | Bin 7690 -> 0 bytes .../__pycache__/latex.cpython-311.pyc | Bin 21823 -> 0 bytes .../__pycache__/other.cpython-311.pyc | Bin 7651 -> 0 bytes .../__pycache__/pangomarkup.cpython-311.pyc | Bin 3195 -> 0 bytes .../__pycache__/rtf.cpython-311.pyc | Bin 6862 -> 0 bytes .../__pycache__/svg.cpython-311.pyc | Bin 9682 -> 0 bytes .../__pycache__/terminal.cpython-311.pyc | Bin 6061 -> 0 bytes .../__pycache__/terminal256.cpython-311.pyc | Bin 16427 -> 0 bytes .../_vendor/pygments/formatters/_mapping.py | 23 - .../pip/_vendor/pygments/formatters/bbcode.py | 108 - .../pip/_vendor/pygments/formatters/groff.py | 170 - .../pip/_vendor/pygments/formatters/html.py | 989 -- .../pip/_vendor/pygments/formatters/img.py | 645 -- .../pip/_vendor/pygments/formatters/irc.py | 179 - .../pip/_vendor/pygments/formatters/latex.py | 521 - .../pip/_vendor/pygments/formatters/other.py | 161 - .../pygments/formatters/pangomarkup.py | 83 - .../pip/_vendor/pygments/formatters/rtf.py | 146 - .../pip/_vendor/pygments/formatters/svg.py | 188 - .../_vendor/pygments/formatters/terminal.py | 127 - .../pygments/formatters/terminal256.py | 338 - .../pip/_vendor/pygments/lexer.py | 882 -- .../pip/_vendor/pygments/lexers/__init__.py | 335 - .../__pycache__/__init__.cpython-311.pyc | Bin 15166 -> 0 bytes .../__pycache__/_mapping.cpython-311.pyc | Bin 62797 -> 0 bytes .../lexers/__pycache__/python.cpython-311.pyc | Bin 43998 -> 0 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 541 -- .../pip/_vendor/pygments/lexers/python.py | 1204 --- .../pip/_vendor/pygments/modeline.py | 43 - .../pip/_vendor/pygments/plugin.py | 88 - .../pip/_vendor/pygments/regexopt.py | 91 - .../pip/_vendor/pygments/scanner.py | 104 - .../pip/_vendor/pygments/sphinxext.py | 155 - .../pip/_vendor/pygments/style.py | 197 - .../pip/_vendor/pygments/styles/__init__.py | 97 - .../__pycache__/__init__.cpython-311.pyc | Bin 4476 -> 0 bytes .../pip/_vendor/pygments/token.py | 213 - .../pip/_vendor/pygments/unistring.py | 153 - .../pip/_vendor/pygments/util.py | 308 - .../pip/_vendor/pyparsing/__init__.py | 331 - .../__pycache__/__init__.cpython-311.pyc | Bin 8366 -> 0 bytes .../__pycache__/actions.cpython-311.pyc | Bin 8480 -> 0 bytes .../__pycache__/common.cpython-311.pyc | Bin 14802 -> 0 bytes .../__pycache__/core.cpython-311.pyc | Bin 277688 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 12944 -> 0 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 53645 -> 0 bytes .../__pycache__/results.cpython-311.pyc | Bin 36328 -> 0 bytes .../__pycache__/testing.cpython-311.pyc | Bin 19524 -> 0 bytes .../__pycache__/unicode.cpython-311.pyc | Bin 15382 -> 0 bytes .../__pycache__/util.cpython-311.pyc | Bin 14281 -> 0 bytes .../pip/_vendor/pyparsing/actions.py | 207 - .../pip/_vendor/pyparsing/common.py | 424 - .../pip/_vendor/pyparsing/core.py | 5814 ----------- .../pip/_vendor/pyparsing/diagram/__init__.py | 642 -- .../__pycache__/__init__.cpython-311.pyc | Bin 28047 -> 0 bytes .../pip/_vendor/pyparsing/exceptions.py | 267 - .../pip/_vendor/pyparsing/helpers.py | 1088 --- .../pip/_vendor/pyparsing/results.py | 760 -- .../pip/_vendor/pyparsing/testing.py | 331 - .../pip/_vendor/pyparsing/unicode.py | 352 - .../pip/_vendor/pyparsing/util.py | 235 - .../pip/_vendor/requests/__init__.py | 182 - .../__pycache__/__init__.cpython-311.pyc | Bin 6468 -> 0 bytes .../__pycache__/__version__.cpython-311.pyc | Bin 610 -> 0 bytes .../_internal_utils.cpython-311.pyc | Bin 2102 -> 0 bytes .../__pycache__/adapters.cpython-311.pyc | Bin 24905 -> 0 bytes .../requests/__pycache__/api.cpython-311.pyc | Bin 7450 -> 0 bytes .../requests/__pycache__/auth.cpython-311.pyc | Bin 14649 -> 0 bytes .../__pycache__/certs.cpython-311.pyc | Bin 1001 -> 0 bytes .../__pycache__/compat.cpython-311.pyc | Bin 1827 -> 0 bytes .../__pycache__/cookies.cpython-311.pyc | Bin 27129 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 8544 -> 0 bytes .../requests/__pycache__/help.cpython-311.pyc | Bin 4539 -> 0 bytes .../__pycache__/hooks.cpython-311.pyc | Bin 1269 -> 0 bytes .../__pycache__/models.cpython-311.pyc | Bin 38799 -> 0 bytes .../__pycache__/packages.cpython-311.pyc | Bin 849 -> 0 bytes .../__pycache__/sessions.cpython-311.pyc | Bin 29638 -> 0 bytes .../__pycache__/status_codes.cpython-311.pyc | Bin 6256 -> 0 bytes .../__pycache__/structures.cpython-311.pyc | Bin 6241 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 40155 -> 0 bytes .../pip/_vendor/requests/__version__.py | 14 - .../pip/_vendor/requests/_internal_utils.py | 48 - .../pip/_vendor/requests/adapters.py | 584 -- .../site-packages/pip/_vendor/requests/api.py | 157 - .../pip/_vendor/requests/auth.py | 315 - .../pip/_vendor/requests/certs.py | 24 - .../pip/_vendor/requests/compat.py | 67 - .../pip/_vendor/requests/cookies.py | 561 -- .../pip/_vendor/requests/exceptions.py | 141 - .../pip/_vendor/requests/help.py | 131 - .../pip/_vendor/requests/hooks.py | 33 - .../pip/_vendor/requests/models.py | 1034 -- .../pip/_vendor/requests/packages.py | 16 - .../pip/_vendor/requests/sessions.py | 831 -- .../pip/_vendor/requests/status_codes.py | 128 - .../pip/_vendor/requests/structures.py | 99 - .../pip/_vendor/requests/utils.py | 1086 --- .../pip/_vendor/resolvelib/__init__.py | 26 - .../__pycache__/__init__.cpython-311.pyc | Bin 772 -> 0 bytes .../__pycache__/providers.cpython-311.pyc | Bin 7091 -> 0 bytes .../__pycache__/reporters.cpython-311.pyc | Bin 2821 -> 0 bytes .../__pycache__/resolvers.cpython-311.pyc | Bin 25267 -> 0 bytes .../__pycache__/structs.cpython-311.pyc | Bin 11349 -> 0 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 227 -> 0 bytes .../collections_abc.cpython-311.pyc | Bin 502 -> 0 bytes .../resolvelib/compat/collections_abc.py | 6 - .../pip/_vendor/resolvelib/providers.py | 133 - .../pip/_vendor/resolvelib/reporters.py | 43 - .../pip/_vendor/resolvelib/resolvers.py | 482 - .../pip/_vendor/resolvelib/structs.py | 165 - .../pip/_vendor/rich/__init__.py | 176 - .../pip/_vendor/rich/__main__.py | 282 - .../rich/__pycache__/__init__.cpython-311.pyc | Bin 7376 -> 0 bytes .../rich/__pycache__/__main__.cpython-311.pyc | Bin 11764 -> 0 bytes .../__pycache__/_cell_widths.cpython-311.pyc | Bin 7854 -> 0 bytes .../__pycache__/_emoji_codes.cpython-311.pyc | Bin 208541 -> 0 bytes .../_emoji_replace.cpython-311.pyc | Bin 1953 -> 0 bytes .../_export_format.cpython-311.pyc | Bin 2358 -> 0 bytes .../__pycache__/_extension.cpython-311.pyc | Bin 654 -> 0 bytes .../rich/__pycache__/_inspect.cpython-311.pyc | Bin 14206 -> 0 bytes .../__pycache__/_log_render.cpython-311.pyc | Bin 4788 -> 0 bytes .../rich/__pycache__/_loop.cpython-311.pyc | Bin 2134 -> 0 bytes .../__pycache__/_palettes.cpython-311.pyc | Bin 5270 -> 0 bytes .../rich/__pycache__/_pick.cpython-311.pyc | Bin 815 -> 0 bytes .../rich/__pycache__/_ratio.cpython-311.pyc | Bin 7953 -> 0 bytes .../__pycache__/_spinners.cpython-311.pyc | Bin 13703 -> 0 bytes .../rich/__pycache__/_stack.cpython-311.pyc | Bin 1149 -> 0 bytes .../rich/__pycache__/_timer.cpython-311.pyc | Bin 1002 -> 0 bytes .../_win32_console.cpython-311.pyc | Bin 30190 -> 0 bytes .../rich/__pycache__/_windows.cpython-311.pyc | Bin 2849 -> 0 bytes .../_windows_renderer.cpython-311.pyc | Bin 4040 -> 0 bytes .../rich/__pycache__/_wrap.cpython-311.pyc | Bin 2805 -> 0 bytes .../rich/__pycache__/abc.cpython-311.pyc | Bin 1946 -> 0 bytes .../rich/__pycache__/align.cpython-311.pyc | Bin 13495 -> 0 bytes .../rich/__pycache__/ansi.cpython-311.pyc | Bin 10472 -> 0 bytes .../rich/__pycache__/bar.cpython-311.pyc | Bin 4568 -> 0 bytes .../rich/__pycache__/box.cpython-311.pyc | Bin 13010 -> 0 bytes .../rich/__pycache__/cells.cpython-311.pyc | Bin 6460 -> 0 bytes .../rich/__pycache__/color.cpython-311.pyc | Bin 27402 -> 0 bytes .../__pycache__/color_triplet.cpython-311.pyc | Bin 1894 -> 0 bytes .../rich/__pycache__/columns.cpython-311.pyc | Bin 10665 -> 0 bytes .../rich/__pycache__/console.cpython-311.pyc | Bin 121284 -> 0 bytes .../__pycache__/constrain.cpython-311.pyc | Bin 2486 -> 0 bytes .../__pycache__/containers.cpython-311.pyc | Bin 10827 -> 0 bytes .../rich/__pycache__/control.cpython-311.pyc | Bin 11918 -> 0 bytes .../default_styles.cpython-311.pyc | Bin 12518 -> 0 bytes .../rich/__pycache__/diagnose.cpython-311.pyc | Bin 1841 -> 0 bytes .../rich/__pycache__/emoji.cpython-311.pyc | Bin 4819 -> 0 bytes .../rich/__pycache__/errors.cpython-311.pyc | Bin 2350 -> 0 bytes .../__pycache__/file_proxy.cpython-311.pyc | Bin 3798 -> 0 bytes .../rich/__pycache__/filesize.cpython-311.pyc | Bin 3321 -> 0 bytes .../__pycache__/highlighter.cpython-311.pyc | Bin 11009 -> 0 bytes .../rich/__pycache__/json.cpython-311.pyc | Bin 6702 -> 0 bytes .../rich/__pycache__/jupyter.cpython-311.pyc | Bin 6425 -> 0 bytes .../rich/__pycache__/layout.cpython-311.pyc | Bin 23404 -> 0 bytes .../rich/__pycache__/live.cpython-311.pyc | Bin 21153 -> 0 bytes .../__pycache__/live_render.cpython-311.pyc | Bin 5166 -> 0 bytes .../rich/__pycache__/logging.cpython-311.pyc | Bin 14255 -> 0 bytes .../rich/__pycache__/markup.cpython-311.pyc | Bin 10459 -> 0 bytes .../rich/__pycache__/measure.cpython-311.pyc | Bin 7292 -> 0 bytes .../rich/__pycache__/padding.cpython-311.pyc | Bin 7508 -> 0 bytes .../rich/__pycache__/pager.cpython-311.pyc | Bin 2266 -> 0 bytes .../rich/__pycache__/palette.cpython-311.pyc | Bin 5999 -> 0 bytes .../rich/__pycache__/panel.cpython-311.pyc | Bin 11180 -> 0 bytes .../rich/__pycache__/pretty.cpython-311.pyc | Bin 43858 -> 0 bytes .../rich/__pycache__/progress.cpython-311.pyc | Bin 82521 -> 0 bytes .../__pycache__/progress_bar.cpython-311.pyc | Bin 11029 -> 0 bytes .../rich/__pycache__/prompt.cpython-311.pyc | Bin 16399 -> 0 bytes .../rich/__pycache__/protocol.cpython-311.pyc | Bin 2117 -> 0 bytes .../rich/__pycache__/region.cpython-311.pyc | Bin 680 -> 0 bytes .../rich/__pycache__/repr.cpython-311.pyc | Bin 7701 -> 0 bytes .../rich/__pycache__/rule.cpython-311.pyc | Bin 7718 -> 0 bytes .../rich/__pycache__/scope.cpython-311.pyc | Bin 4371 -> 0 bytes .../rich/__pycache__/screen.cpython-311.pyc | Bin 2795 -> 0 bytes .../rich/__pycache__/segment.cpython-311.pyc | Bin 31562 -> 0 bytes .../rich/__pycache__/spinner.cpython-311.pyc | Bin 6911 -> 0 bytes .../rich/__pycache__/status.cpython-311.pyc | Bin 6779 -> 0 bytes .../rich/__pycache__/style.cpython-311.pyc | Bin 34160 -> 0 bytes .../rich/__pycache__/styled.cpython-311.pyc | Bin 2460 -> 0 bytes .../rich/__pycache__/syntax.cpython-311.pyc | Bin 41988 -> 0 bytes .../rich/__pycache__/table.cpython-311.pyc | Bin 48515 -> 0 bytes .../terminal_theme.cpython-311.pyc | Bin 3726 -> 0 bytes .../rich/__pycache__/text.cpython-311.pyc | Bin 64112 -> 0 bytes .../rich/__pycache__/theme.cpython-311.pyc | Bin 7164 -> 0 bytes .../rich/__pycache__/themes.cpython-311.pyc | Bin 376 -> 0 bytes .../__pycache__/traceback.cpython-311.pyc | Bin 31743 -> 0 bytes .../rich/__pycache__/tree.cpython-311.pyc | Bin 12547 -> 0 bytes .../pip/_vendor/rich/_cell_widths.py | 451 - .../pip/_vendor/rich/_emoji_codes.py | 3610 ------- .../pip/_vendor/rich/_emoji_replace.py | 32 - .../pip/_vendor/rich/_export_format.py | 78 - .../pip/_vendor/rich/_extension.py | 10 - .../pip/_vendor/rich/_inspect.py | 270 - .../pip/_vendor/rich/_log_render.py | 94 - .../site-packages/pip/_vendor/rich/_loop.py | 43 - .../pip/_vendor/rich/_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 - .../Lib/site-packages/pip/_vendor/rich/abc.py | 33 - .../site-packages/pip/_vendor/rich/align.py | 311 - .../site-packages/pip/_vendor/rich/ansi.py | 237 - .../Lib/site-packages/pip/_vendor/rich/bar.py | 94 - .../Lib/site-packages/pip/_vendor/rich/box.py | 517 - .../site-packages/pip/_vendor/rich/cells.py | 154 - .../site-packages/pip/_vendor/rich/color.py | 615 -- .../pip/_vendor/rich/color_triplet.py | 38 - .../site-packages/pip/_vendor/rich/columns.py | 187 - .../site-packages/pip/_vendor/rich/console.py | 2572 ----- .../pip/_vendor/rich/constrain.py | 37 - .../pip/_vendor/rich/containers.py | 167 - .../site-packages/pip/_vendor/rich/control.py | 225 - .../pip/_vendor/rich/default_styles.py | 188 - .../pip/_vendor/rich/diagnose.py | 37 - .../site-packages/pip/_vendor/rich/emoji.py | 96 - .../site-packages/pip/_vendor/rich/errors.py | 34 - .../pip/_vendor/rich/file_proxy.py | 54 - .../pip/_vendor/rich/filesize.py | 89 - .../pip/_vendor/rich/highlighter.py | 232 - .../site-packages/pip/_vendor/rich/json.py | 140 - .../site-packages/pip/_vendor/rich/jupyter.py | 101 - .../site-packages/pip/_vendor/rich/layout.py | 445 - .../site-packages/pip/_vendor/rich/live.py | 373 - .../pip/_vendor/rich/live_render.py | 113 - .../site-packages/pip/_vendor/rich/logging.py | 280 - .../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 | 251 - .../site-packages/pip/_vendor/rich/pretty.py | 1010 -- .../pip/_vendor/rich/progress.py | 1703 ---- .../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 | 152 - .../site-packages/pip/_vendor/rich/rule.py | 134 - .../site-packages/pip/_vendor/rich/scope.py | 86 - .../site-packages/pip/_vendor/rich/screen.py | 54 - .../site-packages/pip/_vendor/rich/segment.py | 739 -- .../site-packages/pip/_vendor/rich/spinner.py | 136 - .../site-packages/pip/_vendor/rich/status.py | 132 - .../site-packages/pip/_vendor/rich/style.py | 771 -- .../site-packages/pip/_vendor/rich/styled.py | 42 - .../site-packages/pip/_vendor/rich/syntax.py | 934 -- .../site-packages/pip/_vendor/rich/table.py | 996 -- .../pip/_vendor/rich/terminal_theme.py | 153 - .../site-packages/pip/_vendor/rich/text.py | 1286 --- .../site-packages/pip/_vendor/rich/theme.py | 112 - .../site-packages/pip/_vendor/rich/themes.py | 5 - .../pip/_vendor/rich/traceback.py | 679 -- .../site-packages/pip/_vendor/rich/tree.py | 251 - .venv/Lib/site-packages/pip/_vendor/six.py | 998 -- .../pip/_vendor/tenacity/__init__.py | 519 - .../__pycache__/__init__.cpython-311.pyc | Bin 27814 -> 0 bytes .../__pycache__/_asyncio.cpython-311.pyc | Bin 4821 -> 0 bytes .../__pycache__/_utils.cpython-311.pyc | Bin 2086 -> 0 bytes .../__pycache__/after.cpython-311.pyc | Bin 1713 -> 0 bytes .../__pycache__/before.cpython-311.pyc | Bin 1547 -> 0 bytes .../__pycache__/before_sleep.cpython-311.pyc | Bin 2124 -> 0 bytes .../tenacity/__pycache__/nap.cpython-311.pyc | Bin 1586 -> 0 bytes .../__pycache__/retry.cpython-311.pyc | Bin 15060 -> 0 bytes .../tenacity/__pycache__/stop.cpython-311.pyc | Bin 5914 -> 0 bytes .../__pycache__/tornadoweb.cpython-311.pyc | Bin 2932 -> 0 bytes .../tenacity/__pycache__/wait.cpython-311.pyc | Bin 13386 -> 0 bytes .../pip/_vendor/tenacity/_asyncio.py | 92 - .../pip/_vendor/tenacity/_utils.py | 68 - .../pip/_vendor/tenacity/after.py | 46 - .../pip/_vendor/tenacity/before.py | 41 - .../pip/_vendor/tenacity/before_sleep.py | 58 - .../site-packages/pip/_vendor/tenacity/nap.py | 43 - .../pip/_vendor/tenacity/retry.py | 240 - .../pip/_vendor/tenacity/stop.py | 96 - .../pip/_vendor/tenacity/tornadoweb.py | 59 - .../pip/_vendor/tenacity/wait.py | 232 - .../pip/_vendor/tomli/__init__.py | 11 - .../__pycache__/__init__.cpython-311.pyc | Bin 431 -> 0 bytes .../tomli/__pycache__/_parser.cpython-311.pyc | Bin 30870 -> 0 bytes .../tomli/__pycache__/_re.cpython-311.pyc | Bin 4510 -> 0 bytes .../tomli/__pycache__/_types.cpython-311.pyc | Bin 423 -> 0 bytes .../pip/_vendor/tomli/_parser.py | 691 -- .../site-packages/pip/_vendor/tomli/_re.py | 107 - .../site-packages/pip/_vendor/tomli/_types.py | 10 - .../pip/_vendor/typing_extensions.py | 2209 ----- .../pip/_vendor/urllib3/__init__.py | 102 - .../__pycache__/__init__.cpython-311.pyc | Bin 3729 -> 0 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 18317 -> 0 bytes .../__pycache__/_version.cpython-311.pyc | Bin 239 -> 0 bytes .../__pycache__/connection.cpython-311.pyc | Bin 21913 -> 0 bytes .../connectionpool.cpython-311.pyc | Bin 37654 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 16143 -> 0 bytes .../__pycache__/fields.cpython-311.pyc | Bin 11436 -> 0 bytes .../__pycache__/filepost.cpython-311.pyc | Bin 4517 -> 0 bytes .../__pycache__/poolmanager.cpython-311.pyc | Bin 21840 -> 0 bytes .../__pycache__/request.cpython-311.pyc | Bin 6680 -> 0 bytes .../__pycache__/response.cpython-311.pyc | Bin 35995 -> 0 bytes .../pip/_vendor/urllib3/_collections.py | 337 - .../pip/_vendor/urllib3/_version.py | 2 - .../pip/_vendor/urllib3/connection.py | 567 -- .../pip/_vendor/urllib3/connectionpool.py | 1110 --- .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 225 -> 0 bytes .../_appengine_environ.cpython-311.pyc | Bin 1964 -> 0 bytes .../__pycache__/appengine.cpython-311.pyc | Bin 12159 -> 0 bytes .../__pycache__/ntlmpool.cpython-311.pyc | Bin 6323 -> 0 bytes .../__pycache__/pyopenssl.cpython-311.pyc | Bin 25661 -> 0 bytes .../securetransport.cpython-311.pyc | Bin 36864 -> 0 bytes .../contrib/__pycache__/socks.cpython-311.pyc | Bin 8109 -> 0 bytes .../urllib3/contrib/_appengine_environ.py | 36 - .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 242 -> 0 bytes .../__pycache__/bindings.cpython-311.pyc | Bin 16989 -> 0 bytes .../__pycache__/low_level.cpython-311.pyc | Bin 15626 -> 0 bytes .../contrib/_securetransport/bindings.py | 519 - .../contrib/_securetransport/low_level.py | 397 - .../pip/_vendor/urllib3/contrib/appengine.py | 314 - .../pip/_vendor/urllib3/contrib/ntlmpool.py | 130 - .../pip/_vendor/urllib3/contrib/pyopenssl.py | 519 - .../urllib3/contrib/securetransport.py | 921 -- .../pip/_vendor/urllib3/contrib/socks.py | 216 - .../pip/_vendor/urllib3/exceptions.py | 323 - .../pip/_vendor/urllib3/fields.py | 274 - .../pip/_vendor/urllib3/filepost.py | 98 - .../pip/_vendor/urllib3/packages/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 226 -> 0 bytes .../packages/__pycache__/six.cpython-311.pyc | Bin 46468 -> 0 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 236 -> 0 bytes .../__pycache__/makefile.cpython-311.pyc | Bin 1983 -> 0 bytes .../urllib3/packages/backports/makefile.py | 51 - .../pip/_vendor/urllib3/packages/six.py | 1076 --- .../pip/_vendor/urllib3/poolmanager.py | 537 - .../pip/_vendor/urllib3/request.py | 170 - .../pip/_vendor/urllib3/response.py | 866 -- .../pip/_vendor/urllib3/util/__init__.py | 49 - .../util/__pycache__/__init__.cpython-311.pyc | Bin 1428 -> 0 bytes .../__pycache__/connection.cpython-311.pyc | Bin 5155 -> 0 bytes .../util/__pycache__/proxy.cpython-311.pyc | Bin 1737 -> 0 bytes .../util/__pycache__/queue.cpython-311.pyc | Bin 1520 -> 0 bytes .../util/__pycache__/request.cpython-311.pyc | Bin 4640 -> 0 bytes .../util/__pycache__/response.cpython-311.pyc | Bin 3509 -> 0 bytes .../util/__pycache__/retry.cpython-311.pyc | Bin 22761 -> 0 bytes .../util/__pycache__/ssl_.cpython-311.pyc | Bin 16840 -> 0 bytes .../ssl_match_hostname.cpython-311.pyc | Bin 5819 -> 0 bytes .../__pycache__/ssltransport.cpython-311.pyc | Bin 11648 -> 0 bytes .../util/__pycache__/timeout.cpython-311.pyc | Bin 11056 -> 0 bytes .../util/__pycache__/url.cpython-311.pyc | Bin 17569 -> 0 bytes .../util/__pycache__/wait.cpython-311.pyc | Bin 5022 -> 0 bytes .../pip/_vendor/urllib3/util/connection.py | 149 - .../pip/_vendor/urllib3/util/proxy.py | 57 - .../pip/_vendor/urllib3/util/queue.py | 22 - .../pip/_vendor/urllib3/util/request.py | 137 - .../pip/_vendor/urllib3/util/response.py | 107 - .../pip/_vendor/urllib3/util/retry.py | 620 -- .../pip/_vendor/urllib3/util/ssl_.py | 495 - .../urllib3/util/ssl_match_hostname.py | 159 - .../pip/_vendor/urllib3/util/ssltransport.py | 221 - .../pip/_vendor/urllib3/util/timeout.py | 268 - .../pip/_vendor/urllib3/util/url.py | 435 - .../pip/_vendor/urllib3/util/wait.py | 152 - .../Lib/site-packages/pip/_vendor/vendor.txt | 23 - .../pip/_vendor/webencodings/__init__.py | 342 - .../__pycache__/__init__.cpython-311.pyc | Bin 12902 -> 0 bytes .../__pycache__/labels.cpython-311.pyc | Bin 7302 -> 0 bytes .../__pycache__/mklabels.cpython-311.pyc | Bin 3230 -> 0 bytes .../__pycache__/tests.cpython-311.pyc | Bin 11208 -> 0 bytes .../x_user_defined.cpython-311.pyc | Bin 3582 -> 0 bytes .../pip/_vendor/webencodings/labels.py | 231 - .../pip/_vendor/webencodings/mklabels.py | 59 - .../pip/_vendor/webencodings/tests.py | 153 - .../_vendor/webencodings/x_user_defined.py | 325 - .venv/Lib/site-packages/pip/py.typed | 4 - .../site-packages/pkg_resources/__init__.py | 3296 ------- .../__pycache__/__init__.cpython-311.pyc | Bin 159591 -> 0 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 219 -> 0 bytes .../__pycache__/appdirs.cpython-311.pyc | Bin 29467 -> 0 bytes .../_vendor/__pycache__/zipp.cpython-311.pyc | Bin 16012 -> 0 bytes .../pkg_resources/_vendor/appdirs.py | 608 -- .../_vendor/importlib_resources/__init__.py | 36 - .../__pycache__/__init__.cpython-311.pyc | Bin 853 -> 0 bytes .../__pycache__/_adapters.cpython-311.pyc | Bin 10770 -> 0 bytes .../__pycache__/_common.cpython-311.pyc | Bin 4297 -> 0 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 5582 -> 0 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 1415 -> 0 bytes .../__pycache__/_legacy.cpython-311.pyc | Bin 6513 -> 0 bytes .../__pycache__/abc.cpython-311.pyc | Bin 7514 -> 0 bytes .../__pycache__/readers.cpython-311.pyc | Bin 8388 -> 0 bytes .../__pycache__/simple.cpython-311.pyc | Bin 6410 -> 0 bytes .../_vendor/importlib_resources/_adapters.py | 170 - .../_vendor/importlib_resources/_common.py | 104 - .../_vendor/importlib_resources/_compat.py | 98 - .../_vendor/importlib_resources/_itertools.py | 35 - .../_vendor/importlib_resources/_legacy.py | 121 - .../_vendor/importlib_resources/abc.py | 137 - .../_vendor/importlib_resources/readers.py | 122 - .../_vendor/importlib_resources/simple.py | 116 - .../pkg_resources/_vendor/jaraco/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 226 -> 0 bytes .../__pycache__/context.cpython-311.pyc | Bin 9449 -> 0 bytes .../__pycache__/functools.cpython-311.pyc | Bin 20312 -> 0 bytes .../pkg_resources/_vendor/jaraco/context.py | 213 - .../pkg_resources/_vendor/jaraco/functools.py | 525 - .../_vendor/jaraco/text/__init__.py | 599 -- .../text/__pycache__/__init__.cpython-311.pyc | Bin 26629 -> 0 bytes .../_vendor/more_itertools/__init__.py | 4 - .../__pycache__/__init__.cpython-311.pyc | Bin 320 -> 0 bytes .../__pycache__/more.cpython-311.pyc | Bin 167981 -> 0 bytes .../__pycache__/recipes.cpython-311.pyc | Bin 26972 -> 0 bytes .../_vendor/more_itertools/more.py | 4316 --------- .../_vendor/more_itertools/recipes.py | 698 -- .../_vendor/packaging/__about__.py | 26 - .../_vendor/packaging/__init__.py | 25 - .../__pycache__/__about__.cpython-311.pyc | Bin 670 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 591 -> 0 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 13257 -> 0 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 8025 -> 0 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 3713 -> 0 bytes .../__pycache__/markers.cpython-311.pyc | Bin 16562 -> 0 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 7677 -> 0 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 34391 -> 0 bytes .../__pycache__/tags.cpython-311.pyc | Bin 21376 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 6711 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 21903 -> 0 bytes .../_vendor/packaging/_manylinux.py | 301 - .../_vendor/packaging/_musllinux.py | 136 - .../_vendor/packaging/_structures.py | 61 - .../_vendor/packaging/markers.py | 304 - .../_vendor/packaging/requirements.py | 146 - .../_vendor/packaging/specifiers.py | 802 -- .../pkg_resources/_vendor/packaging/tags.py | 487 - .../pkg_resources/_vendor/packaging/utils.py | 136 - .../_vendor/packaging/version.py | 504 - .../_vendor/pyparsing/__init__.py | 331 - .../__pycache__/__init__.cpython-311.pyc | Bin 8364 -> 0 bytes .../__pycache__/actions.cpython-311.pyc | Bin 8490 -> 0 bytes .../__pycache__/common.cpython-311.pyc | Bin 14812 -> 0 bytes .../__pycache__/core.cpython-311.pyc | Bin 277664 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 12954 -> 0 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 53655 -> 0 bytes .../__pycache__/results.cpython-311.pyc | Bin 36338 -> 0 bytes .../__pycache__/testing.cpython-311.pyc | Bin 19534 -> 0 bytes .../__pycache__/unicode.cpython-311.pyc | Bin 15392 -> 0 bytes .../__pycache__/util.cpython-311.pyc | Bin 14291 -> 0 bytes .../_vendor/pyparsing/actions.py | 207 - .../pkg_resources/_vendor/pyparsing/common.py | 424 - .../pkg_resources/_vendor/pyparsing/core.py | 5814 ----------- .../_vendor/pyparsing/diagram/__init__.py | 642 -- .../__pycache__/__init__.cpython-311.pyc | Bin 28027 -> 0 bytes .../_vendor/pyparsing/exceptions.py | 267 - .../_vendor/pyparsing/helpers.py | 1088 --- .../_vendor/pyparsing/results.py | 760 -- .../_vendor/pyparsing/testing.py | 331 - .../_vendor/pyparsing/unicode.py | 352 - .../pkg_resources/_vendor/pyparsing/util.py | 235 - .../pkg_resources/_vendor/zipp.py | 329 - .../pkg_resources/extern/__init__.py | 76 - .../__pycache__/__init__.cpython-311.pyc | Bin 4338 -> 0 bytes .../setuptools-65.5.0.dist-info/INSTALLER | 1 - .../setuptools-65.5.0.dist-info/LICENSE | 19 - .../setuptools-65.5.0.dist-info/METADATA | 144 - .../setuptools-65.5.0.dist-info/RECORD | 466 - .../setuptools-65.5.0.dist-info/REQUESTED | 0 .../setuptools-65.5.0.dist-info/WHEEL | 5 - .../entry_points.txt | 57 - .../setuptools-65.5.0.dist-info/top_level.txt | 3 - .../Lib/site-packages/setuptools/__init__.py | 247 - .../__pycache__/__init__.cpython-311.pyc | Bin 12928 -> 0 bytes .../_deprecation_warning.cpython-311.pyc | Bin 663 -> 0 bytes .../__pycache__/_entry_points.cpython-311.pyc | Bin 4812 -> 0 bytes .../__pycache__/_imp.cpython-311.pyc | Bin 3676 -> 0 bytes .../__pycache__/_importlib.cpython-311.pyc | Bin 1976 -> 0 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 1175 -> 0 bytes .../__pycache__/_path.cpython-311.pyc | Bin 1496 -> 0 bytes .../__pycache__/_reqs.cpython-311.pyc | Bin 1157 -> 0 bytes .../__pycache__/archive_util.cpython-311.pyc | Bin 10185 -> 0 bytes .../__pycache__/build_meta.cpython-311.pyc | Bin 28118 -> 0 bytes .../__pycache__/dep_util.cpython-311.pyc | Bin 1311 -> 0 bytes .../__pycache__/depends.cpython-311.pyc | Bin 7996 -> 0 bytes .../__pycache__/discovery.cpython-311.pyc | Bin 31140 -> 0 bytes .../__pycache__/dist.cpython-311.pyc | Bin 64078 -> 0 bytes .../__pycache__/errors.cpython-311.pyc | Bin 2972 -> 0 bytes .../__pycache__/extension.cpython-311.pyc | Bin 6828 -> 0 bytes .../__pycache__/glob.cpython-311.pyc | Bin 6585 -> 0 bytes .../__pycache__/installer.cpython-311.pyc | Bin 5635 -> 0 bytes .../__pycache__/launch.cpython-311.pyc | Bin 1551 -> 0 bytes .../__pycache__/logging.cpython-311.pyc | Bin 2069 -> 0 bytes .../__pycache__/monkey.cpython-311.pyc | Bin 7028 -> 0 bytes .../__pycache__/msvc.cpython-311.pyc | Bin 64201 -> 0 bytes .../__pycache__/namespaces.cpython-311.pyc | Bin 5683 -> 0 bytes .../__pycache__/package_index.cpython-311.pyc | Bin 60778 -> 0 bytes .../__pycache__/py34compat.cpython-311.pyc | Bin 738 -> 0 bytes .../__pycache__/sandbox.cpython-311.pyc | Bin 27354 -> 0 bytes .../__pycache__/unicode_utils.cpython-311.pyc | Bin 1840 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 458 -> 0 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 15514 -> 0 bytes .../windows_support.cpython-311.pyc | Bin 1455 -> 0 bytes .../setuptools/_deprecation_warning.py | 7 - .../setuptools/_distutils/__init__.py | 24 - .../__pycache__/__init__.cpython-311.pyc | Bin 793 -> 0 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 2943 -> 0 bytes .../__pycache__/_functools.cpython-311.pyc | Bin 884 -> 0 bytes .../__pycache__/_macos_compat.cpython-311.pyc | Bin 593 -> 0 bytes .../__pycache__/_msvccompiler.cpython-311.pyc | Bin 25128 -> 0 bytes .../__pycache__/archive_util.cpython-311.pyc | Bin 10680 -> 0 bytes .../__pycache__/bcppcompiler.cpython-311.pyc | Bin 13506 -> 0 bytes .../__pycache__/ccompiler.cpython-311.pyc | Bin 46405 -> 0 bytes .../__pycache__/cmd.cpython-311.pyc | Bin 18919 -> 0 bytes .../__pycache__/config.cpython-311.pyc | Bin 6068 -> 0 bytes .../__pycache__/core.cpython-311.pyc | Bin 10012 -> 0 bytes .../cygwinccompiler.cpython-311.pyc | Bin 13636 -> 0 bytes .../__pycache__/debug.cpython-311.pyc | Bin 345 -> 0 bytes .../__pycache__/dep_util.cpython-311.pyc | Bin 4012 -> 0 bytes .../__pycache__/dir_util.cpython-311.pyc | Bin 10387 -> 0 bytes .../__pycache__/dist.cpython-311.pyc | Bin 55434 -> 0 bytes .../__pycache__/errors.cpython-311.pyc | Bin 6818 -> 0 bytes .../__pycache__/extension.cpython-311.pyc | Bin 10199 -> 0 bytes .../__pycache__/fancy_getopt.cpython-311.pyc | Bin 17263 -> 0 bytes .../__pycache__/file_util.cpython-311.pyc | Bin 10707 -> 0 bytes .../__pycache__/filelist.cpython-311.pyc | Bin 17653 -> 0 bytes .../__pycache__/log.cpython-311.pyc | Bin 3953 -> 0 bytes .../__pycache__/msvc9compiler.cpython-311.pyc | Bin 33611 -> 0 bytes .../__pycache__/msvccompiler.cpython-311.pyc | Bin 27013 -> 0 bytes .../__pycache__/py38compat.cpython-311.pyc | Bin 645 -> 0 bytes .../__pycache__/py39compat.cpython-311.pyc | Bin 1013 -> 0 bytes .../__pycache__/spawn.cpython-311.pyc | Bin 4482 -> 0 bytes .../__pycache__/sysconfig.cpython-311.pyc | Bin 22009 -> 0 bytes .../__pycache__/text_file.cpython-311.pyc | Bin 11294 -> 0 bytes .../__pycache__/unixccompiler.cpython-311.pyc | Bin 16550 -> 0 bytes .../__pycache__/util.cpython-311.pyc | Bin 20904 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 11370 -> 0 bytes .../versionpredicate.cpython-311.pyc | Bin 7770 -> 0 bytes .../setuptools/_distutils/_collections.py | 56 - .../setuptools/_distutils/_functools.py | 20 - .../setuptools/_distutils/_macos_compat.py | 12 - .../setuptools/_distutils/_msvccompiler.py | 572 -- .../setuptools/_distutils/archive_util.py | 280 - .../setuptools/_distutils/bcppcompiler.py | 408 - .../setuptools/_distutils/ccompiler.py | 1220 --- .../setuptools/_distutils/cmd.py | 436 - .../setuptools/_distutils/command/__init__.py | 25 - .../__pycache__/__init__.cpython-311.pyc | Bin 565 -> 0 bytes .../_framework_compat.cpython-311.pyc | Bin 2806 -> 0 bytes .../command/__pycache__/bdist.cpython-311.pyc | Bin 6059 -> 0 bytes .../__pycache__/bdist_dumb.cpython-311.pyc | Bin 5784 -> 0 bytes .../__pycache__/bdist_rpm.cpython-311.pyc | Bin 23318 -> 0 bytes .../command/__pycache__/build.cpython-311.pyc | Bin 6114 -> 0 bytes .../__pycache__/build_clib.cpython-311.pyc | Bin 7817 -> 0 bytes .../__pycache__/build_ext.cpython-311.pyc | Bin 30359 -> 0 bytes .../__pycache__/build_py.cpython-311.pyc | Bin 17635 -> 0 bytes .../__pycache__/build_scripts.cpython-311.pyc | Bin 7886 -> 0 bytes .../command/__pycache__/check.cpython-311.pyc | Bin 7548 -> 0 bytes .../command/__pycache__/clean.cpython-311.pyc | Bin 3216 -> 0 bytes .../__pycache__/config.cpython-311.pyc | Bin 16279 -> 0 bytes .../__pycache__/install.cpython-311.pyc | Bin 29467 -> 0 bytes .../__pycache__/install_data.cpython-311.pyc | Bin 3801 -> 0 bytes .../install_egg_info.cpython-311.pyc | Bin 5227 -> 0 bytes .../install_headers.cpython-311.pyc | Bin 2384 -> 0 bytes .../__pycache__/install_lib.cpython-311.pyc | Bin 8716 -> 0 bytes .../install_scripts.cpython-311.pyc | Bin 3181 -> 0 bytes .../__pycache__/py37compat.cpython-311.pyc | Bin 1562 -> 0 bytes .../__pycache__/register.cpython-311.pyc | Bin 15548 -> 0 bytes .../command/__pycache__/sdist.cpython-311.pyc | Bin 23856 -> 0 bytes .../__pycache__/upload.cpython-311.pyc | Bin 10497 -> 0 bytes .../_distutils/command/_framework_compat.py | 55 - .../setuptools/_distutils/command/bdist.py | 157 - .../_distutils/command/bdist_dumb.py | 144 - .../_distutils/command/bdist_rpm.py | 615 -- .../setuptools/_distutils/command/build.py | 153 - .../_distutils/command/build_clib.py | 208 - .../_distutils/command/build_ext.py | 787 -- .../setuptools/_distutils/command/build_py.py | 407 - .../_distutils/command/build_scripts.py | 173 - .../setuptools/_distutils/command/check.py | 151 - .../setuptools/_distutils/command/clean.py | 76 - .../setuptools/_distutils/command/config.py | 377 - .../setuptools/_distutils/command/install.py | 814 -- .../_distutils/command/install_data.py | 84 - .../_distutils/command/install_egg_info.py | 91 - .../_distutils/command/install_headers.py | 45 - .../_distutils/command/install_lib.py | 238 - .../_distutils/command/install_scripts.py | 61 - .../_distutils/command/py37compat.py | 31 - .../setuptools/_distutils/command/register.py | 319 - .../setuptools/_distutils/command/sdist.py | 531 - .../setuptools/_distutils/command/upload.py | 205 - .../setuptools/_distutils/config.py | 139 - .../setuptools/_distutils/core.py | 291 - .../setuptools/_distutils/cygwinccompiler.py | 364 - .../setuptools/_distutils/debug.py | 5 - .../setuptools/_distutils/dep_util.py | 96 - .../setuptools/_distutils/dir_util.py | 243 - .../setuptools/_distutils/dist.py | 1286 --- .../setuptools/_distutils/errors.py | 127 - .../setuptools/_distutils/extension.py | 248 - .../setuptools/_distutils/fancy_getopt.py | 470 - .../setuptools/_distutils/file_util.py | 249 - .../setuptools/_distutils/filelist.py | 371 - .../setuptools/_distutils/log.py | 80 - .../setuptools/_distutils/msvc9compiler.py | 832 -- .../setuptools/_distutils/msvccompiler.py | 695 -- .../setuptools/_distutils/py38compat.py | 8 - .../setuptools/_distutils/py39compat.py | 22 - .../setuptools/_distutils/spawn.py | 109 - .../setuptools/_distutils/sysconfig.py | 558 -- .../setuptools/_distutils/text_file.py | 287 - .../setuptools/_distutils/unixccompiler.py | 401 - .../setuptools/_distutils/util.py | 513 - .../setuptools/_distutils/version.py | 358 - .../setuptools/_distutils/versionpredicate.py | 175 - .../site-packages/setuptools/_entry_points.py | 86 - .venv/Lib/site-packages/setuptools/_imp.py | 82 - .../site-packages/setuptools/_importlib.py | 47 - .../site-packages/setuptools/_itertools.py | 23 - .venv/Lib/site-packages/setuptools/_path.py | 29 - .venv/Lib/site-packages/setuptools/_reqs.py | 19 - .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 216 -> 0 bytes .../__pycache__/ordered_set.cpython-311.pyc | Bin 21802 -> 0 bytes .../typing_extensions.cpython-311.pyc | Bin 107633 -> 0 bytes .../_vendor/__pycache__/zipp.cpython-311.pyc | Bin 16009 -> 0 bytes .../_vendor/importlib_metadata/__init__.py | 1047 -- .../__pycache__/__init__.cpython-311.pyc | Bin 58255 -> 0 bytes .../__pycache__/_adapters.cpython-311.pyc | Bin 3868 -> 0 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 2215 -> 0 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 2737 -> 0 bytes .../__pycache__/_functools.cpython-311.pyc | Bin 3655 -> 0 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 2618 -> 0 bytes .../__pycache__/_meta.cpython-311.pyc | Bin 3022 -> 0 bytes .../__pycache__/_text.cpython-311.pyc | Bin 4413 -> 0 bytes .../_vendor/importlib_metadata/_adapters.py | 68 - .../importlib_metadata/_collections.py | 30 - .../_vendor/importlib_metadata/_compat.py | 71 - .../_vendor/importlib_metadata/_functools.py | 104 - .../_vendor/importlib_metadata/_itertools.py | 73 - .../_vendor/importlib_metadata/_meta.py | 48 - .../_vendor/importlib_metadata/_text.py | 99 - .../_vendor/importlib_resources/__init__.py | 36 - .../__pycache__/__init__.cpython-311.pyc | Bin 850 -> 0 bytes .../__pycache__/_adapters.cpython-311.pyc | Bin 10767 -> 0 bytes .../__pycache__/_common.cpython-311.pyc | Bin 4294 -> 0 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 5579 -> 0 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 1412 -> 0 bytes .../__pycache__/_legacy.cpython-311.pyc | Bin 6510 -> 0 bytes .../__pycache__/abc.cpython-311.pyc | Bin 7511 -> 0 bytes .../__pycache__/readers.cpython-311.pyc | Bin 8385 -> 0 bytes .../__pycache__/simple.cpython-311.pyc | Bin 6407 -> 0 bytes .../_vendor/importlib_resources/_adapters.py | 170 - .../_vendor/importlib_resources/_common.py | 104 - .../_vendor/importlib_resources/_compat.py | 98 - .../_vendor/importlib_resources/_itertools.py | 35 - .../_vendor/importlib_resources/_legacy.py | 121 - .../_vendor/importlib_resources/abc.py | 137 - .../_vendor/importlib_resources/readers.py | 122 - .../_vendor/importlib_resources/simple.py | 116 - .../setuptools/_vendor/jaraco/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 223 -> 0 bytes .../__pycache__/context.cpython-311.pyc | Bin 9446 -> 0 bytes .../__pycache__/functools.cpython-311.pyc | Bin 20303 -> 0 bytes .../setuptools/_vendor/jaraco/context.py | 213 - .../setuptools/_vendor/jaraco/functools.py | 525 - .../_vendor/jaraco/text/__init__.py | 599 -- .../text/__pycache__/__init__.cpython-311.pyc | Bin 26617 -> 0 bytes .../_vendor/more_itertools/__init__.py | 4 - .../__pycache__/__init__.cpython-311.pyc | Bin 316 -> 0 bytes .../__pycache__/more.cpython-311.pyc | Bin 149203 -> 0 bytes .../__pycache__/recipes.cpython-311.pyc | Bin 23785 -> 0 bytes .../setuptools/_vendor/more_itertools/more.py | 3824 -------- .../_vendor/more_itertools/recipes.py | 620 -- .../setuptools/_vendor/ordered_set.py | 488 - .../setuptools/_vendor/packaging/__about__.py | 26 - .../setuptools/_vendor/packaging/__init__.py | 25 - .../__pycache__/__about__.cpython-311.pyc | Bin 667 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 588 -> 0 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 13254 -> 0 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 8022 -> 0 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 3710 -> 0 bytes .../__pycache__/markers.cpython-311.pyc | Bin 16556 -> 0 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 7671 -> 0 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 34388 -> 0 bytes .../__pycache__/tags.cpython-311.pyc | Bin 21373 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 6708 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 21900 -> 0 bytes .../_vendor/packaging/_manylinux.py | 301 - .../_vendor/packaging/_musllinux.py | 136 - .../_vendor/packaging/_structures.py | 61 - .../setuptools/_vendor/packaging/markers.py | 304 - .../_vendor/packaging/requirements.py | 146 - .../_vendor/packaging/specifiers.py | 802 -- .../setuptools/_vendor/packaging/tags.py | 487 - .../setuptools/_vendor/packaging/utils.py | 136 - .../setuptools/_vendor/packaging/version.py | 504 - .../setuptools/_vendor/pyparsing/__init__.py | 331 - .../__pycache__/__init__.cpython-311.pyc | Bin 8361 -> 0 bytes .../__pycache__/actions.cpython-311.pyc | Bin 8487 -> 0 bytes .../__pycache__/common.cpython-311.pyc | Bin 14809 -> 0 bytes .../__pycache__/core.cpython-311.pyc | Bin 277661 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 12951 -> 0 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 53652 -> 0 bytes .../__pycache__/results.cpython-311.pyc | Bin 36335 -> 0 bytes .../__pycache__/testing.cpython-311.pyc | Bin 19531 -> 0 bytes .../__pycache__/unicode.cpython-311.pyc | Bin 15389 -> 0 bytes .../__pycache__/util.cpython-311.pyc | Bin 14288 -> 0 bytes .../setuptools/_vendor/pyparsing/actions.py | 207 - .../setuptools/_vendor/pyparsing/common.py | 424 - .../setuptools/_vendor/pyparsing/core.py | 5814 ----------- .../_vendor/pyparsing/diagram/__init__.py | 642 -- .../__pycache__/__init__.cpython-311.pyc | Bin 28024 -> 0 bytes .../_vendor/pyparsing/exceptions.py | 267 - .../setuptools/_vendor/pyparsing/helpers.py | 1088 --- .../setuptools/_vendor/pyparsing/results.py | 760 -- .../setuptools/_vendor/pyparsing/testing.py | 331 - .../setuptools/_vendor/pyparsing/unicode.py | 352 - .../setuptools/_vendor/pyparsing/util.py | 235 - .../setuptools/_vendor/tomli/__init__.py | 11 - .../__pycache__/__init__.cpython-311.pyc | Bin 438 -> 0 bytes .../tomli/__pycache__/_parser.cpython-311.pyc | Bin 30877 -> 0 bytes .../tomli/__pycache__/_re.cpython-311.pyc | Bin 4517 -> 0 bytes .../tomli/__pycache__/_types.cpython-311.pyc | Bin 430 -> 0 bytes .../setuptools/_vendor/tomli/_parser.py | 691 -- .../setuptools/_vendor/tomli/_re.py | 107 - .../setuptools/_vendor/tomli/_types.py | 10 - .../setuptools/_vendor/typing_extensions.py | 2296 ----- .../site-packages/setuptools/_vendor/zipp.py | 329 - .../site-packages/setuptools/archive_util.py | 213 - .../site-packages/setuptools/build_meta.py | 511 - .venv/Lib/site-packages/setuptools/cli-32.exe | Bin 65536 -> 0 bytes .venv/Lib/site-packages/setuptools/cli-64.exe | Bin 74752 -> 0 bytes .../site-packages/setuptools/cli-arm64.exe | Bin 137216 -> 0 bytes .venv/Lib/site-packages/setuptools/cli.exe | Bin 65536 -> 0 bytes .../setuptools/command/__init__.py | 12 - .../__pycache__/__init__.cpython-311.pyc | Bin 657 -> 0 bytes .../command/__pycache__/alias.cpython-311.pyc | Bin 3924 -> 0 bytes .../__pycache__/bdist_egg.cpython-311.pyc | Bin 25606 -> 0 bytes .../__pycache__/bdist_rpm.cpython-311.pyc | Bin 2212 -> 0 bytes .../command/__pycache__/build.cpython-311.pyc | Bin 7018 -> 0 bytes .../__pycache__/build_clib.cpython-311.pyc | Bin 4145 -> 0 bytes .../__pycache__/build_ext.cpython-311.pyc | Bin 22032 -> 0 bytes .../__pycache__/build_py.cpython-311.pyc | Bin 23198 -> 0 bytes .../__pycache__/develop.cpython-311.pyc | Bin 10940 -> 0 bytes .../__pycache__/dist_info.cpython-311.pyc | Bin 8002 -> 0 bytes .../__pycache__/easy_install.cpython-311.pyc | Bin 119357 -> 0 bytes .../editable_wheel.cpython-311.pyc | Bin 51435 -> 0 bytes .../__pycache__/egg_info.cpython-311.pyc | Bin 39855 -> 0 bytes .../__pycache__/install.cpython-311.pyc | Bin 6837 -> 0 bytes .../install_egg_info.cpython-311.pyc | Bin 4150 -> 0 bytes .../__pycache__/install_lib.cpython-311.pyc | Bin 6432 -> 0 bytes .../install_scripts.cpython-311.pyc | Bin 4301 -> 0 bytes .../__pycache__/py36compat.cpython-311.pyc | Bin 8058 -> 0 bytes .../__pycache__/register.cpython-311.pyc | Bin 1148 -> 0 bytes .../__pycache__/rotate.cpython-311.pyc | Bin 4208 -> 0 bytes .../__pycache__/saveopts.cpython-311.pyc | Bin 1388 -> 0 bytes .../command/__pycache__/sdist.cpython-311.pyc | Bin 13460 -> 0 bytes .../__pycache__/setopt.cpython-311.pyc | Bin 7700 -> 0 bytes .../command/__pycache__/test.cpython-311.pyc | Bin 14641 -> 0 bytes .../__pycache__/upload.cpython-311.pyc | Bin 1112 -> 0 bytes .../__pycache__/upload_docs.cpython-311.pyc | Bin 11963 -> 0 bytes .../site-packages/setuptools/command/alias.py | 78 - .../setuptools/command/bdist_egg.py | 457 - .../setuptools/command/bdist_rpm.py | 40 - .../site-packages/setuptools/command/build.py | 146 - .../setuptools/command/build_clib.py | 101 - .../setuptools/command/build_ext.py | 383 - .../setuptools/command/build_py.py | 368 - .../setuptools/command/develop.py | 193 - .../setuptools/command/dist_info.py | 142 - .../setuptools/command/easy_install.py | 2312 ----- .../setuptools/command/editable_wheel.py | 844 -- .../setuptools/command/egg_info.py | 763 -- .../setuptools/command/install.py | 139 - .../setuptools/command/install_egg_info.py | 63 - .../setuptools/command/install_lib.py | 122 - .../setuptools/command/install_scripts.py | 70 - .../setuptools/command/launcher manifest.xml | 15 - .../setuptools/command/py36compat.py | 134 - .../setuptools/command/register.py | 18 - .../setuptools/command/rotate.py | 64 - .../setuptools/command/saveopts.py | 22 - .../site-packages/setuptools/command/sdist.py | 210 - .../setuptools/command/setopt.py | 149 - .../site-packages/setuptools/command/test.py | 251 - .../setuptools/command/upload.py | 17 - .../setuptools/command/upload_docs.py | 213 - .../setuptools/config/__init__.py | 35 - .../__pycache__/__init__.cpython-311.pyc | Bin 2052 -> 0 bytes .../_apply_pyprojecttoml.cpython-311.pyc | Bin 22555 -> 0 bytes .../config/__pycache__/expand.cpython-311.pyc | Bin 28266 -> 0 bytes .../__pycache__/pyprojecttoml.cpython-311.pyc | Bin 27464 -> 0 bytes .../__pycache__/setupcfg.cpython-311.pyc | Bin 33048 -> 0 bytes .../setuptools/config/_apply_pyprojecttoml.py | 377 - .../config/_validate_pyproject/__init__.py | 34 - .../__pycache__/__init__.cpython-311.pyc | Bin 2340 -> 0 bytes .../error_reporting.cpython-311.pyc | Bin 20231 -> 0 bytes .../extra_validations.cpython-311.pyc | Bin 1889 -> 0 bytes .../fastjsonschema_exceptions.cpython-311.pyc | Bin 3264 -> 0 bytes ...fastjsonschema_validations.cpython-311.pyc | Bin 192662 -> 0 bytes .../__pycache__/formats.cpython-311.pyc | Bin 14379 -> 0 bytes .../_validate_pyproject/error_reporting.py | 318 - .../_validate_pyproject/extra_validations.py | 36 - .../fastjsonschema_exceptions.py | 51 - .../fastjsonschema_validations.py | 1035 -- .../config/_validate_pyproject/formats.py | 259 - .../site-packages/setuptools/config/expand.py | 462 - .../setuptools/config/pyprojecttoml.py | 493 - .../setuptools/config/setupcfg.py | 762 -- .../Lib/site-packages/setuptools/dep_util.py | 25 - .venv/Lib/site-packages/setuptools/depends.py | 176 - .../Lib/site-packages/setuptools/discovery.py | 600 -- .venv/Lib/site-packages/setuptools/dist.py | 1222 --- .venv/Lib/site-packages/setuptools/errors.py | 58 - .../Lib/site-packages/setuptools/extension.py | 148 - .../setuptools/extern/__init__.py | 76 - .../__pycache__/__init__.cpython-311.pyc | Bin 4416 -> 0 bytes .venv/Lib/site-packages/setuptools/glob.py | 167 - .venv/Lib/site-packages/setuptools/gui-32.exe | Bin 65536 -> 0 bytes .venv/Lib/site-packages/setuptools/gui-64.exe | Bin 75264 -> 0 bytes .../site-packages/setuptools/gui-arm64.exe | Bin 137728 -> 0 bytes .venv/Lib/site-packages/setuptools/gui.exe | Bin 65536 -> 0 bytes .../Lib/site-packages/setuptools/installer.py | 104 - .venv/Lib/site-packages/setuptools/launch.py | 36 - .venv/Lib/site-packages/setuptools/logging.py | 36 - .venv/Lib/site-packages/setuptools/monkey.py | 165 - .venv/Lib/site-packages/setuptools/msvc.py | 1703 ---- .../site-packages/setuptools/namespaces.py | 107 - .../site-packages/setuptools/package_index.py | 1126 --- .../site-packages/setuptools/py34compat.py | 13 - .venv/Lib/site-packages/setuptools/sandbox.py | 530 - .../setuptools/script (dev).tmpl | 6 - .../Lib/site-packages/setuptools/script.tmpl | 3 - .../site-packages/setuptools/unicode_utils.py | 42 - .venv/Lib/site-packages/setuptools/version.py | 6 - .venv/Lib/site-packages/setuptools/wheel.py | 222 - .../setuptools/windows_support.py | 29 - .../yarl-1.9.4.dist-info/INSTALLER | 1 - .../yarl-1.9.4.dist-info/LICENSE | 202 - .../yarl-1.9.4.dist-info/METADATA | 1086 --- .../site-packages/yarl-1.9.4.dist-info/NOTICE | 13 - .../site-packages/yarl-1.9.4.dist-info/RECORD | 20 - .../site-packages/yarl-1.9.4.dist-info/WHEEL | 5 - .../yarl-1.9.4.dist-info/top_level.txt | 1 - .venv/Lib/site-packages/yarl/__init__.py | 5 - .venv/Lib/site-packages/yarl/__init__.pyi | 121 - .../yarl/__pycache__/__init__.cpython-311.pyc | Bin 380 -> 0 bytes .../yarl/__pycache__/_quoting.cpython-311.pyc | Bin 814 -> 0 bytes .../__pycache__/_quoting_py.cpython-311.pyc | Bin 9630 -> 0 bytes .../yarl/__pycache__/_url.cpython-311.pyc | Bin 50969 -> 0 bytes .venv/Lib/site-packages/yarl/_quoting.py | 18 - .../yarl/_quoting_c.cp311-win_amd64.pyd | Bin 95744 -> 0 bytes .venv/Lib/site-packages/yarl/_quoting_c.pyi | 16 - .venv/Lib/site-packages/yarl/_quoting_c.pyx | 371 - .venv/Lib/site-packages/yarl/_quoting_py.py | 197 - .venv/Lib/site-packages/yarl/_url.py | 1200 --- .venv/Lib/site-packages/yarl/py.typed | 1 - .venv/Scripts/Activate.ps1 | 502 - .venv/Scripts/activate | 69 - .venv/Scripts/activate.bat | 34 - .venv/Scripts/deactivate.bat | 22 - .venv/Scripts/pip.exe | Bin 108438 -> 0 bytes .venv/Scripts/pip3.11.exe | Bin 108438 -> 0 bytes .venv/Scripts/pip3.exe | Bin 108438 -> 0 bytes .venv/Scripts/python.exe | Bin 270616 -> 0 bytes .venv/Scripts/pythonw.exe | Bin 259344 -> 0 bytes .venv/pyvenv.cfg | 5 - 1966 files changed, 390289 deletions(-) delete mode 100644 .venv/Lib/site-packages/_distutils_hack/__init__.py delete mode 100644 .venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/_distutils_hack/override.py delete mode 100644 .venv/Lib/site-packages/aiohttp-3.9.3.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/aiohttp-3.9.3.dist-info/LICENSE.txt delete mode 100644 .venv/Lib/site-packages/aiohttp-3.9.3.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/aiohttp-3.9.3.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/aiohttp-3.9.3.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/aiohttp-3.9.3.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/aiohttp/.hash/_cparser.pxd.hash delete mode 100644 .venv/Lib/site-packages/aiohttp/.hash/_find_header.pxd.hash delete mode 100644 .venv/Lib/site-packages/aiohttp/.hash/_helpers.pyi.hash delete mode 100644 .venv/Lib/site-packages/aiohttp/.hash/_helpers.pyx.hash delete mode 100644 .venv/Lib/site-packages/aiohttp/.hash/_http_parser.pyx.hash delete mode 100644 .venv/Lib/site-packages/aiohttp/.hash/_http_writer.pyx.hash delete mode 100644 .venv/Lib/site-packages/aiohttp/.hash/_websocket.pyx.hash delete mode 100644 .venv/Lib/site-packages/aiohttp/.hash/hdrs.py.hash delete mode 100644 .venv/Lib/site-packages/aiohttp/__init__.py delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/abc.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/base_protocol.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/client.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/client_exceptions.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/client_proto.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/client_reqrep.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/client_ws.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/compression_utils.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/connector.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/cookiejar.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/formdata.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/hdrs.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/helpers.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/http.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/http_exceptions.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/http_parser.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/http_websocket.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/http_writer.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/locks.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/log.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/multipart.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/payload.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/payload_streamer.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/pytest_plugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/resolver.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/streams.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/tcp_helpers.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/test_utils.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/tracing.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/typedefs.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_app.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_exceptions.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_fileresponse.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_log.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_middlewares.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_protocol.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_request.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_response.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_routedef.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_runner.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_server.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_urldispatcher.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_ws.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/worker.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/_cparser.pxd delete mode 100644 .venv/Lib/site-packages/aiohttp/_find_header.pxd delete mode 100644 .venv/Lib/site-packages/aiohttp/_headers.pxi delete mode 100644 .venv/Lib/site-packages/aiohttp/_helpers.cp311-win_amd64.pyd delete mode 100644 .venv/Lib/site-packages/aiohttp/_helpers.pyi delete mode 100644 .venv/Lib/site-packages/aiohttp/_helpers.pyx delete mode 100644 .venv/Lib/site-packages/aiohttp/_http_parser.cp311-win_amd64.pyd delete mode 100644 .venv/Lib/site-packages/aiohttp/_http_parser.pyx delete mode 100644 .venv/Lib/site-packages/aiohttp/_http_writer.cp311-win_amd64.pyd delete mode 100644 .venv/Lib/site-packages/aiohttp/_http_writer.pyx delete mode 100644 .venv/Lib/site-packages/aiohttp/_websocket.cp311-win_amd64.pyd delete mode 100644 .venv/Lib/site-packages/aiohttp/_websocket.pyx delete mode 100644 .venv/Lib/site-packages/aiohttp/abc.py delete mode 100644 .venv/Lib/site-packages/aiohttp/base_protocol.py delete mode 100644 .venv/Lib/site-packages/aiohttp/client.py delete mode 100644 .venv/Lib/site-packages/aiohttp/client_exceptions.py delete mode 100644 .venv/Lib/site-packages/aiohttp/client_proto.py delete mode 100644 .venv/Lib/site-packages/aiohttp/client_reqrep.py delete mode 100644 .venv/Lib/site-packages/aiohttp/client_ws.py delete mode 100644 .venv/Lib/site-packages/aiohttp/compression_utils.py delete mode 100644 .venv/Lib/site-packages/aiohttp/connector.py delete mode 100644 .venv/Lib/site-packages/aiohttp/cookiejar.py delete mode 100644 .venv/Lib/site-packages/aiohttp/formdata.py delete mode 100644 .venv/Lib/site-packages/aiohttp/hdrs.py delete mode 100644 .venv/Lib/site-packages/aiohttp/helpers.py delete mode 100644 .venv/Lib/site-packages/aiohttp/http.py delete mode 100644 .venv/Lib/site-packages/aiohttp/http_exceptions.py delete mode 100644 .venv/Lib/site-packages/aiohttp/http_parser.py delete mode 100644 .venv/Lib/site-packages/aiohttp/http_websocket.py delete mode 100644 .venv/Lib/site-packages/aiohttp/http_writer.py delete mode 100644 .venv/Lib/site-packages/aiohttp/locks.py delete mode 100644 .venv/Lib/site-packages/aiohttp/log.py delete mode 100644 .venv/Lib/site-packages/aiohttp/multipart.py delete mode 100644 .venv/Lib/site-packages/aiohttp/payload.py delete mode 100644 .venv/Lib/site-packages/aiohttp/payload_streamer.py delete mode 100644 .venv/Lib/site-packages/aiohttp/py.typed delete mode 100644 .venv/Lib/site-packages/aiohttp/pytest_plugin.py delete mode 100644 .venv/Lib/site-packages/aiohttp/resolver.py delete mode 100644 .venv/Lib/site-packages/aiohttp/streams.py delete mode 100644 .venv/Lib/site-packages/aiohttp/tcp_helpers.py delete mode 100644 .venv/Lib/site-packages/aiohttp/test_utils.py delete mode 100644 .venv/Lib/site-packages/aiohttp/tracing.py delete mode 100644 .venv/Lib/site-packages/aiohttp/typedefs.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_app.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_exceptions.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_fileresponse.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_log.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_middlewares.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_protocol.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_request.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_response.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_routedef.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_runner.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_server.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_urldispatcher.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_ws.py delete mode 100644 .venv/Lib/site-packages/aiohttp/worker.py delete mode 100644 .venv/Lib/site-packages/aiosignal-1.3.1.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/aiosignal-1.3.1.dist-info/LICENSE delete mode 100644 .venv/Lib/site-packages/aiosignal-1.3.1.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/aiosignal-1.3.1.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/aiosignal-1.3.1.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/aiosignal-1.3.1.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/aiosignal/__init__.py delete mode 100644 .venv/Lib/site-packages/aiosignal/__init__.pyi delete mode 100644 .venv/Lib/site-packages/aiosignal/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/aiosignal/py.typed delete mode 100644 .venv/Lib/site-packages/attr/__init__.py delete mode 100644 .venv/Lib/site-packages/attr/__init__.pyi delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/_cmp.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/_compat.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/_config.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/_funcs.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/_make.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/_next_gen.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/_version_info.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/converters.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/exceptions.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/filters.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/setters.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/validators.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/attr/_cmp.py delete mode 100644 .venv/Lib/site-packages/attr/_cmp.pyi delete mode 100644 .venv/Lib/site-packages/attr/_compat.py delete mode 100644 .venv/Lib/site-packages/attr/_config.py delete mode 100644 .venv/Lib/site-packages/attr/_funcs.py delete mode 100644 .venv/Lib/site-packages/attr/_make.py delete mode 100644 .venv/Lib/site-packages/attr/_next_gen.py delete mode 100644 .venv/Lib/site-packages/attr/_typing_compat.pyi delete mode 100644 .venv/Lib/site-packages/attr/_version_info.py delete mode 100644 .venv/Lib/site-packages/attr/_version_info.pyi delete mode 100644 .venv/Lib/site-packages/attr/converters.py delete mode 100644 .venv/Lib/site-packages/attr/converters.pyi delete mode 100644 .venv/Lib/site-packages/attr/exceptions.py delete mode 100644 .venv/Lib/site-packages/attr/exceptions.pyi delete mode 100644 .venv/Lib/site-packages/attr/filters.py delete mode 100644 .venv/Lib/site-packages/attr/filters.pyi delete mode 100644 .venv/Lib/site-packages/attr/py.typed delete mode 100644 .venv/Lib/site-packages/attr/setters.py delete mode 100644 .venv/Lib/site-packages/attr/setters.pyi delete mode 100644 .venv/Lib/site-packages/attr/validators.py delete mode 100644 .venv/Lib/site-packages/attr/validators.pyi delete mode 100644 .venv/Lib/site-packages/attrs-23.2.0.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/attrs-23.2.0.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/attrs-23.2.0.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/attrs-23.2.0.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/attrs-23.2.0.dist-info/licenses/LICENSE delete mode 100644 .venv/Lib/site-packages/attrs/__init__.py delete mode 100644 .venv/Lib/site-packages/attrs/__init__.pyi delete mode 100644 .venv/Lib/site-packages/attrs/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/attrs/__pycache__/converters.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/attrs/__pycache__/exceptions.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/attrs/__pycache__/filters.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/attrs/__pycache__/setters.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/attrs/__pycache__/validators.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/attrs/converters.py delete mode 100644 .venv/Lib/site-packages/attrs/exceptions.py delete mode 100644 .venv/Lib/site-packages/attrs/filters.py delete mode 100644 .venv/Lib/site-packages/attrs/py.typed delete mode 100644 .venv/Lib/site-packages/attrs/setters.py delete mode 100644 .venv/Lib/site-packages/attrs/validators.py delete mode 100644 .venv/Lib/site-packages/discord.py-2.3.2.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/discord.py-2.3.2.dist-info/LICENSE delete mode 100644 .venv/Lib/site-packages/discord.py-2.3.2.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/discord.py-2.3.2.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/discord.py-2.3.2.dist-info/REQUESTED delete mode 100644 .venv/Lib/site-packages/discord.py-2.3.2.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/discord.py-2.3.2.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/discord/__init__.py delete mode 100644 .venv/Lib/site-packages/discord/__main__.py delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/__main__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/_types.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/abc.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/activity.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/appinfo.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/asset.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/audit_logs.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/automod.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/backoff.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/channel.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/client.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/colour.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/components.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/context_managers.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/embeds.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/emoji.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/enums.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/errors.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/file.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/flags.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/gateway.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/guild.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/http.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/integrations.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/interactions.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/invite.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/member.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/mentions.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/message.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/mixins.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/object.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/oggparse.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/opus.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/partial_emoji.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/permissions.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/player.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/raw_models.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/reaction.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/role.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/scheduled_event.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/shard.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/stage_instance.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/state.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/sticker.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/team.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/template.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/threads.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/user.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/utils.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/voice_client.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/welcome_screen.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/widget.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/_types.py delete mode 100644 .venv/Lib/site-packages/discord/abc.py delete mode 100644 .venv/Lib/site-packages/discord/activity.py delete mode 100644 .venv/Lib/site-packages/discord/app_commands/__init__.py delete mode 100644 .venv/Lib/site-packages/discord/app_commands/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/app_commands/__pycache__/checks.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/app_commands/__pycache__/commands.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/app_commands/__pycache__/errors.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/app_commands/__pycache__/models.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/app_commands/__pycache__/namespace.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/app_commands/__pycache__/transformers.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/app_commands/__pycache__/translator.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/app_commands/__pycache__/tree.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/app_commands/checks.py delete mode 100644 .venv/Lib/site-packages/discord/app_commands/commands.py delete mode 100644 .venv/Lib/site-packages/discord/app_commands/errors.py delete mode 100644 .venv/Lib/site-packages/discord/app_commands/models.py delete mode 100644 .venv/Lib/site-packages/discord/app_commands/namespace.py delete mode 100644 .venv/Lib/site-packages/discord/app_commands/transformers.py delete mode 100644 .venv/Lib/site-packages/discord/app_commands/translator.py delete mode 100644 .venv/Lib/site-packages/discord/app_commands/tree.py delete mode 100644 .venv/Lib/site-packages/discord/appinfo.py delete mode 100644 .venv/Lib/site-packages/discord/asset.py delete mode 100644 .venv/Lib/site-packages/discord/audit_logs.py delete mode 100644 .venv/Lib/site-packages/discord/automod.py delete mode 100644 .venv/Lib/site-packages/discord/backoff.py delete mode 100644 .venv/Lib/site-packages/discord/bin/libopus-0.x64.dll delete mode 100644 .venv/Lib/site-packages/discord/bin/libopus-0.x86.dll delete mode 100644 .venv/Lib/site-packages/discord/channel.py delete mode 100644 .venv/Lib/site-packages/discord/client.py delete mode 100644 .venv/Lib/site-packages/discord/colour.py delete mode 100644 .venv/Lib/site-packages/discord/components.py delete mode 100644 .venv/Lib/site-packages/discord/context_managers.py delete mode 100644 .venv/Lib/site-packages/discord/embeds.py delete mode 100644 .venv/Lib/site-packages/discord/emoji.py delete mode 100644 .venv/Lib/site-packages/discord/enums.py delete mode 100644 .venv/Lib/site-packages/discord/errors.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__init__.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/_types.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/bot.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/cog.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/context.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/converter.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/cooldowns.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/core.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/errors.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/flags.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/help.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/hybrid.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/parameters.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/view.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/_types.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/bot.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/cog.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/context.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/converter.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/cooldowns.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/core.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/errors.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/flags.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/help.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/hybrid.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/parameters.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/view.py delete mode 100644 .venv/Lib/site-packages/discord/ext/tasks/__init__.py delete mode 100644 .venv/Lib/site-packages/discord/ext/tasks/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/file.py delete mode 100644 .venv/Lib/site-packages/discord/flags.py delete mode 100644 .venv/Lib/site-packages/discord/gateway.py delete mode 100644 .venv/Lib/site-packages/discord/guild.py delete mode 100644 .venv/Lib/site-packages/discord/http.py delete mode 100644 .venv/Lib/site-packages/discord/integrations.py delete mode 100644 .venv/Lib/site-packages/discord/interactions.py delete mode 100644 .venv/Lib/site-packages/discord/invite.py delete mode 100644 .venv/Lib/site-packages/discord/member.py delete mode 100644 .venv/Lib/site-packages/discord/mentions.py delete mode 100644 .venv/Lib/site-packages/discord/message.py delete mode 100644 .venv/Lib/site-packages/discord/mixins.py delete mode 100644 .venv/Lib/site-packages/discord/object.py delete mode 100644 .venv/Lib/site-packages/discord/oggparse.py delete mode 100644 .venv/Lib/site-packages/discord/opus.py delete mode 100644 .venv/Lib/site-packages/discord/partial_emoji.py delete mode 100644 .venv/Lib/site-packages/discord/permissions.py delete mode 100644 .venv/Lib/site-packages/discord/player.py delete mode 100644 .venv/Lib/site-packages/discord/py.typed delete mode 100644 .venv/Lib/site-packages/discord/raw_models.py delete mode 100644 .venv/Lib/site-packages/discord/reaction.py delete mode 100644 .venv/Lib/site-packages/discord/role.py delete mode 100644 .venv/Lib/site-packages/discord/scheduled_event.py delete mode 100644 .venv/Lib/site-packages/discord/shard.py delete mode 100644 .venv/Lib/site-packages/discord/stage_instance.py delete mode 100644 .venv/Lib/site-packages/discord/state.py delete mode 100644 .venv/Lib/site-packages/discord/sticker.py delete mode 100644 .venv/Lib/site-packages/discord/team.py delete mode 100644 .venv/Lib/site-packages/discord/template.py delete mode 100644 .venv/Lib/site-packages/discord/threads.py delete mode 100644 .venv/Lib/site-packages/discord/types/__init__.py delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/activity.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/appinfo.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/audit_log.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/automod.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/channel.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/command.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/components.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/embed.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/emoji.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/gateway.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/guild.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/integration.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/interactions.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/invite.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/member.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/message.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/role.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/scheduled_event.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/snowflake.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/sticker.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/team.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/template.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/threads.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/user.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/voice.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/webhook.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/welcome_screen.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/widget.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/activity.py delete mode 100644 .venv/Lib/site-packages/discord/types/appinfo.py delete mode 100644 .venv/Lib/site-packages/discord/types/audit_log.py delete mode 100644 .venv/Lib/site-packages/discord/types/automod.py delete mode 100644 .venv/Lib/site-packages/discord/types/channel.py delete mode 100644 .venv/Lib/site-packages/discord/types/command.py delete mode 100644 .venv/Lib/site-packages/discord/types/components.py delete mode 100644 .venv/Lib/site-packages/discord/types/embed.py delete mode 100644 .venv/Lib/site-packages/discord/types/emoji.py delete mode 100644 .venv/Lib/site-packages/discord/types/gateway.py delete mode 100644 .venv/Lib/site-packages/discord/types/guild.py delete mode 100644 .venv/Lib/site-packages/discord/types/integration.py delete mode 100644 .venv/Lib/site-packages/discord/types/interactions.py delete mode 100644 .venv/Lib/site-packages/discord/types/invite.py delete mode 100644 .venv/Lib/site-packages/discord/types/member.py delete mode 100644 .venv/Lib/site-packages/discord/types/message.py delete mode 100644 .venv/Lib/site-packages/discord/types/role.py delete mode 100644 .venv/Lib/site-packages/discord/types/scheduled_event.py delete mode 100644 .venv/Lib/site-packages/discord/types/snowflake.py delete mode 100644 .venv/Lib/site-packages/discord/types/sticker.py delete mode 100644 .venv/Lib/site-packages/discord/types/team.py delete mode 100644 .venv/Lib/site-packages/discord/types/template.py delete mode 100644 .venv/Lib/site-packages/discord/types/threads.py delete mode 100644 .venv/Lib/site-packages/discord/types/user.py delete mode 100644 .venv/Lib/site-packages/discord/types/voice.py delete mode 100644 .venv/Lib/site-packages/discord/types/webhook.py delete mode 100644 .venv/Lib/site-packages/discord/types/welcome_screen.py delete mode 100644 .venv/Lib/site-packages/discord/types/widget.py delete mode 100644 .venv/Lib/site-packages/discord/ui/__init__.py delete mode 100644 .venv/Lib/site-packages/discord/ui/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/ui/__pycache__/button.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/ui/__pycache__/dynamic.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/ui/__pycache__/item.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/ui/__pycache__/modal.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/ui/__pycache__/select.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/ui/__pycache__/text_input.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/ui/__pycache__/view.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/ui/button.py delete mode 100644 .venv/Lib/site-packages/discord/ui/dynamic.py delete mode 100644 .venv/Lib/site-packages/discord/ui/item.py delete mode 100644 .venv/Lib/site-packages/discord/ui/modal.py delete mode 100644 .venv/Lib/site-packages/discord/ui/select.py delete mode 100644 .venv/Lib/site-packages/discord/ui/text_input.py delete mode 100644 .venv/Lib/site-packages/discord/ui/view.py delete mode 100644 .venv/Lib/site-packages/discord/user.py delete mode 100644 .venv/Lib/site-packages/discord/utils.py delete mode 100644 .venv/Lib/site-packages/discord/voice_client.py delete mode 100644 .venv/Lib/site-packages/discord/webhook/__init__.py delete mode 100644 .venv/Lib/site-packages/discord/webhook/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/webhook/__pycache__/async_.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/webhook/__pycache__/sync.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/discord/webhook/async_.py delete mode 100644 .venv/Lib/site-packages/discord/webhook/sync.py delete mode 100644 .venv/Lib/site-packages/discord/welcome_screen.py delete mode 100644 .venv/Lib/site-packages/discord/widget.py delete mode 100644 .venv/Lib/site-packages/distutils-precedence.pth delete mode 100644 .venv/Lib/site-packages/frozenlist-1.4.1.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/frozenlist-1.4.1.dist-info/LICENSE delete mode 100644 .venv/Lib/site-packages/frozenlist-1.4.1.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/frozenlist-1.4.1.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/frozenlist-1.4.1.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/frozenlist-1.4.1.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/frozenlist/__init__.py delete mode 100644 .venv/Lib/site-packages/frozenlist/__init__.pyi delete mode 100644 .venv/Lib/site-packages/frozenlist/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/frozenlist/_frozenlist.cp311-win_amd64.pyd delete mode 100644 .venv/Lib/site-packages/frozenlist/_frozenlist.pyx delete mode 100644 .venv/Lib/site-packages/frozenlist/py.typed delete mode 100644 .venv/Lib/site-packages/idna-3.6.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/idna-3.6.dist-info/LICENSE.md delete mode 100644 .venv/Lib/site-packages/idna-3.6.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/idna-3.6.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/idna-3.6.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/idna/__init__.py delete mode 100644 .venv/Lib/site-packages/idna/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/idna/__pycache__/codec.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/idna/__pycache__/compat.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/idna/__pycache__/core.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/idna/__pycache__/idnadata.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/idna/__pycache__/intranges.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/idna/__pycache__/package_data.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/idna/__pycache__/uts46data.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/idna/codec.py delete mode 100644 .venv/Lib/site-packages/idna/compat.py delete mode 100644 .venv/Lib/site-packages/idna/core.py delete mode 100644 .venv/Lib/site-packages/idna/idnadata.py delete mode 100644 .venv/Lib/site-packages/idna/intranges.py delete mode 100644 .venv/Lib/site-packages/idna/package_data.py delete mode 100644 .venv/Lib/site-packages/idna/py.typed delete mode 100644 .venv/Lib/site-packages/idna/uts46data.py delete mode 100644 .venv/Lib/site-packages/multidict-6.0.5.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/multidict-6.0.5.dist-info/LICENSE delete mode 100644 .venv/Lib/site-packages/multidict-6.0.5.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/multidict-6.0.5.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/multidict-6.0.5.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/multidict-6.0.5.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/multidict/__init__.py delete mode 100644 .venv/Lib/site-packages/multidict/__init__.pyi delete mode 100644 .venv/Lib/site-packages/multidict/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/multidict/__pycache__/_abc.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/multidict/__pycache__/_compat.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/multidict/__pycache__/_multidict_base.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/multidict/__pycache__/_multidict_py.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/multidict/_abc.py delete mode 100644 .venv/Lib/site-packages/multidict/_compat.py delete mode 100644 .venv/Lib/site-packages/multidict/_multidict.cp311-win_amd64.pyd delete mode 100644 .venv/Lib/site-packages/multidict/_multidict_base.py delete mode 100644 .venv/Lib/site-packages/multidict/_multidict_py.py delete mode 100644 .venv/Lib/site-packages/multidict/py.typed delete mode 100644 .venv/Lib/site-packages/pip-22.3.1.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/pip-22.3.1.dist-info/LICENSE.txt delete mode 100644 .venv/Lib/site-packages/pip-22.3.1.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/pip-22.3.1.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/pip-22.3.1.dist-info/REQUESTED delete mode 100644 .venv/Lib/site-packages/pip-22.3.1.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/pip-22.3.1.dist-info/entry_points.txt delete mode 100644 .venv/Lib/site-packages/pip-22.3.1.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/pip/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/__main__.py delete mode 100644 .venv/Lib/site-packages/pip/__pip-runner__.py delete mode 100644 .venv/Lib/site-packages/pip/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/__pycache__/__main__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/__pycache__/__pip-runner__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/build_env.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cache.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/autocompletion.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/base_command.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/command_context.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/main.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/main_parser.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/parser.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/progress_bars.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/req_command.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/spinners.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/status_codes.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/cache.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/check.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/completion.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/debug.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/download.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/hash.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/help.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/index.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/list.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/search.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/show.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/cache.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/check.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/completion.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/configuration.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/debug.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/download.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/freeze.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/hash.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/help.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/index.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/inspect.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/install.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/list.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/search.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/show.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/uninstall.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/wheel.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/configuration.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/distributions/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/distributions/base.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/distributions/installed.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/distributions/sdist.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/distributions/wheel.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/exceptions.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/index/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/index/collector.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/index/package_finder.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/index/sources.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/locations/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/locations/__pycache__/base.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/locations/_distutils.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/locations/_sysconfig.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/locations/base.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/main.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/_json.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/base.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/importlib/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/importlib/_compat.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__pycache__/scheme.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__pycache__/wheel.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/candidate.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/direct_url.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/format_control.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/index.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/installation_report.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/link.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/scheme.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/search_scope.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/selection_prefs.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/target_python.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/wheel.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/__pycache__/session.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/__pycache__/utils.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/auth.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/cache.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/download.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/session.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/utils.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/xmlrpc.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/build_tracker.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/metadata.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/metadata_editable.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/wheel.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/wheel_editable.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/check.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/freeze.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/install/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/install/legacy.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/install/wheel.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/prepare.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/pyproject.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/req/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/req/constructors.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/req/req_file.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/req/req_install.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/req/req_set.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/req/req_uninstall.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/base.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/self_outdated_check.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/_log.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/compat.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/models.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/_log.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/appdirs.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/compat.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/datetime.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/deprecation.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/distutils_args.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/egg_link.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/encoding.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/entrypoints.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/filesystem.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/filetypes.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/glibc.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/hashes.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/inject_securetransport.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/logging.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/misc.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/models.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/packaging.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/subprocess.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/temp_dir.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/unpacking.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/urls.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/virtualenv.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/wheel.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/vcs/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/vcs/bazaar.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/vcs/git.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/vcs/mercurial.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/vcs/subversion.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/wheel_builder.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/__pycache__/six.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/compat.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/certifi/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/certifi/__main__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem delete mode 100644 .venv/Lib/site-packages/pip/_vendor/certifi/core.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/big5freq.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/big5prober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/enums.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/escprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/escsm.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/jisfreq.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/johabfreq.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/johabprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/langrussianmodel.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/metadata/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/metadata/languages.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/utf1632prober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/version.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/colorama/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/colorama/ansi.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/colorama/initialise.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/colorama/win32.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/colorama/winterm.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/compat.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/database.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/index.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/locators.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/manifest.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/markers.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/metadata.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/resources.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/scripts.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/t32.exe delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/t64-arm.exe delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/t64.exe delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/util.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/version.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/w32.exe delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/w64-arm.exe delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/w64.exe delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/wheel.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distro/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distro/__main__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distro/distro.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/__pycache__/core.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/codec.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/compat.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/core.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/idnadata.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/intranges.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/package_data.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/uts46data.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/msgpack/exceptions.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/msgpack/ext.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__about__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/_manylinux.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/_musllinux.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/_structures.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/markers.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/requirements.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/specifiers.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/tags.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/utils.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/version.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/_compat.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/dirtools.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/meta.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/_compat.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/build.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/check.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/colorlog.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/dirtools.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/envbuild.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/in_process/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/in_process/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/in_process/__pycache__/_in_process.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/in_process/_in_process.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/meta.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/wrappers.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pkg_resources/py31compat.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/__main__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/android.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/api.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/macos.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/unix.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/version.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/windows.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__main__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/cmdline.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/console.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/filter.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/filters/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatter.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/_mapping.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/bbcode.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/groff.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/html.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/img.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/irc.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/latex.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/other.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/rtf.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/svg.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/terminal.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/terminal256.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/lexer.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/lexers/python.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/modeline.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/plugin.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/regexopt.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/scanner.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/sphinxext.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/style.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/styles/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/token.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/unistring.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/util.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/actions.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/common.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/core.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/diagram/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/exceptions.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/helpers.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/results.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/testing.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/unicode.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/util.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/api.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/help.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/models.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__version__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/_internal_utils.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/adapters.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/api.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/auth.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/certs.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/compat.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/cookies.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/exceptions.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/help.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/hooks.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/models.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/packages.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/sessions.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/status_codes.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/structures.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/utils.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/structs.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__main__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/align.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/box.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/console.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/control.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/json.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/region.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/status.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/style.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/table.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/text.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_cell_widths.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_emoji_codes.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_emoji_replace.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_export_format.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_extension.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_inspect.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_log_render.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_loop.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_palettes.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_pick.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_ratio.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_spinners.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_stack.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_timer.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_win32_console.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_windows.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_windows_renderer.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_wrap.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/abc.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/align.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/ansi.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/bar.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/box.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/cells.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/color.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/color_triplet.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/columns.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/console.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/constrain.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/containers.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/control.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/default_styles.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/diagnose.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/emoji.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/errors.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/file_proxy.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/filesize.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/highlighter.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/json.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/jupyter.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/layout.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/live.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/live_render.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/logging.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/markup.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/measure.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/padding.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/pager.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/palette.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/panel.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/pretty.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/progress.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/progress_bar.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/prompt.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/protocol.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/region.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/repr.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/rule.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/scope.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/screen.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/segment.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/spinner.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/status.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/style.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/styled.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/syntax.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/table.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/terminal_theme.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/text.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/theme.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/themes.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/traceback.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/tree.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/six.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/_asyncio.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/_utils.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/after.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/before.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/before_sleep.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/nap.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/retry.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/stop.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/tornadoweb.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/wait.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tomli/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tomli/_parser.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tomli/_re.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tomli/_types.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/typing_extensions.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/_collections.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/_version.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/connection.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/exceptions.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/fields.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/filepost.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/packages/six.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/request.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/response.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/proxy.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/request.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/response.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/ssltransport.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/wait.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/vendor.txt delete mode 100644 .venv/Lib/site-packages/pip/_vendor/webencodings/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/webencodings/labels.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/webencodings/mklabels.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/webencodings/tests.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py delete mode 100644 .venv/Lib/site-packages/pip/py.typed delete mode 100644 .venv/Lib/site-packages/pkg_resources/__init__.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/__init__.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/zipp.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/appdirs.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__init__.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_adapters.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_common.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_compat.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_itertools.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_legacy.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/abc.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/readers.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/simple.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/jaraco/__init__.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/jaraco/__pycache__/context.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/jaraco/__pycache__/functools.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/jaraco/context.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/jaraco/functools.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/jaraco/text/__init__.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/__init__.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/more.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/more.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/recipes.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/tags.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/_manylinux.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/_musllinux.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/tags.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/version.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__init__.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/common.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/core.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/results.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/util.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/actions.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/common.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/core.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/diagram/__init__.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/exceptions.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/helpers.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/results.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/testing.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/unicode.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/util.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/zipp.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/extern/__init__.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools-65.5.0.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/setuptools-65.5.0.dist-info/LICENSE delete mode 100644 .venv/Lib/site-packages/setuptools-65.5.0.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/setuptools-65.5.0.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/setuptools-65.5.0.dist-info/REQUESTED delete mode 100644 .venv/Lib/site-packages/setuptools-65.5.0.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/setuptools-65.5.0.dist-info/entry_points.txt delete mode 100644 .venv/Lib/site-packages/setuptools-65.5.0.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/setuptools/__init__.py delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/_entry_points.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/_imp.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/_importlib.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/_itertools.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/_path.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/_reqs.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/archive_util.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/build_meta.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/dep_util.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/depends.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/discovery.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/dist.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/errors.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/extension.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/glob.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/installer.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/launch.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/logging.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/monkey.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/msvc.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/namespaces.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/package_index.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/py34compat.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/sandbox.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/unicode_utils.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/version.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/wheel.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/windows_support.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_deprecation_warning.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__init__.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/_collections.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/_functools.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/_macos_compat.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/_msvccompiler.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/archive_util.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/bcppcompiler.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/ccompiler.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/cmd.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/config.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/core.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/cygwinccompiler.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/debug.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/dep_util.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/dir_util.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/dist.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/errors.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/extension.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/fancy_getopt.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/file_util.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/filelist.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/log.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/msvc9compiler.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/msvccompiler.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/py38compat.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/py39compat.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/spawn.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/sysconfig.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/text_file.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/unixccompiler.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/util.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/version.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/versionpredicate.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/_collections.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/_functools.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/_macos_compat.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/_msvccompiler.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/archive_util.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/bcppcompiler.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/ccompiler.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/cmd.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__init__.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/_framework_compat.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_dumb.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_rpm.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_clib.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_ext.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_py.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_scripts.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/check.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/clean.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/config.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_data.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_egg_info.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_headers.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_lib.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_scripts.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/py37compat.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/register.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/sdist.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/upload.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/_framework_compat.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/bdist.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/bdist_dumb.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/bdist_rpm.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/build.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/build_clib.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/build_ext.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/build_py.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/build_scripts.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/check.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/clean.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/config.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/install.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/install_data.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/install_egg_info.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/install_headers.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/install_lib.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/install_scripts.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/py37compat.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/register.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/sdist.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/upload.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/config.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/core.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/cygwinccompiler.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/debug.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/dep_util.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/dir_util.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/dist.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/errors.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/extension.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/fancy_getopt.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/file_util.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/filelist.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/log.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/msvc9compiler.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/msvccompiler.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/py38compat.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/py39compat.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/spawn.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/sysconfig.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/text_file.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/unixccompiler.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/util.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/version.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/versionpredicate.py delete mode 100644 .venv/Lib/site-packages/setuptools/_entry_points.py delete mode 100644 .venv/Lib/site-packages/setuptools/_imp.py delete mode 100644 .venv/Lib/site-packages/setuptools/_importlib.py delete mode 100644 .venv/Lib/site-packages/setuptools/_itertools.py delete mode 100644 .venv/Lib/site-packages/setuptools/_path.py delete mode 100644 .venv/Lib/site-packages/setuptools/_reqs.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/__init__.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/__pycache__/typing_extensions.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/__pycache__/zipp.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__init__.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_adapters.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_collections.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_compat.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_functools.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_itertools.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_meta.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_text.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_adapters.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_collections.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_compat.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_functools.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_meta.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_text.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__init__.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_resources/_adapters.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_resources/_common.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_resources/_compat.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_resources/_itertools.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_resources/_legacy.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_resources/abc.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_resources/readers.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/importlib_resources/simple.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/jaraco/__init__.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/jaraco/__pycache__/context.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/jaraco/__pycache__/functools.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/jaraco/context.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/jaraco/functools.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/jaraco/text/__init__.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/more_itertools/__init__.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/more.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/more_itertools/more.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/more_itertools/recipes.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/ordered_set.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__about__.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__init__.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/_manylinux.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/_musllinux.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/_structures.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/markers.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/requirements.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/tags.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/utils.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/version.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/pyparsing/__init__.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/common.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/core.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/results.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/util.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/pyparsing/actions.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/pyparsing/common.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/pyparsing/core.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/pyparsing/diagram/__init__.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/pyparsing/exceptions.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/pyparsing/helpers.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/pyparsing/results.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/pyparsing/testing.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/pyparsing/unicode.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/pyparsing/util.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/tomli/__init__.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/_parser.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/_re.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/_types.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/tomli/_parser.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/tomli/_re.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/tomli/_types.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/typing_extensions.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/zipp.py delete mode 100644 .venv/Lib/site-packages/setuptools/archive_util.py delete mode 100644 .venv/Lib/site-packages/setuptools/build_meta.py delete mode 100644 .venv/Lib/site-packages/setuptools/cli-32.exe delete mode 100644 .venv/Lib/site-packages/setuptools/cli-64.exe delete mode 100644 .venv/Lib/site-packages/setuptools/cli-arm64.exe delete mode 100644 .venv/Lib/site-packages/setuptools/cli.exe delete mode 100644 .venv/Lib/site-packages/setuptools/command/__init__.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/alias.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/build.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/build_clib.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/build_ext.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/build_py.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/develop.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/dist_info.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/easy_install.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/editable_wheel.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/egg_info.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/install.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/install_lib.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/install_scripts.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/py36compat.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/register.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/rotate.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/saveopts.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/sdist.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/setopt.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/test.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/upload.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/upload_docs.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/alias.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/bdist_egg.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/bdist_rpm.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/build.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/build_clib.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/build_ext.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/build_py.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/develop.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/dist_info.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/easy_install.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/editable_wheel.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/egg_info.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/install.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/install_egg_info.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/install_lib.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/install_scripts.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/launcher manifest.xml delete mode 100644 .venv/Lib/site-packages/setuptools/command/py36compat.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/register.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/rotate.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/saveopts.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/sdist.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/setopt.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/test.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/upload.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/upload_docs.py delete mode 100644 .venv/Lib/site-packages/setuptools/config/__init__.py delete mode 100644 .venv/Lib/site-packages/setuptools/config/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/config/__pycache__/_apply_pyprojecttoml.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/config/__pycache__/expand.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/config/__pycache__/pyprojecttoml.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/config/__pycache__/setupcfg.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/config/_apply_pyprojecttoml.py delete mode 100644 .venv/Lib/site-packages/setuptools/config/_validate_pyproject/__init__.py delete mode 100644 .venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/error_reporting.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/extra_validations.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_exceptions.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_validations.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/formats.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/config/_validate_pyproject/error_reporting.py delete mode 100644 .venv/Lib/site-packages/setuptools/config/_validate_pyproject/extra_validations.py delete mode 100644 .venv/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py delete mode 100644 .venv/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py delete mode 100644 .venv/Lib/site-packages/setuptools/config/_validate_pyproject/formats.py delete mode 100644 .venv/Lib/site-packages/setuptools/config/expand.py delete mode 100644 .venv/Lib/site-packages/setuptools/config/pyprojecttoml.py delete mode 100644 .venv/Lib/site-packages/setuptools/config/setupcfg.py delete mode 100644 .venv/Lib/site-packages/setuptools/dep_util.py delete mode 100644 .venv/Lib/site-packages/setuptools/depends.py delete mode 100644 .venv/Lib/site-packages/setuptools/discovery.py delete mode 100644 .venv/Lib/site-packages/setuptools/dist.py delete mode 100644 .venv/Lib/site-packages/setuptools/errors.py delete mode 100644 .venv/Lib/site-packages/setuptools/extension.py delete mode 100644 .venv/Lib/site-packages/setuptools/extern/__init__.py delete mode 100644 .venv/Lib/site-packages/setuptools/extern/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/glob.py delete mode 100644 .venv/Lib/site-packages/setuptools/gui-32.exe delete mode 100644 .venv/Lib/site-packages/setuptools/gui-64.exe delete mode 100644 .venv/Lib/site-packages/setuptools/gui-arm64.exe delete mode 100644 .venv/Lib/site-packages/setuptools/gui.exe delete mode 100644 .venv/Lib/site-packages/setuptools/installer.py delete mode 100644 .venv/Lib/site-packages/setuptools/launch.py delete mode 100644 .venv/Lib/site-packages/setuptools/logging.py delete mode 100644 .venv/Lib/site-packages/setuptools/monkey.py delete mode 100644 .venv/Lib/site-packages/setuptools/msvc.py delete mode 100644 .venv/Lib/site-packages/setuptools/namespaces.py delete mode 100644 .venv/Lib/site-packages/setuptools/package_index.py delete mode 100644 .venv/Lib/site-packages/setuptools/py34compat.py delete mode 100644 .venv/Lib/site-packages/setuptools/sandbox.py delete mode 100644 .venv/Lib/site-packages/setuptools/script (dev).tmpl delete mode 100644 .venv/Lib/site-packages/setuptools/script.tmpl delete mode 100644 .venv/Lib/site-packages/setuptools/unicode_utils.py delete mode 100644 .venv/Lib/site-packages/setuptools/version.py delete mode 100644 .venv/Lib/site-packages/setuptools/wheel.py delete mode 100644 .venv/Lib/site-packages/setuptools/windows_support.py delete mode 100644 .venv/Lib/site-packages/yarl-1.9.4.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/yarl-1.9.4.dist-info/LICENSE delete mode 100644 .venv/Lib/site-packages/yarl-1.9.4.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/yarl-1.9.4.dist-info/NOTICE delete mode 100644 .venv/Lib/site-packages/yarl-1.9.4.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/yarl-1.9.4.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/yarl-1.9.4.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/yarl/__init__.py delete mode 100644 .venv/Lib/site-packages/yarl/__init__.pyi delete mode 100644 .venv/Lib/site-packages/yarl/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/yarl/__pycache__/_quoting.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/yarl/__pycache__/_quoting_py.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/yarl/__pycache__/_url.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/yarl/_quoting.py delete mode 100644 .venv/Lib/site-packages/yarl/_quoting_c.cp311-win_amd64.pyd delete mode 100644 .venv/Lib/site-packages/yarl/_quoting_c.pyi delete mode 100644 .venv/Lib/site-packages/yarl/_quoting_c.pyx delete mode 100644 .venv/Lib/site-packages/yarl/_quoting_py.py delete mode 100644 .venv/Lib/site-packages/yarl/_url.py delete mode 100644 .venv/Lib/site-packages/yarl/py.typed delete mode 100644 .venv/Scripts/Activate.ps1 delete mode 100644 .venv/Scripts/activate delete mode 100644 .venv/Scripts/activate.bat delete mode 100644 .venv/Scripts/deactivate.bat delete mode 100644 .venv/Scripts/pip.exe delete mode 100644 .venv/Scripts/pip3.11.exe delete mode 100644 .venv/Scripts/pip3.exe delete mode 100644 .venv/Scripts/python.exe delete mode 100644 .venv/Scripts/pythonw.exe delete mode 100644 .venv/pyvenv.cfg diff --git a/.venv/Lib/site-packages/_distutils_hack/__init__.py b/.venv/Lib/site-packages/_distutils_hack/__init__.py deleted file mode 100644 index f987a53..0000000 --- a/.venv/Lib/site-packages/_distutils_hack/__init__.py +++ /dev/null @@ -1,222 +0,0 @@ -# don't import any costly modules -import sys -import os - - -is_pypy = '__pypy__' in sys.builtin_module_names - - -def warn_distutils_present(): - if 'distutils' not in sys.modules: - return - if is_pypy and sys.version_info < (3, 7): - # PyPy for 3.6 unconditionally imports distutils, so bypass the warning - # https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250 - return - import warnings - - warnings.warn( - "Distutils was imported before Setuptools, but importing Setuptools " - "also replaces the `distutils` module in `sys.modules`. This may lead " - "to undesirable behaviors or errors. To avoid these issues, avoid " - "using distutils directly, ensure that setuptools is installed in the " - "traditional way (e.g. not an editable install), and/or make sure " - "that setuptools is always imported before distutils." - ) - - -def clear_distutils(): - if 'distutils' not in sys.modules: - return - import warnings - - warnings.warn("Setuptools is replacing distutils.") - mods = [ - name - for name in sys.modules - if name == "distutils" or name.startswith("distutils.") - ] - for name in mods: - del sys.modules[name] - - -def enabled(): - """ - Allow selection of distutils by environment variable. - """ - which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'local') - return which == 'local' - - -def ensure_local_distutils(): - import importlib - - clear_distutils() - - # With the DistutilsMetaFinder in place, - # perform an import to cause distutils to be - # loaded from setuptools._distutils. Ref #2906. - with shim(): - importlib.import_module('distutils') - - # check that submodules load as expected - core = importlib.import_module('distutils.core') - assert '_distutils' in core.__file__, core.__file__ - assert 'setuptools._distutils.log' not in sys.modules - - -def do_override(): - """ - Ensure that the local copy of distutils is preferred over stdlib. - - See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401 - for more motivation. - """ - if enabled(): - warn_distutils_present() - ensure_local_distutils() - - -class _TrivialRe: - def __init__(self, *patterns): - self._patterns = patterns - - def match(self, string): - return all(pat in string for pat in self._patterns) - - -class DistutilsMetaFinder: - def find_spec(self, fullname, path, target=None): - # optimization: only consider top level modules and those - # found in the CPython test suite. - if path is not None and not fullname.startswith('test.'): - return - - method_name = 'spec_for_{fullname}'.format(**locals()) - method = getattr(self, method_name, lambda: None) - return method() - - def spec_for_distutils(self): - if self.is_cpython(): - return - - import importlib - import importlib.abc - import importlib.util - - try: - mod = importlib.import_module('setuptools._distutils') - except Exception: - # There are a couple of cases where setuptools._distutils - # may not be present: - # - An older Setuptools without a local distutils is - # taking precedence. Ref #2957. - # - Path manipulation during sitecustomize removes - # setuptools from the path but only after the hook - # has been loaded. Ref #2980. - # In either case, fall back to stdlib behavior. - return - - class DistutilsLoader(importlib.abc.Loader): - def create_module(self, spec): - mod.__name__ = 'distutils' - return mod - - def exec_module(self, module): - pass - - return importlib.util.spec_from_loader( - 'distutils', DistutilsLoader(), origin=mod.__file__ - ) - - @staticmethod - def is_cpython(): - """ - Suppress supplying distutils for CPython (build and tests). - Ref #2965 and #3007. - """ - return os.path.isfile('pybuilddir.txt') - - def spec_for_pip(self): - """ - Ensure stdlib distutils when running under pip. - See pypa/pip#8761 for rationale. - """ - if self.pip_imported_during_build(): - return - clear_distutils() - self.spec_for_distutils = lambda: None - - @classmethod - def pip_imported_during_build(cls): - """ - Detect if pip is being imported in a build script. Ref #2355. - """ - import traceback - - return any( - cls.frame_file_is_setup(frame) for frame, line in traceback.walk_stack(None) - ) - - @staticmethod - def frame_file_is_setup(frame): - """ - Return True if the indicated frame suggests a setup.py file. - """ - # some frames may not have __file__ (#2940) - return frame.f_globals.get('__file__', '').endswith('setup.py') - - def spec_for_sensitive_tests(self): - """ - Ensure stdlib distutils when running select tests under CPython. - - python/cpython#91169 - """ - clear_distutils() - self.spec_for_distutils = lambda: None - - sensitive_tests = ( - [ - 'test.test_distutils', - 'test.test_peg_generator', - 'test.test_importlib', - ] - if sys.version_info < (3, 10) - else [ - 'test.test_distutils', - ] - ) - - -for name in DistutilsMetaFinder.sensitive_tests: - setattr( - DistutilsMetaFinder, - f'spec_for_{name}', - DistutilsMetaFinder.spec_for_sensitive_tests, - ) - - -DISTUTILS_FINDER = DistutilsMetaFinder() - - -def add_shim(): - DISTUTILS_FINDER in sys.meta_path or insert_shim() - - -class shim: - def __enter__(self): - insert_shim() - - def __exit__(self, exc, value, tb): - remove_shim() - - -def insert_shim(): - sys.meta_path.insert(0, DISTUTILS_FINDER) - - -def remove_shim(): - try: - sys.meta_path.remove(DISTUTILS_FINDER) - except ValueError: - pass diff --git a/.venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index a19bf6bed41f392c04597b6c0de8b35fe62194c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11178 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 diff --git a/.venv/Lib/site-packages/_distutils_hack/override.py b/.venv/Lib/site-packages/_distutils_hack/override.py deleted file mode 100644 index 2cc433a..0000000 --- a/.venv/Lib/site-packages/_distutils_hack/override.py +++ /dev/null @@ -1 +0,0 @@ -__import__('_distutils_hack').do_override() diff --git a/.venv/Lib/site-packages/aiohttp-3.9.3.dist-info/INSTALLER b/.venv/Lib/site-packages/aiohttp-3.9.3.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/Lib/site-packages/aiohttp-3.9.3.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/Lib/site-packages/aiohttp-3.9.3.dist-info/LICENSE.txt b/.venv/Lib/site-packages/aiohttp-3.9.3.dist-info/LICENSE.txt deleted file mode 100644 index e497a32..0000000 --- a/.venv/Lib/site-packages/aiohttp-3.9.3.dist-info/LICENSE.txt +++ /dev/null @@ -1,13 +0,0 @@ - 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/.venv/Lib/site-packages/aiohttp-3.9.3.dist-info/METADATA b/.venv/Lib/site-packages/aiohttp-3.9.3.dist-info/METADATA deleted file mode 100644 index 8db6d13..0000000 --- a/.venv/Lib/site-packages/aiohttp-3.9.3.dist-info/METADATA +++ /dev/null @@ -1,243 +0,0 @@ -Metadata-Version: 2.1 -Name: aiohttp -Version: 3.9.3 -Summary: Async http client/server framework (asyncio) -Home-page: https://github.com/aio-libs/aiohttp -Maintainer: aiohttp team -Maintainer-email: team@aiohttp.org -License: Apache 2 -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: License :: OSI Approved :: Apache Software License -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.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Topic :: Internet :: WWW/HTTP -Requires-Python: >=3.8 -Description-Content-Type: text/x-rst -License-File: LICENSE.txt -Requires-Dist: aiosignal >=1.1.2 -Requires-Dist: attrs >=17.3.0 -Requires-Dist: frozenlist >=1.1.1 -Requires-Dist: multidict <7.0,>=4.5 -Requires-Dist: yarl <2.0,>=1.0 -Requires-Dist: async-timeout <5.0,>=4.0 ; python_version < "3.11" -Provides-Extra: speedups -Requires-Dist: brotlicffi ; (platform_python_implementation != "CPython") and extra == 'speedups' -Requires-Dist: Brotli ; (platform_python_implementation == "CPython") and extra == 'speedups' -Requires-Dist: aiodns ; (sys_platform == "linux" or sys_platform == "darwin") and extra == 'speedups' - -================================== -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://readthedocs.org/projects/aiohttp/badge/?version=latest - :target: https://docs.aiohttp.org/ - :alt: Latest Read The Docs - -.. 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 - - -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 - -*gitter chat* https://gitter.im/aio-libs/Lobby - -We support `Stack Overflow -`_. -Please add *aiohttp* tag to your question there. - -Requirements -============ - -- async-timeout_ -- 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 diff --git a/.venv/Lib/site-packages/aiohttp-3.9.3.dist-info/RECORD b/.venv/Lib/site-packages/aiohttp-3.9.3.dist-info/RECORD deleted file mode 100644 index 714d072..0000000 --- a/.venv/Lib/site-packages/aiohttp-3.9.3.dist-info/RECORD +++ /dev/null @@ -1,119 +0,0 @@ -aiohttp-3.9.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -aiohttp-3.9.3.dist-info/LICENSE.txt,sha256=wUk-nxDVnR-6n53ygAjhVX4zz5-6yM4SY6ozk5goA94,601 -aiohttp-3.9.3.dist-info/METADATA,sha256=bmYqabW6J4U7r7Eg_XyVQZ_l3lltajSs-rrdfsfsAnE,7600 -aiohttp-3.9.3.dist-info/RECORD,, -aiohttp-3.9.3.dist-info/WHEEL,sha256=ircjsfhzblqgSzO8ow7-0pXK-RVqDqNRGQ8F650AUNM,102 -aiohttp-3.9.3.dist-info/top_level.txt,sha256=iv-JIaacmTl-hSho3QmphcKnbRRYx1st47yjz_178Ro,8 -aiohttp/.hash/_cparser.pxd.hash,sha256=dVGMrCmyJM_owqoRLPezK095md0X5R319koTuhUN6DQ,64 -aiohttp/.hash/_find_header.pxd.hash,sha256=W5qRPWDc55gArGZkriI5tztmQHkrdwR6NdQfRQfTxIg,64 -aiohttp/.hash/_helpers.pyi.hash,sha256=bAsxbXsjcZ5gbj1c561GYcRtQ5REXxrCihR-HN0XKPk,64 -aiohttp/.hash/_helpers.pyx.hash,sha256=-DfrN0XUqBhyb8bp2fJQVb1Lo9S1S-psob-7MJBM18c,64 -aiohttp/.hash/_http_parser.pyx.hash,sha256=8fpadR-Mg6RMlNNLGfIYRh56a6SedGbXY5x9A40ciRs,64 -aiohttp/.hash/_http_writer.pyx.hash,sha256=z39c0hUcdud-ZCon2d9bWpxrFMVdW1dvjtCgxW4RDnI,64 -aiohttp/.hash/_websocket.pyx.hash,sha256=90x5ulhWiFtw2wAri2_82Zas5i3iEkJ-flYJK9Xx-SY,64 -aiohttp/.hash/hdrs.py.hash,sha256=QBHPUkJcp8iPZv3ENUbevgpJzljxoP2qwkBeX3nQ82o,64 -aiohttp/__init__.py,sha256=abMZGeBfcDCjr4nPoKt3a1limp8Z7bP2ngpnxEtEKWU,8002 -aiohttp/__pycache__/__init__.cpython-311.pyc,, -aiohttp/__pycache__/abc.cpython-311.pyc,, -aiohttp/__pycache__/base_protocol.cpython-311.pyc,, -aiohttp/__pycache__/client.cpython-311.pyc,, -aiohttp/__pycache__/client_exceptions.cpython-311.pyc,, -aiohttp/__pycache__/client_proto.cpython-311.pyc,, -aiohttp/__pycache__/client_reqrep.cpython-311.pyc,, -aiohttp/__pycache__/client_ws.cpython-311.pyc,, -aiohttp/__pycache__/compression_utils.cpython-311.pyc,, -aiohttp/__pycache__/connector.cpython-311.pyc,, -aiohttp/__pycache__/cookiejar.cpython-311.pyc,, -aiohttp/__pycache__/formdata.cpython-311.pyc,, -aiohttp/__pycache__/hdrs.cpython-311.pyc,, -aiohttp/__pycache__/helpers.cpython-311.pyc,, -aiohttp/__pycache__/http.cpython-311.pyc,, -aiohttp/__pycache__/http_exceptions.cpython-311.pyc,, -aiohttp/__pycache__/http_parser.cpython-311.pyc,, -aiohttp/__pycache__/http_websocket.cpython-311.pyc,, -aiohttp/__pycache__/http_writer.cpython-311.pyc,, -aiohttp/__pycache__/locks.cpython-311.pyc,, -aiohttp/__pycache__/log.cpython-311.pyc,, -aiohttp/__pycache__/multipart.cpython-311.pyc,, -aiohttp/__pycache__/payload.cpython-311.pyc,, -aiohttp/__pycache__/payload_streamer.cpython-311.pyc,, -aiohttp/__pycache__/pytest_plugin.cpython-311.pyc,, -aiohttp/__pycache__/resolver.cpython-311.pyc,, -aiohttp/__pycache__/streams.cpython-311.pyc,, -aiohttp/__pycache__/tcp_helpers.cpython-311.pyc,, -aiohttp/__pycache__/test_utils.cpython-311.pyc,, -aiohttp/__pycache__/tracing.cpython-311.pyc,, -aiohttp/__pycache__/typedefs.cpython-311.pyc,, -aiohttp/__pycache__/web.cpython-311.pyc,, -aiohttp/__pycache__/web_app.cpython-311.pyc,, -aiohttp/__pycache__/web_exceptions.cpython-311.pyc,, -aiohttp/__pycache__/web_fileresponse.cpython-311.pyc,, -aiohttp/__pycache__/web_log.cpython-311.pyc,, -aiohttp/__pycache__/web_middlewares.cpython-311.pyc,, -aiohttp/__pycache__/web_protocol.cpython-311.pyc,, -aiohttp/__pycache__/web_request.cpython-311.pyc,, -aiohttp/__pycache__/web_response.cpython-311.pyc,, -aiohttp/__pycache__/web_routedef.cpython-311.pyc,, -aiohttp/__pycache__/web_runner.cpython-311.pyc,, -aiohttp/__pycache__/web_server.cpython-311.pyc,, -aiohttp/__pycache__/web_urldispatcher.cpython-311.pyc,, -aiohttp/__pycache__/web_ws.cpython-311.pyc,, -aiohttp/__pycache__/worker.cpython-311.pyc,, -aiohttp/_cparser.pxd,sha256=W6-cu0SyHhOEPeb475NvxagQ1Jz9pWqyZJvwEqTLNs0,4476 -aiohttp/_find_header.pxd,sha256=BFUSmxhemBtblqxzjzH3x03FfxaWlTyuAIOz8YZ5_nM,70 -aiohttp/_headers.pxi,sha256=1MhCe6Un_KI1tpO85HnDfzVO94BhcirLanAOys5FIHA,2090 -aiohttp/_helpers.cp311-win_amd64.pyd,sha256=wNr6g-bLcKOZAozp0fIJMaWX4RqIVOL92x_ZASnW2lU,54272 -aiohttp/_helpers.pyi,sha256=2Hd5IC0Zf4YTEJ412suyyhsh1kVyVDv5g4stgyo2Ksc,208 -aiohttp/_helpers.pyx,sha256=tgl7fZh0QMT6cjf4jSJ8iaO6DdQD3GON2-SH4N5_ETg,1084 -aiohttp/_http_parser.cp311-win_amd64.pyd,sha256=uoQFgIoUgly8TEGWjiHa4L3_963MMEB8JN5F29tsEko,255488 -aiohttp/_http_parser.pyx,sha256=OcojgALQ4EHKQ4VnTud53Wd2t7cH1KCDfBESMqwdO7o,28894 -aiohttp/_http_writer.cp311-win_amd64.pyd,sha256=KfdngH6lqaRjy-wfTNW0NeDpJZ9-QyBt7BXmxxOTUvg,49152 -aiohttp/_http_writer.pyx,sha256=8CBLytO2rx1kdpWe9HYSznhLXdeZWyE-3xI7jaGasag,4738 -aiohttp/_websocket.cp311-win_amd64.pyd,sha256=yT7KsjodDRCIqjuMYnPKTuLflZPTwWfRPft5v8FVtg4,36352 -aiohttp/_websocket.pyx,sha256=o9J7yi9c2-jTBjE3dUkXxhDWKvRWJz5GZfyLsgJQa38,1617 -aiohttp/abc.py,sha256=wpbkcMsLWB_r_sD35PesqbWFY3tZOvilOjqSqHDUaMQ,5709 -aiohttp/base_protocol.py,sha256=u4ITEnXHJ88gNDngHxiU01ZPQhMy_m2eQTJx0cqwvXA,2831 -aiohttp/client.py,sha256=O5ef1NVAo0-Am0JrOPp6UIMkIK1EVJZ_FCb7qrd3DdE,48639 -aiohttp/client_exceptions.py,sha256=BiReSs5jdjdmhB99vYNBcypsuRfyQU2UQXG0cVRAD2A,9757 -aiohttp/client_proto.py,sha256=2_mvTWubu1aS9UU-JOhI_ABpSnVPIOxb-Dcz0-RbtHc,8915 -aiohttp/client_reqrep.py,sha256=TZ-lZ2QBFDJt2-fq_MPyZFEY-yu4awcz6SgZEiEBg_g,40960 -aiohttp/client_ws.py,sha256=mi8iVYQR25Hi20AQing6T1BZBcO24NsQIKubhsR8izM,11325 -aiohttp/compression_utils.py,sha256=OIQOhFq_YssPx-SNCn9UkQTqntHhZKZakhwUQfaJSyA,5172 -aiohttp/connector.py,sha256=6uVBggjuvD5y1i66674TRghZjXuMWBTGG8ao1CELvVc,54287 -aiohttp/cookiejar.py,sha256=vgjrRISdZ5jwGfJC6T9QLuW-f56KfpGrtnrcbsUHkU0,14434 -aiohttp/formdata.py,sha256=iySnD63XJwo4l1TT_KZiJGNzzmn0RtvvF2_FnJM32Uo,6278 -aiohttp/hdrs.py,sha256=_JN4MBE-UoBXGWGoSCKhIviTRc2IXS4fyk5nnuox0Ak,4721 -aiohttp/helpers.py,sha256=or4ZTfv64_hNgSygxXCWU5sbvsM1YvP6M4S4c-eCLeU,31254 -aiohttp/http.py,sha256=DGKcwDbgIMpasv7s2jeKCRuixyj7W-RIrihRFjj0xcY,1914 -aiohttp/http_exceptions.py,sha256=GJYn38j4sI4KdUh993VnZlbgVHOUNI_Z9-ASDTjl5aU,2822 -aiohttp/http_parser.py,sha256=-_dJ9GGj37sMFnaNDH59p2mTku2rbVR_MLV9J4N5qhc,36509 -aiohttp/http_websocket.py,sha256=QXRR8XWtGwie7XuOw1eaUOQIUDvPrRq6s56lePn9xbM,27456 -aiohttp/http_writer.py,sha256=p8H39HhtilQEE90njvtJHc94Am95zjHNoS8T1JcNXJc,6131 -aiohttp/locks.py,sha256=vp1Z4zx0SvooSffw88dkZ-7qpk2CqRf5vWh2dpKagTA,1177 -aiohttp/log.py,sha256=zYUTvXsMQ9Sz1yNN8kXwd5Qxu49a1FzjZ_wQqriEc8M,333 -aiohttp/multipart.py,sha256=DF5PjzlZHrfHRlCp6o4nhd6el8Ff0xiBCvJXJm1o4Wo,33441 -aiohttp/payload.py,sha256=Ap0E4_p1d9E2UTTIYmBe5HXz05Tt7TN5nZ2zfYDtkr0,14005 -aiohttp/payload_streamer.py,sha256=rBb3jAFcwAK1QOgbhya2y4zGjhT11oQrepdcffA1_jM,2162 -aiohttp/py.typed,sha256=3VVwXUAWVEVX7sDwyYDnW5ZdBC9_Z9AJAFfLCleUW0k,8 -aiohttp/pytest_plugin.py,sha256=fJxoTu3NI1wDjFIV1FDmx0oGdRU7r6baovTwJneR6J4,11986 -aiohttp/resolver.py,sha256=k5cVNWiiCHqKDGko7UZNu2y-j6SrU7vQBx-omwHPhso,5230 -aiohttp/streams.py,sha256=Yy5Sj8ewDvbQTKe2BGnUGmCcj0bbl0EeKBT3uMK4K6M,21502 -aiohttp/tcp_helpers.py,sha256=K-hhGh3jd6qCEnHJo8LvFyfJwBjh99UKI7A0aSRVhj4,998 -aiohttp/test_utils.py,sha256=j2M78YyBz12p8tzcR-EiSZO_NlDK8vKkRzus4enyWYg,20860 -aiohttp/tracing.py,sha256=0EccU7PYykvNwd75SNFcuQ1I57RdSu2jDYIvNK2BW6c,15603 -aiohttp/typedefs.py,sha256=x7HBHDU2IlRZZb7ketOdc2Js0MLx53agxk0UnLxNFw4,1525 -aiohttp/web.py,sha256=8rghTkpERz14vRQA4oyXfGZLWMIBMrrHXxcvtZZ_fAU,19879 -aiohttp/web_app.py,sha256=0bajIxV0xb5AB9TChRsoVP8ytTLiY_TU7zrQ66GHNus,18907 -aiohttp/web_exceptions.py,sha256=itNRhCMDJFhnMWftr5SyTsoqh-i0n9rzTj0sjcAEUjo,10812 -aiohttp/web_fileresponse.py,sha256=dnldRvrC8tDrvTkHNru3Y9LJWKwEGclhlglp1OuNQ5c,11717 -aiohttp/web_log.py,sha256=w81HIudhfSxfodo2Fjkok7jWT56XXIrVMJN6ihYnLo0,8014 -aiohttp/web_middlewares.py,sha256=rYWtxDZ2AM3C2FvNuNyffpfmMfcHrxkSZMaTcsG1T_Q,4148 -aiohttp/web_protocol.py,sha256=nocQ-qrtl8XoZBtovtMOIg5Pk5wCHsH_sSy_Uy71VTI,23742 -aiohttp/web_request.py,sha256=C9uGSdocM-1w8UXtpN23fKiUPJ2jx_3W_3quhbVNYtE,29654 -aiohttp/web_response.py,sha256=1RWBY6v8qFHCcRyyJIImreSuDDFcFC-eBW1uDBn8Wko,28546 -aiohttp/web_routedef.py,sha256=7ZribqwusXb1s0T2vLj1roFne1fdz_ZsudBwRyiwQxM,6348 -aiohttp/web_runner.py,sha256=PUmmc3deHj1Iae2PYlPvSedD2dLTXgbumRjRl8QGLOc,12142 -aiohttp/web_server.py,sha256=kOlImrScEbvkGHG7i-N-7eqf55f2zC_J2BZcJanGGmU,2664 -aiohttp/web_urldispatcher.py,sha256=JqFCsCKBvnFXveUzzxUzyhV4LwbfysY8KAVGq5_82b0,41289 -aiohttp/web_ws.py,sha256=b7oHcrYINTwgQOcAnC7LgEG7R5J_7krpSQ-mZu0oo3U,19176 -aiohttp/worker.py,sha256=vDMxlk-Mo3rzN4yubw2-c8T6yg7PRY8Mv0NLuRm8lWw,8212 diff --git a/.venv/Lib/site-packages/aiohttp-3.9.3.dist-info/WHEEL b/.venv/Lib/site-packages/aiohttp-3.9.3.dist-info/WHEEL deleted file mode 100644 index d60b004..0000000 --- a/.venv/Lib/site-packages/aiohttp-3.9.3.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) -Root-Is-Purelib: false -Tag: cp311-cp311-win_amd64 - diff --git a/.venv/Lib/site-packages/aiohttp-3.9.3.dist-info/top_level.txt b/.venv/Lib/site-packages/aiohttp-3.9.3.dist-info/top_level.txt deleted file mode 100644 index ee4ba4f..0000000 --- a/.venv/Lib/site-packages/aiohttp-3.9.3.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -aiohttp diff --git a/.venv/Lib/site-packages/aiohttp/.hash/_cparser.pxd.hash b/.venv/Lib/site-packages/aiohttp/.hash/_cparser.pxd.hash deleted file mode 100644 index 1dc9b9a..0000000 --- a/.venv/Lib/site-packages/aiohttp/.hash/_cparser.pxd.hash +++ /dev/null @@ -1 +0,0 @@ -5baf9cbb44b21e13843de6f8ef936fc5a810d49cfda56ab2649bf012a4cb36cd \ No newline at end of file diff --git a/.venv/Lib/site-packages/aiohttp/.hash/_find_header.pxd.hash b/.venv/Lib/site-packages/aiohttp/.hash/_find_header.pxd.hash deleted file mode 100644 index ab9d476..0000000 --- a/.venv/Lib/site-packages/aiohttp/.hash/_find_header.pxd.hash +++ /dev/null @@ -1 +0,0 @@ -0455129b185e981b5b96ac738f31f7c74dc57f1696953cae0083b3f18679fe73 \ No newline at end of file diff --git a/.venv/Lib/site-packages/aiohttp/.hash/_helpers.pyi.hash b/.venv/Lib/site-packages/aiohttp/.hash/_helpers.pyi.hash deleted file mode 100644 index c304d37..0000000 --- a/.venv/Lib/site-packages/aiohttp/.hash/_helpers.pyi.hash +++ /dev/null @@ -1 +0,0 @@ -d87779202d197f8613109e35dacbb2ca1b21d64572543bf9838b2d832a362ac7 \ No newline at end of file diff --git a/.venv/Lib/site-packages/aiohttp/.hash/_helpers.pyx.hash b/.venv/Lib/site-packages/aiohttp/.hash/_helpers.pyx.hash deleted file mode 100644 index 8164dbb..0000000 --- a/.venv/Lib/site-packages/aiohttp/.hash/_helpers.pyx.hash +++ /dev/null @@ -1 +0,0 @@ -b6097b7d987440c4fa7237f88d227c89a3ba0dd403dc638ddbe487e0de7f1138 \ No newline at end of file diff --git a/.venv/Lib/site-packages/aiohttp/.hash/_http_parser.pyx.hash b/.venv/Lib/site-packages/aiohttp/.hash/_http_parser.pyx.hash deleted file mode 100644 index 663750d..0000000 --- a/.venv/Lib/site-packages/aiohttp/.hash/_http_parser.pyx.hash +++ /dev/null @@ -1 +0,0 @@ -39ca238002d0e041ca4385674ee779dd6776b7b707d4a0837c111232ac1d3bba \ No newline at end of file diff --git a/.venv/Lib/site-packages/aiohttp/.hash/_http_writer.pyx.hash b/.venv/Lib/site-packages/aiohttp/.hash/_http_writer.pyx.hash deleted file mode 100644 index 10d8347..0000000 --- a/.venv/Lib/site-packages/aiohttp/.hash/_http_writer.pyx.hash +++ /dev/null @@ -1 +0,0 @@ -f0204bcad3b6af1d6476959ef47612ce784b5dd7995b213edf123b8da19ab1a8 \ No newline at end of file diff --git a/.venv/Lib/site-packages/aiohttp/.hash/_websocket.pyx.hash b/.venv/Lib/site-packages/aiohttp/.hash/_websocket.pyx.hash deleted file mode 100644 index 511f26f..0000000 --- a/.venv/Lib/site-packages/aiohttp/.hash/_websocket.pyx.hash +++ /dev/null @@ -1 +0,0 @@ -a3d27bca2f5cdbe8d3063137754917c610d62af456273e4665fc8bb202506b7f \ No newline at end of file diff --git a/.venv/Lib/site-packages/aiohttp/.hash/hdrs.py.hash b/.venv/Lib/site-packages/aiohttp/.hash/hdrs.py.hash deleted file mode 100644 index b032e6e..0000000 --- a/.venv/Lib/site-packages/aiohttp/.hash/hdrs.py.hash +++ /dev/null @@ -1 +0,0 @@ -fc937830113e5280571961a84822a122f89345cd885d2e1fca4e679eea31d009 \ No newline at end of file diff --git a/.venv/Lib/site-packages/aiohttp/__init__.py b/.venv/Lib/site-packages/aiohttp/__init__.py deleted file mode 100644 index 12209de..0000000 --- a/.venv/Lib/site-packages/aiohttp/__init__.py +++ /dev/null @@ -1,240 +0,0 @@ -__version__ = "3.9.3" - -from typing import TYPE_CHECKING, Tuple - -from . import hdrs as hdrs -from .client import ( - BaseConnector as BaseConnector, - ClientConnectionError as ClientConnectionError, - ClientConnectorCertificateError as ClientConnectorCertificateError, - ClientConnectorError as ClientConnectorError, - ClientConnectorSSLError as ClientConnectorSSLError, - ClientError as ClientError, - ClientHttpProxyError as ClientHttpProxyError, - ClientOSError as ClientOSError, - ClientPayloadError as ClientPayloadError, - ClientProxyConnectionError as ClientProxyConnectionError, - ClientRequest as ClientRequest, - ClientResponse as ClientResponse, - ClientResponseError as ClientResponseError, - ClientSession as ClientSession, - ClientSSLError as ClientSSLError, - ClientTimeout as ClientTimeout, - ClientWebSocketResponse as ClientWebSocketResponse, - ContentTypeError as ContentTypeError, - Fingerprint as Fingerprint, - InvalidURL as InvalidURL, - NamedPipeConnector as NamedPipeConnector, - RequestInfo as RequestInfo, - ServerConnectionError as ServerConnectionError, - ServerDisconnectedError as ServerDisconnectedError, - ServerFingerprintMismatch as ServerFingerprintMismatch, - ServerTimeoutError as ServerTimeoutError, - TCPConnector as TCPConnector, - TooManyRedirects as TooManyRedirects, - UnixConnector as UnixConnector, - WSServerHandshakeError as WSServerHandshakeError, - request as request, -) -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, - 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 - "BaseConnector", - "ClientConnectionError", - "ClientConnectorCertificateError", - "ClientConnectorError", - "ClientConnectorSSLError", - "ClientError", - "ClientHttpProxyError", - "ClientOSError", - "ClientPayloadError", - "ClientProxyConnectionError", - "ClientResponse", - "ClientRequest", - "ClientResponseError", - "ClientSSLError", - "ClientSession", - "ClientTimeout", - "ClientWebSocketResponse", - "ContentTypeError", - "Fingerprint", - "InvalidURL", - "RequestInfo", - "ServerConnectionError", - "ServerDisconnectedError", - "ServerFingerprintMismatch", - "ServerTimeoutError", - "TCPConnector", - "TooManyRedirects", - "UnixConnector", - "NamedPipeConnector", - "WSServerHandshakeError", - "request", - # cookiejar - "CookieJar", - "DummyCookieJar", - # formdata - "FormData", - # helpers - "BasicAuth", - "ChainMapProxy", - "ETag", - # 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", - "FlowControlDataQueue", - "StreamReader", - # tracing - "TraceConfig", - "TraceConnectionCreateEndParams", - "TraceConnectionCreateStartParams", - "TraceConnectionQueuedEndParams", - "TraceConnectionQueuedStartParams", - "TraceConnectionReuseconnParams", - "TraceDnsCacheHitParams", - "TraceDnsCacheMissParams", - "TraceDnsResolveHostEndParams", - "TraceDnsResolveHostStartParams", - "TraceRequestChunkSentParams", - "TraceRequestEndParams", - "TraceRequestExceptionParams", - "TraceRequestRedirectParams", - "TraceRequestStartParams", - "TraceResponseChunkReceivedParams", - # workers (imported lazily with __getattr__) - "GunicornUVLoopWebWorker", - "GunicornWebWorker", -) - - -def __dir__() -> Tuple[str, ...]: - return __all__ + ("__author__", "__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/.venv/Lib/site-packages/aiohttp/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 5b010e2290965eccb3de9755534c2f1a6ff11fcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5644 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 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/abc.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/abc.cpython-311.pyc deleted file mode 100644 index 026c9b28f9a4ec974d92ecb275a5c03538e93cd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11605 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 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/base_protocol.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/base_protocol.cpython-311.pyc deleted file mode 100644 index 4df0407209b3c7f08e1531deeba2c9035c898c91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4543 zcmd5=-ESMm5#Ku=siXLH5=Etq1NFhkQ)l)*$fKzs zk6o^2KW2AtcYZTFv-)Es(n}y^{`ns@79!+d*l?2Ht{l7vl`WzWg)5K@mVAL*;WPY- zFXQ8g;!}izu;S17Il`0g6UG0KC;^o$2b_hT_y~Cpe^$!$DBNw5?)eg%b7|fbe_S&1 zS}|KNgWoO@P zXNv;tN5}-!9>u4Mi@XweDB!&3_9Afhpdu+fFs2tu5y}vhK`6se_Cgs^La=JonSkeo zRl~rEDG^mt`-U8r^TjCe`eAkq%D5uHY5UCZm8`D5M>RvsX@zva^veZJE15lVDO=W6 z#f-=b&E|{p{cPS)sVT`htyolZC>a>38)i(VYF5b?KX7IQ4Vo?LC5;-Uz}5;-)hN^A zT#k1)L;w;(Q1%Bmfozd=Zk@<3Tfr8}niPMf>MGUevrEP7;`}u&S6)$zhCY8)!=oiZ zK+AAwXx~o0`NsF4yIh)|zNZ%N&EL!~%9KHSoGfmBH2^)nm7W^ZF~7>aP?;^hsYF22?{p2Bi?|E=@T z9o>N60SqTOS60w)B|88OkStloAuK6e8FidrJ9&#ilDtF9YBIl=G?vt43)o~{PiiH# zI6arbkC|Xf9dv(Q+9$|W!C*VtZ9tcP?7T;X2ibt(%>+ybHqTV;Q5om<^s-cm_==jF9 zdiYo)KD0Ia``O=Je0;GW5fu+(snXLr$&guoR-yI^rZ*|H*}X2h5O_~ z-(7OQixRsSp$eu0t!v7(RoK2;&FE#rp!tQep9IZ}XY4W~Eq9F}Dj=qpi?@Fg@ z(sW&#uCn}cZ{Wl~Qg8odxEjBKpd?xZW;_y_KInV-^5y>61mc~nvfK>8>g*G+Jmdqs zkRJ`5B7YjZEcpKBaU?pvL-LhL>=bk|Qx!eATH+o>Ioz@|Y^71*d&O=y$-(d+Yi83ql zQ|vT*vifQ&Ug14UjIU^^|;C)jCbVv>XyeFHDaEF(c@dKqM-Qz0)>KuOojH$l*9)EP6Oj$i0m7 zD?ln_e`o|zU_J^it6;nl?%%l4XnCiNOIFXws1H5wx9_UCZpm_*2l=U-{lATfScl zRuq!v=hk9Z-8VxLkw}XagF|zm)qhI`;F%X|QwxmY%}5R|IzyEg%kYR$DS9b0pfBas zf=&0bkv(Uful>tR{`WjR~0IYC+03!0(JvL%ha%L_WZxpKyJc#s%3;rT`ru$(Ev z+XJLvteV1trWKgX=`e8U2_z{b=w8eSUT>{i67MpKz*~&#jy2LZk#QEtGs5=G0z`@d z5F@A+`XK0L#r-w;p1wfk-DZElKfC?2`p8>N0<|yBu%eSlBoJ-#y#LfT@S$jtuYACI z_;bc=ioAaqS?xp={SZrd$v^=6yhIB4!FhR!H3`)I3g3pJlk`UYCwI<1 z{ZW1Fe3L-^3xgG%BpLLNH_0Kyk{OB%48YQ3W3>bi6eeuTYq9?>SQ@G`cV&vsT1t*~E%j8?nleUhqrb2D(87%#n P@v*NM^S_4-VO#qj(PHv; diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/client.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/client.cpython-311.pyc deleted file mode 100644 index b20ca9c2ab2ac3d84d53ca5e5a86a04578e4fffb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52600 zcmd?S3w#^rbtgJ_kst{YAPBx+;QRfi-cOpO9+X7MA|>0f9faZxB~k>T3_#1GL0huj zl+M*|7_So1uChiFIiVY6tL{y9b^A+i-J51_+S{}MJ6)mJ@>l-a__pco-NKdAy4k($ z{hx1UfEkdo<+R)O_uCX9B<%_vj&fWy^S6tdz(Ba_BMOW>}~N_*gM0M!QPpkO!l^VtazJdvwYc} zYy-t*p3U*uJT_mhCzshRvw1$d$L@1@9KL){zR&4#`U*S+K9|SkEA$lliabTWVo$NJ z#8cuc^_2R`JY~LePr0wcQ{k)hRQjqsRlaIZwa@Kwv-pg&HJ%!zlQCQCtMk

OJ+o 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

6K%J!z> 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

-dp0IqirzdIT29+A37q7@x0!{OcN8cAO{ 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 I^?4}p2jex#%m4rY diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/client_exceptions.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/client_exceptions.cpython-311.pyc deleted file mode 100644 index 169899c351301c820be764dbb34f57f2db280050..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16579 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 T{cd^ed!IAhFCWu_k@J56<2@Qa diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/client_reqrep.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/client_reqrep.cpython-311.pyc deleted file mode 100644 index eea684989cccd442fc6009ab552f53d21b2dbb68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57388 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 HB|Q6IrhN-C diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/compression_utils.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/compression_utils.cpython-311.pyc deleted file mode 100644 index 57c8632e52ce3e4191855d0c7c4d4064caabf6c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9137 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�{*8O^o5z)3d{hy^2pTR}x=*))wDZPorq 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 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/cookiejar.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/cookiejar.cpython-311.pyc deleted file mode 100644 index 624dd009523b3c2c97a13a08e6843b9838bbb3e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20245 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 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/formdata.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/formdata.cpython-311.pyc deleted file mode 100644 index 5d21633b9e2d92918344c7e84aa03e75378f14bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8060 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 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/helpers.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/helpers.cpython-311.pyc deleted file mode 100644 index d4e307348422770ab5fc35c620c341beb608b6d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50471 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 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/http.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/http.cpython-311.pyc deleted file mode 100644 index 9c8b99ac65f449102af17e78514b6aeecf6906de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2129 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 Per7iedvrf5(*XWII|=V` diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/http_websocket.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/http_websocket.cpython-311.pyc deleted file mode 100644 index d7f6f64585a5a51b6f571e4cbf19d2465d81ba9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29927 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 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/locks.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/locks.cpython-311.pyc deleted file mode 100644 index 7dd2525a2f3889922984dee0608ed760147c302a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2605 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�ABBg_Mxww|4 zP)qVsF0QQV_DeTkN|w-qKjm-A|E0^yZ(q83Y0Y@Nfx~lHCS_t-yHwVm@)!8gaW!O7 z;>sg7;9*zZimMW3b@s6nZPzoGOx!3%WXsVCNt@>npBp_^_L4OS@ z8Zac2W%8R2)0vL;f|@XFT}CvWtm{IYKEaR2jOQS%M;^L58o5k|CkZrb2^T4rR;L-; z@ROj(g-aB`=C29z4N#&f@{LfUA_Cm8@rXbKs_+V&jN`H}1@b<2P52^(eVbk&j3kh3 zK;{b3(om+iUZW&LHOkZ(DU8Y_T7n{eM2~DF(f$#ER(w(XD<&~m-O2e|Vz?5?qA`h) z)t#~WY^?xhTWiw7ZucraZu)*L^QKNc&F*VEje3(@%tDvlZu6`Js^)u>9;v!V3alsX z7!PJdgmvQ(qSYdLbZ{k=^R+mAXw^xN#ayv>)kQuiu4o;<$<_e#Nn7r$2b7Rri{7!D zY~gw6)8J-w5EYt-nT|q5gsIe$qTC-Zi{W~W^@jkxc#Pn)2gM&Hh^-Hiz9C3$8f9wY?3RO8oc>i?E~)%N)~(<+^sW{K$(k3O73kh>pFfmrN=B3Icd(JEYvID; z=)KL07p0zkso*}zvwzh_iCG7CC8JW+Itc_0%fP`Em#jLKtXO`s)5+Sa#8#@9(SmoC zQyjI;D4;cDqXAAX8DF9MVobh&oW09WkK;00p6O|fVpyn`GGS-e`g&_xQ2&7~EvViw z)gT-jM9*Y-#SV*FMK7tsDkzOWb%=*b5KCj{olp-c<~@8d(z>7mcOTp0Rr^g z?5R$!*juWE4xgJo4-?=%dlzor z^yY2swq*w$)>WHgKe=y+tkiLI)m9)hO|78O+1Is*Rz#sEw$M_VwxMO0x+4aCg;>^V zv+ z3pEW=&A8v({f*;ykCP>?h7|j0ZSUdvkt z5J)`ig=6H!fW9Zj6ykH72t9ZaV`}gWT7v2{$t_Vu0e8r+Jw%2gbv!6x4k7W5 zN4JfJ%1cu7v>|V>1?*f^d%CnX-Apdd8>pi52CC@1fvRGHqXho)SLw8}{u=%t(nh=d zmCsl9XxHq8DSbT{(fU?sWJ3+v$`{yvDrhNTbT_V4K!K|}(y+47Na|H^-mhKp3%l^7 z@&*cjL(7NCvEa42=xKKSlfFa>;4|QdXwps{>R|l}<7DI0(Tg&j!3F}20pT5TC>b+( z&G1G^N49%8Rw1?(2Gf)@8*)1}4D~39yP$%0Ug?&?= z_H;wbob{F$TGWgXEfve!q_Vb@zrc_5u=mbCyX0yin|HLcm#6~IDHEw+kISb8f45BP z*m18}+Idp!cv9+kQY`y|RQ83Gf6X84nz>t%A0~a|B?-qJ`y)1XkJObl1?GFn$T}Y8I|)cjsy$ z&nV5s+7l)Cj#>(~$AkD_C?7;e<~Z6zy9J8`IdZ7}sM%37_z_y`STVSZnspoJ5^!)!EQ)7EX$fos&TC7+<+c01j=9~1}CP1SGSM; zAoqUr*c->@rbTzH)jycQR>2&Y5 zd(L}JADjNP?Vj^b20!lm#PZ3=Ul)Di{KWY~oU6KF&N<(UGfdM#6vAAx?S6d=&NW@c zGM6^^%pIXEMP18PT}xG63(u})QBk$Ah#fC z9bV)5nyqWu4idJ=Ci*C2jgOC=%LImo`wtBqcx6QU;!9sfJJ%Ui-EIm$;@4N6}E6&vTIIJFkRS^{k-Gf~Yt&u3>TV(9;Lk~@$ z*+^zL(4t46)r)K#oY16f7o2SX^3Wrb2r-@m@k3-jL;${w8X=e73NWa@s@=gKCnOGQ}R(%}ciZY#%u!(}q1InQNHMXz#s?hy;w;J4J7fI{J<-NCuO`QY3UOwBAb-O|qP;MpZc zUwdKIrle%aW#^!&%hb5aiusySf71fB29AAUfgpOOQfmwAhtxHD!pf!S5qeZay$)y7WRATmr`n2XN$ vrM&f$BYfSqYVWt0h;z2~ZSKMYIrdY1qCxvMQ`ah&?>wNePYXn_DeM0O7cXj> diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/payload.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/payload.cpython-311.pyc deleted file mode 100644 index 3bf8287030ec5c5e7a9024f0021600cece7afe63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24230 zcmdsfd2k%pnP2xz&wb$-+y{pMcz^^ziuVCgJOI)lK~N?^SsFmh8Au`) z+(0(73)$Q??8rq}ORZs-q=i<>2C3C1OrlNbBehOd{+MAV;Z$!_#T>5Ksr)f4Fcn4l zC%^CY^fd$8;M%p>N>9(%@9y{deeb*8*Zn7ffS1D&{pR?xA)QPJt;Yzxr?xZK`;iEN?6F zx~2ZIyr)^-Hso!uX!8im>p@2+%fHY`&awnw|miVbjKdbQtbB!oUMNhFi?Zut;Rg7$iMdwVpw(XP>y%QPle46W2P1TIaP|2w%{`$J3K-DQV>HM_1} z)b8<7vvtlvi}(v%_rYIMfst;TVn25Lgc6KjN@wKwSSBfDuB60nUU7_FiBC*+`xV>J zIVCXq!n1?16JHoSab{@b6sk;KQ@qEoWuyxkd1CUiA`DE7WfaHBiOG0EaSvrAIesZ2 zDeiMqnTZsoIY*_}Gib;$Iz5F9Vf5ORq&O~4A{Y1aoftYhoybg3E5GE?FQf@qL^+LX z_*kiDxRn%7eo3A{>)j5;6T2`tGCDLeIIJ{}r6x1dWF{s~q^DBp3A$(OiWCu?&5k@OQwgG)?xwm z@#)c_bI0RpNs9(q*`aeQ}MA^;+G|~F_F5G$xQ8-QlEX_)HS&ecVXaZ1kxdZIsI1<+;ao+Zmq=H zBW^~vdBl)VY>-aukW2)O-k~_o$%HM=$&{P~-g`3gH6Wjy&M0mQCgSPLNVikoLATjS zfEc*EpTGeE2MO#Vz}^Zqn2XF8tAsmhY*$z6Cm*>P2x)=5|P|O3JUw!m_7hiO0mc58V9LL$=4KtmX~}Sjf`nh33Zi*LN{GK3V@*i zYR8g36fK3Wv)n8{Yx{_=pp_hkXB&}^p^P?0w=7-8k^mL5%O{X74-lX}SO%(8Y2`Gc zAb$a6&QQ5c0CU{`baIZm`$F42p>6T*14)MM6$nEt>;JWTl+HRIx)$4^}fY?3yjh~9C84IDXwh!x#w z5N4FWs^Jz_i6OIC0P;yR0c@c8HO7Ha(quCnNmC1@6+jemES^ZLF(ftlIh0LD0I)FJ zjf)LSUGH|U?D_am)_o-BK9YAIL7)(-pAWL(b$iOG38NQ`q`1+DOv0R8MPP(L8F7hF z8Ud1r(ys!{>A%9BgC7qUIh&)!0E-t`czKXr?v5HcrjXm_Xjl@KUU)Y|i47|QcbYyv z$AXUq>QqrjEa>h-0v)R&fPwBJ56W933P4u@i0%NwJ0(JJr|1?vq8C@2=o|NnejvU} za$nUnPfiS=Y*6xwA(W|-+$d*Pr-KG6=uuT?@NzIdLkbNSj#w3HB0SG0Vs&+7#} zi%h06(xJ#}Qe;w+#K=r)O6r?{BqD=4Ns;lC97(2RDI$%JPmE1~jYZ;OdsyW7&}Pb{|M0$(LVdTta0?+F+=IPW%}|`nL#_uh5KE5_wkHShmrcw1GWg73-xCCNjki zgas{ZrT7Ef%bhQw&UMFirjt@= z=Hzzs#4l-WpsH~YyNB9_mOiAm*#XrEQ&-lmjwq#eNwi?cZ`dv&H#OX6jgzg zAtDn<2^$sfbMeHq#N_&J!C-9$!%Ne%GEk7@yGp{M2}ReCoBkod99ML5{_5`zzI86^ z>%>{`SKT~w-`{@E-@fEp4ln+_oPS5&zay)ig+R@BrMD8eOpV22Dx)R*kQv`SN+I@qi5Dxr(qbfPDAThk=fq^j zkO>gAPZQ0X(|<*q-Qg~B1iW^~9txR34Y$9)=m|Jli<|}?1gnbZmxQd zTFT4S))#%0=I6Y%#ei1Hs9ub4$N5wIPg{$2ujA<=r-4F42TLhz>s7A@kFe_lPoU_~ z3K_+Xkh;cccw_kM2hn#rR)4`3wWdqLG7Jtc5pTDV3IPqvDS?k0!YgtFHAnJ@cJOcr zy5Q0snVOGwMyii469m}gnUR6b2!Ov*Efp=aGa0LmvAfS3 zL2VKfV{tOr>`0Aeq)cy`S$UMYm?(|MVH1jJwjEORMifUZJuw5z(W^v?6qjn`Nh^MH zDaEZ@d)yLPZ(uo4B@EJD#&p7q2(bp@)2s6;OL3S*ty#gWykvC3U(U}_N@p=l{UI{Q z4zLoo7ox_ddAVWM{zl!b-7Je_{H4OUT-BKXVfN(9D5o>0H=Z^VdPANym$9-lkvDMk zx_#C@=R#S%Ka{f0el(fut*?%`)RIXOGR8V##!&B&w)D*hAaMn+*BjFH(=@o2`rwBl8*frLx)SE!_OdI}~INfWXz zQ4>U;WRU;~zw$T%X2zh|A@+tt6|$J5sI#!4Gr!^Bg1@r*gB`o`JBG|{7To@u zf&1>(d+yf7FD<^jY|FW~=iS@0+Q}%j#WF-lNGQHq1pvv5BOy{fpfK?>;R{%lk<@r3 zb47|wmCSA3yc|avnJm#JeFNG)3eWhpr$({&s0ghCCJR)BZ_Z@hO;6s9#*-y0?;2g9 z9+!88&F_ppe;R)MDT=O|d-JcGEvSli zYbjBf!ClBUI-*$ZjRMkZ@n78rpz66VS25*_zYY~n08H5#(b*bYTz zYymG5pkP0;_3c#nR}}tLi{6uWy8bj`9Ws+t1BB9zPK3v_VY{pw_jR1nXB8T=dwxp+%cUQ?>)dQJppgG zpa@q}6O)XZC=Nmbm|z(-lgjZ>36=F~rr|N&{g}E&f;w9$fzY>3edCnci|7_lW_P&4go`1AZ)$q`63j`l=01ymA^$%V4Kz-5f@TjJ; zCtCH|!ii`!8rY4kgvw<`6x3K|TIs)}qNKuAqBNl5IkSccj5qRzrpD<6$XZ6z|1j>IP;YwbuzG(*lI zX4a!RBaA+MP_hDl6Zf)MfgP;PnSk~*SoGgfDeBfQ@S9^lhGyM1716pklxd%;7-NUn z3@Q?fPr@Y0#OXBjQO14)XiTxgEUC&zOfw~mf!s!bZY2}1lSvVi>j{ulqqwJJm^0{q;LeG-0bYZ!3>G^kqEABgWchYxH+WUmL2GEO9YSok9c<166-E*e_^cE>K$hCJA8aEU@Ub-p3 zgPJ-r4R|px4J}0%h1~S;SOL`%L20l=1d9O*Q6&>-p?L9k4#)dIzQtTns?> z58wDQD`cdqdXu zL^rk@T=U%PeAEqc;gLJgjC_fJzSmi{Lxw!VjQz(TJm2NZ>Aabvndy3lxI^hEcezP# z$mkmyBpsQJ&9l5!09(r*D1x)R%FEax1czY;78{o#N>MuA$Mr)kVp2<)x!YDUciYL_ z&0F?~XL)n4%M9j$S^lav0}w@H`Uob&8KM`ZqrCs-lHh@Qtqc*X((wur9oT(EsO%H` zb$iAT2)L{IxI{;$Rja{q<2LMIm&QPLU;1}DM`kuLZ8Czra^`ywNkWW|T#_P0_j)JN zS9)mMC!#8dWT{h}>D075Ce2*G0Lv+PDa0cQ)JBbzcr7AM$naQ5T#LLmk+~9)CmF5~)QkwCeiBw<7EhLh< zM7|J=@xWuHJ0w3(&)^?Wmps(jxGcxvrjwMg3w7<)3F$S(GYScX8E~1=R&l@}EXgXt zcTTE=otTDVhqsKpokDIn4NPKCX+@xr5;`xb!~K$){y|9~u&x4V>#;HTI)Dr5V!@nA zXRc#o&^VvAmHQuY!}R|G_zWAL*jw22-ll)p^cSbI8=uLAj^;y0X@lY-|7lH2w)Mil z9{5?^kIww`41zdwHKX~O(X4;;fv;()UR9?Ho1U3Jxo{-s?|9&D`~%0EuA8nrc2n!J z?ww0v0QFq1*MmRz)h$TxM038adEZu8SUp{ZruN&dP@PZDpZ*B@lHQ#Qg=mTHq z=AnPz*mKXf7PDP`7FR6&Q^qU+ut)n9ZS{`e;?*LD%StV~ z+_kgI&jfaPJlM%Qwlao;D={2g)&bNhr0$Tgq#qgyTBRjwWjrEWHEv@Mnp`!&fE)1`dZlBy^*%2+%^RK&RUBAw{06RTzWeV4wlOA>t0g66) z0IQ_!x)aPuw}h5kTaBGtECNzFDh}+_0zZsxJ?zj5#Ik0cV0I3uQx27Jl?Xml;6884 zz(H}xR02Maha)AO?P;daE3Q)X^ZK>QY)Z?2f-b=;*2NB`` z9@KRdnl=?(S{!sSR0q0P%4TH@pwbF=xyJJ?dUi~Yp=G5$+jlAS9)OuN&}v{y;xo$l zHh`Hlc)89kh0WWFz7~=;HNcbzim2OW6oRm-Y5^XKdAWuSOqyr){3OT*C_PBxYluR6 zTk8m^^nyBSp%Ck7MZ9S0UKE!Ez>OdRCEGSnwr?!b`>7xJLO<%xibHFQ4<*7%S>$0~7i zGuB+>tXPA+Q=aeudwG81JQj=+pzb)pWt{lKU2xo6;xvJ%3w~8@mL`Zks6rmbdA#5} z0l5p!$#h@E8_#6oV^_#;m!X~FGZ}v>6eT;VXa`YqhJ*hd0m4DJGYC*qYRs5ep&kh8 zSb(plwygMP7z!)>b$GIh>owolJ!^YocgC%C343xnk3l&?2zH=X9kbk$iA!lYWU@B5 z_)*2X0h+R*UAyfg%)SEisf1R#-Et!?#Ymmi_fX<7@uz3vEs;W+?U_D5AyV(oWI>n^nZmsO;Yla ztZ&ou_UyJ}pN4Alp)Jdqk7l!>!#E37;rmrR_o{l9U%b2Lr$@3?J-Mp$`Kt3-?JPnl z-i+F)i?hHgsd)cQbW)dG5N49g*Ku9_GmJqMkj)rlNF`RRxNh@cuGXesq6I4qnFI0* zaK(5Z%PdyYj;cKHSgE8;UNYAN4*r(=u`;mE7Iloa%4OEx5vF#ow~y;;@ip#s`wQG_ zBCA$o}Ppca7=n#8k>gKHzPChKgNVJ1qE-a zBvNTfb4eoXPy|*Hudqx{zEb9uMC#5=t#u7BrDi)VfO-H`srfWi53jadXbaGGUMSj} zo}+xBx&3}~-@WF(<;=?H$1mph4&I&4HJ{BlpUsBL&-uYZO#@71f%AN!zV%k(JBg*e zx%%#WeRsBMjkD0+ald`nz4l!zd+vlkX~`cP`q|!G`xo==U(7a^p9>Bwj@m}GaS~4& z?$>O-SF?F3vpo9Ii}~IoxteG4HP2-Ik3BzI=z5|mpMCZj+ljn&toL{i_v4pP)GEv4t2;iMdF8wbM04Xwl1%Gfpee=}Zxw&(1 zoCAg0#T<_=@MI~xz!&No7VU3+iF}a|+1^(QoE$0zEnS?%ABrS0_%6LRu zNh$O~DRjdr%7ao~qZS-`z_hI-5H8Pt${>dY#jT~;wRGlN`tG;vy4SL6<=~ymxt5dpmXiza1$Vh- zXXfuv>ef``nl=^c+MY;}v+OMk=sFlFxBAZkZb1+=m z<*dtw$#O5zx)}mkTbA?v&15+jWH|^PjjeC}E*uZ)wk{0b8vf4ka@R+F3vjkMm=7P! zh7UeyYX5%g+pXVgzujJRan*HXFluAs-=19k)_nceY}Fd)6N-N!CjPPhU?2K#Py9RH zd7^{+NypX!uO0hMJ7`|WMMr&!HAo>Q@)5Sk%s6KVf8U`rvcahi1;0iXWU>c=eKeD_ z-vCBu{0jb>xskb%H%5wn&5GAdmNyMNfK|~!5!H%EA;XGCF~f>SG1ZDkA=QdUA-%2g z&;hn%E;t&sU3~;;(^&=jRyZa21DX&?0TLqVx_+n%k@OfWLL@OxI!can+9o!HMV@@# z;ptZ{=3%23BAp;_LM>HX!(-JCof*?=v$|U?nak-F%E%+VEve@{MqIOO3>%EuN}%BO z_iI}!xBrmtJj<<fTyBfPRo2O8zSVdbLz~Mg9o|-4_N2&%_2t2H+4zLK$3KO5X}l z?AW-q_zp50ovCFzU;3N$eZ-NIgpVVrKF2+%ZFuYO{o2lZwVk=zP5IhQ^X@{h=H@H+ zgYEZ%?TcT1ujAeAxnN&D*f(z{pIhI3cjGqFq#?owI~?n^E~!pxyrmGNAlp8seH_UGtisZD7dsDoq>t5RiE1_)Ww+$cD6I zT>?%n+{gqx7m^_0$^QoT7=e>}8O3JU#ptv_n9ER%O&x)0>g&_2uND+@8iWu*Y~GZB zj%Hc{%Tm#d+Owcp2nlqo(#kTc#k4zWezkoZZ~D-iKg>pr*V^#{y9;qu0rrjunXTG) zBM`-22;6i$pn86}8;!DEzL_fX3ny3cU5v7gIK?4OC#TXTJ1UKMWXu7m9Zm$OzpHZq z>)$EC+oBL7t>WU^v~spgOoe*tVEdP(o{~GL)3kqycO~wkAE0Tv(#hnh$7r5;lr@d+ zS81MM(|1F3z4Hyi0wS-ZcZNAnlkQjnMR9&`Vbhz#`s;Y^oWDEo@BS^RkJ#O|VlVuw zX#&}Zn85KZ8e1y?W^HL#GvER`%gCrmOhnZ*r%1 znBTg>n+w2@sz6RQ|h8vvEX#af#Kh&ef?$26oaF0_Ft!==WO`9gw z;Y=8rIlGp_S?N{X$XF_ofR`6ukW2T)FOBtCumQebrLPV2L@vWA?RPfH*A2%s=v~jF z^YVQHZv!Y!e3Kvv8^r*n==6e|wc<39a2Zx8=LZ0~s%3UFXtUhC+sz0 z20-tztdGc>Yw_I8!>~OOqbVJ*J^9FM3+SUIm06-_i$>j07uY1SNu7jG3nrD+WToap zCN*WuA7NBU5N38Bres@XV5&CLY*fJ)y|gK3O7@@AeBVZ)k{1{`#lb-C=_uMDTb&U)R%NMI{3~0V=nGTuIgj0_8+zIfY`9MG7}Z? zNfc6oF=NQI+e8|zB@xeIEmt*pO@>2+l2J=SopOc)9b)q~=HEV&$E)wcHk>(OTTuu& zwk%GPp15TNUIMt>J;5$N8(^2mgLaRjgY8=2O8O=)>i{alp{}mYP)Nr&Gn8NDF3p&P z6HLOT)WTl_pKP;yu52x4@psS@#m(qpeDd1kiDBy+qtoT2yENNmvH~qE^GIobyFJ&` zop0*Sx(_c80I286Nj<0r*rZg->@9>)Ox}6Cl=EMy41s?|-FQLmh9s@F@Y82 z=wI2*E_XZG5J&$L0Tp%VUfs_zGoKYE!$Wd;F#o(%6z0%s}?hS^-!i~@bxi?efUuQ-W8n4ueYgRrC6lm-=pGg&EHD#sy0^oI-%k!Sw)nfRk1b24JavRO(1Fj}(Jqz5Xto4L<0(Jj41;NU@7q}hSwa%gt^x5WI z#R%8co#ny{(&CA?u4cKdICI?A2lgru5x%t`v}CPk(aG~3$}0y8-47}Ck&)%L^LSgT z63m}i2*1_zka8Xw*?ykiPo^$hmWZ11`^n!Mmpe`DQVzUa|1tiP{-WK^Luklu>&04@w}B^v_u6pb)I*l@$eh1tH>qKc*aBigNY~>-nRf0uK9a3pR zO8J-&u8BYf74UN5&V^@kwO#qzE)dWHS9PCjy2mvw_AJ+}cDlJq p<=Gt9pXd6sTt5sne6>0n416VU_u@~#oaIn$G|!D@wUbFK{}(>Sz?ESieDpDY0uAUOY!SdfFE!8u1-U?xQ@?M9T#|Ye z&7rfL-@Lz>`JN;FwYysDUWPJO zjFptUQd0A3DV~p)68S_)%WD#G6h|#4OL|`C^?0$Xl**?{-T7{4C-P~Td_WxSE^(3% zWkMc97AfDuM|2qJ+A-2A6WUFC9>RGZLl%k8PQmPMntB+65y&DvgyM0tLGlOq>fSw8 zr(tyuJ@8*wA9UnNlI^uha8UhYYra^v9K$VDinK(%zzW>5XB5iJu*l2LGrbaYhL4Z|3--12M? zRC0d6s8ym2J1u|Svkiw9_)OEM9&9muo4EmHBcjiPxmPC29?g#83P`uzVAd#Cs5gw{ zO`I@d46*5iZyxT&3&> z!$Zik(bK1~n0CEfna!NWfuWJMYc!A2Dp3Si+BR&l>dMe;b%vTaHk9QYW7My-ZeL-p z7YvKr<47)`p9jNPxOOh*l>-o`G2T=Uqg3?+!?JB!35*+pS2ws2T!sT|rizNC>n~A* zC$ef7yXwt{$*ag)Yr057ZQLprc}=(J-=7n7KL)+G5$kB-fcwxn5-D zFwxN6FjWysYzFfc3JbKRa@mo|Kn0uvPumQN`-BoOeu9QiV~$J}Cw8PUfslgSsyhl* zY21-J`c#^r8jW}K#hq9|a}sxzeA3aV?qFMSlF;sQVqkE3*kg)=nYWo$sZbUwXkxjE zPyrtKVSMhkC>af^%(Io~JcOVpz`T7O;64c=pFzmYsJw)>K7vTUvRtXiK77IJNeI$iy_wDTX=+w`B%KRy7*0Tyz z*UB~*zCSfyc3f}9_?VS%Qagb5q;c--8R)K7rgFEacWdfHcY4YPn}54v*>lzm1scLx zoNmguDc4+OKGaOp_1wTT7Y25)HP;+@15V`+0W6V!rAXh=FF#tl_B@l_$Yht5d&$kr z051-|21VC0eA_UUgmIz4cEmd9R3YDiy!|1-&xiyfkjWys2`!Npr5Op@ktqHmeL`HE z5mEU{`lECQLeH;bzaaNxzfmA`0NYsx)@Nfo`1wd?{m{?82jC+G!(anY;H7OamAx-5 zMsm338o)o`TOyn3{$=N$yBe>hN7pi69f3mp)}1GFjfOT_+vmrQ0-|EukHt6 zzD0VA7QtI+;L<#>dp}gL79PCTAP1rCQ!&IZnQdr1x|?>5=X$enpn0Ikw9nzZGXP8E z8?EMK_`7j(AJmX6T*x?8sjve=m`7Q$J`ehHx6+~Vqy)z8-K z_4l4$fAW6qtC|;0PVafJ808I~l@QbaDVYlE}^I4|~4o3#GhiD^%{RB?% zCkdl+`_riN&!$#%hS)82jzRR68!&(h0j8 z9JDFEZ?Y1*1ie0b=P|*^^SB7%M>wzu09 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/pytest_plugin.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/pytest_plugin.cpython-311.pyc deleted file mode 100644 index 8d0c187ee531aed97706ee25548328ed9be85ba7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17789 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 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/resolver.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/resolver.cpython-311.pyc deleted file mode 100644 index 53fc9908592ff80285f2450e76897a880c57cc0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6832 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 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/streams.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/streams.cpython-311.pyc deleted file mode 100644 index 72181c4e28577a2bc618df3b61f1423f594a0baf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31611 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 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/test_utils.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/test_utils.cpython-311.pyc deleted file mode 100644 index 5aeaa6ff312ebb1e808946c3817e292c8e68c09a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34323 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 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/typedefs.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/typedefs.cpython-311.pyc deleted file mode 100644 index c068447ca7462884a7b3949f5752cd64bbf2db48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2140 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 Sqi*VBx9w<^`Qu6&@c#nFQDHv- diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/web_app.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/web_app.cpython-311.pyc deleted file mode 100644 index 98a74dc4c184999523bec4a6a6d9fe8c4d6eaa0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28762 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 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/web_protocol.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/web_protocol.cpython-311.pyc deleted file mode 100644 index 1733c9275f340934bb71376a95703413cde6dfde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31082 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 bBTKlFD&#Z)i*FBCF5F{2A3ngJ;rIUw)pJ^| diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/web_request.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/web_request.cpython-311.pyc deleted file mode 100644 index 249b3bd8bafd33a026e72f1ece7dad49500edfac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40370 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 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/web_response.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/web_response.cpython-311.pyc deleted file mode 100644 index b80db835520bb560cbba189717dfaabd6ec9a3f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38974 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

SrBUtQ@*@ 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 IDllpFzYFtpi~s-t diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/web_runner.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/web_runner.cpython-311.pyc deleted file mode 100644 index 3fd0f21465ac53f629092d62d24ee1678023a6c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20823 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 CnyTFZ diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/web_server.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/web_server.cpython-311.pyc deleted file mode 100644 index 28b8ebfb7b9b9848d4f15f7b7b9f05674b7cdfb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5049 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 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/web_ws.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/web_ws.cpython-311.pyc deleted file mode 100644 index dc265150a7178cca1e11a0d09ee44664eb3cc7f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27629 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 IJfju=8;6XhkN^Mx diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/worker.cpython-311.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/worker.cpython-311.pyc deleted file mode 100644 index eadbc612cc4a52fadf4e85e2605254c7d2863a9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12230 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 Rp{bKo=_!o9_F446e*i@<`OE+S diff --git a/.venv/Lib/site-packages/aiohttp/_helpers.pyi b/.venv/Lib/site-packages/aiohttp/_helpers.pyi deleted file mode 100644 index 1e35893..0000000 --- a/.venv/Lib/site-packages/aiohttp/_helpers.pyi +++ /dev/null @@ -1,6 +0,0 @@ -from typing import Any - -class reify: - def __init__(self, wrapped: Any) -> None: ... - def __get__(self, inst: Any, owner: Any) -> Any: ... - def __set__(self, inst: Any, value: Any) -> None: ... diff --git a/.venv/Lib/site-packages/aiohttp/_helpers.pyx b/.venv/Lib/site-packages/aiohttp/_helpers.pyx deleted file mode 100644 index 665f367..0000000 --- a/.venv/Lib/site-packages/aiohttp/_helpers.pyx +++ /dev/null @@ -1,35 +0,0 @@ -cdef class reify: - """Use as a class method decorator. It operates almost exactly like - the Python `@property` decorator, but it puts the result of the - method it decorates into the instance dict after the first call, - effectively replacing the function it decorates with an instance - variable. It is, in Python parlance, a data descriptor. - - """ - - cdef object wrapped - cdef object name - - def __init__(self, wrapped): - self.wrapped = wrapped - self.name = wrapped.__name__ - - @property - def __doc__(self): - return self.wrapped.__doc__ - - def __get__(self, inst, owner): - try: - try: - return inst._cache[self.name] - except KeyError: - val = self.wrapped(inst) - inst._cache[self.name] = val - return val - except AttributeError: - if inst is None: - return self - raise - - def __set__(self, inst, value): - raise AttributeError("reified property is read-only") diff --git a/.venv/Lib/site-packages/aiohttp/_http_parser.cp311-win_amd64.pyd b/.venv/Lib/site-packages/aiohttp/_http_parser.cp311-win_amd64.pyd deleted file mode 100644 index 086a008175275f3a772d0124b5c8d362de8fe873..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 255488 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ⅇ(ZDBWs&&F7WF1>!HHQ=`= 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 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 - - bytearray _raw_name - bytearray _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 - object _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 = bytearray() - self._raw_value = bytearray() - 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): - if self._raw_name: - raw_name = bytes(self._raw_name) - raw_value = bytes(self._raw_value) - - name = find_header(raw_name) - value = raw_value.decode('utf-8', 'surrogateescape') - - self._headers.add(name, value) - - if name is CONTENT_ENCODING: - self._content_encoding = value - - PyByteArray_Resize(self._raw_name, 0) - PyByteArray_Resize(self._raw_value, 0) - self._has_value = False - self._raw_headers.append((raw_name, raw_value)) - - cdef _on_header_field(self, char* at, size_t length): - cdef Py_ssize_t size - cdef char *buf - if self._has_value: - self._process_header() - - size = PyByteArray_Size(self._raw_name) - PyByteArray_Resize(self._raw_name, size + length) - buf = PyByteArray_AsString(self._raw_name) - memcpy(buf + size, at, length) - - cdef _on_header_value(self, char* at, size_t length): - cdef Py_ssize_t size - cdef char *buf - - size = PyByteArray_Size(self._raw_value) - PyByteArray_Resize(self._raw_value, size + length) - buf = PyByteArray_AsString(self._raw_value) - memcpy(buf + size, at, length) - self._has_value = True - - cdef _on_headers_complete(self): - self._process_header() - - method = http_method_str(self._cparser.method) - 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(self._headers) - - if upgrade or self._cparser.method == cparser.HTTP_CONNECT: - 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 - enc = enc.lower() - if enc in ('gzip', 'deflate', 'br'): - encoding = enc - - if self._cparser.type == cparser.HTTP_REQUEST: - 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 for satisfy transfer length header.") - elif self._cparser.flags & cparser.F_CONTENT_LENGTH: - raise ContentLengthError( - "Not enough data for 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 = CIMultiDict() - 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._cparser.upgrade 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 exc: - if pyparser._payload_exception is not None: - pyparser._payload.set_exception(pyparser._payload_exception(str(exc))) - else: - pyparser._payload.set_exception(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 in {cparser.HPE_INVALID_STATUS, - cparser.HPE_INVALID_METHOD, - 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/.venv/Lib/site-packages/aiohttp/_http_writer.cp311-win_amd64.pyd b/.venv/Lib/site-packages/aiohttp/_http_writer.cp311-win_amd64.pyd deleted file mode 100644 index 22b7ed7b0293b2e006c5ce97df1f7b96b0424c8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49152 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 - 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.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 - - -# --------------- _serialize_headers ---------------------- - -cdef str to_str(object s): - typ = type(s) - if typ is str: - return s - elif typ is _istr: - return PyObject_Str(s) - elif not isinstance(s, str): - raise TypeError("Cannot serialize non-str key {!r}".format(s)) - else: - return str(s) - - -cdef void _safe_header(str string) except *: - if "\r" in string or "\n" in string: - raise ValueError( - "Newline or carriage return character detected in HTTP status message or " - "header. This is a potential security issue." - ) - - -def _serialize_headers(str status_line, headers): - cdef Writer writer - cdef object key - cdef object val - cdef bytes ret - - _init_writer(&writer) - - for key, val in headers.items(): - _safe_header(to_str(key)) - _safe_header(to_str(val)) - - 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(&writer, to_str(key)) < 0: - raise - if _write_byte(&writer, b':') < 0: - raise - if _write_byte(&writer, b' ') < 0: - raise - if _write_str(&writer, to_str(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/.venv/Lib/site-packages/aiohttp/_websocket.cp311-win_amd64.pyd b/.venv/Lib/site-packages/aiohttp/_websocket.cp311-win_amd64.pyd deleted file mode 100644 index 1480be225de4de95fc70640528aa54eb97160588..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36352 zcmeIbe|(h1wLdQPfRHHY7Da*4<|z zLD1kPmGyDk)M_ua_BQ;mrPcP*)+%x@y&FIXD2nvz4Pq-=Yd1z~>TLnFbwBSjGtce@ zvGw!)d_SK*?(OFF?3p=p=FFKhXU_b5HkG&bvUJ8+2A+7FvE6|5aq#cI{be;UHty0r zamGZeYp< z_S8*)Rvzwx8bmmau}qFiLUs%YQZ7DetQMpqlMX%`mzWKZ19=)GWV;wUOHBG0n`@+i z{6rc14+M(>j7`yT=Yb=4p-s7V6Krow3?Ne?y&G z$JiA!kzR}EN<39~Qa%n8T`0&{uNeuwc&G(Xx73e=v1p-B5b`?qA(a%`jVI;fAb$RU zzaBWQ6X*uYW$XbwDIW)?^R~2ukaWbNc!=&nJSiUsV~bLv|D%FR&+*_GC2ml({{2ck ze^xbPFQk4P)yr3`bgocB@A(wX`0BlkDa8kraCu&na;QA7mUQLPMwUe8?sIF#H9d@3 zRz_Xg(0^I(EzfhfBAcmcl(0Lm$`$GA;^FeVn#!KTmTn`gQPB=6J*U;nlu*o|PEi3(8^ZL$)+EzdD*R5SpW)@hY_Ohm2D99G<#!KJ;bXh&nw3#lxWt7wBt zPt?*)b_TJI!G4tZOO+azKoWmb5-Xro%aE+}#4TSNqQWD@BCO^WxDl!%j&_;p(~B7E ziFRi1`DqSgLlG`1#2We;LUCK}Qe+0VF?)W5x zvh0{;9RiIp}g8Fv0-?12n(f6MxOGBZxVK3%V!+&7LN(aPFQ835KuXMOE?=sP_hQ_B87SOh)gH+Ya-zW0W>^Pe7zi zgUP#Afn~((N5jVU&W1)G0>5(2RH5~|`cK&_bNZD~+_YgDT2<*EN>?HoM?t`pnP)AR zGWYCsCA1&TWXKTwFVJOdxI)mS!6PbX29?Ny`z@C`nB`J95q!#L=YT##()YygxkQ=y ztHwrjE|G3|I%9GX%2;JkLLV4{BW~^LA3_PPc&37eui{=z>3LtZDxp?pAO)jlU%!!* zLLCRr(4vG2c>*-Q76~r+$k2fT=N)%YU!+b3*SI0ix?G7onOF5!*x{!4cBK;o^Ba^y6`Q#m4KMF)JXEm-=!!=T2t_HhkJ1Of#4|2G1#FBN zHZOk{0V^d>pyYyyBDo0I62i`>?6nkHP3aw3JpGX_fW|{TR86Gy&`iYu5qtU&0Dcz$ z;b|a2ww?jNF?f{lBgX(hF$h2uuMwbnrBS^ioB9w}!ab)5M2z39;jtKxaesw0?k^(7 zI*~@RcI2ZHkygZG#*bF=ScypEY7F<(h_tD^?RseLihNO#uS=v=3Z9!q8c7YFJ4ITS zNZTdSs2WH+CenID+Mq}q6lrHg+Jz#GkqJjOokAKZYJ|gf<4KWf=c&fMkegB+$Vy5% zDpCtXUQz?4_VUzwdrnEJX9SfZc#KDksEQE9>;*zrAq15(kdw;O0I5-O0cCUAiPNE; z0!eWNQ6OF=<4Y-y98G{ShYvwebV!QzM1gppjBleja_k1ADK8p6iXbQkB*hV;Kzu~T zKcqNvm>?{MQ_5i#a_0h&+>-$*heO5}Q5-pH0EJaQQi~ucnk2GC{hHUesK*M_`B zOf|)AEiU-@Ic}{iw^6a&b6klZsl*7JQ$a&=!SzVH0P`mWaGahVxA}lq!eij@Rrtw) zxNRK>6z%Q;c;EsE5Dd}y9qA)+FmZVqzTX{rERUR_OIu}iX?N$kwBO!7Y6^pa;_!OV z$Me&`9rKyxnA+MEZ76R0Dd(v+K!QvQwO`7~#_TZZMHiOexd!QY?BYF)k$Pag{9P&!18$n?xzM>ZLRz zUi`i+=NhHdcntYeo2XWvUf>fz(!}g4u1L%ye^v(Nyx)1*(D%R-%|W z6R9+9|Ih=7rOdgV%bd$Gz;8xphvBX81JD59omVR`Phmw?QT%p=_MR}v(*EF>;^@$$ zSwwGcq_QHmXShA1g72V^-K4^yP9ngvFZ@{EPT~}PGH(}$PvwydQo{e1*9GVfKb1!= z%Z)gBFePkWgc9SnKP^H;GY8iZ&VaIm*?arOVe(aH0tVe8Vx9^+i`yj?H9(DP5 zh(y!;?7cgv?01n7TG|3$?#R{ikWsU0`|`m*z7S3_U2WC&VLH0Ain0Ef)%h$O1+zR& zvzQ*Buu63(kq7g7f$e`cH@qybWX}NgLrjc{sE-!Vs*7B0+!jIMZp`>24|8(zVoQPI zqWlYq;(;iH-NCDGu3SreoVh|#KPQTXL~$Gnn1M!$+d@L2d4kX`2%jRtNjf3pgdYmR zPlB8y{2;0R7eqLm2~@-!Mn{j^o^T=pLnI6PHYLQ_oVxfl$OfnL^SEu07(_0f4H>xW+RalszU|ib>y@cQuAXSeSCzOi8)U;> z<@55V-c8Gd4^*s=Y(M4|H#cHO%B|f;^;5Kmq5yH*9-b8@_6kXHKLm^0{%{=;kZz#+ z6NGOEo^KMsb@rirN}38Io&=6Mz86a27IKnuEJO~}r5*8?1Z9}mMr;pNBvtz0AcEUQ2j26vd3+Ya$TEqcr{{5c+&`_q2){6+FkbI<8JNQ7%*lob7BqHawWQM45Utq|a#Tdzv@F9oNsgij`3uOolp_nO@B?@s^Z@iW z*$Muc5SsZ~a_8Znl0aDbS-KnHnIV6S%l}qFeoObuX;>#eyBRFuzFwjB(gtF6X3pfp zyNHRi1S+v~KMKNRU%QryiI}%=eh;Pa+r;_VsfH0_MDiQY`PsH{ev2HO-wmVq{eA)G zr*M9YQuxhI<>!+8`msbuC6@~M6wdEs18@mn@K3}~GZzts#?|1~Fu!W9m2HYXQ53hG z;K~w?=vA)NKC%*bxV8YE`&T|>4wqS#@Ty#QxZX#L>kK7c0py)_ARKrUSA2{+e0LRs zHF(fQfm<W3`>G0EPoi<>BpJoauIMxZ(N^cX&G)CP1G6I|U%q1adckX7-}=O>cf3 z)ejA&t8Fu1QtLuP8ESQCXuVpo=_7^&m3DK?yd`YEQK+VHUbj;`p@*-RVkjef+k1x0 z@-k9V#Avt#j_MKwnl47bhQRlxATSnzcP>I8-K8CXzeDArqy<8iziWqZ+z7zh;V1W$ZFEheeZ$!;NJrNmL6&=j@t#?&;Z2}HU2J8dt)TaJoL@0sFZMR(cWhWGaZ1f6$d%` zL)c9F=Sz{SneU}Rw&$>VE$w)@!};xq2d}`qpM;+lx7|d_gxCENXv;`75nBd$aCL6y zsxmG>7PlrRMP~-xnwTdkK+(MEqNoB4&7`n}q=~szd_d9UY)gAk%-@P%h+UKq#+we% z1kZW9^R`iomE?X;OCAhd&C8|rf}QWc+TEJpszm&`d=v9TCH%+N0%SNCbxU(GWFzc~ zN0m_2R9Sj(!?2<)WT;m0`))1MRXS+tuII#MrqFIOY-Wj!1L91GM;P`vyFUfig{hXd znQ%RaJ1096dz22qs@%UNEH@g`?yHo zM_h?xH!f;&l|H{=7>mDNmzJ$)PF;wN{^TaB+NhMCP=ksVsv$|?@Gp034r}poEFAB_ zrg=1%_T`j$CiP||zE3bcw&8^tsH?#C%w7o+T0xtXa+KTt|vvOF9eHd5Q5Uj!$) z;{C4BJ}BvV%Y$ujz}PFF%oB$vx-f60wa~q=3+OKjfE-x$J*R{Yq7HwsJopn#*J+tV zOFQh~VQ9l>K&vLcOmg0_U$FX(KBdQM6T_U-i9~;It?;4QGIbF{)q)Zxm;GG^LjIfUkg&Te>$> zIoS43wqAxhCbk_rhr`C$*r`+}I(}GEi^BO5Rl5T_d9X7@y9c{`i|MJw1J`<39jk9S zpS%X;_rz(tGO^S-L^#^trnv_a5{t>7@C2?SuAb+Fu29v#WA7_z{o`EWTuG~RH%@=t zk-Kt>qb}{NTYIaLPHbY(n@f99-+xs~=UKWx0Zt*???)pY+Av)FetD!-;pZPN?GmN* z6HE7TBGHVmKrl?g=Us2IJiM>?urjXpyYM|ZPN~^oH+G^=3=ghCq#g<4eSspff&&Jhk+DowXOh=-2lf7I!tX12!ea`-& zwEkF{GxX+|(5W%yr3028IvG3NZ&$~k?sq&}gw}Ie%8x4PFAZlX+D*#oeU!4#p=K(P z>Z0Lnd@GbvtvEv;VbN)M+E8wJI&F9oqG^aegXlA9!$u7Y{xoN4)Y9`fu?&4|uyj+0 z#Ws1RmAPH|X$J zTt6+mg=vshZ^5}xsc|9@#0p9+HQsYIT*SluFtE~#A4LLK#bMfW1@B>4+QGZGQA)(Xt&pL<~u>^Dm|l? zSuTYxaS#Kqa9I6vLau3Cu56NP5OU?8CDIsFJk5ePvg>;BlGs>MlIGZCeOHT2z>wx6jHN(Yj zEr_a$OmHXS*l#7$DFK7OYH{&nBd92DyAF6Uk|a9E9jnAXs60PX^Q_#ZVkol08c#c{ zc181<)QsYjq`O;a8TBj#j@wF633TcS;3oz-+6zRt^FZzYN!=Gm?}M0sQl)xM1~GdY z&x2z2WJ7M${cC#Ny%ZPQiO5d_0%xUSrMy@r z(>4t31(Bsiv6&Zg`LM(*v!WU%b-asQ((|ziw3rGVC|ZSr;Hfn@QcO6M2C&uGQK`ENOxE-*28w z6?rUAq4=f)q%PbbfcEzf4<vU16zvturClfj0%nY(4a*4ZDDvc@rU^i2)|E|IC}o%O611* zHfHZ*f1^8`cL*8BX~!EIVq8y;qj+&Bp#7R|HaNIDevEI5qA%4rZzmH#ze7p17pJ3? z_$gr$yuaH~a}4Mws0FbeB$uS*lJ(o-w%^V|k>N6U%V_Xo%N&7(j2vb@6*GIvQanTG*joK3HjiCxqMULf*>FC z`EBACE~AZ&U}mZaeCjW6&QSSo+$88Zt`^hXo8&-=TTgKa<5FDVs?l!0Yi2?cG~;^G zdBj$&4=>Z85I!iN$O7oXS;ZCMtm0z-{qm|%Ue%~!#yYAz(gVuN(aZZ8;>q$7`anx_ zeV~apBR>@3_>3YPquYYoBq<+G)grc6XrR^1-y#mA(~41rjZ&CBNITB|fegb(h2|Wn z2?|XaFc)8u(3~^?=%-fbr&j0(=L%FoZaWr)QX8A(({65pRsER+BD1O32htQ8K7Puf z^EE~Li0;o-E84{ecn!=XKcxH?q;&F?AFtK5yu@@x`}!92J0<)*4pIe=%n;r*F(N9Z zw!6SmePWajGJ@ZMwwh2&6!H;yaZ(z!A0JHhX2Rest1re=yQ1;y60*rwAxZ-h^#BFq zpEf`tEL|O#Hio!tq#maou|A?hOwKrdS3pH2Xhgr$J7tvQB3kOCy8h|D%6atlFwx?? zltho%PNOO*`Wi#nIO&TQAO0Q(srtGda_BP>6o<)3sm%$N=jhAM^;H7pqL4aWU#BQe zlaIfpFJ7cD@&5yT{bD*5mDD14U%I|}Nse>%mGl?ap-!zJQE@dY#c|ltaWr!SHAKXg zuh(fT2=(f~E5y@=)3C19!n@FZu5d4bQ9We}1pBPFlk+b-420(p_0Nsl9;bSw__=V1 zr=KG{+FZ=vkbgIo$n#_Q3p$D66SC9%Vh{GqTQFc?4@03bzRJ?QpXV{!SK%}PV=pr8 z>;s6~UcHKso@48xc|xqNZk*GNm47vssI!$1qirKgi$Hg)h5II%R zcnLzon6eool)_OV3Q1ms5c&BzI+n2x8nCO-V=ztSJ%;=XraUcqxw6xopd)7&-+KZ6 zPM_WrS8-`>v{S26f?ZEoBoZ8YfJI8j;K!Qsx$oDys1%o_u!)8N`ibh(+3;=RMJdvhJCYm@isJ ziTn0tut!|TJ7g;TIT3F74HSgM^n1Y5!lnon>>%e-Lhgwgn7b$49Vh(p39L6r?V-C1 z7~O8c3Z9&p9o49(sPU*V(L0fy?lq$=`MeHWy2;ky^Mxv!-$l&RFcn5~O`Mk6T>5=Y zeg8hO=yqX=sC|rkN99@-rjtICGxV0li4}>Z`)8;jLTQ%n?}(5=t#*b!&QR$_%mJ{6 z-+zSWo;3DPf_31&2dy(`>j)l~-bo3r2MQleg33qGPSMfIJ00-z}z8kx1v>SB{qe(2C_NTC=Nkh-Y zynp`?9EK-gf|<(+55`XMj(!#^{1g*Q$}PqNJ|DQns_?-bTN?MeFN;Y1?U>~m|EXR2#uQRn1Y@*XjZYN@U9aGcc=PRJeaj-E%uu##m zUGV|h1ajrl*+U)}o}s!&Y&D>*)CP3co06=dH!Mb6@p_Y(-+w`QpP_lNX5Iq!I@2qY zOwTLtl?iz#aCxz)!oK=GQ$l7^1{Zpf5c+w{B~yfc0a&RIMZ>n9kUH6;|2O2<%x_%6 z^)kYX5c+OO@)z=xYA+>GRou&>@?apOVG>#|o^-8;lcMmDm`}O2RE=VPt^`&fOaQi! zXM`0Lax0hyb-IL9x28z-Dp0(1Of!;VP3B^m^n`OY$+xSh;5__hXoQR_n1x)ZE#4rZ-iv7-j>P!Jh+C`2l?q&;aBG2D%gHGrmi1PA^cf#a5zGHlE-l5ztE3Ne4im~_8>T10j}RiW^~XFG>A2J^V{T0 zXwr!jM!Jhx!1FGghvWF3D3*o`e?W-jZT*3Z5XDqthElrlK_sacAdmxU^=iJ$6hk_g z6%@ZeoENuE2Z9fdS!&+H? zq%!^R;?nZNrh64&?wKR!M^2nz&D{U(nfqQo>rCIT)DI}>hs#ULpEqqZmTNe)yk|;z zq{dKD`r3w9kQk{l=;@Xv$H=a*Ivh2ga-%E9-WD7>uGCcXBNkX#NriTb#!Jkbz70jW zwHWG>OFPg5u@3lAI#EzfS34*HMULm@11E-2 zCk)&$dXhV@gXGta#ckurCiwb=zm)`{2A=U`a3u~uY0sa|UinVkjYv569N=0`jJ?#~ zW3=NhoLG8Zr=WIp=tT}iSykED(h_; zN3P7{0=y8n9Rc#(_g9_YJ0owYQx-1U*=08iXmd0&| zxV%{7y-5jSx#rQvZt5|5ira zmP4|L-oGL|Yc`0qS<~?iu?h&(zv3!=^&WJcBiM@0P}1f3oyF=L!R2=BFOOKpJFTF( z_r1#W)A8rRvxchio@sc)Y10kiDW|c$fj)nYTO3M|F&)M93in`nvE;4jhQ&ZRE;+?* z|HAb$`bd4%mmtJB{rP&}gl|A^hb8eDEOmp>ff9a1x@tfCIc^46x*vlMTsUm*{w4xg z1lN!`pwKJbn2%yjU5P%9?bc{6PRr;jK|39peI;?BWZ#D07e_IYVFD=cSM0-*8V3D= zTeEF}xM1NbJ?_+^bXpt@UYD)>QV=@Feu%@lh;h>L3z@C=YKn8|n2 zP+CID8E#F%O%M$)5gfk9Nn*O^F?BF;x#aMM543&z`TY>Rya9C*FAw+pN{y${_Bikd z4WAPM>f@Oh|M4;_j;)Ubv&9~s7_}3(R4frX;z-_9v2>S^_OMBlxGIx-hF>CuZXN1a z8jiqXs0cnrT$C{pJw`-(F$SvjnBUU$7rqKBAzWz~peBjj3f1rLb(flO{f`jh;tZ~@ z&|RLZ=b{F1(-o0w1631;wcQ{hDR8EqkaVLjDW%%rhSL46q!v@|(Wk?KzY&6Dvd0o~qeY|*IS(0rQ)&lG zr(Bq?Xor;YO3ig;xFBOy`unYoXZqvupkcq#f7m+ot#qQM_QDKn9#&3j0exLSQ>~PC zi`|oner}B21YmhO%8RCZJ=7o;C=7F4%OkjxglH~r75;u5&PRFsh^tmub-1-Z79WoN z0Zh8#pQwdmK_lKcAKZ+)t&V35p@o~40BPxY4&R52cOe39EEWY(cT~M8_EHvNAH&VX zrUHf8^zjP_nD+z3#*L+!L2yRwc0q1O`ZkgNO-hgD5Ys7Oijjyp=ENU(K6ZQzLf!G; zb+KF%wfi8y_XdYF5W5sfC=~0AgL^0gotta$H|9&g%o%?A&q<1O=SHIU(6dJEzYC?c{bjupW=%H3lkLDGLq<>0HGQ;>pQYdZ+UIV6h zx9MQ>raFdCv(t20nuh!mI_Cb{#dU#YL#i9&F4R(l<|Cw!A_egNXf`|csgW&yC=^fI@Kb6$ z&mDX>m=bfBEBtN|n#Nc|^8M?aZEwu_Hr94Z>HeUqguGUiQi(Ov94=G^`bEV^+_nKR zyl*v|!c8I^smvAeDvDR&ibv&$f)}KfVuXwF=5BGn@+@37KHz>CBE`v~6iazOwExON zB*9XulrzT={Ut@w_i@S(KTJkt#dX~26QCGcY>h!d$r1DgsCA(W8RGfxn7Qwcm}enA z^eMb5ZePttcz*(dU+nh~MG2YmV(*AR8p^_rK`JZuFUSN%PxazNKfj1t9G8^vGZAd=kGEMpP~Lhc>^NvnAp?sN5dD!Rv`|z`LIA|%!v+AQt7=AA$e{3Z%v8DKu$YkG4-Qco| zyCl>{hhi@nsfxi1LZ29diJ_CAKHO{=>L|djXy``p2Po2UCmOyf3tBr z;<2@GgRzYulNy*5^NC0n^yNix_}vGE2Nd+| z&Vd7Ioaf99E_2V^XL;u4N!Y&0RnlL!JmbVQ%&}eW$k-!Fcv7CL^ku9{Zy4(??e}M6 zLYUs~E{*!(4EGfbzk#U`1}L(WNul+5Y$JuTVV9YJY1~Y6_X{08a3b~+R9k!;ddcZN z862bBZ@U6j5vtVncquUKffH&*_wnG^*lA?Ic=`c=USYDah;b`4u|JeQgQ&3?gK?by zbb#X%RB_XLG(pi$NKaju&6^@ad;aJQ{&rmK0D2zehO2PyK1QSWO7N#B?hj@mq)^I8n?RTy<0fXm2c@xB;%VkSVN4ESNz zrbH@6EDu8?_!Sf?^g=2Wr8%(QgdogsEL3lbDCx0Z@^SpJykk%nt~Qa*aGj3pQtaqQ zF8+izY$6N)1VEd-=~RE(Z^F!uUuGwXvdwKM%q+wi*wV5&23&+x%Rv^QheAMDKk{$9J6e5Zu;Z( z-nL*kBd;RoW$?++KB5sDm&3*eS1BR0r3CuQAGt1WQ4Sf;Tnp`WF}5(8X<%x>!rII< zrcPbxBQV*x>!ZJ5dSzdir{KVr{!m-X_Wr=6a?QB6jLtCz4CP@Xy#qTu2Dl$0uzL)s z$|K4rr6U_IC$S+&xkeM13|$P%p5JB#vMX}>k#{Y!95OaR4B}oMHhU4Y?D_p9OXwQ{ zQ3b@mW+EKE*d@{~3Uq>EN+1CChGSUJ+m#%QSIcmFi!M@4+dqGQaHVFv2-Kkg(;;Iv z0_nuSXhO(&dcR#Q2@Ti}8UJ_FYGexe*vp;KDJeAcoR%Jf*Y+djIpVsFU?^pG>HA0GxXcD zSl~KOvkbTPvO3X;mpm%#t1|E!OZv;$rE_2Qva5do4ca6tU8OA{0e-->zw;ZuIKc7U!y5f((~7&@9A&lzxzO? zgM8lYLvMeK>1Ybt9y<<9FHhW`Oc2DyAL+!HHep-ZprNb4$B+Tw`r`l&iEuXM)0Sgy zR#_WU&k9bM#tR>H9| zpIyQQ60VT2MZ(<@J|^Ld66(qvk@1fuob!N4v1*4uu#GU5-yQY{|&tk8Gk^+Z4y2$;SmYnk?>;) z$KEf?k+4ughlEuUu9k4EgkP2LpC$a6ga;%Xl<++XGo*b@l91m_MbRZPzCyxSNXRoN z;SmX+mT-rJ4@%e}VXcHqC7dtel@d;tFjK;J?-S*`CgA}IeAtFoP;A?g8%Chenqz9fQ*Y&#-3Wq zx(tZu(08kd_nrfFdd!zOy&nJn3p&0f_@0tb=Zm3b)JMnHHMcjZs_!b#I`8U0d;OhW zwXmMjB>uMBQWAWf9jv|`6QT}vZJj?*=<8@;YNyZ31CrtD_V$+4czt`Tuf^MuKqc9E zTI&LLdg?pXruMc(d4r z>_QXs*_2Tu42*LrUtP{>$YT`QN#78k<|Zgk`MV-@K+7 zI-!rp!0>RZnK2HF8sc%9t^>u1XNB<7ll7l& zZ>kH}>stKYx(2F@7r!mr>TCC-#)bB!-dW9U&1!R9OLKs;u|om$E3|>2PtpiEMEiO0 z%d~1U)zITvEn7m!ChaJtF-1P&Za+^V>B&AlfBAI1zy@z4=H3k=7h~Rzx_Y&xlktWI zGQV(6QBj~^hFz_@(;Kko7na~_eS_WC9)S4mZFMd7I{%trD-@SsI6Gi3pu{!JYrSnV zILmy>y9O0&4Z?n4s`j;YEkSTym^meXm_ctUsaKVHmiEjvH#K~XR9PrM!d-XJXeM?;+DQq1YbhSX8%SFgxU)Kb? zgwYFe>g-j#!`jE z{1hh-08?Jw+|sOe7TS}7z#tm^?XC7QdlR~X*DvML(Rw9PONZSB3iAW@|99m|N9if{ z6nU` z>4bj>cvTDoYwYLG#|3I@Z<|HDh&|+ngQw|uB+!!+I8XM7TxVojA2?qH1k&u`7G&m2B=gxJ1OERiJs$icd&nPbc zM-qvOdp!Kt$i>idK9!v#7^%k7(9Y)+!~q&=ugB29@%o_1@xmrVDMXjF6T%5TdaH3h zh$P29p1!7~eRW+6cfB5uj7SomUfRtXEF+`R@uTWe0FS30k#qR#4Fa0fmZmJD z+l%6(^u#>P0dVxgJz_ND^m4f7BRr{Kb@5{goCy*Eq+t35$@HcwwJBLmVt9%lpXBahBohhUW7E0nVhYD{tko_4=S6a;?^aRc-7 z8^o~A8rm_2lZ$ArQ|p_={Er4Qnx*Jt*jleY0510YhQj;?8b##{Z#rfQm{d%+gQ=X@ z*hkSq?t1t|ucx`qqx$RWy{j=tV~i%Wyi)i&)*$BLF$vE~Xz~htu7u~A0&x}|%z43G zS_d|uWPU$QO+j(4Jq0oKyk@SaRhK~b$GSZ9Yw(^Hubfq4FCO&8bCUE++Ew!VG|$zw z3sYF5BmkB?2nLpb+D1KW~3+Qo1-W3b%D;d`sVh+ zM4y29TnBo-DB!t?dtzO1?lOcq0|Bp}Y@mWB8{#})v(k-cEO-DH0{UAx+j<7&#%_!xtzQlWfbmKUQSgiZkeE~ z8HE#cwZQeEqZf8aFSJ3*;}voGpC4#?UFUNUWKRJ%DTym4+yHPXZ8MkSy0CwcoydC) z;aD&JKS(BUvbdsep;^ZuzB+&!ueSj%#tV3MUT z9kSpoD|1d-)znK&?2@;$*oCTzjc*tOS)eprjJ*?2#yTn&R*rOrbcS?xPWpuxXRsW@ zY?g5>ElRv=4aie8mKFV}kQKar6|<{FEVtoWW?gm-GtIr4_2G(e9FLpxhAb&@!{ltp zo5dzKnAqfHkR4@Bo^!z|!|Zf68}W=qQa4EVVeYUO&o1Ia`T{M*$6dkLzv(zNgU7!F z+%Z`mrKiS6<$?ZE`5LB-Wm6jPEX!e2=4P`gb8<&6I5p|mgs9bL$S|;s`=G~*v)ILp zE*P0~YQiyVbezvzJGO}QY_Mc93-o1yT$VXGKCbVjX+;-KCEN^VG2}6mZ%l2bY!muH z3Bx2Ko3zb(jB^2g>Vyn7;ZG)(F?Ry<%|Tu9Y=L{?^+lUd+>TzcQ^y_1=J92~MG1%c zP7R355t3SVgxMZ9j%wEF5`m>@Uqm(fw$!)f{+xTo5yI#tz= zd31VJ=km5@zDeeyQ?Itg*h8=8d%cX!2A48@x5~qru$zcWwI|T#!}*BXh@X+K>Ri@D zr%%Yj(X2haX>|AzMMbX zBY-$YW0#|1PDwsh;l%H(K1p&y#D5T=z*(v z4(W$Bmlk1j$)k8_-*Sb~Gg@iO+fZwq+BT5(t{7ccxij)9u$6o_j&#V_BgqnFYw9)d zCsVF3^DJ+p((h!Ol31lK(8Rt^^-P{~CK}I$+0ObTtzHe5oe7yeOK?1ja)Pw&KA&nv zJL_DaozO`+?d3umm+DQ}&<_)M97(XhlIGBkq?+c{LDeg3H!r~p1y;8-*F#GefRa=U5-5eaP&IW6aFe{~R32BLI=Gt7Z5UgMGISeXi8HjS_P|XzV0QX(iufAm zTkgdH8aB~OQfo`fVh>Ym2n&S*M0uo5#>~m`ks@%dN$D5+ytS3@%r+-f%` zOK}C3`Ga0|sm!wk4p`(VrPkveAGfFBA6n;}k6k0EE)p~c&fa0QETp~j1{ zb{OH9KR0tE15WT>%+s_b>L=k*rm?H-K|d=F7M_ z==FD2dHuL_(Mneu%5a86g%^L8yQ_g+n}QWH2q0N@IwTQIw+x3o&HyUlr4XBID90_9 z)rj%whP!#SA6EjXNdoMFbm|Fo&t<*0np}(m?}6PcSD@UxI=E(y*RM-?W5v=X74G6W zT;%8J=@iv;&;aJ~bvpn_I*Z8Gff;*10re46O85E4Dq`ne1T zi*1d~YoJja!s9q(od-vF*xxG_IYs64ByZc=W}NiXg&1tSjiSI1-GL>iN~(g-V;*k@ zW~r|lO1h$JL_K^Go?EW(3(|E-x>KLSN9Wu71?l=E-N@hJx9bbiMJ1i}T2WtJo^#=` zFGzPv(w&n0iav+$$QPtz(k`v@gnYFn=a2q{6fLG1;}_* zo=-a@WZxK_FOkhU8t+IX{J#wp$a@xcDbIbf_^40FSM->GpVxlpO1o3?I~QN{UBRbU z*UPyC|A_y$)&T4aXKUDg$Gj``yfpQEmCjkeIuU&pGz2?s*hfQ{;5YFcK$zf<@eCro z3-E267sL=wJwK&$)Ok}F8;ji>f{$E`^96)c&pqipG&mjd08j86cs3IaU=z+Xw;-H) zE}42}nR=c{=bEeVybXGS?Rd^2Oi;yR!X6vJO?YwJUynLrgtiOg(#~Gsr+zT{^TgbQ4dTf~81oZmyBcL8j5!8dg@^E%XE4kWI39BZhIs%F6KudkG?){x z6FUA{@WfLm;}w zPYv({*WkhRcZTtUeIF0yO+C}3v(C$Kk?KL<3C_i{1L0c0?>Jy@2xF{Z-*MvXh{AwX zi-bG`Gs~oGfZveeKEPt^?ok`1o>``zY0_EeKn3h{y?`GgJOyEbmc_77gsp(xcpM1# z0*<(FRz>)fb4fbOT#x%VO~4bp4^KD31bgxHA>0S}OFX*}rn@>;oKsRe61*H|g--!r z0Qe-H5rhf;8s~=PccYB}FRl`{X9rw{hjd8ra@-M8K~n(uZ9E$gehg4qioSy|!8`F# zSz7>qF2hd&zAwWgfO*w|hTuFIUI5r2!vs5Jcmv?;c&J?nj$J15awx-gz-BxoXA9sN z89ocxyPUCyAsfM`@DL5bU(4_aVChQSUjWSlzz#fQs|4|`5)bbNY`6vYI6y=9Er#$= z9p3}I{#HQX@jest<2glT0n#~e3}J$F-b?p72+~9}f-J)F80EY}xK@AL+yU-xBm_5!@_;cZ=w%jaOw7FakP?~lw6;M4#& zEoZeh*ZbQ8?TzXz-1VPd7icY9J9|2=%(gW*Vy{AO%Zk#7)m1t#M9w4Q|7cV#Z*MqT z(+=y7+#U8EMLRa{=-t75uy-iN+LzmB?Z|Qjw$*NH+BUMywB5Qrce{Oi!FCYz zq8|e|`nL4#?2Gmd^s%j`t=6ptTZ^`qY^~Z_v$b|>$JVZ`o459D-MMww)`6|ZwhnF` z*?M*>+m^e{zRj^s0Z-qy-fdg9?cNsMc4}Kp@-Nz6vfZ)0W_#`SrtMwZH*fFVzH|Go w?YWSzW=GeK-8-T?Vmn55oZVr4e9Pl~kMDYX_v5k0+4oJ~hcN&6d|?gzFY_U~;s5{u diff --git a/.venv/Lib/site-packages/aiohttp/_websocket.pyx b/.venv/Lib/site-packages/aiohttp/_websocket.pyx deleted file mode 100644 index 94318d2..0000000 --- a/.venv/Lib/site-packages/aiohttp/_websocket.pyx +++ /dev/null @@ -1,56 +0,0 @@ -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 - - -def _websocket_mask_cython(object mask, object 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 - - if not isinstance(mask, bytes): - mask = bytes(mask) - - if isinstance(data, bytearray): - data = data - else: - data = bytearray(data) - - 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/.venv/Lib/site-packages/aiohttp/abc.py b/.venv/Lib/site-packages/aiohttp/abc.py deleted file mode 100644 index ee83899..0000000 --- a/.venv/Lib/site-packages/aiohttp/abc.py +++ /dev/null @@ -1,209 +0,0 @@ -import asyncio -import logging -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, - Tuple, -) - -from multidict import CIMultiDict -from yarl import URL - -from .helpers import get_running_loop -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): - @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[Any, None, StreamResponse]: - """Execute the view handler.""" - - -class AbstractResolver(ABC): - """Abstract DNS resolver.""" - - @abstractmethod - async def resolve(self, host: str, port: int, family: int) -> List[Dict[str, Any]]: - """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 = get_running_loop(loop) - - @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.""" - - @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 = 0 - output_size = 0 - length: Optional[int] = 0 - - @abstractmethod - async def write(self, chunk: bytes) -> 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") -> 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""" - - -class AbstractAccessLogger(ABC): - """Abstract writer to access log.""" - - 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.""" diff --git a/.venv/Lib/site-packages/aiohttp/base_protocol.py b/.venv/Lib/site-packages/aiohttp/base_protocol.py deleted file mode 100644 index 4c9f0a7..0000000 --- a/.venv/Lib/site-packages/aiohttp/base_protocol.py +++ /dev/null @@ -1,90 +0,0 @@ -import asyncio -from typing import Optional, cast - -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 - - 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: - waiter.set_exception(exc) - - async def _drain_helper(self) -> None: - if not self.connected: - raise ConnectionResetError("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/.venv/Lib/site-packages/aiohttp/client.py b/.venv/Lib/site-packages/aiohttp/client.py deleted file mode 100644 index 7e9b32f..0000000 --- a/.venv/Lib/site-packages/aiohttp/client.py +++ /dev/null @@ -1,1363 +0,0 @@ -"""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 SimpleNamespace, TracebackType -from typing import ( - TYPE_CHECKING, - Any, - Awaitable, - Callable, - Coroutine, - Final, - FrozenSet, - Generator, - Generic, - Iterable, - List, - Mapping, - Optional, - Set, - Tuple, - Type, - TypeVar, - Union, -) - -import attr -from multidict import CIMultiDict, MultiDict, MultiDictProxy, istr -from yarl import URL - -from . import hdrs, http, payload -from .abc import AbstractCookieJar -from .client_exceptions import ( - ClientConnectionError as ClientConnectionError, - ClientConnectorCertificateError as ClientConnectorCertificateError, - ClientConnectorError as ClientConnectorError, - ClientConnectorSSLError as ClientConnectorSSLError, - ClientError as ClientError, - ClientHttpProxyError as ClientHttpProxyError, - ClientOSError as ClientOSError, - ClientPayloadError as ClientPayloadError, - ClientProxyConnectionError as ClientProxyConnectionError, - ClientResponseError as ClientResponseError, - ClientSSLError as ClientSSLError, - ContentTypeError as ContentTypeError, - InvalidURL as InvalidURL, - ServerConnectionError as ServerConnectionError, - ServerDisconnectedError as ServerDisconnectedError, - ServerFingerprintMismatch as ServerFingerprintMismatch, - ServerTimeoutError as ServerTimeoutError, - TooManyRedirects as TooManyRedirects, - WSServerHandshakeError as WSServerHandshakeError, -) -from .client_reqrep import ( - ClientRequest as ClientRequest, - ClientResponse as ClientResponse, - Fingerprint as Fingerprint, - RequestInfo as RequestInfo, - _merge_ssl_params, -) -from .client_ws import ClientWebSocketResponse as ClientWebSocketResponse -from .connector import ( - BaseConnector as BaseConnector, - NamedPipeConnector as NamedPipeConnector, - TCPConnector as TCPConnector, - UnixConnector as UnixConnector, -) -from .cookiejar import CookieJar -from .helpers import ( - _SENTINEL, - DEBUG, - BasicAuth, - TimeoutHandle, - ceil_timeout, - get_env_proxy_for_url, - get_running_loop, - method_must_be_empty_body, - sentinel, - strip_auth_from_url, -) -from .http import WS_KEY, HttpVersion, WebSocketReader, WebSocketWriter -from .http_websocket import WSHandshakeError, WSMessage, ws_ext_gen, ws_ext_parse -from .streams import FlowControlDataQueue -from .tracing import Trace, TraceConfig -from .typedefs import JSONEncoder, LooseCookies, LooseHeaders, StrOrURL - -__all__ = ( - # client_exceptions - "ClientConnectionError", - "ClientConnectorCertificateError", - "ClientConnectorError", - "ClientConnectorSSLError", - "ClientError", - "ClientHttpProxyError", - "ClientOSError", - "ClientPayloadError", - "ClientProxyConnectionError", - "ClientResponseError", - "ClientSSLError", - "ContentTypeError", - "InvalidURL", - "ServerConnectionError", - "ServerDisconnectedError", - "ServerFingerprintMismatch", - "ServerTimeoutError", - "TooManyRedirects", - "WSServerHandshakeError", - # client_reqrep - "ClientRequest", - "ClientResponse", - "Fingerprint", - "RequestInfo", - # connector - "BaseConnector", - "TCPConnector", - "UnixConnector", - "NamedPipeConnector", - # client_ws - "ClientWebSocketResponse", - # client - "ClientSession", - "ClientTimeout", - "request", -) - - -if TYPE_CHECKING: - from ssl import SSLContext -else: - SSLContext = None - - -@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) - -_RetType = TypeVar("_RetType") -_CharsetResolver = Callable[[ClientResponse, bytes], str] - - -class ClientSession: - """First-class interface for making HTTP requests.""" - - ATTRS = frozenset( - [ - "_base_url", - "_source_traceback", - "_connector", - "requote_redirect_url", - "_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", - ] - ) - - _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, - 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", - ) -> None: - if loop is None: - if connector is not None: - loop = connector._loop - - loop = get_running_loop(loop) - - if base_url is None or isinstance(base_url, URL): - self._base_url: Optional[URL] = base_url - else: - self._base_url = URL(base_url) - assert ( - self._base_url.origin() == self._base_url - ), "Only absolute URLs without path part are supported" - - if connector is None: - connector = TCPConnector(loop=loop) - - 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 is not None: - 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 - 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" - ) - 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 - - 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) - - 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 is None: - return url - else: - assert not url.is_absolute() and url.path.startswith("/") - return self._base_url.join(url) - - async def _request( - self, - method: str, - str_or_url: StrOrURL, - *, - params: Optional[Mapping[str, str]] = 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: Optional[str] = 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[SimpleNamespace] = None, - read_bufsize: Optional[int] = None, - auto_decompress: Optional[bool] = None, - max_line_size: Optional[int] = None, - max_field_size: Optional[int] = 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 = [] - version = self._version - params = params or {} - - # Merge with default headers and transform to CIMultiDict - headers = self._prepare_headers(headers) - proxy_headers = self._prepare_headers(proxy_headers) - - try: - url = self._build_url(str_or_url) - except ValueError as e: - raise InvalidURL(str_or_url) from e - - skip_headers = set(self._skip_auto_headers) - if skip_auto_headers is not None: - for i in skip_auto_headers: - skip_headers.add(istr(i)) - - if proxy is not None: - 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: - while True: - url, auth_from_url = strip_auth_from_url(url) - if auth and auth_from_url: - raise ValueError( - "Cannot combine AUTH argument with " - "credentials encoded in URL" - ) - - if auth is None: - auth = auth_from_url - if auth is None: - auth = self._default_auth - # 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() - tmp_cookie_jar.update_cookies(cookies) - req_cookies = tmp_cookie_jar.filter_cookies(url) - if req_cookies: - all_cookies.load(req_cookies) - - if proxy is not None: - proxy = URL(proxy) - elif self._trust_env: - with suppress(LookupError): - proxy, proxy_auth = 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, - ) - - # connection timeout - try: - async with ceil_timeout( - real_timeout.connect, - ceil_threshold=real_timeout.ceil_threshold, - ): - assert self._connector is not None - conn = await self._connector.connect( - req, traces=traces, timeout=real_timeout - ) - except asyncio.TimeoutError as exc: - raise ServerTimeoutError( - "Connection timeout " "to host {}".format(url) - ) from exc - - assert conn.transport is not None - - assert conn.protocol is not None - conn.protocol.set_response_params( - timer=timer, - skip_payload=method_must_be_empty_body(method), - 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: - try: - resp = await req.send(conn) - try: - await resp.start(conn) - except BaseException: - resp.close() - raise - except BaseException: - conn.close() - 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 - - self._cookie_jar.update_cookies(resp.cookies, 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: - 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) - - 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_url = URL( - r_url, encoded=not self._requote_redirect_url - ) - - except ValueError as e: - raise InvalidURL(r_url) from e - - scheme = parsed_url.scheme - if scheme not in ("http", "https", ""): - resp.close() - raise ValueError("Can redirect only to http or https") - elif not scheme: - parsed_url = url.join(parsed_url) - - if url.origin() != parsed_url.origin(): - auth = None - headers.pop(hdrs.AUTHORIZATION, None) - - url = parsed_url - params = {} - resp.release() - continue - - break - - # 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: float = 10.0, - receive_timeout: Optional[float] = None, - autoclose: bool = True, - autoping: bool = True, - heartbeat: Optional[float] = None, - auth: Optional[BasicAuth] = None, - origin: Optional[str] = None, - params: Optional[Mapping[str, str]] = None, - headers: Optional[LooseHeaders] = None, - proxy: Optional[StrOrURL] = None, - proxy_auth: Optional[BasicAuth] = None, - ssl: Union[SSLContext, bool, None, Fingerprint] = True, - verify_ssl: Optional[bool] = None, - fingerprint: Optional[bytes] = None, - ssl_context: Optional[SSLContext] = 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, - 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: float = 10.0, - receive_timeout: Optional[float] = None, - autoclose: bool = True, - autoping: bool = True, - heartbeat: Optional[float] = None, - auth: Optional[BasicAuth] = None, - origin: Optional[str] = None, - params: Optional[Mapping[str, str]] = None, - headers: Optional[LooseHeaders] = None, - proxy: Optional[StrOrURL] = None, - proxy_auth: Optional[BasicAuth] = None, - ssl: Optional[Union[SSLContext, bool, Fingerprint]] = True, - verify_ssl: Optional[bool] = None, - fingerprint: Optional[bytes] = None, - ssl_context: Optional[SSLContext] = None, - proxy_headers: Optional[LooseHeaders] = None, - compress: int = 0, - max_msg_size: int = 4 * 1024 * 1024, - ) -> ClientWebSocketResponse: - - 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: - 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, - 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 - transport = conn.transport - assert transport is not None - reader: FlowControlDataQueue[WSMessage] = FlowControlDataQueue( - 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, - timeout, - autoclose, - autoping, - self._loop, - receive_timeout=receive_timeout, - 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( - 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 = 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 = await self._coro - return self._resp - - -class _RequestContextManager(_BaseRequestContextManager[ClientResponse]): - __slots__ = () - - async def __aexit__( - self, - exc_type: Optional[Type[BaseException]], - exc: Optional[BaseException], - tb: Optional[TracebackType], - ) -> None: - # We're basing behavior on the exception as it can be caused by - # user code unrelated to the status of the connection. If you - # would like to close a connection you must do that - # explicitly. Otherwise connection error handling should kick in - # and close/recycle the connection as required. - self._resp.release() - await self._resp.wait_for_close() - - -class _WSRequestContextManager(_BaseRequestContextManager[ClientWebSocketResponse]): - __slots__ = () - - async def __aexit__( - self, - exc_type: Optional[Type[BaseException]], - exc: Optional[BaseException], - tb: Optional[TracebackType], - ) -> None: - await self._resp.close() - - -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() - - -def request( - method: str, - url: StrOrURL, - *, - params: Optional[Mapping[str, str]] = None, - data: Any = None, - json: Any = 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: Optional[str] = None, - chunked: Optional[bool] = None, - expect100: bool = False, - raise_for_status: Optional[bool] = None, - read_until_eof: bool = True, - proxy: Optional[StrOrURL] = None, - proxy_auth: Optional[BasicAuth] = None, - timeout: Union[ClientTimeout, object] = sentinel, - cookies: Optional[LooseCookies] = None, - version: HttpVersion = http.HttpVersion11, - connector: Optional[BaseConnector] = None, - read_bufsize: Optional[int] = None, - loop: Optional[asyncio.AbstractEventLoop] = None, - max_line_size: int = 8190, - max_field_size: int = 8190, -) -> _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 - >>> resp = await aiohttp.request('GET', 'http://python.org/') - >>> 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=cookies, - version=version, - timeout=timeout, - connector=connector, - connector_owner=connector_owner, - ) - - return _SessionRequestContextManager( - session._request( - method, - url, - params=params, - data=data, - json=json, - headers=headers, - skip_auto_headers=skip_auto_headers, - auth=auth, - allow_redirects=allow_redirects, - max_redirects=max_redirects, - compress=compress, - chunked=chunked, - expect100=expect100, - raise_for_status=raise_for_status, - read_until_eof=read_until_eof, - proxy=proxy, - proxy_auth=proxy_auth, - read_bufsize=read_bufsize, - max_line_size=max_line_size, - max_field_size=max_field_size, - ), - session, - ) diff --git a/.venv/Lib/site-packages/aiohttp/client_exceptions.py b/.venv/Lib/site-packages/aiohttp/client_exceptions.py deleted file mode 100644 index 9b6e442..0000000 --- a/.venv/Lib/site-packages/aiohttp/client_exceptions.py +++ /dev/null @@ -1,346 +0,0 @@ -"""HTTP related errors.""" - -import asyncio -import warnings -from typing import TYPE_CHECKING, Any, Optional, Tuple, Union - -from .http_parser import RawResponseMessage -from .typedefs import LooseHeaders - -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 -else: - RequestInfo = ClientResponse = ConnectionKey = None - -__all__ = ( - "ClientError", - "ClientConnectionError", - "ClientOSError", - "ClientConnectorError", - "ClientProxyConnectionError", - "ClientSSLError", - "ClientConnectorSSLError", - "ClientConnectorCertificateError", - "ServerConnectionError", - "ServerTimeoutError", - "ServerDisconnectedError", - "ServerFingerprintMismatch", - "ClientResponseError", - "ClientHttpProxyError", - "WSServerHandshakeError", - "ContentTypeError", - "ClientPayloadError", - "InvalidURL", -) - - -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[LooseHeaders] = 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, - 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 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 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 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: Any) -> None: - # The type of url is not yarl.URL because the exception can be raised - # on URL(url) call - super().__init__(url) - - @property - def url(self) -> Any: - return self.args[0] - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} {self.url}>" - - -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) - ) diff --git a/.venv/Lib/site-packages/aiohttp/client_proto.py b/.venv/Lib/site-packages/aiohttp/client_proto.py deleted file mode 100644 index ca99808..0000000 --- a/.venv/Lib/site-packages/aiohttp/client_proto.py +++ /dev/null @@ -1,264 +0,0 @@ -import asyncio -from contextlib import suppress -from typing import Any, Optional, Tuple - -from .base_protocol import BaseProtocol -from .client_exceptions import ( - ClientOSError, - ClientPayloadError, - ServerDisconnectedError, - ServerTimeoutError, -) -from .helpers import BaseTimerContext, status_code_must_be_empty_body -from .http import HttpResponseParser, RawResponseMessage -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 - - @property - def upgraded(self) -> bool: - return self._upgraded - - @property - def should_close(self) -> bool: - if self._payload is not None and not self._payload.is_eof() or self._upgraded: - return True - - return ( - self._should_close - or self._upgraded - or self.exception() is not None - or self._payload_parser is not None - or len(self) > 0 - or bool(self._tail) - ) - - def force_close(self) -> None: - self._should_close = True - - def close(self) -> None: - transport = self.transport - if transport is not None: - transport.close() - 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._drop_timeout() - - if self._payload_parser is not None: - with suppress(Exception): - self._payload_parser.feed_eof() - - uncompleted = None - if self._parser is not None: - try: - uncompleted = self._parser.feed_eof() - except Exception as e: - if self._payload is not None: - exc = ClientPayloadError("Response payload is not completed") - exc.__cause__ = e - self._payload.set_exception(exc) - - if not self.is_eof(): - if isinstance(exc, OSError): - exc = ClientOSError(*exc.args) - if exc is None: - exc = ServerDisconnectedError(uncompleted) - # assigns self._should_close to True as side effect, - # we do it anyway below - self.set_exception(exc) - - self._should_close = True - self._parser = None - self._payload = None - self._payload_parser = None - self._reading_paused = False - - super().connection_lost(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) -> None: - self._should_close = True - self._drop_timeout() - super().set_exception(exc) - - def set_parser(self, parser: Any, payload: Any) -> None: - # TODO: actual types are: - # parser: WebSocketReader - # payload: FlowControlDataQueue - # 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() - - def _on_read_timeout(self) -> None: - exc = ServerTimeoutError("Timeout on reading data from socket") - self.set_exception(exc) - if self._payload is not None: - self._payload.set_exception(exc) - - def data_received(self, data: bytes) -> None: - self._reschedule_timeout() - - if not data: - return - - # custom payload parser - 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 - else: - if self._upgraded or self._parser is None: - # i.e. websocket connection, websocket parser is not set yet - self._tail += data - else: - # parse http messages - try: - messages, upgraded, tail = self._parser.feed_data(data) - except BaseException as 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 - self.set_exception(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 status_code_must_be_empty_body( - message.code - ): - 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 tail: - if upgraded: - self.data_received(tail) - else: - self._tail = tail diff --git a/.venv/Lib/site-packages/aiohttp/client_reqrep.py b/.venv/Lib/site-packages/aiohttp/client_reqrep.py deleted file mode 100644 index e0de951..0000000 --- a/.venv/Lib/site-packages/aiohttp/client_reqrep.py +++ /dev/null @@ -1,1197 +0,0 @@ -import asyncio -import codecs -import contextlib -import functools -import io -import re -import sys -import traceback -import warnings -from hashlib import md5, sha1, sha256 -from http.cookies import CookieError, Morsel, SimpleCookie -from types import MappingProxyType, TracebackType -from typing import ( - TYPE_CHECKING, - Any, - Callable, - Dict, - Iterable, - List, - Mapping, - Optional, - Tuple, - Type, - Union, - cast, -) - -import attr -from multidict import CIMultiDict, CIMultiDictProxy, MultiDict, MultiDictProxy -from yarl import URL - -from . import hdrs, helpers, http, multipart, payload -from .abc import AbstractStreamWriter -from .client_exceptions import ( - ClientConnectionError, - ClientOSError, - ClientResponseError, - ContentTypeError, - InvalidURL, - ServerFingerprintMismatch, -) -from .compression_utils import HAS_BROTLI -from .formdata import FormData -from .helpers import ( - BaseTimerContext, - BasicAuth, - HeadersMixin, - TimerNoop, - basicauth_from_netrc, - netrc_from_env, - noop, - reify, - set_result, -) -from .http import ( - SERVER_SOFTWARE, - HttpVersion, - HttpVersion10, - HttpVersion11, - StreamWriter, -) -from .log import client_logger -from .streams import StreamReader -from .typedefs import ( - DEFAULT_JSON_DECODER, - JSONDecoder, - LooseCookies, - LooseHeaders, - RawHeaders, -) - -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 - - -_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: - return "gzip, deflate, br" if HAS_BROTLI else "gzip, deflate" - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class ContentDisposition: - type: Optional[str] - parameters: "MappingProxyType[str, str]" - filename: Optional[str] - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class RequestInfo: - url: URL - method: str - headers: "CIMultiDictProxy[str]" - real_url: URL = attr.ib() - - @real_url.default - def real_url_default(self) -> URL: - return self.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 - - -@attr.s(auto_attribs=True, slots=True, frozen=True) -class ConnectionKey: - # 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 - - -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(), - } - - body = b"" - auth = None - response = None - - __writer = None # async task for streaming data - _continue = None # waiter future for '100 Continue' response - - # 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: Optional[Mapping[str, str]] = None, - headers: Optional[LooseHeaders] = None, - skip_auto_headers: Iterable[str] = frozenset(), - data: Any = None, - cookies: Optional[LooseCookies] = None, - auth: Optional[BasicAuth] = None, - version: http.HttpVersion = http.HttpVersion11, - compress: Optional[str] = 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() - - match = _CONTAINS_CONTROL_CHAR_RE.search(method) - if match: - raise ValueError( - f"Method cannot contain non-token characters {method!r} " - "(found at least {match.group()!r})" - ) - - assert isinstance(url, URL), url - assert isinstance(proxy, (URL, type(None))), proxy - # FIXME: session is None in tests only, need to fix tests - # assert session is not None - self._session = cast("ClientSession", session) - if params: - q = MultiDict(url.query) - url2 = url.with_query(params) - q.extend(url2.query) - url = url.with_query(q) - self.original_url = url - self.url = url.with_fragment(None) - 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) - if traces is None: - traces = [] - self._traces = traces - - def __reset_writer(self, _: object = None) -> None: - self.__writer = None - - @property - def _writer(self) -> Optional["asyncio.Task[None]"]: - return self.__writer - - @_writer.setter - def _writer(self, writer: Optional["asyncio.Task[None]"]) -> None: - if self.__writer is not None: - self.__writer.remove_done_callback(self.__reset_writer) - self.__writer = writer - if writer is not None: - writer.add_done_callback(self.__reset_writer) - - def is_ssl(self) -> bool: - return self.url.scheme in ("https", "wss") - - @property - def ssl(self) -> Union["SSLContext", bool, Fingerprint]: - return self._ssl - - @property - def connection_key(self) -> ConnectionKey: - proxy_headers = self.proxy_headers - if proxy_headers: - h: Optional[int] = hash(tuple((k, v) for k, v in proxy_headers.items())) - else: - h = None - return ConnectionKey( - self.host, - self.port, - self.is_ssl(), - 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 request_info(self) -> RequestInfo: - headers: CIMultiDictProxy[str] = CIMultiDictProxy(self.headers) - return RequestInfo(self.url, self.method, headers, self.original_url) - - 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 - username, password = url.user, url.password - if username: - self.auth = helpers.BasicAuth(username, 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() - - # add host - netloc = cast(str, self.url.raw_host) - if helpers.is_ipv6_address(netloc): - netloc = f"[{netloc}]" - # See https://github.com/aio-libs/aiohttp/issues/3636. - netloc = netloc.rstrip(".") - if self.url.port is not None and not self.url.is_default_port(): - netloc += ":" + str(self.url.port) - self.headers[hdrs.HOST] = netloc - - if headers: - if isinstance(headers, (dict, MultiDictProxy, MultiDict)): - headers = headers.items() # type: ignore[assignment] - - for key, value in headers: # type: ignore[misc] - # A special case for Host header - if key.lower() == "host": - self.headers[key] = value - else: - self.headers.add(key, value) - - def update_auto_headers(self, skip_auto_headers: Iterable[str]) -> 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] - - for hdr, val in self.DEFAULT_HEADERS.items(): - if hdr not in used_headers: - self.headers.add(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: - c.load(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): - # Preserve coded_value - mrsl_val = value.get(value.key, Morsel()) - mrsl_val.set(value.key, value.value, value.coded_value) - c[name] = mrsl_val - 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 data is None: - return - - enc = self.headers.get(hdrs.CONTENT_ENCODING, "").lower() - if enc: - 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" - else: - if hdrs.CONTENT_LENGTH not in self.headers: - self.headers[hdrs.CONTENT_LENGTH] = str(len(self.body)) - - 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 and trust_env and self.url.host is not None: - netrc_obj = netrc_from_env() - with contextlib.suppress(LookupError): - auth = basicauth_from_netrc(netrc_obj, self.url.host) - 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) -> None: - if body is None: - return - - # FormData - if isinstance(body, FormData): - body = body() - - try: - body = payload.PAYLOAD_REGISTRY.get(body, disposition=None) - except payload.LookupError: - body = FormData(body)() - - self.body = body - - # enable chunked encoding if needed - if not self.chunked: - if hdrs.CONTENT_LENGTH not in self.headers: - size = body.size - if size is None: - self.chunked = True - else: - if hdrs.CONTENT_LENGTH not in self.headers: - self.headers[hdrs.CONTENT_LENGTH] = str(size) - - # copy payload headers - assert body.headers - for (key, value) in body.headers.items(): - if key in self.headers: - continue - if key in self.skip_auto_headers: - continue - self.headers[key] = value - - def update_expect_continue(self, expect: bool = False) -> None: - if expect: - self.headers[hdrs.EXPECT] = "100-continue" - elif self.headers.get(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: - if proxy_auth and not isinstance(proxy_auth, helpers.BasicAuth): - raise ValueError("proxy_auth must be None or BasicAuth() tuple") - self.proxy = proxy - self.proxy_auth = proxy_auth - self.proxy_headers = proxy_headers - - def keep_alive(self) -> bool: - if self.version < HttpVersion10: - # keep alive not supported at all - return False - if self.version == HttpVersion10: - if self.headers.get(hdrs.CONNECTION) == "keep-alive": - return True - else: # no headers means we close for Http 1.0 - return False - elif self.headers.get(hdrs.CONNECTION) == "close": - return False - - return True - - async def write_bytes( - self, writer: AbstractStreamWriter, conn: "Connection" - ) -> None: - """Support coroutines that yields bytes objects.""" - # 100 response - if self._continue is not None: - try: - await writer.drain() - await self._continue - except asyncio.CancelledError: - return - - protocol = conn.protocol - assert protocol is not None - try: - if isinstance(self.body, payload.Payload): - await self.body.write(writer) - else: - if isinstance(self.body, (bytes, bytearray)): - self.body = (self.body,) # type: ignore[assignment] - - for chunk in self.body: - await writer.write(chunk) # type: ignore[arg-type] - except OSError as exc: - if exc.errno is None and isinstance(exc, asyncio.TimeoutError): - protocol.set_exception(exc) - else: - new_exc = ClientOSError( - exc.errno, "Can not write request body for %s" % self.url - ) - new_exc.__context__ = exc - new_exc.__cause__ = exc - protocol.set_exception(new_exc) - except asyncio.CancelledError: - await writer.write_eof() - except Exception as exc: - protocol.set_exception(exc) - else: - 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.raw_host - assert connect_host is not None - if helpers.is_ipv6_address(connect_host): - connect_host = f"[{connect_host}]" - 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 - if self.url.raw_query_string: - path += "?" + self.url.raw_query_string - - 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 - ), - on_headers_sent=functools.partial( - self._on_headers_request_sent, self.method, self.url - ), - ) - - if self.compress: - writer.enable_compression(self.compress) - - if self.chunked is not None: - writer.enable_chunking() - - # set default content-type - if ( - self.method in self.POST_METHODS - and 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" - - # set the connection header - connection = self.headers.get(hdrs.CONNECTION) - if not connection: - if self.keep_alive(): - if self.version == HttpVersion10: - connection = "keep-alive" - else: - if self.version == HttpVersion11: - connection = "close" - - if connection is not None: - self.headers[hdrs.CONNECTION] = connection - - # status + headers - status_line = "{0} {1} HTTP/{v.major}.{v.minor}".format( - self.method, path, v=self.version - ) - await writer.write_headers(status_line, self.headers) - - self._writer = self.loop.create_task(self.write_bytes(writer, conn)) - - response_class = self.response_class - assert response_class is not None - self.response = response_class( - self.method, - self.original_url, - writer=self._writer, - 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: - with contextlib.suppress(asyncio.CancelledError): - await self._writer - - 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) - - -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 - _headers: CIMultiDictProxy[str] = None # type: ignore[assignment] - _raw_headers: RawHeaders = None # type: ignore[assignment] - - _connection = None # current connection - _source_traceback: Optional[traceback.StackSummary] = 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 - __writer = None - - def __init__( - self, - method: str, - url: URL, - *, - writer: "asyncio.Task[None]", - continue100: Optional["asyncio.Future[bool]"], - timer: BaseTimerContext, - request_info: RequestInfo, - traces: List["Trace"], - loop: asyncio.AbstractEventLoop, - session: "ClientSession", - ) -> None: - assert isinstance(url, URL) - - self.method = method - self.cookies = SimpleCookie() - - self._real_url = url - self._url = url.with_fragment(None) - self._body: Any = None - self._writer: Optional[asyncio.Task[None]] = writer - self._continue = continue100 # None by default - self._closed = True - self._history: Tuple[ClientResponse, ...] = () - 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 - # store a reference to session #1985 - self._session: Optional[ClientSession] = session - # Save reference to _resolve_charset, so that get_encoding() will still - # work after the response has finished reading the body. - if session is None: - # TODO: Fix session=None in tests (see ClientRequest.__init__). - self._resolve_charset: Callable[ - ["ClientResponse", bytes], str - ] = lambda *_: "utf-8" - else: - 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]"]: - return self.__writer - - @_writer.setter - def _writer(self, writer: Optional["asyncio.Task[None]"]) -> None: - if self.__writer is not None: - self.__writer.remove_done_callback(self.__reset_writer) - self.__writer = writer - if writer is not None: - writer.add_done_callback(self.__reset_writer) - - @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 - for hdr in self.headers.getall(hdrs.SET_COOKIE, ()): - try: - self.cookies.load(hdr) - except CookieError as exc: - client_logger.warning("Can not load response cookies: %s", exc) - 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 - 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: - await self._writer - 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: - content.set_exception(ClientConnectionError("Connection closed")) - self._released = True - - async def wait_for_close(self) -> None: - if self._writer is not None: - await self._writer - 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 # type: ignore[no-any-return] - - 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): - 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( # type: ignore[no-any-return,union-attr] - encoding, errors=errors - ) - - 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, - 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": - return self - - async def __aexit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - # 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() diff --git a/.venv/Lib/site-packages/aiohttp/client_ws.py b/.venv/Lib/site-packages/aiohttp/client_ws.py deleted file mode 100644 index d9c74a3..0000000 --- a/.venv/Lib/site-packages/aiohttp/client_ws.py +++ /dev/null @@ -1,315 +0,0 @@ -"""WebSocket client for asyncio.""" - -import asyncio -import sys -from typing import Any, Optional, cast - -from .client_exceptions import ClientError -from .client_reqrep import ClientResponse -from .helpers import call_later, set_result -from .http import ( - WS_CLOSED_MESSAGE, - WS_CLOSING_MESSAGE, - WebSocketError, - WSCloseCode, - WSMessage, - WSMsgType, -) -from .http_websocket import WebSocketWriter # WSMessage -from .streams import EofStream, FlowControlDataQueue -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 - - -class ClientWebSocketResponse: - def __init__( - self, - reader: "FlowControlDataQueue[WSMessage]", - writer: WebSocketWriter, - protocol: Optional[str], - response: ClientResponse, - timeout: float, - autoclose: bool, - autoping: bool, - loop: asyncio.AbstractEventLoop, - *, - receive_timeout: Optional[float] = None, - 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._receive_timeout = receive_timeout - self._autoclose = autoclose - self._autoping = autoping - self._heartbeat = heartbeat - self._heartbeat_cb: Optional[asyncio.TimerHandle] = None - if heartbeat is not None: - self._pong_heartbeat = heartbeat / 2.0 - self._pong_response_cb: Optional[asyncio.TimerHandle] = None - self._loop = loop - self._waiting: Optional[asyncio.Future[bool]] = None - self._exception: Optional[BaseException] = None - self._compress = compress - self._client_notakeover = client_notakeover - - self._reset_heartbeat() - - def _cancel_heartbeat(self) -> None: - if self._pong_response_cb is not None: - self._pong_response_cb.cancel() - self._pong_response_cb = None - - if self._heartbeat_cb is not None: - self._heartbeat_cb.cancel() - self._heartbeat_cb = None - - def _reset_heartbeat(self) -> None: - self._cancel_heartbeat() - - if self._heartbeat is not None: - self._heartbeat_cb = call_later( - self._send_heartbeat, - self._heartbeat, - self._loop, - timeout_ceil_threshold=self._conn._connector._timeout_ceil_threshold - if self._conn is not None - else 5, - ) - - def _send_heartbeat(self) -> None: - if self._heartbeat is not None and not self._closed: - # fire-and-forget a task is not perfect but maybe ok for - # sending ping. Otherwise we need a long-living heartbeat - # task in the class. - self._loop.create_task(self._writer.ping()) - - if self._pong_response_cb is not None: - self._pong_response_cb.cancel() - self._pong_response_cb = call_later( - self._pong_not_received, - self._pong_heartbeat, - self._loop, - timeout_ceil_threshold=self._conn._connector._timeout_ceil_threshold - if self._conn is not None - else 5, - ) - - def _pong_not_received(self) -> None: - if not self._closed: - self._closed = True - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - self._exception = asyncio.TimeoutError() - self._response.close() - - @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.ping(message) - - async def pong(self, message: bytes = b"") -> None: - await self._writer.pong(message) - - 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(data, binary=False, 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(data, binary=True, 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 is not None and not self._closing: - self._closing = True - self._reader.feed_data(WS_CLOSING_MESSAGE, 0) - await self._waiting - - if not self._closed: - self._cancel_heartbeat() - self._closed = True - 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): - 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 == WSMsgType.CLOSE: - self._close_code = msg.data - self._response.close() - return True - else: - return False - - async def receive(self, timeout: Optional[float] = None) -> WSMessage: - while True: - if self._waiting is not None: - 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 = self._loop.create_future() - try: - async with async_timeout.timeout(timeout or self._receive_timeout): - msg = await self._reader.read() - self._reset_heartbeat() - finally: - waiter = self._waiting - self._waiting = None - set_result(waiter, True) - 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: - self._closed = True - 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._closing = True - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - await self.close() - return WSMessage(WSMsgType.ERROR, exc, None) - - if msg.type == WSMsgType.CLOSE: - self._closing = True - self._close_code = msg.data - if not self._closed and self._autoclose: - await self.close() - elif msg.type == WSMsgType.CLOSING: - self._closing = True - elif msg.type == WSMsgType.PING and self._autoping: - await self.pong(msg.data) - continue - elif msg.type == 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 != WSMsgType.TEXT: - raise TypeError(f"Received message {msg.type}:{msg.data!r} is not str") - return cast(str, msg.data) - - async def receive_bytes(self, *, timeout: Optional[float] = None) -> bytes: - msg = await self.receive(timeout) - if msg.type != WSMsgType.BINARY: - raise TypeError(f"Received message {msg.type}:{msg.data!r} is not bytes") - 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 diff --git a/.venv/Lib/site-packages/aiohttp/compression_utils.py b/.venv/Lib/site-packages/aiohttp/compression_utils.py deleted file mode 100644 index 9631d37..0000000 --- a/.venv/Lib/site-packages/aiohttp/compression_utils.py +++ /dev/null @@ -1,157 +0,0 @@ -import asyncio -import zlib -from concurrent.futures import Executor -from typing import Optional, cast - -try: - try: - import brotlicffi as brotli - except ImportError: - import brotli - - HAS_BROTLI = True -except ImportError: # pragma: no cover - HAS_BROTLI = False - -MAX_SYNC_CHUNK_SIZE = 1024 - - -def encoding_to_mode( - encoding: Optional[str] = None, - suppress_deflate_header: bool = False, -) -> int: - if encoding == "gzip": - return 16 + zlib.MAX_WBITS - - return -zlib.MAX_WBITS if suppress_deflate_header else zlib.MAX_WBITS - - -class ZlibBaseHandler: - def __init__( - self, - mode: int, - executor: Optional[Executor] = None, - max_sync_chunk_size: Optional[int] = MAX_SYNC_CHUNK_SIZE, - ): - self._mode = mode - self._executor = executor - self._max_sync_chunk_size = max_sync_chunk_size - - -class ZLibCompressor(ZlibBaseHandler): - def __init__( - self, - encoding: Optional[str] = None, - suppress_deflate_header: bool = False, - level: Optional[int] = None, - wbits: Optional[int] = None, - strategy: int = zlib.Z_DEFAULT_STRATEGY, - executor: Optional[Executor] = None, - max_sync_chunk_size: Optional[int] = MAX_SYNC_CHUNK_SIZE, - ): - super().__init__( - mode=encoding_to_mode(encoding, suppress_deflate_header) - if wbits is None - else wbits, - executor=executor, - max_sync_chunk_size=max_sync_chunk_size, - ) - if level is None: - self._compressor = zlib.compressobj(wbits=self._mode, strategy=strategy) - else: - self._compressor = zlib.compressobj( - wbits=self._mode, strategy=strategy, level=level - ) - self._compress_lock = asyncio.Lock() - - def compress_sync(self, data: bytes) -> bytes: - return self._compressor.compress(data) - - async def compress(self, data: bytes) -> bytes: - async with self._compress_lock: - # To ensure the stream is consistent in the event - # there are multiple writers, we need to lock - # the compressor so that only one writer can - # compress at a time. - 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.compress_sync, data - ) - return self.compress_sync(data) - - def flush(self, mode: int = zlib.Z_FINISH) -> bytes: - return self._compressor.flush(mode) - - -class ZLibDecompressor(ZlibBaseHandler): - 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__( - mode=encoding_to_mode(encoding, suppress_deflate_header), - executor=executor, - max_sync_chunk_size=max_sync_chunk_size, - ) - self._decompressor = zlib.decompressobj(wbits=self._mode) - - def decompress_sync(self, data: bytes, max_length: int = 0) -> bytes: - return self._decompressor.decompress(data, max_length) - - async def decompress(self, data: bytes, max_length: int = 0) -> bytes: - 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) - - 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 - - @property - def unconsumed_tail(self) -> bytes: - return self._decompressor.unconsumed_tail - - @property - def unused_data(self) -> bytes: - return self._decompressor.unused_data - - -class BrotliDecompressor: - # 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) -> None: - if not HAS_BROTLI: - raise RuntimeError( - "The brotli decompression is not available. " - "Please install `Brotli` module" - ) - self._obj = brotli.Decompressor() - - def decompress_sync(self, data: bytes) -> bytes: - if hasattr(self._obj, "decompress"): - return cast(bytes, self._obj.decompress(data)) - return cast(bytes, self._obj.process(data)) - - def flush(self) -> bytes: - if hasattr(self._obj, "flush"): - return cast(bytes, self._obj.flush()) - return b"" diff --git a/.venv/Lib/site-packages/aiohttp/connector.py b/.venv/Lib/site-packages/aiohttp/connector.py deleted file mode 100644 index 3b9841d..0000000 --- a/.venv/Lib/site-packages/aiohttp/connector.py +++ /dev/null @@ -1,1489 +0,0 @@ -import asyncio -import functools -import random -import sys -import traceback -import warnings -from collections import defaultdict, deque -from contextlib import suppress -from http import HTTPStatus -from http.cookies import SimpleCookie -from itertools import cycle, islice -from time import monotonic -from types import TracebackType -from typing import ( - TYPE_CHECKING, - Any, - Awaitable, - Callable, - DefaultDict, - Dict, - Iterator, - List, - Literal, - Optional, - Set, - Tuple, - Type, - Union, - cast, -) - -import attr - -from . import hdrs, helpers -from .abc import AbstractResolver -from .client_exceptions import ( - ClientConnectionError, - ClientConnectorCertificateError, - 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 ceil_timeout, get_running_loop, is_ip_address, noop, sentinel -from .locks import EventResultOrError -from .resolver import DefaultResolver - -try: - import ssl - - SSLContext = ssl.SSLContext -except ImportError: # pragma: no cover - ssl = None # type: ignore[assignment] - SSLContext = object # type: ignore[misc,assignment] - - -__all__ = ("BaseConnector", "TCPConnector", "UnixConnector", "NamedPipeConnector") - - -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, - ) - - -class Connection: - - _source_traceback = None - _transport = 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, should_close=self._protocol.should_close - ) - self._protocol = None - - @property - def closed(self) -> bool: - return self._protocol is None or not self._protocol.is_connected() - - -class _TransportPlaceholder: - """placeholder for BaseConnector.connect function""" - - def close(self) -> None: - pass - - -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 - - 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 = get_running_loop(loop) - self._timeout_ceil_threshold = timeout_ceil_threshold - - self._closed = False - if loop.get_debug(): - self._source_traceback = traceback.extract_stack(sys._getframe(1)) - - self._conns: Dict[ConnectionKey, List[Tuple[ResponseHandler, float]]] = {} - 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} - self._waiters = defaultdict(deque) # type: ignore[var-annotated] - - self._loop = loop - self._factory = functools.partial(ResponseHandler, loop=loop) - - self.cookies = SimpleCookie() - - # 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 - self._cleanup_closed_disabled = not enable_cleanup_closed - self._cleanup_closed_transports: List[Optional[asyncio.Transport]] = [] - 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 = self._loop.time() - timeout = self._keepalive_timeout - - if self._conns: - connections = {} - deadline = now - timeout - for key, conns in self._conns.items(): - alive = [] - for proto, use_time in conns: - if proto.is_connected(): - if use_time - deadline < 0: - transport = proto.transport - proto.close() - if key.is_ssl and not self._cleanup_closed_disabled: - self._cleanup_closed_transports.append(transport) - else: - alive.append((proto, use_time)) - else: - transport = proto.transport - proto.close() - if key.is_ssl and not self._cleanup_closed_disabled: - 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 _drop_acquired_per_host( - self, key: "ConnectionKey", val: ResponseHandler - ) -> None: - acquired_per_host = self._acquired_per_host - if key not in acquired_per_host: - return - conns = acquired_per_host[key] - conns.remove(val) - if not conns: - del self._acquired_per_host[key] - - 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) -> Awaitable[None]: - """Close all opened transports.""" - self._close() - return _DeprecationWaiter(noop()) - - def _close(self) -> None: - if self._closed: - return - - self._closed = True - - try: - if self._loop.is_closed(): - return - - # 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, t0 in data: - proto.close() - - for proto in self._acquired: - proto.close() - - for transport in self._cleanup_closed_transports: - if transport is not None: - transport.abort() - - finally: - self._conns.clear() - self._acquired.clear() - 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. - """ - if self._limit: - # total calc available connections - available = self._limit - len(self._acquired) - - # check limit per host - if ( - self._limit_per_host - and available > 0 - and key in self._acquired_per_host - ): - acquired = self._acquired_per_host.get(key) - assert acquired is not None - available = self._limit_per_host - len(acquired) - - elif self._limit_per_host and key in self._acquired_per_host: - # check limit per host - acquired = self._acquired_per_host.get(key) - assert acquired is not None - available = self._limit_per_host - len(acquired) - else: - available = 1 - - return available - - async def connect( - self, req: ClientRequest, traces: List["Trace"], timeout: "ClientTimeout" - ) -> Connection: - """Get from pool or create new connection.""" - key = req.connection_key - available = self._available_connections(key) - - # Wait if there are no available connections or if there are/were - # waiters (i.e. don't steal connection from a waiter about to wake up) - if available <= 0 or key in self._waiters: - fut = self._loop.create_future() - - # This connection will now count towards the limit. - self._waiters[key].append(fut) - - if traces: - for trace in traces: - await trace.send_connection_queued_start() - - try: - await fut - except BaseException as e: - if key in self._waiters: - # remove a waiter even if it was cancelled, normally it's - # removed when it's notified - try: - self._waiters[key].remove(fut) - except ValueError: # fut may no longer be in list - pass - - raise e - finally: - if key in self._waiters and not self._waiters[key]: - del self._waiters[key] - - if traces: - for trace in traces: - await trace.send_connection_queued_end() - - proto = self._get(key) - if proto is None: - placeholder = cast(ResponseHandler, _TransportPlaceholder()) - self._acquired.add(placeholder) - self._acquired_per_host[key].add(placeholder) - - if traces: - for trace in traces: - await trace.send_connection_create_start() - - try: - proto = await self._create_connection(req, traces, timeout) - if self._closed: - proto.close() - raise ClientConnectionError("Connector is closed.") - except BaseException: - if not self._closed: - self._acquired.remove(placeholder) - self._drop_acquired_per_host(key, placeholder) - self._release_waiter() - raise - else: - if not self._closed: - self._acquired.remove(placeholder) - self._drop_acquired_per_host(key, placeholder) - - if traces: - for trace in traces: - await trace.send_connection_create_end() - else: - if traces: - # Acquire the connection to prevent race conditions with limits - placeholder = cast(ResponseHandler, _TransportPlaceholder()) - self._acquired.add(placeholder) - self._acquired_per_host[key].add(placeholder) - for trace in traces: - await trace.send_connection_reuseconn() - self._acquired.remove(placeholder) - self._drop_acquired_per_host(key, placeholder) - - self._acquired.add(proto) - self._acquired_per_host[key].add(proto) - return Connection(self, key, proto, self._loop) - - def _get(self, key: "ConnectionKey") -> Optional[ResponseHandler]: - try: - conns = self._conns[key] - except KeyError: - return None - - t1 = self._loop.time() - while conns: - proto, t0 = conns.pop() - if proto.is_connected(): - if t1 - t0 > self._keepalive_timeout: - transport = proto.transport - proto.close() - # only for SSL transports - if key.is_ssl and not self._cleanup_closed_disabled: - self._cleanup_closed_transports.append(transport) - else: - if not conns: - # The very last connection was reclaimed: drop the key - del self._conns[key] - return proto - else: - transport = proto.transport - proto.close() - if key.is_ssl and not self._cleanup_closed_disabled: - 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.keys()) - random.shuffle(queues) - - for key in queues: - if self._available_connections(key) < 1: - continue - - waiters = self._waiters[key] - while waiters: - waiter = waiters.popleft() - if not waiter.done(): - waiter.set_result(None) - return - - def _release_acquired(self, key: "ConnectionKey", proto: ResponseHandler) -> None: - if self._closed: - # acquired connection is already released on connector closing - return - - try: - self._acquired.remove(proto) - self._drop_acquired_per_host(key, proto) - except KeyError: # pragma: no cover - # this may be result of undetermenistic order of objects - # finalization due garbage collection. - pass - else: - 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: - should_close = True - - if 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) - else: - conns = self._conns.get(key) - if conns is None: - conns = self._conns[key] = [] - conns.append((protocol, self._loop.time())) - - 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[Dict[str, Any]], 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[Dict[str, Any]]) -> 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[Dict[str, Any]]: - 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() - - -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/Transport_Layer_Security#Certificate_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. - loop - Optional event loop. - """ - - def __init__( - self, - *, - verify_ssl: bool = True, - fingerprint: Optional[bytes] = None, - use_dns_cache: bool = True, - ttl_dns_cache: Optional[int] = 10, - family: int = 0, - 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, - ): - 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) - if resolver is None: - resolver = DefaultResolver(loop=self._loop) - self._resolver = resolver - - self._use_dns_cache = use_dns_cache - self._cached_hosts = _DNSCacheTable(ttl=ttl_dns_cache) - self._throttle_dns_events: Dict[Tuple[str, int], EventResultOrError] = {} - self._family = family - self._local_addr = local_addr - - def close(self) -> Awaitable[None]: - """Close all ongoing DNS calls.""" - for ev in self._throttle_dns_events.values(): - ev.cancel() - - return super().close() - - @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[List["Trace"]] = None - ) -> List[Dict[str, Any]]: - 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 - - if key in self._throttle_dns_events: - # get event early, before any await (#4014) - event = self._throttle_dns_events[key] - if traces: - for trace in traces: - await trace.send_dns_cache_hit(host) - await event.wait() - else: - # update dict early, before any await (#4014) - self._throttle_dns_events[key] = EventResultOrError(self._loop) - if traces: - for trace in traces: - await trace.send_dns_cache_miss(host) - try: - - if traces: - 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) - self._throttle_dns_events[key].set() - except BaseException as e: - # any DNS exception, independently of the implementation - # is set for the waiters to raise the same exception. - self._throttle_dns_events[key].set(exc=e) - raise - finally: - self._throttle_dns_events.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 - - @staticmethod - @functools.lru_cache(None) - def _make_ssl_context(verified: bool) -> SSLContext: - if verified: - return 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 - try: - sslcontext.options |= ssl.OP_NO_COMPRESSION - except AttributeError as attr_err: - warnings.warn( - "{!s}: The Python interpreter is compiled " - "against OpenSSL < 1.0.0. Ref: " - "https://docs.python.org/3/library/ssl.html" - "#ssl.OP_NO_COMPRESSION".format(attr_err), - ) - sslcontext.set_default_verify_paths() - return sslcontext - - 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 req.is_ssl(): - 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 self._make_ssl_context(False) - sslcontext = self._ssl - if isinstance(sslcontext, ssl.SSLContext): - return sslcontext - if sslcontext is not True: - # not verified or fingerprinted - return self._make_ssl_context(False) - return self._make_ssl_context(True) - else: - return None - - 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, - 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 - - asyncio_supports_tls_in_tls = 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 - - # Safety of the `cast()` call here is based on the fact that - # internally `_get_ssl_context()` only returns `None` when - # `req.is_ssl()` evaluates to `False` which is never gonna happen - # in this code path. Of course, it's rather fragile - # maintainability-wise but this is to be solved separately. - sslcontext = cast(ssl.SSLContext, self._get_ssl_context(req)) - - try: - async with ceil_timeout( - timeout.sock_connect, ceil_threshold=timeout.ceil_threshold - ): - try: - 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: - underlying_transport.close() - 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 - - 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 - host_resolved = asyncio.ensure_future( - self._resolve_host(host, port, traces=traces), loop=self._loop - ) - 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 asyncio.shield(host_resolved) - except asyncio.CancelledError: - - def drop_exception(fut: "asyncio.Future[List[Dict[str, Any]]]") -> None: - with suppress(Exception, asyncio.CancelledError): - fut.result() - - host_resolved.add_done_callback(drop_exception) - raise - 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 ClientConnectorError(req.connection_key, exc) from exc - - last_exc: Optional[Exception] = None - - for hinfo in hosts: - host = hinfo["host"] - port = hinfo["port"] - - # Strip trailing dots, certificates contain FQDN without dots. - # See https://github.com/aio-libs/aiohttp/issues/3636 - server_hostname = ( - (req.server_hostname or hinfo["hostname"]).rstrip(".") - if sslcontext - else None - ) - - try: - transp, proto = await self._wrap_create_connection( - self._factory, - host, - port, - timeout=timeout, - ssl=sslcontext, - family=hinfo["family"], - proto=hinfo["proto"], - flags=hinfo["flags"], - server_hostname=server_hostname, - local_addr=self._local_addr, - req=req, - client_error=client_error, - ) - except ClientConnectorError as exc: - last_exc = exc - 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 - 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() - - 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] - - url = req.proxy - assert url is not None - proxy_req = ClientRequest( - hdrs.METH_GET, - url, - headers=headers, - auth=req.proxy_auth, - loop=self._loop, - ssl=req.ssl, - ) - - # create connection to proxy server - transport, proto = await self._create_direct_connection( - proxy_req, [], timeout, client_error=ClientProxyConnectionError - ) - - # Many HTTP proxies has buggy keepalive support. Let's not - # reuse connection but close it after processing every - # response. - proto.force_close() - - 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 - - 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 = attr.evolve( - req.connection_key, proxy=None, proxy_auth=None, proxy_headers_hash=None - ) - conn = Connection(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 - conn._transport = 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_create_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. - """ - - 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. - """ - - 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/.venv/Lib/site-packages/aiohttp/cookiejar.py b/.venv/Lib/site-packages/aiohttp/cookiejar.py deleted file mode 100644 index a348f11..0000000 --- a/.venv/Lib/site-packages/aiohttp/cookiejar.py +++ /dev/null @@ -1,419 +0,0 @@ -import asyncio -import calendar -import contextlib -import datetime -import os # noqa -import pathlib -import pickle -import re -import time -from collections import defaultdict -from http.cookies import BaseCookie, Morsel, SimpleCookie -from math import ceil -from typing import ( # noqa - DefaultDict, - Dict, - Iterable, - Iterator, - List, - Mapping, - Optional, - Set, - Tuple, - Union, - cast, -) - -from yarl import URL - -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]"] - - -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.8 and 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._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._next_expiration: float = ceil(time.time()) - self._expirations: Dict[Tuple[str, str, str], float] = {} - - 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._next_expiration = ceil(time.time()) - self._cookies.clear() - self._host_only_cookies.clear() - self._expirations.clear() - return - - to_del = [] - now = time.time() - for (domain, path), cookie in self._cookies.items(): - for name, morsel in cookie.items(): - key = (domain, path, name) - if ( - key in self._expirations and self._expirations[key] <= now - ) or predicate(morsel): - to_del.append(key) - - for domain, path, name in to_del: - self._host_only_cookies.discard((domain, name)) - key = (domain, path, name) - if key in self._expirations: - del self._expirations[(domain, path, name)] - self._cookies[(domain, path)].pop(name, None) - - self._next_expiration = ( - min(*self._expirations.values(), self.SUB_MAX_TIME) + 1 - if self._expirations - else self.MAX_TIME - ) - - 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 sum(1 for i in self) - - def _do_expiration(self) -> None: - self.clear(lambda x: False) - - def _expire_cookie(self, when: float, domain: str, path: str, name: str) -> None: - self._next_expiration = min(self._next_expiration, when) - self._expirations[(domain, path, name)] = 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.endswith("."): - 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.startswith("."): - # 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 not path.startswith("/"): - # 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 - - max_age = cookie["max-age"] - if 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"] = "" - - else: - expires = cookie["expires"] - if expires: - expire_time = self._parse_date(expires) - if expire_time: - self._expire_cookie(expire_time, domain, path, name) - else: - cookie["expires"] = "" - - self._cookies[(domain, path)][name] = cookie - - self._do_expiration() - - def filter_cookies(self, request_url: URL = URL()) -> "BaseCookie[str]": - """Returns this jar's cookies filtered by their attributes.""" - filtered: Union[SimpleCookie, "BaseCookie[str]"] = ( - SimpleCookie() if self._quote_cookie else 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 - 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 - - # Point 2: https://www.rfc-editor.org/rfc/rfc6265.html#section-5.4 - for cookie in sorted(self, key=lambda c: len(c["path"])): - name = cookie.key - domain = cookie["domain"] - - # Send shared cookies - if not domain: - filtered[name] = cookie.value - continue - - if not self._unsafe and is_ip_address(hostname): - continue - - if (domain, name) in self._host_only_cookies: - if domain != hostname: - continue - elif not self._is_domain_match(domain, hostname): - continue - - if not self._is_path_match(request_url.path, cookie["path"]): - continue - - if is_not_secure and cookie["secure"]: - continue - - # It's critical we use the Morsel so the coded_value - # (based on cookie version) is preserved - mrsl_val = cast("Morsel[str]", cookie.get(cookie.key, Morsel())) - mrsl_val.set(cookie.key, cookie.value, cookie.coded_value) - filtered[name] = mrsl_val - - return filtered - - @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) - - @staticmethod - def _is_path_match(req_path: str, cookie_path: str) -> bool: - """Implements path matching adhering to RFC 6265.""" - if not req_path.startswith("/"): - req_path = "/" - - if req_path == cookie_path: - return True - - if not req_path.startswith(cookie_path): - return False - - if cookie_path.endswith("/"): - return True - - non_matching = req_path[len(cookie_path) :] - - return non_matching.startswith("/") - - @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 - - 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/.venv/Lib/site-packages/aiohttp/formdata.py b/.venv/Lib/site-packages/aiohttp/formdata.py deleted file mode 100644 index e7cd24c..0000000 --- a/.venv/Lib/site-packages/aiohttp/formdata.py +++ /dev/null @@ -1,172 +0,0 @@ -import io -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, - ) -> None: - self._writer = multipart.MultipartWriter("form-data") - self._fields: List[Any] = [] - self._is_multipart = False - self._is_processed = False - 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)): - if filename is None and content_transfer_encoding is None: - 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 - ) - headers[hdrs.CONTENT_TRANSFER_ENCODING] = content_transfer_encoding - 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) # type: ignore[arg-type] - - 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""" - if self._is_processed: - raise RuntimeError("Form data has been processed already") - 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._is_processed = True - 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/.venv/Lib/site-packages/aiohttp/hdrs.py b/.venv/Lib/site-packages/aiohttp/hdrs.py deleted file mode 100644 index 2f1f5e0..0000000 --- a/.venv/Lib/site-packages/aiohttp/hdrs.py +++ /dev/null @@ -1,108 +0,0 @@ -"""HTTP Headers constants.""" - -# After changing the file content call ./tools/gen.py -# to regenerate the headers parser -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") diff --git a/.venv/Lib/site-packages/aiohttp/helpers.py b/.venv/Lib/site-packages/aiohttp/helpers.py deleted file mode 100644 index a5c762e..0000000 --- a/.venv/Lib/site-packages/aiohttp/helpers.py +++ /dev/null @@ -1,999 +0,0 @@ -"""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 warnings -import weakref -from collections import namedtuple -from contextlib import suppress -from email.parser import HeaderParser -from email.utils import parsedate -from math import ceil -from pathlib import Path -from types import TracebackType -from typing import ( - Any, - Callable, - ContextManager, - Dict, - Generator, - Generic, - Iterable, - Iterator, - List, - Mapping, - Optional, - Pattern, - 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 yarl import URL - -from . import hdrs -from .log import client_logger, internal_logger - -if sys.version_info >= (3, 11): - import asyncio as async_timeout -else: - import async_timeout - -__all__ = ("BasicAuth", "ChainMapProxy", "ETag") - -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")) - -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") - if url.user is None: - return None - return cls(url.user, 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]]: - auth = BasicAuth.from_url(url) - if auth is None: - return url, None - else: - return url.with_user(None), auth - - -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 current_task( - loop: Optional[asyncio.AbstractEventLoop] = None, -) -> "Optional[asyncio.Task[Any]]": - return asyncio.current_task(loop=loop) - - -def get_running_loop( - loop: Optional[asyncio.AbstractEventLoop] = None, -) -> asyncio.AbstractEventLoop: - if loop is None: - loop = asyncio.get_event_loop() - if not loop.is_running(): - warnings.warn( - "The object should be created within an async function", - DeprecationWarning, - stacklevel=3, - ) - if loop.get_debug(): - internal_logger.warning( - "The object should be created within an async function", stack_info=True - ) - return loop - - -def isasyncgenfunction(obj: Any) -> bool: - func = getattr(inspect, "isasyncgenfunction", None) - if func is not None: - return func(obj) # type: ignore[no-any-return] - else: - return False - - -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) - ) - - -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("bad content disposition type {!r}" "".format(disptype)) - - value = disptype - if params: - lparams = [] - for key, val in params.items(): - if not key or not (TOKEN > set(key)): - raise ValueError( - "bad content disposition parameter" " {!r}={!r}".format(key, val) - ) - 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 - - -class _TSelf(Protocol, Generic[_T]): - _cache: Dict[str, _T] - - -class reify(Generic[_T]): - """Use as a class method decorator. - - It operates almost exactly like - the Python `@property` decorator, but it puts the result of the - method it decorates into the instance dict after the first call, - effectively replacing the function it decorates with an instance - variable. It is, in Python parlance, a data descriptor. - """ - - def __init__(self, wrapped: Callable[..., _T]) -> None: - self.wrapped = wrapped - self.__doc__ = wrapped.__doc__ - self.name = wrapped.__name__ - - def __get__(self, inst: _TSelf[_T], owner: Optional[Type[Any]] = None) -> _T: - try: - try: - return inst._cache[self.name] - except KeyError: - val = self.wrapped(inst) - inst._cache[self.name] = val - return val - except AttributeError: - if inst is None: - return self - raise - - def __set__(self, inst: _TSelf[_T], value: _T) -> None: - raise AttributeError("reified property is read-only") - - -reify_py = reify - -try: - from ._helpers import reify as reify_c - - if not NO_EXTENSIONS: - reify = reify_c # type: ignore[misc,assignment] -except ImportError: - pass - -_ipv4_pattern = ( - r"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}" - r"(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$" -) -_ipv6_pattern = ( - r"^(?:(?:(?:[A-F0-9]{1,4}:){6}|(?=(?:[A-F0-9]{0,4}:){0,6}" - r"(?:[0-9]{1,3}\.){3}[0-9]{1,3}$)(([0-9A-F]{1,4}:){0,5}|:)" - r"((:[0-9A-F]{1,4}){1,5}:|:)|::(?:[A-F0-9]{1,4}:){5})" - r"(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}" - r"(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])|(?:[A-F0-9]{1,4}:){7}" - r"[A-F0-9]{1,4}|(?=(?:[A-F0-9]{0,4}:){0,7}[A-F0-9]{0,4}$)" - r"(([0-9A-F]{1,4}:){1,7}|:)((:[0-9A-F]{1,4}){1,7}|:)|(?:[A-F0-9]{1,4}:){7}" - r":|:(:[A-F0-9]{1,4}){7})$" -) -_ipv4_regex = re.compile(_ipv4_pattern) -_ipv6_regex = re.compile(_ipv6_pattern, flags=re.IGNORECASE) -_ipv4_regexb = re.compile(_ipv4_pattern.encode("ascii")) -_ipv6_regexb = re.compile(_ipv6_pattern.encode("ascii"), flags=re.IGNORECASE) - - -def _is_ip_address( - regex: Pattern[str], regexb: Pattern[bytes], host: Optional[Union[str, bytes]] -) -> bool: - if host is None: - return False - if isinstance(host, str): - return bool(regex.match(host)) - elif isinstance(host, (bytes, bytearray, memoryview)): - return bool(regexb.match(host)) - else: - raise TypeError(f"{host} [{type(host)}] is not a str or bytes") - - -is_ipv4_address = functools.partial(_is_ip_address, _ipv4_regex, _ipv4_regexb) -is_ipv6_address = functools.partial(_is_ip_address, _ipv6_regex, _ipv6_regexb) - - -def is_ip_address(host: Optional[Union[str, bytes, bytearray, memoryview]]) -> bool: - return is_ipv4_address(host) or is_ipv6_address(host) - - -_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 not None and timeout > 0: - when = loop.time() + timeout - if timeout > timeout_ceil_threshold: - when = ceil(when) - return loop.call_at(when, cb) - return None - - -class TimeoutHandle: - """Timeout handle""" - - 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.Handle]: - 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"]): - def assert_timeout(self) -> None: - """Raise TimeoutError if timeout has been exceeded.""" - - -class TimerNoop(BaseTimerContext): - 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""" - - def __init__(self, loop: asyncio.AbstractEventLoop) -> None: - self._loop = loop - self._tasks: List[asyncio.Task[Any]] = [] - self._cancelled = False - - 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 = current_task(loop=self._loop) - - if task is None: - raise RuntimeError( - "Timeout context manager should be used " "inside a task" - ) - - 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]: - if self._tasks: - self._tasks.pop() - - if exc_type is asyncio.CancelledError and self._cancelled: - raise asyncio.TimeoutError from None - 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 = get_running_loop() - now = loop.time() - when = now + delay - if delay > ceil_threshold: - when = ceil(when) - return async_timeout.timeout_at(when) - - -class HeadersMixin: - 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: - msg = HeaderParser().parsestr("Content-Type: " + raw) - self._content_type = msg.get_content_type() - params = msg.get_params(()) - self._content_dict = dict(params[1:]) # First element is content type again - - @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) - return self._content_type # type: ignore[return-value] - - @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) - return self._content_dict.get("charset") # type: ignore[union-attr] - - @property - def content_length(self) -> Optional[int]: - """The value of Content-Length HTTP header.""" - content_length = self._headers.get(hdrs.CONTENT_LENGTH) - - if content_length is not None: - return int(content_length) - else: - return None - - -def set_result(fut: "asyncio.Future[_T]", result: _T) -> None: - if not fut.done(): - fut.set_result(result) - - -def set_exception(fut: "asyncio.Future[_T]", exc: BaseException) -> None: - if not fut.done(): - 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 - - -def must_be_empty_body(method: str, code: int) -> bool: - """Check if a request must return an empty body.""" - return ( - status_code_must_be_empty_body(code) - or method_must_be_empty_body(method) - or (200 <= code < 300 and method.upper() == hdrs.METH_CONNECT) - ) - - -def method_must_be_empty_body(method: str) -> bool: - """Check if a method must return an empty body.""" - # https://datatracker.ietf.org/doc/html/rfc9112#section-6.3-2.1 - # https://datatracker.ietf.org/doc/html/rfc9112#section-6.3-2.2 - return method.upper() == hdrs.METH_HEAD - - -def status_code_must_be_empty_body(code: int) -> bool: - """Check if a status code must return an empty body.""" - # https://datatracker.ietf.org/doc/html/rfc9112#section-6.3-2.1 - return code in {204, 304} or 100 <= code < 200 - - -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 {204, 304} - or 100 <= code < 200 - or (200 <= code < 300 and method.upper() == hdrs.METH_CONNECT) - ) diff --git a/.venv/Lib/site-packages/aiohttp/http.py b/.venv/Lib/site-packages/aiohttp/http.py deleted file mode 100644 index a1feae2..0000000 --- a/.venv/Lib/site-packages/aiohttp/http.py +++ /dev/null @@ -1,72 +0,0 @@ -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/.venv/Lib/site-packages/aiohttp/http_exceptions.py b/.venv/Lib/site-packages/aiohttp/http_exceptions.py deleted file mode 100644 index 72eac3a..0000000 --- a/.venv/Lib/site-packages/aiohttp/http_exceptions.py +++ /dev/null @@ -1,106 +0,0 @@ -"""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 for satisfy content length header.""" - - -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 InvalidURLError(BadHttpMessage): - pass diff --git a/.venv/Lib/site-packages/aiohttp/http_parser.py b/.venv/Lib/site-packages/aiohttp/http_parser.py deleted file mode 100644 index 1877f55..0000000 --- a/.venv/Lib/site-packages/aiohttp/http_parser.py +++ /dev/null @@ -1,1013 +0,0 @@ -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 HAS_BROTLI, BrotliDecompressor, ZLibDecompressor -from .helpers import ( - DEBUG, - NO_EXTENSIONS, - BaseTimerContext, - method_must_be_empty_body, - status_code_must_be_empty_body, -) -from .http_exceptions import ( - BadHttpMessage, - BadStatusLine, - ContentEncodingError, - ContentLengthError, - InvalidHeader, - InvalidURLError, - LineTooLong, - TransferEncodingError, -) -from .http_writer import HttpVersion, HttpVersion10 -from .log import internal_logger -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, - ) -> None: - self.max_line_size = max_line_size - self.max_headers = max_headers - self.max_field_size = max_field_size - - 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 = 1 - line = lines[1] - 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 = 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)) - - -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, - readall: bool = False, - 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.readall = readall - 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) - - @abc.abstractmethod - def parse_message(self, lines: List[bytes]) -> _MsgT: - pass - - 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 - - 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: - # 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 - - 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 = status_code_must_be_empty_body(code) or bool( - method and method_must_be_empty_body(method) - ) - if not empty_body and ( - (length is not None and length > 0) - or msg.chunked - and not msg.upgrade - ): - 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, - readall=self.readall, - response_with_body=self.response_with_body, - auto_decompress=self._auto_decompress, - lax=self.lax, - ) - 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, - readall=True, - auto_decompress=self._auto_decompress, - lax=self.lax, - ) - 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, - readall=True, - response_with_body=self.response_with_body, - auto_decompress=self._auto_decompress, - lax=self.lax, - ) - if not payload_parser.done: - self._payload_parser = payload_parser - else: - payload = EMPTY_PAYLOAD - - messages.append((msg, payload)) - 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 exc: - if self.payload_exception is not None: - self._payload_parser.payload.set_exception( - self.payload_exception(str(exc)) - ) - else: - self._payload_parser.payload.set_exception(exc) - - eof = True - data = b"" - - 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: - enc = enc.lower() - if enc in ("gzip", "deflate", "br"): - encoding = enc - - # chunking - te = headers.get(hdrs.TRANSFER_ENCODING) - if te is not None: - if "chunked" == te.lower(): - chunked = True - else: - raise BadHttpMessage("Request has invalid `Transfer-Encoding`") - - 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 BadStatusLine(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 BadStatusLine(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) - - 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, - ) - - -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) - - if close is None: - close = version_o <= HttpVersion10 - - return RawResponseMessage( - version_o, - status_i, - reason.strip(), - headers, - raw_headers, - close, - compression, - upgrade, - 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, - readall: bool = False, - response_with_body: bool = True, - auto_decompress: bool = True, - lax: bool = False, - ) -> None: - self._length = 0 - self._type = ParseState.PARSE_NONE - self._chunk = ChunkState.PARSE_CHUNKED_SIZE - self._chunk_size = 0 - self._chunk_tail = b"" - self._auto_decompress = auto_decompress - self._lax = lax - 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 - else: - if readall and code != 204: - self._type = ParseState.PARSE_UNTIL_EOF - elif method in ("PUT", "POST"): - internal_logger.warning( # pragma: no cover - "Content-Length or Transfer-Encoding header is required" - ) - self._type = ParseState.PARSE_NONE - 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 for satisfy content length header." - ) - elif self._type == ParseState.PARSE_CHUNKED: - raise TransferEncodingError( - "Not enough data for 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 - 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") - ) - self.payload.set_exception(exc) - raise exc - size = int(bytes(size_b), 16) - - chunk = chunk[pos + len(SEP) :] - if size == 0: # eof marker - self._chunk = ChunkState.PARSE_MAYBE_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:] - if self._lax and chunk.startswith(b"\r"): - chunk = chunk[1:] - 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 chunk[: len(SEP)] == SEP: - chunk = chunk[len(SEP) :] - self._chunk = ChunkState.PARSE_CHUNKED_SIZE - else: - self._chunk_tail = chunk - return False, b"" - - # if stream does not contain trailer, after 0\r\n - # we should get another \r\n otherwise - # trailers needs to be skipped until \r\n\r\n - if self._chunk == ChunkState.PARSE_MAYBE_TRAILERS: - head = chunk[: len(SEP)] - if head == SEP: - # end of stream - self.payload.feed_eof() - return True, chunk[len(SEP) :] - # Both CR and LF, or only LF may not be received yet. It is - # expected that CRLF or LF will be shown at the very first - # byte next time, otherwise trailers should come. The last - # CRLF which marks the end of response might not be - # contained in the same TCP segment which delivered the - # size indicator. - if not head: - return False, b"" - if head == SEP[:1]: - self._chunk_tail = head - return False, b"" - self._chunk = ChunkState.PARSE_TRAILERS - - # read and discard trailer up to the CRLF terminator - if self._chunk == ChunkState.PARSE_TRAILERS: - pos = chunk.find(SEP) - if pos >= 0: - chunk = chunk[pos + len(SEP) :] - self._chunk = ChunkState.PARSE_MAYBE_TRAILERS - else: - self._chunk_tail = chunk - return False, b"" - - # 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]) -> None: - self.out = out - self.size = 0 - self.encoding = encoding - self._started_decoding = False - - self.decompressor: Union[BrotliDecompressor, ZLibDecompressor] - 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() - else: - self.decompressor = ZLibDecompressor(encoding=encoding) - - def set_exception(self, exc: BaseException) -> None: - self.out.set_exception(exc) - - def feed_data(self, chunk: bytes, size: int) -> None: - if not size: - return - - self.size += 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: - chunk = self.decompressor.decompress_sync(chunk) - except Exception: - raise ContentEncodingError( - "Can not decode content-encoding: %s" % self.encoding - ) - - self._started_decoding = True - - 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/.venv/Lib/site-packages/aiohttp/http_websocket.py b/.venv/Lib/site-packages/aiohttp/http_websocket.py deleted file mode 100644 index b63453f..0000000 --- a/.venv/Lib/site-packages/aiohttp/http_websocket.py +++ /dev/null @@ -1,740 +0,0 @@ -"""WebSocket protocol versions 13 and 8.""" - -import asyncio -import functools -import json -import random -import re -import sys -import zlib -from enum import IntEnum -from struct import Struct -from typing import ( - Any, - Callable, - Final, - List, - NamedTuple, - Optional, - Pattern, - Set, - Tuple, - Union, - cast, -) - -from .base_protocol import BaseProtocol -from .compression_utils import ZLibCompressor, ZLibDecompressor -from .helpers import NO_EXTENSIONS -from .streams import DataQueue - -__all__ = ( - "WS_CLOSED_MESSAGE", - "WS_CLOSING_MESSAGE", - "WS_KEY", - "WebSocketReader", - "WebSocketWriter", - "WSMessage", - "WebSocketError", - "WSMsgType", - "WSCloseCode", -) - - -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 - - -ALLOWED_CLOSE_CODES: Final[Set[int]] = {int(i) for i in WSCloseCode} - -# 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 than the default to reduce the number of executor calls -# since the executor is a significant source of latency and overhead when -# the chunks are small. A size of 5KiB was chosen because it is also the -# same value python-zlib-ng choose to use as the threshold to release the GIL. - -WEBSOCKET_MAX_SYNC_CHUNK_SIZE = 5 * 1024 - - -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 - - -WS_KEY: Final[bytes] = b"258EAFA5-E914-47DA-95CA-C5AB0DC85B11" - - -UNPACK_LEN2 = Struct("!H").unpack_from -UNPACK_LEN3 = Struct("!Q").unpack_from -UNPACK_CLOSE_CODE = Struct("!H").unpack -PACK_LEN1 = Struct("!BB").pack -PACK_LEN2 = Struct("!BBH").pack -PACK_LEN3 = Struct("!BBQ").pack -PACK_CLOSE_CODE = Struct("!H").pack -MSG_SIZE: Final[int] = 2**14 -DEFAULT_LIMIT: Final[int] = 2**16 - - -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) - - -WS_CLOSED_MESSAGE = WSMessage(WSMsgType.CLOSED, None, None) -WS_CLOSING_MESSAGE = 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.""" - - -native_byteorder: Final[str] = sys.byteorder - - -# Used by _websocket_mask_python -@functools.lru_cache -def _xor_table() -> 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 NO_EXTENSIONS: # pragma: no cover - _websocket_mask = _websocket_mask_python -else: - try: - from ._websocket 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_DEFLATE_TRAILING: Final[bytes] = bytes([0x00, 0x00, 0xFF, 0xFF]) - - -_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) - - -class WSParserState(IntEnum): - READ_HEADER = 1 - READ_PAYLOAD_LENGTH = 2 - READ_PAYLOAD_MASK = 3 - READ_PAYLOAD = 4 - - -class WebSocketReader: - def __init__( - self, queue: DataQueue[WSMessage], max_msg_size: int, compress: bool = True - ) -> None: - self.queue = queue - self._max_msg_size = max_msg_size - - self._exc: Optional[BaseException] = None - self._partial = bytearray() - self._state = WSParserState.READ_HEADER - - self._opcode: Optional[int] = None - self._frame_fin = False - self._frame_opcode: Optional[int] = None - self._frame_payload = bytearray() - - self._tail = b"" - self._has_mask = False - self._frame_mask: Optional[bytes] = None - self._payload_length = 0 - self._payload_length_flag = 0 - self._compressed: Optional[bool] = None - self._decompressobj: Optional[ZLibDecompressor] = None - self._compress = compress - - def feed_eof(self) -> None: - self.queue.feed_eof() - - def feed_data(self, data: bytes) -> Tuple[bool, bytes]: - if self._exc: - return True, data - - try: - return self._feed_data(data) - except Exception as exc: - self._exc = exc - self.queue.set_exception(exc) - return True, b"" - - def _feed_data(self, data: bytes) -> Tuple[bool, bytes]: - for fin, opcode, payload, compressed in self.parse_frame(data): - if compressed and not self._decompressobj: - self._decompressobj = ZLibDecompressor(suppress_deflate_header=True) - if opcode == WSMsgType.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 = WSMessage(WSMsgType.CLOSE, close_code, close_message) - elif payload: - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, - f"Invalid close frame: {fin} {opcode} {payload!r}", - ) - else: - msg = WSMessage(WSMsgType.CLOSE, 0, "") - - self.queue.feed_data(msg, 0) - - elif opcode == WSMsgType.PING: - self.queue.feed_data( - WSMessage(WSMsgType.PING, payload, ""), len(payload) - ) - - elif opcode == WSMsgType.PONG: - self.queue.feed_data( - WSMessage(WSMsgType.PONG, payload, ""), len(payload) - ) - - elif ( - opcode not in (WSMsgType.TEXT, WSMsgType.BINARY) - and self._opcode is None - ): - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, f"Unexpected opcode={opcode!r}" - ) - else: - # load text/binary - if not fin: - # got partial frame payload - if opcode != WSMsgType.CONTINUATION: - self._opcode = opcode - self._partial.extend(payload) - if self._max_msg_size and len(self._partial) >= self._max_msg_size: - raise WebSocketError( - WSCloseCode.MESSAGE_TOO_BIG, - "Message size {} exceeds limit {}".format( - len(self._partial), self._max_msg_size - ), - ) - else: - # previous frame was non finished - # we should get continuation opcode - if self._partial: - if opcode != WSMsgType.CONTINUATION: - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, - "The opcode in non-fin frame is expected " - "to be zero, got {!r}".format(opcode), - ) - - if opcode == WSMsgType.CONTINUATION: - assert self._opcode is not None - opcode = self._opcode - self._opcode = None - - self._partial.extend(payload) - if self._max_msg_size and len(self._partial) >= self._max_msg_size: - raise WebSocketError( - WSCloseCode.MESSAGE_TOO_BIG, - "Message size {} exceeds limit {}".format( - len(self._partial), self._max_msg_size - ), - ) - - # Decompress process must to be done after all packets - # received. - if compressed: - assert self._decompressobj is not None - self._partial.extend(_WS_DEFLATE_TRAILING) - payload_merged = self._decompressobj.decompress_sync( - self._partial, self._max_msg_size - ) - if self._decompressobj.unconsumed_tail: - left = len(self._decompressobj.unconsumed_tail) - raise WebSocketError( - WSCloseCode.MESSAGE_TOO_BIG, - "Decompressed message size {} exceeds limit {}".format( - self._max_msg_size + left, self._max_msg_size - ), - ) - else: - payload_merged = bytes(self._partial) - - self._partial.clear() - - if opcode == WSMsgType.TEXT: - try: - text = payload_merged.decode("utf-8") - self.queue.feed_data( - WSMessage(WSMsgType.TEXT, text, ""), len(text) - ) - except UnicodeDecodeError as exc: - raise WebSocketError( - WSCloseCode.INVALID_TEXT, "Invalid UTF-8 text message" - ) from exc - else: - self.queue.feed_data( - WSMessage(WSMsgType.BINARY, payload_merged, ""), - len(payload_merged), - ) - - return False, b"" - - def parse_frame( - self, buf: bytes - ) -> List[Tuple[bool, Optional[int], bytearray, Optional[bool]]]: - """Return the next frame from the socket.""" - frames = [] - if self._tail: - buf, self._tail = self._tail + buf, b"" - - start_pos = 0 - buf_length = len(buf) - - while True: - # read header - if self._state == WSParserState.READ_HEADER: - if buf_length - start_pos >= 2: - data = buf[start_pos : start_pos + 2] - start_pos += 2 - first_byte, second_byte = data - - 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 is None: - self._compressed = True if rsv1 else 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_length_flag = length - self._state = WSParserState.READ_PAYLOAD_LENGTH - else: - break - - # read payload length - if self._state == WSParserState.READ_PAYLOAD_LENGTH: - length = self._payload_length_flag - if length == 126: - if buf_length - start_pos >= 2: - data = buf[start_pos : start_pos + 2] - start_pos += 2 - length = UNPACK_LEN2(data)[0] - self._payload_length = length - self._state = ( - WSParserState.READ_PAYLOAD_MASK - if self._has_mask - else WSParserState.READ_PAYLOAD - ) - else: - break - elif length > 126: - if buf_length - start_pos >= 8: - data = buf[start_pos : start_pos + 8] - start_pos += 8 - length = UNPACK_LEN3(data)[0] - self._payload_length = length - self._state = ( - WSParserState.READ_PAYLOAD_MASK - if self._has_mask - else WSParserState.READ_PAYLOAD - ) - else: - break - else: - self._payload_length = length - self._state = ( - WSParserState.READ_PAYLOAD_MASK - if self._has_mask - else WSParserState.READ_PAYLOAD - ) - - # read payload mask - if self._state == WSParserState.READ_PAYLOAD_MASK: - if buf_length - start_pos >= 4: - self._frame_mask = buf[start_pos : start_pos + 4] - start_pos += 4 - self._state = WSParserState.READ_PAYLOAD - else: - break - - if self._state == WSParserState.READ_PAYLOAD: - length = self._payload_length - payload = self._frame_payload - - chunk_len = buf_length - start_pos - if length >= chunk_len: - self._payload_length = length - chunk_len - payload.extend(buf[start_pos:]) - start_pos = buf_length - else: - self._payload_length = 0 - payload.extend(buf[start_pos : start_pos + length]) - start_pos = start_pos + length - - if self._payload_length == 0: - if self._has_mask: - assert self._frame_mask is not None - _websocket_mask(self._frame_mask, payload) - - frames.append( - (self._frame_fin, self._frame_opcode, payload, self._compressed) - ) - - self._frame_payload = bytearray() - self._state = WSParserState.READ_HEADER - else: - break - - self._tail = buf[start_pos:] - - return frames - - -class WebSocketWriter: - 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: - self.protocol = protocol - self.transport = transport - self.use_mask = use_mask - self.randrange = random.randrange - self.compress = compress - self.notakeover = notakeover - self._closing = False - self._limit = limit - self._output_size = 0 - self._compressobj: Any = None # actually compressobj - - 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 ConnectionResetError("Cannot write to closing transport") - - rsv = 0 - - # Only compress larger packets (disabled) - # Does small packet needs to be compressed? - # if self.compress and opcode < 8 and len(message) > 124: - if (compress or self.compress) and opcode < 8: - if compress: - # Do not set self._compress if compressing is for this frame - compressobj = self._make_compress_obj(compress) - else: # self.compress - if not self._compressobj: - self._compressobj = self._make_compress_obj(self.compress) - compressobj = self._compressobj - - message = await compressobj.compress(message) - # Its critical that we do not return control to the event - # loop until we have finished sending all the compressed - # data. Otherwise we could end up mixing compressed frames - # if there are multiple coroutines compressing data. - message += compressobj.flush( - zlib.Z_FULL_FLUSH if self.notakeover else zlib.Z_SYNC_FLUSH - ) - if message.endswith(_WS_DEFLATE_TRAILING): - message = message[:-4] - rsv = rsv | 0x40 - - msg_length = len(message) - - use_mask = self.use_mask - if use_mask: - mask_bit = 0x80 - else: - mask_bit = 0 - - if msg_length < 126: - header = PACK_LEN1(0x80 | rsv | opcode, msg_length | mask_bit) - elif msg_length < (1 << 16): - header = PACK_LEN2(0x80 | rsv | opcode, 126 | mask_bit, msg_length) - else: - header = PACK_LEN3(0x80 | rsv | opcode, 127 | mask_bit, msg_length) - if use_mask: - mask_int = self.randrange(0, 0xFFFFFFFF) - mask = mask_int.to_bytes(4, "big") - message = bytearray(message) - _websocket_mask(mask, message) - self._write(header + mask + message) - self._output_size += len(header) + len(mask) + msg_length - else: - if msg_length > MSG_SIZE: - self._write(header) - self._write(message) - else: - self._write(header + message) - - self._output_size += len(header) + msg_length - - # 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. - - if self._output_size > self._limit: - self._output_size = 0 - await self.protocol._drain_helper() - - def _make_compress_obj(self, compress: int) -> ZLibCompressor: - return ZLibCompressor( - level=zlib.Z_BEST_SPEED, - wbits=-compress, - max_sync_chunk_size=WEBSOCKET_MAX_SYNC_CHUNK_SIZE, - ) - - def _write(self, data: bytes) -> None: - if self.transport is None or self.transport.is_closing(): - raise ConnectionResetError("Cannot write to closing transport") - self.transport.write(data) - - async def pong(self, message: Union[bytes, str] = b"") -> None: - """Send pong message.""" - if isinstance(message, str): - message = message.encode("utf-8") - await self._send_frame(message, WSMsgType.PONG) - - async def ping(self, message: Union[bytes, str] = b"") -> None: - """Send ping message.""" - if isinstance(message, str): - message = message.encode("utf-8") - await self._send_frame(message, WSMsgType.PING) - - async def send( - self, - message: Union[str, bytes], - binary: bool = False, - compress: Optional[int] = None, - ) -> None: - """Send a frame over the websocket with message as its payload.""" - if isinstance(message, str): - message = message.encode("utf-8") - if binary: - await self._send_frame(message, WSMsgType.BINARY, compress) - else: - await self._send_frame(message, WSMsgType.TEXT, compress) - - 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/.venv/Lib/site-packages/aiohttp/http_writer.py b/.venv/Lib/site-packages/aiohttp/http_writer.py deleted file mode 100644 index d6b02e6..0000000 --- a/.venv/Lib/site-packages/aiohttp/http_writer.py +++ /dev/null @@ -1,198 +0,0 @@ -"""Http related parsers and protocol.""" - -import asyncio -import zlib -from typing import Any, Awaitable, Callable, NamedTuple, Optional, Union # noqa - -from multidict import CIMultiDict - -from .abc import AbstractStreamWriter -from .base_protocol import BaseProtocol -from .compression_utils import ZLibCompressor -from .helpers import NO_EXTENSIONS - -__all__ = ("StreamWriter", "HttpVersion", "HttpVersion10", "HttpVersion11") - - -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): - 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.length = None - self.chunked = False - self.buffer_size = 0 - self.output_size = 0 - - self._eof = False - self._compress: Optional[ZLibCompressor] = None - self._drain_waiter = None - - self._on_chunk_sent: _T_OnChunkSent = on_chunk_sent - self._on_headers_sent: _T_OnHeadersSent = on_headers_sent - - @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: int = zlib.Z_DEFAULT_STRATEGY - ) -> None: - self._compress = ZLibCompressor(encoding=encoding, strategy=strategy) - - def _write(self, chunk: bytes) -> None: - size = len(chunk) - self.buffer_size += size - self.output_size += size - transport = self.transport - if not self._protocol.connected or transport is None or transport.is_closing(): - raise ConnectionResetError("Cannot write to closing transport") - transport.write(chunk) - - async def write( - self, chunk: bytes, *, 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 - - if chunk: - if self.chunked: - chunk_len_pre = ("%x\r\n" % len(chunk)).encode("ascii") - chunk = chunk_len_pre + chunk + b"\r\n" - - self._write(chunk) - - if self.buffer_size > LIMIT and drain: - self.buffer_size = 0 - await self.drain() - - async def write_headers( - self, status_line: str, headers: "CIMultiDict[str]" - ) -> None: - """Write request/response status and headers.""" - if self._on_headers_sent is not None: - await self._on_headers_sent(headers) - - # status + headers - buf = _serialize_headers(status_line, headers) - self._write(buf) - - 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) - - if self._compress: - if chunk: - chunk = await self._compress.compress(chunk) - - chunk += self._compress.flush() - if chunk and self.chunked: - chunk_len = ("%x\r\n" % len(chunk)).encode("ascii") - chunk = chunk_len + chunk + b"\r\n0\r\n\r\n" - else: - if self.chunked: - if chunk: - chunk_len = ("%x\r\n" % len(chunk)).encode("ascii") - chunk = chunk_len + chunk + b"\r\n0\r\n\r\n" - else: - chunk = b"0\r\n\r\n" - - 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() - """ - if self._protocol.transport is not None: - await self._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/.venv/Lib/site-packages/aiohttp/locks.py b/.venv/Lib/site-packages/aiohttp/locks.py deleted file mode 100644 index de2dc83..0000000 --- a/.venv/Lib/site-packages/aiohttp/locks.py +++ /dev/null @@ -1,41 +0,0 @@ -import asyncio -import collections -from typing import Any, Deque, Optional - - -class EventResultOrError: - """Event asyncio lock helper class. - - Wraps the Event asyncio lock allowing either to awake the - locked Tasks without any error or raising an exception. - - thanks to @vorpalsmith for the simple design. - """ - - def __init__(self, loop: asyncio.AbstractEventLoop) -> None: - self._loop = loop - self._exc: Optional[BaseException] = None - self._event = asyncio.Event() - self._waiters: Deque[asyncio.Future[Any]] = collections.deque() - - def set(self, exc: Optional[BaseException] = None) -> None: - self._exc = exc - self._event.set() - - async def wait(self) -> Any: - waiter = self._loop.create_task(self._event.wait()) - self._waiters.append(waiter) - try: - val = await waiter - finally: - self._waiters.remove(waiter) - - if self._exc is not None: - raise self._exc - - return val - - def cancel(self) -> None: - """Cancel all waiters""" - for waiter in self._waiters: - waiter.cancel() diff --git a/.venv/Lib/site-packages/aiohttp/log.py b/.venv/Lib/site-packages/aiohttp/log.py deleted file mode 100644 index 3cecea2..0000000 --- a/.venv/Lib/site-packages/aiohttp/log.py +++ /dev/null @@ -1,8 +0,0 @@ -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/.venv/Lib/site-packages/aiohttp/multipart.py b/.venv/Lib/site-packages/aiohttp/multipart.py deleted file mode 100644 index 602a6b6..0000000 --- a/.venv/Lib/site-packages/aiohttp/multipart.py +++ /dev/null @@ -1,969 +0,0 @@ -import base64 -import binascii -import json -import re -import uuid -import warnings -import zlib -from collections import deque -from types import TracebackType -from typing import ( - TYPE_CHECKING, - Any, - AsyncIterator, - Deque, - Dict, - Iterator, - List, - Mapping, - Optional, - Sequence, - Tuple, - Type, - Union, - cast, -) -from urllib.parse import parse_qsl, unquote, urlencode - -from multidict import CIMultiDict, CIMultiDictProxy, MultiMapping - -from .compression_utils import 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 .payload import ( - JsonPayload, - LookupError, - Order, - Payload, - StringPayload, - get_payload, - payload_type, -) -from .streams import StreamReader - -__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 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 - ) -> None: - self.headers = headers - self._boundary = boundary - self._content = content - self._at_eof = False - length = 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] = {} - - def __aiter__(self) -> AsyncIterator["BodyPartReader"]: - return self # type: ignore[return-value] - - 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 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) - - self._read_bytes += len(chunk) - if self._read_bytes == self._length: - self._at_eof = True - if self._at_eof: - clrf = await self._content.readline() - assert ( - b"\r\n" == clrf - ), "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) - 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 >= len(self._boundary) + 2 - ), "Chunk size must be greater or equal than boundary length + 2" - first_chunk = self._prev_chunk is None - if first_chunk: - self._prev_chunk = await self._content.read(size) - - chunk = await self._content.read(size) - self._content_eof += int(self._content.at_eof()) - assert self._content_eof < 3, "Reading after EOF" - 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:]) - if size > 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 - 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 - - 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) - if CONTENT_ENCODING in self.headers: - return self._decode_content(data) - return data - - 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 ZLibDecompressor( - encoding=encoding, - suppress_deflate_header=True, - ).decompress_sync(data) - - 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( - "unknown content transfer encoding: {}" "".format(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", 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): - 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) - - async def write(self, writer: Any) -> None: - field = self._value - chunk = await field.read_chunk(size=2**16) - while chunk: - await writer.write(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 = 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.headers = headers - self._boundary = ("--" + self._get_boundary()).encode() - self._content = content - self._last_part: Optional[Union["MultipartReader", BodyPartReader]] = None - self._at_eof = False - self._at_bof = True - self._unread: List[bytes] = [] - - def __aiter__( - self, - ) -> AsyncIterator["BodyPartReader"]: - return self # type: ignore[return-value] - - 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 - self._last_part = await self.fetch_next_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) - - def _get_boundary(self) -> str: - mimetype = parse_mimetype(self.headers[CONTENT_TYPE]) - - assert mimetype.type == "multipart", "multipart/* content type expected" - - if "boundary" not in mimetype.parameters: - raise ValueError( - "boundary missed for Content-Type: %s" % self.headers[CONTENT_TYPE] - ) - - boundary = 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 = [b""] - while True: - chunk = await self._content.readline() - chunk = chunk.strip() - 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.""" - - 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] = [] - - 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[MultiMapping[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.""" - # compression - encoding: Optional[str] = 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: Optional[str] = payload.headers.get( - CONTENT_TRANSFER_ENCODING, - "", - ).lower() - if te_encoding not in ("", "base64", "quoted-printable", "binary"): - raise RuntimeError( - "unknown content transfer encoding: {}" "".format(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[MultiMapping[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[MultiMapping[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: - 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 - - async def write(self, writer: Any, close_boundary: bool = True) -> None: - """Write body.""" - for part, encoding, te_encoding in self._parts: - 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") - - -class MultipartPayloadWriter: - def __init__(self, writer: Any) -> 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: int = zlib.Z_DEFAULT_STRATEGY - ) -> 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/.venv/Lib/site-packages/aiohttp/payload.py b/.venv/Lib/site-packages/aiohttp/payload.py deleted file mode 100644 index 6593b05..0000000 --- a/.venv/Lib/site-packages/aiohttp/payload.py +++ /dev/null @@ -1,463 +0,0 @@ -import asyncio -import enum -import io -import json -import mimetypes -import os -import warnings -from abc import ABC, abstractmethod -from itertools import chain -from typing import ( - IO, - TYPE_CHECKING, - Any, - ByteString, - Dict, - Final, - Iterable, - Optional, - 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 - -if TYPE_CHECKING: - from typing import List - - -class LookupError(Exception): - pass - - -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 - """ - - def __init__(self) -> None: - self._first: List[_PayloadRegistryItem] = [] - self._normal: List[_PayloadRegistryItem] = [] - self._last: List[_PayloadRegistryItem] = [] - - def get( - self, - data: Any, - *args: Any, - _CHAIN: "Type[chain[_PayloadRegistryItem]]" = chain, - **kwargs: Any, - ) -> "Payload": - if isinstance(data, Payload): - return data - for factory, type in _CHAIN(self._first, 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)) - 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 - - 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: - content_type = mimetypes.guess_type(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 - self._headers.update(headers or {}) - - @property - def size(self) -> Optional[int]: - """Size of the payload.""" - 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] - - 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 - async def write(self, writer: AbstractStreamWriter) -> None: - """Write payload. - - writer is an AbstractStreamWriter instance: - """ - - -class BytesPayload(Payload): - def __init__(self, value: ByteString, *args: Any, **kwargs: Any) -> None: - if not isinstance(value, (bytes, bytearray, memoryview)): - raise TypeError(f"value argument must be byte-ish, not {type(value)!r}") - - 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 - else: - self._size = len(value) - - 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, - ) - - async def write(self, writer: AbstractStreamWriter) -> None: - 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[Any] - - 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) - - async def write(self, writer: AbstractStreamWriter) -> None: - loop = asyncio.get_event_loop() - try: - chunk = await loop.run_in_executor(None, self._value.read, 2**16) - while chunk: - await writer.write(chunk) - chunk = await loop.run_in_executor(None, self._value.read, 2**16) - finally: - await loop.run_in_executor(None, self._value.close) - - -class TextIOPayload(IOBasePayload): - _value: TextIO - - 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, - ) - - @property - def size(self) -> Optional[int]: - try: - return os.fstat(self._value.fileno()).st_size - self._value.tell() - except OSError: - return None - - async def write(self, writer: AbstractStreamWriter) -> None: - loop = asyncio.get_event_loop() - try: - chunk = await loop.run_in_executor(None, self._value.read, 2**16) - while chunk: - data = ( - chunk.encode(encoding=self._encoding) - if self._encoding - else chunk.encode() - ) - await writer.write(data) - chunk = await loop.run_in_executor(None, self._value.read, 2**16) - finally: - await loop.run_in_executor(None, self._value.close) - - -class BytesIOPayload(IOBasePayload): - @property - def size(self) -> int: - position = self._value.tell() - end = self._value.seek(0, os.SEEK_END) - self._value.seek(position) - return end - position - - -class BufferedReaderPayload(IOBasePayload): - @property - def size(self) -> Optional[int]: - try: - return os.fstat(self._value.fileno()).st_size - self._value.tell() - except OSError: - # data.fileno() is not supported, e.g. - # io.BufferedReader(io.BytesIO(b'data')) - return None - - -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 - - 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: - if self._iter: - try: - # iter is not None check prevents rare cases - # when the case iterable is used twice - while True: - chunk = await self._iter.__anext__() - await writer.write(chunk) - except StopAsyncIteration: - self._iter = None - - -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 -# multidict.BodyPartReaderPayload override the default -PAYLOAD_REGISTRY.register(AsyncIterablePayload, AsyncIterable, order=Order.try_last) diff --git a/.venv/Lib/site-packages/aiohttp/payload_streamer.py b/.venv/Lib/site-packages/aiohttp/payload_streamer.py deleted file mode 100644 index 364f763..0000000 --- a/.venv/Lib/site-packages/aiohttp/payload_streamer.py +++ /dev/null @@ -1,75 +0,0 @@ -""" -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) - - -@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/.venv/Lib/site-packages/aiohttp/py.typed b/.venv/Lib/site-packages/aiohttp/py.typed deleted file mode 100644 index f5642f7..0000000 --- a/.venv/Lib/site-packages/aiohttp/py.typed +++ /dev/null @@ -1 +0,0 @@ -Marker diff --git a/.venv/Lib/site-packages/aiohttp/pytest_plugin.py b/.venv/Lib/site-packages/aiohttp/pytest_plugin.py deleted file mode 100644 index 5754747..0000000 --- a/.venv/Lib/site-packages/aiohttp/pytest_plugin.py +++ /dev/null @@ -1,381 +0,0 @@ -import asyncio -import contextlib -import warnings -from typing import Any, Awaitable, Callable, Dict, Iterator, Optional, Type, Union - -import pytest - -from aiohttp.helpers import isasyncgenfunction -from aiohttp.web import Application - -from .test_utils import ( - BaseTestServer, - RawTestServer, - TestClient, - TestServer, - loop_context, - setup_test_loop, - teardown_test_loop, - unused_port as _unused_port, -) - -try: - import uvloop -except ImportError: # pragma: no cover - uvloop = None # type: ignore[assignment] - -AiohttpClient = Callable[[Union[Application, BaseTestServer]], Awaitable[TestClient]] -AiohttpRawServer = Callable[[Application], Awaitable[RawTestServer]] -AiohttpServer = Callable[[Application], Awaitable[TestServer]] - - -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 isasyncgenfunction(func): - # async generator fixture - is_async_gen = True - elif asyncio.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 asyncio.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 asyncio.iscoroutinefunction(pyfuncitem.function): - existing_loop = pyfuncitem.funcargs.get( - "proactor_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, Type[asyncio.AbstractEventLoopPolicy]] - avail_factories = {"pyloop": asyncio.DefaultEventLoopPolicy} - - if uvloop is not None: # pragma: no cover - avail_factories["uvloop"] = uvloop.EventLoopPolicy - - 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, fast, loop_debug): # type: ignore[no-untyped-def] - """Return an instance of the event loop.""" - policy = loop_factory() - asyncio.set_event_loop_policy(policy) - with loop_context(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(): # type: ignore[no-untyped-def] - policy = asyncio.WindowsProactorEventLoopPolicy() # type: ignore[attr-defined] - asyncio.set_event_loop_policy(policy) - - with loop_context(policy.new_event_loop) 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, *, port=None, **kwargs): # type: ignore[no-untyped-def] - server = TestServer(app, 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, *, port=None, **kwargs): # type: ignore[no-untyped-def] - 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 = [] - - async def go( - __param: Union[Application, BaseTestServer], - *args: Any, - server_kwargs: Optional[Dict[str, Any]] = None, - **kwargs: Any - ) -> TestClient: - - 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/.venv/Lib/site-packages/aiohttp/resolver.py b/.venv/Lib/site-packages/aiohttp/resolver.py deleted file mode 100644 index 6c17b1e..0000000 --- a/.venv/Lib/site-packages/aiohttp/resolver.py +++ /dev/null @@ -1,160 +0,0 @@ -import asyncio -import socket -from typing import Any, Dict, List, Optional, Type, Union - -from .abc import AbstractResolver -from .helpers import get_running_loop - -__all__ = ("ThreadedResolver", "AsyncResolver", "DefaultResolver") - -try: - import aiodns - - # aiodns_default = hasattr(aiodns.DNSResolver, 'gethostbyname') -except ImportError: # pragma: no cover - aiodns = None - -aiodns_default = False - - -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 = get_running_loop(loop) - - async def resolve( - self, hostname: str, port: int = 0, family: int = socket.AF_INET - ) -> List[Dict[str, Any]]: - infos = await self._loop.getaddrinfo( - hostname, - port, - type=socket.SOCK_STREAM, - family=family, - flags=socket.AI_ADDRCONFIG, - ) - - hosts = [] - 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. - host, _port = socket.getnameinfo( - address, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV - ) - port = int(_port) - else: - host, port = address[:2] - else: # IPv4 - assert family == socket.AF_INET - host, port = address # type: ignore[misc] - hosts.append( - { - "hostname": hostname, - "host": host, - "port": port, - "family": family, - "proto": proto, - "flags": socket.AI_NUMERICHOST | socket.AI_NUMERICSERV, - } - ) - - 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 = get_running_loop(loop) - self._resolver = aiodns.DNSResolver(*args, loop=loop, **kwargs) - - 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: int = socket.AF_INET - ) -> List[Dict[str, Any]]: - try: - resp = await self._resolver.gethostbyname(host, family) - except aiodns.error.DNSError as exc: - msg = exc.args[1] if len(exc.args) >= 1 else "DNS lookup failed" - raise OSError(msg) from exc - hosts = [] - for address in resp.addresses: - hosts.append( - { - "hostname": host, - "host": address, - "port": port, - "family": family, - "proto": 0, - "flags": socket.AI_NUMERICHOST | socket.AI_NUMERICSERV, - } - ) - - if not hosts: - raise OSError("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]]: - if family == socket.AF_INET6: - qtype = "AAAA" - else: - qtype = "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(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("DNS lookup failed") - - return hosts - - async def close(self) -> None: - self._resolver.cancel() - - -_DefaultType = Type[Union[AsyncResolver, ThreadedResolver]] -DefaultResolver: _DefaultType = AsyncResolver if aiodns_default else ThreadedResolver diff --git a/.venv/Lib/site-packages/aiohttp/streams.py b/.venv/Lib/site-packages/aiohttp/streams.py deleted file mode 100644 index 3e4c355..0000000 --- a/.venv/Lib/site-packages/aiohttp/streams.py +++ /dev/null @@ -1,666 +0,0 @@ -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 BaseTimerContext, TimerNoop, set_exception, set_result -from .log import internal_logger - -__all__ = ( - "EMPTY_PAYLOAD", - "EofStream", - "StreamReader", - "DataQueue", - "FlowControlDataQueue", -) - -_T = TypeVar("_T") - - -class EofStream(Exception): - """eof stream indication.""" - - -class AsyncStreamIterator(Generic[_T]): - 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: - 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: - 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(): - ... - - """ - - total_bytes = 0 - - 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() - self._loop = loop - self._size = 0 - self._cursor = 0 - self._http_chunk_splits: Optional[List[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]] = [] - - 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) -> None: - self._exception = exc - self._eof_callbacks.clear() - - waiter = self._waiter - if waiter is not None: - self._waiter = None - set_exception(waiter, exc) - - waiter = self._eof_waiter - if waiter is not None: - self._eof_waiter = None - set_exception(waiter, exc) - - 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) - - 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 - - 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 - - self._size += len(data) - self._buffer.append(data) - self.total_bytes += len(data) - - 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 = [] - - 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) - - # 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: - # 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.pop(0) - 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() - - self._size -= len(data) - self._cursor += len(data) - - chunk_splits = self._http_chunk_splits - # Prevent memory leak: drop useless chunk splits - while chunk_splits and chunk_splits[0] < self._cursor: - chunk_splits.pop(0) - - if self._size < self._low_water and self._protocol._reading_paused: - 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] - def __init__(self) -> None: - self._read_eof_chunk = False - - def __repr__(self) -> str: - return "<%s>" % self.__class__.__name__ - - def exception(self) -> Optional[BaseException]: - return None - - def set_exception(self, exc: BaseException) -> 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._size = 0 - 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) -> None: - self._eof = True - self._exception = exc - - waiter = self._waiter - if waiter is not None: - self._waiter = None - set_exception(waiter, exc) - - def feed_data(self, data: _T, size: int = 0) -> None: - self._size += size - self._buffer.append((data, size)) - - waiter = self._waiter - if waiter is not None: - self._waiter = None - set_result(waiter, None) - - def feed_eof(self) -> None: - self._eof = True - - waiter = self._waiter - if 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, size = self._buffer.popleft() - self._size -= size - return data - else: - if self._exception is not None: - raise self._exception - else: - 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. - """ - - def __init__( - self, protocol: BaseProtocol, limit: int, *, loop: asyncio.AbstractEventLoop - ) -> None: - super().__init__(loop=loop) - - self._protocol = protocol - self._limit = limit * 2 - - def feed_data(self, data: _T, size: int = 0) -> None: - super().feed_data(data, size) - - if self._size > self._limit and not self._protocol._reading_paused: - self._protocol.pause_reading() - - async def read(self) -> _T: - try: - return await super().read() - finally: - if self._size < self._limit and self._protocol._reading_paused: - self._protocol.resume_reading() diff --git a/.venv/Lib/site-packages/aiohttp/tcp_helpers.py b/.venv/Lib/site-packages/aiohttp/tcp_helpers.py deleted file mode 100644 index 88b2442..0000000 --- a/.venv/Lib/site-packages/aiohttp/tcp_helpers.py +++ /dev/null @@ -1,37 +0,0 @@ -"""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/.venv/Lib/site-packages/aiohttp/test_utils.py b/.venv/Lib/site-packages/aiohttp/test_utils.py deleted file mode 100644 index b5821a7..0000000 --- a/.venv/Lib/site-packages/aiohttp/test_utils.py +++ /dev/null @@ -1,675 +0,0 @@ -"""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, - Iterator, - List, - Optional, - Type, - Union, - cast, -) -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, _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 .typedefs import StrOrURL -from .web import ( - Application, - AppRunner, - BaseRunner, - Request, - Server, - ServerRunner, - SockSite, - UrlMappingMatchInfo, -) -from .web_protocol import _RequestHandler - -if TYPE_CHECKING: - from ssl import SSLContext -else: - SSLContext = None - -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: Union[str, object] = sentinel, - 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 - try: - version = ipaddress.ip_address(self.host).version - except ValueError: - version = 4 - 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 self.scheme is sentinel: - if self._ssl: - scheme = "https" - else: - scheme = "http" - self.scheme = scheme - self._root = URL(f"{self.scheme}://{self.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.is_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: Union[str, object] = sentinel, - 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: Union[str, object] = sentinel, - 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: - """ - A test client implementation. - - To write functional tests for aiohttp based servers. - - """ - - __test__ = False - - 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._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) -> Optional[Application]: - return cast(Optional[Application], getattr(self._server, "app", None)) - - @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 - - 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) -> "TestClient": - 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: - """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: Any = sentinel, - 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 ...: - 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 - - 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 - - if payload is sentinel: - payload = mock.Mock() - - 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/.venv/Lib/site-packages/aiohttp/tracing.py b/.venv/Lib/site-packages/aiohttp/tracing.py deleted file mode 100644 index 62847a0..0000000 --- a/.venv/Lib/site-packages/aiohttp/tracing.py +++ /dev/null @@ -1,471 +0,0 @@ -from types import SimpleNamespace -from typing import TYPE_CHECKING, Awaitable, Optional, Protocol, 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) - - class _SignalCallback(Protocol[_ParamT_contra]): - def __call__( - self, - __client_session: ClientSession, - __trace_config_ctx: SimpleNamespace, - __params: _ParamT_contra, - ) -> Awaitable[None]: - ... - - -__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: Signal[ - _SignalCallback[TraceRequestStartParams] - ] = Signal(self) - self._on_request_chunk_sent: Signal[ - _SignalCallback[TraceRequestChunkSentParams] - ] = Signal(self) - self._on_response_chunk_received: Signal[ - _SignalCallback[TraceResponseChunkReceivedParams] - ] = Signal(self) - self._on_request_end: Signal[_SignalCallback[TraceRequestEndParams]] = Signal( - self - ) - self._on_request_exception: Signal[ - _SignalCallback[TraceRequestExceptionParams] - ] = Signal(self) - self._on_request_redirect: Signal[ - _SignalCallback[TraceRequestRedirectParams] - ] = Signal(self) - self._on_connection_queued_start: Signal[ - _SignalCallback[TraceConnectionQueuedStartParams] - ] = Signal(self) - self._on_connection_queued_end: Signal[ - _SignalCallback[TraceConnectionQueuedEndParams] - ] = Signal(self) - self._on_connection_create_start: Signal[ - _SignalCallback[TraceConnectionCreateStartParams] - ] = Signal(self) - self._on_connection_create_end: Signal[ - _SignalCallback[TraceConnectionCreateEndParams] - ] = Signal(self) - self._on_connection_reuseconn: Signal[ - _SignalCallback[TraceConnectionReuseconnParams] - ] = Signal(self) - self._on_dns_resolvehost_start: Signal[ - _SignalCallback[TraceDnsResolveHostStartParams] - ] = Signal(self) - self._on_dns_resolvehost_end: Signal[ - _SignalCallback[TraceDnsResolveHostEndParams] - ] = Signal(self) - self._on_dns_cache_hit: Signal[ - _SignalCallback[TraceDnsCacheHitParams] - ] = Signal(self) - self._on_dns_cache_miss: Signal[ - _SignalCallback[TraceDnsCacheMissParams] - ] = Signal(self) - self._on_request_headers_sent: Signal[ - _SignalCallback[TraceRequestHeadersSentParams] - ] = Signal(self) - - self._trace_config_ctx_factory = trace_config_ctx_factory - - def trace_config_ctx( - self, trace_request_ctx: Optional[SimpleNamespace] = 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) -> "Signal[_SignalCallback[TraceRequestStartParams]]": - return self._on_request_start - - @property - def on_request_chunk_sent( - self, - ) -> "Signal[_SignalCallback[TraceRequestChunkSentParams]]": - return self._on_request_chunk_sent - - @property - def on_response_chunk_received( - self, - ) -> "Signal[_SignalCallback[TraceResponseChunkReceivedParams]]": - return self._on_response_chunk_received - - @property - def on_request_end(self) -> "Signal[_SignalCallback[TraceRequestEndParams]]": - return self._on_request_end - - @property - def on_request_exception( - self, - ) -> "Signal[_SignalCallback[TraceRequestExceptionParams]]": - return self._on_request_exception - - @property - def on_request_redirect( - self, - ) -> "Signal[_SignalCallback[TraceRequestRedirectParams]]": - return self._on_request_redirect - - @property - def on_connection_queued_start( - self, - ) -> "Signal[_SignalCallback[TraceConnectionQueuedStartParams]]": - return self._on_connection_queued_start - - @property - def on_connection_queued_end( - self, - ) -> "Signal[_SignalCallback[TraceConnectionQueuedEndParams]]": - return self._on_connection_queued_end - - @property - def on_connection_create_start( - self, - ) -> "Signal[_SignalCallback[TraceConnectionCreateStartParams]]": - return self._on_connection_create_start - - @property - def on_connection_create_end( - self, - ) -> "Signal[_SignalCallback[TraceConnectionCreateEndParams]]": - return self._on_connection_create_end - - @property - def on_connection_reuseconn( - self, - ) -> "Signal[_SignalCallback[TraceConnectionReuseconnParams]]": - return self._on_connection_reuseconn - - @property - def on_dns_resolvehost_start( - self, - ) -> "Signal[_SignalCallback[TraceDnsResolveHostStartParams]]": - return self._on_dns_resolvehost_start - - @property - def on_dns_resolvehost_end( - self, - ) -> "Signal[_SignalCallback[TraceDnsResolveHostEndParams]]": - return self._on_dns_resolvehost_end - - @property - def on_dns_cache_hit(self) -> "Signal[_SignalCallback[TraceDnsCacheHitParams]]": - return self._on_dns_cache_hit - - @property - def on_dns_cache_miss(self) -> "Signal[_SignalCallback[TraceDnsCacheMissParams]]": - return self._on_dns_cache_miss - - @property - def on_request_headers_sent( - self, - ) -> "Signal[_SignalCallback[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/.venv/Lib/site-packages/aiohttp/typedefs.py b/.venv/Lib/site-packages/aiohttp/typedefs.py deleted file mode 100644 index 5e963e1..0000000 --- a/.venv/Lib/site-packages/aiohttp/typedefs.py +++ /dev/null @@ -1,54 +0,0 @@ -import json -import os -from typing import ( - TYPE_CHECKING, - Any, - Awaitable, - Callable, - Iterable, - Mapping, - Tuple, - Union, -) - -from multidict import CIMultiDict, CIMultiDictProxy, MultiDict, MultiDictProxy, istr -from yarl import URL - -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[Union[str, istr], str], _CIMultiDict, _CIMultiDictProxy] -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"]] -Middleware = Callable[["Request", Handler], Awaitable["StreamResponse"]] - -PathLike = Union[str, "os.PathLike[str]"] diff --git a/.venv/Lib/site-packages/aiohttp/web.py b/.venv/Lib/site-packages/aiohttp/web.py deleted file mode 100644 index e911650..0000000 --- a/.venv/Lib/site-packages/aiohttp/web.py +++ /dev/null @@ -1,616 +0,0 @@ -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 functools import partial -from importlib import import_module -from typing import ( - Any, - Awaitable, - Callable, - Iterable as TypingIterable, - List, - Optional, - Set, - Type, - Union, - cast, -) -from weakref import WeakSet - -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", -) - - -try: - from ssl import SSLContext -except ImportError: # pragma: no cover - SSLContext = Any # 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, - 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, -) -> None: - async def wait( - starting_tasks: "WeakSet[asyncio.Task[object]]", shutdown_timeout: float - ) -> None: - # Wait for pending tasks for a given time limit. - t = asyncio.current_task() - assert t is not None - starting_tasks.add(t) - with suppress(asyncio.TimeoutError): - await asyncio.wait_for(_wait(starting_tasks), timeout=shutdown_timeout) - - async def _wait(exclude: "WeakSet[asyncio.Task[object]]") -> None: - t = asyncio.current_task() - assert t is not None - exclude.add(t) - while tasks := asyncio.all_tasks().difference(exclude): - await asyncio.wait(tasks) - - # 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, - handle_signals=handle_signals, - access_log_class=access_log_class, - access_log_format=access_log_format, - access_log=access_log, - keepalive_timeout=keepalive_timeout, - shutdown_timeout=shutdown_timeout, - handler_cancellation=handler_cancellation, - ) - - await runner.setup() - # On shutdown we want to avoid waiting on tasks which run forever. - # It's very likely that all tasks which run forever will have been created by - # the time we have completed the application startup (in runner.setup()), - # so we just record all running tasks here and exclude them later. - starting_tasks: "WeakSet[asyncio.Task[object]]" = WeakSet(asyncio.all_tasks()) - runner.shutdown_callback = partial(wait, starting_tasks, shutdown_timeout) - - sites: List[BaseSite] = [] - - try: - if host is not None: - if isinstance(host, (str, bytes, bytearray, memoryview)): - 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, -) -> 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, - ) - ) - - try: - asyncio.set_event_loop(loop) - loop.run_until_complete(main_task) - except (GracefulExit, KeyboardInterrupt): # pragma: no cover - pass - finally: - _cancel_tasks({main_task}, loop) - _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: %(default)r)", - default="localhost", - ) - 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. Specifying a path will cause " - "hostname and port arguments to be ignored.", - ) - 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) - - app = func(extra_argv) - run_app(app, host=args.hostname, port=args.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/.venv/Lib/site-packages/aiohttp/web_app.py b/.venv/Lib/site-packages/aiohttp/web_app.py deleted file mode 100644 index 91bf5fd..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_app.py +++ /dev/null @@ -1,596 +0,0 @@ -import asyncio -import logging -import warnings -from functools import 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 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, - UrlDispatcher, -) - -__all__ = ("Application", "CleanupError") - - -if TYPE_CHECKING: - _AppSignal = Signal[Callable[["Application"], Awaitable[None]]] - _RespPrepareSignal = Signal[Callable[[Request, StreamResponse], Awaitable[None]]] - _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") - - -class Application(MutableMapping[Union[str, AppKey[Any]], Any]): - ATTRS = frozenset( - [ - "logger", - "_debug", - "_router", - "_loop", - "_handler_args", - "_middlewares", - "_middlewares_handlers", - "_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._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) - - @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()) - - # 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") -> AbstractResource: - 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[[], AbstractResource], subapp: "Application" - ) -> AbstractResource: - 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") -> AbstractResource: - 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: - 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( - 'old-style middleware "{!r}" deprecated, ' "see #2252".format(m), - 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() - - resp = None - request._match_info = match_info - expect = request.headers.get(hdrs.EXPECT) - if expect: - resp = await match_info.expect_handler(request) - await request.writer.drain() - - if resp is None: - handler = match_info.handler - - if self._run_middlewares: - 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] - - resp = await handler(request) - - return resp - - 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 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/.venv/Lib/site-packages/aiohttp/web_exceptions.py b/.venv/Lib/site-packages/aiohttp/web_exceptions.py deleted file mode 100644 index ee2c1e7..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_exceptions.py +++ /dev/null @@ -1,452 +0,0 @@ -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/.venv/Lib/site-packages/aiohttp/web_fileresponse.py b/.venv/Lib/site-packages/aiohttp/web_fileresponse.py deleted file mode 100644 index 6496ffa..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_fileresponse.py +++ /dev/null @@ -1,301 +0,0 @@ -import asyncio -import mimetypes -import os -import pathlib -from typing import ( # noqa - IO, - TYPE_CHECKING, - Any, - Awaitable, - Callable, - Final, - Iterator, - List, - Optional, - 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 ( - 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")) - - -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 - - 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() - - await loop.run_in_executor(None, fobj.seek, offset) - - chunk = await loop.run_in_executor(None, fobj.read, 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 _strong_etag_match(etag_value: str, etags: Tuple[ETag, ...]) -> bool: - if len(etags) == 1 and etags[0].value == ETAG_ANY: - return True - return any(etag.value == etag_value for etag in etags if 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 # type: ignore[assignment] - self.last_modified = last_modified # type: ignore[assignment] - # 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 _get_file_path_stat_and_gzip( - self, check_for_gzipped_file: bool - ) -> Tuple[pathlib.Path, os.stat_result, bool]: - """Return the file path, stat result, and gzip status. - - This method should be called from a thread executor - since it calls os.stat which may block. - """ - filepath = self._path - if check_for_gzipped_file: - gzip_path = filepath.with_name(filepath.name + ".gz") - try: - return gzip_path, gzip_path.stat(), True - except OSError: - # Fall through and try the non-gzipped file - pass - - return filepath, filepath.stat(), False - - async def prepare(self, request: "BaseRequest") -> Optional[AbstractStreamWriter]: - loop = asyncio.get_event_loop() - check_for_gzipped_file = "gzip" in request.headers.get(hdrs.ACCEPT_ENCODING, "") - filepath, st, gzip = await loop.run_in_executor( - None, self._get_file_path_stat_and_gzip, check_for_gzipped_file - ) - - etag_value = f"{st.st_mtime_ns:x}-{st.st_size:x}" - last_modified = st.st_mtime - - # https://tools.ietf.org/html/rfc7232#section-6 - ifmatch = request.if_match - if ifmatch is not None and not self._strong_etag_match(etag_value, ifmatch): - return await self._precondition_failed(request) - - unmodsince = request.if_unmodified_since - if ( - unmodsince is not None - and ifmatch is None - and st.st_mtime > unmodsince.timestamp() - ): - return await self._precondition_failed(request) - - ifnonematch = request.if_none_match - if ifnonematch is not None and self._strong_etag_match(etag_value, ifnonematch): - return await self._not_modified(request, etag_value, last_modified) - - modsince = request.if_modified_since - if ( - modsince is not None - and ifnonematch is None - and st.st_mtime <= modsince.timestamp() - ): - return await self._not_modified(request, etag_value, last_modified) - - if hdrs.CONTENT_TYPE not in self.headers: - ct, encoding = mimetypes.guess_type(str(filepath)) - if not ct: - ct = "application/octet-stream" - should_set_ct = True - else: - encoding = "gzip" if gzip else None - should_set_ct = False - - status = self._status - file_size = st.st_size - count = file_size - - start = None - - ifrange = request.if_range - if ifrange is None or st.st_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 = 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 or end 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 should_set_ct: - self.content_type = ct # type: ignore[assignment] - if encoding: - self.headers[hdrs.CONTENT_ENCODING] = encoding - if gzip: - 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 = etag_value # type: ignore[assignment] - self.last_modified = st.st_mtime # type: ignore[assignment] - self.content_length = count - - self.headers[hdrs.ACCEPT_RANGES] = "bytes" - - real_start = cast(int, start) - - if status == HTTPPartialContent.status_code: - 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, self.status): - return await super().prepare(request) - - fobj = await loop.run_in_executor(None, filepath.open, "rb") - if start: # be aware that start could be None or int=0 here. - offset = start - else: - offset = 0 - - try: - return await self._sendfile(request, fobj, offset, count) - finally: - await asyncio.shield(loop.run_in_executor(None, fobj.close)) diff --git a/.venv/Lib/site-packages/aiohttp/web_log.py b/.venv/Lib/site-packages/aiohttp/web_log.py deleted file mode 100644 index 633e9e3..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_log.py +++ /dev/null @@ -1,213 +0,0 @@ -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] - - def log(self, request: BaseRequest, response: StreamResponse, time: float) -> None: - if not self.logger.isEnabledFor(logging.INFO): - # Avoid formatting the log line if it will not be emitted. - return - 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/.venv/Lib/site-packages/aiohttp/web_middlewares.py b/.venv/Lib/site-packages/aiohttp/web_middlewares.py deleted file mode 100644 index 5da1533..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_middlewares.py +++ /dev/null @@ -1,116 +0,0 @@ -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: - with request.match_info.set_current_app(app): - return await handler(request) - - return impl diff --git a/.venv/Lib/site-packages/aiohttp/web_protocol.py b/.venv/Lib/site-packages/aiohttp/web_protocol.py deleted file mode 100644 index ec5856a..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_protocol.py +++ /dev/null @@ -1,698 +0,0 @@ -import asyncio -import asyncio.streams -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 .abc import AbstractAccessLogger, AbstractStreamWriter -from .base_protocol import BaseProtocol -from .helpers import ceil_timeout -from .http import ( - HttpProcessingError, - HttpRequestParser, - HttpVersion10, - RawRequestMessage, - StreamWriter, -) -from .log import access_logger, server_logger -from .streams import EMPTY_PAYLOAD, StreamReader -from .tcp_helpers import tcp_keepalive -from .web_exceptions import HTTPException -from .web_log import AccessLogger -from .web_request import BaseRequest -from .web_response import Response, StreamResponse - -__all__ = ("RequestHandler", "RequestPayloadError", "PayloadAccessError") - -if TYPE_CHECKING: - 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.""" - - -@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 - - """ - - KEEPALIVE_RESCHEDULE_DELAY = 1 - - __slots__ = ( - "_request_count", - "_keepalive", - "_manager", - "_request_handler", - "_request_factory", - "_tcp_keepalive", - "_keepalive_time", - "_keepalive_handle", - "_keepalive_timeout", - "_lingering_time", - "_messages", - "_message_tail", - "_waiter", - "_task_handler", - "_upgrade", - "_payload_parser", - "_request_parser", - "_reading_paused", - "logger", - "debug", - "access_log", - "access_logger", - "_close", - "_force_close", - "_current_request", - "_timeout_ceil_threshold", - ) - - def __init__( - self, - manager: "Server", - *, - loop: asyncio.AbstractEventLoop, - keepalive_timeout: float = 75.0, # NGINX default is 75 secs - 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) - - 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._keepalive_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._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 - ) - else: - self.access_logger = None - - self._close = False - self._force_close = False - - def __repr__(self) -> str: - return "<{} {}>".format( - self.__class__.__name__, - "connected" if self.transport is not None else "disconnected", - ) - - @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() - - if self._waiter: - self._waiter.cancel() - - # wait for handlers - with suppress(asyncio.CancelledError, asyncio.TimeoutError): - 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 self._task_handler - - # force-close non-idle handler - if self._task_handler is not None: - self._task_handler.cancel() - - if self.transport is not None: - self.transport.close() - self.transport = None - - 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) - - self._task_handler = self._loop.create_task(self.start()) - assert self._manager is not None - self._manager.connection_made(self, real_transport) - - def connection_lost(self, exc: Optional[BaseException]) -> None: - if self._manager is None: - return - self._manager.connection_lost(self, exc) - - super().connection_lost(exc) - - # Grab value before setting _manager to None. - handler_cancellation = self._manager.handler_cancellation - - self._manager = None - self._force_close = True - 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 self._waiter is not None: - self._waiter.cancel() - - 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: float - ) -> None: - if self.access_logger 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: - if self._force_close or not self._keepalive: - return - - next = self._keepalive_time + self._keepalive_timeout - - # handler in idle state - if self._waiter: - if self._loop.time() > next: - self.force_close() - return - - # not all request handlers are done, - # reschedule itself to next second - self._keepalive_handle = self._loop.call_later( - self.KEEPALIVE_RESCHEDULE_DELAY, - self._process_keepalive, - ) - - async def _handle_request( - self, - request: BaseRequest, - start_time: float, - request_handler: Callable[[BaseRequest], Awaitable[StreamResponse]], - ) -> Tuple[StreamResponse, bool]: - assert self._request_handler is not None - try: - try: - self._current_request = request - resp = await request_handler(request) - finally: - self._current_request = None - except HTTPException as exc: - resp = exc - 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) - reset = await self.finish_response(request, resp, start_time) - except Exception as exc: - resp = self.handle_error(request, 500, exc) - 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, - ) - - reset = await self.finish_response(request, resp, start_time) - - 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 - handler = self._task_handler - assert handler is not None - 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 - except asyncio.CancelledError: - break - finally: - self._waiter = None - - message, payload = self._messages.popleft() - - start = loop.time() - - 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 - - request = self._request_factory(message, payload, self, writer, handler) - try: - # a new task is used for copy context vars (#3406) - task = self._loop.create_task( - self._handle_request(request, start, request_handler) - ) - try: - resp, reset = await task - except (asyncio.CancelledError, 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 - - with suppress(asyncio.TimeoutError, asyncio.CancelledError): - 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() - - # if payload still uncompleted - if not payload.is_eof() and not self._force_close: - self.log_debug("Uncompleted request.") - self.close() - - payload.set_exception(PayloadAccessError()) - - except asyncio.CancelledError: - self.log_debug("Ignored premature client disconnection ") - break - except RuntimeError as exc: - if self.debug: - self.log_exception("Unhandled runtime exception", exc_info=exc) - self.force_close() - except Exception as exc: - self.log_exception("Unhandled exception", exc_info=exc) - self.force_close() - finally: - if self.transport is None and resp is not None: - self.log_debug("Ignored premature client disconnection.") - elif not self._force_close: - if self._keepalive and not self._close: - # start keep-alive timer - if keepalive_timeout is not None: - now = self._loop.time() - self._keepalive_time = now - if self._keepalive_handle is None: - self._keepalive_handle = loop.call_at( - now + keepalive_timeout, 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: float - ) -> 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. - """ - 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: - raise RuntimeError("Missing return " "statement on request handler") - else: - raise RuntimeError( - "Web-handler should return " - "a response instance, " - "got {!r}".format(resp) - ) - try: - await prepare_meth(request) - await resp.write_eof() - except ConnectionError: - self.log_access(request, resp, start_time) - return True - else: - self.log_access(request, resp, start_time) - return 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. - """ - self.log_exception("Error handling request", 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/.venv/Lib/site-packages/aiohttp/web_request.py b/.venv/Lib/site-packages/aiohttp/web_request.py deleted file mode 100644 index 61fc831..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_request.py +++ /dev/null @@ -1,898 +0,0 @@ -import asyncio -import datetime -import io -import re -import socket -import string -import tempfile -import types -import warnings -from http.cookies import SimpleCookie -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 .abc import AbstractStreamWriter -from .helpers import ( - _SENTINEL, - DEBUG, - ETAG_ANY, - LIST_QUOTED_ETAG_RE, - ChainMapProxy, - ETag, - HeadersMixin, - parse_http_date, - reify, - sentinel, -) -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", - ] - ) - - 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: - if state is None: - state = {} - self._message = message - self._protocol = protocol - self._payload_writer = payload_writer - - self._payload = payload - self._headers = message.headers - self._method = message.method - self._version = message.version - self._cache: Dict[str, Any] = {} - url = message.url - if url.is_absolute(): - # 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 = message.url - self._post: Optional[MultiDictProxy[Union[str, bytes, FileField]]] = None - self._read_bytes: Optional[bytes] = None - - self._state = state - self._task = task - self._client_max_size = client_max_size - self._loop = loop - - transport = self._protocol.transport - assert transport is not None - self._transport_sslcontext = transport.get_extra_info("sslcontext") - self._transport_peername = transport.get_extra_info("peername") - - if scheme is not None: - self._cache["scheme"] = scheme - if host is not None: - self._cache["host"] = host - 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 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 - """ - 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: - url = URL.build(scheme=self.scheme, host=self.host) - return url.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 MultiDictProxy(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) -> "MultiMapping[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. - """ - raw = self.headers.get(hdrs.COOKIE, "") - parsed = SimpleCookie(raw) - return MappingProxyType({key: val.value for key, val in parsed.items()}) - - @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)[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 - - field = await multipart.next() - while field is not None: - size = 0 - field_ct = field.headers.get(hdrs.CONTENT_TYPE) - - if isinstance(field, BodyPartReader): - assert field.name is not None - - # 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 = tempfile.TemporaryFile() - chunk = await field.read_chunk(size=2**16) - while chunk: - chunk = field.decode(chunk) - tmp.write(chunk) - size += len(chunk) - if 0 < max_size < size: - tmp.close() - raise HTTPRequestEntityTooLarge( - max_size=max_size, actual_size=size - ) - chunk = await field.read_chunk(size=2**16) - 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", - ) - - field = await multipart.next() - 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: - self._payload.set_exception(exc) - - -class Request(BaseRequest): - - ATTRS = BaseRequest.ATTRS | frozenset(["_match_info"]) - - def __init__(self, *args: Any, **kwargs: Any) -> None: - super().__init__(*args, **kwargs) - - # matchdict, route_name, handler - # or information about traversal lookup - - # initialized after route resolving - self._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: - await app.on_response_prepare.send(self, response) diff --git a/.venv/Lib/site-packages/aiohttp/web_response.py b/.venv/Lib/site-packages/aiohttp/web_response.py deleted file mode 100644 index b6a4ba9..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_response.py +++ /dev/null @@ -1,817 +0,0 @@ -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 - -__all__ = ("ContentCoding", "StreamResponse", "Response", "json_response") - - -if TYPE_CHECKING: - from .web_request import BaseRequest - - BaseClass = MutableMapping[str, Any] -else: - BaseClass = collections.abc.MutableMapping - - -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" - - -############################################################ -# HTTP Response classes -############################################################ - - -class StreamResponse(BaseClass, HeadersMixin): - - _length_check = True - - def __init__( - self, - *, - status: int = 200, - reason: Optional[str] = None, - headers: Optional[LooseHeaders] = None, - ) -> None: - self._body = None - self._keep_alive: Optional[bool] = None - self._chunked = False - self._compression = False - self._compression_force: Optional[ContentCoding] = None - self._cookies = SimpleCookie() - - self._req: Optional[BaseRequest] = None - self._payload_writer: Optional[AbstractStreamWriter] = None - self._eof_sent = False - self._must_be_empty_body: Optional[bool] = None - self._body_length = 0 - self._state: Dict[str, Any] = {} - - if 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._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._status = int(status) - if reason is None: - try: - reason = HTTPStatus(self._status).phrase - except ValueError: - reason = "" - 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.""" - self._chunked = True - - 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) - - def enable_compression( - self, force: Optional[Union[bool, ContentCoding]] = None - ) -> None: - """Enables response compression encoding.""" - # Backwards compatibility for when force was a bool <0.17. - if type(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 - - @property - def headers(self) -> "CIMultiDict[str]": - return self._headers - - @property - def cookies(self) -> 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, - ) -> None: - """Set or update response cookie. - - Sets new cookie or updates existent with new value. - Also updates only those params which are not None. - """ - old = self._cookies.get(name) - if old is not None and old.coded_value == "": - # deleted cookie - self._cookies.pop(name, None) - - 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 - - def del_cookie( - self, name: str, *, domain: Optional[str] = None, path: str = "/" - ) -> None: - """Delete cookie. - - Creates new empty expired cookie. - """ - # TODO: do we need domain/path here? - 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, - ) - - @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 - - @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 != ContentCoding.identity: - assert self._payload_writer is not None - self._headers[hdrs.CONTENT_ENCODING] = coding.value - self._payload_writer.enable_compression(coding.value) - # 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) - else: - accept_encoding = request.headers.get(hdrs.ACCEPT_ENCODING, "").lower() - for coding in ContentCoding: - if coding.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 - 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" - if hdrs.CONTENT_LENGTH in headers: - del headers[hdrs.CONTENT_LENGTH] - elif self._length_check: - 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] - else: - 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" - else: - if 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 = "HTTP/{}.{} {} {}".format( - version[0], version[1], self._status, self._reason - ) - await writer.write_headers(status_line, self._headers) - - async def write(self, data: bytes) -> 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 - - -class Response(StreamResponse): - 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() - elif not isinstance(headers, CIMultiDict): - real_headers = CIMultiDict(headers) - else: - real_headers = headers # = cast('CIMultiDict[str]', 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 - else: - if 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" - ) - else: - if 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, headers=real_headers) - - if text is not None: - self.text = text - else: - self.body = body - - self._compressed_body: Optional[bytes] = None - 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: bytes) -> None: - if body is None: - self._body: Optional[bytes] = None - self._body_payload: bool = False - elif isinstance(body, (bytes, bytearray)): - self._body = body - self._body_payload = False - else: - try: - self._body = body = payload.PAYLOAD_REGISTRY.get(body) - except payload.LookupError: - raise ValueError("Unsupported body type %r" % type(body)) - - self._body_payload = True - - 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 - 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._body_payload = False - self._compressed_body = None - - @property - def content_length(self) -> Optional[int]: - if self._chunked: - return None - - if hdrs.CONTENT_LENGTH in self._headers: - return super().content_length - - if self._compressed_body is not None: - # Return length of the compressed body - return len(self._compressed_body) - elif 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 not None: - if self._must_be_empty_body: - await super().write_eof() - elif self._body_payload: - payload = cast(Payload, body) - await payload.write(self._payload_writer) - await super().write_eof() - else: - await super().write_eof(cast(bytes, body)) - else: - await super().write_eof() - - async def _start(self, request: "BaseRequest") -> AbstractStreamWriter: - if should_remove_content_length(request.method, self.status): - if hdrs.CONTENT_LENGTH in self._headers: - del self._headers[hdrs.CONTENT_LENGTH] - elif not self._chunked and hdrs.CONTENT_LENGTH not in self._headers: - if self._body_payload: - size = cast(Payload, self._body).size - if 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.upper() != hdrs.METH_HEAD - ): - self._headers[hdrs.CONTENT_LENGTH] = str(body_len) - - return await super()._start(request) - - async def _do_start_compression(self, coding: ContentCoding) -> None: - if self._body_payload or self._chunked: - return await super()._do_start_compression(coding) - - if coding != ContentCoding.identity: - # Instead of using _payload_writer.enable_compression, - # compress the whole body - compressor = ZLibCompressor( - encoding=str(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) > 1024 * 1024: - 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() - ) - assert self._compressed_body is not None - - 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/.venv/Lib/site-packages/aiohttp/web_routedef.py b/.venv/Lib/site-packages/aiohttp/web_routedef.py deleted file mode 100644 index d79cd32..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_routedef.py +++ /dev/null @@ -1,216 +0,0 @@ -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/.venv/Lib/site-packages/aiohttp/web_runner.py b/.venv/Lib/site-packages/aiohttp/web_runner.py deleted file mode 100644 index 6999b5c..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_runner.py +++ /dev/null @@ -1,406 +0,0 @@ -import asyncio -import signal -import socket -import warnings -from abc import ABC, abstractmethod -from typing import Any, Awaitable, Callable, List, Optional, Set - -from yarl import URL - -from .typedefs import PathLike -from .web_app import Application -from .web_server import Server - -try: - from ssl import SSLContext -except ImportError: - 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 self._host is None 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__ = ( - "shutdown_callback", - "_handle_signals", - "_kwargs", - "_server", - "_sites", - "_shutdown_timeout", - ) - - def __init__( - self, - *, - handle_signals: bool = False, - shutdown_timeout: float = 60.0, - **kwargs: Any, - ) -> None: - self.shutdown_callback: Optional[Callable[[], Awaitable[None]]] = 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 - self._server.pre_shutdown() - await self.shutdown() - - if self.shutdown_callback: - await self.shutdown_callback() - - 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/.venv/Lib/site-packages/aiohttp/web_server.py b/.venv/Lib/site-packages/aiohttp/web_server.py deleted file mode 100644 index 52faacb..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_server.py +++ /dev/null @@ -1,77 +0,0 @@ -"""Low level HTTP server.""" -import asyncio -from typing import Any, Awaitable, Callable, Dict, List, Optional # noqa - -from .abc import AbstractStreamWriter -from .helpers import get_running_loop -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 = get_running_loop(loop) - self._connections: Dict[RequestHandler, asyncio.Transport] = {} - self._kwargs = kwargs - 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: - 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/.venv/Lib/site-packages/aiohttp/web_urldispatcher.py b/.venv/Lib/site-packages/aiohttp/web_urldispatcher.py deleted file mode 100644 index 9969653..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_urldispatcher.py +++ /dev/null @@ -1,1232 +0,0 @@ -import abc -import asyncio -import base64 -import hashlib -import inspect -import keyword -import os -import re -import warnings -from contextlib import contextmanager -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 # type: ignore[attr-defined] - -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 - -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("/") - - -_ExpectHandler = Callable[[Request], Awaitable[Optional[StreamResponse]]] -_Resolve = Tuple[Optional["UrlMappingMatchInfo"], Set[str]] - - -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 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 asyncio.iscoroutinefunction(handler): - pass - elif inspect.isgeneratorfunction(handler): - 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) - 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): - def __init__(self, match_dict: Dict[str, str], route: AbstractRoute): - 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 - - @contextmanager - def set_current_app(self, app: "Application") -> Generator[None, None, 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 - ) - ) - prev = self._current_app - self._current_app = app - try: - yield - finally: - self._current_app = prev - - def freeze(self) -> None: - self._frozen = True - - def __repr__(self) -> str: - return f"" - - -class MatchInfoError(UrlMappingMatchInfo): - 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") - 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: List[ResourceRoute] = [] - - def add_route( - self, - method: str, - handler: Union[Type[AbstractView], Handler], - *, - expect_handler: Optional[_ExpectHandler] = None, - ) -> "ResourceRoute": - - for route_obj in self._routes: - if route_obj.method == method or route_obj.method == hdrs.METH_ANY: - raise RuntimeError( - "Added route will never be executed, " - "method {route.method} is already " - "registered".format(route=route_obj) - ) - - 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}" - self._routes.append(route) - - async def resolve(self, request: Request) -> _Resolve: - allowed_methods: Set[str] = set() - - match_dict = self._match(request.rel_url.raw_path) - if match_dict is None: - return None, allowed_methods - - for route_obj in self._routes: - route_method = route_obj.method - allowed_methods.add(route_method) - - if route_method == request.method or route_method == hdrs.METH_ANY: - return (UrlMappingMatchInfo(match_dict, route_obj), allowed_methods) - else: - return None, 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) - - # 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 {} - else: - 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) - 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 - else: - return { - key: _unquote_path(value) for key, value in match.groupdict().items() - } - - def raw_match(self, path: str) -> bool: - return self._formatter == 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) - if str(directory).startswith("~"): - directory = Path(os.path.expanduser(str(directory))) - directory = directory.resolve() - if not directory.is_dir(): - raise ValueError("Not a directory") - except (FileNotFoundError, ValueError) as error: - raise ValueError(f"No directory exists at '{directory}'") from error - 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 - ), - } - - 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 - ) - - async def resolve(self, request: Request) -> _Resolve: - path = request.rel_url.raw_path - method = request.method - allowed_methods = set(self._routes) - if not path.startswith(self._prefix2) and path != self._prefix: - return None, set() - - if method not in allowed_methods: - return None, allowed_methods - - match_dict = {"filename": _unquote_path(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: - rel_url = request.match_info["filename"] - try: - filename = Path(rel_url) - if filename.anchor: - # rel_url is an absolute name like - # /static/\\machine_name\c$ or /static/D:\path - # where the static dir is totally different - raise HTTPForbidden() - unresolved_path = self._directory.joinpath(filename) - 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) as error: - # relatively safe - raise HTTPNotFound() from error - except HTTPForbidden: - raise - except Exception as error: - # perm error or other kind! - request.app.logger.exception(error) - raise HTTPNotFound() from error - - # on opening a dir, load its contents if allowed - if filepath.is_dir(): - if self._show_index: - try: - return Response( - text=self._directory_as_html(filepath), content_type="text/html" - ) - except PermissionError: - raise HTTPForbidden() - else: - raise HTTPForbidden() - elif filepath.is_file(): - return FileResponse(filepath, chunk_size=self._chunk_size) - else: - raise HTTPNotFound - - def _directory_as_html(self, filepath: Path) -> str: - # returns directory's index as html - - # sanity check - assert filepath.is_dir() - - relative_path_to_dir = filepath.relative_to(self._directory).as_posix() - index_of = f"Index of /{relative_path_to_dir}" - h1 = f"

{index_of}

" - - index_list = [] - dir_index = filepath.iterdir() - for _file in sorted(dir_index): - # show file url as relative to static path - rel_path = _file.relative_to(self._directory).as_posix() - file_url = 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( - '
'.format( - url=file_url, name=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 - for resource in app.router.resources(): - resource.add_prefix(prefix) - - def add_prefix(self, prefix: str) -> None: - super().add_prefix(prefix) - for resource in self._app.router.resources(): - resource.add_prefix(prefix) - - 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: - if ( - not request.url.raw_path.startswith(self._prefix2) - and request.url.raw_path != self._prefix - ): - 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 __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 " {app!r}>" "".format(app=self._app) - - -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[Any, 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] = {} - - async def resolve(self, request: Request) -> UrlMappingMatchInfo: - method = request.method - allowed_methods: Set[str] = set() - - for resource in self._resources: - match_dict, allowed = await resource.resolve(request) - if match_dict is not None: - return match_dict - else: - allowed_methods |= allowed - - if allowed_methods: - return MatchInfoError(HTTPMethodNotAllowed(method, allowed_methods)) - else: - 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) - - 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(_requote_path(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(value: str) -> str: - return URL.build(path=value, encoded=True).path - - -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/.venv/Lib/site-packages/aiohttp/web_ws.py b/.venv/Lib/site-packages/aiohttp/web_ws.py deleted file mode 100644 index 7833777..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_ws.py +++ /dev/null @@ -1,529 +0,0 @@ -import asyncio -import base64 -import binascii -import hashlib -import json -import sys -from typing import Any, Final, Iterable, Optional, Tuple, cast - -import attr -from multidict import CIMultiDict - -from . import hdrs -from .abc import AbstractStreamWriter -from .helpers import call_later, 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 .log import ws_logger -from .streams import EofStream, FlowControlDataQueue -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 = False - - 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, - ) -> None: - super().__init__(status=101) - self._protocols = protocols - self._ws_protocol: Optional[str] = None - self._writer: Optional[WebSocketWriter] = None - self._reader: Optional[FlowControlDataQueue[WSMessage]] = None - self._closed = False - self._closing = False - self._conn_lost = 0 - self._close_code: Optional[int] = None - self._loop: Optional[asyncio.AbstractEventLoop] = None - self._waiting: Optional[asyncio.Future[bool]] = None - self._exception: Optional[BaseException] = None - self._timeout = timeout - self._receive_timeout = receive_timeout - self._autoclose = autoclose - self._autoping = autoping - self._heartbeat = heartbeat - self._heartbeat_cb: Optional[asyncio.TimerHandle] = None - if heartbeat is not None: - self._pong_heartbeat = heartbeat / 2.0 - self._pong_response_cb: Optional[asyncio.TimerHandle] = None - self._compress = compress - self._max_msg_size = max_msg_size - - def _cancel_heartbeat(self) -> None: - if self._pong_response_cb is not None: - self._pong_response_cb.cancel() - self._pong_response_cb = None - - if self._heartbeat_cb is not None: - self._heartbeat_cb.cancel() - self._heartbeat_cb = None - - def _reset_heartbeat(self) -> None: - self._cancel_heartbeat() - - if self._heartbeat is not None: - assert self._loop is not None - self._heartbeat_cb = call_later( - self._send_heartbeat, - self._heartbeat, - self._loop, - timeout_ceil_threshold=self._req._protocol._timeout_ceil_threshold - if self._req is not None - else 5, - ) - - def _send_heartbeat(self) -> None: - if self._heartbeat is not None and not self._closed: - assert self._loop is not None - # fire-and-forget a task is not perfect but maybe ok for - # sending ping. Otherwise we need a long-living heartbeat - # task in the class. - self._loop.create_task(self._writer.ping()) # type: ignore[union-attr] - - if self._pong_response_cb is not None: - self._pong_response_cb.cancel() - self._pong_response_cb = call_later( - self._pong_not_received, - self._pong_heartbeat, - self._loop, - timeout_ceil_threshold=self._req._protocol._timeout_ceil_threshold - if self._req is not None - else 5, - ) - - def _pong_not_received(self) -> None: - if self._req is not None and self._req.transport is not None: - self._closed = True - self._set_code_close_transport(WSCloseCode.ABNORMAL_CLOSURE) - self._exception = asyncio.TimeoutError() - - 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]", str, bool, 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 = 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( - "Client protocols %r don’t overlap server-known ones %r", - 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, - ) # type: ignore[return-value] - - def _pre_start(self, request: BaseRequest) -> Tuple[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 - ) - - return protocol, writer - - def _post_start( - self, request: BaseRequest, protocol: str, writer: WebSocketWriter - ) -> None: - self._ws_protocol = protocol - self._writer = writer - - self._reset_heartbeat() - - loop = self._loop - assert loop is not None - self._reader = FlowControlDataQueue(request._protocol, 2**16, loop=loop) - request.protocol.set_parser( - WebSocketReader(self._reader, self._max_msg_size, compress=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 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) -> 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.ping(message) - - async def pong(self, message: bytes = b"") -> None: - # unsolicited pong - if self._writer is None: - raise RuntimeError("Call .prepare() first") - await self._writer.pong(message) - - async def send_str(self, data: str, compress: Optional[bool] = 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(data, binary=False, compress=compress) - - async def send_bytes(self, data: bytes, compress: Optional[bool] = 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(data, binary=True, compress=compress) - - async def send_json( - self, - data: Any, - compress: Optional[bool] = 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") - - self._cancel_heartbeat() - reader = self._reader - assert reader is not None - - # we need to break `receive()` cycle first, - # `close()` may be called from different task - if self._waiting is not None and not self._closed: - reader.feed_data(WS_CLOSING_MESSAGE, 0) - await self._waiting - - if self._closed: - return False - - self._closed = True - 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 - - if self._closing: - return True - - reader = self._reader - assert reader is not None - try: - async with async_timeout.timeout(self._timeout): - msg = await reader.read() - 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 - - if msg.type == WSMsgType.CLOSE: - self._set_code_close_transport(msg.data) - return True - - self._set_code_close_transport(WSCloseCode.ABNORMAL_CLOSURE) - self._exception = asyncio.TimeoutError() - return True - - def _set_code_close_transport(self, code: WSCloseCode) -> None: - """Set the close code and close the transport.""" - self._close_code = code - 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") - - loop = self._loop - assert loop is not None - while True: - if self._waiting is not None: - 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 = loop.create_future() - try: - async with async_timeout.timeout(timeout or self._receive_timeout): - msg = await self._reader.read() - self._reset_heartbeat() - finally: - waiter = self._waiting - set_result(waiter, True) - self._waiting = None - except (asyncio.CancelledError, asyncio.TimeoutError): - self._set_code_close_transport(WSCloseCode.ABNORMAL_CLOSURE) - 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._closing = True - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - await self.close() - return WSMessage(WSMsgType.ERROR, exc, None) - - if msg.type == WSMsgType.CLOSE: - self._closing = True - self._close_code = 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 == WSMsgType.CLOSING: - self._closing = True - elif msg.type == WSMsgType.PING and self._autoping: - await self.pong(msg.data) - continue - elif msg.type == 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 != WSMsgType.TEXT: - raise TypeError( - "Received message {}:{!r} is not WSMsgType.TEXT".format( - msg.type, msg.data - ) - ) - return cast(str, msg.data) - - async def receive_bytes(self, *, timeout: Optional[float] = None) -> bytes: - msg = await self.receive(timeout) - if msg.type != WSMsgType.BINARY: - raise TypeError(f"Received message {msg.type}:{msg.data!r} is not bytes") - 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: - if self._reader is not None: - self._reader.set_exception(exc) diff --git a/.venv/Lib/site-packages/aiohttp/worker.py b/.venv/Lib/site-packages/aiohttp/worker.py deleted file mode 100644 index 9b30769..0000000 --- a/.venv/Lib/site-packages/aiohttp/worker.py +++ /dev/null @@ -1,247 +0,0 @@ -"""Async gunicorn worker for aiohttp.web""" - -import asyncio -import os -import re -import signal -import sys -from types import FrameType -from typing import Any, Awaitable, Callable, Optional, Union # noqa - -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 - -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 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/.venv/Lib/site-packages/aiosignal-1.3.1.dist-info/INSTALLER b/.venv/Lib/site-packages/aiosignal-1.3.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/Lib/site-packages/aiosignal-1.3.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/Lib/site-packages/aiosignal-1.3.1.dist-info/LICENSE b/.venv/Lib/site-packages/aiosignal-1.3.1.dist-info/LICENSE deleted file mode 100644 index 7082a2d..0000000 --- a/.venv/Lib/site-packages/aiosignal-1.3.1.dist-info/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 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/.venv/Lib/site-packages/aiosignal-1.3.1.dist-info/METADATA b/.venv/Lib/site-packages/aiosignal-1.3.1.dist-info/METADATA deleted file mode 100644 index fc96452..0000000 --- a/.venv/Lib/site-packages/aiosignal-1.3.1.dist-info/METADATA +++ /dev/null @@ -1,128 +0,0 @@ -Metadata-Version: 2.1 -Name: aiosignal -Version: 1.3.1 -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: 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: 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.7 -Description-Content-Type: text/x-rst -License-File: LICENSE -Requires-Dist: frozenlist (>=1.1.0) - -========= -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 - :target: https://codecov.io/gh/aio-libs/aiosignal - :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 - -The library requires Python 3.6 or newer. - - -Documentation -============= - -https://aiosignal.readthedocs.io/ - -Communication channels -====================== - -*gitter chat* https://gitter.im/aio-libs/Lobby - -Requirements -============ - -- Python >= 3.6 -- frozenlist >= 1.0.0 - -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/.venv/Lib/site-packages/aiosignal-1.3.1.dist-info/RECORD b/.venv/Lib/site-packages/aiosignal-1.3.1.dist-info/RECORD deleted file mode 100644 index 59be23b..0000000 --- a/.venv/Lib/site-packages/aiosignal-1.3.1.dist-info/RECORD +++ /dev/null @@ -1,10 +0,0 @@ -aiosignal-1.3.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -aiosignal-1.3.1.dist-info/LICENSE,sha256=b9UkPpLdf5jsacesN3co50kFcJ_1J6W_mNbQJjwE9bY,11332 -aiosignal-1.3.1.dist-info/METADATA,sha256=c0HRnlYzfXKztZPTFDlPfygizTherhG5WdwXlvco0Ug,4008 -aiosignal-1.3.1.dist-info/RECORD,, -aiosignal-1.3.1.dist-info/WHEEL,sha256=ZL1lC_LiPDNRgDnOl2taCMc83aPEUZgHHv2h-LDgdiM,92 -aiosignal-1.3.1.dist-info/top_level.txt,sha256=z45aNOKGDdrI1roqZY3BGXQ22kJFPHBmVdwtLYLtXC0,10 -aiosignal/__init__.py,sha256=zQNfFYRSd84bswvpFv8ZWjEr5DeYwV3LXbMSyo2222s,867 -aiosignal/__init__.pyi,sha256=xeCddYSS8fZAkz8S4HuKSR2IDe3N7RW_LKcXDPPA1Xk,311 -aiosignal/__pycache__/__init__.cpython-311.pyc,, -aiosignal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/.venv/Lib/site-packages/aiosignal-1.3.1.dist-info/WHEEL b/.venv/Lib/site-packages/aiosignal-1.3.1.dist-info/WHEEL deleted file mode 100644 index 5e1f087..0000000 --- a/.venv/Lib/site-packages/aiosignal-1.3.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.38.2) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/.venv/Lib/site-packages/aiosignal-1.3.1.dist-info/top_level.txt b/.venv/Lib/site-packages/aiosignal-1.3.1.dist-info/top_level.txt deleted file mode 100644 index ac6df3a..0000000 --- a/.venv/Lib/site-packages/aiosignal-1.3.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -aiosignal diff --git a/.venv/Lib/site-packages/aiosignal/__init__.py b/.venv/Lib/site-packages/aiosignal/__init__.py deleted file mode 100644 index 3d288e6..0000000 --- a/.venv/Lib/site-packages/aiosignal/__init__.py +++ /dev/null @@ -1,36 +0,0 @@ -from frozenlist import FrozenList - -__version__ = "1.3.1" - -__all__ = ("Signal",) - - -class Signal(FrozenList): - """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): - super().__init__() - self._owner = owner - - def __repr__(self): - return "".format( - self._owner, self.frozen, list(self) - ) - - async def send(self, *args, **kwargs): - """ - 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) # type: ignore diff --git a/.venv/Lib/site-packages/aiosignal/__init__.pyi b/.venv/Lib/site-packages/aiosignal/__init__.pyi deleted file mode 100644 index d4e3416..0000000 --- a/.venv/Lib/site-packages/aiosignal/__init__.pyi +++ /dev/null @@ -1,12 +0,0 @@ -from typing import Any, Generic, TypeVar - -from frozenlist import FrozenList - -__all__ = ("Signal",) - -_T = TypeVar("_T") - -class Signal(FrozenList[_T], Generic[_T]): - def __init__(self, owner: Any) -> None: ... - def __repr__(self) -> str: ... - async def send(self, *args: Any, **kwargs: Any) -> None: ... diff --git a/.venv/Lib/site-packages/aiosignal/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/aiosignal/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index c57522ec2fc144bfdfaae7a5eab160c1847c2544..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1875 zcmaJ>&2Jk;6rb5$+Z)GeK4>ANQJJD1YBe!RgOG?y2}&rSRuLk!2g@+p?2esH*1KkA zolwV-ET|wz5pY52fkTi=0Oeock4URZjTTjk#04Y{uF?bQi8r%rD^Vk6ci+DE=Ht!# z&HK$SeSKL3t@y`3%+?Y5QyQI?N|eJlK-oeLaA(WM%_>j*BKlOmhP!Hh!N8cu)^rpN%hAf;mK} zP{gg)JXU3XXoYUz7qVFb?c;#hf$uXrBo?tP&s(tUWfBHp#nZ+}T`*$#w}}S{kSYro z11Fgr=OBp187aFQLe+)qS4g|#$LTi}`;#*bbs0~=WQkR<& z1!YQTXt3%tZg=32s7PG`e0U4Q4|ofO7?h;#z<;-6pzR|)T_-v|2BRi!BHE4MAb=0g z<@G2f>NUnAlTz1rLrQrX)&RdDm{*QcYG+XorM71YL8*|NBBb?fVP>jyQ!p+{)}n8f zOS6F;r&XE>9Er(?JXivhMQLW9OkSP{?6>tm#>*rC+5^L+hk-iXrWfLEexEQxE#5_HzT9*YBSG@$Apeudn~KbZ_a2t_@_LA`oq)^F2cvEpe@^T*NBZy;#mLj9)5zZW}ZhWR8~%ABP(lK<*RN}B}~~-0RbHAJZ&wVGTTUs z0W>(;`k-xSDM;}IVd^O;uCBgi2IJp3A4AY Callable: - """ - Create a metadata proxy for packaging information that uses *mod_name* in - its warnings and errors. - """ - - def __getattr__(name: str) -> str: - dunder_to_metadata = { - "__title__": "Name", - "__copyright__": "", - "__version__": "version", - "__version_info__": "version", - "__description__": "summary", - "__uri__": "", - "__url__": "", - "__author__": "", - "__email__": "", - "__license__": "license", - } - if name not in dunder_to_metadata: - msg = f"module {mod_name} has no attribute {name}" - raise AttributeError(msg) - - import sys - import warnings - - if sys.version_info < (3, 8): - from importlib_metadata import metadata - else: - from importlib.metadata import metadata - - if name not in ("__version__", "__version_info__"): - warnings.warn( - f"Accessing {mod_name}.{name} is deprecated and will be " - "removed in a future release. Use importlib.metadata directly " - "to query for attrs's packaging metadata.", - DeprecationWarning, - stacklevel=2, - ) - - meta = metadata("attrs") - if name == "__license__": - return "MIT" - if name == "__copyright__": - return "Copyright (c) 2015 Hynek Schlawack" - if name in ("__uri__", "__url__"): - return meta["Project-URL"].split(" ", 1)[-1] - if name == "__version_info__": - return VersionInfo._from_version_string(meta["version"]) - if name == "__author__": - return meta["Author-email"].rsplit(" ", 1)[0] - if name == "__email__": - return meta["Author-email"].rsplit("<", 1)[1][:-1] - - return meta[dunder_to_metadata[name]] - - return __getattr__ - - -__getattr__ = _make_getattr(__name__) diff --git a/.venv/Lib/site-packages/attr/__init__.pyi b/.venv/Lib/site-packages/attr/__init__.pyi deleted file mode 100644 index 37a2087..0000000 --- a/.venv/Lib/site-packages/attr/__init__.pyi +++ /dev/null @@ -1,555 +0,0 @@ -import enum -import sys - -from typing import ( - Any, - Callable, - Dict, - Generic, - List, - Mapping, - Optional, - Protocol, - Sequence, - Tuple, - Type, - TypeVar, - Union, - 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 - -if sys.version_info >= (3, 10): - from typing import TypeGuard -else: - from typing_extensions import TypeGuard - -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) - -_EqOrderType = Union[bool, Callable[[Any], Any]] -_ValidatorType = Callable[[Any, "Attribute[_T]", _T], Any] -_ConverterType = Callable[[Any], Any] -_FilterType = Callable[["Attribute[_T]", _T], bool] -_ReprType = Callable[[Any], str] -_ReprArgType = Union[bool, _ReprType] -_OnSetAttrType = Callable[[Any, "Attribute[Any]", Any], Any] -_OnSetAttrArgType = Union[ - _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 = Union[_ValidatorType[_T], Sequence[_ValidatorType[_T]]] - -# 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 - -# 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. -if sys.version_info >= (3, 8): - from typing import Literal - @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: ... - -else: - @overload - def Factory(factory: Callable[[], _T]) -> _T: ... - @overload - def Factory( - factory: Union[Callable[[Any], _T], Callable[[], _T]], - takes_self: bool = ..., - ) -> _T: ... - -class Attribute(Generic[_T]): - name: str - default: Optional[_T] - validator: Optional[_ValidatorType[_T]] - repr: _ReprArgType - cmp: _EqOrderType - eq: _EqOrderType - order: _EqOrderType - hash: Optional[bool] - init: bool - converter: Optional[_ConverterType] - metadata: Dict[Any, Any] - type: Optional[Type[_T]] - kw_only: bool - on_setattr: _OnSetAttrType - alias: Optional[str] - - 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: Optional[_EqOrderType] = ..., - hash: Optional[bool] = ..., - init: bool = ..., - metadata: Optional[Mapping[Any, Any]] = ..., - type: None = ..., - converter: None = ..., - factory: None = ..., - kw_only: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - alias: Optional[str] = ..., -) -> Any: ... - -# This form catches an explicit None or no default and infers the type from the -# other arguments. -@overload -def attrib( - default: None = ..., - validator: Optional[_ValidatorArgType[_T]] = ..., - repr: _ReprArgType = ..., - cmp: Optional[_EqOrderType] = ..., - hash: Optional[bool] = ..., - init: bool = ..., - metadata: Optional[Mapping[Any, Any]] = ..., - type: Optional[Type[_T]] = ..., - converter: Optional[_ConverterType] = ..., - factory: Optional[Callable[[], _T]] = ..., - kw_only: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - alias: Optional[str] = ..., -) -> _T: ... - -# This form catches an explicit default argument. -@overload -def attrib( - default: _T, - validator: Optional[_ValidatorArgType[_T]] = ..., - repr: _ReprArgType = ..., - cmp: Optional[_EqOrderType] = ..., - hash: Optional[bool] = ..., - init: bool = ..., - metadata: Optional[Mapping[Any, Any]] = ..., - type: Optional[Type[_T]] = ..., - converter: Optional[_ConverterType] = ..., - factory: Optional[Callable[[], _T]] = ..., - kw_only: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - alias: Optional[str] = ..., -) -> _T: ... - -# This form covers type=non-Type: e.g. forward references (str), Any -@overload -def attrib( - default: Optional[_T] = ..., - validator: Optional[_ValidatorArgType[_T]] = ..., - repr: _ReprArgType = ..., - cmp: Optional[_EqOrderType] = ..., - hash: Optional[bool] = ..., - init: bool = ..., - metadata: Optional[Mapping[Any, Any]] = ..., - type: object = ..., - converter: Optional[_ConverterType] = ..., - factory: Optional[Callable[[], _T]] = ..., - kw_only: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - alias: Optional[str] = ..., -) -> Any: ... -@overload -def field( - *, - default: None = ..., - validator: None = ..., - repr: _ReprArgType = ..., - hash: Optional[bool] = ..., - init: bool = ..., - metadata: Optional[Mapping[Any, Any]] = ..., - converter: None = ..., - factory: None = ..., - kw_only: bool = ..., - eq: Optional[bool] = ..., - order: Optional[bool] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - alias: Optional[str] = ..., - type: Optional[type] = ..., -) -> Any: ... - -# This form catches an explicit None or no default and infers the type from the -# other arguments. -@overload -def field( - *, - default: None = ..., - validator: Optional[_ValidatorArgType[_T]] = ..., - repr: _ReprArgType = ..., - hash: Optional[bool] = ..., - init: bool = ..., - metadata: Optional[Mapping[Any, Any]] = ..., - converter: Optional[_ConverterType] = ..., - factory: Optional[Callable[[], _T]] = ..., - kw_only: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - alias: Optional[str] = ..., - type: Optional[type] = ..., -) -> _T: ... - -# This form catches an explicit default argument. -@overload -def field( - *, - default: _T, - validator: Optional[_ValidatorArgType[_T]] = ..., - repr: _ReprArgType = ..., - hash: Optional[bool] = ..., - init: bool = ..., - metadata: Optional[Mapping[Any, Any]] = ..., - converter: Optional[_ConverterType] = ..., - factory: Optional[Callable[[], _T]] = ..., - kw_only: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - alias: Optional[str] = ..., - type: Optional[type] = ..., -) -> _T: ... - -# This form covers type=non-Type: e.g. forward references (str), Any -@overload -def field( - *, - default: Optional[_T] = ..., - validator: Optional[_ValidatorArgType[_T]] = ..., - repr: _ReprArgType = ..., - hash: Optional[bool] = ..., - init: bool = ..., - metadata: Optional[Mapping[Any, Any]] = ..., - converter: Optional[_ConverterType] = ..., - factory: Optional[Callable[[], _T]] = ..., - kw_only: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - alias: Optional[str] = ..., - type: Optional[type] = ..., -) -> Any: ... -@overload -@dataclass_transform(order_default=True, field_specifiers=(attrib, field)) -def attrs( - maybe_cls: _C, - these: Optional[Dict[str, Any]] = ..., - repr_ns: Optional[str] = ..., - repr: bool = ..., - cmp: Optional[_EqOrderType] = ..., - hash: Optional[bool] = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - auto_detect: bool = ..., - collect_by_mro: bool = ..., - getstate_setstate: Optional[bool] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - field_transformer: Optional[_FieldTransformer] = ..., - match_args: bool = ..., - unsafe_hash: Optional[bool] = ..., -) -> _C: ... -@overload -@dataclass_transform(order_default=True, field_specifiers=(attrib, field)) -def attrs( - maybe_cls: None = ..., - these: Optional[Dict[str, Any]] = ..., - repr_ns: Optional[str] = ..., - repr: bool = ..., - cmp: Optional[_EqOrderType] = ..., - hash: Optional[bool] = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - auto_detect: bool = ..., - collect_by_mro: bool = ..., - getstate_setstate: Optional[bool] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - field_transformer: Optional[_FieldTransformer] = ..., - match_args: bool = ..., - unsafe_hash: Optional[bool] = ..., -) -> Callable[[_C], _C]: ... -@overload -@dataclass_transform(field_specifiers=(attrib, field)) -def define( - maybe_cls: _C, - *, - these: Optional[Dict[str, Any]] = ..., - repr: bool = ..., - unsafe_hash: Optional[bool] = ..., - hash: Optional[bool] = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: Optional[bool] = ..., - order: Optional[bool] = ..., - auto_detect: bool = ..., - getstate_setstate: Optional[bool] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - field_transformer: Optional[_FieldTransformer] = ..., - match_args: bool = ..., -) -> _C: ... -@overload -@dataclass_transform(field_specifiers=(attrib, field)) -def define( - maybe_cls: None = ..., - *, - these: Optional[Dict[str, Any]] = ..., - repr: bool = ..., - unsafe_hash: Optional[bool] = ..., - hash: Optional[bool] = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: Optional[bool] = ..., - order: Optional[bool] = ..., - auto_detect: bool = ..., - getstate_setstate: Optional[bool] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - field_transformer: Optional[_FieldTransformer] = ..., - match_args: bool = ..., -) -> Callable[[_C], _C]: ... - -mutable = define - -@overload -@dataclass_transform(frozen_default=True, field_specifiers=(attrib, field)) -def frozen( - maybe_cls: _C, - *, - these: Optional[Dict[str, Any]] = ..., - repr: bool = ..., - unsafe_hash: Optional[bool] = ..., - hash: Optional[bool] = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: Optional[bool] = ..., - order: Optional[bool] = ..., - auto_detect: bool = ..., - getstate_setstate: Optional[bool] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - field_transformer: Optional[_FieldTransformer] = ..., - match_args: bool = ..., -) -> _C: ... -@overload -@dataclass_transform(frozen_default=True, field_specifiers=(attrib, field)) -def frozen( - maybe_cls: None = ..., - *, - these: Optional[Dict[str, Any]] = ..., - repr: bool = ..., - unsafe_hash: Optional[bool] = ..., - hash: Optional[bool] = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: Optional[bool] = ..., - order: Optional[bool] = ..., - auto_detect: bool = ..., - getstate_setstate: Optional[bool] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - field_transformer: Optional[_FieldTransformer] = ..., - match_args: bool = ..., -) -> 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: Optional[Dict[str, Any]] = ..., - localns: Optional[Dict[str, Any]] = ..., - attribs: Optional[List[Attribute[Any]]] = ..., - 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: Union[List[str], Tuple[str, ...], Dict[str, Any]], - bases: Tuple[type, ...] = ..., - class_body: Optional[Dict[str, Any]] = ..., - repr_ns: Optional[str] = ..., - repr: bool = ..., - cmp: Optional[_EqOrderType] = ..., - hash: Optional[bool] = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - collect_by_mro: bool = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - field_transformer: Optional[_FieldTransformer] = ..., -) -> 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: Optional[_FilterType[Any]] = ..., - dict_factory: Type[Mapping[Any, Any]] = ..., - retain_collection_types: bool = ..., - value_serializer: Optional[ - Callable[[type, Attribute[Any], Any], Any] - ] = ..., - tuple_keys: Optional[bool] = ..., -) -> Dict[str, Any]: ... - -# TODO: add support for returning NamedTuple from the mypy plugin -def astuple( - inst: AttrsInstance, - recurse: bool = ..., - filter: Optional[_FilterType[Any]] = ..., - 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/.venv/Lib/site-packages/attr/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/attr/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index fb2628dd770356cb4be05a46ee4acc0a307429f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4376 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 T+FSG6J=67`=?w`#ZZQ7^6z7p~ diff --git a/.venv/Lib/site-packages/attr/__pycache__/_cmp.cpython-311.pyc b/.venv/Lib/site-packages/attr/__pycache__/_cmp.cpython-311.pyc deleted file mode 100644 index da5b406511e8fa403aca6b170559b6f726468acd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5307 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�W1wP_-63zeHG-M^m^_0? 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

9R~#oKqA6pRLkc#A%pd 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 diff --git a/.venv/Lib/site-packages/attr/__pycache__/_version_info.cpython-311.pyc b/.venv/Lib/site-packages/attr/__pycache__/_version_info.cpython-311.pyc deleted file mode 100644 index a5bd70f0107f55c9bc1026fed45b6457d7442594..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3631 zcmd5;-D@1z6~A|8XSCW~X;)v7RoU&0W!YXK%U(HAv15z2w)|0yh$AN@+l67Yb7gHj zJF~iXR9q>w`YggoS76$BMi1cs0YLm$>C55`YDcV>63 zmE_VwA9^+Wn=|L0IrrQ%zjLm>Xle=}7|DP9lU@!Y^u2hfj)sb`bqj?1$Up`*Q5GjL zMuud_rj(VFvL^@3KvqdASv9F*M6raZYAEoh8tRt~4+021f}cMmbP*ZB1!OcnkU$SV ze>{NOqv`{ye@ZqOp)nK>KNa(F>^3{Lqnnz|49YUr^{3cZH|X5S=S&)xTvc}*mKk>y zapxDV#RINHr(DH*#Z|azJKR+#m_19abZu1-j4Sa4Gy+{U`+DmgcFKQfr@qRrAQ{rjxt+~I5Pf#Y zOQ9h5+dAWv^zlBTTLxj&$uo=SMBB#Gftv9PJn&Q`%2hnRGLZ}>+R#%WK|=`4P@TC- zHe=b|EzN89${EXv%dVU@xr^bN=3*HL@5T7J z)2Vkk)L%-UwDgJ8c{`oYQp@3~bG8AEioDHiQIzmJMotbUK%LK}2BxVsow|}4Pw|XH zkLC3A4gER=A5enFwMsc_87T9C+>G0Pr+Umhap6M6JQ>dL#V0w zql-%yi|1}%xpQR^Z-$!}r*04387f{~dTa5mjY!i+mzFLSf3p@jupT*3iX3 zE$zjt#i@JO?snbl`n+dFe~3RbK8=4C|Le)GrvBFQwey!#U!VFW@y*q5-zdvcEc6Tk z{3xJ|q{h$|tc~jUuYf{iZcFv~k3JA4-YDRgavrg09piV_19pU`$|zt*t;z`1A2Gba z5j9sCx3GboaP$!^`h}qLsq^aBa4CFOS?Ey*Iiz@~d;7+V^mz6it+Z3HCZfQO9?YB#-Yo5bmQ!=(;N)?H)Usn1WQyNprH* z*@GOBmdZGUSP0lC{8mOrXIKre zqhc;D=A=A_<7$#-xo|B=<$ncL)993@&9>I1-_uqZ~99G4&C2iTo2)7hObp&J#}|I2)ZM83{1&6I-sm?(nL zc+3rIng!*nX>Lfog&fhesl0AhW*Riju+vblqHD5l0qp`h1iS{|%5cQ6P9cT8 z+RjpE(l!_o1|FXVh4d!CD)LD0k%cu0t$+~x_+xdErmd?uw9HFwJ!@?}>uo*rSDq-bvJ_I_umN}` zBeiAWx4vRui!xY7H8`v)KPjUc#DYp!8SMstD`Eqq@XvPRMBYj}wrz4IO4wC3q2PX( zQ?#spgZdd1|3>+HKO-d31iXB_2%ho3z%cs-=)`HlR{?XpTisC9$WZn LIk58;Z!7--P?1WD diff --git a/.venv/Lib/site-packages/attr/__pycache__/converters.cpython-311.pyc b/.venv/Lib/site-packages/attr/__pycache__/converters.cpython-311.pyc deleted file mode 100644 index 6643ca5cb554fedd536c724e7368922c6356bd44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4684 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 diff --git a/.venv/Lib/site-packages/attr/__pycache__/filters.cpython-311.pyc b/.venv/Lib/site-packages/attr/__pycache__/filters.cpython-311.pyc deleted file mode 100644 index b29fe4a16228169b8c4f6d06f7e22fd88ade4aae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2872 zcmcgu&u<$=6rTO%*sjymG@)r}%d~-tt=c7RZYFh7**zdoi--UzGP1Y3<7C_Qt~Ikx z+sH*eR7z6y&oH=8-9wqAk?Kc~L;7^Z?CErVJ>X z3ZP;p=8!tHd?8(MYc|s5eRWi%vYb1{BVD&$HZF?d}iebLdYrJ`#zYQ*tasot=~r9=TZ8jobPHfoDLLZ%6N6tKWN(nqD9dxm&0C<l)qF?IgW>T+=orKv zOhPZWoRkw&73mQC_!9FdO+hazA6$;}Je-Fh@u!ALV$otzPM|D`U3800ZrBUjYkQ$q#@Y~MLbO4hxo#f1q$!u6q?#Z{a`3_(*-$~{J58ny* z6x-Qi2QXReB#Yf4Ig{ujSxJQThehJXE5zy0n*~@ASELnruV6LNUU4eHjEB-g`JuQf zu1c$NRRT#%-WQqzh>E!UTc8T>I)>da2|mx$KCh(%W3H}Ky@t6dhd%+to{Oz8G8B^> zKipA3#kQDN8I+$2_f{@|E)(0tj$Q*vssM>0hz1LAISYiEX|XO>N|;5w^zED$r7!Y?Zq=2z{K?QmL zDBQhCfX^k+Kj9Yi!nP(Yp?ao?ZpBK!CWA$4qBU^|)Gj!lplzvgIgs3P*_U~m+lrrx zb=Oyxbh|-(gaG#h;C%<8N#h+v93yTy4u^t-|WqW2GxAO1g{w z5e}owXzRwyXZG&_$FAM|x6CGCiqV2jN9>y5^b< zo8;+v2;y?U<^j5rAPC)rD9CUE0g^~KwS!I$Ufo1e04hZIvygr=lnlAw@kz1QoRh%k6gYj$w(t>&~p5 z#4@TCMXHfFaH+^KC)$XA#z-8j?FA{PN|2*ij0&sALo@WVN6cwTuR`_5x)hP6SYQbik++ z1vC^yV@GiMxOXSY#2sS;rDD}v@fE*V^u59}Qs&el+rIyplf2J}?^&D%b`UT#{tt$e zDI7+vobTn`t=Bl5SY>{dddslxZk7Z3En_~*^%a0143ENlJ`V6ZnBG8n?BEy1F0Nrv zu2l1J0^|F#N9;m@q(NOk8BY`2a|okBnRz7GraiG@7s{0Qc{x|Gc>pF-GcNBiO;UlQ zuJ757L!G51a%aI@G#BJzP6Y#cLkHm_c+VFA{=kQ*rtGSFkq79f9ZbG7Ufup{=45RCbZowHzj6O8Io61s!y&{BfRw^Ugggqs zMZA9@ED3+1CiF59_#v@03jk``BYI@KjV^&vG&J4Rrq~#490-@VRD|LDCcq&IL?U*_ zU`9X3DO`OhRh5~l3}z~Ze3rHKbHBFI9TL)WoIrxQjvdJACh304riq&;Za}te ze$|>n54y}AF<8|`jp1YG>{aVxb@8IDMLvPq$GYW_A2IbeSHEC-F70+J)JKkorJ?iH5#s>>Krn_(>c80~VFnoB#j- diff --git a/.venv/Lib/site-packages/attr/__pycache__/validators.cpython-311.pyc b/.venv/Lib/site-packages/attr/__pycache__/validators.cpython-311.pyc deleted file mode 100644 index a304ae03c569d53d24e162d12fbf1b90e1a0b876..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27904 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 XDGMim8q94wvMjBqZdeKEBnAFIa=atG diff --git a/.venv/Lib/site-packages/attr/_cmp.py b/.venv/Lib/site-packages/attr/_cmp.py deleted file mode 100644 index a4a35e0..0000000 --- a/.venv/Lib/site-packages/attr/_cmp.py +++ /dev/null @@ -1,150 +0,0 @@ -# SPDX-License-Identifier: MIT - - -import functools -import types - -from ._make import _make_ne - - -_operation_names = {"eq": "==", "lt": "<", "le": "<=", "gt": ">", "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. - - :param Optional[callable] eq: `callable` used to evaluate equality of two - objects. - :param Optional[callable] lt: `callable` used to evaluate whether one - object is less than another object. - :param Optional[callable] le: `callable` used to evaluate whether one - object is less than or equal to another object. - :param Optional[callable] gt: `callable` used to evaluate whether one - object is greater than another object. - :param Optional[callable] ge: `callable` used to evaluate whether one - object is greater than or equal to another object. - - :param bool require_same_type: When `True`, equality and ordering methods - will return `NotImplemented` if objects are not of the same type. - - :param Optional[str] class_name: 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__"] = _make_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/.venv/Lib/site-packages/attr/_cmp.pyi b/.venv/Lib/site-packages/attr/_cmp.pyi deleted file mode 100644 index f3dcdc1..0000000 --- a/.venv/Lib/site-packages/attr/_cmp.pyi +++ /dev/null @@ -1,13 +0,0 @@ -from typing import Any, Callable, Optional, Type - -_CompareWithType = Callable[[Any, Any], bool] - -def cmp_using( - eq: Optional[_CompareWithType] = ..., - lt: Optional[_CompareWithType] = ..., - le: Optional[_CompareWithType] = ..., - gt: Optional[_CompareWithType] = ..., - ge: Optional[_CompareWithType] = ..., - require_same_type: bool = ..., - class_name: str = ..., -) -> Type: ... diff --git a/.venv/Lib/site-packages/attr/_compat.py b/.venv/Lib/site-packages/attr/_compat.py deleted file mode 100644 index 46b05ca..0000000 --- a/.venv/Lib/site-packages/attr/_compat.py +++ /dev/null @@ -1,87 +0,0 @@ -# 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_8_PLUS = sys.version_info[:2] >= (3, 8) -PY_3_9_PLUS = sys.version_info[:2] >= (3, 9) -PY310 = sys.version_info[:2] >= (3, 10) -PY_3_12_PLUS = sys.version_info[:2] >= (3, 12) - - -if sys.version_info < (3, 8): - try: - from typing_extensions import Protocol - except ImportError: # pragma: no cover - Protocol = object -else: - from typing import Protocol # noqa: F401 - - -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/.venv/Lib/site-packages/attr/_config.py b/.venv/Lib/site-packages/attr/_config.py deleted file mode 100644 index 9c245b1..0000000 --- a/.venv/Lib/site-packages/attr/_config.py +++ /dev/null @@ -1,31 +0,0 @@ -# SPDX-License-Identifier: MIT - -__all__ = ["set_run_validators", "get_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/.venv/Lib/site-packages/attr/_funcs.py b/.venv/Lib/site-packages/attr/_funcs.py deleted file mode 100644 index a888991..0000000 --- a/.venv/Lib/site-packages/attr/_funcs.py +++ /dev/null @@ -1,483 +0,0 @@ -# SPDX-License-Identifier: MIT - - -import copy - -from ._compat import PY_3_9_PLUS, get_generic_base -from ._make import NOTHING, _obj_setattr, fields -from .exceptions import AttrsAttributeNotFoundError - - -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. - - :param inst: Instance of an *attrs*-decorated class. - :param bool recurse: Recurse into classes that are also - *attrs*-decorated. - :param callable filter: 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. - :param callable dict_factory: A callable to produce dictionaries from. For - example, to produce ordered dictionaries instead of normal Python - dictionaries, pass in ``collections.OrderedDict``. - :param bool retain_collection_types: Do not convert to ``list`` when - encountering an attribute whose type is ``tuple`` or ``set``. Only - meaningful if ``recurse`` is ``True``. - :param Optional[callable] value_serializer: 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. - - :rtype: return type of *dict_factory* - - :raise 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: - if has(v.__class__): - rv[a.name] = asdict( - v, - recurse=True, - filter=filter, - dict_factory=dict_factory, - retain_collection_types=retain_collection_types, - value_serializer=value_serializer, - ) - elif isinstance(v, (tuple, list, set, frozenset)): - cf = v.__class__ 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 isinstance(v, 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. - """ - if getattr(val.__class__, "__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 isinstance(val, (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 isinstance(val, 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. - - :param inst: Instance of an *attrs*-decorated class. - :param bool recurse: Recurse into classes that are also - *attrs*-decorated. - :param callable filter: 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. - :param callable tuple_factory: A callable to produce tuples from. For - example, to produce lists instead of tuples. - :param bool retain_collection_types: Do not convert to ``list`` - or ``dict`` when encountering an attribute which type is - ``tuple``, ``dict`` or ``set``. Only meaningful if ``recurse`` is - ``True``. - - :rtype: return type of *tuple_factory* - - :raise 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 - if recurse is True: - if has(v.__class__): - rv.append( - astuple( - v, - recurse=True, - filter=filter, - tuple_factory=tuple_factory, - retain_collection_types=retain, - ) - ) - elif isinstance(v, (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 isinstance(v, dict): - df = v.__class__ 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. - - :param type cls: Class to introspect. - :raise TypeError: If *cls* is not a class. - - :rtype: 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 - - :param inst: Instance of a class with *attrs* attributes. - :param changes: Keyword changes in the new copy. - - :return: A copy of inst with *changes* incorporated. - - :raise attrs.exceptions.AttrsAttributeNotFoundError: If *attr_name* - couldn't be found on *cls*. - :raise 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`. - """ - 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 evolve(*args, **changes): - """ - Create a new instance, based on the first positional argument with - *changes* applied. - - :param inst: Instance of a class with *attrs* attributes. - :param changes: Keyword changes in the new copy. - - :return: A copy of inst with *changes* incorporated. - - :raise TypeError: If *attr_name* couldn't be found in the class - ``__init__``. - :raise 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. - """ - # Try to get instance by positional argument first. - # Use changes otherwise and warn it'll break. - if args: - try: - (inst,) = args - except ValueError: - msg = f"evolve() takes 1 positional argument, but {len(args)} were given" - raise TypeError(msg) from None - else: - try: - inst = changes.pop("inst") - except KeyError: - msg = "evolve() missing 1 required positional argument: 'inst'" - raise TypeError(msg) from None - - import warnings - - warnings.warn( - "Passing the instance per keyword argument is deprecated and " - "will stop working in, or after, April 2024.", - DeprecationWarning, - stacklevel=2, - ) - - 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) - - -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 `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, e.g. 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. - - :param type cls: Class to resolve. - :param Optional[dict] globalns: Dictionary containing global variables. - :param Optional[dict] localns: Dictionary containing local variables. - :param Optional[list] attribs: 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. - :param bool include_extras: 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. - - :raise TypeError: If *cls* is not a class. - :raise attrs.exceptions.NotAnAttrsClassError: If *cls* is not an *attrs* - class and you didn't pass any attribs. - :raise 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} - - if PY_3_9_PLUS: - kwargs["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/.venv/Lib/site-packages/attr/_make.py b/.venv/Lib/site-packages/attr/_make.py deleted file mode 100644 index 10b4eca..0000000 --- a/.venv/Lib/site-packages/attr/_make.py +++ /dev/null @@ -1,3119 +0,0 @@ -# SPDX-License-Identifier: MIT - -import contextlib -import copy -import enum -import functools -import inspect -import itertools -import linecache -import sys -import types -import typing - -from operator import itemgetter - -# 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 ( - PY310, - PY_3_8_PLUS, - _AnnotationExtractor, - 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_converter_pat = "__attr_converter_%s" -_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() - -_ng_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. -""" - - -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=False, - eq=None, - order=None, - on_setattr=None, - alias=None, -): - """ - Create a new attribute on a class. - - .. warning:: - - Does *not* do anything unless the class is also decorated with `attr.s` - / `attrs.define` / and so on! - - Please consider using `attrs.field` in new code (``attr.ib`` will *never* - go away, though). - - :param 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. - - The default can also be set using decorator notation as shown below. - - .. seealso:: `defaults` - - :param callable factory: Syntactic sugar for - ``default=attr.Factory(factory)``. - - :param validator: `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` - - :type validator: `callable` or a `list` of `callable`\\ s. - - :param repr: 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, i.e. it - will be used directly *instead* of calling ``repr()`` (the default). - :type repr: a `bool` or a `callable` to use a custom function. - - :param eq: 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` - :type eq: a `bool` or a `callable`. - - :param order: 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` - :type order: a `bool` or a `callable`. - - :param cmp: Setting *cmp* is equivalent to setting *eq* and *order* to the - same value. Must not be mixed with *eq* or *order*. - - .. seealso:: `comparison` - :type cmp: a `bool` or a `callable`. - - :param bool | None hash: 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` - :param bool init: 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` - :param callable converter: `callable` that is called by *attrs*-generated - ``__init__`` methods to convert attribute's value to the desired - format. It is given the passed-in value, and 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` - :param dict | None metadata: An arbitrary mapping, to be used by - third-party components. See `extending-metadata`. - - :param 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 backward compatibility. 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 `. - :param bool kw_only: Make this attribute keyword-only in the generated - ``__init__`` (if ``init`` is ``False``, this parameter is ignored). - :param on_setattr: 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 `attr.s`. - :type on_setattr: `callable`, or a list of callables, or `None`, or - `attrs.setters.NO_OP` - :param str | None alias: 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:: 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* - """ - 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, globs, locs=None, filename=""): - """ - "Exec" the script with the given global (globs) and local (locs) variables. - """ - bytecode = compile(script, filename, "exec") - eval(bytecode, globs, locs) - - -def _make_method(name, script, filename, globs): - """ - Create the method with the script given and return the method object. - """ - locs = {} - - # 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[name] - - -def _make_attr_tuple_class(cls_name, attr_names): - """ - 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" - attr_class_template = [ - f"class {attr_class_name}(tuple):", - " __slots__ = ()", - ] - if attr_names: - for i, attr_name in enumerate(attr_names): - attr_class_template.append( - f" {attr_name} = _attrs_property(_attrs_itemgetter({i}))" - ) - else: - attr_class_template.append(" pass") - globs = {"_attrs_itemgetter": itemgetter, "_attrs_property": property} - _compile_and_eval("\n".join(attr_class_template), globs) - return globs[attr_class_name] - - -# Tuple class for extracted attributes from a class definition. -# `base_attrs` is a subset of `attrs`. -_Attributes = _make_attr_tuple_class( - "_Attributes", - [ - # all attributes to build dunder methods for - "attrs", - # attributes that have been inherited - "base_attrs", - # map inherited attributes to their originating classes - "base_attrs_map", - ], -) - - -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). - """ - attr = getattr(cls, attrib_name, _sentinel) - if attr is _sentinel: - return False - - for base_cls in cls.__mro__[1:]: - a = getattr(base_cls, attrib_name, None) - if attr is a: - return False - - return True - - -def _get_annotations(cls): - """ - Get annotations for *cls*. - """ - if _has_own_attribute(cls, "__annotations__"): - return cls.__annotations__ - - return {} - - -def _collect_base_attrs(cls, taken_attr_names): - """ - 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 -): - """ - 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. - - *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 isinstance(attr, _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 not isinstance(a, _CountingAttr): - a = attrib() if a is NOTHING else attrib(default=a) - ca_list.append((attr_name, a)) - - unannotated = ca_names - annot_names - if len(unannotated) > 0: - 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 isinstance(attr, _CountingAttr) - ), - key=lambda e: e[1].counter, - ) - - own_attrs = [ - Attribute.from_counting_attr( - name=attr_name, ca=ca, type=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: - 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 - - # 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 - - if field_transformer is not None: - attrs = field_transformer(cls, attrs) - - # Resolve default field alias after executing field_transformer. - # This allows field_transformer to differentiate between explicit vs - # default aliases and supply their own defaults. - attrs = [ - a.evolve(alias=_default_init_alias_for(a.name)) if not a.alias else a - for a in attrs - ] - - # 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():", - " __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( - [ - " if hasattr(super(), '__getattr__'):", - " 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()", - ] - ) - - unique_filename = _generate_unique_filename(cls, "getattr") - - glob = { - "cached_properties": cached_properties, - "_cached_setattr_get": _obj_setattr.__get__, - "_cls": cls, - "original_getattr": original_getattr, - } - - return _make_method( - "__getattr__", - "\n".join(lines), - unique_filename, - glob, - ) - - -def _frozen_setattrs(self, name, value): - """ - Attached to frozen classes as __setattr__. - """ - if isinstance(self, BaseException) and name in ( - "__cause__", - "__context__", - "__traceback__", - ): - BaseException.__setattr__(self, name, value) - return - - raise FrozenInstanceError() - - -def _frozen_delattrs(self, name): - """ - Attached to frozen classes as __delattr__. - """ - raise FrozenInstanceError() - - -class _ClassBuilder: - """ - Iteratively build *one* class. - """ - - __slots__ = ( - "_attr_names", - "_attrs", - "_base_attr_map", - "_base_names", - "_cache_hash", - "_cls", - "_cls_dict", - "_delete_attribs", - "_frozen", - "_has_pre_init", - "_pre_init_has_args", - "_has_post_init", - "_is_exc", - "_on_setattr", - "_slots", - "_weakref_slot", - "_wrote_own_setattr", - "_has_custom_setattr", - ) - - def __init__( - self, - cls, - these, - slots, - frozen, - weakref_slot, - getstate_setstate, - auto_attribs, - kw_only, - cache_hash, - is_exc, - collect_by_mro, - on_setattr, - has_custom_setattr, - field_transformer, - ): - attrs, base_attrs, base_map = _transform_attrs( - cls, - these, - auto_attribs, - kw_only, - collect_by_mro, - field_transformer, - ) - - self._cls = cls - self._cls_dict = dict(cls.__dict__) if slots 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 = slots - self._frozen = frozen - self._weakref_slot = weakref_slot - self._cache_hash = cache_hash - 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 = is_exc - self._on_setattr = on_setattr - - self._has_custom_setattr = has_custom_setattr - self._wrote_own_setattr = False - - self._cls_dict["__attrs_attrs__"] = self._attrs - - if frozen: - self._cls_dict["__setattr__"] = _frozen_setattrs - self._cls_dict["__delattr__"] = _frozen_delattrs - - self._wrote_own_setattr = True - elif on_setattr in ( - _ng_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 ( - ( - on_setattr == _ng_default_on_setattr - and not (has_validator or has_converter) - ) - or (on_setattr == setters.validate and not has_validator) - or (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 getstate_setstate: - ( - self._cls_dict["__getstate__"], - self._cls_dict["__setstate__"], - ) = self._make_getstate_setstate() - - def __repr__(self): - return f"<_ClassBuilder(cls={self._cls.__name__})>" - - if PY310: - import abc - - def build_class(self): - """ - Finalize class based on the accumulated configuration. - - Builder cannot be used after calling this method. - """ - if self._slots is True: - return self._create_slots_class() - - return self.abc.update_abstractmethods( - self._patch_original_class() - ) - - else: - - def build_class(self): - """ - Finalize class based on the accumulated configuration. - - Builder cannot be used after calling this method. - """ - if self._slots is True: - return self._create_slots_class() - - return self._patch_original_class() - - 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__") - } - - # 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__",) - - if PY_3_8_PLUS: - cached_properties = { - name: cached_property.func - for name, cached_property in cd.items() - if isinstance(cached_property, functools.cached_property) - } - else: - # `functools.cached_property` was introduced in 3.8. - # So can't be used before this. - cached_properties = {} - - # 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: - # Add cached properties to names for slotting. - names += tuple(cached_properties.keys()) - - for name in cached_properties: - # Clear out function from class to avoid clashing. - del cd[name] - - class_annotations = _get_annotations(self._cls) - for name, func in cached_properties.items(): - 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): - self._cls_dict["__repr__"] = self._add_method_dunders( - _make_repr(self._attrs, ns, self._cls) - ) - return self - - def add_str(self): - repr = self._cls_dict.get("__repr__") - if repr is None: - 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): - self._cls_dict["__hash__"] = self._add_method_dunders( - _make_hash( - self._cls, - self._attrs, - frozen=self._frozen, - cache_hash=self._cache_hash, - ) - ) - - return self - - def add_init(self): - self._cls_dict["__init__"] = self._add_method_dunders( - _make_init( - 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, - ) - ) - - 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): - self._cls_dict["__attrs_init__"] = self._add_method_dunders( - _make_init( - 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, - ) - ) - - return self - - def add_eq(self): - cd = self._cls_dict - - cd["__eq__"] = self._add_method_dunders( - _make_eq(self._cls, self._attrs) - ) - cd["__ne__"] = self._add_method_dunders(_make_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): - if self._frozen: - return 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(self, method): - """ - 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__ = ( - "Method generated by attrs for class " - f"{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, -): - r""" - A class decorator that adds :term:`dunder methods` according to the - specified attributes using `attr.ib` or the *these* argument. - - Please consider using `attrs.define` / `attrs.frozen` in new code - (``attr.s`` will *never* go away, though). - - :param these: A dictionary of name to `attr.ib` mappings. This is useful - to avoid the definition of your attributes within the class body - because you can't (e.g. 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*. - - :type these: `dict` of `str` to `attr.ib` - - :param str repr_ns: When using nested classes, there's no way in Python 2 - to automatically detect that. Therefore it's possible to set the - namespace explicitly for a more meaningful ``repr`` output. - :param bool auto_detect: Instead of setting the *init*, *repr*, *eq*, - *order*, 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 (i.e. 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). - - .. warning:: - - If you prevent *attrs* from creating the ordering methods for you - (``order=False``, e.g. by implementing ``__le__``), it becomes - *your* responsibility to make sure its ordering is sound. The best - way is to use the `functools.total_ordering` decorator. - - - Passing ``True`` or ``False`` to *init*, *repr*, *eq*, *order*, *cmp*, - or *hash* overrides whatever *auto_detect* would determine. - - :param bool repr: Create a ``__repr__`` method with a human readable - representation of *attrs* attributes.. - :param bool str: Create a ``__str__`` method that is identical to - ``__repr__``. This is usually not necessary except for `Exception`\ s. - :param bool | None eq: If ``True`` or ``None`` (default), add ``__eq__`` - and ``__ne__`` methods that check two instances for equality. - - They compare the instances as if they were tuples of their *attrs* - attributes if and only if the types of both classes are *identical*! - - .. seealso:: `comparison` - :param bool | None order: If ``True``, add ``__lt__``, ``__le__``, - ``__gt__``, and ``__ge__`` methods that behave like *eq* above and - allow instances to be ordered. If ``None`` (default) mirror value of - *eq*. - - .. seealso:: `comparison` - :param bool | None cmp: Setting *cmp* is equivalent to setting *eq* and - *order* to the same value. Must not be mixed with *eq* or *order*. - - .. seealso:: `comparison` - :param bool | None unsafe_hash: 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 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 (e.g. 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. - - :param bool | None hash: Alias for *unsafe_hash*. *unsafe_hash* takes - precedence. - :param bool init: Create a ``__init__`` method that initializes the *attrs* - attributes. Leading underscores are stripped for the argument name. If - a ``__attrs_pre_init__`` method exists on the class, it will be called - before the class is initialized. If a ``__attrs_post_init__`` method - exists on the class, it will be called after the class is fully - initialized. - - If ``init`` is ``False``, an ``__attrs_init__`` method will be injected - instead. This allows you to define a custom ``__init__`` method that - can do pre-init work such as ``super().__init__()``, and then call - ``__attrs_init__()`` and ``__attrs_post_init__()``. - - .. seealso:: `init` - :param bool slots: 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 `. - :param bool frozen: 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. - - :param bool weakref_slot: Make instances weak-referenceable. This has no - effect unless ``slots`` is also enabled. - :param bool auto_attribs: If ``True``, collect :pep:`526`-annotated - attributes from the class body. - - In this case, you **must** annotate every field. If *attrs* encounters - a field that is set to an `attr.ib` but lacks a type annotation, an - `attr.exceptions.UnannotatedAttributeError` is raised. Use - ``field_name: typing.Any = attr.ib(...)`` if you don't want to set a - type. - - If you assign a value to those attributes (e.g. ``x: int = 42``), that - value becomes the default value like if it were passed using - ``attr.ib(default=42)``. Passing an instance of `attrs.Factory` also - works as expected in most cases (see warning below). - - Attributes annotated as `typing.ClassVar`, and attributes that are - neither annotated nor set to an `attr.ib` are **ignored**. - - .. warning:: - For features that use the attribute name to create decorators (e.g. - :ref:`validators `), you still *must* assign `attr.ib` - to them. Otherwise Python will either not find the name or try to - use the default value to call e.g. ``validator`` on it. - - These errors can be quite confusing and probably the most common bug - report on our bug tracker. - - :param bool kw_only: Make all attributes keyword-only in the generated - ``__init__`` (if ``init`` is ``False``, this parameter is ignored). - :param bool cache_hash: 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. - :param bool auto_exc: If the class subclasses `BaseException` (which - implicitly includes any subclass of any exception), the following - happens to behave like a well-behaved Python exceptions class: - - - the values for *eq*, *order*, and *hash* are ignored and the - instances compare and hash by the instance's ids (N.B. *attrs* will - *not* remove existing implementations of ``__hash__`` or the equality - methods. It just won't add own ones.), - - 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. - :param bool collect_by_mro: Setting this to `True` fixes the way *attrs* - collects attributes from base classes. The default behavior is - incorrect in certain cases of multiple inheritance. It should be on by - default but is kept off for backward-compatibility. - - .. seealso:: - Issue `#428 `_ - - :param bool | None getstate_setstate: - .. 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 (i.e. not inherited), it is set to `False` (this is usually - what you want). - - :param on_setattr: 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`. - :type on_setattr: `callable`, or a list of callables, or `None`, or - `attrs.setters.NO_OP` - - :param callable | None field_transformer: - A function that is called with the original class object and all fields - right before *attrs* finalizes the class. You can use this, e.g., to - automatically add converters or validators to fields based on their - types. - - .. seealso:: `transform-fields` - - :param bool match_args: - 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. - - .. 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). - """ - 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): - 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) - - builder = _ClassBuilder( - cls, - these, - slots, - is_frozen, - weakref_slot, - _determine_whether_to_implement( - cls, - getstate_setstate, - auto_detect, - ("__getstate__", "__setstate__"), - default=slots, - ), - auto_attribs, - kw_only, - cache_hash, - is_exc, - collect_by_mro, - on_setattr, - has_own_setattr, - field_transformer, - ) - if _determine_whether_to_implement( - cls, repr, auto_detect, ("__repr__",) - ): - builder.add_repr(repr_ns) - if str is True: - builder.add_str() - - eq = _determine_whether_to_implement( - cls, eq_, auto_detect, ("__eq__", "__ne__") - ) - if not is_exc and eq is True: - builder.add_eq() - if not is_exc and _determine_whether_to_implement( - cls, order_, auto_detect, ("__lt__", "__le__", "__gt__", "__ge__") - ): - builder.add_order() - - builder.add_setattr() - - nonlocal hash - if ( - hash is None - and auto_detect is True - and _has_own_attribute(cls, "__hash__") - ): - hash = False - - if hash is not True and hash is not False and hash is not None: - # Can't use `hash in` because 1 == True for example. - msg = "Invalid value for hash. Must be True, False, or None." - raise TypeError(msg) - - if hash is False or (hash is None and eq is False) or is_exc: - # Don't do anything. Should fall back to __object__'s __hash__ - # which is by id. - if cache_hash: - msg = "Invalid value for cache_hash. To use hash caching, hashing must be either explicitly or implicitly enabled." - raise TypeError(msg) - elif hash is True or ( - hash is None and eq is True and is_frozen is True - ): - # Build a __hash__ if told so, or if it's safe. - builder.add_hash() - else: - # Raise TypeError on attempts to hash. - if cache_hash: - msg = "Invalid value for cache_hash. To use hash caching, hashing must be either explicitly or implicitly enabled." - raise TypeError(msg) - builder.make_unhashable() - - if _determine_whether_to_implement( - cls, init, auto_detect, ("__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 ( - PY310 - 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, func_name): - """ - Create a "filename" suitable for a function being generated. - """ - return ( - f"" - ) - - -def _make_hash(cls, attrs, frozen, cache_hash): - attrs = tuple( - a for a in attrs if a.hash is True or (a.hash is None and a.eq is True) - ) - - tab = " " - - unique_filename = _generate_unique_filename(cls, "hash") - type_hash = hash(unique_filename) - # 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 _make_method("__hash__", script, unique_filename, globs) - - -def _add_hash(cls, attrs): - """ - Add a hash method to *cls*. - """ - cls.__hash__ = _make_hash(cls, attrs, frozen=False, cache_hash=False) - return cls - - -def _make_ne(): - """ - Create __ne__ method. - """ - - 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 - - return __ne__ - - -def _make_eq(cls, attrs): - """ - Create __eq__ method for *cls* with *attrs*. - """ - attrs = [a for a in attrs if a.eq] - - unique_filename = _generate_unique_filename(cls, "eq") - lines = [ - "def __eq__(self, other):", - " if other.__class__ is not self.__class__:", - " return NotImplemented", - ] - - # We can't just do a big self.x = other.x and... clause due to - # irregularities like nan == nan is false but (nan,) == (nan,) is true. - globs = {} - if attrs: - lines.append(" return (") - others = [" ) == ("] - 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}),") - others.append(f" {cmp_name}(other.{a.name}),") - else: - lines.append(f" self.{a.name},") - others.append(f" other.{a.name},") - - lines += [*others, " )"] - else: - lines.append(" return True") - - script = "\n".join(lines) - - return _make_method("__eq__", script, unique_filename, 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__ - - cls.__eq__ = _make_eq(cls, attrs) - cls.__ne__ = _make_ne() - - return cls - - -def _make_repr(attrs, ns, cls): - unique_filename = _generate_unique_filename(cls, "repr") - # 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 _make_method( - "__repr__", "\n".join(lines), unique_filename, globs=globs - ) - - -def _add_repr(cls, ns=None, attrs=None): - """ - Add a repr method to *cls*. - """ - if attrs is None: - attrs = cls.__attrs_attrs__ - - cls.__repr__ = _make_repr(attrs, ns, cls) - 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). - - :param type cls: Class to introspect. - - :raise TypeError: If *cls* is not a class. - :raise attrs.exceptions.NotAnAttrsClassError: If *cls* is not an *attrs* - class. - - :rtype: 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. - - :param type cls: Class to introspect. - - :raise TypeError: If *cls* is not a class. - :raise attrs.exceptions.NotAnAttrsClassError: If *cls* is not an *attrs* - class. - - :rtype: dict - - .. 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. - - :param 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_cls(cls): - return "__slots__" in cls.__dict__ - - -def _is_slot_attr(a_name, base_attr_map): - """ - Check if the attribute name comes from a slot class. - """ - return a_name in base_attr_map and _is_slot_cls(base_attr_map[a_name]) - - -def _make_init( - cls, - attrs, - pre_init, - pre_init_has_args, - post_init, - frozen, - slots, - cache_hash, - base_attr_map, - is_exc, - cls_on_setattr, - attrs_init, -): - 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 - - unique_filename = _generate_unique_filename(cls, "init") - - 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 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__ - - init = _make_method( - "__attrs_init__" if attrs_init else "__init__", - script, - unique_filename, - globs, - ) - init.__annotations__ = annotations - - return init - - -def _setattr(attr_name, value_var, has_on_setattr): - """ - 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, value_var, has_on_setattr): - """ - Use the cached object.setattr to set *attr_name* to *value_var*, but run - its converter first. - """ - return "_setattr('%s', %s(%s))" % ( - attr_name, - _init_converter_pat % (attr_name,), - value_var, - ) - - -def _assign(attr_name, value, has_on_setattr): - """ - 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, value_var, has_on_setattr): - """ - 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) - - return "self.%s = %s(%s)" % ( - attr_name, - _init_converter_pat % (attr_name,), - value_var, - ) - - -def _attrs_to_init_script( - 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, -): - """ - Return a script of an initializer for *attrs* and a dict of globals. - - The globals are expected by the generated script. - - If *frozen* is True, we cannot set the attributes directly so we use - a cached ``object.__setattr__``. - """ - lines = [] - if pre_init: - lines.append("self.__attrs_pre_init__()") - - if needs_cached_setattr: - lines.append( - # Circumvent the __setattr__ descriptor to save one lookup per - # assignment. - # Note _setattr will be used again below if cache_hash is True - "_setattr = _cached_setattr_get(self)" - ) - - if frozen is True: - if slots is True: - fmt_setter = _setattr - fmt_setter_with_converter = _setattr_with_converter - else: - # 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 - lines.append("_inst_dict = self.__dict__") - - def fmt_setter(attr_name, value_var, has_on_setattr): - 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, value_var, has_on_setattr - ): - if has_on_setattr or _is_slot_attr(attr_name, base_attr_map): - return _setattr_with_converter( - attr_name, value_var, has_on_setattr - ) - - return "_inst_dict['%s'] = %s(%s)" % ( - attr_name, - _init_converter_pat % (attr_name,), - value_var, - ) - - else: - # Not frozen. - fmt_setter = _assign - fmt_setter_with_converter = _assign_with_converter - - args = [] - kw_only_args = [] - 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.init is False: - if has_factory: - init_factory_name = _init_factory_pat % (a.name,) - if a.converter is not None: - lines.append( - fmt_setter_with_converter( - attr_name, - init_factory_name + f"({maybe_self})", - has_on_setattr, - ) - ) - conv_name = _init_converter_pat % (a.name,) - names_for_globals[conv_name] = a.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 a.converter is not None: - lines.append( - fmt_setter_with_converter( - attr_name, - f"attr_dict['{attr_name}'].default", - has_on_setattr, - ) - ) - conv_name = _init_converter_pat % (a.name,) - names_for_globals[conv_name] = a.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) - - if a.converter is not None: - lines.append( - fmt_setter_with_converter( - attr_name, arg_name, has_on_setattr - ) - ) - names_for_globals[ - _init_converter_pat % (a.name,) - ] = a.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) - lines.append(f"if {arg_name} is not NOTHING:") - - init_factory_name = _init_factory_pat % (a.name,) - if a.converter is not None: - lines.append( - " " - + fmt_setter_with_converter( - attr_name, arg_name, has_on_setattr - ) - ) - lines.append("else:") - lines.append( - " " - + fmt_setter_with_converter( - attr_name, - init_factory_name + "(" + maybe_self + ")", - has_on_setattr, - ) - ) - names_for_globals[ - _init_converter_pat % (a.name,) - ] = a.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) - - if a.converter is not None: - lines.append( - fmt_setter_with_converter( - attr_name, arg_name, has_on_setattr - ) - ) - names_for_globals[ - _init_converter_pat % (a.name,) - ] = a.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 a.converter is None: - annotations[arg_name] = a.type - elif a.converter is not None: - # Try to get the type from the converter. - t = _AnnotationExtractor(a.converter).get_first_param_type() - if t: - annotations[arg_name] = t - - 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 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 cache_hash: - if frozen: - if slots: # noqa: SIM108 - # if frozen and slots, then _setattr defined above - init_hash_cache = "_setattr('%s', %s)" - else: - # if frozen and not slots, then _inst_dict defined above - init_hash_cache = "_inst_dict['%s'] = %s" - else: - init_hash_cache = "self.%s = %s" - lines.append(init_hash_cache % (_hash_cache_field, "None")) - - # 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 = args - if kw_only_args: - args += "%s*, %s" % ( - ", " if args else "", # leading comma - ", ".join(kw_only_args), # kw_only args - ) - pre_init_kw_only_args = ", ".join( - ["%s=%s" % (kw_arg, kw_arg) for kw_arg in kw_only_args] - ) - pre_init_args += ( - ", " if pre_init_args else "" - ) # handle only kwargs and no regular args - pre_init_args += pre_init_kw_only_args - - if pre_init and pre_init_has_args: - # If pre init method has arguments, pass same arguments as `__init__` - lines[0] = "self.__attrs_pre_init__(%s)" % pre_init_args - - return ( - "def %s(self, %s):\n %s\n" - % ( - ("__attrs_init__" if attrs_init else "__init__"), - args, - "\n ".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`. - """ - - __slots__ = ( - "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, ca, type=None): - # type holds the annotated value. deal with conflicts: - if type is None: - type = ca.type - elif ca.type is not None: - msg = "Type annotation and type argument cannot both be present" - raise ValueError(msg) - inst_dict = { - k: getattr(ca, k) - for k in Attribute.__slots__ - if k - not in ( - "name", - "validator", - "default", - "type", - "inherited", - ) # exclude methods and deprecated alias - } - return cls( - name=name, - validator=ca._validator, - default=ca._default, - type=type, - cmp=None, - inherited=False, - **inst_dict, - ) - - # 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 `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__ = ( - "counter", - "_default", - "repr", - "eq", - "eq_key", - "order", - "order_key", - "hash", - "init", - "metadata", - "_validator", - "converter", - "type", - "kw_only", - "on_setattr", - "alias", - ) - __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 Factory: - """ - Stores a factory callable. - - If passed as the default value to `attrs.field`, the factory is used to - generate a new value. - - :param callable factory: A callable that takes either none or exactly one - mandatory positional argument depending on *takes_self*. - :param bool takes_self: 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) - - -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*. - - :param str name: The name for the new class. - - :param attrs: 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. - :type attrs: `list` or `dict` - - :param tuple bases: Classes that the new class will subclass. - - :param dict class_body: An optional dictionary of class attributes for the new class. - - :param attributes_arguments: Passed unmodified to `attr.s`. - - :return: A new class with *attrs*. - :rtype: type - - .. versionadded:: 17.1.0 *bases* - .. versionchanged:: 18.1.0 If *attrs* is ordered, the order is retained. - .. versionchanged:: 23.2.0 *class_body* - """ - 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, - ) - - return _attrs(these=cls_dict, **attributes_arguments)(type_) - - -# These are required by within this module so we define them here and merely -# import into .validators / .converters. - - -@attrs(slots=True, 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. - - :param callables validators: 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. - - :param callables converters: Arbitrary number of converters. - - .. versionadded:: 20.1.0 - """ - - def pipe_converter(val): - for converter in converters: - val = converter(val) - - return val - - if not converters: - # If the converter list is empty, pipe_converter is the identity. - A = typing.TypeVar("A") - pipe_converter.__annotations__ = {"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 - - # Get return type from last converter. - rt = _AnnotationExtractor(converters[-1]).get_return_type() - if rt: - pipe_converter.__annotations__["return"] = rt - - return pipe_converter diff --git a/.venv/Lib/site-packages/attr/_next_gen.py b/.venv/Lib/site-packages/attr/_next_gen.py deleted file mode 100644 index 1fb9f25..0000000 --- a/.venv/Lib/site-packages/attr/_next_gen.py +++ /dev/null @@ -1,229 +0,0 @@ -# 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 ( - NOTHING, - _frozen_setattrs, - _ng_default_on_setattr, - attrib, - attrs, -) -from .exceptions import 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, -): - r""" - Define an *attrs* class. - - Differences to the classic `attr.s` that it uses underneath: - - - 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* - - .. caution:: - - 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* - - Some options that were only relevant on Python 2 or were kept around for - backwards-compatibility have been removed. - - Please note that these are all defaults and you can change them as you - wish. - - :param Optional[bool] auto_attribs: If set to `True` or `False`, it behaves - exactly like `attr.s`. If left `None`, `attr.s` will try to guess: - - 1. If any attributes are annotated and no unannotated `attrs.fields`\ s - are found, it assumes *auto_attribs=True*. - 2. Otherwise it assumes *auto_attribs=False* and tries to collect - `attrs.fields`\ s. - - For now, please refer to `attr.s` for the rest of the parameters. - - .. 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). - """ - - 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, - ) - - 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 = _ng_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=False, - eq=None, - order=None, - on_setattr=None, - alias=None, -): - """ - Identical to `attr.ib`, except keyword-only and with some arguments - removed. - - .. versionadded:: 23.1.0 - The *type* parameter has been re-added; mostly for `attrs.make_class`. - Please note that type checkers ignore this metadata. - .. versionadded:: 20.1.0 - """ - 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 - ) diff --git a/.venv/Lib/site-packages/attr/_typing_compat.pyi b/.venv/Lib/site-packages/attr/_typing_compat.pyi deleted file mode 100644 index ca7b71e..0000000 --- a/.venv/Lib/site-packages/attr/_typing_compat.pyi +++ /dev/null @@ -1,15 +0,0 @@ -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/.venv/Lib/site-packages/attr/_version_info.py b/.venv/Lib/site-packages/attr/_version_info.py deleted file mode 100644 index 51a1312..0000000 --- a/.venv/Lib/site-packages/attr/_version_info.py +++ /dev/null @@ -1,86 +0,0 @@ -# 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 diff --git a/.venv/Lib/site-packages/attr/_version_info.pyi b/.venv/Lib/site-packages/attr/_version_info.pyi deleted file mode 100644 index 45ced08..0000000 --- a/.venv/Lib/site-packages/attr/_version_info.pyi +++ /dev/null @@ -1,9 +0,0 @@ -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/.venv/Lib/site-packages/attr/converters.py b/.venv/Lib/site-packages/attr/converters.py deleted file mode 100644 index 2bf4c90..0000000 --- a/.venv/Lib/site-packages/attr/converters.py +++ /dev/null @@ -1,144 +0,0 @@ -# SPDX-License-Identifier: MIT - -""" -Commonly useful converters. -""" - - -import typing - -from ._compat import _AnnotationExtractor -from ._make import NOTHING, 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. - - :param callable converter: the converter that is used for non-``None`` - values. - - .. versionadded:: 17.1.0 - """ - - 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] - - 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*. - - :param default: Value to be used if ``None`` is passed. Passing an instance - of `attrs.Factory` is supported, however the ``takes_self`` option - is *not*. - :param callable factory: A callable that takes no parameters whose result - is used if ``None`` is passed. - - :raises TypeError: If **neither** *default* or *factory* is passed. - :raises TypeError: If **both** *default* and *factory* are passed. - :raises 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 (e.g., from env. vars.) to real booleans. - - Values mapping to :code:`True`: - - - :code:`True` - - :code:`"true"` / :code:`"t"` - - :code:`"yes"` / :code:`"y"` - - :code:`"on"` - - :code:`"1"` - - :code:`1` - - Values mapping to :code:`False`: - - - :code:`False` - - :code:`"false"` / :code:`"f"` - - :code:`"no"` / :code:`"n"` - - :code:`"off"` - - :code:`"0"` - - :code:`0` - - :raises ValueError: for any other value. - - .. versionadded:: 21.3.0 - """ - if isinstance(val, str): - val = val.lower() - truthy = {True, "true", "t", "yes", "y", "on", "1", 1} - falsy = {False, "false", "f", "no", "n", "off", "0", 0} - try: - if val in truthy: - return True - if val in falsy: - return False - except TypeError: - # Raised when "val" is not hashable (e.g., lists) - pass - msg = f"Cannot convert value to bool: {val}" - raise ValueError(msg) diff --git a/.venv/Lib/site-packages/attr/converters.pyi b/.venv/Lib/site-packages/attr/converters.pyi deleted file mode 100644 index 5abb49f..0000000 --- a/.venv/Lib/site-packages/attr/converters.pyi +++ /dev/null @@ -1,13 +0,0 @@ -from typing import Callable, TypeVar, overload - -from . import _ConverterType - -_T = TypeVar("_T") - -def pipe(*validators: _ConverterType) -> _ConverterType: ... -def optional(converter: _ConverterType) -> _ConverterType: ... -@overload -def default_if_none(default: _T) -> _ConverterType: ... -@overload -def default_if_none(*, factory: Callable[[], _T]) -> _ConverterType: ... -def to_bool(val: str) -> bool: ... diff --git a/.venv/Lib/site-packages/attr/exceptions.py b/.venv/Lib/site-packages/attr/exceptions.py deleted file mode 100644 index 3b7abb8..0000000 --- a/.venv/Lib/site-packages/attr/exceptions.py +++ /dev/null @@ -1,95 +0,0 @@ -# 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/.venv/Lib/site-packages/attr/exceptions.pyi b/.venv/Lib/site-packages/attr/exceptions.pyi deleted file mode 100644 index f268011..0000000 --- a/.venv/Lib/site-packages/attr/exceptions.pyi +++ /dev/null @@ -1,17 +0,0 @@ -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/.venv/Lib/site-packages/attr/filters.py b/.venv/Lib/site-packages/attr/filters.py deleted file mode 100644 index a1e40c9..0000000 --- a/.venv/Lib/site-packages/attr/filters.py +++ /dev/null @@ -1,66 +0,0 @@ -# SPDX-License-Identifier: MIT - -""" -Commonly useful filters for `attr.asdict`. -""" - -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): - """ - Include *what*. - - :param what: What to include. - :type what: `list` of classes `type`, field names `str` or - `attrs.Attribute`\\ s - - :rtype: `callable` - - .. 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): - """ - Exclude *what*. - - :param what: What to exclude. - :type what: `list` of classes `type`, field names `str` or - `attrs.Attribute`\\ s. - - :rtype: `callable` - - .. 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/.venv/Lib/site-packages/attr/filters.pyi b/.venv/Lib/site-packages/attr/filters.pyi deleted file mode 100644 index 8a02fa0..0000000 --- a/.venv/Lib/site-packages/attr/filters.pyi +++ /dev/null @@ -1,6 +0,0 @@ -from typing import Any, Union - -from . import Attribute, _FilterType - -def include(*what: Union[type, str, Attribute[Any]]) -> _FilterType[Any]: ... -def exclude(*what: Union[type, str, Attribute[Any]]) -> _FilterType[Any]: ... diff --git a/.venv/Lib/site-packages/attr/py.typed b/.venv/Lib/site-packages/attr/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/Lib/site-packages/attr/setters.py b/.venv/Lib/site-packages/attr/setters.py deleted file mode 100644 index 12ed675..0000000 --- a/.venv/Lib/site-packages/attr/setters.py +++ /dev/null @@ -1,73 +0,0 @@ -# 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: - return c(new_value) - - return new_value - - -# Sentinel for disabling class-wide *on_setattr* hooks for certain attributes. -# autodata stopped working, so the docstring is inlined in the API docs. -NO_OP = object() diff --git a/.venv/Lib/site-packages/attr/setters.pyi b/.venv/Lib/site-packages/attr/setters.pyi deleted file mode 100644 index 72f7ce4..0000000 --- a/.venv/Lib/site-packages/attr/setters.pyi +++ /dev/null @@ -1,19 +0,0 @@ -from typing import Any, NewType, NoReturn, TypeVar - -from . import Attribute, _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/.venv/Lib/site-packages/attr/validators.py b/.venv/Lib/site-packages/attr/validators.py deleted file mode 100644 index 34d6b76..0000000 --- a/.venv/Lib/site-packages/attr/validators.py +++ /dev/null @@ -1,681 +0,0 @@ -# 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", - "provides", - "set_disabled", -] - - -def set_disabled(disabled): - """ - Globally disable or enable running validators. - - By default, they are run. - - :param disabled: If ``True``, disable running all validators. - :type disabled: bool - - .. 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. - - :return: ``True`` if validators are currently disabled. - :rtype: bool - - .. 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, 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 = "'{name}' must be {type!r} (got {value!r} that is a {actual!r}).".format( - name=attr.name, - type=self.type, - actual=value.__class__, - value=value, - ) - 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). - - :param type: The type to check for. - :type type: type or tuple of type - - :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 = "'{name}' must match regex {pattern!r} ({value!r} doesn't)".format( - name=attr.name, pattern=self.pattern.pattern, value=value - ) - 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*. - - :param regex: a regex string or precompiled pattern to match against - :param int flags: flags that will be passed to the underlying re function - (default 0) - :param callable func: 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, hash=True) -class _ProvidesValidator: - interface = attrib() - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if not self.interface.providedBy(value): - msg = "'{name}' must provide {interface!r} which {value!r} doesn't.".format( - name=attr.name, interface=self.interface, value=value - ) - raise TypeError( - msg, - attr, - self.interface, - value, - ) - - def __repr__(self): - return f"" - - -def provides(interface): - """ - A validator that raises a `TypeError` if the initializer is called - with an object that does not provide the requested *interface* (checks are - performed using ``interface.providedBy(value)`` (see `zope.interface - `_). - - :param interface: The interface to check for. - :type interface: ``zope.interface.Interface`` - - :raises TypeError: With a human readable error message, the attribute - (of type `attrs.Attribute`), the expected interface, and the - value it got. - - .. deprecated:: 23.1.0 - """ - import warnings - - warnings.warn( - "attrs's zope-interface support is deprecated and will be removed in, " - "or after, April 2024.", - DeprecationWarning, - stacklevel=2, - ) - return _ProvidesValidator(interface) - - -@attrs(repr=False, slots=True, 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. - - :param Callable | tuple[Callable] | list[Callable] validator: 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, hash=True) -class _InValidator: - options = attrib() - - 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.options!r} (got {value!r})" - raise ValueError( - msg, - attr, - self.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``. - - :param options: Allowed options. - :type options: list, tuple, `enum.Enum`, ... - - :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. - """ - return _InValidator(options) - - -@attrs(repr=False, slots=False, 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, 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. - - :param member_validator: Validator(s) to apply to iterable members - :param iterable_validator: Validator to apply to iterable itself - (optional) - - .. versionadded:: 19.1.0 - - :raises TypeError: if any sub-validators fail - """ - if isinstance(member_validator, (list, tuple)): - member_validator = and_(*member_validator) - return _DeepIterable(member_validator, iterable_validator) - - -@attrs(repr=False, slots=True, hash=True) -class _DeepMapping: - key_validator = attrib(validator=is_callable()) - value_validator = attrib(validator=is_callable()) - mapping_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.mapping_validator is not None: - self.mapping_validator(inst, attr, value) - - for key in value: - self.key_validator(inst, attr, key) - self.value_validator(inst, attr, value[key]) - - def __repr__(self): - return ( - "" - ).format(key=self.key_validator, value=self.value_validator) - - -def deep_mapping(key_validator, value_validator, mapping_validator=None): - """ - A validator that performs deep validation of a dictionary. - - :param key_validator: Validator to apply to dictionary keys - :param value_validator: Validator to apply to dictionary values - :param mapping_validator: Validator to apply to top-level mapping - attribute (optional) - - .. versionadded:: 19.1.0 - - :raises TypeError: if any sub-validators fail - """ - 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*. - - :param 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*. - - :param 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*. - - :param 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*. - - :param 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*. - - :param int length: 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*. - - :param int length: Minimum length of the string or iterable - - .. versionadded:: 22.1.0 - """ - return _MinLengthValidator(length) - - -@attrs(repr=False, slots=True, 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). - - :param type: The type to check for. - :type type: type or tuple of types - - :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, 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 ( - "" - ).format( - what=self.validator, - exc_types=self.exc_types, - ) - - -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_(...))``. - - :param validator: A validator to be logically inverted. - :param msg: Message to raise if validator fails. - Formatted with keys ``exc_types`` and ``validator``. - :type msg: str - :param exc_types: 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) diff --git a/.venv/Lib/site-packages/attr/validators.pyi b/.venv/Lib/site-packages/attr/validators.pyi deleted file mode 100644 index d194a75..0000000 --- a/.venv/Lib/site-packages/attr/validators.pyi +++ /dev/null @@ -1,88 +0,0 @@ -from typing import ( - Any, - AnyStr, - Callable, - Container, - ContextManager, - Iterable, - List, - Mapping, - Match, - Optional, - Pattern, - Tuple, - Type, - TypeVar, - Union, - overload, -) - -from . import _ValidatorType -from . import _ValidatorArgType - -_T = TypeVar("_T") -_T1 = TypeVar("_T1") -_T2 = TypeVar("_T2") -_T3 = TypeVar("_T3") -_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[Union[_T1, _T2]]: ... -@overload -def instance_of( - type: Tuple[Type[_T1], Type[_T2], Type[_T3]] -) -> _ValidatorType[Union[_T1, _T2, _T3]]: ... -@overload -def instance_of(type: Tuple[type, ...]) -> _ValidatorType[Any]: ... -def provides(interface: Any) -> _ValidatorType[Any]: ... -def optional( - validator: Union[ - _ValidatorType[_T], List[_ValidatorType[_T]], Tuple[_ValidatorType[_T]] - ] -) -> _ValidatorType[Optional[_T]]: ... -def in_(options: Container[_T]) -> _ValidatorType[_T]: ... -def and_(*validators: _ValidatorType[_T]) -> _ValidatorType[_T]: ... -def matches_re( - regex: Union[Pattern[AnyStr], AnyStr], - flags: int = ..., - func: Optional[ - Callable[[AnyStr, AnyStr, int], Optional[Match[AnyStr]]] - ] = ..., -) -> _ValidatorType[AnyStr]: ... -def deep_iterable( - member_validator: _ValidatorArgType[_T], - iterable_validator: Optional[_ValidatorType[_I]] = ..., -) -> _ValidatorType[_I]: ... -def deep_mapping( - key_validator: _ValidatorType[_K], - value_validator: _ValidatorType[_V], - mapping_validator: Optional[_ValidatorType[_M]] = ..., -) -> _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: Optional[str] = None, - exc_types: Union[Type[Exception], Iterable[Type[Exception]]] = ..., -) -> _ValidatorType[_T]: ... diff --git a/.venv/Lib/site-packages/attrs-23.2.0.dist-info/INSTALLER b/.venv/Lib/site-packages/attrs-23.2.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/Lib/site-packages/attrs-23.2.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/Lib/site-packages/attrs-23.2.0.dist-info/METADATA b/.venv/Lib/site-packages/attrs-23.2.0.dist-info/METADATA deleted file mode 100644 index c20be76..0000000 --- a/.venv/Lib/site-packages/attrs-23.2.0.dist-info/METADATA +++ /dev/null @@ -1,202 +0,0 @@ -Metadata-Version: 2.1 -Name: attrs -Version: 23.2.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: License :: OSI Approved :: MIT License -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 :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Typing :: Typed -Requires-Python: >=3.7 -Requires-Dist: importlib-metadata; python_version < '3.8' -Provides-Extra: cov -Requires-Dist: attrs[tests]; extra == 'cov' -Requires-Dist: coverage[toml]>=5.3; extra == 'cov' -Provides-Extra: dev -Requires-Dist: attrs[tests]; extra == 'dev' -Requires-Dist: pre-commit; extra == 'dev' -Provides-Extra: docs -Requires-Dist: furo; extra == 'docs' -Requires-Dist: myst-parser; extra == 'docs' -Requires-Dist: sphinx; extra == 'docs' -Requires-Dist: sphinx-notfound-page; extra == 'docs' -Requires-Dist: sphinxcontrib-towncrier; extra == 'docs' -Requires-Dist: towncrier; extra == 'docs' -Requires-Dist: zope-interface; extra == 'docs' -Provides-Extra: tests -Requires-Dist: attrs[tests-no-zope]; extra == 'tests' -Requires-Dist: zope-interface; extra == 'tests' -Provides-Extra: tests-mypy -Requires-Dist: mypy>=1.6; (platform_python_implementation == 'CPython' and python_version >= '3.8') and extra == 'tests-mypy' -Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.8') and extra == 'tests-mypy' -Provides-Extra: tests-no-zope -Requires-Dist: attrs[tests-mypy]; extra == 'tests-no-zope' -Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'tests-no-zope' -Requires-Dist: hypothesis; extra == 'tests-no-zope' -Requires-Dist: pympler; extra == 'tests-no-zope' -Requires-Dist: pytest-xdist[psutil]; extra == 'tests-no-zope' -Requires-Dist: pytest>=4.3.0; extra == 'tests-no-zope' -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](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-profile/customizing-your-profile/personalizing-your-profile#list-of-qualifying-repositories-for-mars-2020-helicopter-contributor-achievement) for Mars missions since 2020! - -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. - -**Hate type annotations**!? -No problem! -Types are entirely **optional** with *attrs*. -Simply assign `attrs.field()` to the attributes instead of annotating them with types. - ---- - -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**. - -Please check out [*On The Core API Names*](https://www.attrs.org/en/latest/names.html) for a more in-depth explanation. - - -## 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), 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). - - -## 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**: please use the `python-attrs` tag on [StackOverflow](https://stackoverflow.com/questions/tagged/python-attrs) - - -### *attrs* for Enterprise - -Available as part of the Tidelift Subscription. - -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. -[Learn more.](https://tidelift.com/subscription/pkg/pypi-attrs?utm_source=pypi-attrs&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) - -## Release Information - -### Changes - -- The type annotation for `attrs.resolve_types()` is now correct. - [#1141](https://github.com/python-attrs/attrs/issues/1141) -- Type stubs now use `typing.dataclass_transform` to decorate dataclass-like decorators, instead of the non-standard `__dataclass_transform__` special form, which is only supported by Pyright. - [#1158](https://github.com/python-attrs/attrs/issues/1158) -- Fixed serialization of namedtuple fields using `attrs.asdict/astuple()` with `retain_collection_types=True`. - [#1165](https://github.com/python-attrs/attrs/issues/1165) -- `attrs.AttrsInstance` is now a `typing.Protocol` in both type hints and code. - This allows you to subclass it along with another `Protocol`. - [#1172](https://github.com/python-attrs/attrs/issues/1172) -- If *attrs* detects that `__attrs_pre_init__` accepts more than just `self`, it will call it with the same arguments as `__init__` was called. - This allows you to, for example, pass arguments to `super().__init__()`. - [#1187](https://github.com/python-attrs/attrs/issues/1187) -- Slotted classes now transform `functools.cached_property` decorated methods to support equivalent semantics. - [#1200](https://github.com/python-attrs/attrs/issues/1200) -- Added *class_body* argument to `attrs.make_class()` to provide additional attributes for newly created classes. - It is, for example, now possible to attach methods. - [#1203](https://github.com/python-attrs/attrs/issues/1203) - - ---- - -[Full changelog](https://www.attrs.org/en/stable/changelog.html) diff --git a/.venv/Lib/site-packages/attrs-23.2.0.dist-info/RECORD b/.venv/Lib/site-packages/attrs-23.2.0.dist-info/RECORD deleted file mode 100644 index 79ee131..0000000 --- a/.venv/Lib/site-packages/attrs-23.2.0.dist-info/RECORD +++ /dev/null @@ -1,55 +0,0 @@ -attr/__init__.py,sha256=WlXJN6ICB0Y_HZ0lmuTUgia0kuSdn2p67d4N6cYxNZM,3307 -attr/__init__.pyi,sha256=u08EujYHy_rSyebNn-I9Xv2S_cXmtA9xWGc0cBsyl18,16976 -attr/__pycache__/__init__.cpython-311.pyc,, -attr/__pycache__/_cmp.cpython-311.pyc,, -attr/__pycache__/_compat.cpython-311.pyc,, -attr/__pycache__/_config.cpython-311.pyc,, -attr/__pycache__/_funcs.cpython-311.pyc,, -attr/__pycache__/_make.cpython-311.pyc,, -attr/__pycache__/_next_gen.cpython-311.pyc,, -attr/__pycache__/_version_info.cpython-311.pyc,, -attr/__pycache__/converters.cpython-311.pyc,, -attr/__pycache__/exceptions.cpython-311.pyc,, -attr/__pycache__/filters.cpython-311.pyc,, -attr/__pycache__/setters.cpython-311.pyc,, -attr/__pycache__/validators.cpython-311.pyc,, -attr/_cmp.py,sha256=OQZlWdFX74z18adGEUp40Ojqm0NNu1Flqnv2JE8B2ng,4025 -attr/_cmp.pyi,sha256=sGQmOM0w3_K4-X8cTXR7g0Hqr290E8PTObA9JQxWQqc,399 -attr/_compat.py,sha256=QmRyxii295wcQfaugWqxuIumAPsNQ2-RUF82QZPqMKw,2540 -attr/_config.py,sha256=z81Vt-GeT_2taxs1XZfmHx9TWlSxjPb6eZH1LTGsS54,843 -attr/_funcs.py,sha256=VBTUFKLklsmqxys3qWSTK_Ac9Z4s0mAJWwgW9nA7Llk,17173 -attr/_make.py,sha256=LnVy2e0HygoqaZknhC19z7JmOt7qGkAadf2LZgWVJWI,101923 -attr/_next_gen.py,sha256=as1voi8siAI_o2OQG8YIiZvmn0G7-S3_j_774rnoZ_g,6203 -attr/_typing_compat.pyi,sha256=XDP54TUn-ZKhD62TOQebmzrwFyomhUCoGRpclb6alRA,469 -attr/_version_info.py,sha256=exSqb3b5E-fMSsgZAlEw9XcLpEgobPORCZpcaEglAM4,2121 -attr/_version_info.pyi,sha256=x_M3L3WuB7r_ULXAWjx959udKQ4HLB8l-hsc1FDGNvk,209 -attr/converters.py,sha256=Kyw5MY0yfnUR_RwN1Vydf0EiE---htDxOgSc_-NYL6A,3622 -attr/converters.pyi,sha256=jKlpHBEt6HVKJvgrMFJRrHq8p61GXg4-Nd5RZWKJX7M,406 -attr/exceptions.py,sha256=HRFq4iybmv7-DcZwyjl6M1euM2YeJVK_hFxuaBGAngI,1977 -attr/exceptions.pyi,sha256=zZq8bCUnKAy9mDtBEw42ZhPhAUIHoTKedDQInJD883M,539 -attr/filters.py,sha256=9pYvXqdg6mtLvKIIb56oALRMoHFnQTcGCO4EXTc1qyM,1470 -attr/filters.pyi,sha256=0mRCjLKxdcvAo0vD-Cr81HfRXXCp9j_cAXjOoAHtPGM,225 -attr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -attr/setters.py,sha256=pbCZQ-pE6ZxjDqZfWWUhUFefXtpekIU4qS_YDMLPQ50,1400 -attr/setters.pyi,sha256=pyY8TVNBu8TWhOldv_RxHzmGvdgFQH981db70r0fn5I,567 -attr/validators.py,sha256=LGVpbiNg_KGzYrKUD5JPiZkx8TMfynDZGoQoLJNCIMo,19676 -attr/validators.pyi,sha256=167Dl9nt7NUhE9wht1I-buo039qyUT1nEUT_nKjSWr4,2580 -attrs-23.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -attrs-23.2.0.dist-info/METADATA,sha256=WwvG7OHyKjEPpyFUZCCYt1n0E_CcqdRb7bliGEdcm-A,9531 -attrs-23.2.0.dist-info/RECORD,, -attrs-23.2.0.dist-info/WHEEL,sha256=mRYSEL3Ih6g5a_CVMIcwiF__0Ae4_gLYh01YFNwiq1k,87 -attrs-23.2.0.dist-info/licenses/LICENSE,sha256=iCEVyV38KvHutnFPjsbVy8q_Znyv-HKfQkINpj9xTp8,1109 -attrs/__init__.py,sha256=9_5waVbFs7rLqtXZ73tNDrxhezyZ8VZeX4BbvQ3EeJw,1039 -attrs/__init__.pyi,sha256=s_ajQ_U14DOsOz0JbmAKDOi46B3v2PcdO0UAV1MY6Ek,2168 -attrs/__pycache__/__init__.cpython-311.pyc,, -attrs/__pycache__/converters.cpython-311.pyc,, -attrs/__pycache__/exceptions.cpython-311.pyc,, -attrs/__pycache__/filters.cpython-311.pyc,, -attrs/__pycache__/setters.cpython-311.pyc,, -attrs/__pycache__/validators.cpython-311.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/.venv/Lib/site-packages/attrs-23.2.0.dist-info/WHEEL b/.venv/Lib/site-packages/attrs-23.2.0.dist-info/WHEEL deleted file mode 100644 index 2860816..0000000 --- a/.venv/Lib/site-packages/attrs-23.2.0.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: hatchling 1.21.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/.venv/Lib/site-packages/attrs-23.2.0.dist-info/licenses/LICENSE b/.venv/Lib/site-packages/attrs-23.2.0.dist-info/licenses/LICENSE deleted file mode 100644 index 2bd6453..0000000 --- a/.venv/Lib/site-packages/attrs-23.2.0.dist-info/licenses/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -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/.venv/Lib/site-packages/attrs/__init__.py b/.venv/Lib/site-packages/attrs/__init__.py deleted file mode 100644 index 0c24815..0000000 --- a/.venv/Lib/site-packages/attrs/__init__.py +++ /dev/null @@ -1,65 +0,0 @@ -# SPDX-License-Identifier: MIT - -from attr import ( - NOTHING, - Attribute, - AttrsInstance, - Factory, - _make_getattr, - assoc, - cmp_using, - define, - evolve, - field, - fields, - fields_dict, - frozen, - has, - make_class, - mutable, - resolve_types, - validate, -) -from attr._next_gen import asdict, astuple - -from . import converters, exceptions, filters, setters, validators - - -__all__ = [ - "__author__", - "__copyright__", - "__description__", - "__doc__", - "__email__", - "__license__", - "__title__", - "__url__", - "__version__", - "__version_info__", - "asdict", - "assoc", - "astuple", - "Attribute", - "AttrsInstance", - "cmp_using", - "converters", - "define", - "evolve", - "exceptions", - "Factory", - "field", - "fields_dict", - "fields", - "filters", - "frozen", - "has", - "make_class", - "mutable", - "NOTHING", - "resolve_types", - "setters", - "validate", - "validators", -] - -__getattr__ = _make_getattr(__name__) diff --git a/.venv/Lib/site-packages/attrs/__init__.pyi b/.venv/Lib/site-packages/attrs/__init__.pyi deleted file mode 100644 index 9372cfe..0000000 --- a/.venv/Lib/site-packages/attrs/__init__.pyi +++ /dev/null @@ -1,67 +0,0 @@ -from typing import ( - Any, - Callable, - Dict, - Mapping, - Optional, - Sequence, - Tuple, - Type, -) - -# 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 _FilterType -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 define as define -from attr import evolve as evolve -from attr import exceptions as exceptions -from attr import Factory as Factory -from attr import field as field -from attr import fields as fields -from attr import fields_dict as fields_dict -from attr import filters as filters -from attr import frozen as frozen -from attr import has as has -from attr import make_class as make_class -from attr import mutable as mutable -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 - -# TODO: see definition of attr.asdict/astuple -def asdict( - inst: AttrsInstance, - recurse: bool = ..., - filter: Optional[_FilterType[Any]] = ..., - dict_factory: Type[Mapping[Any, Any]] = ..., - retain_collection_types: bool = ..., - value_serializer: Optional[ - Callable[[type, Attribute[Any], Any], Any] - ] = ..., - tuple_keys: bool = ..., -) -> Dict[str, Any]: ... - -# TODO: add support for returning NamedTuple from the mypy plugin -def astuple( - inst: AttrsInstance, - recurse: bool = ..., - filter: Optional[_FilterType[Any]] = ..., - tuple_factory: Type[Sequence[Any]] = ..., - retain_collection_types: bool = ..., -) -> Tuple[Any, ...]: ... diff --git a/.venv/Lib/site-packages/attrs/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/attrs/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 9f132d5fdc300067b95d6836bc2cdb57e1749bec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1349 zcmdUtOOG2x5XXD`nDJw6?=#sK5P>3L5Ss@Vgb)%0L4weN6u7i3TD>!6Z|i!07t|Dg!nQ+;?!J_I7Q-MDYu-c8he!k9Jn%``At{3^smR%PlG{E&?SHW3q~y= z{$%6wYOW7Yzo)~uA`@AZ3yfrh4cWk^Y+_5cur1pd%NP@xU`KYaE4$c}J?zUqZpaNB z$N>)J5Jz%^n{pGk3ngT)$i!xt8Xip8~S%~YG z3;oqwWhV9HwB^@Ogyy++p;rs1IVpw&E3eOTD#L9mWx3 zmvKxu9lsP>{4G}z&(qfG35V51)m1z%piWz7taJZc#yT122}9ODQ3X8ov^mA9RqisZ z8>`!?ORtOLx_E9n=ec#1Dm3yaX~gTrQ|f2&l%mA5FYmlP`NGj$C;Gh5)5!;AS|JqP zP41K#E#$S&Z21+WY~R23=IvYLuI7`I1r&?PC+2M8jE6VoI(?vLKpMRDH(44TX@L6Vw`w-~kj zfFyrnNlB4ja(-S}YEemQQSnNK&mj3<3C>nAp~XOfn8b{{#IzWf{N&Qy)Vz}780Y+y z%)E4kfTH}Y)MOApSi#uH5GY()5TjR?npYO%lbIA#oLQ2pTacKXotT~qGy`Z!u|C2U uy@JYL95%W6DWy57c10XO3mJj9SQ1ElU}j`w{J_S*D0hKD78w<>0c8P*jzzTq diff --git a/.venv/Lib/site-packages/attrs/__pycache__/exceptions.cpython-311.pyc b/.venv/Lib/site-packages/attrs/__pycache__/exceptions.cpython-311.pyc deleted file mode 100644 index 99756ab7cf0363ed78db30d93742eb48a3143634..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 247 zcmZ3^%ge<81W~u&r1}8q#~=<2FhLog`GAb+3@HpLj5!P;3@J>(44TX@L6Vw`w-~kj zfFyrnNlB4jYDIEtK}lwQUhztX&mj3<3C>nAp~b01#W9H)d5LK;F8Rr&xv6<2#WBwL zDVcfc3IRp=S*gh&ez1bEks(mHv>-;WEH$qz#wRl=rZ}@CRkt89IXf{u6=(*~l45;? wEqVo&zc_4i^HWN5QtgU3fEF?Waj_(j_`uA_$oPScfl=-PgDf&CVgt$o0Dz7~qW}N^ diff --git a/.venv/Lib/site-packages/attrs/__pycache__/filters.cpython-311.pyc b/.venv/Lib/site-packages/attrs/__pycache__/filters.cpython-311.pyc deleted file mode 100644 index 43864337c15cdfc4ce637b6dee795d082a4279ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 241 zcmZ3^%ge<81W~u&q(44TX@L6Vw`w-~kj zfFw_1NlB4jT4qj3YEkh@hR-0$U$M?sF`>mkftbXMyu`E^m;B_?+|<01;uz=rl+3(z zg@B^`tkh%>KUl%o$Pg%8S`edGmYP=<bQ=D0ns#}nloSm4S3N!;~L$N;83cZ5L rUmP~M`6;D2sdhyiK-(CBxL6WMd|+l|WcoZPic~`O diff --git a/.venv/Lib/site-packages/attrs/__pycache__/setters.cpython-311.pyc b/.venv/Lib/site-packages/attrs/__pycache__/setters.cpython-311.pyc deleted file mode 100644 index 6616b2a959608b3845d9cd33439f0e0d5b135a49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 241 zcmZ3^%ge<81W~u&q(44TX@L6Vw`w-~kj zfFw_1NlB4jacW6PYEkh@hR-0$U$M?sF`>mkftbXMyu`E^m;B_?+|<01;uz=rl+3(z zg@B^`tkh%>KUl%o$Pg%8S`edGmYP=<bQ=D0ns#}nloSm4S3N!;~L$N;83cZ5L rUmP~M`6;D2sdhyiK-(CBxL6WMd|+l|WcoZPnNLF) diff --git a/.venv/Lib/site-packages/attrs/__pycache__/validators.cpython-311.pyc b/.venv/Lib/site-packages/attrs/__pycache__/validators.cpython-311.pyc deleted file mode 100644 index c3560257d3ff3e16b4a174d515cf4bf0563432ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 247 zcmZ3^%ge<81W~u&r1}8q#~=<2FhLog`GAb+3@HpLj5!P;3@J>(44TX@L6Vw`w-~kj zfFyrnNlB4jSz=CRN@7WVQSnNK&mj3<3C>nAp~b01#W9H)d5LK;F8Rr&xv6<2#WBwL zDVcfc3IRp=S*gh&ez1bEks(mHv>-;WEH$qz#wRl=rZ}@CRkt89IXf{u6=(*~l45;? wEqVo&zc_4i^HWN5QtgU3fEF?Waj_(j_`uA_$oPScfl=-PgDf&CVgt$o0C=3.8.0 -Description-Content-Type: text/x-rst -License-File: LICENSE -Requires-Dist: aiohttp (<4,>=3.7.4) -Provides-Extra: docs -Requires-Dist: sphinx (==4.4.0) ; extra == 'docs' -Requires-Dist: sphinxcontrib-trio (==1.1.2) ; extra == 'docs' -Requires-Dist: sphinxcontrib-websupport ; extra == 'docs' -Requires-Dist: typing-extensions (<5,>=4.3) ; extra == 'docs' -Provides-Extra: speed -Requires-Dist: orjson (>=3.5.4) ; extra == 'speed' -Requires-Dist: aiodns (>=1.1) ; extra == 'speed' -Requires-Dist: Brotli ; extra == 'speed' -Requires-Dist: cchardet (==2.1.7) ; (python_version < "3.10") and extra == 'speed' -Provides-Extra: test -Requires-Dist: coverage[toml] ; extra == 'test' -Requires-Dist: pytest ; extra == 'test' -Requires-Dist: pytest-asyncio ; extra == 'test' -Requires-Dist: pytest-cov ; extra == 'test' -Requires-Dist: pytest-mock ; extra == 'test' -Requires-Dist: typing-extensions (<5,>=4.3) ; extra == 'test' -Provides-Extra: voice -Requires-Dist: PyNaCl (<1.6,>=1.3.0) ; extra == 'voice' - -discord.py -========== - -.. image:: https://discord.com/api/guilds/336642139381301249/embed.png - :target: https://discord.gg/r3sSKJJ - :alt: Discord server invite -.. image:: https://img.shields.io/pypi/v/discord.py.svg - :target: https://pypi.python.org/pypi/discord.py - :alt: PyPI version info -.. image:: https://img.shields.io/pypi/pyversions/discord.py.svg - :target: https://pypi.python.org/pypi/discord.py - :alt: PyPI supported Python versions - -A modern, easy to use, feature-rich, and async ready API wrapper for Discord written in Python. - -Key Features -------------- - -- Modern Pythonic API using ``async`` and ``await``. -- Proper rate limit handling. -- Optimised in both speed and memory. - -Installing ----------- - -**Python 3.8 or higher is required** - -To install the library without full voice support, you can just run the following command: - -.. code:: sh - - # Linux/macOS - python3 -m pip install -U discord.py - - # Windows - py -3 -m pip install -U discord.py - -Otherwise to get voice support you should run the following command: - -.. code:: sh - - # Linux/macOS - python3 -m pip install -U "discord.py[voice]" - - # Windows - py -3 -m pip install -U discord.py[voice] - - -To install the development version, do the following: - -.. code:: sh - - $ git clone https://github.com/Rapptz/discord.py - $ cd discord.py - $ python3 -m pip install -U .[voice] - - -Optional Packages -~~~~~~~~~~~~~~~~~~ - -* `PyNaCl `__ (for voice support) - -Please note that when installing voice support on Linux, you must install the following packages via your favourite package manager (e.g. ``apt``, ``dnf``, etc) before running the above commands: - -* libffi-dev (or ``libffi-devel`` on some systems) -* python-dev (e.g. ``python3.8-dev`` for Python 3.8) - -Quick Example --------------- - -.. code:: py - - import discord - - class MyClient(discord.Client): - async def on_ready(self): - print('Logged on as', self.user) - - async def on_message(self, message): - # don't respond to ourselves - if message.author == self.user: - return - - if message.content == 'ping': - await message.channel.send('pong') - - intents = discord.Intents.default() - intents.message_content = True - client = MyClient(intents=intents) - client.run('token') - -Bot Example -~~~~~~~~~~~~~ - -.. code:: py - - import discord - from discord.ext import commands - - intents = discord.Intents.default() - intents.message_content = True - bot = commands.Bot(command_prefix='>', intents=intents) - - @bot.command() - async def ping(ctx): - await ctx.send('pong') - - bot.run('token') - -You can find more examples in the examples directory. - -Links ------- - -- `Documentation `_ -- `Official Discord Server `_ -- `Discord API `_ - - diff --git a/.venv/Lib/site-packages/discord.py-2.3.2.dist-info/RECORD b/.venv/Lib/site-packages/discord.py-2.3.2.dist-info/RECORD deleted file mode 100644 index 73ff080..0000000 --- a/.venv/Lib/site-packages/discord.py-2.3.2.dist-info/RECORD +++ /dev/null @@ -1,244 +0,0 @@ -discord.py-2.3.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -discord.py-2.3.2.dist-info/LICENSE,sha256=IRr8eHptwl13Oez9dujx-pRmN028VYOGiW2Yzf7lEn0,1081 -discord.py-2.3.2.dist-info/METADATA,sha256=3Kuv_E0jlGPe7jltcyg5MicDBvmrdNYF3OONjUgw3N8,4897 -discord.py-2.3.2.dist-info/RECORD,, -discord.py-2.3.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -discord.py-2.3.2.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 -discord.py-2.3.2.dist-info/top_level.txt,sha256=fJkrNbR-_8ubMBUcDEJBcfkpECrvSEmMrNKgvLlQFoM,8 -discord/__init__.py,sha256=75ePASY8wcoRPB8TxKbIfi9HBdv5INqHw37UvfQJ2ZY,1886 -discord/__main__.py,sha256=DEe4CqYJGe53oxJsZAQVXNRQUEUILXpo1r5iwp5wIW8,11051 -discord/__pycache__/__init__.cpython-311.pyc,, -discord/__pycache__/__main__.cpython-311.pyc,, -discord/__pycache__/_types.cpython-311.pyc,, -discord/__pycache__/abc.cpython-311.pyc,, -discord/__pycache__/activity.cpython-311.pyc,, -discord/__pycache__/appinfo.cpython-311.pyc,, -discord/__pycache__/asset.cpython-311.pyc,, -discord/__pycache__/audit_logs.cpython-311.pyc,, -discord/__pycache__/automod.cpython-311.pyc,, -discord/__pycache__/backoff.cpython-311.pyc,, -discord/__pycache__/channel.cpython-311.pyc,, -discord/__pycache__/client.cpython-311.pyc,, -discord/__pycache__/colour.cpython-311.pyc,, -discord/__pycache__/components.cpython-311.pyc,, -discord/__pycache__/context_managers.cpython-311.pyc,, -discord/__pycache__/embeds.cpython-311.pyc,, -discord/__pycache__/emoji.cpython-311.pyc,, -discord/__pycache__/enums.cpython-311.pyc,, -discord/__pycache__/errors.cpython-311.pyc,, -discord/__pycache__/file.cpython-311.pyc,, -discord/__pycache__/flags.cpython-311.pyc,, -discord/__pycache__/gateway.cpython-311.pyc,, -discord/__pycache__/guild.cpython-311.pyc,, -discord/__pycache__/http.cpython-311.pyc,, -discord/__pycache__/integrations.cpython-311.pyc,, -discord/__pycache__/interactions.cpython-311.pyc,, -discord/__pycache__/invite.cpython-311.pyc,, -discord/__pycache__/member.cpython-311.pyc,, -discord/__pycache__/mentions.cpython-311.pyc,, -discord/__pycache__/message.cpython-311.pyc,, -discord/__pycache__/mixins.cpython-311.pyc,, -discord/__pycache__/object.cpython-311.pyc,, -discord/__pycache__/oggparse.cpython-311.pyc,, -discord/__pycache__/opus.cpython-311.pyc,, -discord/__pycache__/partial_emoji.cpython-311.pyc,, -discord/__pycache__/permissions.cpython-311.pyc,, -discord/__pycache__/player.cpython-311.pyc,, -discord/__pycache__/raw_models.cpython-311.pyc,, -discord/__pycache__/reaction.cpython-311.pyc,, -discord/__pycache__/role.cpython-311.pyc,, -discord/__pycache__/scheduled_event.cpython-311.pyc,, -discord/__pycache__/shard.cpython-311.pyc,, -discord/__pycache__/stage_instance.cpython-311.pyc,, -discord/__pycache__/state.cpython-311.pyc,, -discord/__pycache__/sticker.cpython-311.pyc,, -discord/__pycache__/team.cpython-311.pyc,, -discord/__pycache__/template.cpython-311.pyc,, -discord/__pycache__/threads.cpython-311.pyc,, -discord/__pycache__/user.cpython-311.pyc,, -discord/__pycache__/utils.cpython-311.pyc,, -discord/__pycache__/voice_client.cpython-311.pyc,, -discord/__pycache__/welcome_screen.cpython-311.pyc,, -discord/__pycache__/widget.cpython-311.pyc,, -discord/_types.py,sha256=b6Ij97rnyo9WGs3qVFyRQ210LsIApH7Jr3-ZfmxU268,1410 -discord/abc.py,sha256=zhtYcxn2JfG72MT_d0kdVQiWQe_8UxXnO5uSJy4H1U0,65822 -discord/activity.py,sha256=2q-Kah0_BMOrwQ3q4_8OxACu_1gPh719T9g4eKEaCPs,26864 -discord/app_commands/__init__.py,sha256=xaANFF28sifxXO__x6eSd7r5r7UjpO-tMQirjaKiNSc,424 -discord/app_commands/__pycache__/__init__.cpython-311.pyc,, -discord/app_commands/__pycache__/checks.cpython-311.pyc,, -discord/app_commands/__pycache__/commands.cpython-311.pyc,, -discord/app_commands/__pycache__/errors.cpython-311.pyc,, -discord/app_commands/__pycache__/models.cpython-311.pyc,, -discord/app_commands/__pycache__/namespace.cpython-311.pyc,, -discord/app_commands/__pycache__/transformers.cpython-311.pyc,, -discord/app_commands/__pycache__/translator.cpython-311.pyc,, -discord/app_commands/__pycache__/tree.cpython-311.pyc,, -discord/app_commands/checks.py,sha256=Z0OIrHuoYHu3eE2q05luQ_MQGrqSC5XhA0rourJ9tFs,18077 -discord/app_commands/commands.py,sha256=NR0z9bKQUvyGr55jNGWoCJhqTJweXmK3iNlNoJ7YW_A,94536 -discord/app_commands/errors.py,sha256=yU3Rb77UoKjQTInnTtPlq6osBnoJLK3L_FrcnAD3nR4,19006 -discord/app_commands/models.py,sha256=blPfJeLmez-1Le_maQ1SiGd79KfNMF0ooRPAW1zsfFQ,38502 -discord/app_commands/namespace.py,sha256=oNfmQPNDbfW3uTGadOOw8F_X872rX4-qNFYR8ZhDAKw,13123 -discord/app_commands/transformers.py,sha256=8iP3ApdisRXfiwAhEwS0kwygeFn-sVrtgA-VgEwS_7U,32512 -discord/app_commands/translator.py,sha256=m9ENDO7GGCJXiSuhCCvXi1jW4ccHOBEM0Hk9qomS6I0,10686 -discord/app_commands/tree.py,sha256=vhwRreDEPqr7otd_NVz06c0cidW15_RXkBlI-zkCisg,47965 -discord/appinfo.py,sha256=4Y-XqFxOuB_roDceQcUNRs0f3BogaHyOuOtmmlB2MTg,12713 -discord/asset.py,sha256=SuZBQ9mgz092zUpXem2gco0WOOAOiW9pJpWpbfJtsUI,15837 -discord/audit_logs.py,sha256=pFGUg9oKneMHBZ1CJY6cewWRKXpgZ72WcmMTyk1oGgs,35367 -discord/automod.py,sha256=bMK9tloCA0iU0CSKpPwVikoi00erIyxBcQJnZLyq_r0,23833 -discord/backoff.py,sha256=3yQ0uJbQ3ij7Tmdzv7GdhqfHjbNVO4eTB3Eu0VCxuvM,3751 -discord/bin/libopus-0.x64.dll,sha256=yE2oNujZJCGsMFhCz-WnJImO0J00DUaxKeIQvclEgTE,441856 -discord/bin/libopus-0.x86.dll,sha256=O1v-EpUPNQQ-110rb6kCyTbWelBxYL92NY1nx2wdveg,366080 -discord/channel.py,sha256=xmb1oJ4i6AwIiiT1HmEfAkNq0LagyUK8pRgeMkgcLpA,116803 -discord/client.py,sha256=hhT8HCdxmM7EkJOIjsdNs_5gsf7A0HPw2AEt9bDHDK4,85400 -discord/colour.py,sha256=l8-TuIYTNwaDGdIRLwjHNHsMjqjNl_pJ-RscHkXJcDM,14403 -discord/components.py,sha256=1koyIHyOVLKdsd3trSYyPAQ37zOn7IMCbFBsbOu4mz4,16850 -discord/context_managers.py,sha256=hloaEAAhLcDB-QfyoCPEpH_vsc3y4WLs1Ujs352tLbQ,3032 -discord/embeds.py,sha256=sijnFNm84KCoo_IUPUUC1bzX1IWyMfPcBPFXFocq50g,22722 -discord/emoji.py,sha256=ucJuzNIfAbvDBf8QxFrD4RyVwxDGCRyl7Zr_QWI5ZRo,8574 -discord/enums.py,sha256=gErFkTYnvfwE-EaOFQfMT9kAZhCLY4-Hj3Ut-geNpfQ,22242 -discord/errors.py,sha256=h0BHhp-UjoWTvoxqlLjtOziM9nxVFR8qMHZmEt8m5oc,8952 -discord/ext/commands/__init__.py,sha256=ZQPvApylgqC07qrj80DDkT4Dbd7j_OVy5Xw4RiYZJRc,437 -discord/ext/commands/__pycache__/__init__.cpython-311.pyc,, -discord/ext/commands/__pycache__/_types.cpython-311.pyc,, -discord/ext/commands/__pycache__/bot.cpython-311.pyc,, -discord/ext/commands/__pycache__/cog.cpython-311.pyc,, -discord/ext/commands/__pycache__/context.cpython-311.pyc,, -discord/ext/commands/__pycache__/converter.cpython-311.pyc,, -discord/ext/commands/__pycache__/cooldowns.cpython-311.pyc,, -discord/ext/commands/__pycache__/core.cpython-311.pyc,, -discord/ext/commands/__pycache__/errors.cpython-311.pyc,, -discord/ext/commands/__pycache__/flags.cpython-311.pyc,, -discord/ext/commands/__pycache__/help.cpython-311.pyc,, -discord/ext/commands/__pycache__/hybrid.cpython-311.pyc,, -discord/ext/commands/__pycache__/parameters.cpython-311.pyc,, -discord/ext/commands/__pycache__/view.cpython-311.pyc,, -discord/ext/commands/_types.py,sha256=ULLyGU6nLcITfnS-yTrlRU0N3e0zXETo2w8dBWKMrf4,2638 -discord/ext/commands/bot.py,sha256=3u57VTED60mwKrRmd8eH5GogWZLMfNA90qKh6oPhtHA,51719 -discord/ext/commands/cog.py,sha256=54f5j_I-fU30zFY-cxin_x3sHfsSjntm_w_arbhsiXI,30245 -discord/ext/commands/context.py,sha256=2cJRDhyncu1NIURGumt0oo3GMN64EMoqf2JWE_j5FzA,40048 -discord/ext/commands/converter.py,sha256=lJIxLDXxnwVHdAQfuM3JROgxplytPGedW9LtFRGXlSc,46172 -discord/ext/commands/cooldowns.py,sha256=0TrIBTDYLz2PhVx7yE9RDNoCENFRlLDEw1e8nvabm1k,9716 -discord/ext/commands/core.py,sha256=KMPSoicVLfCoX9771BbHgYqOVzaSUKQMk9gUfQBobPY,89619 -discord/ext/commands/errors.py,sha256=ZQJ2slp3HVUH3aWvOU1iLLVxpxA1LsjQOjKTj9mdmEQ,36450 -discord/ext/commands/flags.py,sha256=1LaqI9z_lnxl380W1THHg-tk7ta0ht0_gPWPFmdFDjY,22966 -discord/ext/commands/help.py,sha256=Qnfby8ZQ6RFKP31KgP4gk2eq0e8sSbNwd548sAdQPHI,57873 -discord/ext/commands/hybrid.py,sha256=0FmvT7xovJJt5tEknVelZ5Dxi3iu9A3CqDMftBCNV30,36595 -discord/ext/commands/parameters.py,sha256=3OUpzbljB6GLazvW51Rq1XlVbEGiWC-Bsfjk3_RW4-4,9295 -discord/ext/commands/view.py,sha256=lwRVmdXEkTIyzLLacr7Wz6jFY0s7KEbzuFgzx8Wgjog,6247 -discord/ext/tasks/__init__.py,sha256=R33gptpvC616c9c8L52fKDTl73w4_2YNWQvMolyPCcM,29180 -discord/ext/tasks/__pycache__/__init__.cpython-311.pyc,, -discord/file.py,sha256=YeNS1cUZlcnMnx6QmPjpT7wT7h8hXOa11T1hz8cpr0Y,5378 -discord/flags.py,sha256=rRefO1GRBhvW0_lDwxwlSjfe9VwpYq8j_z9mjk8EKRE,54264 -discord/gateway.py,sha256=G_ngUX5CiWU5JBPDElRf4yLHxKgmzKNHghbasvK0L3Q,35191 -discord/guild.py,sha256=bBGGP64iI_aw0_EP61VkLQcsNsoJqIUNXQJGl50LL30,150337 -discord/http.py,sha256=PI68vFC3ez3p8b_hJjShJWejLjQ8-OTPF5nOqdlalU8,90056 -discord/integrations.py,sha256=P2s9NjyWhlcdQs3IcRrVdr6wHmCVszwXSlhXNnU_CEk,13334 -discord/interactions.py,sha256=OIRG_5XceVKl52OtiICzI0StWmkUT_pvdQLEvVoNTFs,45246 -discord/invite.py,sha256=fRK2UbCwAoLY8mTCCThZOfsaCbMC6yM3of2dswXG9w0,20595 -discord/member.py,sha256=xqdEgNuaaTTWPBO9e7YARxKMxleVNvhLtyRMKnwKGE0,41018 -discord/mentions.py,sha256=2DZE_Uh2sDIoext6-bAXkdyWAjRVSAV3GrMYxKFIL14,5592 -discord/message.py,sha256=LZv2wc_XjrYQuD7wThnffnvLlrYmPBTSl4JXRwm-QBg,85375 -discord/mixins.py,sha256=_mKBOfdhQKNwlVx2m4jbJmOvtWxkuWSBEbnhxNDd4qo,1485 -discord/object.py,sha256=KHaw4UBOgcw74m-uXI9uU3mba2wAIgEKeaP5n2uuKsQ,3702 -discord/oggparse.py,sha256=F_wjGRC2TWeq0tMltNukivWSP-YUdP8WAIOy-oVqNmU,3646 -discord/opus.py,sha256=zfeQfMAvH7zRu6Msu42Thy9PMtLm8IdIqQk3ygTAtJg,15233 -discord/partial_emoji.py,sha256=OtsS-zYNyk2bv-ZepZ4z4RSAxZ40d8eQDsiob6_-Om0,7954 -discord/permissions.py,sha256=9LMdh0u5t-j1FWLMf1BcZmBndkZHwY2rnZqNmH8jBrc,30153 -discord/player.py,sha256=RNDcaWGl0_4rQvTCQSSQmnMwdTjQMfFBQ2kfD4Pief0,26498 -discord/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -discord/raw_models.py,sha256=9aCXMFEbBiEXUeJ5u1Gkrk2WH0MFn3DI-NE2mKHqmSM,16826 -discord/reaction.py,sha256=5LEcjk3i33sdBCF6l54wF90473OyjuNU7SBBzJA2tE0,8207 -discord/role.py,sha256=xyzYK1VJIrP_LAcem68XqOylfp8ZaCsrsZOBbKEO_eI,17906 -discord/scheduled_event.py,sha256=rCduKyK3HaEGxGXM6VJYvig52VQsy6ReWqIFuOe8Ej8,23629 -discord/shard.py,sha256=LV60FOxFm6-_EN0fLDgjGZPBpavO6c8YN2PyPrGtfVI,20399 -discord/stage_instance.py,sha256=TBiXfIoaMKemDZLj_Fy7glDo4mnrtJu735O5catVM7c,6498 -discord/state.py,sha256=9UDn_zIXMycsvBMKLfhPJkmn66mZ0e_1QnMlLaBVwnE,73376 -discord/sticker.py,sha256=RiqwVAU5cfEAk87_zJozoWJlE1_SJU1cl9mQKexr8jE,16039 -discord/team.py,sha256=Gj6mL0d1jIuO3dX3JMQjyyPzelPuMgbYP7wvCOkVx3E,4792 -discord/template.py,sha256=hlxSwq35_wZ8anANs4aStCzDdQNMl0QE0qZA4bhr6YU,9574 -discord/threads.py,sha256=-SA_j8g0P4tRDq3Z15HX2-sjSeVlXKGzLD3SOv_4k8Q,32456 -discord/types/__init__.py,sha256=7kT6hLaDiMVwuJvp4Os08kxqu9bxX3Yr9FFcOGYd6YQ,149 -discord/types/__pycache__/__init__.cpython-311.pyc,, -discord/types/__pycache__/activity.cpython-311.pyc,, -discord/types/__pycache__/appinfo.cpython-311.pyc,, -discord/types/__pycache__/audit_log.cpython-311.pyc,, -discord/types/__pycache__/automod.cpython-311.pyc,, -discord/types/__pycache__/channel.cpython-311.pyc,, -discord/types/__pycache__/command.cpython-311.pyc,, -discord/types/__pycache__/components.cpython-311.pyc,, -discord/types/__pycache__/embed.cpython-311.pyc,, -discord/types/__pycache__/emoji.cpython-311.pyc,, -discord/types/__pycache__/gateway.cpython-311.pyc,, -discord/types/__pycache__/guild.cpython-311.pyc,, -discord/types/__pycache__/integration.cpython-311.pyc,, -discord/types/__pycache__/interactions.cpython-311.pyc,, -discord/types/__pycache__/invite.cpython-311.pyc,, -discord/types/__pycache__/member.cpython-311.pyc,, -discord/types/__pycache__/message.cpython-311.pyc,, -discord/types/__pycache__/role.cpython-311.pyc,, -discord/types/__pycache__/scheduled_event.cpython-311.pyc,, -discord/types/__pycache__/snowflake.cpython-311.pyc,, -discord/types/__pycache__/sticker.cpython-311.pyc,, -discord/types/__pycache__/team.cpython-311.pyc,, -discord/types/__pycache__/template.cpython-311.pyc,, -discord/types/__pycache__/threads.cpython-311.pyc,, -discord/types/__pycache__/user.cpython-311.pyc,, -discord/types/__pycache__/voice.cpython-311.pyc,, -discord/types/__pycache__/webhook.cpython-311.pyc,, -discord/types/__pycache__/welcome_screen.cpython-311.pyc,, -discord/types/__pycache__/widget.cpython-311.pyc,, -discord/types/activity.py,sha256=k7tqp11m_t77Lu9D5T8pAMw1dnQcs7CtLJ5NV-4CgzQ,2707 -discord/types/appinfo.py,sha256=e0jA4OUxkjK439-tShxZWzqr1Ihx8Nz6ULhGYYEcb6k,2487 -discord/types/audit_log.py,sha256=cD8CEbC7bwBYJdrBSU6JuHo6_9sW6l7FQ4ZnGdraZLg,8192 -discord/types/automod.py,sha256=JxdWKf2evnFOuObcxnIi0QKzGpPOWsmKEx1nRJOwvQs,4009 -discord/types/channel.py,sha256=LHHLGBQpDju1043xDFjxhS5shBdnLnyQhNhxZk9PiVs,4804 -discord/types/command.py,sha256=1hcNoTUcJmpQy29ILcevQSxT8X2nxCngwubshVdgtyI,6266 -discord/types/components.py,sha256=b27cICDVSxXxHzadK7r8sipDn4fI5UCln2jPs33XKe0,3057 -discord/types/embed.py,sha256=VnYSZqjPIYXAGA87P-JhjXs_mGhswaMpOd81mzF5iPc,2329 -discord/types/emoji.py,sha256=JfwRzhcs7KRLKVtl8bCrvbgBTl9Ww8MboNoUcEf2EkM,1528 -discord/types/gateway.py,sha256=So8DWqEqVkqrlhbTSHrYTOcyfUNjRx3CiLVn2sR9yZ4,8453 -discord/types/guild.py,sha256=KikAryWEXz_cqhw1ZcmM-Hg7UytI1VgPswPRLEpQSB0,5279 -discord/types/integration.py,sha256=8HU48LNhr4eqXBzOkib3a5zEfxg1rvOTWp1IeERNpnw,2288 -discord/types/interactions.py,sha256=0VvwucoupXmCD0QGU1tBAT1xzlXcaMSt38h5_HG3gnQ,7046 -discord/types/invite.py,sha256=sLmvX0Imw5qtV-h78BYVf928Q0YIfGWVuz9XxY8Ctqg,2704 -discord/types/member.py,sha256=vOttPlR_PRpVKlQNnilcWjNEIAJBymVC6N0w08WZ248,1898 -discord/types/message.py,sha256=gCd0Hf9z-mWaxzzVJTn3ZITq2p3KKwgYRE9FYUbC9fY,4251 -discord/types/role.py,sha256=m1ZNSq4n-SNSWLELmBV2hE70Bo5YWuaovfLLhXBhL6U,1746 -discord/types/scheduled_event.py,sha256=WwSiBISWsOD81CVxBc2dwfnLSCaRPsZUdYFWyW8ouJI,3294 -discord/types/snowflake.py,sha256=x_L3OXauewQagDr6jPzj7uCw1MNqijsy-Uo9vvkwvF0,1182 -discord/types/sticker.py,sha256=WXQH2KaEAe0dK1tn0p0ZwxXV0OfWuxDGBEMQdBu0kr4,2257 -discord/types/team.py,sha256=rOgj3_h4UGMTSx9dgyBrYTX-1MQZdvPqpJgZKtnOOF4,1499 -discord/types/template.py,sha256=EO4tA2WypntCGQ9sWud5VS_uI8n12iVVHVPcNgCtZvM,1609 -discord/types/threads.py,sha256=p2VuQCd8NbAfIV3FUsG4IwHsd1uXk-rWQCfP22RQqNo,2454 -discord/types/user.py,sha256=eGW7Au7gGBbsQwod9ADXUdePArfZOgCM7kTTBf6rrkE,1572 -discord/types/voice.py,sha256=wFQLiPZaQuXBKE1dM_bdWNpkglpGFC7kEtghwCHBDQM,2268 -discord/types/webhook.py,sha256=iqBUgbz38o0_mWp-gcVI0_urpgZ_dq2EfOOXACg47u8,1978 -discord/types/welcome_screen.py,sha256=ukQMefZLHpgyg0_5IoAzN0UX40VayhF2vnJzNJNMZzA,1460 -discord/types/widget.py,sha256=YRkhDoBHbCEtkmYTVOSoHM8Y3mH9GIdowthoz8ISJYU,1883 -discord/ui/__init__.py,sha256=zsTlMLSiy6RzXzNVl1i5WDiM5piE_bgzCTLYU93axYM,285 -discord/ui/__pycache__/__init__.cpython-311.pyc,, -discord/ui/__pycache__/button.cpython-311.pyc,, -discord/ui/__pycache__/dynamic.cpython-311.pyc,, -discord/ui/__pycache__/item.cpython-311.pyc,, -discord/ui/__pycache__/modal.cpython-311.pyc,, -discord/ui/__pycache__/select.cpython-311.pyc,, -discord/ui/__pycache__/text_input.cpython-311.pyc,, -discord/ui/__pycache__/view.cpython-311.pyc,, -discord/ui/button.py,sha256=_5F4oEYfFwLcXeY056nZ_gp68zyPRDWgWh17klpos_E,10620 -discord/ui/dynamic.py,sha256=iWQ9-6JVT8HBdBY7utlJqK8fzC2BPzlgo_mE0TEA4VI,5899 -discord/ui/item.py,sha256=4Y-XTeYWsWrwriU1ihpVxVUOiCGTIgcnPP8wkjLdqCs,4372 -discord/ui/modal.py,sha256=VeziCgKCQTg8mei5cFlpv_5yoDyozKR2Cb4OoSZqzF4,7035 -discord/ui/select.py,sha256=yrjB41sDFXQEotsyXwqM1vASf7KF8qs7RIEYuDc0_d8,34030 -discord/ui/text_input.py,sha256=6vqvxCdDfMWoDNre-F69LeeoSugdL72x8jtOF8hW3Vc,8092 -discord/ui/view.py,sha256=KxJHGKb76_7mgfIfLhysPfQkRWSb_mUnAckXI3E-mFE,22878 -discord/user.py,sha256=ZZfKq97mG_w0Hf8Sli2E9zoUGawKdi32GC2aLhvxAbo,16504 -discord/utils.py,sha256=mWXsJSN3itR80f2BFtpwzgl_CuU2lG40CHrK89Ci5sI,41506 -discord/voice_client.py,sha256=dYywhW7CAztq0dnnUS3bG3OebUwLVTbndWEggnAUTLo,25089 -discord/webhook/__init__.py,sha256=5lx7IcCFf9DAjdX7CVen3-8DjHAfGvS1rSDY3DyVnqM,182 -discord/webhook/__pycache__/__init__.cpython-311.pyc,, -discord/webhook/__pycache__/async_.cpython-311.pyc,, -discord/webhook/__pycache__/sync.cpython-311.pyc,, -discord/webhook/async_.py,sha256=9NaW7OY2poMGZAja0CnQCdYlQEKagW0zraEPDTi7vH0,69729 -discord/webhook/sync.py,sha256=1sfj1QRohdA1NFBE7hMvfN0b38i0YXijzUHeNdfuQoE,42586 -discord/welcome_screen.py,sha256=CP5i3eujqzt_yVs0IBrTH_MOzTlEG0iid9xBvMvDQYk,7539 -discord/widget.py,sha256=FLqKcOyPRE6qbqgFEbhz0RJvl4DG7Ui7zzDnlp5SapI,10426 diff --git a/.venv/Lib/site-packages/discord.py-2.3.2.dist-info/REQUESTED b/.venv/Lib/site-packages/discord.py-2.3.2.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/Lib/site-packages/discord.py-2.3.2.dist-info/WHEEL b/.venv/Lib/site-packages/discord.py-2.3.2.dist-info/WHEEL deleted file mode 100644 index becc9a6..0000000 --- a/.venv/Lib/site-packages/discord.py-2.3.2.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.37.1) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/.venv/Lib/site-packages/discord.py-2.3.2.dist-info/top_level.txt b/.venv/Lib/site-packages/discord.py-2.3.2.dist-info/top_level.txt deleted file mode 100644 index e46fba2..0000000 --- a/.venv/Lib/site-packages/discord.py-2.3.2.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -discord diff --git a/.venv/Lib/site-packages/discord/__init__.py b/.venv/Lib/site-packages/discord/__init__.py deleted file mode 100644 index 7e927f4..0000000 --- a/.venv/Lib/site-packages/discord/__init__.py +++ /dev/null @@ -1,85 +0,0 @@ -""" -Discord API Wrapper -~~~~~~~~~~~~~~~~~~~ - -A basic wrapper for the Discord API. - -:copyright: (c) 2015-present Rapptz -:license: MIT, see LICENSE for more details. - -""" - -__title__ = 'discord' -__author__ = 'Rapptz' -__license__ = 'MIT' -__copyright__ = 'Copyright 2015-present Rapptz' -__version__ = '2.3.2' - -__path__ = __import__('pkgutil').extend_path(__path__, __name__) - -import logging -from typing import NamedTuple, Literal - -from .client import * -from .appinfo import * -from .user import * -from .emoji import * -from .partial_emoji import * -from .activity import * -from .channel import * -from .guild import * -from .flags import * -from .member import * -from .message import * -from .asset import * -from .errors import * -from .permissions import * -from .role import * -from .file import * -from .colour import * -from .integrations import * -from .invite import * -from .template import * -from .welcome_screen import * -from .widget import * -from .object import * -from .reaction import * -from . import ( - utils as utils, - opus as opus, - abc as abc, - ui as ui, - app_commands as app_commands, -) -from .enums import * -from .embeds import * -from .mentions import * -from .shard import * -from .player import * -from .webhook import * -from .voice_client import * -from .audit_logs import * -from .raw_models import * -from .team import * -from .sticker import * -from .stage_instance import * -from .scheduled_event import * -from .interactions import * -from .components import * -from .threads import * -from .automod import * - - -class VersionInfo(NamedTuple): - major: int - minor: int - micro: int - releaselevel: Literal["alpha", "beta", "candidate", "final"] - serial: int - - -version_info: VersionInfo = VersionInfo(major=2, minor=3, micro=2, releaselevel='final', serial=0) - -logging.getLogger(__name__).addHandler(logging.NullHandler()) - -del logging, NamedTuple, Literal, VersionInfo diff --git a/.venv/Lib/site-packages/discord/__main__.py b/.venv/Lib/site-packages/discord/__main__.py deleted file mode 100644 index 6e34be5..0000000 --- a/.venv/Lib/site-packages/discord/__main__.py +++ /dev/null @@ -1,351 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -from typing import Optional, Tuple, Dict - -import argparse -import sys -from pathlib import Path - -import discord -import importlib.metadata -import aiohttp -import platform - - -def show_version() -> None: - entries = [] - - entries.append('- Python v{0.major}.{0.minor}.{0.micro}-{0.releaselevel}'.format(sys.version_info)) - version_info = discord.version_info - entries.append('- discord.py v{0.major}.{0.minor}.{0.micro}-{0.releaselevel}'.format(version_info)) - if version_info.releaselevel != 'final': - version = importlib.metadata.version('discord.py') - if version: - entries.append(f' - discord.py metadata: v{version}') - - entries.append(f'- aiohttp v{aiohttp.__version__}') - uname = platform.uname() - entries.append('- system info: {0.system} {0.release} {0.version}'.format(uname)) - print('\n'.join(entries)) - - -def core(parser: argparse.ArgumentParser, args: argparse.Namespace) -> None: - if args.version: - show_version() - else: - parser.print_help() - - -_bot_template = """#!/usr/bin/env python3 - -from discord.ext import commands -import discord -import config - -class Bot(commands.{base}): - def __init__(self, intents: discord.Intents, **kwargs): - super().__init__(command_prefix=commands.when_mentioned_or('{prefix}'), intents=intents, **kwargs) - - async def setup_hook(self): - for cog in config.cogs: - try: - await self.load_extension(cog) - except Exception as exc: - print(f'Could not load extension {{cog}} due to {{exc.__class__.__name__}}: {{exc}}') - - async def on_ready(self): - print(f'Logged on as {{self.user}} (ID: {{self.user.id}})') - - -intents = discord.Intents.default() -intents.message_content = True -bot = Bot(intents=intents) - -# write general commands here - -bot.run(config.token) -""" - -_gitignore_template = """# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -env/ -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -*.egg-info/ -.installed.cfg -*.egg - -# Our configuration files -config.py -""" - -_cog_template = '''from discord.ext import commands -import discord - -class {name}(commands.Cog{attrs}): - """The description for {name} goes here.""" - - def __init__(self, bot): - self.bot = bot -{extra} -async def setup(bot): - await bot.add_cog({name}(bot)) -''' - -_cog_extras = ''' - async def cog_load(self): - # loading logic goes here - pass - - async def cog_unload(self): - # clean up logic goes here - pass - - async def cog_check(self, ctx): - # checks that apply to every command in here - return True - - async def bot_check(self, ctx): - # checks that apply to every command to the bot - return True - - async def bot_check_once(self, ctx): - # check that apply to every command but is guaranteed to be called only once - return True - - async def cog_command_error(self, ctx, error): - # error handling to every command in here - pass - - async def cog_app_command_error(self, interaction, error): - # error handling to every application command in here - pass - - async def cog_before_invoke(self, ctx): - # called before a command is called here - pass - - async def cog_after_invoke(self, ctx): - # called after a command is called here - pass - -''' - - -# certain file names and directory names are forbidden -# see: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx -# although some of this doesn't apply to Linux, we might as well be consistent -_base_table: Dict[str, Optional[str]] = { - '<': '-', - '>': '-', - ':': '-', - '"': '-', - # '/': '-', these are fine - # '\\': '-', - '|': '-', - '?': '-', - '*': '-', -} - -# NUL (0) and 1-31 are disallowed -_base_table.update((chr(i), None) for i in range(32)) - -_translation_table = str.maketrans(_base_table) - - -def to_path(parser: argparse.ArgumentParser, name: str, *, replace_spaces: bool = False) -> Path: - if isinstance(name, Path): - return name - - if sys.platform == 'win32': - forbidden = ( - 'CON', - 'PRN', - 'AUX', - 'NUL', - 'COM1', - 'COM2', - 'COM3', - 'COM4', - 'COM5', - 'COM6', - 'COM7', - 'COM8', - 'COM9', - 'LPT1', - 'LPT2', - 'LPT3', - 'LPT4', - 'LPT5', - 'LPT6', - 'LPT7', - 'LPT8', - 'LPT9', - ) - if len(name) <= 4 and name.upper() in forbidden: - parser.error('invalid directory name given, use a different one') - - name = name.translate(_translation_table) - if replace_spaces: - name = name.replace(' ', '-') - return Path(name) - - -def newbot(parser: argparse.ArgumentParser, args: argparse.Namespace) -> None: - new_directory = to_path(parser, args.directory) / to_path(parser, args.name) - - # as a note exist_ok for Path is a 3.5+ only feature - # since we already checked above that we're >3.5 - try: - new_directory.mkdir(exist_ok=True, parents=True) - except OSError as exc: - parser.error(f'could not create our bot directory ({exc})') - - cogs = new_directory / 'cogs' - - try: - cogs.mkdir(exist_ok=True) - init = cogs / '__init__.py' - init.touch() - except OSError as exc: - print(f'warning: could not create cogs directory ({exc})') - - try: - with open(str(new_directory / 'config.py'), 'w', encoding='utf-8') as fp: - fp.write('token = "place your token here"\ncogs = []\n') - except OSError as exc: - parser.error(f'could not create config file ({exc})') - - try: - with open(str(new_directory / 'bot.py'), 'w', encoding='utf-8') as fp: - base = 'Bot' if not args.sharded else 'AutoShardedBot' - fp.write(_bot_template.format(base=base, prefix=args.prefix)) - except OSError as exc: - parser.error(f'could not create bot file ({exc})') - - if not args.no_git: - try: - with open(str(new_directory / '.gitignore'), 'w', encoding='utf-8') as fp: - fp.write(_gitignore_template) - except OSError as exc: - print(f'warning: could not create .gitignore file ({exc})') - - print('successfully made bot at', new_directory) - - -def newcog(parser: argparse.ArgumentParser, args: argparse.Namespace) -> None: - cog_dir = to_path(parser, args.directory) - try: - cog_dir.mkdir(exist_ok=True) - except OSError as exc: - print(f'warning: could not create cogs directory ({exc})') - - directory = cog_dir / to_path(parser, args.name) - directory = directory.with_suffix('.py') - try: - with open(str(directory), 'w', encoding='utf-8') as fp: - attrs = '' - extra = _cog_extras if args.full else '' - if args.class_name: - name = args.class_name - else: - name = str(directory.stem) - if '-' in name or '_' in name: - translation = str.maketrans('-_', ' ') - name = name.translate(translation).title().replace(' ', '') - else: - name = name.title() - - if args.display_name: - attrs += f', name="{args.display_name}"' - if args.hide_commands: - attrs += ', command_attrs=dict(hidden=True)' - fp.write(_cog_template.format(name=name, extra=extra, attrs=attrs)) - except OSError as exc: - parser.error(f'could not create cog file ({exc})') - else: - print('successfully made cog at', directory) - - -def add_newbot_args(subparser: argparse._SubParsersAction[argparse.ArgumentParser]) -> None: - parser = subparser.add_parser('newbot', help='creates a command bot project quickly') - parser.set_defaults(func=newbot) - - parser.add_argument('name', help='the bot project name') - parser.add_argument('directory', help='the directory to place it in (default: .)', nargs='?', default=Path.cwd()) - parser.add_argument('--prefix', help='the bot prefix (default: $)', default='$', metavar='') - parser.add_argument('--sharded', help='whether to use AutoShardedBot', action='store_true') - parser.add_argument('--no-git', help='do not create a .gitignore file', action='store_true', dest='no_git') - - -def add_newcog_args(subparser: argparse._SubParsersAction[argparse.ArgumentParser]) -> None: - parser = subparser.add_parser('newcog', help='creates a new cog template quickly') - parser.set_defaults(func=newcog) - - parser.add_argument('name', help='the cog name') - parser.add_argument('directory', help='the directory to place it in (default: cogs)', nargs='?', default=Path('cogs')) - parser.add_argument('--class-name', help='the class name of the cog (default: )', dest='class_name') - parser.add_argument('--display-name', help='the cog name (default: )') - parser.add_argument('--hide-commands', help='whether to hide all commands in the cog', action='store_true') - parser.add_argument('--full', help='add all special methods as well', action='store_true') - - -def parse_args() -> Tuple[argparse.ArgumentParser, argparse.Namespace]: - parser = argparse.ArgumentParser(prog='discord', description='Tools for helping with discord.py') - parser.add_argument('-v', '--version', action='store_true', help='shows the library version') - parser.set_defaults(func=core) - - subparser = parser.add_subparsers(dest='subcommand', title='subcommands') - add_newbot_args(subparser) - add_newcog_args(subparser) - return parser, parser.parse_args() - - -def main() -> None: - parser, args = parse_args() - args.func(parser, args) - - -if __name__ == '__main__': - main() diff --git a/.venv/Lib/site-packages/discord/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 073d13e7c22b10b83e505ed08f0e86f92b176f45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2999 zcmbtV%WoS+7$3i#UE6szEp1X*3N&#aX`Avi38aJqX-ibm7SJ|g8ShN&ZT4Yi)(Pza z8Hq!Wy}_~K5J2U?pTM86sVvnRE|EA@;t*6$ocP9`O>MP3vHte^ee?R}d#-;f7BvKq z`Nv=MiyT6K%0c|VxcfZ1okZw+bPW+?B9br@Bxxo|%1n{8nI;)ClSDL2vRes+?!nu8 z?#8F%i7wJS9ohnI_u%b4W}f6o-qlPEaLCoYf?4p2W-)#_Jdei2#H)GCt zWwY!ZGmm-4&Ev|q6Kd~Cg|iAzDLk$4jKVpEXBEDx@HK_6D||!Yn+o4jSW)=4!uhKx zi9ST6_#Gl8TG&cKUf@-ES%9oAkYO?c?1N6;$4L>qqT@`R*a9AubwbCrN*V@rSmIS&Ucl10iygWX0Q zi*yx2CWdUV&>=XaBD3cB*cAmvU5Yud4eE+4r_90bN;xa?mgPe*EK6vX~3wk8Y|M$zK%IY;x%2#pS$7`$a2X@ngWb@Uf zfH;25xXgkZ)RyBb#@V?uFx_md&TdeDWA&0#UFDF2lMQUI;~M3wD%Gbf%kiDivSy)} zM&X(+TLyuD0Ib#b>*%G{h1P{{FFZvUI~W~$w>`EPr6p~r7dwUF*2UJvZ{clSWG}{w zAIeYYLzzkT9I$eRjY)Z2vVD@tOtC}2L}8oQFeA?%aVfSeoDY7keE z4R1C8nf!C;W<+Fd*MZ2392BcGPo$fW7?Gh~aKjPB24*3o-s%nW*bbcyC%h?gb{*0S zwUMbc9hX4exVXke)}vk(j^{keIV1<_jB^@_EM+WUTWfzECSO-7Av>en#0P1`7{EGD81?j;M_9UEg6}z)*g@_-Ux#-Bcox*i8;4(z|Gn?MKD^t)WhFqNR08<1M{2a;jDA zlqOpGjy`d_a>v=$jkaz)&`;dgPyGD(Z(ncgi*0?emES?7R`=IIN290F4w{H!>Y)8m zOdT{H#neIjqL?~pDvGIt4n#2xp6%b?FF)(9XYDx@Aw`4s^xM|2b237TIPrshWe(ff+iR3Q&zpR83pkKK;c<pwU*YjYjXxY@^9GntXtc-iLCXuH4;hPgl05=iAfs+i0PU V79zB;lh$vWKODGwT>iQp^&e7aYrp^i diff --git a/.venv/Lib/site-packages/discord/__pycache__/__main__.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/__main__.cpython-311.pyc deleted file mode 100644 index d8ecb27a38c2b1317d6021f98ed07a128a493a91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16694 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/_types.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/_types.cpython-311.pyc deleted file mode 100644 index 490fd5452a3be735003f9456383c7d0f2dba3280..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1757 zcmZux&u`;I6t>eeNxd`zv~UAGl}jUeyFY+Sg-~6`Z7dQyvYmDtMMRE0X$BlSnz7Rj zrxhoT+_)i5ixB$iFEO~fD#eHV`Z0d|B!yC63gxgA$?5?5 zql&QM{CZf4s?%D(CQBuWl*1~ig*8%py78neNx$R2xcVF6JMPLORKnWRTTj+-9{+F8 zH#YrU3{kuZfsW}xn+7E21h#R|P!v6xEf_tWq_7<{;K9B7pWm4=!bzNhSI0#lOUTSx}OTXF^vd^?G(9hxvPk+hN>V)Nc;$BjM)fW zO~DyWCrOq9Do7a(L=F|5f+!0GhpXv`PHBOli11uL7tAw`3ItCTrb$T0;!Sc{vuqSm zK2ag0BK0Us(US{fUQSg(9d{E3oJ5hxK#_N@^st`$+RHi*9}QI2~yNv1-Ha;*eQ zG|pIzkXRHUH^GwSh~JPP6&AsKoJ3J_CZq*P98#f|?<)CP`=ew|axKO3#z~4)3kqTZ zauUU=uBQ0JNA4rCDj4F@SP`ZxIjAlh@e~)HV(n)M%klmza|iKT2DtWtcdR)Em@af3 z`^an>P1w?09B-*`Y+n&q8>CsLFxqS(pYi6s>*?5V|r0ej1V=mM4V+5SwyMx0$r~Nx`=}HQ1msIrlGYl z7cP%=!+A$}CAvvNUf%L!+$j0EMdsE$Y;w<@1$!C^_HRI;vF_*CK}W$xd^K0 z5yjKItQK$2YpgBTM@bfk%Z(tJ`;6jlT2@0c_OmEuRS{KU8~9?Pzgi7tSsf0sDGY~8 zWjGvXX~xKK$V8J{R?@``_kIq@un9}c_X^99JW8?2iPNyG1UZ8|HLIc1Z_;agN^ic_ zcLzO=ZEE08Vt+hnt~w7N=y>$;NOf5v&Kizg`1HYjG-tEH&YZ;aL7R>SoTlW?%n!cx zPYEAjTL=;s-W?(X!gpqiH?=RYg=7)=lHEo)Q4jtzJ}%c}S-vcND3>oK@wg|+pPWlu zZ{HVE6EnLoSz$Nao*J+E6Y>ek~! a@w=LP^z5_q`rh;U-i!KPF~i056*cPz`Y%Gp7ToSPd>=8%6 z5pf2b5m&$!aR=Oy(m-j%6Yxa50dK??@I}f3Ws&kgd88sx5vdGRMydi;k?KG-@~{ad z;hIQopf*w$sAIqF;rd8Jpn>@v;l{|Kz@o_Fz+(2>8D0|c2mH+M3O7ZT29`3vJG?Bi zJg_{nBCvw}E)B1YtO~4ReoweL(h_K4es6enWKCcV^ZUZBk+p%f%wHC6i>wQ*i>wc< zXTQtC8zLJ68zY+no7nG)@aD*tz!vx`16xgoP=!zxT7SFx+a`nI1N`$Rur1^j-vWke z!rLRy1fF3jYs2l49f2LpUl-mPc{cDY^Vf%;i|h*QV*ZBk?np`)&>J}tI1)J; zI2t(?I2Jh`I3DQ>^hNpu{VdMX@QKLDz)9v`7Jfc*DsYPVmxoUSlYz*YzzdPHfiFb{ z0s}03MR+h03$5ozhMiE z2pd8ngz&$O_}+BWF7ydqcy}>W&C2LT87o7+Z==tDfPelJfsmc8l4nX-#`VCvwj*6jpD4Ose z4~~u|CY;WrAu%!%kB`Kn{*k!>s)i6wilR{fU@A z7#;VIhQv4$#LgvxBhiuQd4JG3grX>B;sUaX$A%M^gJKAg1%EIej}46kk)L0P4UI)m zdN4ud4UdFFaes3HurKYCQY>w0b)pa<6b$=EqR1`emtXlWk0dU{#u9$iAR&$nQ68;` zG!z~a2nP9ecqB5yOK?(hR{uCbJ{Cs}2+mf2Bqodu(|3qfYjo^fcqD$I)h~=t*5}3& zh#99qhR#+e>ai{+`s1N+m~t2a+^nuDbgiteC@rntC>9k)sJ`)bCu{5Ax!6k~Ru|s9(O3eYauBEi z7!bTwrC0F_LBM`4Bq0ptjzpalBv%Ku8#@#_^8c{?q;=d;J}~r~LkBGV54(T?N&J)I{GbsYB}J#qZ#k-lye--T>@ zdwTaCM=9NhyLM8UA4fUI{hddSo<82QZ-2jk|B*vo z-3Z*%4ahq79O~vpp;DcPI(iPb`nx&~ckCnRj{A=wm*Y-~#-Z~+zrUM;sJsq*I{SN$ z^inlCkM#B*$In*O@_4_J^!c8??pA-t@t!__>fC$$2(l-1A_d{Bm(uli^IQnk3_(hZ zAPOPu1S+k-($(E@2zjA-dUcW8oWG#?t;Lvk1*7OFY+S~B@!Kw7z$Qi_p%!o6+z}nm zmv+R*qeDH3kQhwF#Js%|eJ6M>9Lig|FckB4_J;jFgfW!29~q_o6Ab4|`%fS39_ZZP z-HGPkm$x4kV~N;MES$IZg#=6 zU>wOT$7A6T70gSZkiD4T@Lh-Ug>Yyf5{k!z=R*UdK`|H!0h5%q>tqZgmqU>+Wj|yL z;jMe$*hpCD!{ELY67w#}16)UtuXQXj5{|dn@{Yb}?DB9pcnPg>B94fjqvFU*Xh5mv zQa180*I^C_Yd%+J49FQuuph>L%Jy7rEGiKEeWCC$zHJ;j_?+BFWl+S9cw9mv&jZ-% zLm#3#TN&V#_;4t4jz#x&;??<>I4;3KvAXe2XffwYB#`nx$#Xn3jHQS=hv#SzQ&BK1 zy=W=PyZS>fC*;aFx(>@;_dYQ;HY)!r*QaCkD?1q*3WgbIax^!`Kkp)WH{d@nqm7{N zzaWN!3>ha!LYG@C;v)3Be2J7=Y^7hNN}r%EhE%0Wd(c=ATM%go|H>ngj>b=_5%jhp zWC$2Rh?@kfV1B~_;@g6S-IjL_oQMjc;gM)a$lJtF0t-gojO>P}>&p-MLDLvNvBC2; z=yxPF^-ehAq0riMA@t+-4ez5Rv2YE?DX#y~na=hXr~%_I1TRE`!!LA6YjXUBPArO8 zY|#B^4B>a5f78Yd2p$`Kq3xwm^raULjhuTSj=sNkG>Bn%J`{fe3+7Nv6xIdL4YiGq z=j{UnVrWzx7?`L~p>LA|;{YID0%yvQ^VX+c`2=1=@B1e4Ail*za9S*sMHIthU;qdh zz&bsKku#8Y4-C9G77X(@;&F=KOHLm-$H+OLIPk=q;Y=xib0(v;Va~9C!!u#&tw@G) z(f>K(fjgi+2x2F1kML0we^iF?CsKbpBlXF%VgTtLmCAG88MM+_rJ1BAGJKhuX+I(! zG#JrTNkf<6Y~!RUX_`e?@uMeDzl^QgE9R4ix6S{|Vl-S|BpCY8uryQKgisihNsC!L zgG?ACd1E9_gs$K3XSm7N48+m0KqQYl0QhJuj*I6IYXblAJ#hXSe`uM~D#BD9b5h2f z$NT1mYZtCwynZolubuZZXO^QgO#VVZUi~fhyp>U6c`KW=^R{!L;h2cYJ~#~Y z)~Jwo$HD^Wxq;yk5zB_<+*tS$uS3ZYACr&Pven=WABk8h)xqEDFB;EhMJip>6eH2Z zS&?=fkLu(l>x|NFt^RYdSoo|sOz&%y=2M1mKh~VH;(5FkFOV}r@jOaAp79NUg!1r27*4 z7W)CKOMMfXq{{`o{K|FLV;OKx02`C8 zq;ppDMuo1h&X_QMy49e8Xvr6WD7sREDgPJ6RMLqR%hRh26RHJuybArI_P(jNpUwC! zMlp!jd@*CQ+avqVa4>RC2tGHlWMFg*gx$b}P#8O)ww+;G?&HtF!y{a$lr}h1hMDD4 zeD!FtvMGbj0eq;_DCgsydhUo}tlU6TfWff)&D~)(gw}tpd$si!w0es}a7J$a{ont+ zc$$7z!ubV${rxW}ZHo((O-~=u@%a+$%Ro7g=gpXs@)jaz^ImB_mX{VbALmPgL~4)3 z^454b6dKK&Mg(yXxna&69Swmr^NG}FIoKic(fm~~O^FvNjMk;R9V<4c+RY#%Fdt*$ zP2}AXY~3SckpTvYU0xFMB@!@sM5+E*OR$g zgT3@?CFznHd~&|U)1H*|p||?Y*RH)bd*aU4dsXQZ!Suz^)N2{eTocH7;pnVOD!hch+DG8Mi_E7RVUKihn8YX8H!ra42kwej&z>U_@So9?`}Gqp2U+c48L(>>FD)0yhYmDf)< z&pdPMWV(EFrhId@d~@18&nH(|mFj*_UUy^dtT9u*G+Vwj?VjiJ&|8@rn|}W4tJhz} zs_Ll9xho&K%CEQ2xbM4`r(MhOe#UrhA~lh#uA5nUPag>^ah`9dX5F-FMAo1}ym`P8ao=4Yb!8Y!B3jvfb z)gebbiyoYJX(}teNFio`k+<=@*q*6~`ZLq~PE^O+2JQCfbz_ThqD_mYcK>n48R2ue zgeCwn8V-*88IG`pujq{>dgMMI61qh(CW=RpyM~I)yQNgDQ6|bx0B3F5pua`@Pl()} zGJI+?c$cQ_O?)CEYE^#7|2Wut=7$}VJf>*yUfAk{^(A&W&K3i#12j&-SYr)&egte7 z)|_qP*HBbZB|yBf*b{CBzx3;u6m^CiVwXJfDjkk7@KjC(UNYMIaWy!nB$lh9j8~T1 z;90dvf>?5iMaZi~j3Fj_(zR6(e9E8*InJI7oB^n1X03KAl~p85*@85ew^&Bw*KrEe{z|QHE`8elW;M zoEQ`kp}pO|v2DFFmCfI2J@PQqV~P)A2~*TBQNHG&D3aJc0meW28YJSj?F9h?B2WQ6;X{Dq&JWb(U3z%wf(` zRA+2z6k4pMB#aOwI0;P9eyc=!#fCV8Py>rJ4=RO9fGEG^{-R$YsJtEs7l%M=J{cDZ z1}GUltU+5$;!z-;HAS3SL1sI;6;KC8qSBPA4RUH4wO-Sxy<$IdLAH!9{9777jc_pG zl}6_=Xi;f#7m%SMZT7|AfRne6ibUQg#>KZO>>YC6CFkqpe1n|dCZ~WrCHjjIVLyc@ zUIJkCfEne%vO$mWlUBIJ zR5-MW%%FT_`r9hg-=KBv;u<6gjsV4Ks+2v z#IcQ|K~*?dr~z3k*3+P-%yfgrR7!(|oW+K+im9H578l>py;Hqc@ITedI~HZ7 z>sZpvZv2Gid9`El{XTUoD5!Y^JGM?X!7DiMT_X5s0~fI48ymKOLnuWzE6ckE6j@#T zeG98N1QJAV7)UASJIHqqvcTUX?-wI|Ht!$qYH^{rG8OG%@Tr4_vh#+w%4 z*wib27X^U_a|K^)Csu&U;w{2JFpl*;0ST?rm*Z_x;7&r|24pp5cvxP2W7UJI+L_9m z^e+cgguF!{RNQ(d`I z&(z*Ii^aNr&Y*YPHY*xd@A!=b&Z8sVnUi>QjFxaQpBrJN%;$m6%X~ig%E%Y8i54LyRIx>2RH&gvA>ZxRuo<>ObYGDuSR%P*op62p;34i z`m?VI&p}7FE>th&p$EFSA@V5sP`!X9}`i zF>47mg+fm={V-lPnUv;@M$8~N8&a-{o(I1q#>wf?7!;$x_E7UHlBLK|WW{DVE2thP zw0z{~7-`ILrWq7+#RQnk3IBRt4nY)ZJKx556N%WU0ub0XN&!+_zAz*)3u?%NH|ghA zIC(3pl}IEUTX(TfmMS4e=)H@W0;I4v00HzC3b8?R2w@XtOvOdB0-gnB9g{U9;}Bd^ zG`9BTD;PSZ&L9!Z3W-3J4i+g+A`r<86*kb0;sCr1daR&~x9}4RxJM472`%suCisF! zYvM$ewj6~b9Hk|Y)I~rYxV@=PzAVvFtiS-j3IpdkYbiJh8t5G`%pE~&E!!BvE_5{_ zNDInmp%hbMTQTAU`cn*o#}%F+fTZVjBS*!&%wF$6oV2u~=LgP>K|eGx(WnPO|Mn#U zh16cA3_tfY$=vHl9#Y>Wg*9j#N5{`H0%b@cKoMPO9*&xYpo9JyYp8oj!rO>4k(&rI z!Ld@IXbjY=26nfF1r&x(dau4(NSBzhAaoww{*oa-CI0n(H-5d!fJ>mVj5gmf^VUJ40Pg)VK z;Od$yEMsW zL!wN5pE3d}+Z*;og&LN$>2oiHEm5^_T>bWNvIJ1M)Yz&o30*OLT%#dcwoE6`S#A)a z&Ul&)`pbrw&8H2QjnHCy0<35IUqCxfmP|U5j*D)&#AJz3a?>>FOqvq)a+tv|W)xTH zVj0vFlD1b3^r&b9QS?B2%zWEkScjy2)>{-60ZFGGr_j1Ok+jazuqk?UJw&a6J!!e^ z(4SM%>y@#MwX>IPrzciPld3xJ4>55&o$|oR8sgj(*GOu=8g!evrr`H{Nh4Hzjp#X5>N1!|4p;_%hOfMF zgh9`05~rrb1S_H4vGaT=8hUwDd~RaJW9uSE`x;dSFd9DNidyNqllXkYGHaaOaQDRz zCq6oLf7glht`jp&aMTZr#To#6*DFZQ(P|RYnK ze4Tz&km@iFh%mZZT5TW{V2ctpyav7i{roF(eoiT^BT)B#IbSj=arCHvH|>QlvuZfIYB*(oX!pHYdaX2F--b`B zG-F?vwXaLt*UecRj+Te+$~TW(J2KOiaW`e%O=)-2r%ppv9dA_b{*L2LbEbJmws{AB zXX;L7>rVdc)S2`PLgrK`dn%Nv9L`n_r@G~wx@R|M+|5~cbDDiV`?S>HtB1J4QK32y z-Q}shsl9VngnstfXQ*pMRjTAcZPRRXrglxXb`5w74)6@%T-~4Qp5BmK)%;%KZdKa9 z3!hX+&RhE}XWF|OpIa~9PTWa+|MGWVyY*VmSN693E&J><>0L*r?HS+EtnX;rcQog& zc(eCf@63jbdr{WCD9t_(J>?&JR^IoloK3tp@!sT}^Y@0+o|PHT;jHIy+P>f?UXF(S z!J?`?y9__vwM>*DM<18{Segva_ zg_txa%`scjtkM>fmS_!DNE+GFgB22DvV?|Cn6#WWL@n}a`IyoQs2H$onPObjS5$(T z*5Ieg)1t2dv4Dxo@`ds&phZAcS*J{bA?is;+#*6nvVa~!$xMIi3zb}=ug#<_p`m07 zX(W_b@^p1wu>I|VLr+aimOQ5Y3h0SR(3SJki%HN8ptel6UHVhYdfFlSW>LGpZZsq< z+P(#9X*;z1*MmM$D9u?~@QR*fK~ErBOss^k#QI>2ibJPe!9p}d_a z&nXviWy@2Pu8CjJh8zy>)4`$b^=LIs>&wu9)94cl=vdI0&S~Qn8z@!M!B^-vH4RQs z;Kv6_0FL_n4O{u$lck9UB^ak45{>FFecy;TCYGr0gtBDmMTM5UsL=PnWq7w>oMX3A zI!m)#(W8fn!Q+|q;xq&(C;lY88oyhemxS`0=1HFpa(ALxPKDZn9{&LU{1JT#qAsQ9 zVzul``h*JB=Dh_uwaGDxa$22qUnJ21d$c9uq>Ow1Qlc(hxFVraO7}kgebP0n*+0l- zV+Qi+dm5;;|B!UaJ(|X`P@xoNm@L!Pu`IDw%}I}~xL4QCmHJZ9nq`_cK^adw2Z<|i z{>5-n>0cM==puVAlIApf@E)WJf3QoeN}5Kn5qQt|&yCu-qmK*ps(V4PfgB^2P~HP! z@MY2trZWP;@q7glY6I-V7wyUiNcfyzB)f(iW(iwm`G^UHs_B z4K_qI(uN3|i9bMe5W+;A^Nj_K0+}(DgTHVO6v9dV`Sw76PK2W$39tp)G0Z<7b=>Xv z)1E)-`NM-B9#jGu?VYbuSsxnC8>{p`N>#=G7odrM4@WDI6+cf6?`vwf?Od9DJ~G}l z{;A`S9DnHg(8WXG@)|l-hT_D^?w6s4MJ6QXk;FrTZ72lINWqU*r#V-=P0kf^NZLHH zl7#v&HxUBkooOCpgG}ZdC{!Zu=;SVA9J+NAoBbkp3I;y-p5e-qPlZ?Pv0C>RmE8E#-Xo^PlN8je)$4 zv(xy{ctpWW1Mxojen8HrXJ+d&Rjt{oR%|WohPox`+Sb{v?>&?1 zN%eg8X^FvCOUG!Ism_DirSvY}geklL57 zY{|G+r`@YRd*H319=Rx&!pYY zJUPA9(QnMv`M=)qPQ&aAnYxYHx{av=sLa}J>DK3FyJow7()p3|2Sq}?q~ zlc%9^+1Gcxvm?FgnY&vu4ISBr4zQ``EIvonn5$X*_A76_GTWZ1Y0J`iA*kj5yArxSG9Rt^$o|E<10`Em?MR z;^QS-?l0MLXC$*^cXr9{>HWEyC1|E9yyf%avD4XOAxwvv9mClj!!spmKhB12&#hWN zT{7d!_?D-A%X4Ko{bem3GR_Lwm0Qy*_srQ0jsBbMA2)2c->~7%^6bVvnTF16L+7+T zS3xJk%Z7|OJ|UgT9u8s-%4|EA-F9wzU%GKqrgAfSL>)m+UBhpvUc~xnRb^aFxytHPch0~1WB>a5{`DFE#;kwioT0pQC3C*&p0>?c9@I3=F8^8cj!ezY zY|Tz8`GWC5{j&7(;g9-%`lak)0X}>(_2;wo=hKzvA1+?{^^tc*e)H1JOJ8+OTc;Bb z7cIScCWp!#$kqFAw#=1S8p^T3ZYZBF`P6NwTs$-UEg@5}CR>5Mx3%n<2P-!K1JnCv z_I~xq^pOWuOJ;4qW6M;n%T}!;ls}Ve-~Hj5zo<;NAI9ffml(FT{;cmy*}jmR=;xHh zcK++3uj+00Tke_XGrkpB--S)%oB5AxJ1Px7sC0HTnSbCnlDnd|<2l0*o^$STnSbaslIyM7v%~Pi9nMa>`9~#2 za@|#(n+-qO?Cdg{e{3+4+fdc*GyKH2$FZ-`{BIkKaQ}Rl{m@p!Pq#V`o6Ub=GQyo- zW$a6s7&%o!axne~#52@TYZ@tpS$oDCGz@0c;zux@FQC%(bS8Ev$Jma*GHKQAf(!QD zkXmTen-NYi?YP`hmQK&EzGwssv(z`A`|cjL$I zW%u37W_vR3wye7??QVPMt-b#0w;Hldo9=rzrM;VSzFG=O&b)G;aq;HdhNY{fJy<{u z-U=M=Oqp{o4-K@v#@y<)w}Q7<-dT1hn%&r)cCSixPJ1%$C9@T?$G%ZLi$5Bcd)ctu zYh*OwBPSCylVu(KDHRf`fyHk8#4imM5bxTqVbW^UkwFE#RXUY^`-P4l0VB>dODy}M z2h2HTIOzw>q$O#YGG1Sz9W1J_uZTT@*cTNh-U4DgvpO75uEIpo!;8UWT;SM$0ZRrO z)M%0!gqfISc$AL-D4Gt0SlxjgKZ$OLHYRmDCO}H~F9cy~>|6*3kEr+Zo(#iqv50cC zKz~ex(XKd4z>h4o2XXqeeNZWq_2xE~{UFpDq?4(785Ok@+nx~@fs_Vki`s<(^xHB? zPLD0wUA%)~6l1JN$kVDDOC&2e9}<{qVO+Z<YkF8X!NtWf+le-}M72;{(vu{w?_2 zNo2R}%hc`9*6qh>0LLQcUdEnZC=|slei1{SVJ~?lBiYtujwyHD$ z*`Th4hin;XhxBhj)%jhrcxay3E%#&6@o8tO?(jXu@j1d7DP2vNb}oBld=6dZ3Q8)} z@?_^j3iK4DQ!C2|mz5lsHiK`;bk~i2sn_Ta$Jp77rK=Fl9IQg?=c$m&c%iDHs%UHe zfTc&ez2*r~Us3s_W6*!%_#v(yBpnrGib>3n866n9I2IYDZ;iT==A6*uPiRdnA{kx0 zecd`7$|B27Z4l(HlMokQ_sF;o+N<{f=e(%P+o|k`Ajw1&*69Su%9LKxe249cy zR^s-=?a8!vKR$O8A719Zw0%Frrbrmnp;YN3oACyRLlvaKDvaXSP4)==KzReS8YlM2 zXq9c;waFgzCK<^ZHOoJKMl*AQmWCVe$!mW=ms!%sBaZeqkV( zn5fZ@R(8;zUaTkV)G+Meh^enC>s>b6_1?aWw>9f+P1{>JU&I_cckxjjH;Qx|vrVi2 z1bA&Q5y(v6on{j{Xzr1S!RhS+Ni}cQc$BvPf-dJ*)EF0 z8Y_M4=u+z9N=kh?qCH6#rdd9Xs$Zf2cO^>YQbEs|ReG{;SuTjDNG}TFS+)8ws`LSp z39BBuA@D=`4A+lq;}pjO0+hJAI1frTMRA}A zhD~9^LRrjc&cPC>sm20l64$CnBa6U3sw|gBWPL(a6;lRBT~pQ4Iab;6RiFjTLRDW< zH-k`r|5b^L79&%*hr)+(w1~J^s~gn{R^kI_?PBVpi^e*qE@qp)v*w#?zOnYbwGwsl z4+gKe2%S>g4Cf0%yH^Ko%QsuTvF1IQ7SchBqBwSm*5&pH#W8rfD(XJ~B>M>x%6!T& zyIjH-s4+U7$xbA4rs)#;`C}^g3OOY2(2!ar2+2E$goQ265fP`67}Z6`C7^LAf;UNG z4n}>csaTNf z=}PrHD6N?>zuTWFU79V$0ZcQ!Tbr(3OYa`muAK3tdVXHFWY%$Ob9T*+Ox@0G9e79< z#~$pO$OYBLc4P6IFWvX9NPAb%p04M;BbnOG+1kz1)(169XP-r%r=!S;o6O>s_9~#Br=buoTOPT`1v^^%XKo zPJ34bGT{Ycj0{~+cB@d5Bn`Y*YQTD+BNYNmps(iWmVB>c@om&mloJg?@%S22yE z_M>^p1C<=;#TMoY`ZbfKwRrhDG0zeqZpS#{$L#J=bmBGfgmmgI@1*TMr{VabL);1` zq?0*>Z%{N-?6SIu@HNGYjPfqtIk^Chh*ZKkJ#2%|gm48L1*KcXkJEDUzakB`QGULs zFRzC6xjBQ^v79-nJr63E%$nY_XDVB=l`XJRSFw0Tym>iOu_{}!D%JIXwDY#y3El0_ z)b7dF?!m%QRhQcP&|CKA#I=d5$?HihKBZf8b&GD+e_YpkzpnMx@!Kadb(^wvo2G5k zwp>}o+l_BEes%E;IuWQuY`b6Ac1yfHmZ{s4t=lqfd+4o7y_#Fu{GE&6y!egqd*Srr zo$m@W!k<{CU0^@VZhUXctyj`@Sjcu{>vkY|{W35GZC4Mb4yrtYM|G+uo}_)y$v5)) zWre1G{2M>n4Uhh)=`0Xl{5)Zs_%D=Vi+XqAVJXhalaXb-+p^wmY5TUvura2QR*zWd>6!Y7xvC&|{$u5cfwcT7 zSecEwU7|7Og(A8|j*E1PpYH?psTrH(e~{aUnKo(nKYt;_rgrRCuu)+PfjT2-wh3|r z1h?^w_l>LFXVtRkNa^GxiwrTTS%ZJ|kO<+>&&w`61F>YWF z8EXuqyLGGxWsKfIf#^z_GY9cTF#L?F^#k?`u~M1{B7DEHr`*+Py7~d@1fv5oBZj@q8KknSfyo$vO_$ zyb`-`Ko$l;EJTLxp&k{z6wkZC_QuLflAcgJUkdh*njJ$KZexH9Na~)Vi&|VdT}6l8 z$>Mhu_K5T*z8he4ax{#ida!dgG6W?MO-oNS>-xZBVqT}t5C$gE8Nh+6%z7b5w>Vbj zR;*5SW!+12%UkHXDYs-feK+R(E9iTX8rkG%eo*Cy>PDujEnC%=+Dm#B2d*EO*?M#5 z%-Rg3KKPNsAL)!YlO}mH-&s`fO@+LjAOhkn>pOBEP}o>=@ad-^b^1YHkmDO9#!-cK zf>EaveUD(1nAC^BN>ut&ArniL;b{668s!80^JmhmJ$warS-JeCNV)MBNi%w(vVj2X z%4T2!TxRq^^_}^mLiUSKStF<MK#t_+1DR(F8ZjyFXYy0s{Z_Ck84Kek9GJ)? zwmK-k;vK!T>r|*K#FJ@8J-=MD3uknbmEAPQUVE$3zB)NnAoHWm$!Yr6hprB6!X$aX>DlQiJw;pH4huh1Abrh%fVJ%$$>&(Jtg z(ayGPl7S4EE=GS+*mnvrlur<*F`4BI3~!DxT=6!Hz6;i(ghBM)s1i$Iq3LtMZjiQ( zbbuN60K#Ci@_GS|nDV}8PC2Rwv*N``(Q`FqyXPRkO zFqif+n{_RV7>@wgr_rQCwmaw@-&mM2=3wbqGD1sPi%UVdvONZup^(lwZd=k|KVKRY z=&lIpSdf8i&MsRrBoxPDUnNHJ0edcIDRgqY`3`Hj8!crUqXID z1@4J8Q>6bHE+Bc)R1Ve!0JZ9+jnR~wbjfv zRAD2w*Vo&#uEn#<-dlO!)tq)UgDrPsSEgclwqkkOy_{^Wt_3ZGq-qX%*9(H~1>veD&I^8SfIDY^JD2SLCM5gvcw)O-QTBW_qk<-V%759BBW=GzO-5LM> zs~O+ktZ#4Hw-=0v)WL_oiW_uM1u-SE6)RJAY&vTJjoASUW^hvbpvpbHeP$m=C(~9+ zdzTP=&Ku4dA-i~8#-9qs zfm7jS||_b>DByta>iH>Nyse^HtBZ+-%GEn!&bZe&C^H+V-rhKy?w!@b3^6%A2ZM!ojk zHL%2(so#>V-;!}}k@|7U6<>)#_``}0b7zg=M>WpQ<>ntPGs69|rjGi3I}QJKXW4$A z`6I6pF0(qI$f7aK4a6Y&GBJeD!6RE>Q2CH5(_lfKCB`j(lE&Lc{dN!M<4o#>Y{Ug^ zF$eczv?rl86-%m%Mi;xDjmx7XmX2mgIgJ}X*pVcrWm%{!saZeTBEcwb+>^ON@j=qI zz`e1=E7s)q*ri)ly8zD#ciKJi>H(ViXm#e%8GVh@ez+GD${$)Dx4J%2ioOeEz8)ea z$!dKN_wyzoW;(Bd^LTIsl(MpN78zn z=Gk(pAf8gwqZH5^OYEhK=yds0ouwrH%aAuxLBkY_q=FO>3=`LGTq;7k)Ipc;{{H@> z%B`Zh%vp!v7*tCk>6?5x1m(keGue;)5jr40+XaL2bkU#O1K6rAbAkhirR4;Rg9w<= zncixX(1AW3-;KA@p{rKtX) zr9f7`Y!F4#&+y{r0WBR#OrA=?AUM4GHPFvOZv;2>-fpPIq35fL9Z&Ea5&!q>z+Wz-)0*H3O@ zX+q(C>$st|=!Swk6z)tBcT=B-vYUt6gICKTEi{UO1J5Qc&lCr}`*r513bfn>$yO0e zcxiZuuwo31eL!u*p4W{ILqg%e;UI`(1f~z@pfl7J_kus^lVie8vW7=AYyywT2Ll`$ zevnWA!RtoZ7{?RfWD*O&sm-h4cn#HlYBl&&^YdH{DmMwd9fh+5GgT#ejwY5Tn`U{k zfp4m9ds9N;QWmw_1*nQB+*}nag-R*xuuut%QY>uZN`+4YYhsz2XR_p?!X4MQmoAol zp;)*ElWJ~5OXHtE^VD36?*eWsZj^BbOI*dvc3%i)7qMMb)&WJ2Q>E~=`~c!T1!aX3 z=vW}BGV3d=j}k%)%-|r`0MPBt7)_ihh? zD+H_b5PwG*;{$9DB|j+hT!#L+A1XXB0~JMUD0-(wbybT3U8Ec;iL>p$BurQG6~LvE zxLQ)tw7N$|US_RbT&gS*Mtf<{q-3YCRWwKi(}8-9E`gr^A|p@&gkr1RO37O(4+ICe z5_|#Iw%+Ha9@&<70n!nSDqteiu3^a$CBpcixa8zQOz^M99X{dUP$<5dRS;MAYKMS= zDPTCxFUZj#rTgU|UBOgD^MUkJiDisBMqIKjI8(AhqmRR;Y5`EtaRNyxUq>R3uYx7L zS$-cJ1N6|4*GXER?H9*FtqQKGs=wN!69+%b1pO^)jTCB6)0p$uX5m^8Q>#_Q^s}TD zqAB78T>x0j&{hY<5t-99ScFIgD*v<4spBU;=1JJxqC=FDs!dmU|){$;;NdlG+p=;fjILB&GDAm$`okrqTxAJzdo zIM@?~_TPxmAx%)Er=zy}Q*Olg67UblN7eHUX^*HNNi)N6j;c}}CCWS-LS>^gPp_DV zkE_mNSUqEORVEM%p$$#m;}k+u9j`Qcw1_#9t2p760uBvBX|qDH73kDm<_oJ|Sgk2Z zm$JiOIEO2T8Z}7>6igRvON+fQQ-_4?KrMoR=v2&UVtJ6YgLJdH8lP{G=RqJHQY%(g z1#i~7-Tau9&1-k5tC>2hXA$8FkiKcq4pB}n z#DT#9roX3WUvM_VUm+3>p^9~aSA4zqo!(4iYqqiV>fzLh=`NQ0y8GqpzzDxl zGE;rC?pvL=thZg6<(sq1H~+!V-Q^#y{#UW@$L@`%PY=wQ4HfHuX)slI{*D}Cr$4m= zlPVRBKv|}ISGIgt+P#ZesQsbGy{EzO!-l3kJI!Fpy-7WdI8J#d>0u7gmMAW6K!A>O zL>z%H69;P}I*7z)Xco)suibdX5wh3K|SQ6YD5j21Z&bfpW(Vm8*(Kh?Ml8{SdzBe zHa*vbOp0h@Tm)l)Kj2g_?hXB7^)CU#zob`@H&8f5_=m76$4srE6@P~O^2V2SeBB(v zCiG?uU_cD}0jBt=J!UA|*8U020DdHcUAeXs{B!rkTQ7cZ{JZ1tzjFH(C6KchiLJ@) zgDIT|%BMd;dail?yYRuR@{cLthvcwm_sDmJ90#TU5&8ZKPTs?hJ%drBs+xAYKK8wt4eVI4)Ab;(A1x$7+g8gM*1$rgGCMo%Pqe`8R|K0!^9= zJ%)8Bji~;;u54F7zB6qnvTY|)PE0@<`)BQKjWUE%d9@L#vILbc$;cMxtFnyjsOK$Lz^wS$o>p!sn z>?unP;dU+8tujY<(FoYVV z#ui_p$&wC$JgQK7Z=Y<3;;cw%l<9%ic|_-H{esde=@fL5GFEbD8FA?vt)Uv?GjCxg z@XNG#Y@?uGqH0=6TBRyU%bRg@;#ULf%2R?RzJ`bs#Zdh}fJ&UAO!`m{ahRMIIKLV+ zEcsI)X(4DFpcORGod1;pp_EV4S_=VEr2`~yyM)7|=i>@ekh_5-cTB!0q91+5@D=x0 zO26XyidT{}8sjDbHm0BrOmT~z!mD%^j8`D9n>5oIo!O%ND4di)Nt& z^5v1F879az(%!<$0}$u=tEJ*%Juk!+}Jw*B}Q7~;*ghGCV<1jo(_!b>S4sKK-dc{H2x}t zN_~7tfftHfrH6CU@p$}7S3B9r#J<{tlQy9mS39}%eVtwHq=|*TO)DLHq|**HFy^k2 z?8|QrhO6GB{dSGM7C6CEGXFWGq)T55Sk^m%(iGXXdJbt;(@Qm_X-Ay`Blen(+qL=~ zD5Td$johBB_tgb=V9hQh+dKRsj2eI+2}32r5XlkO_ChE;>Zc`GL$Zso&YpmAY5NnMGNDu!Mh8-Z1nR`3>yxivWGm&DYNPcwykNkpQ_ z@gITQpHDc+uC`Qagu@3A@37 z?T|uWs@GVuL)8k6O_|B(tI?xaXCt~_p_jRYN6AOpF6q+Caha{jW-yY~L)ODwY}_(` z`$WbPV~{9~qq7c$$Kuqh*^U(5GAazhpw-~uxeydFLgeSX@Zd1UhxPR1gi%2QhiX$yr)J5cjI2s^noJ$*F z3=JI|Po4`@(UwMvDNjN32yhn|Ma42*IS*QDrHK)Bk!L$-4~ImxgHRv9va86y5mOS3 zN$2epT;u$U%yg1V&}YMzFGxE1aW`7AN6tqv3qlGyOn?w?2s}K=c8Uy;nn&RcDr&EN z?A%YuSTEIz)fEn*Qd~2DU^UZB>N2lOX2=k`P1lMvIy543>X?KN&0_on1#)$j)aBcO zql}USSC*18eQpMzijnzc!yW!}Py=D2NgSP2)Y6z-m7kVWb9hRNLt~s%Ez^ zYwR#@U&4^w(`3dNbuoH+MaI*)Ld*}wxKNn}v~$sI_G#O?i9|x1;gOYz&sIzt^)^8D zB|4LgZ1BE2HR2gT^RRm7dCs%-44WWfG=wd^L<2KnM36Tb%YhsaRA+tW03 zfn7Ptq%V?|_|y~^^fIxJ{#wrhlo2t-?pz%uoDra(!G?#yS_{dd>^!Wj&Q(-pD^}d9 zzF)B}U9k=qR@~^F9l2k*E?v0}Hvh^hAaAHzk01CjT+WY&16n*RSpW~^dOWB&;d`_1 zEn*n)OBfNap?gZG5PzMz>c=RA$;p3pTwEqxbbcOO&~+jAE4QXAw<_q^h9CG8qk{$y z>lS1?OmC0`LPS)7Kf^d1#BTA%aQFd&xSZ_Y!Kby`^b&qgEGuHBY9)HyEct6xCof{d z0Oqmx0(Z*3UzuLMbxPuE{?B-!Ycn$f*nr*xkLDuUI;Ou}bP?@E#Nv$30wDrpH z7F#rJMP|tOrL;7+$fp~me)|wXPdC*6IaO;5qAR!29!u99`-XfQZQ|ZbKOVoo>u7q{ zQM!+ozNJqc#Vc+crQZ9Ir>5SGPhW4rK)e!Za$7`PPP8D+ExijMfacX-83EITfM<|{ zf`I;XUH><_W;=`_i3#GfgwW-&_HY`l+M13<*%7VRRnJqvWI1 zunYuIoj3vtfD$7$1@2vdStAB6x-4mIOo!O0@)0<>4#XY~8KSJJtMdT+i-|XLlB^Yj@VQ``(88uCBDJ>p^)#y76SD{P}G8^J(|< z59M2fE9>7r@YaEuiQn0lsoa#U1Spus-Bs^CKP$`}NxRnIldEmI>Bjw7CV4GTR|V#K zSikt@>TLbmIV&Rkl2(krBPX>VS3Y?@Z<;wAo+{&46>m+~Z>6h>w`J{QTyD-{b(F~$ z469ca)8$v}RIG_^_#ptexglqQnaiJr+;0QbUncf#$07psvEa0mHGfbem|(J znX!NM@QuSf6jub9S!gY02j!!^0r^;_?pPM@`kv2Jp2}99;^}ael2J}aV~T%%r{~Uv zOzW;}>n{Ax)b(fa;$$FGc_v$VCe{7WMf;{WXe{sYoQ-3 zUUkc!S-c^;cmrAElI~OP#hoqNa6#9NiCbf7-xhrMeaaCzjrTnp=^pCuKYMRg`uM4|XJf{5I_o)|wlDZ$cftL5WmVTs!;g15yB+4A z*o|}S-93m$95gC|I+C+8VE!_!vCCfkINU@WRIuw_ij9EZEbTTlTe7F;`Ep@8u1um^5fk{P##uno z<7ru!QkPOUuSG1E{on$VDNeR&m8vFjyTU2wfuXS|<6|QY<@i|el+mZcSG@V}BE$a-G{(MB;5#p(6#=n4f+daY z_=S;C9Zbz5Z9oz#Hcs~h_%DqNT>@+h?+M4L=>!U{Xc_3!5a& zkURJxWa@|~ka0>^sHm(?S-V5mf^mU1Tr3_DV21l z=V5-e^=Kx}dCoB~RckWj&1P11o`E{9ZiWM%=YAMg6RZv?7WI+y%H6*AlZ}mXa)_@M?~3R z>&i4}e*(gwr9|C=tnARG;xpT>+P~OXK$ry1{yNMzSuPwt!g?$T-fN#)_>}yCUDeGc0hARz8!S>^-P4}xd(IsXu_*0jw zY{*qD%2h8R|Jv>8+C4L_Y;8-rw&kuszZ>?d%yam)blY5op?dQ#4bE!k-;pzC zaQYT@U~#D$8^El0#jVY_UG$Z-w=?7I%z8W1_D;6de&jv`rrR0bkj1vhzf4r)Tc`na zrc7TkbJ`JF0|?>IHS<;TljujpH_P$$OjjKxNSZ`In3S(6Wl9-R=3%p7dc&SH7HX}4 z0yGC}Kol106iA&I{hoZe0#5CQ3FLP)W3eF|RvRH>4Grf4XhF&y~+lN`V(z} z7?*P^JYO?Q%}`<>3TJ~n-Pp%nt1pW#CSLN=%*hJ z?3}ZM4mJ*<$X*PunnW|^ARnMlq zg&&+Dz`-LjkET>p@dUnv%4NI*S%laJc>Qd=J&57TF;1<^n};^KVm}-#83)OqB)_dN z+E3{fdw+*~dufevat1dg;AcoO)$PP{H-4x?Po`h@&@;jo`0;G(NDj5-zAK4dx zNOi}0%ue#LxXc>Tc}n%9nCg3Gf^if%Y0%;<%##L!CeQiO*u_yQn4ywsq%%~i<*?dq zAc$@JoXvvo-JB828jUexS(AQBAWTvb|Al-DHmO^@LXn;}^&!ek#k^Zp&gPoUk1x9@ zHDd_3P@Yc#c|mH6$hgo9*D6Hi8oV=_he5;`PRz%+POP?!^~8L{yb@=~A!d{Ko8&MK zQ$(q46MS;l{Fiv&vP?WdFHe&5JUQ3N`3^b1L5`c8-zVq4Bj-JG{+yiuo}6EjQ%>d7 zk+YJVcPOlteCx<*Cx>p3;0Fsj$#;Ytft*2>0XcN8lple8nS2w>p%=tH7m0Kef18|M z3hN{17&)!7a}Y1%e}MrxrTLpPRaxzG26EaUX`JeLXmL&Lo7#6}U(QlG)ic#|r6*_c zO&yv#bmdUaQk7<(jHN1PDVsVxb@f-N@i6wSs{yI|@7$u$a9!Sz%jKc9i!NU}x{G z)*fW8x=IulYa9$#!qm`j*^A~FozN%t=8>SE_aj&6u=90 zGr&|=iNb;!-Bw%)p?4a)OjfjMk$cEu*tTQNP|eWzSa&@^<}~ax9x&$o%jR4qRySk_ zMUDary(;HvnwHNwies|Wy6E+W`sF$Q@;TS2(YhO$fAUw@Y*@04B`G7EF668y6Q#$KTY>4A4>Cm?X?)1 zR^)1GbG3E3`X#V7n`_&cTe&*7Zqr=VL8G+`&GF=~0LJ4W8;=XSe5RvGjz~4-@o}H= z6PiTdHiQfTqhJV_PC%18fE`%CBA7$C*Eyc_A%vU%!klvsenkZ4N9lkn+dtxR!6^2%kr-?^@YrN?jI0;QR-|Mrs>IOK z81#o^fVlB=txkw3#Iv0#%9Jcptu40X(GNLECs*j??45byFvayJMe0jHM)ssgU5B3( zW1kos8+}qFh*`)Y|6$nXN1?%UFdoOYob$lWn63-Gl+2hc^ctw48^y8hhm@rgcQqnl z!GiiPfFmUE*PPa1`xUk`BkC+)t^rr7plx@O+v=A*JrMJpJuBWug1mJ&91AAI-=V}_o(Al1F#4kqvi>e*-bk5$kKV86?FLA%WGO zs?Msz>cPP#h&AOaMYAKjG9QS4GtxJ2p{ZoTr|l&avIM-3ZboogonJ1_g>y7 zKTn&8e@ck(Dv0Q&tJc0SCMeU-56kDo#J>43!Ro_W_j5JE7ab6+!vEM!e@0hfT&L$z z2LZ1)8{~^mtYS zOTiqeebqsx@->3zUV+RFTGHd9vh6DZ~^wdRZu@n5>AF zXpc5eRwP|lHsew|*DQKb@uP=xvNE~?W}RsslpY)!E;AYuq&h1-g+`(U=I_XJP4^WG;C+Wp6rG^Fgt4=h@@gVzwp=n%thkxAit*L9$hA>+} zm>FT_f-nohECpeXq%&EWEXTEH70J?M^=-$u0oex%bXyFQHE8`Z8H(9**{A(Z`qbmJ z$(q|vJ)U*_uU0^hDm;XZ>&aZp3>%<{d)f4|`LyA(kuDoF;xAb?|MA?UFIjurr7vf) z4sE_JSvp&#g-!PB`&zsKIakZ?wBNu&omv}x34q6br7>AIt2wByrp57Ox4x%nYmT&a z*a(#duU8a{@%lh`knlRfX?fCpAe{`{Ck7iTY&XQuh*6+KA{JTerCpHxPS$LI1{fLE zOOOPKc29T@6Ff`}Cg=y<$K_hsY@ELUJqiRgOF6V?6``08jheYul}0iJ+RUM47Ia!P z7LswaiE=yG_ z2znjTmB2xz3@L{q0UWIugVH5l&i}w}v7qQZL7fBwNgw>$eVpfazVn^$Y4x9sgV~ncLCM<&tF484P!{g{cA=DH^`ZLp zNITJ0g-6?qwwlxUudH>rF`e^hAz`xT(Lyp22=&8&PaOD&dm~%mj7{>o_4u3_*>HyZ zW}t>87ziANp_%C+IGK%&U$hGmaIuTACXO0&3p$BMi2TI6f_!6XOBv0{$`V!2FOpXo zyCw4bEzJta8oVkKQ4EKU1Cte;dlEI~AWDAIBniewI!H2qSJ=VZf47?KL4&bT=iU5Db}FGjpLtInexas)IV2 zH+KDn;J48_TZ#3~T$B{Xw5`4kZDTe~{Mj1{gXbdSmo8u#%?e6nnBz;qs`ZY>#zHR> zeAq^-C)AtZdr~Vdo~P;1R^{@G;hvg72N_nwHhgFEqU?5BvnOlU;%@o@@SotMS#e}d zh894awMUoZS|vDw;6J zzl5{PF%3rLSSDit0VwT4dq+%2LF7m@R!3wBMFa_?oQna7pa3o*Ska5Bny$<-zIJ`# z_8dR7SLtgW0{|LB^^YC40;4F(=%1}6fVU~QdXZ3}99~16ky<}c=0ed58TIA}f-Hf5J z`>fTyM)ikhrpK&mfcnwQ0gJ+-V4Twucr0%a7}YVu5)92C$2r?vg}!hpxtg+52%3(XXU+Lx_QV8O)>MObBLEAgSMyJE!&dvsZ2TfB z!EhV#OEc3~uoTQpoHr~83N=Tl9;kRDDlS$^qrJj~q~#GEj9IWj7%`}n=a0dI0-7ve z)7ltnq{=%Jy9X%CS@b%FZkr9G`89lPKdu%IEv$h19O{rwB$>tmCZJo{tWQ&zXn}Ur zK&MWRCm3L9Fdv&>V)a)6HzcR5Lu}h7Olhb}XJ~8JoO3Lr3 zgob!Vj15plvg^0_9LnjE5bD{kb5IX1ZaH5HK%-{rQw836zGVlTJ!`EbY?wua2z(S? zUEQ>44xTZV$}gF#wRBm|TUl$p1LO**R3q?|2?{xx8AZCWEr-n*V$2f5J_CdAh@aus zoh|}D4-7i*ClrGkn$zWOcNx%-t}tC-gduZ+Lf}vEa;DV8i{LVQ5D!!o?8FU7k5M9zL$lTN`flzc*n06zSXCQER|#&X5ZC25QDADW9+wz~b)k zOvBiiu~v=EPK@4EiOr0?*HYJq_nwEEC*;I#;>%Pm6DO{!y8%2h_nG)f`#lP=U-Ua>>dJlJtv5ktn z7H-l0kY9X&o7%HXM7%wRt4t6iTuueh7vnRTn*AW1CV(bm5*uB`5h+EubCMUzSH7rx zE;7d?Yg4JT%w@MJBJWJIxhRb}F=|}v<~M)O3RDpRnN<+Qbj$C)QLjuT0;`{A5ci9* zXr>~LIPNhSB2oGbx8{|O+al11mdB|c{E(GvDKrq7N(01Uq7={6Sa2vkC!L|C*yTTA z!okqKfkc4XoVK}t)jY{Bcb?{)_-~j`hDp)YB2RGBotE%QOE}rGCDpP;ug^YVp%1ls zs^NEq^{$=Y=}uhuoxyJpCI)Zqz@zTXsqV-1ve0T}gI?K@mU(vjC?;4kd^{CCzWB`I zGat8hB62wckc1fczTs-t~bssITY8%qQO?oh#XiPNz(W~i=A${XuqBqg|!+zKGrfz-H z*2J#Ft{=XTuHTT}G?Z>1O!w_eZw#lKLg~6D++5ofsHwQ?L2{4Dny0q>SueC+YZ}wR z_V2ac368A5_r`|zTW=rMgCoh{GpXP+dPDZPcyO&#K2)DedRNkWjyp!?1@6%4M1emL>n4mdz_Io0BaA2&ls`*^;iRyHnM+ zQq{I}YI*zHyOLD{sj30JYGAc;gI?L4u5bG8z_$jL_ap|A^&_eJ5xpwUDX|~oG)4H+ z4UPK;J%2j5@u||HAMM#dke3j%V{( z{+4O56L}slTlQd3oujw6i`w)QY?+l{2)+Q6@fLTNio3wD-=rW+l1Kzbq{1eYB{tR! zN0>L#3r?97IeXYd zWluhdpxVYx7TZrU*<56}5tB0XJayhcYiCE96c=~m(vD2~so3N&Bw%RJ=J0N-91{n1 zgOLVd4}I*!r@7Z>!!O1nue_G?s)}4{Ct06|?K^s!w<5AP87g7#(@}%Iu8D2P2ah+Y1xp!fl1)Mv(b-$GbjXS1s-R z<^yCOU|i8b1C6(*wMz(DHUWW^qAPg`k`f~_6S+!HuhM<;25y@oN|D&*dLv#>1@=d2 zC2jiVMPSDniC1WWO+H||AEXnU?M}0~jT*(hIogIL3b5v!8jS|9b(dh-qQ1s8&ri3( zAT<%aKL6&tUba!`BY&OQ(F{ctfJiO!@Zl0TVKublDgSeH)Y*m|x(KBhp6z~?L z=S{O!7wU0r6+qJ}H=1_H76hoZ4h!}t9A1R;3M~x6D|GB2fn;)e`VuFTqoj3ja!(Yp zT(>uBW?@DMLX-sIfemt>WuxoxOlkQ?KtpI4YiSnbDWUL=9E%A@snDj}>e)h@HS2|f zV{5%Z^y%EIMdI``BHhnNJWgnTixm)da5hyhq;w^fevR%_CZ2!C_xy@LmbrEbkT3M8 z>FP~w&N9_v+-rV37d)=`)3Qx-J=(_!O+93T4&AmMGPEgZ7{8CMG>zWue}CZCxn$G+ zRMUPvkbS}yG|=$o>vsa-l|cAr|82h>2qy!FQh`Hy*&&5AG?bo09tgg8A5Uy^^@rC9 zd&7k@#KhgiNuK<8<$~i;pQ(WehD4!&&+D9 z3|Qj^=U&2ZN2i4=M2aVZdYV2NTySrCD=`WHbDrkiP$)bbibiH44@5v#W`q zG>9C223}F%S#{p-OcdX#?OCbqx$(lSQN6Y&S-Uq?3#)VExl-LO&PJc*EJQdMf;>&U zDZBUVnwqBZetzTD66c*WtQPqzmOsXk_25ZkyRNL}!z)c;^1PBwJ5xLCIio=aJ%eTg)7HV2lxYs;*Z09@+@hNn>m(RY={KqtN}}z?uX6kqS>eX6Vw!INrch zgsbsuUzqnINKdtSALf2_?%bj4>y6f5B5lslP|i0S^1dnKr}?6dQ}_~mV}$Qns6rSV zpN3j!rHe(2KCFmM-zZzCnA(B6CHU=)Hp}lpyitr5(;M9&zkBA(wW|5j>qSNm#qw^8 zJZqjWyY7?w2%L1i$l1C}fJW3-Q-V3lU zv*2~1X1)TUp&UBB&{(cPmX>*bt?lb| z^R@4_xpR2IbS&IEABZ+OTm0tlhC`9Rg2zW=EhAH8H&Dmr-D=Nka$)GLiRc8n38ZFX zQ=~LWJdDRCEHc}{VClDXr9u#5;zOq=Hj0d76D>L|*%JSg_HKX#g~e+gGcqdRy3ycH zz?3~M0?!o~r83}^;eJb&r{If)o? z^V6JMxi2vv3Oq&N?h7`Yq8te8=h@3DL&yUqK!Y%2?Oeos^_SXZro&Lc{;y__iEigF zx67nRwVC{t>@&^)=;=&ZYH1jJGX#s;TANDKf}aS-qa&lva6^W;z(5N|29fktalU#5iY1QI0jsZ5e{RP#}IAKjSA;Epv z|6AD;=c$Z`_95&v3ILK|Fd>(>TJv+rMO+O716##FW1mBIf~q#lQ+o@LH{vZ19O_$)__>KahQ& zz{Pib1_R$4FTUW3!mr5rB1YVWzi_YZO%leHo`s_8B`r1mO{c_K7GO1>A6DiZ{^9*7EzsaGw4 z8hiji5p#~2Z~ut!^t-5s2~XXd^$pt+v){g&xOyYHcr-8UoP1GW=X5G~T5rfc0XqRW zfAUxFN;kCV4L#|`;9JivH~z=d-#eXb>`NT_xTXD_?&au>(YG($h`xO}*|j6pwFB^) zY}uJ=*_kLNkYknRj&fQ^Qhnd2R)!MK#n?cL63c;U1johCImh0r$|g}CC?SM zQsnu1V5@e_c-I7%2VtwM*Y#}ZdK8#RLD%OBKv%Hio$bprH=cU?>P`RKUrToHN_Fqj zgO4SHkEMc-B}xcg&C5-CL!VyNC(v~m`f&b>6BjN@pPf1}x79$xAx1(F;RKb{5Ox>D z8D)@ac@&CiFL!qT7(<88?J~at&1R5OAlBd_7i5>BP{dr-$U?O8;Cfoq#__RBYQ<$z z^ecZI7i6(tcPxlA)?fo{r?-YXZ%Lzjf3y?|Ni9LlQ+No{^^yzefb(? zjr5cFjE(v%BkgLG_HU|X(i)DSic$FRt@+;^JEJw(W4F?`H(zTW{SawhjD_Yy@>!el zZ)k=F0mLs1qS$CmB!MVZ-Qu64x<#dSue)IA`S)M6dtJ1P6_xR~7;eb>g&Y-V&O?K{ zp3AIu)99|}oB_%kE|&_85+JybTrv?G}Ux;@$g5LO^MiBFD5JdQkAHJxBM{Thqb;HOSNyi zx%1YH-hMFIelXR3P;WexY&?`|M4&N#;wojYT}ZOy^Qn%{>rH!-O?y&JdlnCiN@qv9 zdE@d9y}5t!$l{UJ<}M_)O?qwLTbrOx+}N^MzFLW3XD#LX(t*asg^!v;dgqst&CjKp zpVMof!@WfOjn@}nm;0xa%`c^zU(#z|LSVPH&gBEYw`XZj;y~iSjpq@5tbO=qNg}p* zbT!Zf->cR8mf*YXZT<@k_XmCOacCcnUTW&zf&7AOt{VB#Vn+YmH&UCHow%qQ6XhR zg@NY-c93+{kF2ixkXKU8KjW2j+Mn}E0P4rQ5`g*(UI{?`C9lLC;$QJf0O|@mTmb5? zdGG!JWk5R#B$HDl%dZV`#v9a0gEK&DF;&VIwmOAe$&x2mqI)4Vk(~YsH3?U1Vomd9 z*6#%-Z!-BqCciCLtZqH8Xd$9~%;X=K{7)ua;Idts5Ahz8GEkuLZ-QXC=J>bftD#GC zCLwWY?sQ8I7v#CF!^PcriKnY~t+)>Um&-g&E$I!dX{1j)m2U4$clM+Qx26vtOLuhf zW(drx*0m143K!AYiRH?fkNW7!IX7qI@QcW~tM?aGXXN|{>OA1->RT(;eDJM}K5k9J zL-gQC8XmU?hSSH6r#BC#w`@)C+MPamDjgo;{SaJ8x2<){7a*kRle<8Au{c=Vw&rms zyEcj+@|<+{#^U2xJ#x|~y&kj@l|ku9`?stG&iRV5OszLn+#W*aIR0A)NHHGXPmUse zfHUe~RGd*qTchQ0xLg{oh*rkRqE+};4TsAcp*K1Dj4%*j{K9IR?`(J(-zssM|r*b~e!k-3C!4^Gs214yY zx;C>_wWN2EfZX+dQY)RjZkNJM;y74hFWVXPrU$EReW)M>G>P&QvyAlPe(n+XnGB=n7Wz)vBX z!X;N7&;~18_M5+)fByhK-nDKlltTxqh(TT58bk{fPA2_)h11ui`^|X3<(o3s17+EA znN^(Q0{UiI-WR*7%o`f><3i&njBwG3h;zbQt7Z^ozKm9x?Q>g7uF zy2r!VJ(9nrPh~#i-)QlBS^b-pb1iaiwZA}qMfChQ7(5BrTYAAs99aUV*7byFGZ;6 zW-KKT?Tg6Oa+m;Py=eR*)qTYEl{FCj(5UqVV7ONi4fFyT*U{-$r|gQ4Pr~~dJu95a zKh`I;>6z*A>B$^-La^a7++)UP&y5?A10IkEfx&DCZQSf?u(Hm8!uc~&=+NQKN)Rit z>HWIh6&ja=sFowM`=RQ?Y=)Q(q}Z1xt6m=K&B_HbDYT8A1u~U$jHDidqX7}h zh>tS5Ky`JdpX09{W}1UjmN;b zttIL30oIR9T@DeZZRGt*75G6=y<+tC;nb_Wh%r~ zhET$patl_%m5R@6*Ok8dp@on4DuDON- z4jR)Kju8+i@h_tQ!w&7d*V7cd(>T1+IGk)8Ni~jKFJCN4cnuE-tCh8PD!W!HyOwt) zD+f}QV$}YO_oMnwz3W)A{^?Zx(|Xm@t98wH>bh3yx{`H0sk)xUl5|6JVteA1rI}wdT=52ay{u3@5u;uergZ*hHtF?^@|5`DA(osN( zr@DTv8invjt*5qWu_``-(fIG7jsqUg2cE!zCyG9(Z96dJ`(V(^>!FGRyNf?~%*X4; zy}aICjO!C7cd!PdW?t9vx~d>`thEqw1*(N&78=-Q>ya8pWXAh*Mg;g9m`@L0*9bG& ztPpMiWgobSaPuwvaTdQEgX|00)Rr9Kb zNq`CWpIRLgVQN9@>&cWTD?%k?qSj2N7W18PcE${U4RP@ffv_}C&W>voi)$pC5rKmt zYvT&nl^MSD;wprTgqz&NSLu90>t#bac=h|d>g1Kpi~W24>_(EQaw0?pT7okFhF|sZ zwSK=@^~$ptA_FnL3bD(5)Xs&0|w>nlNgk{Gx}jxs7l5sj;tZ=VdX&G|gx` z_`-)wb~3rmWEYZ5$z}Sj(zM5T=Mt08F%kCY}5jhJ?#l5Pcqrh z^wHswFxoTKqzB`}#&WLxXMS{;uhkq--Xu;&UgM&y;wJtX zA0Of4fcnms7arx^ASnA8cZ4P*8|@wRW~TZ%Q@+TBMw?@HPcwOu$!{|`$K(wrVI~7i zwlMiV6Y`Q|erHYmPs{coY}V{#Y@fCpU5~On@r{60xTEoU*L=-hKceuN$%x0>t$Vth z=c=djn*2-K7d6-9U)r-tcb{v%TCWdoSAGSO9*=iG_k?rLw5LaRpJ~sap6^V1&{?iC z?djFsXWH|)p6^V1nsxV?_O$BmGv7N~bdT#ydv@sg&a`J(&v&Lh4Z8bW^Osiou9X7s z7gt?7vUnh|p!<81{@#?o_nLRL2w^z8y`yP=pYA?a&2XM7s3+32Kcu_Qw7*SvpSk(u zd&dYA>d1Ms?suJO|0dmiru|Rph0ir#S#il4!~l;zLBFBh9nLeib_}hFqCZR-7 zk}^+c-}0rKdv3S=_!a$yv--Iiy>BKJnnnM>=aSy>xm$yJ$Kh1)i0*HOhT_te<*Rxt z+(M09JHA>GcykCtU*hv_L;*R;UEaHAKdA6DY)TB!h1RtS-P5klq^BM9(;4p=809`M zbaV?PwVt+)bpJ4eJNAZ|cK6e1R9k4R=`k;SVHHYXG3skr^98&RpyVcrGPs-aR>9qr zw+a#!Uqi}UuU_tv&z|;ryVgAU)5XUV7w^imdy?AU%lj|+8oUrBgRx8HX!ZTuFS1Q^^%K zTBjUUs&e1oJu{dAKvD8Kx4EkuK|g2uHQj%A|F8bL=N+%tE#MmYAAch+P71=G(}Q-E z@f*wSw=IJ3svrp?f@G1bVN1k1Vztn{Eo>XH;jcYxk2ppgk+PApNcl*4#5v-OxJFzN z_lP@EF;aoF4yi2ciFil6?7lo)8S#zyB2^<*?AaNvj?|3QuzOdyHc~fI$L`(X6_NUp zdfZoxtaJ&oOQ}Igo^V5?ab#7bX{0H#dSrEE&Bz*-+8cf#vUX&xMX(A71*!5yLGrzA z6@>TjpI;*)i>X3PwJg4ELmd9Aag8jl2644TaqC!I9pY9L#Wl0Idc>_Pcv}mLX+TV4 zQLa|mEjP;RheS zAr1zorV>fF`>3o$Lh*Pg78OHraZ*;~(HU_<2}TpL)Gm%IvMk2N#j(ktG9kB%iI^CS z&WKa85=VyEXd)PjhN2T<&^?A%QOd+5iiyX@6K8{pjKq={jK^bRp&-f=rP$bX1aA)} z=zZg%upAdRB~bU~AvH&HTe}-Ck>p@l3`J3zENW5W*-&CKHk}aBf`k$pqcYl&Xe>M} zQ604Ca3~VuZ*Ws~*8Vuvd^(O6P(9nlNK6Wi(_fi2YifEl9Ewl2i&BV+9-U4gWt;*T zI@{f7M@LK%<8nAmC4^9K*4BLO+F4ui7T^Z&S5d^?dv-Dwp_aJymH`8ht3VyVD#3eI zjfzhOQTI_2in=LCYYtjBJsMA-<3qsxR7_#-D{Q78??2Ql4jp-H`01{}Ua@aT zJUV#fslJ}x9A zko(A>*!RTI!+pI7>l^4ke5|K$;GlQ_`38<)B==zmqtM|aBE3*8s;_s53VWh=u=@~7 z?mEzSxNrDGyZf=e;Q^E>K88ZO#G_q{$D#<&IWZuWa4aZ&3g$s2I=bRyCwE(+U!Mjs`K_g5lms>~sjv)qx2)5eUWu@o4PqcsTf++*X$J z90uVSFZ6**zUk#3EYCHoH=X%H?XbfZM`HxP>0nR(dJW&2I+*qpVxS z&ap5!L+2?C(WeT+sV57=^o}l!F!%E*{*HlILTy|yOq^q4lE^Bs$!kjd34}EslECyN zb1g+MK_bE7(5MnrX4+ZZdP4EBm;!=5GZh*`9{_<9(HOXqI3_E^2~k{RG!*5th$yGt zZIV1CgM@>W$D*vPv(%5ke;!@vOFuA*uu*w3cqW92Ax45gBf~xQ2~}u(Ix&rU#~Fvf z4I079i^jx>=^$g<#G9hx*-3PutcY5r&xSB)P@id5@vxi_XJXS}Xy7(^oT&Zk_lua! zBohQBNtQZ0#qIu`>@}DN6@f9#HgNMmFp(>J4s3oRu0RG6a%GB)%0+Yb0gS3KA_Lk* z(G`MVxxE)RuL`r41ue$(7m}r5mZ@fifL@LyU~*Uoa_;>5L0xQ9u_@&N6oY#^`1823 z77uZf0Y&l7sqW5`$1qdkCxesG;P}ZNRRD>f?1lt@?l`K%h~?sWNZh$&JA$XDPWsQt z(K9Cxhel7vLkW57RB-IM;Dj7M3F&|aK!?_?{;8RqGZ26Xln4ZpD~#mHuLXaNYD4wA zAY|Kjyx;$B|Ml6M!|C?^Ond*FJ>zUhvEOZ^5biW-MD`g87*2pX`L&y8ix3K$W4Zkz zvH_vOY0A&8Z#;Rbdo8zE-s&@E@aoQ+ss`w1jPUyV^2P> zS6-XiTHWRmgdX9uh_wy$2h@Z4%=&XPZupU9%|b(YQDvOH?)hDlGuXm8LGu zkGroU^7bPD7lcKR;Hk<~G^HvwepK6(scrqRcE_#S9oKhdc6Q&C(mVTqa4vJ?ROX13 zs@;*Ul{2++$|En@1kWbqP&T2AoUcoz?ni?e9xO;ut&U4@%hg#@5>ygR-U3j_hrh(lUQV!%k5)W8^jx$Kl0C2x^n;9}vGMd5CQuac^Y!Yf#K zby2uSYLaU4J}--}D~hjV;VX*5eRIM&%SaWb_i83N1;2?gGAOG$WE}cNp2cCds=P** z4v4?Sro$2m7RIFU>9I)?44`XqxvgEC3I}IE0ouWF;|ZB`O2%)XbDa$)#wPKsmiici zB61|AK-+{w3f+|}lT*{mR4gvXp+&_aCV`0fd~AH2F?m!n4*f79ORRV)b~dW9I#R8O zjN~PgWh4-mx+|gTi*cTLYyM&Z(6XUKvML5bQm0r%BSX=|sb^VIdigL|ydjI&*P|(5 z6PQ+9oTF(}q97o%pdd=9W!H!*FJf8=FIz&F+CAd2!NVZT5LZb4(8|eotQ2FNL$xQl zsk`sx}tXI&p8UC3dn=7pRD_BxJux!$m#^2|o;t zzPT?dQl~a^EJ!khws3q|Oi-urv>G-G-lZXh7ppTFl&o_?P~JQax?pEuiUdSUR;0$3 z;?PMGB$Sdg3EKe)e7X^UhC3->;&bwhHdqOxTg6kS7#lrxs#EL+>6hbEuotMNhr2Ob zE;>>fV!mTBMIw+DLvfj`4w$5{u*f2mymO*F6&su6jifB}Vo0^izLtreKBq{ryf@@38m&^_DuyB?$*G1CIi!e_q_>I*`CNjH$UH&IxATj2Nti5V z0roz^5Sva^i=rxFj*nxMQfIR~ypCixgGQjEiIB~Uq`Ka{MAjN808!pLdMj_`@~?Yt4)N$!cBV6$~>|q^#f5G%G^8Hfcpx#uuGM zGWrhxHqKeWwNHmiP+PLNXttjM7RIt*YJmHoN-?S}Gmb*C(E5+Jysa|lU?e|Ru9Eef zJ5PvnWo$OZa}L%YIR{Ki6Y*Smd?q>uww!ZAa3FP;?(M{#a&}^#&<&JuuF}AeDS?Ak zDp#%|rIdthlHeVX2buEwE=0s{T3*F+MMBrg1i@_f&+BVabqI>`Tb5t4SV&WJI|;9JEt$&}Dpt;^ZR}bym%T);vSo8QO5`fnawV#@JF2ZzX4Xex zGH_|}OV+Bq1P0i`80B0tm$O7J^en%Y%;l2YMK$y+o2#P4yS&Th@|4I`xoj@)L~+mh zmd#aJxZHN$njrO1y=JY6X6+uM9OE~?FsE2&tD=mNOgn2er$&#Gw#BX`v0PQy z^7FP?+c)YGq@=3X=@r`Dtc{j9-_vJd6ox0frCy6?rly(!r3V2@FM-Dh93*gvz!3sZ z5EvlPM}TIi(of)V0#6b+4Djhc;Zly$;{kxSm7rA9&~us6tF%)1lJBXZ*itVuzbEGo zK}-YvgQ%v^C{d`>+1nMGEIAihKbZc{D$?d)_6|n6a$b#+28i;pcv8)oc@`QvO>vU; zE^sBBH1%Y4muj)l&0If3aQq?=`Z?@e&W2xfyi|U%oLRS;Q_kl3hXD95+q(Ik{x|!t zp1omDx9-cd?whk;bZ0lTzjOM{)7Kks^rSa*Wj1sn(3AD=djIshr*Evjsigh=89&Tr z7kygFh8sK58}?^5>_=clzD#Snbx)>s50&}R*8Mlmqz*ov-g-Q<^*EW@nzAiz?{vP| zd3F4{ly2FRX`ytkZ1bjfHov*~>apuR>E_*;=G_Q%W><-CY<_L?!qZoS=~de@tF}>z z+PlrQZ0mS`)w`>%AHLa|ZabK1JBXA%t;`cQtm)=GnPz&C=i`P4-f+L>UU=y0j&y@R z)8L=;ezIocRqt=jrq}dj*7T%2vAHMap7_D09}Wdl!DzZamg$edQsnYpbS*lC>Xom$ zUvbZWWuYfs)t0Ghn{#9bhEfB8@0`qR?Y`NY-rAqp+MmKt4pC+2@Q+z4ayIaJ6GI|9 z5154I_D$Sio!??KAC6lkE1vbKfoB_@X>hX(&vrcPOa{*mJnQTO&t-Vl83Ufn@vM{l zaqD>bd5h#+(8;-0GW~^B1mw4;fGL_M>v^l>p0)l8d<0&n6>!f0ALsem$R;eCG;AW$ z%)4U|O(>x1?<5q6xOrT#FdOQ#E>sM!PolC<39o|hUUW0trZwqUAK$lL8Q>GxnzQ=1 z7U*X>cA=R)8 zzpK^rD;KtZtBF4uA?wPdd#_fsc*nB8&3O+k&)H8yNWVXuG~6v9%L5+^KR zX0ry6>5f;{G`o4w-%w?L7T|*LvA6cp@Z}RJ&)TfvuI5tDnPJG0)#`CV5YNqM$py>*wQ%coPGb&Eb{wR_I7SR+)|z3P0$skUFn-*m&S z3}Dr+Ow}$7a$oCwZ_3xI{+z806L%_UY4RD2Y%G*UXUxWN8f$2pt=V)+nouPYX1si>|j3@}3@wQf&0rS!S*u z;QWdh6lV!86A8Er43!bYIFVvgvS3Z064}2;+!p8*Km1YQE<8*U|_E2qq?T~ zo`u${_H^CWOx@PG-mI@~?tHeY;S*ou{Q6(3OZzrtd>de=^)`NI=hf+Joxk3Bqx#)P zu0Db!A2+O->%L@vsc)|Dqx#1A)+=o-L+*bt`bsO&ZC0QD^TY;~poVS?PQ*^Rg zTArUZr`CsPp1c;XzO)DlU2+wKRza~_gcE{f9}>`?8^?l|P>Q?91V|M?S zhD_IBrt2xT4)b)T_UV-8>CZna7pfX)C>TJtcIBmAmv$}M5c>J&pWh|{>V>Kn*kC0zj0t557*!MiBL`K^ARwtb zi};bJwsa>uAUj>JOE*0D<#n<`>uPtrI!3@)%sfS(_B7e=HtmVmEa=l5iS=vNVy5at z0;VpNt6uulwHl_bEm_=6s2nY%4zksD7($qZehOTkS&3BVu_99SFn3w|_Ll^FnI_vL(s+>|=mpcDLp7Az&G)7&nllwxYqq(bv}9}dUw`mM^^KYvH6QFw)$XUCXMfgPo$-n(Z~I5J z4VODp;?b*#OveHI#qZ`Z{ueM^do<-a3Z1cXE7CGaxiq7C7*#O4jg+QYFfbMvV}Mp$ zGN=hPRdpA?_RG)z{PXj(SBKNS9U0$_lyk>V8EM56-@HJz4AS`YWk^$g9_=i~ zmT`g?V5=}{FR-QjB9*dhI^R;_80=r;vT92%?g%~XJMh$3TYt9J_7p* zkP{74Jh(NCrUrBTP`c=jBtIq>D6@3;4FWW`l#2u|0pz@@rD_bW*?|BYd5$BLIler~ z4OZmw$($E{fg+won?ApQ>Bs*qS|1{}5du>dUv(M$Mw(YRPQx|iuFzlMSidNk!Kz9} z?V?}?BJ(vVcN|B7d8qrEu%MdzNVAQK;lNPHHfYi0)1pPOMCN$A<4IJZ2zppPt7GS) zpaDG}1vr<9*K_6b^RYrmAH#qBQdJqt?F9st^p07@yklJC9RoMnCi06h>#rl_2wz>o zOUB8{ugx8nrpa*Qv;2!nRnDWTtsva_tIA142c}u$l-FJC}1eor~w3)NRYhKEg1(-O(*B*!pV>$9%0zS%i+;c*^ z4tFLI&4GXlvWLMka6b!>ScIFkY73B99>Hwj7mOZoZO@BsWGh=xXSkMz|CL}pE?Uf? zs2}%Vtk{9vDQBOE-v=4REUj<1f@K&SVbY zuB}`drT|*!;8-TUq0AF_l>k$M)b$f)bN&{EK1P7C9(pJBn{mCwdys~k<`O)PZirJ^ zU_|D%67sy9e-MEGvW;tC%6Bc=%U#>ETX$UFo7wv4T>qk5Xj=b<|26;BmDks$SM4Ib zspsP3*@osfDqpKyn8uPt!#3DK5D4qnT;J!PRWKum)wK#_S_RovO*~VhmTazX(ScZ4 zJmO^W_*G|Di}1achOS3!-`j5iWa~;MX%fxgrZAGI%&w_<0Uq+ACHbq`^wDVLF!_X; z#YJ^;(;AfO2M;1ijxlhmp8`P}4TZ6XgzfSwCcOr70B@aO_-t^7{2Is|JuY^VWir3f zfZpv_{SC2`f%=Lr2=iXFBUi3Q6^c&G_L+3Co}@~Wj1i|C7lh9|Le=VwuO;Pd;p}f| ztKo|bRYsek^2PnNE%)TFT_nJ>jf3{2R3yaThfPpL64(=ZiMnnH+mFHQgGEO+i%OUR zi*U_Mer|?qM(@5x$R??gOa^eczPN{sc0r5T<@$p?H|x?ndw;Mg)BjASKfo+~r!uvt zQl3*;U+o+?14=LrVImhGT&4Wze`@{mg>1EXyWAJ+8AjUfrDvFx&dGWP{OEeEXo|8^CU!u{P>b7|M*-7kIp;@4BoHN_)F zuUP|<7cQRu3KmbD5#PmAug$L2)^D%3+Zw4Rse(W zZJ8gwaw6s1qW+v)IE|4JU3x6jEGu62Qrt$W1KW#*R52qqSqdG~+M-iw`%8XB;+~hV zY*%Qx);^He>LA)2Mjbd>h=YRpG7`Z?Bhgmn3V{d#y-z`?*HZvxFj-x8BS7s}b&2Vh z36IYp71^7w_G5&yal1Jyw!Y;;=yck%=Cd+k#kx%0 zrc9mxqq>z?)pWf)aCsoRs&%p4Ugd@|#ehp)WOu|Mpenht*eGo$%GpO_v9L)9v!fPl zL{p0kMzm?w$1E>bhTNe^VBy1f!9(Vev`U)}S{p84r??fOjZ`jl^d%DJ9T zjMGS9nizT=zYsCW*-76hIdy5xoFY+8ZT|AdU!{s_^rRMR<9#nZfARU0^8r@FwlZEC z8`0mQ*3;m~3-9PVkpkERAj69CGJ#hBupx(fRC$MhNZ=}fmVsK{ww#Hji*m7P$E07P z=gPMUNCapO@gDgNy8AAH%LKj&U^J_cg3N~70kk!~1;AuhSxaUW0*J2OLfdgF9NWoc zQW~sch6abDby3iOZit|ON)~T-)R7T`13jJsxFJJ}Vu{T076(?9&7jQUXs0kEDDyZl zwas9)#nBDpNfAVTT6{JEgsr8pWdI+jgu*fW*Do5VxGcBl0PkWXsnCri#ao8TVIqMk z1bc~BGvkK~#t~-zpm9S}jbAW|aAQb?Y78Nx2pL1XsxhRJZT<0qVy{z(69v~{kam43 z#t<-IzU_x?(wL5`!u#@uks&SPPti2OEC1yfM~r2C3FZ-A+)rvC(M!2^lLkc21T?is z3Eys%W^n1o-cQ(+$dto2e?oQOZzJz^@=z2vg`oVMh)oYqkHW)!7>h1rlkjcVm9)}3 zKn-@4BAv!u0kYT>G>~+^d)*1t1<&_z2s_tEFICk_LK8O$P2g@>6lgXh__I^1d1Ykj z-rC6aZE3nRwM<8hsbSc$#r0agoOMt8BS_0u$cq$vMX)sh8|$!m!nPWrzp!}^8|blf z9H_iM>IlycE`YUQydQO5xHXYN5L?~4PtYjYWlUcW<8tpr#%{Rg^Z-K6)Q=042g zSrn6Ejw5B9noLv5X#T1h(g?S11N(0zH4vLy)&{n53v6KCY|Ey1cE7p%>It|Fx9rQb zklV0J3w+w-&)d+1IA?almUlvLhOWDA?E2l^=?%S^4ZR5VXu-}K&FKyMG8?FziaGq_ zESW?uebnJzKsCA8zO0Sw*R*;0FUH2jX$xj_2`iUNk1VpikZhQ&%y$_XyZ#h-xJ}5> zja|CDZ9>;iB5ErOD8HyS-=^AB=WC;C?0<<0DQ{ASO#r3qu$+cowO23Jpr$Ktm8ynB z)i8}?uBrbu>Y;1u+ZI~iYD@XHsXyno;>y`k4v=KIoxsg9eneP%muyD&2+6K`k-C}d zgw+^_Eevp-fL$CkNV`gU6gh%4s7v$7PO)zso4R6Wa3%^){~|`6U_6-Nhx?$YyjveX z2F}GKIGm7S+<{7EXge3x&5*=Zw6augqIZPGPISg**eQ#}sZfGsMz~{eJMgJfyn3Cd zPQhlZFR0O}Ch7q$+5()mVn(EiF6O^9@F|hhWVu=h3=0SGY;toV5@*s&D|ljd%t3NR zzTSr5zojwpEHc7aS>R7Y-~uxp3ghxvRTxt=*Mc3unW5 z%e-~odimi?58r5oyT`qFJjFeD!wcRv;hOs^w%@jV1x~mKFwF#_#cZ&V?7x(OK5tP- z=nRJ0g=na<%WP#UNJZ}`kqV4VXLpk2ik-P&>*X^`lm4VxnwVpoTXZ?rLQw>mvqAZUL3%ILKG){#nsrxB!im`R(tyEu zsflkxR?TeGnD%YSkfAbo-SL6@hV;9kTiXue=?{9p-ZBdXpK+jW;XrQwHK43Rz7|(}r-xrp;#D6!eL~HO)LNRC|{4n^fdZ z0A?&v9pK4~V&)#)PUNMUd_XyfkEl;0-s?*VXv7@2mL z_Oj`sST@JLO?MK3|3qLn0cMXQ%-zNM!v+k2cWB;t08G}O&1C%{a2(d3J`0(D${qX3 zFQqi#{woeLrD#Am-%voM*>VE|%L9urwZN8S2K;OnkK+-t;c%drLjkK@?#|A|pG=Misjo)guU;+&d?MLoNf_Ap{kH{GOIvIZm{sqf3yE zpF`jbXeSU<1oB4^@T1G@SdA}o>%s8SFOtugLF5BQPOvjtk22mAyYRvkp_j8{E}UCg zWPs2)_L8|u?eoUWd*}F@$FELYSJLY{GwVB-E_Ad1{Y~#~y1qBP`O(bgM|qL$+ulF)?xE`^ zZ|+LBAIh{JG8~-9WjHUYZj#|>fMeiUn78**st@x`x>iVA$v>#TH_1Ra$QqKT*8gn& zN%}EprEE8PWRajrLS53M^)A(Q7m1j^hhUDV`|(WrshuP_U1XiO56>hWIjTpJ!9G!X z^?=y}00#2DN{XKlRw%{OG=vndPM!Q|kb4QmyL1%Oy02+05&>jmQN)c|pOA|7gtb|d z|5_W7-RyYeg0ZN+AFabVL7b(-MUKu<#u4P?b6k+y(0(iuVEF~BE_4{5zK+3MxM&qa z(ro)woN_8O{5xv|#fLf|!LXF{8d0DeCJcBO2H>Vi8%$Ep zRea{j2sI(VjQ}<*PT__;iP*slxaXJAGso!nfqNQI?81GXPZ|zgK)BA+B-<4i5NaRz zlvH&lrh=FB(LK{PnQ`S1J?0tCWAsP{7j`lUymCsh8ODDYCt^IQaJG;xne=JcQOztv zgdb8)age}@mD##AWK9WYS2SLJCcCof@_B3p%&gk1LKZ+#i?wcYw&6haxM7wb6F&6; zMNKDsqSe-9uQrTeu*6Kl6woDbh=FX4lb^cG4@fq8j^e8Xe0Vqe8QR$C4~27qAu&&K z*=is)(#0AHXT_?DGm&w$==almE^6eHdx=(QDCyA zQRDF6a+|347w|>8n-NK;bU5G^CZq@&^v`8Ng6Q_|&;X9;!ddlQ#2CdlZbzCT{MI6h zEOGER%G9-{ed{xMr>Ny8%D`QQ__yh$`czg|V5rmMBn6X?VuL!yP4A&d)*lb!rj)BB z$P`UlcENShbj}Q(?XQ<(3OfdpzP%c`PlOU-d0)~A1v7yo?)D|!A~rvaJ%@AIxRYg@ zE$3i~aO4|HLLVI935sT}gcloe$yapFP`kDuirO{0Q1{lVly4Nj>xmD(#_v)`hcic? zRqqk!9KC<;w!N4vv1)7UBKW+@gz6$d4!v*?03Tw+ws1uJ8MQ*^LadM(G~u?&h1fR7 z^C{wOob}}Gnp?Q0|K6M^KX=Y|jPItvuNx@||E8N&JY*S|xmvx2y&6MKCC9QkN z0iPHN&XB;7xyAcD%Xxps^8-;0_&RkMEzdIFaN@Zi`ovp4aX~#GB<0+2|NZklV=Ih} zSh|DqUMg%IOp3t{LPiVhK9D0*?5i%UWo%iE*BwF}`OWYXj3Lm)^kuKebT|>hp|$Ej z$HB12;_~=(nC;LaF%HZt7R4tBf^xFqI~; z#WbPq$ZD9-n7#<$*HWXTP}|0Ywk7wMKyG++nm&@F9y44tLJY@0`jwaPPURNBH7l1) zet`lC8j7=ysLcG-V2>B6rK^!#8!WRQ`qtj^tzGb39ZmbTXMEdJ&h5p+MQ`~TWWBff zQP^^4+ zm@kz|Gci!Qdj|Y$!IL3v;8U_fB%N_C+;k=zwC(XBe|$`e`p04&tf&sj;Biq=D#nZus!7FR$Dzm<}s{?6YXUf@G z+-JHxxP*eyRg6u>D(KK{xToRN@)_NJ3d1Uv#BspJIDHp{{MJC9i6k>Ys9@wNe?j=w zZ7dr9c@3>r{wJb}tBM#tvB)K~h*Ppd5g^K*SgOM8gzlJXW2Q}`8s76HsaW-;V_7xT zH@Q|D0@yto^{XQT10mAEYTtpDQlpCIn2R@#j{B(AUaAMZLETKNAed{|A=PEMUiZP8 zlzjC2P;cs3-&TCV}=Pcn1 z7msTlP*iDX7Nx&yVcLzus2W`8=&Kfd7X--}N;|+chtfg!Oh@};y4y}*2Z6%jMRIqZ ztTBIxcL>#Ff`I1j#BRTgPyEp5zvc7OIT4TCEYEZt`h#8Rjw3%DKA9PoGsB^j&!6_4 z&iGEJoTrP&qa7tNLjNxU?N8i0+Lzb{WkNiWaD%Dmb9yX9F{MdXXd@aMoxXE-1UoVv zkNrViy5or-4vu67$1;Nx48fBb-(<=;$%lH4K5A%5K$63WplPhrXk|zjabxB&MnO60 zX57G%>@Gr!UaqR>O4F)+2p*lZ8dStp{gAmBI+!X~fCPLzMa`e5Wm?F02_3blr^ZIl z;fS@(X&lq%`KSof0KN(u-m*vr9J>S+@PDj-rkaU;H9 z&(`mMn;zM!y&C_Q2+-30z2W{2-LJXlmHiefml>}9JKeFBeP-`@j~;)6z;_9dZpS?U z{*3Pan!ukE_+JG6j=*0K_>2G>CTzg`BR&2Tfdd4{eSsgh!E6KsstIv_1aLwBw`i>+ z#{dHDLiIHB3vfF6u=-vE>(mV)OL_#b`26=<__tj2#eNo1rEVG#X+H=DdIAd2HjOk< zJO_sOrbSN$Z3Zy|zEQ>MXrvP_IMDM@fU}J9m;t^fQ);6~sW6mip<;CaFN87XolpR| zr-Rk8hU&qAp&o1WlRGw2JO_sOjcR-uHCqFEJOyyvSsgnlKL>g|1@MzW${g5DrvW{l z0<`>hub;!wg~sKfUIYu`n|^GL=a423^)xKV&HC8p2(dI8G^9ZgPh+JcTQs02paAWZ zlQxRyzz}Z;<-?o?_Za@`7m+tymfJKlN^aYM*nh<$t!5{jcwek!C!DaeNysEf6Ovye z<=B*iulHc{&RPjy;~8H+@R0+!k7fQyI!-xJ`ApC+QB7cy948b`X|D2}{)MTt-7F@gJ@&Ic)40V9@Y{!UOq z*J{>m_Kq+9sRew%7ETKMD+_s3IX|8&I-`0z@FPjsxv^}80AC^F4~)Z{#Ykk2ck1;=lf~E~;iR*BuTXIQlBMW{7&8WY}(|zpqfJ?xay4S;~LReMbYY)U1 zb;grtW&Tu@S@>1YS}(ZRUJnOaz%E+oPk6N_F+%UCn@@FAf`pTXdGPaBDQAH2PoTd{>PXcI)g+> z7YuFqtXNR;^Ao(ihV3qF$hM+->~(w?AEU=f0@VbbB5(pA=OX6-{(-&2cs6Z>IZCP6 z$Ucs{k{e-G^0sspo}T}wBrE*`a>0x8?kB>uY=q~8E8E)kPT!k-aHmM5TlZ#K_acyO zZr?rcyH&9fUlyd}aNTsY%g0Vn%DEYb4bJV$Ha>um{yF^n$h&gh@p>ZdZOwSG=eFE6 zVfmIG2149eQY)i0PO^c9)z=%SZGd!LUzyQG8V7d3}-0_e@Yqh@y!El#_mQKa;?Xo zoF!&j%A}}dePL(t?`Ynk{zxDJW-Of_fdeAkwp>caXa#RANAK~%+70(LgJpK`DIuyM<+#x3c_t(nHH z$UN~KUj4LpF z<7EBP_7*&l_HE11)~eIjk9{z5bJu^~ee1!)cuGC_ROZQ(sZ&zs)ahGK=FM5?9{oaD zd^-4XL(^eFk22mYc}T_G7KV$fPwT^#c;(&JhiSO82|9?Ig8nfqikdz?V6an~8R&Qc zL)Fd%vGa9gHvCWEJ)F1g#9h(egkr|T7nZB38|Z_|d|??Me)u)pLeE?M-}b%bOVw>N zub33OWax;$#F}ZO2ueGibP}#q8{=@0FYScYV{t4nj*cln21?|Y85u?C^im4b;ak!Q zoecvT!U#bgPlYJ@Hc}PQ0d*O?jxf}Z1e^|F?mAq}IMwLl477OfPCDCqb86)d{1y^# z&G5Ta)egR)DEaaum+@VU=1we6fXA(qDIg zDcT2;EB2aa7vJZYEEk!Ape~tP4Rf@x=@K=)cy#ck^40m#k@fYn_WAl#zJ6@E?ZhAT z=j>4wlDWwW4M3y&RQ;G^YJqw5}%86@k6%K$DM;3@r-PjtSTu?ip@Sjano~IXKV_4HQu6b5t)1 zX3%V5_KzaC#P$@JYAj^0(Lq@meZ|-eV2~>LX=LOo70$U0Lr;nj_aK2D0;>s#06DKw z?27Bk9HO8Vse_k@9tN*=^bZrouUWa(l!`O*-kgv7R|Yi8g;I@jS}@>lbDxus?d2D` zdCk@#@4dfKsX{@(}`1lp(yJ zOpl?=I{KCs%B<3{*`&pq%UG)Ji8cB3v-Z_;-$@{ ze*J0)LHv07$LWsovH`jy*2I3?nzhe%~b8Z(3dT*`sQIA&6X;sUlvE`CsGwH z_$|y{Poy^P!4C&RrfOU8o0s_Cl&1x*adWeCvzH`-DSQsjRrAeoroJuZq8~o}?%GAi ziaq?w!}E`&Yg;n4Ept8aW3FA7s@aL(f&_4t0Dg1bbKReR=2E{N16pozaqv;is#Hxg ze)GfpFQuI8rmxAg;A~Y$`0iSIYkSH?KPcvxdgk`c?fay5b*i=%KeUDYO?g^B@~uq4 zd)l{l9-qIWzi^~hE3Ib77xSdl_5=9coJ~FbOzI&0KJwMiJwNySd>ug?I`&CreX8;S z{O0TU-#ObS<<*y3F1NjYGF`qoQ@)w-zAoE@k1$(G)ibZawNhyM;*8|zbR^FAj+6C` zFN{@Dl$RFzV3`asiHLtK(J`ICcfl2+NZ7L#pf4f^a+Rco$Nf4#ViSk4!bU2Q3=|4c z14E-~>9L*wn?gi~_}n5yakg`S!t~X%JI=k4m^2-h_bVcj;3vet52k?8W3en+>n-+0 zfxtGw(vlLIjlYit-v#zBD;!SU|L*0iJgCoNEhvFK;nxM+1a%19deBA`-mY)siV7=Mdp%@&9|#o$L2_Tzj+KfJ0f zI~Q?WMkzQq`y&?fV`F?2`-Ckx*sV02+xsIH^J8OtzionLDGe`qek4%Lj~QI#aM*U* zYQdUQY4{@+{$pe8h$CRJkl42LpGzly#AAPKPSj(ASM{aI1^Ytudg$iLRQ;h$Ro?|K ke6pH}JieT{zvrHF?z!iFXY@fwM@Ybx`maAIcaICgZ|S9W`K<@f!$08R z9YGdSg6xsKIZxi3@_Ojmm-FTQDStkY3glZ-Ey(lBfm~}om7$*t+}>* zd#as32Xh_y&QzyIPy*~pwAqpi=etr}yeyRK&Tma^%WqHZ$nQ+;%J-yp^Zd5lo_uer zmp`}Xp2+V_?ZtCP>PfFKF36p43Uc^;uONJc|JIe-%1gRX(!Hi+J1^Oal5J~B_Q~64 zgn=E>FeV>LE-2z;EGbT?8Ks~rVn1F6LZK0D@g`H}7YwmKGa#NgcKq~_MW*OV!4MPD z;-aw>3Qa34uj;z06+~4R7Zj$<-4y4UR4^1dB4(MQh+0<6EJ$o#iHL?KN`;%^qQZ1E z(B=$DEvSWgQ3_=+6xB2q(2cHTjT;hEP+1lwUDqU!wOXVvNT7XAsWJ@Xs)Z0`)uw~l z73XvVf>*)&MUC&zCR*fjwLTn zT}q0mk%-2VSH!6cVl;k5d?^+mjfi8fOee->WF zSj`z^O9WMjVV5vzo0ieB=mh$Lc;c?ggQ4G(1sd>}ZBhY>!q=rf;4}RbSO{iE^2+pB zdgS8R2qZUd2B#KDC#2l(JyxSY(NJ?bS_h)Kt{8aeiY_i<(eQpQjqa{w}$@A-_%D3Jc!Dsh4(RcS|T$>kPAj z^$!bO<0TerR)axcykJg)ePP;lRmL)gxgJ&ZjK*ZF&5(#IYE*5Q&R>r>FP@{y!{Trz z2g5vkO)VJLcqX+>t{F8pI>^fkQeLSyfr(td301WkX*UWAtG6QQt>27Sw%Qqx{;*in zwQtr4C8fA_bv;rKfn}%w7SKHC8XOd_W1Av{mBFXsVe$CjNvl{^^bAwEGS}(ba8`~M z7LgD^n(rE!dJl7&maEV3@`3^()&-W43YPi3uF_Trv0*3G3fNwmsAffM8L-ktR?>Xieq4I0EiF~cX!*sQLQAS<@Uuni4VqLm7EWM` zkQJLIK8Tpb&P4mvtD0J{IKmb)X$`xPicP96J+dRV2#Lj4>mrPb*mMmVFfly>Hc(sf zQer~Ku5RUlBT7M<%PFMWBveQg`*!*@;SpVa?WjX4`hj`Hzz&QG=dL}T z4$hMmOw&qi&~#dobuPuKK9yrQ(iBM~Lf|&!WD!!Unt+HcChmu2RRzU2RBPuao5F`B z!QEI;GYh133z81KR0$D6<+Q}YtLnbuz`{`se&V$#GHc#b42apt8<`|&FA zMU-I*d7E`!Sj$U!9onWp-sJRLalVOUxB}ZO{%R!y#TRKVBetHc|EOV(=fT$;TNWhEVt=wl5X424Jx`JK3BV;waJ$z_WBJ8IWc(5q7yoD zUCP`{FKXDxZhlEJs-3_krB1#$5eD3lVVsQC8X}vMH1nDzqRKdZ(Ecz-o;R^STP$!x zA>~w~dd6{W&X327Oc7$tr(qt+tFd^o2~k!Pk&G~`-iB&38dt zI5kQZxr5b2KceKHIeajOQ6iQ>3kyirf`La|J{Y=Zz=2mm~^t98Ee@TU^ zcW3PqGXG!q|I*QS#GaAJAct4RBzERCY`(ZwJx1) z?l#}?-}19|uW-u;PW#=6Rsm-*@T=A(QQKZ08zpqW@6T5aF7)z*fQc5K>aTSJ?jo3`2B&}P@BZFbBH z4ZQ2wwAIdrk!&Ha%kNzcZT4(BPLI3IcLKKpENnbiYlqbkaM!5n-xIYOvVhb1?l_~x zIN)Jn{4in)qd78Ssp%)<$%uYN1hHO9r~^hC%ATY|q~s||_9HO^+)y&IF=m^?gtDip z%0WsFQPNMzGn5P<8Q5#}$cZ2gFnu^BtRaW(lahEs^1e96yani`NnB8eK zNK1NJFK9PF+-unLkY6X6_0j7AO4g;3)ZZes1^a`N%d*3i6QP9DO#CogELTG(!$+ID zC_YM$49^lWpwCJR1t~i_T1ANU*%3graKNUSMwlqxXT*~yjw8FcI6HVYu$YNXRkgiR6NG+4{|TacmuJFNI^VI}xv z$$dXK6nV@4-L}tm?fJo}W&e+d|K^Ri-#|v|%I>{C$o}{VJZ@PL`wXyw?cUj%<1yuY`6Y`k)8+$u)h*@}1q<>8gcvC{EaCGvGDIk3_z{-!tb z>)yznBUR2m1~zPgM3DrvZLrUV`Qqrm1b-DQ#d75r^OYC#)O_$k_l|dZzTZ>Y z^Gvz>aHae3TP-Uu&z6R>|1tdae|@$*oTv;ZO1S5;RJ*st?}v~r6pkqdaCXy&gImVl zu2Di87k2>|9>@i_CA^9!>w49$`6EI0qQrIx@b1IA?M(a#n?2s`%^&XpyxUto>bKzC z-sn-@`jZZrm0g-ZbwD6^~ORXaJ)y_WhoEvC0 zx1`e?x=W`?x2b75z19$LV?=i7u7^E~ADw0-vLU3@hyiDGF9<8=S5!5JLrRwNk5{ z&%Y(ahB4ryu#JLnDEX>OTEssttvNir11F&_tJ?r?X9UBR2pj@iTBv8|`1PV>EZhxnE6vDTGehYtqaz`0B4pGpF^=KMAux6n?@R49<3*MK4LJ`H10^}N z2<=_p9WJ%)UD>wld#64NZ?A;+E&JbVBT?OxKY8`jVktaX4o_CXlcnG!XSR#Cq^q2_ ze}RXumbdSt-;ZnwKlkxk>%Gr21JXHx#m4Z`iSI0QPhVIot9L9go!x!=3mf*5& z$xvip(0_Z4xLqK~$g}kK4Km_`lInl8h!;O$ZiGeF#oHY0B3aRe2oU#)Lfn<%-C91( znx$k0c-c}%O+Nh91Y>kEmXJ)R(6#-$-~LVb>0gJRUY6g>m&2zj;ZvpHDJ};_Cn?wJ zv3Y+ACGQA^gWvUCWFvmx^(@)&IH;<{dwA^Z+VI+d3@i+HA03L{$Qc57EWU{1T_2~} zY_oLux|Ay_mOrKvcfITd$~fbA9>?=QH9z6VC$0{(vr+uOB&HFYF9P&Q17b*jt0?8H zEzWFBr-8*I8yldW(+nN^*z;(@E>OE5;$aAS8#lSRWV8&~B}!;scLhs)wEtPLLfZdH zWcp`FZrlG>z2EQzf~x{gv)*0ZEw^K#^Ob5rJFn9km`0s?YS-aeTX~(9!0A_2ql=dZ0?!ixR$`aeGI)_SbDD1k z|Luzu7nkQ@0cn#+Xm>Rdy48+^Zd)f3x=n5#3Ekc-5-NAW#O&aqTB!@$x+CH#i8vkb zZx5=gQ=C`f=2M_-m=M_EYkygF?+2y1%-}c~!jT1pt(Dwh^?0KeD7JRZG8@eo245Nf zM*^e{ByWRgmQ=S2P6zSN6LcdxQildNpz?n`=0=n@10S2<+U_V0LD>!-!^HA#){T46 zK#h3jml&qnNz=Fn4FaN=_BuQu1Cd=GEzD@ef>9Sjv(SC51!A_STMLr$=9a$-I9R-a zkRK0M+)xh;y7l_})HV(qo26cvL)4<{v z5o#t19xs&TY>jBJ)mlXB8c!TDCm#gUQ($l0fnh?p;Xv{*bhQVd_EuD1D%iVhwHl(U zkkt(d-<84dgrCk)emizejBI9 zyVhAQW=Bo)xbm92or>X7D+_JoxRve8m^<+Kk>lH>S~#KR=aC=n$A4_6o`>(@4gNQU z5RheE&XXwsYLAU|3U1FEZET+$^}O|ZD5-AN1mG{zXbqR_Yv_&6b^Kbl4L*QvfNyQ2 zV%=6P4I?>%6>_VKZaZ|bZg0Vc-kf0!cd&xo#EoYZYUr&V;8>4yYXTJDwjBsrm+JN= zoFflwW9mAZz~y#GW8JYj8|FlK>c%5Ah9~SG2?w>i;ts%w;05j_b4=RuoC(}+y66-t z$Wk&-$umd>x~(O9f->s(_(^(ouThSfKX$i1j$B!13&N3gS_QNhaW9@c|D|2-#c2b( z{aBv*P9y+!9|Oki>;K^5yBF`gT<$wn=_4>T^!OO4=!Afq;l2)7_6q=}kz+r*_~FIU z>3C`S8|6r%5=juY*|*Xk`C0J8;JtmH?l1R`Rr<#$chAbunST!cW3UvREe~C-3|*zn zgDcID)KYK|w{;}2k7up}EiFH8%;G-q z)yfsM`ixq^g2f;@uDW{P&jR%QX9I||9)Ris`WoOmxZ|>tm5Moh_D>(ISs%z|oF77cCD5Pk%dPLB z!S;x8Hr-4f9QE6?Mjj6EZ-g{*5G?^Qb$vnb?@s_avCA}xSDMX);F6{7Yi7dHpea(V z6tyAMY6AN#P}w&rnWf|^l7TjBHIvFQa*EhBN+e3if^+PK(QCb~K(4_vyF`%{<-*Nnr zLcLd_*HN3!i3Cc~uY+-}FTSiH2E1mAMWfl~=z!y+=62Utb=4yUhf7U=9AAWIs%pU1 z!rpZLnybVu&oa+mo5-Ff-X&DSx(qV@)ywr!6Fz;ad+csc)BOg&*k9{``;fjk(~!Xy zkznWM?jFw|mz!~CkQaF^H;#L7G%uF}w>!G#6GPjDTLA4kt$*y{Pd)uX&$~T$`tO}D zKlNPYsplvl{aOFXe;B#%zYl-srShqX%BhKR|74|ql6;?@62EObMPsvXQNn#5hNpp+ zO$^f-`$J2OueVo-E^=O+_NR^P4<&nq?q`4)`@J0h-6*we8+98W5V=((=sR0PxSHa* zJ`|WO#!Y<2Fwcnbj3mfN8BBrk?=}KF%*aDjmitcUBQ6fcMZnSTc52XpeiVHW8cQEV zSO7R-^xU8_ZnnczuZ{l1qNa{rRDqag`uSHQ-SloBjtPyYuUONZDQm3tqu?0}!#~Gv zp%rPN{vpy;pU2}__3rfeR|QIr37!KbVZZZ!ARH^Le?JhmmE8A=&{J~XD+2m--77+0 z$$dZYb*&0pJcm~NPn6vEsy7g5A>91SB<(_=x8&dByjT1OOYVEs?{D+oZe8sxdOg7H ro2Q@i{69KN7Xzw?8Z=Ko=lOqhmcHWK>Y*q^^Yn9`|HpMoxpw{!?v4@_ diff --git a/.venv/Lib/site-packages/discord/__pycache__/asset.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/asset.cpython-311.pyc deleted file mode 100644 index 16bcad26aa39070e4ace1a3a884dd7f3c968bc97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21672 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 T>iTf$!>?J)FE@y1J^B9tSR7#I diff --git a/.venv/Lib/site-packages/discord/__pycache__/audit_logs.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/audit_logs.cpython-311.pyc deleted file mode 100644 index 4b73524a6aaf61cfe5e3c0c3354e8f78fe4ab60e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48036 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

e!+fz(zJ`hN=+#;PQ-o|0Ym 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 VmW|8*%pd%e`+okCKx`%U{{y}R&8q+a diff --git a/.venv/Lib/site-packages/discord/__pycache__/automod.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/automod.cpython-311.pyc deleted file mode 100644 index 7ac28c543fc3506864362309e38a289f472e2322..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31602 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 huIIb18)~vSqWq^tt_t4q{{SRWL@xjU diff --git a/.venv/Lib/site-packages/discord/__pycache__/colour.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/colour.cpython-311.pyc deleted file mode 100644 index 9b8fe0f163a49638db0a683fc664dccf3ffab96f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22064 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/components.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/components.cpython-311.pyc deleted file mode 100644 index 63e4814986ece5df95ed18309a898ff5bee16250..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23210 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 G%KRVGe%#0a diff --git a/.venv/Lib/site-packages/discord/__pycache__/context_managers.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/context_managers.cpython-311.pyc deleted file mode 100644 index 4f42ff6078e7b57d33327e048d1d93d0a90e9688..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5396 zcmb^#O>Y~=b(Y^>67^wQirqG2Nr}XYk{l;NV8wAkk(9+oA_bDND@F#f;*KOLB$u6C zMz-q!MiT^TVW37~z(LW2E=_AVm)?qA+MhrPEF^3Zz(6kz&;twiVCdBMcDYN^Rst8z za`ooTn>X)k-n^OB?|XWD1fJaA|HY2{g!}_L=HoCB;puMxc}OIZBa$H5N$-eUdNNFAYe+PaU}d8@WoPzE6qN{~Xt#WY3V$pg0Sr`m$S$ zE+w*bu~=Xgh0zJx1e3bv1AS~EsMVIL@wm{_94 z3P@wr9HKi#bxW?P6g*IQv4Aqdz*H#JB(%XCE)~l~LxT^e>;5Zfc})Qi(9SR|%TjRz zTc*2Jt*w`e%2t?4MHIbWQ-M=Kq8`q$5B!*sIaOGxgc6Eix9)4(y0GpmXo1*({#J-| zy*pcS89nh?oms3?b7sZnJ`l6tsLpE|ugRbgdv)q$2vO%=+}T7T4vE znC^?QycJmmQwM=!eb2i& z4f+@2G?SXoUXP^XG?Agp>D0AEEFPmHkqq=l!t{C~yO3JRQs78OlG#<7nx~QEDt$kZ zjD>0ZC(G%0CgV$`X<})4F%bt^A{kv=i6xR(=^V^UrXZ6OkisA|o1&<&B`Oimps=NQ zI=TRoBXfzxM0Pdon@?nuAd}96&rq>|`HG?mPzp&JG-(^+fk^+YBf zrjc|a1E%`s(CAqiy#Y@C)ve3?fV*Q zPDs%FVg(XK-rZ6`!{x(&!f;w5*;o;lXlegVD5 z76ocD$&gW^TJ@KZZ3|aj79-iPjS=n;$f`bLhupNUk{#iZkPJCAFS}V_dR#Pj%VMoJ zDpm?mFqjnQ90KQ!n>-F~3GY8-zNV*rAF_iy5}2TJ?6*ftTW{UEaqX_hBvwv1TzuBCOl07f*HIA?Tb(M zV(eKV?Bwj`F*DT0vHWS?d|uoUaVtWB#>_Mdw7yOG4D@gJnK@}P#*vExfMg5~9tO`J z1kdjWM;pP>!{F3GaB4p|(+JMgJu}~uW`Bk0-*uX8TWR*O%}Z1-sAxUgP7{-C-oW~=`y*$jrZOgA$v0WHA)V-+lk3TK;S<_Fa$tzDka9Md=lC0?X9o5RQ*&^&}M3u zMXw~clG%#7MOgqw;pQQc64}Q?-A8Yhq*mX4>Ht%a+4ZQMTYERf77-l(+Q$pTwC1CpJ2vbge?57*Y^J_AyDJ34A`?)7wokj z*k5j|(}8sFo$h>q+V3%0L4$?wb!477PKbJ{jd#oGEOGu5GYPYYQvjO3z!{vjc~w+C zqZ-0Adw@Aw%QF#F1<&*4xsf0%p;V-?16Ym{N zy!R*RFO@%6_OB!xSCab^sm4S~Kjl4vd)`CO=z(YSZ)2DCJ+lqZY~6hIl+!$L>%>jM zjt9(3`3K+!`(Q49KqmDD*zPK4^^ObJHndGZtB;gj^b-jt|2?tX=8<& z0pjh!kPRPrhW9;Z8=kXu^VQ=87j^v>^4#4pWHauGczZH&yfd2k6yhGPoB1x_hOO@* zh6eK=A+Tph2E8`q>joadc>!xA3-}#r!;pSwrRl#6MXBz=UqO}@et6D3;rfz zm<=2Y7ROq}u`qG0E}C6jFBl7n>!vwz8z>wZ(6pTq98H4Y0ue^*WTf+bLVEA&zatW>zuf!8 z-Uq8AgpV9=)lYh#I7aK;?-Os|?$G^HpWmo^C-=RR4e#XLxu(nJx7~F&15N=x$GSn^ TgaGUEBKSAb{&T{B9*X}08q^5S diff --git a/.venv/Lib/site-packages/discord/__pycache__/embeds.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/embeds.cpython-311.pyc deleted file mode 100644 index b44218f8d8fe2fdc7ec5cd316beee7e83f75e7cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29858 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/emoji.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/emoji.cpython-311.pyc deleted file mode 100644 index af755cbd95d63231d8c19edefff14019889a3679..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12767 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 v4wRgCMd&U$?~1UqM(jdTU@* diff --git a/.venv/Lib/site-packages/discord/__pycache__/enums.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/enums.cpython-311.pyc deleted file mode 100644 index f99de6c856f04d49babaa6dda59079364bec3277..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34085 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/file.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/file.cpython-311.pyc deleted file mode 100644 index 9140a7c3f45ad9bd78a447589c452f6d163d5680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6826 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 b$af4@>*@v#pAR~Heg9{%{@>rRD-`~}W-6xw diff --git a/.venv/Lib/site-packages/discord/__pycache__/flags.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/flags.cpython-311.pyc deleted file mode 100644 index 5a9502530de5552a597510afcd0e3d632dd62586..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72900 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 E2j87&V*mgE diff --git a/.venv/Lib/site-packages/discord/__pycache__/guild.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/guild.cpython-311.pyc deleted file mode 100644 index dcb44197294b40144c9dd90330f55818cac0d140..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181515 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/http.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/http.cpython-311.pyc deleted file mode 100644 index 97107407bf4d0254e6fb83255a0326c8006923ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110847 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

$-h}2GK2& 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 a#g3@mMw*4I|GCxh9)J768i^P>`u_nBKbaN) diff --git a/.venv/Lib/site-packages/discord/__pycache__/invite.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/invite.cpython-311.pyc deleted file mode 100644 index a74d96579987d60e29e6daf6307ef9efece48eef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25208 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 RS-$)mp8DH$GBKg?zX2c3-xdG> diff --git a/.venv/Lib/site-packages/discord/__pycache__/member.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/member.cpython-311.pyc deleted file mode 100644 index 023bfc00a7fffac53b187850be86961fc0c93302..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54695 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 S!(6Zh)}mLcvr{s1^Zx*^`x2}G diff --git a/.venv/Lib/site-packages/discord/__pycache__/mentions.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/mentions.cpython-311.pyc deleted file mode 100644 index bb5f65bd2a7f1b9de1e21dab377a62aa6fd9e7b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7555 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 TtSrNBJGY;S`F}iNRT%Z3C2*P^ diff --git a/.venv/Lib/site-packages/discord/__pycache__/message.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/message.cpython-311.pyc deleted file mode 100644 index 5187d4d1a3d9157aa95459d300952a9c7cb589ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106218 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/mixins.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/mixins.cpython-311.pyc deleted file mode 100644 index 9755b7fc0ee38eb0586a640725b9219d8f4880cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2439 zcmZ`)-EZ4e6u0xyrtY?GE1N)C$EBdLK-PT#5}GC?H*s2v)QKEtrByV`v2Pl0iJjTb zN~a+eX)j1T@PO1l?185t#NUEc5D!z(BqW}Yc*xW}?TO!U(v)uOwm$dXbMF0}&wKLY z@#B(!vHr(D{Fk&K{6(9Cfqgvo3z&8UM_3meaa~LZOM;VlC^*T-2|@T7-*BuaVo3^; zG*3KELWXZ7OF9!(AvRVvi+pBz zTdd225EuMLWVxQ}Z7@r+p^8pMEx?3+GupHQj>8VK!qB%}3wX@&?Oq4kt%&qB-8K)| z#R#^~S4TJIvpES$9B#Fl>j90k0}_d<9;cIH^ecibk;Ja((wYqZ_4m1B-e(2ZV%lOZwVaONcVaoG=8$lGl~aA9}s z>!EeI*jH#lY@mM>qFC={%kPjU(%2J(sM!lVs6#ib>9^bdCb?$& zp5v0g;dLp_wbk(N@z|GPdObgasY4Se0kILotd2xs%Yy9_PMGRa!mQ6qAS&^RMwfgQYonlc&e5!)e5S%#1?T+E2ENClrTVzG9!f}C{?Kv z*ova(mw_xVswLG}%SlDm(16K`0F_xq)(tgZE6F;m)bvWZsz7}Ku$rnBb!bsm6wO$G zR`8f|6B|}tmP;j4CCN2duS1W{^5x2!t}ZPbY`I)2C}1usuuNVoDMM9oDqoV-l^iR` zEAkRqr?WCpbcv1)tz)ap3b9C^jQ_l$mNjxCU)BsA+Z?>qjq%l0wW{QptgBU+Di!rI z;3=HAK{3p83Rn$Jk8LR^atT;Sk9Oqnf|O14Pb+tOR@;rX@_wgl z1y-ZY`9#pF zEbbssDLnsXFbQEun2f!+mA_uEg=mI#tL0hEdSTSx!g?MJ1`oFq`1GQ&udT?M<> ztuNf;-o1LsZPY_I;+MLXeaG71VI9rK_5yp4H)|*_TWcEwR_8^)b_=f*45Y{?-mCFrXQks zdMz2MAoL?u8s{6#{qrD)RZ2DLBzUTsaFVFXw39*=qywt8p}`pf8kZL~1QeIzSuA!0 z6cy&-aK!slaTz7Fze$=E%x7nvKw0{SeVEK>l&5M+=PMRAZgE2ahl rkt@mR#P;OiSVlZQ5MCwEi1++Za5g2v)>p~i%sbDB{rrDqu?znKm3xJe diff --git a/.venv/Lib/site-packages/discord/__pycache__/object.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/object.cpython-311.pyc deleted file mode 100644 index bfc1aefbeff40b2587c168b34c99df6b2a7bca44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5137 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/oggparse.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/oggparse.cpython-311.pyc deleted file mode 100644 index d7deee769cb515b99ab96fd5aaae92af9af0cc27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5889 zcmb7IU2GHC6`rxjzj1K>VFOEsz!Kaw*@XnLC2SYRb`rCRowXfkLXbQ0OcH~C(wPZA zCefnRRx${w*%cDB+O|=(Wm)Y$@UW`(VIL~B4}Iu^jVxigLW)#XDpDW3f(Jw&+V9NR zPRx(Ay)!;@=G=SF-#z!7JN}}%+0LNN{Qck3Pqs14Kj@{_Ogh3o{w}46@Ge~*{1c`(bsgxfFAs+Jx;C1fu82)dRjzdgmG;Xj&TfQk1k65 zL?FtKC*o3Ck@y36aoO$O%+h5!v9PG}2jVXN@Y{!u99)tmMM|rDSXf$8vv&KWB&QOJ zlE|d_gu*XMvNU&@Uyy~gDv54>UX~<2Gtb8t1$jYo^J<0{(wF%qNmei+Gp7oPbRxaL z3-&lf(MWX>Y?RErdQp%i3>JAoQ8Mv_0Diofi7%%hT~JBhd?G0+`~elZ_eQESdR=Zi zgou)m7gNBPQnQDQRXcEzczr%A%VW6U2IMS;a_&h?+aycG&S&M&=bMnIsMg=&jkhshwN1 z6;j|E$gjFclY4P7lOjv(bxYu)`DHl`k#Gu`n}N$TiRYxaN)*z3K9fvlE|O{SOj=Bk zy~;7Ww${R2=7OZzqAzbcqe4|(1zG@234K+oUCN>W-RGpL!yq@2wiBsl4y;?AQ&cQ` z0={3$$eO(8&FqK#F+U#(jYLm-!hSvw;U~kPQvsjf$McQLWyT&(SIo}X>c>{tE!(-2Th_uGK}JxEv?y0=<~^ z#eQZBgwD)eRwdfWvnPFC#7@*#OlipebZry_0w&2>~hTbuz zsZM`|ebA~trcpX(Q#fi(-C4sJrokh1J4ALXr!44rug`BhzBI~NHNMLCE5^o=&dRo+WFme%xqs6?;(+qPp{w;GE@p2N!Ioh>6n%t!^jKy%~Qe&}f zOEru3*C@36lmft2red(!-YIqNymjW&Gk@s%yysrWH@k|5e1$#!;vRpYbEMcgk{j8W zK3klY9!w|iPbc#!r7*1)r`3YvRL*xJu%_NzT^Bz;e{b-ck3Z(S>&-*d=0D`Z?vqiE1dq0 zd37l(23%|wOnzZ_t;UQI4fBRm%q^B>v|i$ZdInA$I2~Cr%AJio#KzfNZ8ilx{amJ? zOln0R{TFb=Wsu**Q$7gbGRbe@QMOTdN-9FAY|hNjE0RiS6X!bQPb0!oA!krvRU^xR z+9b#HNlLb(7F}DZW0;}*5#V3At}><9cjv9UbGEgSQd?KfveCZ%=DQWfX5%%G^Ol@# zYw_#ZT(;Em+U-c8gun#2~d2~V@=K(MyTl(k>x z_J)#7B2ZM>$KSbf#o7vF+Yr21EFApm$#E8A z6fz3l-qV-kZoqN5Ce7Aot+nIpnQG8CCJm^htF;CMYHdjp>-BAqu6ld^c(uwRbr`B? zq(iM&OszuJXEj#32+UUuWVBkZ_&AO|R}Vj8U0m=Hg`QR>$n0!KB7H$fCPaMA(?N<) z2@8q1s~YtCF;ovmN~u*ZmN^=_)r~k3r=?3OvcZC+rGlC_>r`48WgGzhbhh8P^1#`1 z-`TUy7M#6BXK#)xH96OgUVkt5-oy6p+k>AC725lX?R|MiU#YdT!WeA>rS|P>ga4$A zf2h!QxY%|$?>MY4$L`JCUR{q@Cv;kRY+v?q8i=0ISD1C+FSa`%eN`vZn#j9W*lJS# z!E^3)*HW;20?ZJOetPKPSmwxK4UTMzRTC)a+0HF-xk+9G10@1b&8p7!Uw(M~!-A79 zI(ay98xozt_6DWclXSsxx8D2oy+ZrGV*9?FuVP}H?b?W!0o|j!Ha)7Hi(lOKYro39Mtm@?@d_C(ml$K346QIN=TM5v|P1&q}yvy{p zg73r_{=Nbi%42#)(`;<4yU(o0^)LIM$RA)FWozX>05}t{Y{k&UautTa+YGxm&-8A+ zH<;$D+O@%)%>O_42D2~Ucvm>C$#B(D*@lw{a^DLe@9g=W$WJ!=I`*@u&@Y1TiS}f( VBg}TQ@c)b8d!jvgNr$#3{{zdAm~a39 diff --git a/.venv/Lib/site-packages/discord/__pycache__/opus.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/opus.cpython-311.pyc deleted file mode 100644 index a24dce65c80df954947fe457e664dd77f909b2ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23902 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/partial_emoji.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/partial_emoji.cpython-311.pyc deleted file mode 100644 index 3b724b910771ce6afdb60d0a3f5be753ba5f6023..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11771 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 N8`k#QmtZjM`af8)TqXbj diff --git a/.venv/Lib/site-packages/discord/__pycache__/permissions.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/permissions.cpython-311.pyc deleted file mode 100644 index a5d3873e715ade37dacb3a4f420510f5622c5c42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39480 zcmeHw3ve9AncnORSUiYbyg~3ad=n(Fe2X$IiG%=&mCPa&oTJC2{WZa8j<^u4-+e)=`Bimy;;vtAmer z;!-NPe1G>mcVR%H^ z+vGO(o(4S8_zf>g!hilL%D+}>8WuWQVn_XgP(3m&i)Z>r#MAK!IjPFxF8t`IuI@?A z-caIG(`j+nM2C1_-~Pj0vx=rk;iX{Q%WqE zmZeT{QjujbH7QO^$CN3#Q%tACSn`HAD=R7<0XFiA)oTIf?3^Cnw@FasGyCdYs{}QqAX7U_kZk6lYRWe3Jgk z46WI@@kCsm?i8gs6+J$eMoyK0jGUd-z+-Pp5mh;npc3M!H^bGeT_?j8Zvk!aevL%z zz4Ozl8N#I6zyu_koKuo`C5S@kra&_G#w+qfnjlp3$y6ednkUpIQb{RJ_^L;%SzE`( zQ`cmM3vb?JDvhf0Do_KkO7K?IlGN!K>OL-O1jBpd$!Y@W=m5L9aW##GkAwEJDTTeS z7|jUY|3aTQJa}T{LibRg*gq_u9U45}-`m$KZs{Jz?=79;h5nHj2G5O%$T8GCF!G8x zctY$Rctt$bKhWDL_Pu;|sBd_
bWKXdkUe;;7|13jnD_4W^(6raa)1B2k?ey}hK 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/player.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/player.cpython-311.pyc deleted file mode 100644 index 6111ff5a524267f48bf405f922710fbbe111c2d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38773 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 DQ<|s( diff --git a/.venv/Lib/site-packages/discord/__pycache__/raw_models.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/raw_models.cpython-311.pyc deleted file mode 100644 index 6eb308d24eb53b84429b0914f459bba4359462e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23144 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/reaction.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/reaction.cpython-311.pyc deleted file mode 100644 index c84461d1a6b755d5c0b2cdcc4abb1c5478098d8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10925 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 E0=9cF@Bjb+ diff --git a/.venv/Lib/site-packages/discord/__pycache__/role.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/role.cpython-311.pyc deleted file mode 100644 index f4bbe64a8a33dfa3a50951025a30051d620f7882..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23831 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/scheduled_event.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/scheduled_event.cpython-311.pyc deleted file mode 100644 index 64cc4dd0589c6a24310d1b33ed6314ae2945d5e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28086 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 D*BS$E diff --git a/.venv/Lib/site-packages/discord/__pycache__/shard.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/shard.cpython-311.pyc deleted file mode 100644 index 5089469575460a98b2a03437c53330887e8d3f8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 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�YnmUlU&gs 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 bc;CIyANWLC_@{q9n*EhC`rpq0;(GlbpNXG5 diff --git a/.venv/Lib/site-packages/discord/__pycache__/state.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/state.cpython-311.pyc deleted file mode 100644 index bb7258c9fa4735e724aa9026bda20cc092576486..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110132 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/voice_client.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/voice_client.cpython-311.pyc deleted file mode 100644 index 9499a3a9051b785c04ad537efc441818bb49b1aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35903 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%0DA$?&!-FHA+lc(TL7&uOpO*&Yp1d{ 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 Hf$;wW4rI+Y diff --git a/.venv/Lib/site-packages/discord/__pycache__/welcome_screen.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/welcome_screen.cpython-311.pyc deleted file mode 100644 index 9ebe60e81945ac983177e95c6a8ee31d7f7d79bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9983 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/widget.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/widget.cpython-311.pyc deleted file mode 100644 index a8c48f87eca6b961b4e08e8e1575e09cc310c30a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14384 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 str: - return 'see-below' - - -_undefined: Any = _Undefined() - - -async def _single_delete_strategy(messages: Iterable[Message], *, reason: Optional[str] = None): - for m in messages: - await m.delete() - - -async def _purge_helper( - channel: Union[Thread, TextChannel, VocalGuildChannel], - *, - limit: Optional[int] = 100, - check: Callable[[Message], bool] = MISSING, - before: Optional[SnowflakeTime] = None, - after: Optional[SnowflakeTime] = None, - around: Optional[SnowflakeTime] = None, - oldest_first: Optional[bool] = None, - bulk: bool = True, - reason: Optional[str] = None, -) -> List[Message]: - if check is MISSING: - check = lambda m: True - - iterator = channel.history(limit=limit, before=before, after=after, oldest_first=oldest_first, around=around) - ret: List[Message] = [] - count = 0 - - minimum_time = int((time.time() - 14 * 24 * 60 * 60) * 1000.0 - 1420070400000) << 22 - strategy = channel.delete_messages if bulk else _single_delete_strategy - - async for message in iterator: - if count == 100: - to_delete = ret[-100:] - await strategy(to_delete, reason=reason) - count = 0 - await asyncio.sleep(1) - - if not check(message): - continue - - if message.id < minimum_time: - # older than 14 days old - if count == 1: - await ret[-1].delete() - elif count >= 2: - to_delete = ret[-count:] - await strategy(to_delete, reason=reason) - - count = 0 - strategy = _single_delete_strategy - - count += 1 - ret.append(message) - - # Some messages remaining to poll - if count >= 2: - # more than 2 messages -> bulk delete - to_delete = ret[-count:] - await strategy(to_delete, reason=reason) - elif count == 1: - # delete a single message - await ret[-1].delete() - - return ret - - -@runtime_checkable -class Snowflake(Protocol): - """An ABC that details the common operations on a Discord model. - - Almost all :ref:`Discord models ` meet this - abstract base class. - - If you want to create a snowflake on your own, consider using - :class:`.Object`. - - Attributes - ----------- - id: :class:`int` - The model's unique ID. - """ - - id: int - - -@runtime_checkable -class User(Snowflake, Protocol): - """An ABC that details the common operations on a Discord user. - - The following implement this ABC: - - - :class:`~discord.User` - - :class:`~discord.ClientUser` - - :class:`~discord.Member` - - This ABC must also implement :class:`~discord.abc.Snowflake`. - - Attributes - ----------- - name: :class:`str` - The user's username. - discriminator: :class:`str` - The user's discriminator. This is a legacy concept that is no longer used. - global_name: Optional[:class:`str`] - The user's global nickname. - bot: :class:`bool` - If the user is a bot account. - system: :class:`bool` - If the user is a system account. - """ - - name: str - discriminator: str - global_name: Optional[str] - bot: bool - system: bool - - @property - def display_name(self) -> str: - """:class:`str`: Returns the user's display name.""" - raise NotImplementedError - - @property - def mention(self) -> str: - """:class:`str`: Returns a string that allows you to mention the given user.""" - raise NotImplementedError - - @property - def avatar(self) -> Optional[Asset]: - """Optional[:class:`~discord.Asset`]: Returns an Asset that represents the user's avatar, if present.""" - raise NotImplementedError - - @property - def default_avatar(self) -> Asset: - """:class:`~discord.Asset`: Returns the default avatar for a given user.""" - raise NotImplementedError - - @property - def display_avatar(self) -> Asset: - """:class:`~discord.Asset`: Returns the user's display avatar. - - For regular users this is just their default avatar or uploaded avatar. - - .. versionadded:: 2.0 - """ - raise NotImplementedError - - def mentioned_in(self, message: Message) -> bool: - """Checks if the user is mentioned in the specified message. - - Parameters - ----------- - message: :class:`~discord.Message` - The message to check if you're mentioned in. - - Returns - ------- - :class:`bool` - Indicates if the user is mentioned in the message. - """ - raise NotImplementedError - - -class PrivateChannel: - """An ABC that details the common operations on a private Discord channel. - - The following implement this ABC: - - - :class:`~discord.DMChannel` - - :class:`~discord.GroupChannel` - - This ABC must also implement :class:`~discord.abc.Snowflake`. - - Attributes - ----------- - me: :class:`~discord.ClientUser` - The user presenting yourself. - """ - - __slots__ = () - - id: int - me: ClientUser - - -class _Overwrites: - __slots__ = ('id', 'allow', 'deny', 'type') - - ROLE = 0 - MEMBER = 1 - - def __init__(self, data: PermissionOverwritePayload) -> None: - self.id: int = int(data['id']) - self.allow: int = int(data.get('allow', 0)) - self.deny: int = int(data.get('deny', 0)) - self.type: OverwriteType = data['type'] - - def _asdict(self) -> PermissionOverwritePayload: - return { - 'id': self.id, - 'allow': str(self.allow), - 'deny': str(self.deny), - 'type': self.type, - } - - def is_role(self) -> bool: - return self.type == 0 - - def is_member(self) -> bool: - return self.type == 1 - - -class GuildChannel: - """An ABC that details the common operations on a Discord guild channel. - - The following implement this ABC: - - - :class:`~discord.TextChannel` - - :class:`~discord.VoiceChannel` - - :class:`~discord.CategoryChannel` - - :class:`~discord.StageChannel` - - :class:`~discord.ForumChannel` - - This ABC must also implement :class:`~discord.abc.Snowflake`. - - Attributes - ----------- - name: :class:`str` - The channel name. - guild: :class:`~discord.Guild` - The guild the channel belongs to. - position: :class:`int` - The position in the channel list. This is a number that starts at 0. - e.g. the top channel is position 0. - """ - - __slots__ = () - - id: int - name: str - guild: Guild - type: ChannelType - position: int - category_id: Optional[int] - _state: ConnectionState - _overwrites: List[_Overwrites] - - if TYPE_CHECKING: - - def __init__(self, *, state: ConnectionState, guild: Guild, data: GuildChannelPayload): - ... - - def __str__(self) -> str: - return self.name - - @property - def _sorting_bucket(self) -> int: - raise NotImplementedError - - def _update(self, guild: Guild, data: Dict[str, Any]) -> None: - raise NotImplementedError - - async def _move( - self, - position: int, - parent_id: Optional[Any] = None, - lock_permissions: bool = False, - *, - reason: Optional[str], - ) -> None: - if position < 0: - raise ValueError('Channel position cannot be less than 0.') - - http = self._state.http - bucket = self._sorting_bucket - channels: List[GuildChannel] = [c for c in self.guild.channels if c._sorting_bucket == bucket] - - channels.sort(key=lambda c: c.position) - - try: - # remove ourselves from the channel list - channels.remove(self) - except ValueError: - # not there somehow lol - return - else: - index = next((i for i, c in enumerate(channels) if c.position >= position), len(channels)) - # add ourselves at our designated position - channels.insert(index, self) - - payload = [] - for index, c in enumerate(channels): - d: Dict[str, Any] = {'id': c.id, 'position': index} - if parent_id is not _undefined and c.id == self.id: - d.update(parent_id=parent_id, lock_permissions=lock_permissions) - payload.append(d) - - await http.bulk_channel_update(self.guild.id, payload, reason=reason) - - async def _edit(self, options: Dict[str, Any], reason: Optional[str]) -> Optional[ChannelPayload]: - try: - parent = options.pop('category') - except KeyError: - parent_id = _undefined - else: - parent_id = parent and parent.id - - try: - options['rate_limit_per_user'] = options.pop('slowmode_delay') - except KeyError: - pass - - try: - options['default_thread_rate_limit_per_user'] = options.pop('default_thread_slowmode_delay') - except KeyError: - pass - - try: - rtc_region = options.pop('rtc_region') - except KeyError: - pass - else: - options['rtc_region'] = None if rtc_region is None else str(rtc_region) - - try: - video_quality_mode = options.pop('video_quality_mode') - except KeyError: - pass - else: - options['video_quality_mode'] = int(video_quality_mode) - - lock_permissions = options.pop('sync_permissions', False) - - try: - position = options.pop('position') - except KeyError: - if parent_id is not _undefined: - if lock_permissions: - category = self.guild.get_channel(parent_id) - if category: - options['permission_overwrites'] = [c._asdict() for c in category._overwrites] - options['parent_id'] = parent_id - elif lock_permissions and self.category_id is not None: - # if we're syncing permissions on a pre-existing channel category without changing it - # we need to update the permissions to point to the pre-existing category - category = self.guild.get_channel(self.category_id) - if category: - options['permission_overwrites'] = [c._asdict() for c in category._overwrites] - else: - await self._move(position, parent_id=parent_id, lock_permissions=lock_permissions, reason=reason) - - overwrites = options.get('overwrites', None) - if overwrites is not None: - perms = [] - for target, perm in overwrites.items(): - if not isinstance(perm, PermissionOverwrite): - raise TypeError(f'Expected PermissionOverwrite received {perm.__class__.__name__}') - - allow, deny = perm.pair() - payload = { - 'allow': allow.value, - 'deny': deny.value, - 'id': target.id, - } - - if isinstance(target, Role): - payload['type'] = _Overwrites.ROLE - elif isinstance(target, Object): - payload['type'] = _Overwrites.ROLE if target.type is Role else _Overwrites.MEMBER - else: - payload['type'] = _Overwrites.MEMBER - - perms.append(payload) - options['permission_overwrites'] = perms - - try: - ch_type = options['type'] - except KeyError: - pass - else: - if not isinstance(ch_type, ChannelType): - raise TypeError('type field must be of type ChannelType') - options['type'] = ch_type.value - - if options: - return await self._state.http.edit_channel(self.id, reason=reason, **options) - - def _fill_overwrites(self, data: GuildChannelPayload) -> None: - self._overwrites = [] - everyone_index = 0 - everyone_id = self.guild.id - - for index, overridden in enumerate(data.get('permission_overwrites', [])): - overwrite = _Overwrites(overridden) - self._overwrites.append(overwrite) - - if overwrite.type == _Overwrites.MEMBER: - continue - - if overwrite.id == everyone_id: - # the @everyone role is not guaranteed to be the first one - # in the list of permission overwrites, however the permission - # resolution code kind of requires that it is the first one in - # the list since it is special. So we need the index so we can - # swap it to be the first one. - everyone_index = index - - # do the swap - tmp = self._overwrites - if tmp: - tmp[everyone_index], tmp[0] = tmp[0], tmp[everyone_index] - - @property - def changed_roles(self) -> List[Role]: - """List[:class:`~discord.Role`]: Returns a list of roles that have been overridden from - their default values in the :attr:`~discord.Guild.roles` attribute.""" - ret = [] - g = self.guild - for overwrite in filter(lambda o: o.is_role(), self._overwrites): - role = g.get_role(overwrite.id) - if role is None: - continue - - role = copy.copy(role) - role.permissions.handle_overwrite(overwrite.allow, overwrite.deny) - ret.append(role) - return ret - - @property - def mention(self) -> str: - """:class:`str`: The string that allows you to mention the channel.""" - return f'<#{self.id}>' - - @property - def jump_url(self) -> str: - """:class:`str`: Returns a URL that allows the client to jump to the channel. - - .. versionadded:: 2.0 - """ - return f'https://discord.com/channels/{self.guild.id}/{self.id}' - - @property - def created_at(self) -> datetime: - """:class:`datetime.datetime`: Returns the channel's creation time in UTC.""" - return utils.snowflake_time(self.id) - - def overwrites_for(self, obj: Union[Role, User, Object]) -> PermissionOverwrite: - """Returns the channel-specific overwrites for a member or a role. - - Parameters - ----------- - obj: Union[:class:`~discord.Role`, :class:`~discord.abc.User`, :class:`~discord.Object`] - The role or user denoting whose overwrite to get. - - Returns - --------- - :class:`~discord.PermissionOverwrite` - The permission overwrites for this object. - """ - - if isinstance(obj, User): - predicate = lambda p: p.is_member() - elif isinstance(obj, Role): - predicate = lambda p: p.is_role() - else: - predicate = lambda p: True - - for overwrite in filter(predicate, self._overwrites): - if overwrite.id == obj.id: - allow = Permissions(overwrite.allow) - deny = Permissions(overwrite.deny) - return PermissionOverwrite.from_pair(allow, deny) - - return PermissionOverwrite() - - @property - def overwrites(self) -> Dict[Union[Role, Member, Object], PermissionOverwrite]: - """Returns all of the channel's overwrites. - - This is returned as a dictionary where the key contains the target which - can be either a :class:`~discord.Role` or a :class:`~discord.Member` and the value is the - overwrite as a :class:`~discord.PermissionOverwrite`. - - .. versionchanged:: 2.0 - Overwrites can now be type-aware :class:`~discord.Object` in case of cache lookup failure - - Returns - -------- - Dict[Union[:class:`~discord.Role`, :class:`~discord.Member`, :class:`~discord.Object`], :class:`~discord.PermissionOverwrite`] - The channel's permission overwrites. - """ - ret = {} - for ow in self._overwrites: - allow = Permissions(ow.allow) - deny = Permissions(ow.deny) - overwrite = PermissionOverwrite.from_pair(allow, deny) - target = None - - if ow.is_role(): - target = self.guild.get_role(ow.id) - elif ow.is_member(): - target = self.guild.get_member(ow.id) - - if target is None: - target_type = Role if ow.is_role() else User - target = Object(id=ow.id, type=target_type) # type: ignore - - ret[target] = overwrite - return ret - - @property - def category(self) -> Optional[CategoryChannel]: - """Optional[:class:`~discord.CategoryChannel`]: The category this channel belongs to. - - If there is no category then this is ``None``. - """ - return self.guild.get_channel(self.category_id) # type: ignore # These are coerced into CategoryChannel - - @property - def permissions_synced(self) -> bool: - """:class:`bool`: Whether or not the permissions for this channel are synced with the - category it belongs to. - - If there is no category then this is ``False``. - - .. versionadded:: 1.3 - """ - if self.category_id is None: - return False - - category = self.guild.get_channel(self.category_id) - return bool(category and category.overwrites == self.overwrites) - - def _apply_implicit_permissions(self, base: Permissions) -> None: - # if you can't send a message in a channel then you can't have certain - # permissions as well - if not base.send_messages: - base.send_tts_messages = False - base.mention_everyone = False - base.embed_links = False - base.attach_files = False - - # if you can't read a channel then you have no permissions there - if not base.read_messages: - denied = Permissions.all_channel() - base.value &= ~denied.value - - def permissions_for(self, obj: Union[Member, Role], /) -> Permissions: - """Handles permission resolution for the :class:`~discord.Member` - or :class:`~discord.Role`. - - This function takes into consideration the following cases: - - - Guild owner - - Guild roles - - Channel overrides - - Member overrides - - Implicit permissions - - Member timeout - - If a :class:`~discord.Role` is passed, then it checks the permissions - someone with that role would have, which is essentially: - - - The default role permissions - - The permissions of the role used as a parameter - - The default role permission overwrites - - The permission overwrites of the role used as a parameter - - .. versionchanged:: 2.0 - The object passed in can now be a role object. - - .. versionchanged:: 2.0 - ``obj`` parameter is now positional-only. - - Parameters - ---------- - obj: Union[:class:`~discord.Member`, :class:`~discord.Role`] - The object to resolve permissions for. This could be either - a member or a role. If it's a role then member overwrites - are not computed. - - Returns - ------- - :class:`~discord.Permissions` - The resolved permissions for the member or role. - """ - - # The current cases can be explained as: - # Guild owner get all permissions -- no questions asked. Otherwise... - # The @everyone role gets the first application. - # After that, the applied roles that the user has in the channel - # (or otherwise) are then OR'd together. - # After the role permissions are resolved, the member permissions - # have to take into effect. - # After all that is done.. you have to do the following: - - # If manage permissions is True, then all permissions are set to True. - - # The operation first takes into consideration the denied - # and then the allowed. - - if self.guild.owner_id == obj.id: - return Permissions.all() - - default = self.guild.default_role - base = Permissions(default.permissions.value) - - # Handle the role case first - if isinstance(obj, Role): - base.value |= obj._permissions - - if base.administrator: - return Permissions.all() - - # Apply @everyone allow/deny first since it's special - try: - maybe_everyone = self._overwrites[0] - if maybe_everyone.id == self.guild.id: - base.handle_overwrite(allow=maybe_everyone.allow, deny=maybe_everyone.deny) - except IndexError: - pass - - if obj.is_default(): - return base - - overwrite = utils.get(self._overwrites, type=_Overwrites.ROLE, id=obj.id) - if overwrite is not None: - base.handle_overwrite(overwrite.allow, overwrite.deny) - - return base - - roles = obj._roles - get_role = self.guild.get_role - - # Apply guild roles that the member has. - for role_id in roles: - role = get_role(role_id) - if role is not None: - base.value |= role._permissions - - # Guild-wide Administrator -> True for everything - # Bypass all channel-specific overrides - if base.administrator: - return Permissions.all() - - # Apply @everyone allow/deny first since it's special - try: - maybe_everyone = self._overwrites[0] - if maybe_everyone.id == self.guild.id: - base.handle_overwrite(allow=maybe_everyone.allow, deny=maybe_everyone.deny) - remaining_overwrites = self._overwrites[1:] - else: - remaining_overwrites = self._overwrites - except IndexError: - remaining_overwrites = self._overwrites - - denies = 0 - allows = 0 - - # Apply channel specific role permission overwrites - for overwrite in remaining_overwrites: - if overwrite.is_role() and roles.has(overwrite.id): - denies |= overwrite.deny - allows |= overwrite.allow - - base.handle_overwrite(allow=allows, deny=denies) - - # Apply member specific permission overwrites - for overwrite in remaining_overwrites: - if overwrite.is_member() and overwrite.id == obj.id: - base.handle_overwrite(allow=overwrite.allow, deny=overwrite.deny) - break - - if obj.is_timed_out(): - # Timeout leads to every permission except VIEW_CHANNEL and READ_MESSAGE_HISTORY - # being explicitly denied - # N.B.: This *must* come last, because it's a conclusive mask - base.value &= Permissions._timeout_mask() - - return base - - async def delete(self, *, reason: Optional[str] = None) -> None: - """|coro| - - Deletes the channel. - - You must have :attr:`~discord.Permissions.manage_channels` to do this. - - Parameters - ----------- - reason: Optional[:class:`str`] - The reason for deleting this channel. - Shows up on the audit log. - - Raises - ------- - ~discord.Forbidden - You do not have proper permissions to delete the channel. - ~discord.NotFound - The channel was not found or was already deleted. - ~discord.HTTPException - Deleting the channel failed. - """ - await self._state.http.delete_channel(self.id, reason=reason) - - @overload - async def set_permissions( - self, - target: Union[Member, Role], - *, - overwrite: Optional[Union[PermissionOverwrite, _Undefined]] = ..., - reason: Optional[str] = ..., - ) -> None: - ... - - @overload - async def set_permissions( - self, - target: Union[Member, Role], - *, - reason: Optional[str] = ..., - **permissions: Optional[bool], - ) -> None: - ... - - async def set_permissions( - self, - target: Union[Member, Role], - *, - overwrite: Any = _undefined, - reason: Optional[str] = None, - **permissions: Optional[bool], - ) -> None: - r"""|coro| - - Sets the channel specific permission overwrites for a target in the - channel. - - The ``target`` parameter should either be a :class:`~discord.Member` or a - :class:`~discord.Role` that belongs to guild. - - The ``overwrite`` parameter, if given, must either be ``None`` or - :class:`~discord.PermissionOverwrite`. For convenience, you can pass in - keyword arguments denoting :class:`~discord.Permissions` attributes. If this is - done, then you cannot mix the keyword arguments with the ``overwrite`` - parameter. - - If the ``overwrite`` parameter is ``None``, then the permission - overwrites are deleted. - - You must have :attr:`~discord.Permissions.manage_roles` to do this. - - .. note:: - - This method *replaces* the old overwrites with the ones given. - - Examples - ---------- - - Setting allow and deny: :: - - await message.channel.set_permissions(message.author, read_messages=True, - send_messages=False) - - Deleting overwrites :: - - await channel.set_permissions(member, overwrite=None) - - Using :class:`~discord.PermissionOverwrite` :: - - overwrite = discord.PermissionOverwrite() - overwrite.send_messages = False - overwrite.read_messages = True - await channel.set_permissions(member, overwrite=overwrite) - - .. versionchanged:: 2.0 - This function will now raise :exc:`TypeError` instead of - ``InvalidArgument``. - - - Parameters - ----------- - target: Union[:class:`~discord.Member`, :class:`~discord.Role`] - The member or role to overwrite permissions for. - overwrite: Optional[:class:`~discord.PermissionOverwrite`] - The permissions to allow and deny to the target, or ``None`` to - delete the overwrite. - \*\*permissions - A keyword argument list of permissions to set for ease of use. - Cannot be mixed with ``overwrite``. - reason: Optional[:class:`str`] - The reason for doing this action. Shows up on the audit log. - - Raises - ------- - ~discord.Forbidden - You do not have permissions to edit channel specific permissions. - ~discord.HTTPException - Editing channel specific permissions failed. - ~discord.NotFound - The role or member being edited is not part of the guild. - TypeError - The ``overwrite`` parameter was invalid or the target type was not - :class:`~discord.Role` or :class:`~discord.Member`. - ValueError - The ``overwrite`` parameter and ``positions`` parameters were both - unset. - """ - - http = self._state.http - - if isinstance(target, User): - perm_type = _Overwrites.MEMBER - elif isinstance(target, Role): - perm_type = _Overwrites.ROLE - else: - raise ValueError('target parameter must be either Member or Role') - - if overwrite is _undefined: - if len(permissions) == 0: - raise ValueError('No overwrite provided.') - try: - overwrite = PermissionOverwrite(**permissions) - except (ValueError, TypeError): - raise TypeError('Invalid permissions given to keyword arguments.') - else: - if len(permissions) > 0: - raise TypeError('Cannot mix overwrite and keyword arguments.') - - if overwrite is None: - await http.delete_channel_permissions(self.id, target.id, reason=reason) - elif isinstance(overwrite, PermissionOverwrite): - (allow, deny) = overwrite.pair() - await http.edit_channel_permissions( - self.id, target.id, str(allow.value), str(deny.value), perm_type, reason=reason - ) - else: - raise TypeError('Invalid overwrite type provided.') - - async def _clone_impl( - self, - base_attrs: Dict[str, Any], - *, - name: Optional[str] = None, - reason: Optional[str] = None, - ) -> Self: - base_attrs['permission_overwrites'] = [x._asdict() for x in self._overwrites] - base_attrs['parent_id'] = self.category_id - base_attrs['name'] = name or self.name - guild_id = self.guild.id - cls = self.__class__ - data = await self._state.http.create_channel(guild_id, self.type.value, reason=reason, **base_attrs) - obj = cls(state=self._state, guild=self.guild, data=data) - - # temporarily add it to the cache - self.guild._channels[obj.id] = obj # type: ignore # obj is a GuildChannel - return obj - - async def clone(self, *, name: Optional[str] = None, reason: Optional[str] = None) -> Self: - """|coro| - - Clones this channel. This creates a channel with the same properties - as this channel. - - You must have :attr:`~discord.Permissions.manage_channels` to do this. - - .. versionadded:: 1.1 - - Parameters - ------------ - name: Optional[:class:`str`] - The name of the new channel. If not provided, defaults to this - channel name. - reason: Optional[:class:`str`] - The reason for cloning this channel. Shows up on the audit log. - - Raises - ------- - ~discord.Forbidden - You do not have the proper permissions to create this channel. - ~discord.HTTPException - Creating the channel failed. - - Returns - -------- - :class:`.abc.GuildChannel` - The channel that was created. - """ - raise NotImplementedError - - @overload - async def move( - self, - *, - beginning: bool, - offset: int = MISSING, - category: Optional[Snowflake] = MISSING, - sync_permissions: bool = MISSING, - reason: Optional[str] = MISSING, - ) -> None: - ... - - @overload - async def move( - self, - *, - end: bool, - offset: int = MISSING, - category: Optional[Snowflake] = MISSING, - sync_permissions: bool = MISSING, - reason: str = MISSING, - ) -> None: - ... - - @overload - async def move( - self, - *, - before: Snowflake, - offset: int = MISSING, - category: Optional[Snowflake] = MISSING, - sync_permissions: bool = MISSING, - reason: str = MISSING, - ) -> None: - ... - - @overload - async def move( - self, - *, - after: Snowflake, - offset: int = MISSING, - category: Optional[Snowflake] = MISSING, - sync_permissions: bool = MISSING, - reason: str = MISSING, - ) -> None: - ... - - async def move(self, **kwargs: Any) -> None: - """|coro| - - A rich interface to help move a channel relative to other channels. - - If exact position movement is required, ``edit`` should be used instead. - - You must have :attr:`~discord.Permissions.manage_channels` to do this. - - .. note:: - - Voice channels will always be sorted below text channels. - This is a Discord limitation. - - .. versionadded:: 1.7 - - .. versionchanged:: 2.0 - This function will now raise :exc:`TypeError` or - :exc:`ValueError` instead of ``InvalidArgument``. - - Parameters - ------------ - beginning: :class:`bool` - Whether to move the channel to the beginning of the - channel list (or category if given). - This is mutually exclusive with ``end``, ``before``, and ``after``. - end: :class:`bool` - Whether to move the channel to the end of the - channel list (or category if given). - This is mutually exclusive with ``beginning``, ``before``, and ``after``. - before: :class:`~discord.abc.Snowflake` - The channel that should be before our current channel. - This is mutually exclusive with ``beginning``, ``end``, and ``after``. - after: :class:`~discord.abc.Snowflake` - The channel that should be after our current channel. - This is mutually exclusive with ``beginning``, ``end``, and ``before``. - offset: :class:`int` - The number of channels to offset the move by. For example, - an offset of ``2`` with ``beginning=True`` would move - it 2 after the beginning. A positive number moves it below - while a negative number moves it above. Note that this - number is relative and computed after the ``beginning``, - ``end``, ``before``, and ``after`` parameters. - category: Optional[:class:`~discord.abc.Snowflake`] - The category to move this channel under. - If ``None`` is given then it moves it out of the category. - This parameter is ignored if moving a category channel. - sync_permissions: :class:`bool` - Whether to sync the permissions with the category (if given). - reason: :class:`str` - The reason for the move. - - Raises - ------- - ValueError - An invalid position was given. - TypeError - A bad mix of arguments were passed. - Forbidden - You do not have permissions to move the channel. - HTTPException - Moving the channel failed. - """ - - if not kwargs: - return - - beginning, end = kwargs.get('beginning'), kwargs.get('end') - before, after = kwargs.get('before'), kwargs.get('after') - offset = kwargs.get('offset', 0) - if sum(bool(a) for a in (beginning, end, before, after)) > 1: - raise TypeError('Only one of [before, after, end, beginning] can be used.') - - bucket = self._sorting_bucket - parent_id = kwargs.get('category', MISSING) - # fmt: off - channels: List[GuildChannel] - if parent_id not in (MISSING, None): - parent_id = parent_id.id - channels = [ - ch - for ch in self.guild.channels - if ch._sorting_bucket == bucket - and ch.category_id == parent_id - ] - else: - channels = [ - ch - for ch in self.guild.channels - if ch._sorting_bucket == bucket - and ch.category_id == self.category_id - ] - # fmt: on - - channels.sort(key=lambda c: (c.position, c.id)) - - try: - # Try to remove ourselves from the channel list - channels.remove(self) - except ValueError: - # If we're not there then it's probably due to not being in the category - pass - - index = None - if beginning: - index = 0 - elif end: - index = len(channels) - elif before: - index = next((i for i, c in enumerate(channels) if c.id == before.id), None) - elif after: - index = next((i + 1 for i, c in enumerate(channels) if c.id == after.id), None) - - if index is None: - raise ValueError('Could not resolve appropriate move position') - - channels.insert(max((index + offset), 0), self) - payload = [] - lock_permissions = kwargs.get('sync_permissions', False) - reason = kwargs.get('reason') - for index, channel in enumerate(channels): - d = {'id': channel.id, 'position': index} - if parent_id is not MISSING and channel.id == self.id: - d.update(parent_id=parent_id, lock_permissions=lock_permissions) - payload.append(d) - - await self._state.http.bulk_channel_update(self.guild.id, payload, reason=reason) - - async def create_invite( - self, - *, - reason: Optional[str] = None, - max_age: int = 0, - max_uses: int = 0, - temporary: bool = False, - unique: bool = True, - target_type: Optional[InviteTarget] = None, - target_user: Optional[User] = None, - target_application_id: Optional[int] = None, - ) -> Invite: - """|coro| - - Creates an instant invite from a text or voice channel. - - You must have :attr:`~discord.Permissions.create_instant_invite` to do this. - - Parameters - ------------ - max_age: :class:`int` - How long the invite should last in seconds. If it's 0 then the invite - doesn't expire. Defaults to ``0``. - max_uses: :class:`int` - How many uses the invite could be used for. If it's 0 then there - are unlimited uses. Defaults to ``0``. - temporary: :class:`bool` - Denotes that the invite grants temporary membership - (i.e. they get kicked after they disconnect). Defaults to ``False``. - unique: :class:`bool` - Indicates if a unique invite URL should be created. Defaults to True. - If this is set to ``False`` then it will return a previously created - invite. - reason: Optional[:class:`str`] - The reason for creating this invite. Shows up on the audit log. - target_type: Optional[:class:`.InviteTarget`] - The type of target for the voice channel invite, if any. - - .. versionadded:: 2.0 - - target_user: Optional[:class:`User`] - The user whose stream to display for this invite, required if ``target_type`` is :attr:`.InviteTarget.stream`. The user must be streaming in the channel. - - .. versionadded:: 2.0 - - target_application_id:: Optional[:class:`int`] - The id of the embedded application for the invite, required if ``target_type`` is :attr:`.InviteTarget.embedded_application`. - - .. versionadded:: 2.0 - - Raises - ------- - ~discord.HTTPException - Invite creation failed. - - ~discord.NotFound - The channel that was passed is a category or an invalid channel. - - Returns - -------- - :class:`~discord.Invite` - The invite that was created. - """ - - data = await self._state.http.create_invite( - self.id, - reason=reason, - max_age=max_age, - max_uses=max_uses, - temporary=temporary, - unique=unique, - target_type=target_type.value if target_type else None, - target_user_id=target_user.id if target_user else None, - target_application_id=target_application_id, - ) - return Invite.from_incomplete(data=data, state=self._state) - - async def invites(self) -> List[Invite]: - """|coro| - - Returns a list of all active instant invites from this channel. - - You must have :attr:`~discord.Permissions.manage_channels` to get this information. - - Raises - ------- - ~discord.Forbidden - You do not have proper permissions to get the information. - ~discord.HTTPException - An error occurred while fetching the information. - - Returns - ------- - List[:class:`~discord.Invite`] - The list of invites that are currently active. - """ - - state = self._state - data = await state.http.invites_from_channel(self.id) - guild = self.guild - return [Invite(state=state, data=invite, channel=self, guild=guild) for invite in data] - - -class Messageable: - """An ABC that details the common operations on a model that can send messages. - - The following classes implement this ABC: - - - :class:`~discord.TextChannel` - - :class:`~discord.VoiceChannel` - - :class:`~discord.StageChannel` - - :class:`~discord.DMChannel` - - :class:`~discord.GroupChannel` - - :class:`~discord.PartialMessageable` - - :class:`~discord.User` - - :class:`~discord.Member` - - :class:`~discord.ext.commands.Context` - - :class:`~discord.Thread` - """ - - __slots__ = () - _state: ConnectionState - - async def _get_channel(self) -> MessageableChannel: - raise NotImplementedError - - @overload - async def send( - self, - content: Optional[str] = ..., - *, - tts: bool = ..., - embed: Embed = ..., - file: File = ..., - stickers: Sequence[Union[GuildSticker, StickerItem]] = ..., - delete_after: float = ..., - nonce: Union[str, int] = ..., - allowed_mentions: AllowedMentions = ..., - reference: Union[Message, MessageReference, PartialMessage] = ..., - mention_author: bool = ..., - view: View = ..., - suppress_embeds: bool = ..., - silent: bool = ..., - ) -> Message: - ... - - @overload - async def send( - self, - content: Optional[str] = ..., - *, - tts: bool = ..., - embed: Embed = ..., - files: Sequence[File] = ..., - stickers: Sequence[Union[GuildSticker, StickerItem]] = ..., - delete_after: float = ..., - nonce: Union[str, int] = ..., - allowed_mentions: AllowedMentions = ..., - reference: Union[Message, MessageReference, PartialMessage] = ..., - mention_author: bool = ..., - view: View = ..., - suppress_embeds: bool = ..., - silent: bool = ..., - ) -> Message: - ... - - @overload - async def send( - self, - content: Optional[str] = ..., - *, - tts: bool = ..., - embeds: Sequence[Embed] = ..., - file: File = ..., - stickers: Sequence[Union[GuildSticker, StickerItem]] = ..., - delete_after: float = ..., - nonce: Union[str, int] = ..., - allowed_mentions: AllowedMentions = ..., - reference: Union[Message, MessageReference, PartialMessage] = ..., - mention_author: bool = ..., - view: View = ..., - suppress_embeds: bool = ..., - silent: bool = ..., - ) -> Message: - ... - - @overload - async def send( - self, - content: Optional[str] = ..., - *, - tts: bool = ..., - embeds: Sequence[Embed] = ..., - files: Sequence[File] = ..., - stickers: Sequence[Union[GuildSticker, StickerItem]] = ..., - delete_after: float = ..., - nonce: Union[str, int] = ..., - allowed_mentions: AllowedMentions = ..., - reference: Union[Message, MessageReference, PartialMessage] = ..., - mention_author: bool = ..., - view: View = ..., - suppress_embeds: bool = ..., - silent: bool = ..., - ) -> Message: - ... - - async def send( - self, - content: Optional[str] = None, - *, - tts: bool = False, - embed: Optional[Embed] = None, - embeds: Optional[Sequence[Embed]] = None, - file: Optional[File] = None, - files: Optional[Sequence[File]] = None, - stickers: Optional[Sequence[Union[GuildSticker, StickerItem]]] = None, - delete_after: Optional[float] = None, - nonce: Optional[Union[str, int]] = None, - allowed_mentions: Optional[AllowedMentions] = None, - reference: Optional[Union[Message, MessageReference, PartialMessage]] = None, - mention_author: Optional[bool] = None, - view: Optional[View] = None, - suppress_embeds: bool = False, - silent: bool = False, - ) -> Message: - """|coro| - - Sends a message to the destination with the content given. - - The content must be a type that can convert to a string through ``str(content)``. - If the content is set to ``None`` (the default), then the ``embed`` parameter must - be provided. - - To upload a single file, the ``file`` parameter should be used with a - single :class:`~discord.File` object. To upload multiple files, the ``files`` - parameter should be used with a :class:`list` of :class:`~discord.File` objects. - **Specifying both parameters will lead to an exception**. - - To upload a single embed, the ``embed`` parameter should be used with a - single :class:`~discord.Embed` object. To upload multiple embeds, the ``embeds`` - parameter should be used with a :class:`list` of :class:`~discord.Embed` objects. - **Specifying both parameters will lead to an exception**. - - .. versionchanged:: 2.0 - This function will now raise :exc:`TypeError` or - :exc:`ValueError` instead of ``InvalidArgument``. - - Parameters - ------------ - content: Optional[:class:`str`] - The content of the message to send. - tts: :class:`bool` - Indicates if the message should be sent using text-to-speech. - embed: :class:`~discord.Embed` - The rich embed for the content. - embeds: List[:class:`~discord.Embed`] - A list of embeds to upload. Must be a maximum of 10. - - .. versionadded:: 2.0 - file: :class:`~discord.File` - The file to upload. - files: List[:class:`~discord.File`] - A list of files to upload. Must be a maximum of 10. - nonce: :class:`int` - The nonce to use for sending this message. If the message was successfully sent, - then the message will have a nonce with this value. - delete_after: :class:`float` - If provided, the number of seconds to wait in the background - before deleting the message we just sent. If the deletion fails, - then it is silently ignored. - allowed_mentions: :class:`~discord.AllowedMentions` - Controls the mentions being processed in this message. If this is - passed, then the object is merged with :attr:`~discord.Client.allowed_mentions`. - The merging behaviour only overrides attributes that have been explicitly passed - to the object, otherwise it uses the attributes set in :attr:`~discord.Client.allowed_mentions`. - If no object is passed at all then the defaults given by :attr:`~discord.Client.allowed_mentions` - are used instead. - - .. versionadded:: 1.4 - - reference: Union[:class:`~discord.Message`, :class:`~discord.MessageReference`, :class:`~discord.PartialMessage`] - A reference to the :class:`~discord.Message` to which you are replying, this can be created using - :meth:`~discord.Message.to_reference` or passed directly as a :class:`~discord.Message`. You can control - whether this mentions the author of the referenced message using the :attr:`~discord.AllowedMentions.replied_user` - attribute of ``allowed_mentions`` or by setting ``mention_author``. - - .. versionadded:: 1.6 - - mention_author: Optional[:class:`bool`] - If set, overrides the :attr:`~discord.AllowedMentions.replied_user` attribute of ``allowed_mentions``. - - .. versionadded:: 1.6 - view: :class:`discord.ui.View` - A Discord UI View to add to the message. - - .. versionadded:: 2.0 - stickers: Sequence[Union[:class:`~discord.GuildSticker`, :class:`~discord.StickerItem`]] - A list of stickers to upload. Must be a maximum of 3. - - .. versionadded:: 2.0 - suppress_embeds: :class:`bool` - Whether to suppress embeds for the message. This sends the message without any embeds if set to ``True``. - - .. versionadded:: 2.0 - silent: :class:`bool` - Whether to suppress push and desktop notifications for the message. This will increment the mention counter - in the UI, but will not actually send a notification. - - .. versionadded:: 2.2 - - Raises - -------- - ~discord.HTTPException - Sending the message failed. - ~discord.Forbidden - You do not have the proper permissions to send the message. - ValueError - The ``files`` or ``embeds`` list is not of the appropriate size. - TypeError - You specified both ``file`` and ``files``, - or you specified both ``embed`` and ``embeds``, - or the ``reference`` object is not a :class:`~discord.Message`, - :class:`~discord.MessageReference` or :class:`~discord.PartialMessage`. - - Returns - --------- - :class:`~discord.Message` - The message that was sent. - """ - - channel = await self._get_channel() - state = self._state - content = str(content) if content is not None else None - previous_allowed_mention = state.allowed_mentions - - if stickers is not None: - sticker_ids: SnowflakeList = [sticker.id for sticker in stickers] - else: - sticker_ids = MISSING - - if reference is not None: - try: - reference_dict = reference.to_message_reference_dict() - except AttributeError: - raise TypeError('reference parameter must be Message, MessageReference, or PartialMessage') from None - else: - reference_dict = MISSING - - if view and not hasattr(view, '__discord_ui_view__'): - raise TypeError(f'view parameter must be View not {view.__class__.__name__}') - - if suppress_embeds or silent: - from .message import MessageFlags # circular import - - flags = MessageFlags._from_value(0) - flags.suppress_embeds = suppress_embeds - flags.suppress_notifications = silent - else: - flags = MISSING - - with handle_message_parameters( - content=content, - tts=tts, - file=file if file is not None else MISSING, - files=files if files is not None else MISSING, - embed=embed if embed is not None else MISSING, - embeds=embeds if embeds is not None else MISSING, - nonce=nonce, - allowed_mentions=allowed_mentions, - message_reference=reference_dict, - previous_allowed_mentions=previous_allowed_mention, - mention_author=mention_author, - stickers=sticker_ids, - view=view, - flags=flags, - ) as params: - data = await state.http.send_message(channel.id, params=params) - - ret = state.create_message(channel=channel, data=data) - if view and not view.is_finished(): - state.store_view(view, ret.id) - - if delete_after is not None: - await ret.delete(delay=delete_after) - return ret - - def typing(self) -> Typing: - """Returns an asynchronous context manager that allows you to send a typing indicator to - the destination for an indefinite period of time, or 10 seconds if the context manager - is called using ``await``. - - Example Usage: :: - - async with channel.typing(): - # simulate something heavy - await asyncio.sleep(20) - - await channel.send('Done!') - - Example Usage: :: - - await channel.typing() - # Do some computational magic for about 10 seconds - await channel.send('Done!') - - .. versionchanged:: 2.0 - This no longer works with the ``with`` syntax, ``async with`` must be used instead. - - .. versionchanged:: 2.0 - Added functionality to ``await`` the context manager to send a typing indicator for 10 seconds. - """ - return Typing(self) - - async def fetch_message(self, id: int, /) -> Message: - """|coro| - - Retrieves a single :class:`~discord.Message` from the destination. - - Parameters - ------------ - id: :class:`int` - The message ID to look for. - - Raises - -------- - ~discord.NotFound - The specified message was not found. - ~discord.Forbidden - You do not have the permissions required to get a message. - ~discord.HTTPException - Retrieving the message failed. - - Returns - -------- - :class:`~discord.Message` - The message asked for. - """ - - channel = await self._get_channel() - data = await self._state.http.get_message(channel.id, id) - return self._state.create_message(channel=channel, data=data) - - async def pins(self) -> List[Message]: - """|coro| - - Retrieves all messages that are currently pinned in the channel. - - .. note:: - - Due to a limitation with the Discord API, the :class:`.Message` - objects returned by this method do not contain complete - :attr:`.Message.reactions` data. - - Raises - ------- - ~discord.Forbidden - You do not have the permission to retrieve pinned messages. - ~discord.HTTPException - Retrieving the pinned messages failed. - - Returns - -------- - List[:class:`~discord.Message`] - The messages that are currently pinned. - """ - - channel = await self._get_channel() - state = self._state - data = await state.http.pins_from(channel.id) - return [state.create_message(channel=channel, data=m) for m in data] - - async def history( - self, - *, - limit: Optional[int] = 100, - before: Optional[SnowflakeTime] = None, - after: Optional[SnowflakeTime] = None, - around: Optional[SnowflakeTime] = None, - oldest_first: Optional[bool] = None, - ) -> AsyncIterator[Message]: - """Returns an :term:`asynchronous iterator` that enables receiving the destination's message history. - - You must have :attr:`~discord.Permissions.read_message_history` to do this. - - Examples - --------- - - Usage :: - - counter = 0 - async for message in channel.history(limit=200): - if message.author == client.user: - counter += 1 - - Flattening into a list: :: - - messages = [message async for message in channel.history(limit=123)] - # messages is now a list of Message... - - All parameters are optional. - - Parameters - ----------- - limit: Optional[:class:`int`] - The number of messages to retrieve. - If ``None``, retrieves every message in the channel. Note, however, - that this would make it a slow operation. - before: Optional[Union[:class:`~discord.abc.Snowflake`, :class:`datetime.datetime`]] - Retrieve messages before this date or message. - If a datetime is provided, it is recommended to use a UTC aware datetime. - If the datetime is naive, it is assumed to be local time. - after: Optional[Union[:class:`~discord.abc.Snowflake`, :class:`datetime.datetime`]] - Retrieve messages after this date or message. - If a datetime is provided, it is recommended to use a UTC aware datetime. - If the datetime is naive, it is assumed to be local time. - around: Optional[Union[:class:`~discord.abc.Snowflake`, :class:`datetime.datetime`]] - Retrieve messages around this date or message. - If a datetime is provided, it is recommended to use a UTC aware datetime. - If the datetime is naive, it is assumed to be local time. - When using this argument, the maximum limit is 101. Note that if the limit is an - even number then this will return at most limit + 1 messages. - oldest_first: Optional[:class:`bool`] - If set to ``True``, return messages in oldest->newest order. Defaults to ``True`` if - ``after`` is specified, otherwise ``False``. - - Raises - ------ - ~discord.Forbidden - You do not have permissions to get channel message history. - ~discord.HTTPException - The request to get message history failed. - - Yields - ------- - :class:`~discord.Message` - The message with the message data parsed. - """ - - async def _around_strategy(retrieve: int, around: Optional[Snowflake], limit: Optional[int]): - if not around: - return [], None, 0 - - around_id = around.id if around else None - data = await self._state.http.logs_from(channel.id, retrieve, around=around_id) - - return data, None, 0 - - async def _after_strategy(retrieve: int, after: Optional[Snowflake], limit: Optional[int]): - after_id = after.id if after else None - data = await self._state.http.logs_from(channel.id, retrieve, after=after_id) - - if data: - if limit is not None: - limit -= len(data) - - after = Object(id=int(data[0]['id'])) - - return data, after, limit - - async def _before_strategy(retrieve: int, before: Optional[Snowflake], limit: Optional[int]): - before_id = before.id if before else None - data = await self._state.http.logs_from(channel.id, retrieve, before=before_id) - - if data: - if limit is not None: - limit -= len(data) - - before = Object(id=int(data[-1]['id'])) - - return data, before, limit - - if isinstance(before, datetime): - before = Object(id=utils.time_snowflake(before, high=False)) - if isinstance(after, datetime): - after = Object(id=utils.time_snowflake(after, high=True)) - if isinstance(around, datetime): - around = Object(id=utils.time_snowflake(around)) - - if oldest_first is None: - reverse = after is not None - else: - reverse = oldest_first - - after = after or OLDEST_OBJECT - predicate = None - - if around: - if limit is None: - raise ValueError('history does not support around with limit=None') - if limit > 101: - raise ValueError("history max limit 101 when specifying around parameter") - - # Strange Discord quirk - limit = 100 if limit == 101 else limit - - strategy, state = _around_strategy, around - - if before and after: - predicate = lambda m: after.id < int(m['id']) < before.id - elif before: - predicate = lambda m: int(m['id']) < before.id - elif after: - predicate = lambda m: after.id < int(m['id']) - elif reverse: - strategy, state = _after_strategy, after - if before: - predicate = lambda m: int(m['id']) < before.id - else: - strategy, state = _before_strategy, before - if after and after != OLDEST_OBJECT: - predicate = lambda m: int(m['id']) > after.id - - channel = await self._get_channel() - - while True: - retrieve = 100 if limit is None else min(limit, 100) - if retrieve < 1: - return - - data, state, limit = await strategy(retrieve, state, limit) - - if reverse: - data = reversed(data) - if predicate: - data = filter(predicate, data) - - count = 0 - - for count, raw_message in enumerate(data, 1): - yield self._state.create_message(channel=channel, data=raw_message) - - if count < 100: - # There's no data left after this - break - - -class Connectable(Protocol): - """An ABC that details the common operations on a channel that can - connect to a voice server. - - The following implement this ABC: - - - :class:`~discord.VoiceChannel` - - :class:`~discord.StageChannel` - """ - - __slots__ = () - _state: ConnectionState - - def _get_voice_client_key(self) -> Tuple[int, str]: - raise NotImplementedError - - def _get_voice_state_pair(self) -> Tuple[int, int]: - raise NotImplementedError - - async def connect( - self, - *, - timeout: float = 60.0, - reconnect: bool = True, - cls: Callable[[Client, Connectable], T] = VoiceClient, - self_deaf: bool = False, - self_mute: bool = False, - ) -> T: - """|coro| - - Connects to voice and creates a :class:`~discord.VoiceClient` to establish - your connection to the voice server. - - This requires :attr:`~discord.Intents.voice_states`. - - Parameters - ----------- - timeout: :class:`float` - The timeout in seconds to wait for the voice endpoint. - reconnect: :class:`bool` - Whether the bot should automatically attempt - a reconnect if a part of the handshake fails - or the gateway goes down. - cls: Type[:class:`~discord.VoiceProtocol`] - A type that subclasses :class:`~discord.VoiceProtocol` to connect with. - Defaults to :class:`~discord.VoiceClient`. - self_mute: :class:`bool` - Indicates if the client should be self-muted. - - .. versionadded:: 2.0 - self_deaf: :class:`bool` - Indicates if the client should be self-deafened. - - .. versionadded:: 2.0 - - Raises - ------- - asyncio.TimeoutError - Could not connect to the voice channel in time. - ~discord.ClientException - You are already connected to a voice channel. - ~discord.opus.OpusNotLoaded - The opus library has not been loaded. - - Returns - -------- - :class:`~discord.VoiceProtocol` - A voice client that is fully connected to the voice server. - """ - - key_id, _ = self._get_voice_client_key() - state = self._state - - if state._get_voice_client(key_id): - raise ClientException('Already connected to a voice channel.') - - client = state._get_client() - voice: T = cls(client, self) - - if not isinstance(voice, VoiceProtocol): - raise TypeError('Type must meet VoiceProtocol abstract base class.') - - state._add_voice_client(key_id, voice) - - try: - await voice.connect(timeout=timeout, reconnect=reconnect, self_deaf=self_deaf, self_mute=self_mute) - except asyncio.TimeoutError: - try: - await voice.disconnect(force=True) - except Exception: - # we don't care if disconnect failed because connection failed - pass - raise # re-raise - - return voice diff --git a/.venv/Lib/site-packages/discord/activity.py b/.venv/Lib/site-packages/discord/activity.py deleted file mode 100644 index 534d12a..0000000 --- a/.venv/Lib/site-packages/discord/activity.py +++ /dev/null @@ -1,842 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -import datetime -from typing import Any, Dict, List, Optional, TYPE_CHECKING, Union, overload - -from .asset import Asset -from .enums import ActivityType, try_enum -from .colour import Colour -from .partial_emoji import PartialEmoji -from .utils import _get_as_snowflake - -__all__ = ( - 'BaseActivity', - 'Activity', - 'Streaming', - 'Game', - 'Spotify', - 'CustomActivity', -) - -"""If curious, this is the current schema for an activity. - -It's fairly long so I will document it here: - -All keys are optional. - -state: str (max: 128), -details: str (max: 128) -timestamps: dict - start: int (min: 1) - end: int (min: 1) -assets: dict - large_image: str (max: 32) - large_text: str (max: 128) - small_image: str (max: 32) - small_text: str (max: 128) -party: dict - id: str (max: 128), - size: List[int] (max-length: 2) - elem: int (min: 1) -secrets: dict - match: str (max: 128) - join: str (max: 128) - spectate: str (max: 128) -instance: bool -application_id: str -name: str (max: 128) -url: str -type: int -sync_id: str -session_id: str -flags: int -buttons: list[str (max: 32)] - -There are also activity flags which are mostly uninteresting for the library atm. - -t.ActivityFlags = { - INSTANCE: 1, - JOIN: 2, - SPECTATE: 4, - JOIN_REQUEST: 8, - SYNC: 16, - PLAY: 32 -} -""" - -if TYPE_CHECKING: - from .types.activity import ( - Activity as ActivityPayload, - ActivityTimestamps, - ActivityParty, - ActivityAssets, - ) - - from .state import ConnectionState - - -class BaseActivity: - """The base activity that all user-settable activities inherit from. - A user-settable activity is one that can be used in :meth:`Client.change_presence`. - - The following types currently count as user-settable: - - - :class:`Activity` - - :class:`Game` - - :class:`Streaming` - - :class:`CustomActivity` - - Note that although these types are considered user-settable by the library, - Discord typically ignores certain combinations of activity depending on - what is currently set. This behaviour may change in the future so there are - no guarantees on whether Discord will actually let you set these types. - - .. versionadded:: 1.3 - """ - - __slots__ = ('_created_at',) - - def __init__(self, **kwargs: Any) -> None: - self._created_at: Optional[float] = kwargs.pop('created_at', None) - - @property - def created_at(self) -> Optional[datetime.datetime]: - """Optional[:class:`datetime.datetime`]: When the user started doing this activity in UTC. - - .. versionadded:: 1.3 - """ - if self._created_at is not None: - return datetime.datetime.fromtimestamp(self._created_at / 1000, tz=datetime.timezone.utc) - - def to_dict(self) -> ActivityPayload: - raise NotImplementedError - - -class Activity(BaseActivity): - """Represents an activity in Discord. - - This could be an activity such as streaming, playing, listening - or watching. - - For memory optimisation purposes, some activities are offered in slimmed - down versions: - - - :class:`Game` - - :class:`Streaming` - - Attributes - ------------ - application_id: Optional[:class:`int`] - The application ID of the game. - name: Optional[:class:`str`] - The name of the activity. - url: Optional[:class:`str`] - A stream URL that the activity could be doing. - type: :class:`ActivityType` - The type of activity currently being done. - state: Optional[:class:`str`] - The user's current state. For example, "In Game". - details: Optional[:class:`str`] - The detail of the user's current activity. - timestamps: :class:`dict` - A dictionary of timestamps. It contains the following optional keys: - - - ``start``: Corresponds to when the user started doing the - activity in milliseconds since Unix epoch. - - ``end``: Corresponds to when the user will finish doing the - activity in milliseconds since Unix epoch. - - assets: :class:`dict` - A dictionary representing the images and their hover text of an activity. - It contains the following optional keys: - - - ``large_image``: A string representing the ID for the large image asset. - - ``large_text``: A string representing the text when hovering over the large image asset. - - ``small_image``: A string representing the ID for the small image asset. - - ``small_text``: A string representing the text when hovering over the small image asset. - - party: :class:`dict` - A dictionary representing the activity party. It contains the following optional keys: - - - ``id``: A string representing the party ID. - - ``size``: A list of up to two integer elements denoting (current_size, maximum_size). - buttons: List[:class:`str`] - A list of strings representing the labels of custom buttons shown in a rich presence. - - .. versionadded:: 2.0 - - emoji: Optional[:class:`PartialEmoji`] - The emoji that belongs to this activity. - """ - - __slots__ = ( - 'state', - 'details', - 'timestamps', - 'assets', - 'party', - 'flags', - 'sync_id', - 'session_id', - 'type', - 'name', - 'url', - 'application_id', - 'emoji', - 'buttons', - ) - - def __init__(self, **kwargs: Any) -> None: - super().__init__(**kwargs) - self.state: Optional[str] = kwargs.pop('state', None) - self.details: Optional[str] = kwargs.pop('details', None) - self.timestamps: ActivityTimestamps = kwargs.pop('timestamps', {}) - self.assets: ActivityAssets = kwargs.pop('assets', {}) - self.party: ActivityParty = kwargs.pop('party', {}) - self.application_id: Optional[int] = _get_as_snowflake(kwargs, 'application_id') - self.name: Optional[str] = kwargs.pop('name', None) - self.url: Optional[str] = kwargs.pop('url', None) - self.flags: int = kwargs.pop('flags', 0) - self.sync_id: Optional[str] = kwargs.pop('sync_id', None) - self.session_id: Optional[str] = kwargs.pop('session_id', None) - self.buttons: List[str] = kwargs.pop('buttons', []) - - activity_type = kwargs.pop('type', -1) - self.type: ActivityType = ( - activity_type if isinstance(activity_type, ActivityType) else try_enum(ActivityType, activity_type) - ) - - emoji = kwargs.pop('emoji', None) - self.emoji: Optional[PartialEmoji] = PartialEmoji.from_dict(emoji) if emoji is not None else None - - def __repr__(self) -> str: - attrs = ( - ('type', self.type), - ('name', self.name), - ('url', self.url), - ('details', self.details), - ('application_id', self.application_id), - ('session_id', self.session_id), - ('emoji', self.emoji), - ) - inner = ' '.join('%s=%r' % t for t in attrs) - return f'' - - def to_dict(self) -> Dict[str, Any]: - ret: Dict[str, Any] = {} - for attr in self.__slots__: - value = getattr(self, attr, None) - if value is None: - continue - - if isinstance(value, dict) and len(value) == 0: - continue - - ret[attr] = value - ret['type'] = int(self.type) - if self.emoji: - ret['emoji'] = self.emoji.to_dict() - return ret - - @property - def start(self) -> Optional[datetime.datetime]: - """Optional[:class:`datetime.datetime`]: When the user started doing this activity in UTC, if applicable.""" - try: - timestamp = self.timestamps['start'] / 1000 - except KeyError: - return None - else: - return datetime.datetime.fromtimestamp(timestamp, tz=datetime.timezone.utc) - - @property - def end(self) -> Optional[datetime.datetime]: - """Optional[:class:`datetime.datetime`]: When the user will stop doing this activity in UTC, if applicable.""" - try: - timestamp = self.timestamps['end'] / 1000 - except KeyError: - return None - else: - return datetime.datetime.fromtimestamp(timestamp, tz=datetime.timezone.utc) - - @property - def large_image_url(self) -> Optional[str]: - """Optional[:class:`str`]: Returns a URL pointing to the large image asset of this activity, if applicable.""" - try: - large_image = self.assets['large_image'] - except KeyError: - return None - else: - return self._image_url(large_image) - - @property - def small_image_url(self) -> Optional[str]: - """Optional[:class:`str`]: Returns a URL pointing to the small image asset of this activity, if applicable.""" - try: - small_image = self.assets['small_image'] - except KeyError: - return None - else: - return self._image_url(small_image) - - def _image_url(self, image: str) -> Optional[str]: - if image.startswith('mp:'): - return f'https://media.discordapp.net/{image[3:]}' - elif self.application_id is not None: - return Asset.BASE + f'/app-assets/{self.application_id}/{image}.png' - - @property - def large_image_text(self) -> Optional[str]: - """Optional[:class:`str`]: Returns the large image asset hover text of this activity, if applicable.""" - return self.assets.get('large_text', None) - - @property - def small_image_text(self) -> Optional[str]: - """Optional[:class:`str`]: Returns the small image asset hover text of this activity, if applicable.""" - return self.assets.get('small_text', None) - - -class Game(BaseActivity): - """A slimmed down version of :class:`Activity` that represents a Discord game. - - This is typically displayed via **Playing** on the official Discord client. - - .. container:: operations - - .. describe:: x == y - - Checks if two games are equal. - - .. describe:: x != y - - Checks if two games are not equal. - - .. describe:: hash(x) - - Returns the game's hash. - - .. describe:: str(x) - - Returns the game's name. - - Parameters - ----------- - name: :class:`str` - The game's name. - - Attributes - ----------- - name: :class:`str` - The game's name. - """ - - __slots__ = ('name', '_end', '_start') - - def __init__(self, name: str, **extra: Any) -> None: - super().__init__(**extra) - self.name: str = name - - try: - timestamps: ActivityTimestamps = extra['timestamps'] - except KeyError: - self._start = 0 - self._end = 0 - else: - self._start = timestamps.get('start', 0) - self._end = timestamps.get('end', 0) - - @property - def type(self) -> ActivityType: - """:class:`ActivityType`: Returns the game's type. This is for compatibility with :class:`Activity`. - - It always returns :attr:`ActivityType.playing`. - """ - return ActivityType.playing - - @property - def start(self) -> Optional[datetime.datetime]: - """Optional[:class:`datetime.datetime`]: When the user started playing this game in UTC, if applicable.""" - if self._start: - return datetime.datetime.fromtimestamp(self._start / 1000, tz=datetime.timezone.utc) - return None - - @property - def end(self) -> Optional[datetime.datetime]: - """Optional[:class:`datetime.datetime`]: When the user will stop playing this game in UTC, if applicable.""" - if self._end: - return datetime.datetime.fromtimestamp(self._end / 1000, tz=datetime.timezone.utc) - return None - - def __str__(self) -> str: - return str(self.name) - - def __repr__(self) -> str: - return f'' - - def to_dict(self) -> Dict[str, Any]: - timestamps: Dict[str, Any] = {} - if self._start: - timestamps['start'] = self._start - - if self._end: - timestamps['end'] = self._end - - return { - 'type': ActivityType.playing.value, - 'name': str(self.name), - 'timestamps': timestamps, - } - - def __eq__(self, other: object) -> bool: - return isinstance(other, Game) and other.name == self.name - - def __ne__(self, other: object) -> bool: - return not self.__eq__(other) - - def __hash__(self) -> int: - return hash(self.name) - - -class Streaming(BaseActivity): - """A slimmed down version of :class:`Activity` that represents a Discord streaming status. - - This is typically displayed via **Streaming** on the official Discord client. - - .. container:: operations - - .. describe:: x == y - - Checks if two streams are equal. - - .. describe:: x != y - - Checks if two streams are not equal. - - .. describe:: hash(x) - - Returns the stream's hash. - - .. describe:: str(x) - - Returns the stream's name. - - Attributes - ----------- - platform: Optional[:class:`str`] - Where the user is streaming from (ie. YouTube, Twitch). - - .. versionadded:: 1.3 - - name: Optional[:class:`str`] - The stream's name. - details: Optional[:class:`str`] - An alias for :attr:`name` - game: Optional[:class:`str`] - The game being streamed. - - .. versionadded:: 1.3 - - url: :class:`str` - The stream's URL. - assets: :class:`dict` - A dictionary comprising of similar keys than those in :attr:`Activity.assets`. - """ - - __slots__ = ('platform', 'name', 'game', 'url', 'details', 'assets') - - def __init__(self, *, name: Optional[str], url: str, **extra: Any) -> None: - super().__init__(**extra) - self.platform: Optional[str] = name - self.name: Optional[str] = extra.pop('details', name) - self.game: Optional[str] = extra.pop('state', None) - self.url: str = url - self.details: Optional[str] = extra.pop('details', self.name) # compatibility - self.assets: ActivityAssets = extra.pop('assets', {}) - - @property - def type(self) -> ActivityType: - """:class:`ActivityType`: Returns the game's type. This is for compatibility with :class:`Activity`. - - It always returns :attr:`ActivityType.streaming`. - """ - return ActivityType.streaming - - def __str__(self) -> str: - return str(self.name) - - def __repr__(self) -> str: - return f'' - - @property - def twitch_name(self) -> Optional[str]: - """Optional[:class:`str`]: If provided, the twitch name of the user streaming. - - This corresponds to the ``large_image`` key of the :attr:`Streaming.assets` - dictionary if it starts with ``twitch:``. Typically set by the Discord client. - """ - - try: - name = self.assets['large_image'] - except KeyError: - return None - else: - return name[7:] if name[:7] == 'twitch:' else None - - def to_dict(self) -> Dict[str, Any]: - ret: Dict[str, Any] = { - 'type': ActivityType.streaming.value, - 'name': str(self.name), - 'url': str(self.url), - 'assets': self.assets, - } - if self.details: - ret['details'] = self.details - return ret - - def __eq__(self, other: object) -> bool: - return isinstance(other, Streaming) and other.name == self.name and other.url == self.url - - def __ne__(self, other: object) -> bool: - return not self.__eq__(other) - - def __hash__(self) -> int: - return hash(self.name) - - -class Spotify: - """Represents a Spotify listening activity from Discord. This is a special case of - :class:`Activity` that makes it easier to work with the Spotify integration. - - .. container:: operations - - .. describe:: x == y - - Checks if two activities are equal. - - .. describe:: x != y - - Checks if two activities are not equal. - - .. describe:: hash(x) - - Returns the activity's hash. - - .. describe:: str(x) - - Returns the string 'Spotify'. - """ - - __slots__ = ('_state', '_details', '_timestamps', '_assets', '_party', '_sync_id', '_session_id', '_created_at') - - def __init__(self, **data: Any) -> None: - self._state: str = data.pop('state', '') - self._details: str = data.pop('details', '') - self._timestamps: ActivityTimestamps = data.pop('timestamps', {}) - self._assets: ActivityAssets = data.pop('assets', {}) - self._party: ActivityParty = data.pop('party', {}) - self._sync_id: str = data.pop('sync_id', '') - self._session_id: Optional[str] = data.pop('session_id') - self._created_at: Optional[float] = data.pop('created_at', None) - - @property - def type(self) -> ActivityType: - """:class:`ActivityType`: Returns the activity's type. This is for compatibility with :class:`Activity`. - - It always returns :attr:`ActivityType.listening`. - """ - return ActivityType.listening - - @property - def created_at(self) -> Optional[datetime.datetime]: - """Optional[:class:`datetime.datetime`]: When the user started listening in UTC. - - .. versionadded:: 1.3 - """ - if self._created_at is not None: - return datetime.datetime.fromtimestamp(self._created_at / 1000, tz=datetime.timezone.utc) - - @property - def colour(self) -> Colour: - """:class:`Colour`: Returns the Spotify integration colour, as a :class:`Colour`. - - There is an alias for this named :attr:`color`""" - return Colour(0x1DB954) - - @property - def color(self) -> Colour: - """:class:`Colour`: Returns the Spotify integration colour, as a :class:`Colour`. - - There is an alias for this named :attr:`colour`""" - return self.colour - - def to_dict(self) -> Dict[str, Any]: - return { - 'flags': 48, # SYNC | PLAY - 'name': 'Spotify', - 'assets': self._assets, - 'party': self._party, - 'sync_id': self._sync_id, - 'session_id': self._session_id, - 'timestamps': self._timestamps, - 'details': self._details, - 'state': self._state, - } - - @property - def name(self) -> str: - """:class:`str`: The activity's name. This will always return "Spotify".""" - return 'Spotify' - - def __eq__(self, other: object) -> bool: - return ( - isinstance(other, Spotify) - and other._session_id == self._session_id - and other._sync_id == self._sync_id - and other.start == self.start - ) - - def __ne__(self, other: object) -> bool: - return not self.__eq__(other) - - def __hash__(self) -> int: - return hash(self._session_id) - - def __str__(self) -> str: - return 'Spotify' - - def __repr__(self) -> str: - return f'' - - @property - def title(self) -> str: - """:class:`str`: The title of the song being played.""" - return self._details - - @property - def artists(self) -> List[str]: - """List[:class:`str`]: The artists of the song being played.""" - return self._state.split('; ') - - @property - def artist(self) -> str: - """:class:`str`: The artist of the song being played. - - This does not attempt to split the artist information into - multiple artists. Useful if there's only a single artist. - """ - return self._state - - @property - def album(self) -> str: - """:class:`str`: The album that the song being played belongs to.""" - return self._assets.get('large_text', '') - - @property - def album_cover_url(self) -> str: - """:class:`str`: The album cover image URL from Spotify's CDN.""" - large_image = self._assets.get('large_image', '') - if large_image[:8] != 'spotify:': - return '' - album_image_id = large_image[8:] - return 'https://i.scdn.co/image/' + album_image_id - - @property - def track_id(self) -> str: - """:class:`str`: The track ID used by Spotify to identify this song.""" - return self._sync_id - - @property - def track_url(self) -> str: - """:class:`str`: The track URL to listen on Spotify. - - .. versionadded:: 2.0 - """ - return f'https://open.spotify.com/track/{self.track_id}' - - @property - def start(self) -> datetime.datetime: - """:class:`datetime.datetime`: When the user started playing this song in UTC.""" - # the start key will be present here - return datetime.datetime.fromtimestamp(self._timestamps['start'] / 1000, tz=datetime.timezone.utc) # type: ignore - - @property - def end(self) -> datetime.datetime: - """:class:`datetime.datetime`: When the user will stop playing this song in UTC.""" - # the end key will be present here - return datetime.datetime.fromtimestamp(self._timestamps['end'] / 1000, tz=datetime.timezone.utc) # type: ignore - - @property - def duration(self) -> datetime.timedelta: - """:class:`datetime.timedelta`: The duration of the song being played.""" - return self.end - self.start - - @property - def party_id(self) -> str: - """:class:`str`: The party ID of the listening party.""" - return self._party.get('id', '') - - -class CustomActivity(BaseActivity): - """Represents a custom activity from Discord. - - .. container:: operations - - .. describe:: x == y - - Checks if two activities are equal. - - .. describe:: x != y - - Checks if two activities are not equal. - - .. describe:: hash(x) - - Returns the activity's hash. - - .. describe:: str(x) - - Returns the custom status text. - - .. versionadded:: 1.3 - - Attributes - ----------- - name: Optional[:class:`str`] - The custom activity's name. - emoji: Optional[:class:`PartialEmoji`] - The emoji to pass to the activity, if any. - """ - - __slots__ = ('name', 'emoji', 'state') - - def __init__(self, name: Optional[str], *, emoji: Optional[PartialEmoji] = None, **extra: Any) -> None: - super().__init__(**extra) - self.name: Optional[str] = name - self.state: Optional[str] = extra.pop('state', name) - if self.name == 'Custom Status': - self.name = self.state - - self.emoji: Optional[PartialEmoji] - if emoji is None: - self.emoji = emoji - elif isinstance(emoji, dict): - self.emoji = PartialEmoji.from_dict(emoji) - elif isinstance(emoji, str): - self.emoji = PartialEmoji(name=emoji) - elif isinstance(emoji, PartialEmoji): - self.emoji = emoji - else: - raise TypeError(f'Expected str, PartialEmoji, or None, received {type(emoji)!r} instead.') - - @property - def type(self) -> ActivityType: - """:class:`ActivityType`: Returns the activity's type. This is for compatibility with :class:`Activity`. - - It always returns :attr:`ActivityType.custom`. - """ - return ActivityType.custom - - def to_dict(self) -> Dict[str, Any]: - if self.name == self.state: - o = { - 'type': ActivityType.custom.value, - 'state': self.name, - 'name': 'Custom Status', - } - else: - o = { - 'type': ActivityType.custom.value, - 'name': self.name, - } - - if self.emoji: - o['emoji'] = self.emoji.to_dict() - return o - - def __eq__(self, other: object) -> bool: - return isinstance(other, CustomActivity) and other.name == self.name and other.emoji == self.emoji - - def __ne__(self, other: object) -> bool: - return not self.__eq__(other) - - def __hash__(self) -> int: - return hash((self.name, str(self.emoji))) - - def __str__(self) -> str: - if self.emoji: - if self.name: - return f'{self.emoji} {self.name}' - return str(self.emoji) - else: - return str(self.name) - - def __repr__(self) -> str: - return f'' - - -ActivityTypes = Union[Activity, Game, CustomActivity, Streaming, Spotify] - - -@overload -def create_activity(data: ActivityPayload, state: ConnectionState) -> ActivityTypes: - ... - - -@overload -def create_activity(data: None, state: ConnectionState) -> None: - ... - - -def create_activity(data: Optional[ActivityPayload], state: ConnectionState) -> Optional[ActivityTypes]: - if not data: - return None - - game_type = try_enum(ActivityType, data.get('type', -1)) - if game_type is ActivityType.playing: - if 'application_id' in data or 'session_id' in data: - return Activity(**data) - return Game(**data) - elif game_type is ActivityType.custom: - try: - name = data.pop('name') # type: ignore - except KeyError: - ret = Activity(**data) - else: - # we removed the name key from data already - ret = CustomActivity(name=name, **data) # type: ignore - elif game_type is ActivityType.streaming: - if 'url' in data: - # the url won't be None here - return Streaming(**data) # type: ignore - return Activity(**data) - elif game_type is ActivityType.listening and 'sync_id' in data and 'session_id' in data: - return Spotify(**data) - else: - ret = Activity(**data) - - if isinstance(ret.emoji, PartialEmoji): - ret.emoji._state = state - return ret diff --git a/.venv/Lib/site-packages/discord/app_commands/__init__.py b/.venv/Lib/site-packages/discord/app_commands/__init__.py deleted file mode 100644 index 9714617..0000000 --- a/.venv/Lib/site-packages/discord/app_commands/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -""" -discord.app_commands -~~~~~~~~~~~~~~~~~~~~~ - -Application commands support for the Discord API - -:copyright: (c) 2015-present Rapptz -:license: MIT, see LICENSE for more details. - -""" - -from .commands import * -from .errors import * -from .models import * -from .tree import * -from .namespace import * -from .transformers import * -from .translator import * -from . import checks as checks -from .checks import Cooldown as Cooldown diff --git a/.venv/Lib/site-packages/discord/app_commands/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/discord/app_commands/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 62d5b22fabbe2b0bbadb57a434eb00dd2b037d18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 728 zcmZuuO=}cE5bfTt?6w9(@e4uvm=&`z5ig4fVUxo`48e_;WngHhE4yQ6x|{CaNOJHm zc=RWzNB_wjhwIMOzeevnIKa+MDH!Fz{=ftV_B671<{mg13IFwinq z6Mkg%M~D{rh`-#~#?Lbo^v*z?1qbnmz{MUmaqOv>fD6he*!uqow!$!0u@A$ZIlpSZ z#;s=wys>w2`r-oI7o>TeQaZ17Xk$(m^nlPu8F{!uPVQ$FuKRl#DUlPbFOiccS%sWD U&MM^OX?7hs*~o5!y@Nab14gjm=>Px# diff --git a/.venv/Lib/site-packages/discord/app_commands/__pycache__/checks.cpython-311.pyc b/.venv/Lib/site-packages/discord/app_commands/__pycache__/checks.cpython-311.pyc deleted file mode 100644 index 906f0c769516f404f439efc23942846f43691da2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23596 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 diff --git a/.venv/Lib/site-packages/discord/app_commands/__pycache__/commands.cpython-311.pyc b/.venv/Lib/site-packages/discord/app_commands/__pycache__/commands.cpython-311.pyc deleted file mode 100644 index 7064b83f80b5e8f5bc9823e05fedd9bca7e5086b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107775 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 W_j$b^Q3x_5$NX)q$RddlSN{hAAwgyU diff --git a/.venv/Lib/site-packages/discord/app_commands/__pycache__/errors.cpython-311.pyc b/.venv/Lib/site-packages/discord/app_commands/__pycache__/errors.cpython-311.pyc deleted file mode 100644 index fab1d1b1bd5c81f6af4fcff7b64fbc45aa96f658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28547 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 G&Ho?nPR<_y diff --git a/.venv/Lib/site-packages/discord/app_commands/__pycache__/namespace.cpython-311.pyc b/.venv/Lib/site-packages/discord/app_commands/__pycache__/namespace.cpython-311.pyc deleted file mode 100644 index 8103323c82efc9e995f853dc0b7e7b73322150c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16011 zcmd^Gd2Afld7s&v%VU>^B$B#@5_OQGXq}X;=%UCawHCExNGi6LQkJWop}6uM^vqI} zYP@}`;w{PD0UGIC}``+81l$Sd>JpO2)mceK)9$vllqU-(ZS>1}rhUiBB#;D*I@b2&aVr5k*tNz%868!5Wo5h*|u4z^9poQa{gQJpg$~!3ZghNtHk%aAdX>vL{;$v6j z@P*NYuszfy?Af(@|IRU4QlwZy=nsyKC9XQ1eUcmvD@r&X6T*rxD#_CME5Zdi7)wZE zi!dTfk`NyeLZdQi&7{-IfVI0JQ9gd5NV-!Obipf%0VZSb?|)rlEi4y z#2bqzfU1T934kG?NmVaWMuWipyreS>c-D22?#z6-jBs)Hr`S)TQU9# zk1){NHTYV4zen&62z~v%-|}{PI)zQ`19;!mBE04uJkfi4P(Y3TcHiI`p|?wD_ni?= zdVQTOg6H+Ve$T*wv$tRHp6cuIdXVS!b@ZI>^!mDm<7nsWg(iEU!sv9cSD*p)uDqTB z>g<%KzvBdYZa?nr@eZD8advqJedtr@LZ|IQUwi+cx8rnAd%w_ky1%b?z=PpC(XG$x z>*~iSo>Ly*U@JyNp5XZwUW9=Y?L9p-l(YRbu{X$1?-02bsq` zz^wgvk4GB{M0NDEdr!3po$aUEy9v8~p%=aMJE@w6o$%TT4`tDK?f7&IdV76DMn|u2 zuph52pt653-}E)_fTu-h@AnP>RcBX!FS;joq6P8HN9}wbtruc7V^Cfqs6q@o4Wje7 zbb8u*&=#H*#j7!-xgOQp%7mJgok^8`9hcsd}nZq?i#yP{e;G3Qi= zHzCQv^ASl;CE~Jb>A|#7oxWgH5(me}P-bOc56N1gbK5B?dR~$#)q9>a94SkGJR&uj zRQoAOQGypF)!Cj%1Vf`_9#CA>7lZ-^BYG(fh}@d?v9XSLG>YliJ4X6Bcx6m_$kQk$ zwX#syF$!{|i0Uq64UWoEP(&Z4UYIsH$jk>?mGw(XJaS1AJA;X!x(y95=@}pNfr_eA z6>VJfQ$pk_W5JLVA|B=*-E{Mx_aNscCvkor%aZ9d79+_lnhqgXG$Uo9l!S#rw7qNj z80k;(uRVUNSRp#!wfJqKODx5=T`YsCcdJev*OSr})eJ+Wn!=)L4#yIzB>_gLHd#u* ztc3E51p343zyT-z^F}0YatUIV{v>&kzhyEmD;US@d-yv%pP1wgs3;2nO}xC0zD%k) z6j4~dLW2mxlUT>Wv!@lT2WNw$vEazrPTj;SXFFhHVY~X|IEftZ1H#@tyOBLUcDD7B z6uWe`Cw%^_5>7}v!NoVA1Ik(0-%wl@UkZ+m1wxvjm6u{UMz@Y#Q5{%+0%Yp1Ru{O@ zn#a5P=EX~A7{!#-27r8{O9?uTQ2O>ll*0CW|(8)}xNxK!D923uCBE*lM{u zkZLk%>5Y_js2G{lJrGcxfdIUe@d%~M0)aQjgAu*N6$lhrYZRA;B5<;z65JzE-bUT; zB0w_vgkvZ%vKST&(7?(Vz*N!Sf~9n-d#d}L?nN7Ct(fvodEfCqu(}sbytNr()WIV& zXRCa7NXxZZt!;~(5mcD1>le8dfQAflBZU9_qt6xo^NYwT7)_D)o5hWy118WSS>Zmy z7%nlDHnBl0XC`u!Scz|k2)`KLCHP*2Z>QKOuEBSyxJ9hPcbT|VT#xT^aRW@Y_BO;tPcwu8f83MtQp}>10gEj_UYi?T*&J$aV$W;x(sZa*H5=m%=?aW!SQetNoItV_qr%S@f(hN71qQ(wxqrb>2n#OoABQ=(0M9ca z!kv}VFSg;Yu9Dhgax(csQoC<}1P78lgV(C=oX> zG~C?rnApMw0l#DD*cXpU=oRJKf(C5CFzii$0QFGZi6qN$S?6?XtAJexZAcEnPbS{e z15OCw591}+5C=y`WX&UIvg*{<96`kD-XctlhC`#+7X)J@erQ4%SQnH40}xik1bFU* zE$TmcOS?6Kh>H(N=-^T;{UBjYjVdK7g@ofRm!1Wkiy6BI>BJa|yp)4EF|1;k++ zKpQSeMt&SFzUHnKC`A=fQbO3kNT_jHIDA;RQYa-}bc{-&Hx!~NF%j1|LLLmX37a*E zY>a^IUx;dvb`b5@BIHF@RIfEp^wLoqzS^jy0&L_JdmI8g&l&0HXO0fgDOLqwi;Wlf zu4$AICzY89V;aaoKqZecaUv)jlrD!34xf~+cu0kYR~nwlGA3L$B2dIgs8^mrG`hZR zC8;v^aHWpn_{iHYW0y|o=uZ({R2+nNO^P!-yq&sh(Pn=W<_1l6g=RShgoxr37&lSe z6ZVkj(O{%_Mniw#HI9d9E6yy42#;Psji7+-FH$3VzZy=g^E??j^N3EMq6wM>n&Ye& z5aHU!6=n!lNRE%mwCg7nqR`7R342)R6gK{lOIT*elH1xUbO5jM2=={TWrAFNpbnB4 z^4f4(d?H3&F{Rh1%Z{DT|9q9Y&(rG;MnEzrx!kw5KM-hRlFQ0{KUFtZkpI@*DskE7 z`C7R|l3}pp@bf=krS9|en&ZJing9ofTd{l6cTE}_hzqS0QHfm`*04?r2ia11a2VNo zUXGp@`PO;xJOb0}{BP;OGkJiiAzhGkf(txA_WvIq&|VA6szz{u2bBH$GvRBZ2eEMq zgy`fJcrX%)2Y-J}_?qwlUQvz%f>7YW+xp(Wm7)p5v?}E+MZQD}BRx}Dz9u|CJe>km zOXot70o6lT21XPWYvHWrS@AXDfedqyCtw*ppa5aMT=HZ8*y0 zBAXn_b!iOyEQd2Tye1gq=juwii)C+H0bFi6SA?!T6ZKq7-Q6?S%hd*plZ5BBb;C z0vZFme&+9E6BY_$4~DQp-md2izIG;H-0$nVX5G&x8rW`xb~|}83kQAL7E3KH;-I_+ zksZ~MLq@KpSGyL_P@e3h6N@3ZtIrecKNqr~aqh7pVWxokAfmcA5$T=Hl^DL0d~!)> zebSONcXBEIT=}FmX%+dpeEmrq-c3dC_M~+-AF<3=Lqf#Cfidzt=}6i{>m^REMjy7K zK1z}$h!*D~)=4{sEw3L#ZMzm7mQOw1;vHMEM0DuowF!G+Y_Y@`M_s1xSkj>w+9dzy zHq*;u`CVY?1WlKgVCY1CsgB*+grk7ntbP-qkVC1Y(}?qAX{<6)QmB(ef49n(@Ut{& zS)TXFQe$sp>k{RKz7noNdg-{g%8e~2mz7P5zwQz_L?tVHEEca?X!@)65uB(Xkkr*= zeh9te9+EOXBzjdV3kE)<`w=Rqnq$FOll39#=R*?QL*mavBKKh_fb1jC2!PWZI@v+A zxjJw`N(6FqB!G}ZR8h^yqc}7L2M}DgGUrr_9kbYS1@*(i)nzPjE+3|hBLt2Ds3kdr zCgPlhg)vnJz5}$^myc7m4g%e*t`dt+j6{NONU9lu7NrcCG}&`cJ{*s020-R&l`kJv z2?Vsf_s~Rn9kXSMTP)*N)!nOUnXhS?8@jVSQ`3>H>6k8ASdDCT1K>uz5B;NooEoF}t-Pj>a5>Fx#BnweM9u10(oYB$VGeCSG9 z7q;$5S#Ffih#B|hw0rYHB@UQA*pS+gukfI{Hg$N`GuQv4ld~u9H@|e-`bo>J790

UYl9@0<%~>R-;*zntnwb$n6At=%$La>tRb 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 diff --git a/.venv/Lib/site-packages/discord/app_commands/__pycache__/transformers.cpython-311.pyc b/.venv/Lib/site-packages/discord/app_commands/__pycache__/transformers.cpython-311.pyc deleted file mode 100644 index 9c09029453b447b6893352e6fd8b802f4ad5139f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45958 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 CiguYKi>lq;n}3Y#A*a{j=3Z(~1ElOg z9&sTt*HQP`52^P0-?GP?e#c!{^n1yD_CuRUeJ2qHr@=emVUGhY-<@-_sm^2?{syfVCOYL-?i%hSs8a(OKpozl#r zZdtlfl66a7(oAiBRbDieQdv`n%LU~0oH2|x!Vp&FBS1_Ke8u>~QvnyqqZ$U3;mONMn?nh^w9!FzC zQB0z0N0Y~Gb6qev@>)>i@&EmX`BrUX%FxduqaX1t~4%Tz;{FBpY_u|iAB8zohz z^;#oQ#%pEXxTCSPaQ2prGEn6x5Ca$zoU2ZgwWI*|dCegh=G9A4s&bcu)m7%LG8nIe z_REIJ=G(r^IOZQu$}^J}GuIN+NjWtmPfbt0lNw8o$ww12ct1KMUrS}iC$DB?Kujmn znd|c8MLChaE?-Wi$A;wOyHnH2nVIP1w4Ay!HIYi9E|nggxH^_fUy|QMzw{&|IRz2M zpqWXTCUk~MC1+@`E6M56ag3aJGc}RQTpx;FOl8s-Q@)5n6Y^AII+Gf`I+2)`r>;&< zP0l1S{TPN#r_vXvF-!7FGM$NIR@BMKckm+5j3*{0XsT%9DzKl%Jk#>%t?Z;u2vuEl*;U=_rA5?Br|XNvfjx68Mg0 zQj=*~#^_`^GmY0Fta3V2?|LmYlN^#0)2SJt8of9@iQ$Qy=s`3~Q@?bQk3yto1gdic zAVjdMSacniv1DQbV}U*C2H<$~OR`!q(QZ>p5EQ1DRxDz7WUfyobED(QQSj`N9ZZx~ z?UqYgNrT?mEfacKGnIlJnOr6z!Bb0Sby<5yG40UR5^C%S#M3MoiuxsOC>Vct1}4QS zunCf;X_#Nq{u2w>QnFMj+TjT!uN1VHWVehO#Uj+rZW}dVgYK5EXr+oBx?~!aWxI7s zF_of**)e2zbjg6w$3pgiZ*Zpu_Nbh*9P3osks!m2V^?E@q+%F<)}Nu+sQ;_=^lnVl2KHB_y|u3H zjkjw1`m55O+Md3RbnU>ws?=ZW?%B9pYwy@d(m#`iU<2BL+yo>mG;dTOfq~pu1LqxI zN__GUfN$o!7E%wYt@osl(fTX=@lQ64`a^2_j`fGt&K>JzwR^|yN7Yn(NhL z>i&Bqi3cEg$IX4fNBJ3~HzDT>*psovDA=Y<{ig-U_#XQZMUu=io_Y;-`6$nH{H27<@U>_h zF912nbB|^_)^XNFRm#eU4C~l10O$x=)r^WI69A_)7Tiofn(|S=j=0F$5_K@ofmcsY zJ7)IAv+<6*x=xm0)_jG!on#jH#wfQ5H-Oua9FNDbp_Eo_HIfS=IL0f_&w7{@rb6V6BD>2C=lF5QoSkC3v_BUf5 zcN-@F`lJ=bhOiY8THEgjnHoNQ?T=Ws&o<3I?b~_9-?S?8`@n&%%RG;#hNYNqpys)& zn5ND@pn`13QCsMkW$TlyPQ}8l26D9*bsgfX>*k$ z_5ujAZF$xtSK`}6u|RaZOa)IixqZCep4zdU%p;$l7}?yPQJdjMB=@zqm`A9B$ZZ}& zVYlRR2)p4lw&rqH!6;j~oY_XLWZbynWBeoA&71^QFkAS)sM@Ii+X}RWB3l9#147qJ z8>!!gI<^AAQ2UnP7GDL0@UDCB^4ch#zqvg`{oSJ8pDK2-{%#Wk+M!*f{%%okr;0G^ z?=~@@#`Zwy;Fj==g3C1dOtFB;M4+4K!=4z&8C!{WdHmHsB<}c#PhLj3%|+a;N^r*{ zb+;PAZ%FM@JD7XcrS8ISi`oe{t=pumkaAMm=B6#dN1|j2`4vtSg%ko@HOB$4hUB_Y z#WQ(S+;Ca0kLK@4nHd#3zFbh&bhu@3yx?tXaQu+op_~I7TCrA3d08td^99OMGz?(L zD@cVfr$<4$r?SlQ1#s&Wq+wJfB1}`^=^(G0Y^_>ltw`YcC1i!<5yUeibBkJ;9M3sI znhiMTgbMP-LWMF_=agcP1_)LaKYCe#crbfij9p$rjgH#Xxh!81M=sp+RwZEw36Cc?EeI zXKgN)d)Ku{?o=3{GnIWCV< z((0QTM#Q0cTdUAmyuJUM6IH#nmRHfzZ^f!T0HBY z7s>iKAA0@?*&;f?1kfREUowpnMJ*71L|?=q%Aqi8 zK*=0eUEGCG8&_&a4QZ?l)}(3+N~KVi_2P0t^Af(Q0TYHa(-H=1=)vPhy>!R84O4@d zvGgJwMlYhYU+$dnk}M$6O>4V|5~Sy8&vU#pgK_eH~t|I=@wc$?n}(}zZfZ% z?_rK_q9#<^RE-tT(NEAy>HjlHnP3q+b+SBVItEY*Fh%MrbjE5lu~02P%Uq2fE$A>n z@qEFsAo0&+mN~PHRbft|=z9W1P{7Y#@I3|=G zcYt~yN7_#mek_!IGoo(a`%*dRjm}5?L~I;)UHWlA72cPAB&~=m!rkC?VMUAu(y^d< z4P8x&+RW=HVnMsr)lJPLxwc!Ack>#{0med1DYkX7Ma?1)lUVJjN_Q^5q~)QA_5Dv< zJLuy@bMtR7fOQXrqekIS>vgf#fADV){q>=T;ZMV#w><8@u-Sj1+SBxHzwn1IIuFA+ zYwh-mT6@_T%oiH@n}iUVFFN{_Y>}*$NUg9#{Zy z@4yk^?|Ks*!C&_zBEf%&gz(tF>t`BA<=0@xc8zvdPaYV|+oF!VrMuNT`;4`$<@E&} z=8Mao&%UMTR17W$Pa$Dbgb5@cq|Pe1CUbL?f|;9>EgW$bRBGnAnR=Fu81x+5%Au|L zK#lWbBi39&AXPLK9Uc++7c9HQ9UJB#IrHl!B<|oZEtojF8bRNYIhP2q`YeM#=k51c zAz;b8m%dYG4hKt~IiuHApOL}CgYCdrC=M5qDums~`5ukqctgGwOu6Z4p6Vk~c-g+; z;kvQnB=$0XJ|C+NS#$Idx90^*&$!RoHc1Une;a)$1RyaQNA`=qJ8SHU?Ymc=rv zo*V2@&9O_~3_c1w>7eFGT%n=8*BPLmr>x7Efm1=f#FDGTKyOMy^&;%`JUQKPj&TwK z@DW^gB2a;$E)n6z@PFZ*6?8!sGbHkuzy5KyEb$4gU|XC^hhV*Q5RwgPVRerhZ91B0L2Vn_BlyL^2oA{l)ZO@v zs(b0+Bip9-z)#)B_HyO-*p{y-=52C19G!&&!d;Oj)nZ!CVh;$HKg6Yo7*%9>`GEqR zMmS0diLKz&yY8|#gn{Jf`<)kO2B;cE$J}s|wv=Qzym}Ejhmqm`!c}KVgv$!ch$!@V zy`YyHLt?0$vw3WnZ^PsoR*zViTH#^_sih0-Lvt?9w7O^@#?won3h*EUfiLxN7fMwW ztKy~s{5iC+#kk{n>VUAze^J9R#0Wsh;E=605q%iAW5Cagy*L6OZs-OGaBJ``ZlRFg zxu0ov;J`_P7}UaXA2JsfSq*n1W!t3B_%{xESAP9z`b$7W!uxGzB z5D%9ROp?6;^;<)N1cg} zVsr%Ll-9u2Bqj)B`~cW9?lhQF$$&_LfKeTFoE*CXjJeXfOFK!VJ6X@8IB<=WAw0N*`&He|w=wFHKcd4tD0P~p##kn<0UKCW zo^_+-5KGpWPMS=SZ)>Y7NE0HFw8$=T5xq%uxy!~8Vke)LCu=IMX?eny!2K#*Z$dH) z^f%qJXB8v_+F$_`wOm#}ZpRe3i-B=)wZWx46DrCtxjqMVR#jZ=VredRmQ5_F+rlBF zIAI4?$z&^x(KzuW17v!R2aUncp_}#y@{dTETs-Pjo52M%W=owEn`6xG=*!ttT!le`-eI~O<|MIO+=?K8?eJ}=*rLVGc05-kPf?~DY0@vU`{I+MY-4_* z^A=3qoAX@dIu>RgV<5<+T#Bhuv4CQS6Ve{9bNzhx03s~+EauQlIE2|%J28Zxw)^_=u7yqA2{dQ)L;; zr{e35cOSF^@zb_=+ZOLM2;$S$^NYBic6Zr)W9@`b7;xC7ErU_<^Q_W(BVLCaBtD%6 zCOm6V9T>;=(b&Vp!}mT^K0N>7`3Fa+C7Up_iDd*dd($7cJ6b zc6kPKAHncUY!N#!HDVe>Omwp?xGljkTx--KUilru@qK{fM6+wp2mL?q=ZJhd_Sxls zKbQRNx#Z(>mp0E`Lha*$@lBLn4(2P^;R|V zma}ZVRBn)BQUbP6lHzR(^{Hy3+PTZXg-3Gob~I&lbA}p$b)zis%F~25ok9}cJwF@! zMf!2)vCYn7)yOf1DV=SrXf`z}NYJ)z6mI-V?Ff^JWaba4U{UQl)jARG20gd$7`IMQ z2Rb^oBRG#k3{YO>v$E>|tJM1ERQ!aBAu5KcV5iG0Sf=8?@MrxaijDfet-u)yXsK8b zg|5Mk)Rq(o4buUwzlb=8x`!a$Azt_nbq{TY-CD1GD=dXBAn zo^HfiJYyTeeb=I8c2X;ChIYhtKFuzwBMD$vf!KW+JB&kAtzemZ2o&2AGATfVE=HR5 z8yWmq|2RP$9Od`I((q5+fDd7zlie|2BADY2%$RrDw*%-2nu7j=guV9?T`t`LWRO5& z1hT)L!P^0h^vK@Fuh#6){9QK3B)l(khgM4Jv-||N35^o>G;*HbnSI0jIpD}7S&v{P zkSrF(tw5hBZ3$GI7Q|y!;i&&x6K+)h)Nf5VUTyr=1i8A?7nc+y80vs{xF%hwe$%%m z9jZ2dx5DAJz(&hfcSPKU)J{|Jp!X}P{n~5l6T%%E*Y0Pk{b#G8bB{ykHbdt&0<};( zRsO~7z1fYxR`^vBHzS&h5BEOkelY!@?{5x&MXg_ZAQu9{k+U_at=fKKv;FL*bna8F zdOpATs#=xQuY-XjfvRv2YaJYMVMaEk?^j>HT9vM%c@WLV(Y$}yZ9Y>ydu8)%uG*g4 zl;*1QdR5W^w;ynO0eAR}3-?O(wYN84TdcM(Zc0nlTa~I*0o-B0?FZa}_`}8Ot5ch= z-rS7OR&#}Fys){ySQYlw28JG9tG+V1`O4MJ;diR<-lz`W*c`Zt(SJ7pP8_L8gEeV? zO~Ug5JZ!avLI=MNw($9T)1ruk+0Nxxtp00%>wMs{D8iQPTzASw;MgH{fy@;)4npKg_*GDG zQt1lLdZwvNvY~5IU38u9YHBL!^6aTIp}dG|$Q8*S z%8wKb6-3-a?uci|6Db@jj1&zOMT&=tBiYNV2@D1B zoGa!{lt(ItDkAHK*0JBNiONXTP!)U5pQw)14An$xhiW71ht{)q1rxzY-B4YmeyBdO zVQ537VW=UpacE zTV(6dR`$DiVq0YU(DulVp&gN(LpvkwL+$LncVbs$_t0*e5YCf!A)k_oJ(0abdn5aX z_Ob82iH=C;P$zr#PwbC8GxQ9ebH!5B`@qnF$ibn5k!OdVjdTrlArDu$GhBBmC!8P7 zrGI1gb=oKhV>!n2&>^vGs5?gp+pqL!5yHLS!}$CF|M@j^IJ`Z)eJn?;6Kmga4jsu6 zjtJuVHv};l_JnsEd4120RQRu^Ix5-+gy#BCheHqw1}}$$C;A41$Hzy*ld*8H2|t<( z3c90HH>B}Pm*c^v(dOWeZQFOXPD$ZdcrqS59h#bo-z+FN6_z67vDkQYGB_R!UJgs) zi#LLoq|jtMEVcy4q;NPG9Se?L4oR27Ex~v+7@E8hoC-@ZB#2&&hsGzzCocs<1*0g6 zV#Y5cn^<%#ek~-05m^j|VzKDxcnJ9g#pvjC1f_@KRNmP5L^u{~ilgrJ18R!;=9U5! zB8Ec~!SPAt77l8kg4f35m!s41AX*TY#z!fS7DO7Im=>uH+UJS!$T%;dfReNJ$EfDh zF|>f{*%FLI#qlxv8)nU#n!Y$O9=qHU6vrv+i_>w$jL}Qhoh=1u$JVG6jD;sAD2H*> zo3+)bT?=a~NMxz{d7Bh-=ty(Q?Pv1w@%MWR!vxlwc(EAdKrG)`}*=3~)` ziRd+I+GuoA9H;iiIttiWhb~61hFM$q@J>eKs4A}l4FIbIA64~J>~aWozZh0K4CRhb z7SJoLIcVMV#aJ8zKaReiib|}!^k%l9{G+|Wfs=;^&vu>e4fYKLPn|ybLSIjBPq4mg z0Ke;7f@k{%kDfd;7(|TIUHyYE22UOicJ;p)Jl5CW(-Q1Gcj|QSz(B#t)4{$Ir;hja z;$2^V_wh45ef>v*hmfxSBxZ6SrZ6%cJQ<_{)vWq@2Pm@>y{Eg6BIm9{eaHI-Uu-Ej z+&9>dJcEakX;<)6*XhB&?lZ@`P6tn&IeqHnKrf2#LAL#U{fAGZl-?7){ex{N74L$* zFW^UT;Aq$J<5W~Z*BR9QG|D+0>^^zw#nXL9jt&Noo;=>uixp{!joYs6pu=&JoY#~nsOY+VoK#5ACKe9M9Ot?ie?l&4TN8r z4o{ATQ}%&yJmnmmoha%zFR0t^x zPKRUBiL2pb;Twop&^0yH9gRe=Oq=bLj6J5@-BBdJ9zPMDoK889pvqItd8uL}a<3$z z#uaM(t_dj|5^tOiUqZzJ2*p&f`lUY_Ka8q~denjOOOv7av=lxu9*czHqnA^DHR^GK zKBvQ>Q7rA0PklLXV{-IxXnX<*Ql&@|!=gql0A5&+_w}H01%m*(u?g0P1ryQH&_s9` zz~~n_yzRx^6XSrKz1K&>tRGW_M+XN_=|7P{k_DQiO|d8RN?SAeokKmXq?7yxQ1hw0RzI5Y#dnGgD9lVRBg3! zrebaA8!( z!zjUt|M+eD^#8=ed%}z@j=$P9ZIdcya?;)u$4%))o0T4T-IkVvAa$nYAV?)~DpkE^ z1TjYxtn|Tv5YN-T3&Ko}wG7ezGR-SNLb?G#bi9EWJ;L|!<_CJB0kq^6`#xj4LOsc@ z%QjFQ&igX;oTX0Ieg<WPs8J4OrnxUb@B&4 zs5AW3fz^0;Pq-}12p95a(G6Gdn_q9|+$k6kzAt>=mdY6yF%fgxwxw*BVw6`f_;9?t zZZ-~MhDhV#t6`&c zZTs2UjU8yy*i-&V{;Vca`j}O8U#^+aIvzE{vg_iQ_{_B^EKiNJlLId9u!orXZ98HdB0|%2M+TXW{FN>}>a>2*siv{>K zA(r5mQ~ebY{rHtDPKtpy97B1a*Ii<{SnpUS1~{Axl*XLgykZMEhyEE+O;B8Ox%iJMW#Az%gCkJQittp zeCKu8k@+=i9d@Ero-d_~i@P$?dG$I?i+djN^{TjUjjz1du8EzQ-_iPf)*IKwXHXNP ztQ+FNjMycn_TLn{*7#2C_^Q~Q`87-Xzbf{i)Dm@u%!s}CW#^0bgCywK99pYWV-+D10 z@b|W~8?!4^ij{FXta5a*V2Jnx;>f}h_=iwDcsV*D;LqHB@iy4xIobZ zdIV2}BoJ317-H;at8ua4ql^OR2zHE4fS>Ca`I-tN+c;S=!Xi;VgJ4{EWE4W|#AulK z8Nji}RRqjtG}6X08dLH8a6CGEX(DjZK9|$H&G;jYh_T zplQKIfpQC8yBr3GJ9#zwGV!%wufSYNH-c0W;Rm8F@HrmU8-i?E$wqdZ9c6eRco^JZ z_$P$4gVZCuJ5)AQ?FPL_ zEd?JcKISAkK!d5EsVIm>#zP{#6dH##A`*otpd);J)HH9*xV5dDPsz%t9M|wL#7^HhQj-+0Dq8{_oou zS(bt@jDcBDyD2+>3Mba~QIG7Wpd104bTolzLeUU^od{rvQH5i8g^4E^#IG^wZso=G z$t4JwDmk}W5L2Igi>9y0Q@yh1HDmi8%Kw2riNB7i_*MH0!h7~_IA-mW+b#L(lTgc( z{;rX4&Xrs(7Ro@~45_8HjCipY4|&;9Sx8pEJL;6%cEQ$W-tUSz0_Fn|S} zS+XU0BZH>I!wnFuc95RlB8Jf4Qf1lL5OO87pjQz%Dl8h^kxd$6$%XpW zGqtWRJk+l)>OorZ#{4`O`BlFNIa}794ClQQ1cuy0oWCevLVo{QuUJQ?hAVan^ z2a#0zLu;X>V3L1R>-m^z#i^7E28X_1CCM#>Ua^q5)0yZYqt}f&nK^At%xYVgE)UC` zq~^|4JHlvs|MzoJ4w1w-P6pPS^Ev!4GNl4olj^W?r2zyfA4!t<+|mGgs)W5Gv5WSK z@vaQ;NoSC%*&z*44i_k3tSm9LF@j#y`J9(6WOGu>;pVz-4pkYfw|ttXw7-MkFYpii zZHM6T5^&!ryIb%38f8!81GjhXnPheF{pVJy_bpfNyVvmJElS6r{K810I;2#GHP+ zafedeA-g&let765iReql*j&)1AcO>{@n0t-;J~jpRWxw>$|?Fei*bMfrv+oA?PJzxWX#pVpOWR&K&_ot7lh zZK<<5W?D}SCaTL2Yt{@Kt#A?R8N{jz4O@aylp;0bZnmxx|~B#1-HhF{Y9(9%p(e`e{Mr;1%r z!!HTF=q)<^IKa%-_!C3tO!S^MrPUc`g3vn9ptVkmjEPQ(uzc6{o^T0N*@cQ(Tbw|O zdd=8w=NL5P2ZD7$elzFJI*3+n(g>n|KgR^5?NSe3Ng)adT&q<0Ee4(+7VL-4RF#Bk z99$-Bj+q3adi?v8SrdZKNF>_N?|Xyq7A!iJdOkQNd-o>1dlm0q{TqXy&3T+57^V8u zQNR$8KNA7PRIFsiKru~x$`B9XoRmvjzpP;+8r~_gAeY$9$~6&B>>nZA}E_+W}Y+j8n%}SjS5o0%v+e-A==V;i`Q*)HXtE8kdTQ3S=5&*$I@MM-#)*|wuNh}r z-g#^GfpaGBgIp_T_PXuP4omx4KWceve`oC0GHlQrA(i%7F!wY;Bry-1n=AAVs@~1b zCP=!JhAlLE2ZJnTNX&%$7^Z}D@^TamN-P+Gj1wZZ&{Y6?(no^_kYF-$H9QfWBJ+~q z)U-4e1=9kfj2H>FP-yg8EO;Y2t;2EfPq2KrLGPrD3Xu+)Y848`VQWGx3@6~jq1gDu z4O7LyZ4f^ISu3-9QLD)0Xqzb$X6q9-jCb<1;`3j6o$FH|78N zkbWlCv9OYQ+lc@f)VUI^Cy1~ysueZWB0G*Yco7vonpNK!Wko{Q$0O5`;N*1VB086B ziZtSh*dl1&Nn_4NlJ%!L1vFZTR~ciETP5=_1GaD5#!^6S9=mL0NLZ zBIYPK9v3T(#5GQ4J){Fkn%D%y7>Xr{A)#23u3f03<#-;zbJjMSGi%2}&Uwu}lXKf? zEC#M({b2y;*YtMAK4zbB{GFUT^@Mc$r9;TIIhSGDl!Ju8QZL>BH$}wZIO*~2cw#(K zjB3KFu47;k(*^wqU8DsA)6CX*vUt>lf%W+R4q3(e5C8+O3XUVT0(1E1-pz@UhWUmC z+rr+((PXiA?#4pbV%hIkeCx!*iB+diq3FrY3R0@97vmNHsOw&M3mBXM3cG@K*!mGKPlU=bQ6Cq!awL=FTvL2`jm9w zW~(~!7}c?6o3-dLf#gI7N7eGWL%4tMYm2We)h(S{XyU)kA#2eu2oHVVE=}W)bd_r5 zpi${>_DE;xRX2M@g{NFFM&WAP-03Os&|&Eu#W+U6dJ0~oxK5~=BQXgxN{}`oXm)W{ zm{BBo5s-g?5*YsYbtViYV+Ljf!@45nWWQ2*Fx>#35Q&k*EI7g@g~~M-Sv$f?y;#5f zZ%7;)Mz_!;XtL+8O9m>Hz~-f0AM8~E?JI$O%Yl7~K&KMuByRY#`^Dv}f-QfY5hMc@ z^kweIsvYk?`|LC5iSxa`UG!Gbd|WASNw``SSF7x5z3(oXyLNm3o&5_Nmfbb7yXL-c zCns(fM$) zxOD!Nw{FbcxL?_{RFSCMp;Yde&$}OJzPsy3dq3L#$sRc{kO&MYfdSb&fa&jDx9Sq| z3nBeoan&!o>KFGWTrG;LMRv6$o3}Ah@xqz+&m~-qGP`3QboAF7nuI0K9{WGA?Xe%m z45#sC3Vd$zM3{nU_8)F%hEOl5bNeM2VzmU@+S*_dHhJShOR(E8i)jfmo2Cma8>y2r z{96cg(K4WuVVrUmzup9q_om}L!OR@o1`!6dj<1H8cGhV&P`Pb03!SaZgA@YFr*hb3 zXf0-Q@m?q4X7gt9W^!TTS~3TzIe31%=zgPc)-~h2<;xLfT%re31f5v4mS7VmTR}GF z&p3O83q`X96n~~*CO3HXT>~_QU$gERx23n7ul*OSy`k9x zw5mwUZP6q!*WRI31>&PCRa`m}Zs^vk%iw!=Mxwh$?KX9JDZ zOdk59R7<*c3q?!n#{G zlO~+0O5IEid_wY8&A%haA)`j-st|GnwO6eY7&y$LGBL?iG%68&1~Ye9fiXH?G-)Il zE%;OvH0TWTV4x&jcy?(Vwr5m_krCp`M@A?j3>4yeUlUG;#vuxe*I*V~1XWAJF@KQr zC$SD}0Dy#9>ki#W<8dk_63h@u&YI2?>e;H!rlV^1huHzkzp!YjE?MBS29J!eoY1N% z&8$RixmE-T1$iHUcfvHY}EtCP-PZrK$I^5;3-9%*=F6lhL5wc4E79mfMgo>c)o|`Da^2svsQ=COujxcr`RJj-oP6 zj*J3mEKW)-=pk*A5NuL^#V}{Cp}N6~ki7F5Vx&}i;%V@iTm%6Y5=)Sz2fsO%;A2O8*kGhJOi`-!S@DE#{fcF{-i%8tm=>v)pBLIEL5 z=@kT{W)Tk2LyU|4YdpMb2PJ5SkwMOF;WqeD5<}fCFgRD>Rp*QoltVr!2Rjm|7sb!O ztNEZDoS+h=gxSD2`bTxr5ASsTlp?&FqjRVMgRMt{9V#2|nX%t?s?R=AP&wCfk?f&! zBqB-rIrGYSd5Nr0I4f_9bMBFbNax{iaUNcJ6)$fdS7$b3WC40Lou|RM=|UM%B1D05!}DGX|Znc`6b&&U7u9^>4}d{$S<6gUm9M1VOV}) zc%ch{akKbbZhQ;bNUtG)Z8CAMQZ)ihxakPzXc+_R=FJPycbbrFE~e}-0#7-ac0QF0 zJ3iDo<&0yG$pklGCQgNG6^Lve2?lWogSXUvNmZ=X;+y-vaA#q2pAh@6P#QQ@aJ(L& zqI%)nVq6Zi%-fR{RSR)t{SLWe$GkJ?uK<%<(rsH*|K6|Maku>*Si?g~q&~2rEXEiV>FY!tQS#SnOK%ZuUt%=992$^%9UcGQdBBMxl~M6ZI^xxdvdmUDew3RM9 zA=v`bYcvenLJU510bnpHL5fjV(-ws00zOovFz0HWZ_*PRw72Og3lwQCWA@{zf^qCx z;Rc=3IxTL>34lKx<~gtl@>}$&f`Up4NW_%NA0B1|+VC*8l?)SZ#gm%|$zjk35ZE$N zO3DsJ4x3$2;6&bSD zryNwW6r~&%DEJ)&G2*O%d-yD*nW$-l+@|$-vwV%Y=cbu8lcUb8U%g-x%9@t)?v~xl zO_Ux~N)OKE-*=bIU;6e}6YedFd&{cO0H~StSH81f@o${#VNY{Cuq&&ngO$Q+eo0}& zs_=wCBjgcsaWLs^lD$n!rAu*T>!F0VTk&?w?0#_Kk3rl$0sn4J+Qw%ihgPdlKHAig%~%-I?_G<__O4saiPl2bVsamN)K7 zlJ=GOLGpG{@=NQ zKkic59fZWFrg0Tp0*<3<6wbSnRqK_itt(YKm#cQ(J$mnAqN+=&>cabq>P44a(ewoC z^FeK+X?6Mo^Vh%m%sbC4?oRldm%5kzTV?-NzW8Et<*`KNF{SdDTzYKPE|hLVWvN0r zg*-5-)3IFDac}QOrxR62m8zq7U$=4IwNU!aqWPj#rxqQl%hoOQDAn8L((QA-kSw8# z3Og6hu|M|%ZA@bO%F6crfOmYFUo$C!rWIuQ~MkZmPqeuZJ+c3UOlQ&Z=zAshls@5!UVw&JD;$EreV<}fM0TL-?r4& zG8Kr30)=S%R74z5ly<^1+GQ9WObgOk7^_x6Sx6IzU5h5lQhNt!mJJrsh+`P04sf-! zPR-8b7_u_LMEqi^)F;jn%4uCj$CT4Bx_S`?umggwnzpt?mnT}4Tf*;9}z z@r;P?|AJDb&npGe#2a9HtZX?k!9-nXMz~B=HOkeDB>NsFQoWk`#Il>BgSH%+_G(zOZ8L!CNQ*^CFy02C ziB%VCmVT^ZIc4aP)8L;r&MM7ilJl7$py{nD{d=TIl|DS2;fKtEce+XbN2DJ&p}tJ| zdaj)&WTo0t>k>N>{IE9Ri*7besp;y+&I#g$gCaQy^``Pv z#4PP$@qsdk?NUoF#jb>o+Ltci!#&(NSgnGxJA5 z@>Dl`XaBeMgWxSqRP9!(cFU!^Kl@dlP!S|*(-eTRTWDWshqkaJNZLXdG|BHyDuLz? z4=7u@GOK4GXjL@%i}OjX!FdI|}M};pn3H`&VS&_PK6sELHrCEB?*P{>@7} z?>Z9xU5bB~?Af)NClqztkUUm`mVM~!Dib~~E9lx_|G3_Uu-V4An}-$pEVE8)!x)zk zl#bSx(N%BekkagS&TB=tEjzg_=xq?Yr7Itg-oA&-iC*9rlv{h5&6R=NOlmU|aP&yFrKXE@%-fU* zWu^6+jtDKNR7Zylm9|1nm;(V4x5|2|wP8rq5h9bf?ul?nB4O!7HjyQ_cVzpFI4iuP^1x{ z&92`v2n(y6k(eYVdZkUfx&cvHrU4P;i;RH%VKGQXDCJc{p#Zq6E+n;x7fHAQ!HOpG z;3(s(6pQeJE@lj>V#XP~OtTT9&d~TTvz4xHBlH)9B@Q7W3Cje>h9V>Q^V02!(w6zb zg?)?RrO~7xjQO&^N%l9vI>Hy2zp=QHWDy%4uy=UPxSUbsr(b%f9LKA7b5yIU;M$!M zb3*`|Ysje8uBxrBJkSwj3 z?;#3;*&7uI)pZNc%(u_CFNHt2Jm*Tfi|6*Q=2#{xo3;;j?NfFgUD?&YysJO4>y)zV z6pV;A6v2jQLlI1fHWZOGWxdR9NWrqwCE4=*{F&R$WXfG%SGn+Uc|li${o@TbgcjzS z77QSQ?NeGU>2j7VVuzHQY~fXqWffMMKKv5d8nTC9t3c^vRBX+H{^M_|AQ%O$)gqmc z`wA-aNcqGWaPLn*z+p=(a{2-O^Xu1_PNe6TLBKr?*~HeTE1O8KvnrYRHyDT`VeHAz zuAX2Uh_Vq>zcCR2mVtq$pB^cMY+183VZ#?-{*eW`EzJ}?ldpVw)DU&W|3BG&V(HVi z4HH$D#`JT)A&h+0iP5y{R3Z@ zU-;Nx&{b#uIA}xou!LDQnFK#pex1PanwS#i+g2jTVo{#*U?pfsGj>z+2FP^r<}c5p z!!_mwQJXhET#VrQ5ePeu!q;@$*b1F zO~=d~{5g8~b65AYwYqzrw4xUKXZYd!@;dY-YYk^j9cu0*wcnm-_@6v(S~IQf)JdA( zMeE;myy+xEo?C$#VG+ZhdCky{H^elPEbu2tQ&7DOl?>E0laOOIn$2z?)1ngDwMaZe z#`QhCF=SflWij~{5wPrn)Jd1-nB`lR676549FR>W)9nVf-|!NQ;a`MyQdjC2vM;?B zZ(-|>p`3Zk3CWXFmptiGsYS9<$+)a7PnUziGRP5n108*Y;r7ofWqLxQ=u4wwxHPAQ zS@s!jmeV%x8Pt@4LRHJo4C_{A%AA&-ZMWCN=tgFo%+W=)nkrx|O-H88KTXxaj9MAR z12fP`)}#!bjOrFF-5OP+=_p4~Xs}H*s;jF%*4h?sC^t+HPHT+`j+oRK-CSX1dh>Y{ z8yP}N8Wy_xrSq7+I>4lY3|bedq5l&3GD%B2 zle9nsvf^)E_BY>k%Kqkrf4Ab_EqivuqgA>d=YDw=vqf2{CLbn=>JFv4BT?R|ly}PB zPND>Nrcr{wf-Wbx==#Ir?-nP5+m+zr=q$ZpQLy z9%Eu6wK|P@JqZ=?)G90`(ZEMk^LMP(9OISyH7W~Z6V1!_nj`RQ4Z-7D^j%AfbWn!3 zY@6E#l9cVnFV&KFZC%|@K;u0Bd3ANzezt2CdN^+RYc@oN(Th$eKsSaO7{)77B{X+B z^@Ez~mz8$t)x59ed;{X1JG)7s!YC)5P66el>*7q56L}E8G|#-O`Tyo?4|sYfAj zHyq-AL26IWg@`w@Yzk#=s>zsE6qm04=0bypVbqI6<{r|wDX64?kjG;v8FxA*!}Mm% zZdxbijBO4EsTZRK%c{Wxre1m+Y$u2r`v!2f>PV+8n@EccgSV|z?OCqclc?IKRPDnq z?vgz$nD0(js>I0s^18(he=waWZ&k`$L9CSRNp5Id+0eecp*^u-x3XckT#@DeY&B2I zYqh{t(wRmXt-6F@(|2C|)~kv2+m!X&P-a;t3l{9j+PZ~&`ggx-^;dzUxuO>F8=Hg(9=S#By=&C4LNs))$qL9(=R{_y-^BC)E7#PY5|Vl}lW zO`R)EUCT{fiKcF)shfsgTSHhgp4eBJ!>aOiL(=`USyz5UGmGuRHY@w-EdL&?gz z`4jZ-GqPjmDL4_f(bsJkeqt}^F0uc_YeT5xTq3SW7QhIsMvNU<$N;N;#k{o~7?$F( z>q)!@StSSLA0j(u!?q&wQ}nr{66w6TwJh>uqvBf~SFb6l(AxxKRr?oemq`Xf(ueG= zG+E<3^_FJHN^o|TxxH^WSn1sQ=GQ9SDt~EC+k!AN z2<^X$ti4uqbGVZ1L1GgiA~2O^j?H#iZ8LM2`~Vaa&u3yYFR2bj{#SxYsGbUw>MGwfd$r@Y`yuORcT`zB5~^ zx$OsaDnVZJ4zthQb~<+^Msfjt7g<=Y3MU%cfA7V`&{D}#*Im1r#a`$pK3l)5C~{^O z(Ar`Ghc-Ou-s(yo-2o6X_{>5E>Ccf^HD1sg$wUa-pLBqAIl|AWmD{M5kRz0b_?{F=&z59{!xXtKmOOA)#$cmsji90ShBL$LbP@u}V< zRWR^ph<~%@kxlyNRDB$i$Ba&J21m)lmNNcYBofBP;DEmfKGx+D|I&Cuwq*Ur-QwE-0Q0vgZOM4Rgm<9r=aT zd{53@=Z{>#y7R7I6$sDU&e-HL7go-Q%V)&InK9+eSmM+r<E{Kju_bSV8CwE8ei|4a4?y-u>CHiiOf@!d(}!EyxJ9oVB6CfMsb$C{Z3# z5XGzBgw`(FfIB%>+u-Xi7k*N{yT@z)X|W9Mp>Q;lzFtYg`l?(x!gzJg)gLmpHw6aZG5>N#V7 z2F{h#+UuhG|HNyr*OS*C?a@(kcCRiO{eE`V$=dAvPqw8_j1%^RV03ctoYNsYTtVq_ z#8fUnh)ddnnU%@~@lSB&9DZ=Boyd7j)_8+O;YO7bS%gcBQhyUqy0}r>&PWFYv7J}s z@L-siadW)|%4A0POM){oOnP|KudbcT#ZEk>V#`X!_T`H0iHe;{#ZD~J{0%I)eRQsS z-k&V?-MNWle?Dxz=eRfe<12~HeahxOyhwTj?-jmXxG|J zn_=KhW@8%`vB`}#G(ITttL3$>RP0=?*qNx}8UlsE5>sT;%Bw1EIcNiOUzjNYSCw}MT`zHxDZDPSUUGw(&fuuk1 zP6vdtA4cx=e6-=Gn-gs(l(rLi0V4jr6K|hb+>j`3R7xA=(#Fpol-HmJg~%EKHXxT) zEp*QxpFa*lA1@2FLK&t>xv}|QJIw82X`k`qrEY#U+l7>qos}U~Vbn)SAVmM^qV@E3 zqOnMUtWq7OleI{s^;!oA*(ZQ$I4%rgDYG}I?4+v*<5hz^pUFwznGe59PnHjeW2D9G zGX!cpZL>4fh1coF0dz5+HS91KCcA;X26tk^&wrt_OGnlHK+IiJ>zl+XL?c<*+AmwBwXl_d3rp~og-ok)416? z;rn>Bqk2rUrcEt;B#2Y~;7nhy+r=;)lM4Ba{^kh`qu`ZvA_k@pvM5kWI{ zh}N2&l--SzzWN8Dr)P6ff1|+zqs%n7MWb%XG1c75pd0^ z`u%)RQH>Ls3h6{hH|MMK7+_4f#c*s?8t3QTIwoUd*9?~*DSv1hUS*7fask0(jQ^HG zv4;UJdS_mgj3^hRe~X4l|BixxPr-jc@UV!vU4nB>?qT!c0Xkfk9Ob>F`QW4%w7y8Pg8Wm@d)zh6kQ8U4Slmp%;)z26P#Pvt;v# zIA*za^c>JE;j1TJ?uIQ3ZL&`H#z(uc4NrVVr)P1;XWpZoMXO=mp#{HJagF+7Y94~2 za1n+BXicYb&=RLJbg&>aFsVUB?#xYJ$EG>;Yc#=>i&kFNmN0-08VlaX;c8HIx_G9K zfF94{qH(eawSk~t){MAuGPkVC=n_gbHZB2e;QT**`@0w&#h_qa=xwJGG@p&?oF)R0 zj(Mit%~9r18~c^%)M#|30oQ2l8D!lfeCwei8s&uP)jx3fET*ZbQkg+!0EUx+>8M5i z5ryF-xrvxnUzg2!9@V{P8hT4|%ihCJ=tXmJ+BT!a$#@GT>cliF1(N|MTB{W@HRtJ> z%)vPj8#ArZf8*j2JP94U0r2#6T|8z1_m7&9STAfsU{1h=6wMm#j7Y=G58#gESf6aiKl0RcyC!f4XOLKqj1ZjEzY}n515bk5urtLh znTD=L;WIG?PoDtVQ{nhHp>?)wP#iluGb~+-PDUf+qui-|SfW#24WJmC9=&YM5etDk z&C*vR!Cah&pv_Yg{GwA5utasLfx%1DVqpt!&9gS?D}>%ay2fbG4pJ+{2ONfXXcn=< zj2VL;QF1X$%q9&^474*bY&0U_=rrn&Gsq11L!}U9rE%1Znk8y19!1+x{~P3aavDex zWE&jM(I{g0$;T}L1-)z|$CQH*1Km*hC`hbjvj8C*gm;^*!w6B{?S};ou%$MPH1VV+1X^k<*Df9AmVXB9j6O zN7(%}J^#NH^ij}^AeA>f39*;QE*xyHnP)y;xb;S?IVF^Fn zgFzf=D}3H|Kd@d7o=gNzDS=b6_tb;p%5PtSbd?0G{_=PB%l=JJmCX0d_x!wS!(z|x zALlj+^x{Ez{k-GnftqAZ-G}9J%{JWggY$!T#UDlBdM>%HCRw%)I+$d`o+Jd6#jbMf zkwx%J3gGD9Clr>fc&e8@)eC2rdhg+Iz3POgOYwBco-R1*nBxZyK`BceNG4yZLsA_6 zqi$f&=bVT>n4BKhhszj5$%8a8BB4jrE67brXh3fIvvlM^>a{`YHTA;YsB^YJJ`5>- zjbIx&*mG5I)+E<7;92VYu!SIr#y#j(sv3An^WUmN5t1s92^{Lrb>UWCfpH2>@CtTt z3N~;I!dM>T6W}qG@d*lg>GSdlquhv=A2`Rv0iiF%G%&1YUCLaN8Ps`FB04oxshjYd zWrF;i9+)#RB34I5I#MG96%W14q;vr6K(C?93{QmVXc-d|q8D`rdRDv#Zpf&`3GNHe zIP0cn%rr~VhIgC3-Uv^QidFt%`tXVNK><(6GaR$ zXYil{Fsh*En@nQX4xq#sq#^%^jAES?1S5V9QKdwn^dGRCF>H zZi_)th5E3pnl`-v=b&g+bVAF$Zc|GzJOyWAP-jd$L&tVE|Jn__7@B;7=7H9b%x$CD z@@q70Y|{Xfod^4Z=w2>BLPdgKrE+F*V#lKzdPrb44k!Xbif zhMQxEIAh=}b?V%E!wH*UB^}t0j2wQT=K@wTKf7rUSV`yY+)VQUvetzy>CGJ$q-G^T zAzjGEPeMJ*SP#asVR3%e*SqJ{8ZPw0@lKWBVm0p}CloB&|1%~KvT zO=im6;1-PX8Oum}hXAzA93x|WZf>!%I0mJcg<DJ?T-lna+^SS=l`FS?;+Q*jzp61=79>^>3?XL)-MQ6Z z1rhv`g1O_XMFuN)9GFI@g;yEmP4k!KOONp~gDlcfA#oU>hdiI^sAx0+|qr%ug z;*P9bpbvv(^@m{Y_}`-bVE(u`D+o?dvK8jTnZ*|iYE4Yw!%}@?@}Md~j7rANH`G+1 zm4_PGKCQ$9EaOc^d4}2>bJ%wCuAZ01n;3bHTyU5W$qqoPk z^G}%;kr*T`vZ@MEDLwOH=z}=>6wxp7O+Z?F${eJteiRg(Vi=!b4x7B1C#dKsIn>JDanORH;bVH^# ze9;V{7(YF&VU9>U6ke-@ zk)|#b)AFOgR(NPW_MU9*Zxx9Ut{J%+h6Q9AHDk*zT6=V!Yv%_;g|EO+A>CYRfcz4G zoz~|JcwY!(X%?_Uanxx?vntCpf`}aqf<85wr(7I$dvzT0Tc{Z!c4rKQW_bW!AR406 z!MK4G_+@=csTK``dR}cjGL9l+hyI%QXtsUdQY@G7TZ&3ANSo890w_wB?4Oh`Gn$>n zf3#6d7UidrQtfK>oGJ4$U}-~w7G5En5N?>sPjb?F)6_Lz*e=3UC9;tsx%!B9EE$)E zsOPJh8U_xG9|mFohW?vdaV{%Ao`hOM@)je7p1^cQiS$0!3FNci#viGk0w$mR4m~YW zK!8Rn!*WmM@&;o+J_b&+W*`ueDvD0vq+EUKSgaaSMVN)Ak5;FK)^95Wjs6$~sy0-c z1y4YB*L}G8?$FOF6Pu4Kn~&osvt5|}624}|*DQOo+z;GkI1@G5xOuMU&N0QaL1y;@U-f%i-`<+= zZBTsbEB-+bla1RfDHz<;$wTywVf&ej)eo6sE(e=9rw||cWuT*5d1lK_oSq~s>Ht!U zO@A{T%7B0~X&&Cny`3wS&E=|xs>3dQZLl?KpY*VU(lcVs+OhrFcB>UR>!3ILM(XUX znX!N1v?2gA2%dFJ?y%&X6@;&mvuPtXD+Rsu1HGrxO6kbh2Hi?$YZ+UdMQuBBHQwr0 zYGNMuvLThk*BN~eoAI<$NJZQ0Ij_T-cGmed=QW$=<_7X%o9M!U_Kx(v2g#8idf$-+ z72xDYjtjDwA27QMRp)L3I85@3>#| z77mMqZI}fwq>E8a)1O|drZFNt5OU>5xMek+V09-83`mkpxjY)s>lJ!>mI4_^a{~Nl z0sUzwKvJq0+i0HdH%IrAtk?B1@c-!G;Hh5i)IvQGQFQ|-gi(%$^#(-op>cNjr$+Xv zBpk&(j8D^&)o|qzc?3nxY=b1Dz+#|eF=ouX49a-O*l84R&~c9;#IRJ2Fri9%Kr#p^ z`y@YMkg12cLLJyK{L1t=-a`e*q+OFiYAdE%C=N|BiPRyxw`AMCZJU9&4o9Vn<2bi; z(h`LPXrs)w-Y_a*vPr7a$cSl`#58MaI=m2K^{KEXo@BGfDCop^jBLZZjE&rVJx^9< znmf(D9wSo?!-Cw;w0eXy18!p&9c4#giLismu`ly>0$XXta^a?YFMjFq8HmMUN z3&~^Zt4%Z>%xaF{1-vU<08glOz~3Q$>Nz~TYvX8)xhtxfg<&!J3i`CBWY4ZH|Fz5HxR;Pu|*1)LJ6v zu&FZ8#qXuF^Vi;c_3c*^&3%QG2+{5pC zb?+7|+LlT`sFJRA7i=+rq4L=A3IJ zNY}I6cELe&`ldI1mj4^{S8N2yKT|gduRdpk%Z59hihHB%ZoTh=WkBPDES{?7To20D zy)!&lkaU;9fkOTvTT+|fv?R_BBTNKF6!S~%dG5&Ekq2x>-E(0IB?4VapbJI`4p+X9 zyBx2ndw*!9rhB=j`=g$p9#eY0B43WmHQkAtDWzsgE>FL4z@p;;PjhIw=Fms&KkZby zFUZ59GJHvX<+@yRC{c4msktGSr{D9A&px|fj4i76e4h~{i@kTQFYJ8l)wx#}xBvd` zr8D0>xOnh>pa~nMk0t`Ul)$cg?Knmy=_w(p6dXU~`{-|h;O({PGvr8rKYDA?OgY3yU9@j`l=u_`<0*I=DHf ze-N7_$zCK?q~e`nPS|jsvx2?^u(juE^yP5cJ{^hd=B2+vkhT}67;q8_%J}GIbxTf_ zd2ytD+(q!=kB|xHDwDn%zAtBE^PF38)x)KHe*696bqkyRU{9iWi&9Lx5)1pVCTdm! z?aP7oyDxpTF%dYb1dhtyEcXLn;JwzjTNm9+XA-`hif^avS@ZsEzTwH@VoEYQrnk3u z)d?Th)pi}^Zt2kqcF|10oU?s;84qNs@}2;z6oH@j%XmQ^51|2%vpdSjq1`x$_X9nJ zm~F=&W&^p7&?DhNrwBg45AF2ce4I72XpW^n-%fMeZk?ulx|wB%4T7|3mU1H$m~q{P z?Cw$19!JRuv%=Td$%y>PV9q$rVNW@SiR@+jHKkT8N+6^r{E_}8N;9FPTO1{&^0?ut zWIe@Wm<)F?fA!6w2KAxFKS&esw~?m?r*rIuoykDudsp7RvRIV}v?>AhTn2tRLt6OR zeLpmID&^)oA%^3j*vpzoi1prf^dlqHK#+4RR+7LtmcXpSHrTaVe#zZ+24Ed_g|EEJtw;w60T#4 z>zJ(F4E^)7ciWJAhJc%`tG~b(a;GEO4CWtu*mTHEG8i!p?qVOWZP641S*Vw27ai8g zin9{U=P+hXMF-H#IL6X;!IA9ZRs&L_p8S$(o+K|($jl33ZYS2Yv!5&Em`|zKktsV& z8y19{>G``9yhs5lbF>}rA$oCx0+#AsdZIn=8Qa}Un4cH3Vkm9giSRdnK0@P8TmiPa z7yIWA-@+n1iD@7ZZi#9IC zajNbsa^t>4QHN60F=tO=|5N8eJN#(Qby`j@>$%%-&$e_h;qO%ZowBDBo95>V*aUfa zoF4V_72%|_Q)RA~$Mb(?6P&BNl&S|ibMDGk$L zb6B4A>WmBSK5oqB&*ZO>&MD?v7rmH=BTCP&rL9VDIr=Z(0)Ff>x!HA6=_%o}@d?_z zX1%kt7pLSoMb|8p^^-7TpUJ!XYTU06nJ|+ZCsd+d);42HZ@KmbKr`2B6pt;vxihXY zvL(nj0inTEUX<-QjPdi(XKJC;)Ll)^cVwgDX&JgGEoxFHcu7tC-r@d6Sw&>90vuD zlarUEeOQ#KT(tqTC>S%x0*(qRxa%v!igZ|wY!zj!73&lM$RrAZ(l%G94PuYE1}A@B z)v`2rw78Y^83Oy!)_HcLXP9yM(IdmCBaoN+d~C z?ocXs;E-~E<@~|LxU%WM{J~^xy;8e#rFPG9?Vfv%MC~(5?KAU7KKtxfZsr)sRyYdB zKt>4ViPHFtTzPS!VWHupcBT8=O85EY?(_16P@?;y(tUA0kN%NwjZyLh1mgub`Uq@U z32a>sY{e;(j5z}<2`@_ixr6t8I9PirFX7v!__oQOZQ#(#*3IQ7yL$gg#h+Gu(k!1j zo9H^Hbe%)%i^^Ap;`{)-=&cGxg#i}K=fbJUdmV3gEQ~FN68%DYX_V2(AKOc0? z6?Vv$HYue|a%oets&29I{R8to$=Z!8wVlhgo%ebYwOvYW*Zh%WdF}kG_iJ01#Jfil zwfmLY{c^?rWNpKDu6*mt(z?5c6197j+C7L@x^BMrL2%=IAAjU>ta*VU z)?0?0Yc1Pp0E?`!+X_Fd8(dzu#f#A|>Sg%qB~~|k3q|{Q8f>>hFJOhWQaY?PnRS^V zqM=-xaizt}pUKN!mzn&um<2PrhC1qsM{C!NU3Zp1o@Uf53uG<0RU9Wcs9vJen*ZxI zP!PF`rXJH`5^+0IVC@Mjw}!c+pY*UuhrMQ8B2G6&oiIBM#T*>RFrh-c+K3J=@3~nw zTI$o@y;hA{>A$qM^cOk0A6=_2mX7g??ytG2cHkB9Wblg3c_zG+a>3>&I)Q_TQ~B|b zM3n2ecylk)!a>0WH!i9h8S)iHc0$@NSy<%9gV(|n6RpsbMWA|N+LKfOa(PW~NPpqj zhPLQ6`#E-FM7NIJVD2*-(_(W3w+Wphl_5y^8M4r7Hw;I-k(d;qFD}?B4bxscj!K!Y zd_sAQ?ZqA}mAxZIE9KI}DopYMB+HN@W9UMZT(xx+!>%ezN?Di;mHR zH87v%{mRF9ZVSPGvsNXZnE*fY`)?7x`)g#Wng!&-P$@fGU_O|*=Wf%z9(hYw!hcBd zAEI*!{j$4i(V+zQ;4eF0dGktn+j4o^UB_J!QMYy_$`2{!hvtp~1#Q?u!lCsKSR#&# zaz5<8*Pdv3R%v-Q;p3GtN72( zxscVi_8(sVd)M!|6I*+ftvz%3@Z49t4!p`@bE2q4DQW?G;;nek^R{PUAmOc3ymfO< z)b-9Yio15PVcFd%yBqKOHZSc>_}Ud;yXcY4jyi_|Kmm{o*83BQp)Z61gR7hn7Tv>>St`t)pKt)&V0W(9mmEDwvU&5Zc9vwO0^$_ zwNf+!g)S7Pum+QY(9vQmB^*$gTrUlB6VM!EnVZ#3sS;BahDWKBtekts=Rcx_O50o2 zh3dmXor^Pe+QIg!~`N=mzEYiLmN5SWoFk55(E32&zo&su)h)Vp>+EdF^ymXiIfLI!$gXJ?ZtBY z0j)-MF+#(!Sfu?n|3wS)(#ZsCk51BY>V&Y=3j~ARdYn3qJ4hMFqE3=%ap^B3L(tQP z|2k{_=oh`Fv04x|IysY_m=GZ-n90~#%}EE+n8YiM(iw5%vd&V})5JO(agnRbIw#ZW zDJ+_p>?cphh#S|}Tq<#cClhhw>L27tow3%0%18CiKoLZj?<6kc6dqJAL%2}4wt5?r z1L=*S|6#dRgsQqyt`~{px2N*Pq5xE3kR5|Z=(LBJ}S9|0@Ay|C^Q@ON4?4=9Qmf?l!y_11Y&fePdZGIx8bAJtrZ)#Kc+F7 zz`|73a%JmQ%C;<*ZCN^&DBG))?UjquZ}K?mPd2yC!9ue!>G91Sez4;iWyhg82jm~W zef_QL3%QH7L~*@RT#r}o;`!}w?VH;N{oIPLdD+*zwB>I6-eAIaNbwz#Jy~v^W!3tX zs=doqd+(KUDN4dsF_$-APBh_WMiYW@FRNX6d8z$}d;i|vyU%@;li1R&Z0Y{!Y@+mp zQhH)8A5k~9QPes-dCC=c)wf?&)_2Noy6*=n`AoaJ2Y(Y)&nuXm17{O~b4uVG+?y5$ z=3c!Y*eEw%O9ZYff$OsO`l`cGSjN*+kWuyZu>vp?Zh)wAZ%r{ z(mZAoMgoLTfn1;$U!h??(OpdDibn{r&}g&lr7H zD+lMB*+{UyRQrlC*Z&XFamS+s#!VybkUpgsztrE-Q?r-n^&jc&zomdZ{X2SMGsTz_ z#ytA>`q%$JPsA(na%^~NE;8l#1@kGSd~$f6etLFrV=8*Kw8&_&(GLzoAIsyi*_-ip z59RCP`gzu8A!MufTl(AvCz7DWDp^ zM466JFh#)~3YsbSLkfHpd_Vyk{2$TNpHT2I1)ormq~Ome_yq<3nu5QifUQVkNK-Db zbl6%SzrlN|ipp)KfQ%8Ob_#Y=z~}--Au!T`5Gv!`7@5M6ELk5)6iniO?3Yk6-qQcA z<`gb3I!`_>JZ0PL#F;$S z;G#`vY)#@`SG!sqwK=!03Xcpg+J)RAV4}w6RkzFOSrsyazoIB_oLkMIPo-M)6V#a~F+FUM`JHW}x>oeezO6zx?RQ=9bm`%&M^JS?Uv@foyJF&EM>t#wa~9 zJoiQ0O0)2ZYV$dJhgF`>!u%E|%!SqpzG4%$?p(E(I6)t-6*N{j>sAG8&|c|0fnLc7 z_f|PeR|RVTaMiRm*|sZLR+-$`LW{ehDOuOF>hG~Ran8UaL!3&Ev}p-Tj1eU;;=RA&t86n>L>9slV z?WAF`23KsGoTrgNMtItmPu*$_0&PyBrymt^gg|IOqx`^RnQ26W9$;AV8H(A*5FX*f zvFSKAl>h^h$SIXaPV-5h{nzv>mwRH8ScYW5B9X*O%A>$VK|Tcq6u2qyP(ZRksfdDN z3cM7QP(b(-#$!=z9b!%iV-m?kq_c$Ci1+2H3p#)Uo=F)|%}?p6pl|Cas6+r~!{p~V z#x3}&={4!QB$5_M>nR9QP)7kX?5?M$4HRsopb-HMZJ3;fu7u(7CiVip!cizg_M0i% z77AMEQ|>T&Asmy4A4vJwbDK#D8sntMR{H9(yx&Hz?4gUJ(sn#aJ1E#mK|2MzC?Lv? zT;f6Y3yLHkx~1dn&;mxSNUId(I0X#TchS>P3W&vi=-SVZ5jh}@qX%&du~v*BSTLJy zH78(m!2244ZGvrsEYzFtq)>E={nH;-9bQ`wD1`qEf_lLgl!f)?8yvT-RTf$@@1#&G zTkoW>U0(YJ{XkvtWduIKwpA9|GVi3YQ_gm;{r-q7JmyXc)w1z#D0m#ufw(IY?Ze&DT0=9kV#;ZY#zDw*FfAHxAFt%@s%nVDbzOS`=!_f{V) zJKR;b@*d<>+`6XZRV-8_^6Hhm`dbcA2ix|@FI-r)m)ioXLYAQYMhVWqS{2s*GrwtJ Slj5uYD<0*SkBG^Z)BguOaeWT} diff --git a/.venv/Lib/site-packages/discord/app_commands/checks.py b/.venv/Lib/site-packages/discord/app_commands/checks.py deleted file mode 100644 index f6c0948..0000000 --- a/.venv/Lib/site-packages/discord/app_commands/checks.py +++ /dev/null @@ -1,537 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -from typing import ( - Any, - Coroutine, - Dict, - Hashable, - Union, - Callable, - TypeVar, - Optional, - TYPE_CHECKING, -) - -import time - -from .commands import check -from .errors import ( - NoPrivateMessage, - MissingRole, - MissingAnyRole, - MissingPermissions, - BotMissingPermissions, - CommandOnCooldown, -) - -from ..user import User -from ..permissions import Permissions -from ..utils import get as utils_get, MISSING, maybe_coroutine - -T = TypeVar('T') - -if TYPE_CHECKING: - from typing_extensions import Self - from ..interactions import Interaction - - CooldownFunction = Union[ - Callable[[Interaction[Any]], Coroutine[Any, Any, T]], - Callable[[Interaction[Any]], T], - ] - -__all__ = ( - 'has_role', - 'has_any_role', - 'has_permissions', - 'bot_has_permissions', - 'cooldown', - 'dynamic_cooldown', -) - - -class Cooldown: - """Represents a cooldown for a command. - - .. versionadded:: 2.0 - - Attributes - ----------- - rate: :class:`float` - The total number of tokens available per :attr:`per` seconds. - per: :class:`float` - The length of the cooldown period in seconds. - """ - - __slots__ = ('rate', 'per', '_window', '_tokens', '_last') - - def __init__(self, rate: float, per: float) -> None: - self.rate: int = int(rate) - self.per: float = float(per) - self._window: float = 0.0 - self._tokens: int = self.rate - self._last: float = 0.0 - - def get_tokens(self, current: Optional[float] = None) -> int: - """Returns the number of available tokens before rate limiting is applied. - - Parameters - ------------ - current: Optional[:class:`float`] - The time in seconds since Unix epoch to calculate tokens at. - If not supplied then :func:`time.time()` is used. - - Returns - -------- - :class:`int` - The number of tokens available before the cooldown is to be applied. - """ - if not current: - current = time.time() - - # the calculated tokens should be non-negative - tokens = max(self._tokens, 0) - - if current > self._window + self.per: - tokens = self.rate - return tokens - - def get_retry_after(self, current: Optional[float] = None) -> float: - """Returns the time in seconds until the cooldown will be reset. - - Parameters - ------------- - current: Optional[:class:`float`] - The current time in seconds since Unix epoch. - If not supplied, then :func:`time.time()` is used. - - Returns - ------- - :class:`float` - The number of seconds to wait before this cooldown will be reset. - """ - current = current or time.time() - tokens = self.get_tokens(current) - - if tokens == 0: - return self.per - (current - self._window) - - return 0.0 - - def update_rate_limit(self, current: Optional[float] = None, *, tokens: int = 1) -> Optional[float]: - """Updates the cooldown rate limit. - - Parameters - ------------- - current: Optional[:class:`float`] - The time in seconds since Unix epoch to update the rate limit at. - If not supplied, then :func:`time.time()` is used. - tokens: :class:`int` - The amount of tokens to deduct from the rate limit. - - Returns - ------- - Optional[:class:`float`] - The retry-after time in seconds if rate limited. - """ - current = current or time.time() - self._last = current - - self._tokens = self.get_tokens(current) - - # first token used means that we start a new rate limit window - if self._tokens == self.rate: - self._window = current - - # decrement tokens by specified number - self._tokens -= tokens - - # check if we are rate limited and return retry-after - if self._tokens < 0: - return self.per - (current - self._window) - - def reset(self) -> None: - """Reset the cooldown to its initial state.""" - self._tokens = self.rate - self._last = 0.0 - - def copy(self) -> Self: - """Creates a copy of this cooldown. - - Returns - -------- - :class:`Cooldown` - A new instance of this cooldown. - """ - return Cooldown(self.rate, self.per) - - def __repr__(self) -> str: - return f'' - - -def has_role(item: Union[int, str], /) -> Callable[[T], T]: - """A :func:`~discord.app_commands.check` that is added that checks if the member invoking the - command has the role specified via the name or ID specified. - - If a string is specified, you must give the exact name of the role, including - caps and spelling. - - If an integer is specified, you must give the exact snowflake ID of the role. - - This check raises one of two special exceptions, :exc:`~discord.app_commands.MissingRole` - if the user is missing a role, or :exc:`~discord.app_commands.NoPrivateMessage` if - it is used in a private message. Both inherit from :exc:`~discord.app_commands.CheckFailure`. - - .. versionadded:: 2.0 - - .. note:: - - This is different from the permission system that Discord provides for application - commands. This is done entirely locally in the program rather than being handled - by Discord. - - Parameters - ----------- - item: Union[:class:`int`, :class:`str`] - The name or ID of the role to check. - """ - - def predicate(interaction: Interaction) -> bool: - if isinstance(interaction.user, User): - raise NoPrivateMessage() - - if isinstance(item, int): - role = interaction.user.get_role(item) - else: - role = utils_get(interaction.user.roles, name=item) - - if role is None: - raise MissingRole(item) - return True - - return check(predicate) - - -def has_any_role(*items: Union[int, str]) -> Callable[[T], T]: - r"""A :func:`~discord.app_commands.check` that is added that checks if the member - invoking the command has **any** of the roles specified. This means that if they have - one out of the three roles specified, then this check will return ``True``. - - Similar to :func:`has_role`\, the names or IDs passed in must be exact. - - This check raises one of two special exceptions, :exc:`~discord.app_commands.MissingAnyRole` - if the user is missing all roles, or :exc:`~discord.app_commands.NoPrivateMessage` if - it is used in a private message. Both inherit from :exc:`~discord.app_commands.CheckFailure`. - - .. versionadded:: 2.0 - - .. note:: - - This is different from the permission system that Discord provides for application - commands. This is done entirely locally in the program rather than being handled - by Discord. - - Parameters - ----------- - items: List[Union[:class:`str`, :class:`int`]] - An argument list of names or IDs to check that the member has roles wise. - - Example - -------- - - .. code-block:: python3 - - @tree.command() - @app_commands.checks.has_any_role('Library Devs', 'Moderators', 492212595072434186) - async def cool(interaction: discord.Interaction): - await interaction.response.send_message('You are cool indeed') - """ - - def predicate(interaction: Interaction) -> bool: - if isinstance(interaction.user, User): - raise NoPrivateMessage() - - if any( - interaction.user.get_role(item) is not None - if isinstance(item, int) - else utils_get(interaction.user.roles, name=item) is not None - for item in items - ): - return True - raise MissingAnyRole(list(items)) - - return check(predicate) - - -def has_permissions(**perms: bool) -> Callable[[T], T]: - r"""A :func:`~discord.app_commands.check` that is added that checks if the member - has all of the permissions necessary. - - Note that this check operates on the permissions given by - :attr:`discord.Interaction.permissions`. - - The permissions passed in must be exactly like the properties shown under - :class:`discord.Permissions`. - - This check raises a special exception, :exc:`~discord.app_commands.MissingPermissions` - that is inherited from :exc:`~discord.app_commands.CheckFailure`. - - .. versionadded:: 2.0 - - .. note:: - - This is different from the permission system that Discord provides for application - commands. This is done entirely locally in the program rather than being handled - by Discord. - - Parameters - ------------ - \*\*perms: :class:`bool` - Keyword arguments denoting the permissions to check for. - - Example - --------- - - .. code-block:: python3 - - @tree.command() - @app_commands.checks.has_permissions(manage_messages=True) - async def test(interaction: discord.Interaction): - await interaction.response.send_message('You can manage messages.') - - """ - - invalid = perms.keys() - Permissions.VALID_FLAGS.keys() - if invalid: - raise TypeError(f"Invalid permission(s): {', '.join(invalid)}") - - def predicate(interaction: Interaction) -> bool: - permissions = interaction.permissions - - missing = [perm for perm, value in perms.items() if getattr(permissions, perm) != value] - - if not missing: - return True - - raise MissingPermissions(missing) - - return check(predicate) - - -def bot_has_permissions(**perms: bool) -> Callable[[T], T]: - """Similar to :func:`has_permissions` except checks if the bot itself has - the permissions listed. This relies on :attr:`discord.Interaction.app_permissions`. - - This check raises a special exception, :exc:`~discord.app_commands.BotMissingPermissions` - that is inherited from :exc:`~discord.app_commands.CheckFailure`. - - .. versionadded:: 2.0 - """ - - invalid = set(perms) - set(Permissions.VALID_FLAGS) - if invalid: - raise TypeError(f"Invalid permission(s): {', '.join(invalid)}") - - def predicate(interaction: Interaction) -> bool: - permissions = interaction.app_permissions - missing = [perm for perm, value in perms.items() if getattr(permissions, perm) != value] - - if not missing: - return True - - raise BotMissingPermissions(missing) - - return check(predicate) - - -def _create_cooldown_decorator( - key: CooldownFunction[Hashable], factory: CooldownFunction[Optional[Cooldown]] -) -> Callable[[T], T]: - - mapping: Dict[Any, Cooldown] = {} - - async def get_bucket( - interaction: Interaction, - *, - mapping: Dict[Any, Cooldown] = mapping, - key: CooldownFunction[Hashable] = key, - factory: CooldownFunction[Optional[Cooldown]] = factory, - ) -> Optional[Cooldown]: - current = interaction.created_at.timestamp() - dead_keys = [k for k, v in mapping.items() if current > v._last + v.per] - for k in dead_keys: - del mapping[k] - - k = await maybe_coroutine(key, interaction) - if k not in mapping: - bucket: Optional[Cooldown] = await maybe_coroutine(factory, interaction) - if bucket is not None: - mapping[k] = bucket - else: - bucket = mapping[k] - - return bucket - - async def predicate(interaction: Interaction) -> bool: - bucket = await get_bucket(interaction) - if bucket is None: - return True - - retry_after = bucket.update_rate_limit(interaction.created_at.timestamp()) - if retry_after is None: - return True - - raise CommandOnCooldown(bucket, retry_after) - - return check(predicate) - - -def cooldown( - rate: float, - per: float, - *, - key: Optional[CooldownFunction[Hashable]] = MISSING, -) -> Callable[[T], T]: - """A decorator that adds a cooldown to a command. - - A cooldown allows a command to only be used a specific amount - of times in a specific time frame. These cooldowns are based off - of the ``key`` function provided. If a ``key`` is not provided - then it defaults to a user-level cooldown. The ``key`` function - must take a single parameter, the :class:`discord.Interaction` and - return a value that is used as a key to the internal cooldown mapping. - - The ``key`` function can optionally be a coroutine. - - If a cooldown is triggered, then :exc:`~discord.app_commands.CommandOnCooldown` is - raised to the error handlers. - - Examples - --------- - - Setting a one per 5 seconds per member cooldown on a command: - - .. code-block:: python3 - - @tree.command() - @app_commands.checks.cooldown(1, 5.0, key=lambda i: (i.guild_id, i.user.id)) - async def test(interaction: discord.Interaction): - await interaction.response.send_message('Hello') - - @test.error - async def on_test_error(interaction: discord.Interaction, error: app_commands.AppCommandError): - if isinstance(error, app_commands.CommandOnCooldown): - await interaction.response.send_message(str(error), ephemeral=True) - - Parameters - ------------ - rate: :class:`int` - The number of times a command can be used before triggering a cooldown. - per: :class:`float` - The amount of seconds to wait for a cooldown when it's been triggered. - key: Optional[Callable[[:class:`discord.Interaction`], :class:`collections.abc.Hashable`]] - A function that returns a key to the mapping denoting the type of cooldown. - Can optionally be a coroutine. If not given then defaults to a user-level - cooldown. If ``None`` is passed then it is interpreted as a "global" cooldown. - """ - - if key is MISSING: - key_func = lambda interaction: interaction.user.id - elif key is None: - key_func = lambda i: None - else: - key_func = key - - factory = lambda interaction: Cooldown(rate, per) - - return _create_cooldown_decorator(key_func, factory) - - -def dynamic_cooldown( - factory: CooldownFunction[Optional[Cooldown]], - *, - key: Optional[CooldownFunction[Hashable]] = MISSING, -) -> Callable[[T], T]: - """A decorator that adds a dynamic cooldown to a command. - - A cooldown allows a command to only be used a specific amount - of times in a specific time frame. These cooldowns are based off - of the ``key`` function provided. If a ``key`` is not provided - then it defaults to a user-level cooldown. The ``key`` function - must take a single parameter, the :class:`discord.Interaction` and - return a value that is used as a key to the internal cooldown mapping. - - If a ``factory`` function is given, it must be a function that - accepts a single parameter of type :class:`discord.Interaction` and must - return a :class:`~discord.app_commands.Cooldown` or ``None``. - If ``None`` is returned then that cooldown is effectively bypassed. - - Both ``key`` and ``factory`` can optionally be coroutines. - - If a cooldown is triggered, then :exc:`~discord.app_commands.CommandOnCooldown` is - raised to the error handlers. - - Examples - --------- - - Setting a cooldown for everyone but the owner. - - .. code-block:: python3 - - def cooldown_for_everyone_but_me(interaction: discord.Interaction) -> Optional[app_commands.Cooldown]: - if interaction.user.id == 80088516616269824: - return None - return app_commands.Cooldown(1, 10.0) - - @tree.command() - @app_commands.checks.dynamic_cooldown(cooldown_for_everyone_but_me) - async def test(interaction: discord.Interaction): - await interaction.response.send_message('Hello') - - @test.error - async def on_test_error(interaction: discord.Interaction, error: app_commands.AppCommandError): - if isinstance(error, app_commands.CommandOnCooldown): - await interaction.response.send_message(str(error), ephemeral=True) - - Parameters - ------------ - factory: Optional[Callable[[:class:`discord.Interaction`], Optional[:class:`~discord.app_commands.Cooldown`]]] - A function that takes an interaction and returns a cooldown that will apply to that interaction - or ``None`` if the interaction should not have a cooldown. - key: Optional[Callable[[:class:`discord.Interaction`], :class:`collections.abc.Hashable`]] - A function that returns a key to the mapping denoting the type of cooldown. - Can optionally be a coroutine. If not given then defaults to a user-level - cooldown. If ``None`` is passed then it is interpreted as a "global" cooldown. - """ - - if key is MISSING: - key_func = lambda interaction: interaction.user.id - elif key is None: - key_func = lambda i: None - else: - key_func = key - - return _create_cooldown_decorator(key_func, factory) diff --git a/.venv/Lib/site-packages/discord/app_commands/commands.py b/.venv/Lib/site-packages/discord/app_commands/commands.py deleted file mode 100644 index 8e66934..0000000 --- a/.venv/Lib/site-packages/discord/app_commands/commands.py +++ /dev/null @@ -1,2479 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations -import inspect - -from typing import ( - Any, - Callable, - ClassVar, - Coroutine, - Dict, - Generator, - Generic, - List, - MutableMapping, - Optional, - Set, - TYPE_CHECKING, - Tuple, - Type, - TypeVar, - Union, - overload, -) - -import re -from copy import copy as shallow_copy - -from ..enums import AppCommandOptionType, AppCommandType, ChannelType, Locale -from .models import Choice -from .transformers import annotation_to_parameter, CommandParameter, NoneType -from .errors import AppCommandError, CheckFailure, CommandInvokeError, CommandSignatureMismatch, CommandAlreadyRegistered -from .translator import TranslationContextLocation, TranslationContext, Translator, locale_str -from ..message import Message -from ..user import User -from ..member import Member -from ..permissions import Permissions -from ..utils import resolve_annotation, MISSING, is_inside_class, maybe_coroutine, async_all, _shorten, _to_kebab_case - -if TYPE_CHECKING: - from typing_extensions import ParamSpec, Concatenate - from ..interactions import Interaction - from ..abc import Snowflake - from .namespace import Namespace - from .models import ChoiceT - - # Generally, these two libraries are supposed to be separate from each other. - # However, for type hinting purposes it's unfortunately necessary for one to - # reference the other to prevent type checking errors in callbacks - from discord.ext import commands - - ErrorFunc = Callable[[Interaction, AppCommandError], Coroutine[Any, Any, None]] - -__all__ = ( - 'Command', - 'ContextMenu', - 'Group', - 'Parameter', - 'context_menu', - 'command', - 'describe', - 'check', - 'rename', - 'choices', - 'autocomplete', - 'guilds', - 'guild_only', - 'default_permissions', -) - -if TYPE_CHECKING: - P = ParamSpec('P') -else: - P = TypeVar('P') - -T = TypeVar('T') -F = TypeVar('F', bound=Callable[..., Any]) -GroupT = TypeVar('GroupT', bound='Binding') -Coro = Coroutine[Any, Any, T] -UnboundError = Callable[['Interaction[Any]', AppCommandError], Coro[Any]] -Error = Union[ - Callable[[GroupT, 'Interaction[Any]', AppCommandError], Coro[Any]], - UnboundError, -] -Check = Callable[['Interaction[Any]'], Union[bool, Coro[bool]]] -Binding = Union['Group', 'commands.Cog'] - - -if TYPE_CHECKING: - CommandCallback = Union[ - Callable[Concatenate[GroupT, 'Interaction[Any]', P], Coro[T]], - Callable[Concatenate['Interaction[Any]', P], Coro[T]], - ] - - ContextMenuCallback = Union[ - # If groups end up support context menus these would be uncommented - # Callable[[GroupT, 'Interaction', Member], Coro[Any]], - # Callable[[GroupT, 'Interaction', User], Coro[Any]], - # Callable[[GroupT, 'Interaction', Message], Coro[Any]], - # Callable[[GroupT, 'Interaction', Union[Member, User]], Coro[Any]], - Callable[['Interaction[Any]', Member], Coro[Any]], - Callable[['Interaction[Any]', User], Coro[Any]], - Callable[['Interaction[Any]', Message], Coro[Any]], - Callable[['Interaction[Any]', Union[Member, User]], Coro[Any]], - ] - - AutocompleteCallback = Union[ - Callable[[GroupT, 'Interaction[Any]', str], Coro[List[Choice[ChoiceT]]]], - Callable[['Interaction[Any]', str], Coro[List[Choice[ChoiceT]]]], - ] -else: - CommandCallback = Callable[..., Coro[T]] - ContextMenuCallback = Callable[..., Coro[T]] - AutocompleteCallback = Callable[..., Coro[T]] - - -CheckInputParameter = Union['Command[Any, ..., Any]', 'ContextMenu', 'CommandCallback[Any, ..., Any]', ContextMenuCallback] - -# The re module doesn't support \p{} so we have to list characters from Thai and Devanagari manually. -THAI_COMBINING = r'\u0e31-\u0e3a\u0e47-\u0e4e' -DEVANAGARI_COMBINING = r'\u0900-\u0903\u093a\u093b\u093c\u093e\u093f\u0940-\u094f\u0955\u0956\u0957\u0962\u0963' -VALID_SLASH_COMMAND_NAME = re.compile(r'^[-_\w' + THAI_COMBINING + DEVANAGARI_COMBINING + r']{1,32}$') - -ARG_NAME_SUBREGEX = r'(?:\\?\*){0,2}(?P\w+)' - -ARG_DESCRIPTION_SUBREGEX = r'(?P(?:.|\n)+?(?:\Z|\r?\n(?=[\S\r\n])))' - -ARG_TYPE_SUBREGEX = r'(?:.+)' - -GOOGLE_DOCSTRING_ARG_REGEX = re.compile( - rf'^{ARG_NAME_SUBREGEX}[ \t]*(?:\({ARG_TYPE_SUBREGEX}\))?[ \t]*:[ \t]*{ARG_DESCRIPTION_SUBREGEX}', - re.MULTILINE, -) - -SPHINX_DOCSTRING_ARG_REGEX = re.compile( - rf'^:param {ARG_NAME_SUBREGEX}:[ \t]+{ARG_DESCRIPTION_SUBREGEX}', - re.MULTILINE, -) - -NUMPY_DOCSTRING_ARG_REGEX = re.compile( - rf'^{ARG_NAME_SUBREGEX}(?:[ \t]*:)?(?:[ \t]+{ARG_TYPE_SUBREGEX})?[ \t]*\r?\n[ \t]+{ARG_DESCRIPTION_SUBREGEX}', - re.MULTILINE, -) - - -def _parse_args_from_docstring(func: Callable[..., Any], params: Dict[str, CommandParameter]) -> Dict[str, str]: - docstring = inspect.getdoc(func) - - if docstring is None: - return {} - - # Extract the arguments - # Note: These are loose regexes, but they are good enough for our purposes - # For Google-style, look only at the lines that are indented - section_lines = inspect.cleandoc('\n'.join(line for line in docstring.splitlines() if line.startswith(' '))) - docstring_styles = ( - GOOGLE_DOCSTRING_ARG_REGEX.finditer(section_lines), - SPHINX_DOCSTRING_ARG_REGEX.finditer(docstring), - NUMPY_DOCSTRING_ARG_REGEX.finditer(docstring), - ) - - return { - m.group('name'): m.group('description') for matches in docstring_styles for m in matches if m.group('name') in params - } - - -def validate_name(name: str) -> str: - match = VALID_SLASH_COMMAND_NAME.match(name) - if match is None: - raise ValueError( - f'{name!r} must be between 1-32 characters and contain only lower-case letters, numbers, hyphens, or underscores.' - ) - - # Ideally, name.islower() would work instead but since certain characters - # are Lo (e.g. CJK) those don't pass the test. I'd use `casefold` instead as - # well, but chances are the server-side check is probably something similar to - # this code anyway. - if name.lower() != name: - raise ValueError(f'{name!r} must be all lower-case') - return name - - -def validate_context_menu_name(name: str) -> str: - if not name or len(name) > 32: - raise ValueError('context menu names must be between 1-32 characters') - return name - - -def validate_auto_complete_callback( - callback: AutocompleteCallback[GroupT, ChoiceT] -) -> AutocompleteCallback[GroupT, ChoiceT]: - # This function needs to ensure the following is true: - # If self.foo is passed then don't pass command.binding to the callback - # If Class.foo is passed then it is assumed command.binding has to be passed - # If free_function_foo is passed then no binding should be passed at all - # Passing command.binding is mandated by pass_command_binding - - binding = getattr(callback, '__self__', None) - pass_command_binding = binding is None and is_inside_class(callback) - - # 'method' objects can't have dynamic attributes - if binding is None: - callback.pass_command_binding = pass_command_binding - - required_parameters = 2 + pass_command_binding - params = inspect.signature(callback).parameters - if len(params) != required_parameters: - raise TypeError(f'autocomplete callback {callback.__qualname__!r} requires either 2 or 3 parameters to be passed') - - return callback - - -def _context_menu_annotation(annotation: Any, *, _none: type = NoneType) -> AppCommandType: - if annotation is Message: - return AppCommandType.message - - supported_types: Set[Any] = {Member, User} - if annotation in supported_types: - return AppCommandType.user - - # Check if there's an origin - origin = getattr(annotation, '__origin__', None) - if origin is not Union: - # Only Union is supported so bail early - msg = ( - f'unsupported type annotation {annotation!r}, must be either discord.Member, ' - 'discord.User, discord.Message, or a typing.Union of discord.Member and discord.User' - ) - raise TypeError(msg) - - # Only Union[Member, User] is supported - if not all(arg in supported_types for arg in annotation.__args__): - raise TypeError(f'unsupported types given inside {annotation!r}') - - return AppCommandType.user - - -def _populate_descriptions(params: Dict[str, CommandParameter], descriptions: Dict[str, Any]) -> None: - for name, param in params.items(): - description = descriptions.pop(name, MISSING) - if description is MISSING: - param.description = '…' - continue - - if not isinstance(description, (str, locale_str)): - raise TypeError('description must be a string') - - if isinstance(description, str): - param.description = _shorten(description) - else: - param.description = description - - if descriptions: - first = next(iter(descriptions)) - raise TypeError(f'unknown parameter given: {first}') - - -def _populate_renames(params: Dict[str, CommandParameter], renames: Dict[str, Union[str, locale_str]]) -> None: - rename_map: Dict[str, Union[str, locale_str]] = {} - - # original name to renamed name - - for name in params.keys(): - new_name = renames.pop(name, MISSING) - - if new_name is MISSING: - rename_map[name] = name - continue - - if name in rename_map: - raise ValueError(f'{new_name} is already used') - - if isinstance(new_name, str): - new_name = validate_name(new_name) - else: - validate_name(new_name.message) - - rename_map[name] = new_name - params[name]._rename = new_name - - if renames: - first = next(iter(renames)) - raise ValueError(f'unknown parameter given: {first}') - - -def _populate_choices(params: Dict[str, CommandParameter], all_choices: Dict[str, List[Choice]]) -> None: - for name, param in params.items(): - choices = all_choices.pop(name, MISSING) - if choices is MISSING: - continue - - if not isinstance(choices, list): - raise TypeError('choices must be a list of Choice') - - if not all(isinstance(choice, Choice) for choice in choices): - raise TypeError('choices must be a list of Choice') - - if param.type not in (AppCommandOptionType.string, AppCommandOptionType.number, AppCommandOptionType.integer): - raise TypeError('choices are only supported for integer, string, or number option types') - - if not all(param.type == choice._option_type for choice in choices): - raise TypeError('choices must all have the same inner option type as the parameter choice type') - - param.choices = choices - - if all_choices: - first = next(iter(all_choices)) - raise TypeError(f'unknown parameter given: {first}') - - -def _populate_autocomplete(params: Dict[str, CommandParameter], autocomplete: Dict[str, Any]) -> None: - for name, param in params.items(): - callback = autocomplete.pop(name, MISSING) - if callback is MISSING: - continue - - if not inspect.iscoroutinefunction(callback): - raise TypeError('autocomplete callback must be a coroutine function') - - if param.type not in (AppCommandOptionType.string, AppCommandOptionType.number, AppCommandOptionType.integer): - raise TypeError('autocomplete is only supported for integer, string, or number option types') - - if param.is_choice_annotation(): - raise TypeError( - 'Choice annotation unsupported for autocomplete parameters, consider using a regular annotation instead' - ) - - param.autocomplete = validate_auto_complete_callback(callback) - - if autocomplete: - first = next(iter(autocomplete)) - raise TypeError(f'unknown parameter given: {first}') - - -def _extract_parameters_from_callback(func: Callable[..., Any], globalns: Dict[str, Any]) -> Dict[str, CommandParameter]: - params = inspect.signature(func).parameters - cache = {} - required_params = is_inside_class(func) + 1 - if len(params) < required_params: - raise TypeError(f'callback {func.__qualname__!r} must have more than {required_params - 1} parameter(s)') - - iterator = iter(params.values()) - for _ in range(0, required_params): - next(iterator) - - parameters: List[CommandParameter] = [] - for parameter in iterator: - if parameter.annotation is parameter.empty: - raise TypeError(f'parameter {parameter.name!r} is missing a type annotation in callback {func.__qualname__!r}') - - resolved = resolve_annotation(parameter.annotation, globalns, globalns, cache) - param = annotation_to_parameter(resolved, parameter) - parameters.append(param) - - values = sorted(parameters, key=lambda a: a.required, reverse=True) - result = {v.name: v for v in values} - - descriptions = _parse_args_from_docstring(func, result) - - try: - descriptions.update(func.__discord_app_commands_param_description__) - except AttributeError: - for param in values: - if param.description is MISSING: - param.description = '…' - if descriptions: - _populate_descriptions(result, descriptions) - - try: - renames = func.__discord_app_commands_param_rename__ - except AttributeError: - pass - else: - _populate_renames(result, renames.copy()) - - try: - choices = func.__discord_app_commands_param_choices__ - except AttributeError: - pass - else: - _populate_choices(result, choices.copy()) - - try: - autocomplete = func.__discord_app_commands_param_autocomplete__ - except AttributeError: - pass - else: - _populate_autocomplete(result, autocomplete.copy()) - - return result - - -def _get_context_menu_parameter(func: ContextMenuCallback) -> Tuple[str, Any, AppCommandType]: - params = inspect.signature(func).parameters - if is_inside_class(func) and not hasattr(func, '__self__'): - raise TypeError('context menus cannot be defined inside a class') - - if len(params) != 2: - msg = ( - f'context menu callback {func.__qualname__!r} requires 2 parameters, ' - 'the first one being the interaction and the other one explicitly ' - 'annotated with either discord.Message, discord.User, discord.Member, ' - 'or a typing.Union of discord.Member and discord.User' - ) - raise TypeError(msg) - - iterator = iter(params.values()) - next(iterator) # skip interaction - parameter = next(iterator) - if parameter.annotation is parameter.empty: - msg = ( - f'second parameter of context menu callback {func.__qualname__!r} must be explicitly ' - 'annotated with either discord.Message, discord.User, discord.Member, or ' - 'a typing.Union of discord.Member and discord.User' - ) - raise TypeError(msg) - - resolved = resolve_annotation(parameter.annotation, func.__globals__, func.__globals__, {}) - type = _context_menu_annotation(resolved) - return (parameter.name, resolved, type) - - -def mark_overrideable(func: F) -> F: - func.__discord_app_commands_base_function__ = None - return func - - -class Parameter: - """A class that contains the parameter information of a :class:`Command` callback. - - .. versionadded:: 2.0 - - Attributes - ----------- - name: :class:`str` - The name of the parameter. This is the Python identifier for the parameter. - display_name: :class:`str` - The displayed name of the parameter on Discord. - description: :class:`str` - The description of the parameter. - autocomplete: :class:`bool` - Whether the parameter has an autocomplete handler. - locale_name: Optional[:class:`locale_str`] - The display name's locale string, if available. - locale_description: Optional[:class:`locale_str`] - The description's locale string, if available. - required: :class:`bool` - Whether the parameter is required - choices: List[:class:`~discord.app_commands.Choice`] - A list of choices this parameter takes, if any. - type: :class:`~discord.AppCommandOptionType` - The underlying type of this parameter. - channel_types: List[:class:`~discord.ChannelType`] - The channel types that are allowed for this parameter. - min_value: Optional[Union[:class:`int`, :class:`float`]] - The minimum supported value for this parameter. - max_value: Optional[Union[:class:`int`, :class:`float`]] - The maximum supported value for this parameter. - default: Any - The default value of the parameter, if given. - If not given then this is :data:`~discord.utils.MISSING`. - command: :class:`Command` - The command this parameter is attached to. - """ - - def __init__(self, parent: CommandParameter, command: Command[Any, ..., Any]) -> None: - self.__parent: CommandParameter = parent - self.__command: Command[Any, ..., Any] = command - - @property - def command(self) -> Command[Any, ..., Any]: - return self.__command - - @property - def name(self) -> str: - return self.__parent.name - - @property - def display_name(self) -> str: - return self.__parent.display_name - - @property - def required(self) -> bool: - return self.__parent.required - - @property - def description(self) -> str: - return str(self.__parent.description) - - @property - def locale_name(self) -> Optional[locale_str]: - if isinstance(self.__parent._rename, locale_str): - return self.__parent._rename - return None - - @property - def locale_description(self) -> Optional[locale_str]: - if isinstance(self.__parent.description, locale_str): - return self.__parent.description - return None - - @property - def autocomplete(self) -> bool: - return self.__parent.autocomplete is not None - - @property - def default(self) -> Any: - return self.__parent.default - - @property - def type(self) -> AppCommandOptionType: - return self.__parent.type - - @property - def choices(self) -> List[Choice[Union[int, float, str]]]: - choices = self.__parent.choices - if choices is MISSING: - return [] - return choices.copy() - - @property - def channel_types(self) -> List[ChannelType]: - channel_types = self.__parent.channel_types - if channel_types is MISSING: - return [] - return channel_types.copy() - - @property - def min_value(self) -> Optional[Union[int, float]]: - return self.__parent.min_value - - @property - def max_value(self) -> Optional[Union[int, float]]: - return self.__parent.max_value - - -class Command(Generic[GroupT, P, T]): - """A class that implements an application command. - - These are usually not created manually, instead they are created using - one of the following decorators: - - - :func:`~discord.app_commands.command` - - :meth:`Group.command ` - - :meth:`CommandTree.command ` - - .. versionadded:: 2.0 - - Parameters - ----------- - name: Union[:class:`str`, :class:`locale_str`] - The name of the application command. - description: Union[:class:`str`, :class:`locale_str`] - The description of the application command. This shows up in the UI to describe - the application command. - callback: :ref:`coroutine ` - The coroutine that is executed when the command is called. - auto_locale_strings: :class:`bool` - If this is set to ``True``, then all translatable strings will implicitly - be wrapped into :class:`locale_str` rather than :class:`str`. This could - avoid some repetition and be more ergonomic for certain defaults such - as default command names, command descriptions, and parameter names. - Defaults to ``True``. - nsfw: :class:`bool` - Whether the command is NSFW and should only work in NSFW channels. - Defaults to ``False``. - - Due to a Discord limitation, this does not work on subcommands. - parent: Optional[:class:`Group`] - The parent application command. ``None`` if there isn't one. - extras: :class:`dict` - A dictionary that can be used to store extraneous data. - The library will not touch any values or keys within this dictionary. - - Attributes - ------------ - name: :class:`str` - The name of the application command. - description: :class:`str` - The description of the application command. This shows up in the UI to describe - the application command. - checks - A list of predicates that take a :class:`~discord.Interaction` parameter - to indicate whether the command callback should be executed. If an exception - is necessary to be thrown to signal failure, then one inherited from - :exc:`AppCommandError` should be used. If all the checks fail without - propagating an exception, :exc:`CheckFailure` is raised. - default_permissions: Optional[:class:`~discord.Permissions`] - The default permissions that can execute this command on Discord. Note - that server administrators can override this value in the client. - Setting an empty permissions field will disallow anyone except server - administrators from using the command in a guild. - - Due to a Discord limitation, this does not work on subcommands. - guild_only: :class:`bool` - Whether the command should only be usable in guild contexts. - - Due to a Discord limitation, this does not work on subcommands. - nsfw: :class:`bool` - Whether the command is NSFW and should only work in NSFW channels. - - Due to a Discord limitation, this does not work on subcommands. - parent: Optional[:class:`Group`] - The parent application command. ``None`` if there isn't one. - extras: :class:`dict` - A dictionary that can be used to store extraneous data. - The library will not touch any values or keys within this dictionary. - """ - - def __init__( - self, - *, - name: Union[str, locale_str], - description: Union[str, locale_str], - callback: CommandCallback[GroupT, P, T], - nsfw: bool = False, - parent: Optional[Group] = None, - guild_ids: Optional[List[int]] = None, - auto_locale_strings: bool = True, - extras: Dict[Any, Any] = MISSING, - ): - name, locale = (name.message, name) if isinstance(name, locale_str) else (name, None) - self.name: str = validate_name(name) - self._locale_name: Optional[locale_str] = locale - description, locale = ( - (description.message, description) if isinstance(description, locale_str) else (description, None) - ) - self.description: str = description - self._locale_description: Optional[locale_str] = locale - self._attr: Optional[str] = None - self._callback: CommandCallback[GroupT, P, T] = callback - self.parent: Optional[Group] = parent - self.binding: Optional[GroupT] = None - self.on_error: Optional[Error[GroupT]] = None - self.module: Optional[str] = callback.__module__ - - # Unwrap __self__ for bound methods - try: - self.binding = callback.__self__ - self._callback = callback = callback.__func__ - except AttributeError: - pass - - self._params: Dict[str, CommandParameter] = _extract_parameters_from_callback(callback, callback.__globals__) - self.checks: List[Check] = getattr(callback, '__discord_app_commands_checks__', []) - self._guild_ids: Optional[List[int]] = guild_ids or getattr( - callback, '__discord_app_commands_default_guilds__', None - ) - self.default_permissions: Optional[Permissions] = getattr( - callback, '__discord_app_commands_default_permissions__', None - ) - self.guild_only: bool = getattr(callback, '__discord_app_commands_guild_only__', False) - self.nsfw: bool = nsfw - self.extras: Dict[Any, Any] = extras or {} - - if self._guild_ids is not None and self.parent is not None: - raise ValueError('child commands cannot have default guilds set, consider setting them in the parent instead') - - if auto_locale_strings: - self._convert_to_locale_strings() - - def _convert_to_locale_strings(self) -> None: - if self._locale_name is None: - self._locale_name = locale_str(self.name) - if self._locale_description is None: - self._locale_description = locale_str(self.description) - - for param in self._params.values(): - param._convert_to_locale_strings() - - def __set_name__(self, owner: Type[Any], name: str) -> None: - self._attr = name - - @property - def callback(self) -> CommandCallback[GroupT, P, T]: - """:ref:`coroutine `: The coroutine that is executed when the command is called.""" - return self._callback - - def _copy_with( - self, - *, - parent: Optional[Group], - binding: GroupT, - bindings: MutableMapping[GroupT, GroupT] = MISSING, - set_on_binding: bool = True, - ) -> Command: - bindings = {} if bindings is MISSING else bindings - - copy = shallow_copy(self) - copy._params = self._params.copy() - copy.parent = parent - copy.binding = bindings.get(self.binding) if self.binding is not None else binding - - if copy._attr and set_on_binding: - setattr(copy.binding, copy._attr, copy) - - return copy - - async def get_translated_payload(self, translator: Translator) -> Dict[str, Any]: - base = self.to_dict() - name_localizations: Dict[str, str] = {} - description_localizations: Dict[str, str] = {} - - # Prevent creating these objects in a heavy loop - name_context = TranslationContext(location=TranslationContextLocation.command_name, data=self) - description_context = TranslationContext(location=TranslationContextLocation.command_description, data=self) - - for locale in Locale: - if self._locale_name: - translation = await translator._checked_translate(self._locale_name, locale, name_context) - if translation is not None: - name_localizations[locale.value] = translation - - if self._locale_description: - translation = await translator._checked_translate(self._locale_description, locale, description_context) - if translation is not None: - description_localizations[locale.value] = translation - - base['name_localizations'] = name_localizations - base['description_localizations'] = description_localizations - base['options'] = [ - await param.get_translated_payload(translator, Parameter(param, self)) for param in self._params.values() - ] - return base - - def to_dict(self) -> Dict[str, Any]: - # If we have a parent then our type is a subcommand - # Otherwise, the type falls back to the specific command type (e.g. slash command or context menu) - option_type = AppCommandType.chat_input.value if self.parent is None else AppCommandOptionType.subcommand.value - base: Dict[str, Any] = { - 'name': self.name, - 'description': self.description, - 'type': option_type, - 'options': [param.to_dict() for param in self._params.values()], - } - - if self.parent is None: - base['nsfw'] = self.nsfw - base['dm_permission'] = not self.guild_only - base['default_member_permissions'] = None if self.default_permissions is None else self.default_permissions.value - - return base - - async def _invoke_error_handlers(self, interaction: Interaction, error: AppCommandError) -> None: - # These type ignores are because the type checker can't narrow this type properly. - if self.on_error is not None: - if self.binding is not None: - await self.on_error(self.binding, interaction, error) # type: ignore - else: - await self.on_error(interaction, error) # type: ignore - - parent = self.parent - if parent is not None: - await parent.on_error(interaction, error) - - if parent.parent is not None: - await parent.parent.on_error(interaction, error) - - binding_error_handler = getattr(self.binding, '__discord_app_commands_error_handler__', None) - if binding_error_handler is not None: - await binding_error_handler(interaction, error) - - def _has_any_error_handlers(self) -> bool: - if self.on_error is not None: - return True - - parent = self.parent - if parent is not None: - # Check if the on_error is overridden - if not hasattr(parent.on_error, '__discord_app_commands_base_function__'): - return True - - if parent.parent is not None: - if not hasattr(parent.parent.on_error, '__discord_app_commands_base_function__'): - return True - - # Check if we have a bound error handler - if getattr(self.binding, '__discord_app_commands_error_handler__', None) is not None: - return True - - return False - - async def _transform_arguments(self, interaction: Interaction, namespace: Namespace) -> Dict[str, Any]: - values = namespace.__dict__ - transformed_values = {} - - for param in self._params.values(): - try: - value = values[param.display_name] - except KeyError: - if not param.required: - transformed_values[param.name] = param.default - else: - raise CommandSignatureMismatch(self) from None - else: - transformed_values[param.name] = await param.transform(interaction, value) - - return transformed_values - - async def _do_call(self, interaction: Interaction, params: Dict[str, Any]) -> T: - # These type ignores are because the type checker doesn't quite understand the narrowing here - # Likewise, it thinks we're missing positional arguments when there aren't any. - try: - if self.binding is not None: - return await self._callback(self.binding, interaction, **params) # type: ignore - return await self._callback(interaction, **params) # type: ignore - except TypeError as e: - # In order to detect mismatch from the provided signature and the Discord data, - # there are many ways it can go wrong yet all of them eventually lead to a TypeError - # from the Python compiler showcasing that the signature is incorrect. This lovely - # piece of code essentially checks the last frame of the caller and checks if the - # locals contains our `self` reference. - # - # This is because there is a possibility that a TypeError is raised within the body - # of the function, and in that case the locals wouldn't contain a reference to - # the command object under the name `self`. - frame = inspect.trace()[-1].frame - if frame.f_locals.get('self') is self: - raise CommandSignatureMismatch(self) from None - raise CommandInvokeError(self, e) from e - except AppCommandError: - raise - except Exception as e: - raise CommandInvokeError(self, e) from e - - async def _invoke_with_namespace(self, interaction: Interaction, namespace: Namespace) -> T: - if not await self._check_can_run(interaction): - raise CheckFailure(f'The check functions for command {self.name!r} failed.') - - transformed_values = await self._transform_arguments(interaction, namespace) - return await self._do_call(interaction, transformed_values) - - async def _invoke_autocomplete(self, interaction: Interaction, name: str, namespace: Namespace): - # The namespace contains the Discord provided names so this will be fine - # even if the name is renamed - value = namespace.__dict__[name] - - try: - param = self._params[name] - except KeyError: - # Slow case, it might be a rename - params = {param.display_name: param for param in self._params.values()} - try: - param = params[name] - except KeyError: - raise CommandSignatureMismatch(self) from None - - if param.autocomplete is None: - raise CommandSignatureMismatch(self) - - predicates = getattr(param.autocomplete, '__discord_app_commands_checks__', []) - if predicates: - try: - passed = await async_all(f(interaction) for f in predicates) - except Exception: - passed = False - - if not passed: - if not interaction.response.is_done(): - await interaction.response.autocomplete([]) - return - - if getattr(param.autocomplete, 'pass_command_binding', False): - binding = self.binding - if binding is not None: - choices = await param.autocomplete(binding, interaction, value) - else: - raise TypeError('autocomplete parameter expected a bound self parameter but one was not provided') - else: - choices = await param.autocomplete(interaction, value) - - if interaction.response.is_done(): - return - - await interaction.response.autocomplete(choices) - - def _get_internal_command(self, name: str) -> Optional[Union[Command, Group]]: - return None - - @property - def parameters(self) -> List[Parameter]: - """Returns a list of parameters for this command. - - This does not include the ``self`` or ``interaction`` parameters. - - Returns - -------- - List[:class:`Parameter`] - The parameters of this command. - """ - return [Parameter(p, self) for p in self._params.values()] - - def get_parameter(self, name: str) -> Optional[Parameter]: - """Retrieves a parameter by its name. - - The name must be the Python identifier rather than the renamed - one for display on Discord. - - Parameters - ----------- - name: :class:`str` - The parameter name in the callback function. - - Returns - -------- - Optional[:class:`Parameter`] - The parameter or ``None`` if not found. - """ - - parent = self._params.get(name) - if parent is not None: - return Parameter(parent, self) - return None - - @property - def root_parent(self) -> Optional[Group]: - """Optional[:class:`Group`]: The root parent of this command.""" - if self.parent is None: - return None - parent = self.parent - return parent.parent or parent - - @property - def qualified_name(self) -> str: - """:class:`str`: Returns the fully qualified command name. - - The qualified name includes the parent name as well. For example, - in a command like ``/foo bar`` the qualified name is ``foo bar``. - """ - # A B C - # ^ self - # ^ parent - # ^ grandparent - if self.parent is None: - return self.name - - names = [self.name, self.parent.name] - grandparent = self.parent.parent - if grandparent is not None: - names.append(grandparent.name) - - return ' '.join(reversed(names)) - - async def _check_can_run(self, interaction: Interaction) -> bool: - if self.parent is not None and self.parent is not self.binding: - # For commands with a parent which isn't the binding, i.e. - # - # - # - # The parent check needs to be called first - if not await maybe_coroutine(self.parent.interaction_check, interaction): - return False - - if self.binding is not None: - check: Optional[Check] = getattr(self.binding, 'interaction_check', None) - if check: - ret = await maybe_coroutine(check, interaction) # type: ignore # Probable pyright bug - if not ret: - return False - - predicates = self.checks - if not predicates: - return True - - return await async_all(f(interaction) for f in predicates) - - def error(self, coro: Error[GroupT]) -> Error[GroupT]: - """A decorator that registers a coroutine as a local error handler. - - The local error handler is called whenever an exception is raised in the body - of the command or during handling of the command. The error handler must take - 2 parameters, the interaction and the error. - - The error passed will be derived from :exc:`AppCommandError`. - - Parameters - ----------- - coro: :ref:`coroutine ` - The coroutine to register as the local error handler. - - Raises - ------- - TypeError - The coroutine passed is not actually a coroutine. - """ - - if not inspect.iscoroutinefunction(coro): - raise TypeError('The error handler must be a coroutine.') - - self.on_error = coro - return coro - - def autocomplete( - self, name: str - ) -> Callable[[AutocompleteCallback[GroupT, ChoiceT]], AutocompleteCallback[GroupT, ChoiceT]]: - """A decorator that registers a coroutine as an autocomplete prompt for a parameter. - - The coroutine callback must have 2 parameters, the :class:`~discord.Interaction`, - and the current value by the user (the string currently being typed by the user). - - To get the values from other parameters that may be filled in, accessing - :attr:`.Interaction.namespace` will give a :class:`Namespace` object with those - values. - - Parent :func:`checks ` are ignored within an autocomplete. However, checks can be added - to the autocomplete callback and the ones added will be called. If the checks fail for any reason - then an empty list is sent as the interaction response. - - The coroutine decorator **must** return a list of :class:`~discord.app_commands.Choice` objects. - Only up to 25 objects are supported. - - .. warning:: - The choices returned from this coroutine are suggestions. The user may ignore them and input their own value. - - Example: - - .. code-block:: python3 - - @app_commands.command() - async def fruits(interaction: discord.Interaction, fruit: str): - await interaction.response.send_message(f'Your favourite fruit seems to be {fruit}') - - @fruits.autocomplete('fruit') - async def fruits_autocomplete( - interaction: discord.Interaction, - current: str, - ) -> List[app_commands.Choice[str]]: - fruits = ['Banana', 'Pineapple', 'Apple', 'Watermelon', 'Melon', 'Cherry'] - return [ - app_commands.Choice(name=fruit, value=fruit) - for fruit in fruits if current.lower() in fruit.lower() - ] - - - Parameters - ----------- - name: :class:`str` - The parameter name to register as autocomplete. - - Raises - ------- - TypeError - The coroutine passed is not actually a coroutine or - the parameter is not found or of an invalid type. - """ - - def decorator(coro: AutocompleteCallback[GroupT, ChoiceT]) -> AutocompleteCallback[GroupT, ChoiceT]: - if not inspect.iscoroutinefunction(coro): - raise TypeError('The error handler must be a coroutine.') - - try: - param = self._params[name] - except KeyError: - raise TypeError(f'unknown parameter: {name!r}') from None - - if param.type not in (AppCommandOptionType.string, AppCommandOptionType.number, AppCommandOptionType.integer): - raise TypeError('autocomplete is only supported for integer, string, or number option types') - - if param.is_choice_annotation(): - raise TypeError( - 'Choice annotation unsupported for autocomplete parameters, consider using a regular annotation instead' - ) - - param.autocomplete = validate_auto_complete_callback(coro) - return coro - - return decorator - - def add_check(self, func: Check, /) -> None: - """Adds a check to the command. - - This is the non-decorator interface to :func:`check`. - - Parameters - ----------- - func - The function that will be used as a check. - """ - - self.checks.append(func) - - def remove_check(self, func: Check, /) -> None: - """Removes a check from the command. - - This function is idempotent and will not raise an exception - if the function is not in the command's checks. - - Parameters - ----------- - func - The function to remove from the checks. - """ - - try: - self.checks.remove(func) - except ValueError: - pass - - -class ContextMenu: - """A class that implements a context menu application command. - - These are usually not created manually, instead they are created using - one of the following decorators: - - - :func:`~discord.app_commands.context_menu` - - :meth:`CommandTree.context_menu ` - - .. versionadded:: 2.0 - - Parameters - ----------- - name: Union[:class:`str`, :class:`locale_str`] - The name of the context menu. - callback: :ref:`coroutine ` - The coroutine that is executed when the command is called. - type: :class:`.AppCommandType` - The type of context menu application command. By default, this is inferred - by the parameter of the callback. - auto_locale_strings: :class:`bool` - If this is set to ``True``, then all translatable strings will implicitly - be wrapped into :class:`locale_str` rather than :class:`str`. This could - avoid some repetition and be more ergonomic for certain defaults such - as default command names, command descriptions, and parameter names. - Defaults to ``True``. - nsfw: :class:`bool` - Whether the command is NSFW and should only work in NSFW channels. - Defaults to ``False``. - extras: :class:`dict` - A dictionary that can be used to store extraneous data. - The library will not touch any values or keys within this dictionary. - - Attributes - ------------ - name: :class:`str` - The name of the context menu. - type: :class:`.AppCommandType` - The type of context menu application command. By default, this is inferred - by the parameter of the callback. - default_permissions: Optional[:class:`~discord.Permissions`] - The default permissions that can execute this command on Discord. Note - that server administrators can override this value in the client. - Setting an empty permissions field will disallow anyone except server - administrators from using the command in a guild. - guild_only: :class:`bool` - Whether the command should only be usable in guild contexts. - Defaults to ``False``. - nsfw: :class:`bool` - Whether the command is NSFW and should only work in NSFW channels. - Defaults to ``False``. - checks - A list of predicates that take a :class:`~discord.Interaction` parameter - to indicate whether the command callback should be executed. If an exception - is necessary to be thrown to signal failure, then one inherited from - :exc:`AppCommandError` should be used. If all the checks fail without - propagating an exception, :exc:`CheckFailure` is raised. - extras: :class:`dict` - A dictionary that can be used to store extraneous data. - The library will not touch any values or keys within this dictionary. - """ - - def __init__( - self, - *, - name: Union[str, locale_str], - callback: ContextMenuCallback, - type: AppCommandType = MISSING, - nsfw: bool = False, - guild_ids: Optional[List[int]] = None, - auto_locale_strings: bool = True, - extras: Dict[Any, Any] = MISSING, - ): - name, locale = (name.message, name) if isinstance(name, locale_str) else (name, None) - self.name: str = validate_context_menu_name(name) - self._locale_name: Optional[locale_str] = locale - self._callback: ContextMenuCallback = callback - (param, annotation, actual_type) = _get_context_menu_parameter(callback) - if type is MISSING: - type = actual_type - - if actual_type != type: - raise ValueError(f'context menu callback implies a type of {actual_type} but {type} was passed.') - - self.type: AppCommandType = type - self._param_name = param - self._annotation = annotation - self.module: Optional[str] = callback.__module__ - self._guild_ids = guild_ids or getattr(callback, '__discord_app_commands_default_guilds__', None) - self.on_error: Optional[UnboundError] = None - self.default_permissions: Optional[Permissions] = getattr( - callback, '__discord_app_commands_default_permissions__', None - ) - self.nsfw: bool = nsfw - self.guild_only: bool = getattr(callback, '__discord_app_commands_guild_only__', False) - self.checks: List[Check] = getattr(callback, '__discord_app_commands_checks__', []) - self.extras: Dict[Any, Any] = extras or {} - - if auto_locale_strings: - if self._locale_name is None: - self._locale_name = locale_str(self.name) - - @property - def callback(self) -> ContextMenuCallback: - """:ref:`coroutine `: The coroutine that is executed when the context menu is called.""" - return self._callback - - @property - def qualified_name(self) -> str: - """:class:`str`: Returns the fully qualified command name.""" - return self.name - - async def get_translated_payload(self, translator: Translator) -> Dict[str, Any]: - base = self.to_dict() - context = TranslationContext(location=TranslationContextLocation.command_name, data=self) - if self._locale_name: - name_localizations: Dict[str, str] = {} - for locale in Locale: - translation = await translator._checked_translate(self._locale_name, locale, context) - if translation is not None: - name_localizations[locale.value] = translation - - base['name_localizations'] = name_localizations - return base - - def to_dict(self) -> Dict[str, Any]: - return { - 'name': self.name, - 'type': self.type.value, - 'dm_permission': not self.guild_only, - 'default_member_permissions': None if self.default_permissions is None else self.default_permissions.value, - 'nsfw': self.nsfw, - } - - async def _check_can_run(self, interaction: Interaction) -> bool: - predicates = self.checks - if not predicates: - return True - - return await async_all(f(interaction) for f in predicates) - - def _has_any_error_handlers(self) -> bool: - return self.on_error is not None - - async def _invoke(self, interaction: Interaction, arg: Any): - try: - if not await self._check_can_run(interaction): - raise CheckFailure(f'The check functions for context menu {self.name!r} failed.') - - await self._callback(interaction, arg) - except AppCommandError: - raise - except Exception as e: - raise CommandInvokeError(self, e) from e - - def error(self, coro: UnboundError) -> UnboundError: - """A decorator that registers a coroutine as a local error handler. - - The local error handler is called whenever an exception is raised in the body - of the command or during handling of the command. The error handler must take - 2 parameters, the interaction and the error. - - The error passed will be derived from :exc:`AppCommandError`. - - Parameters - ----------- - coro: :ref:`coroutine ` - The coroutine to register as the local error handler. - - Raises - ------- - TypeError - The coroutine passed is not actually a coroutine. - """ - - if not inspect.iscoroutinefunction(coro): - raise TypeError('The error handler must be a coroutine.') - - self.on_error = coro - return coro - - def add_check(self, func: Check, /) -> None: - """Adds a check to the command. - - This is the non-decorator interface to :func:`check`. - - Parameters - ----------- - func - The function that will be used as a check. - """ - - self.checks.append(func) - - def remove_check(self, func: Check, /) -> None: - """Removes a check from the command. - - This function is idempotent and will not raise an exception - if the function is not in the command's checks. - - Parameters - ----------- - func - The function to remove from the checks. - """ - - try: - self.checks.remove(func) - except ValueError: - pass - - -class Group: - """A class that implements an application command group. - - These are usually inherited rather than created manually. - - Decorators such as :func:`guild_only`, :func:`guilds`, and :func:`default_permissions` - will apply to the group if used on top of a subclass. For example: - - .. code-block:: python3 - - from discord import app_commands - - @app_commands.guild_only() - class MyGroup(app_commands.Group): - pass - - .. versionadded:: 2.0 - - Parameters - ----------- - name: Union[:class:`str`, :class:`locale_str`] - The name of the group. If not given, it defaults to a lower-case - kebab-case version of the class name. - description: Union[:class:`str`, :class:`locale_str`] - The description of the group. This shows up in the UI to describe - the group. If not given, it defaults to the docstring of the - class shortened to 100 characters. - auto_locale_strings: :class:`bool` - If this is set to ``True``, then all translatable strings will implicitly - be wrapped into :class:`locale_str` rather than :class:`str`. This could - avoid some repetition and be more ergonomic for certain defaults such - as default command names, command descriptions, and parameter names. - Defaults to ``True``. - default_permissions: Optional[:class:`~discord.Permissions`] - The default permissions that can execute this group on Discord. Note - that server administrators can override this value in the client. - Setting an empty permissions field will disallow anyone except server - administrators from using the command in a guild. - - Due to a Discord limitation, this does not work on subcommands. - guild_only: :class:`bool` - Whether the group should only be usable in guild contexts. - Defaults to ``False``. - - Due to a Discord limitation, this does not work on subcommands. - nsfw: :class:`bool` - Whether the command is NSFW and should only work in NSFW channels. - Defaults to ``False``. - - Due to a Discord limitation, this does not work on subcommands. - parent: Optional[:class:`Group`] - The parent application command. ``None`` if there isn't one. - extras: :class:`dict` - A dictionary that can be used to store extraneous data. - The library will not touch any values or keys within this dictionary. - - Attributes - ------------ - name: :class:`str` - The name of the group. - description: :class:`str` - The description of the group. This shows up in the UI to describe - the group. - default_permissions: Optional[:class:`~discord.Permissions`] - The default permissions that can execute this group on Discord. Note - that server administrators can override this value in the client. - Setting an empty permissions field will disallow anyone except server - administrators from using the command in a guild. - - Due to a Discord limitation, this does not work on subcommands. - guild_only: :class:`bool` - Whether the group should only be usable in guild contexts. - - Due to a Discord limitation, this does not work on subcommands. - nsfw: :class:`bool` - Whether the command is NSFW and should only work in NSFW channels. - - Due to a Discord limitation, this does not work on subcommands. - parent: Optional[:class:`Group`] - The parent group. ``None`` if there isn't one. - extras: :class:`dict` - A dictionary that can be used to store extraneous data. - The library will not touch any values or keys within this dictionary. - """ - - __discord_app_commands_group_children__: ClassVar[List[Union[Command[Any, ..., Any], Group]]] = [] - __discord_app_commands_skip_init_binding__: bool = False - __discord_app_commands_group_name__: str = MISSING - __discord_app_commands_group_description__: str = MISSING - __discord_app_commands_group_locale_name__: Optional[locale_str] = None - __discord_app_commands_group_locale_description__: Optional[locale_str] = None - __discord_app_commands_group_nsfw__: bool = False - __discord_app_commands_guild_only__: bool = MISSING - __discord_app_commands_default_permissions__: Optional[Permissions] = MISSING - __discord_app_commands_has_module__: bool = False - __discord_app_commands_error_handler__: Optional[ - Callable[[Interaction, AppCommandError], Coroutine[Any, Any, None]] - ] = None - - def __init_subclass__( - cls, - *, - name: Union[str, locale_str] = MISSING, - description: Union[str, locale_str] = MISSING, - guild_only: bool = MISSING, - nsfw: bool = False, - default_permissions: Optional[Permissions] = MISSING, - ) -> None: - if not cls.__discord_app_commands_group_children__: - children: List[Union[Command[Any, ..., Any], Group]] = [ - member for member in cls.__dict__.values() if isinstance(member, (Group, Command)) and member.parent is None - ] - - cls.__discord_app_commands_group_children__ = children - - found = set() - for child in children: - if child.name in found: - raise TypeError(f'Command {child.name!r} is a duplicate') - found.add(child.name) - - if len(children) > 25: - raise TypeError('groups cannot have more than 25 commands') - - if name is MISSING: - cls.__discord_app_commands_group_name__ = validate_name(_to_kebab_case(cls.__name__)) - elif isinstance(name, str): - cls.__discord_app_commands_group_name__ = validate_name(name) - else: - cls.__discord_app_commands_group_name__ = validate_name(name.message) - cls.__discord_app_commands_group_locale_name__ = name - - if description is MISSING: - if cls.__doc__ is None: - cls.__discord_app_commands_group_description__ = '…' - else: - cls.__discord_app_commands_group_description__ = _shorten(cls.__doc__) - elif isinstance(description, str): - cls.__discord_app_commands_group_description__ = description - else: - cls.__discord_app_commands_group_description__ = description.message - cls.__discord_app_commands_group_locale_description__ = description - - if guild_only is not MISSING: - cls.__discord_app_commands_guild_only__ = guild_only - - if default_permissions is not MISSING: - cls.__discord_app_commands_default_permissions__ = default_permissions - - if cls.__module__ != __name__: - cls.__discord_app_commands_has_module__ = True - cls.__discord_app_commands_group_nsfw__ = nsfw - - def __init__( - self, - *, - name: Union[str, locale_str] = MISSING, - description: Union[str, locale_str] = MISSING, - parent: Optional[Group] = None, - guild_ids: Optional[List[int]] = None, - guild_only: bool = MISSING, - nsfw: bool = MISSING, - auto_locale_strings: bool = True, - default_permissions: Optional[Permissions] = MISSING, - extras: Dict[Any, Any] = MISSING, - ): - cls = self.__class__ - - if name is MISSING: - name, locale = cls.__discord_app_commands_group_name__, cls.__discord_app_commands_group_locale_name__ - elif isinstance(name, str): - name, locale = validate_name(name), None - else: - name, locale = validate_name(name.message), name - self.name: str = name - self._locale_name: Optional[locale_str] = locale - - if description is MISSING: - description, locale = ( - cls.__discord_app_commands_group_description__, - cls.__discord_app_commands_group_locale_description__, - ) - elif isinstance(description, str): - description, locale = description, None - else: - description, locale = description.message, description - self.description: str = description - self._locale_description: Optional[locale_str] = locale - - self._attr: Optional[str] = None - self._owner_cls: Optional[Type[Any]] = None - self._guild_ids: Optional[List[int]] = guild_ids or getattr(cls, '__discord_app_commands_default_guilds__', None) - - if default_permissions is MISSING: - if cls.__discord_app_commands_default_permissions__ is MISSING: - default_permissions = None - else: - default_permissions = cls.__discord_app_commands_default_permissions__ - - self.default_permissions: Optional[Permissions] = default_permissions - - if guild_only is MISSING: - if cls.__discord_app_commands_guild_only__ is MISSING: - guild_only = False - else: - guild_only = cls.__discord_app_commands_guild_only__ - - self.guild_only: bool = guild_only - - if nsfw is MISSING: - nsfw = cls.__discord_app_commands_group_nsfw__ - - self.nsfw: bool = nsfw - - if not self.description: - raise TypeError('groups must have a description') - - self.parent: Optional[Group] = parent - self.module: Optional[str] - if cls.__discord_app_commands_has_module__: - self.module = cls.__module__ - else: - try: - # This is pretty hacky - # It allows the module to be fetched if someone just constructs a bare Group object though. - self.module = inspect.currentframe().f_back.f_globals['__name__'] # type: ignore - except (AttributeError, IndexError, KeyError): - self.module = None - - self._children: Dict[str, Union[Command, Group]] = {} - self.extras: Dict[Any, Any] = extras or {} - - bindings: Dict[Group, Group] = {} - - for child in self.__discord_app_commands_group_children__: - # commands and groups created directly in this class (no parent) - copy = ( - child._copy_with(parent=self, binding=self, bindings=bindings, set_on_binding=False) - if not cls.__discord_app_commands_skip_init_binding__ - else child - ) - - self._children[copy.name] = copy - if copy._attr and not cls.__discord_app_commands_skip_init_binding__: - setattr(self, copy._attr, copy) - - if parent is not None: - if parent.parent is not None: - raise ValueError('groups can only be nested at most one level') - parent.add_command(self) - - if auto_locale_strings: - self._convert_to_locale_strings() - - def _convert_to_locale_strings(self) -> None: - if self._locale_name is None: - self._locale_name = locale_str(self.name) - if self._locale_description is None: - self._locale_description = locale_str(self.description) - - # I don't know if propagating to the children is the right behaviour here. - - def __set_name__(self, owner: Type[Any], name: str) -> None: - self._attr = name - self.module = owner.__module__ - self._owner_cls = owner - - def _copy_with( - self, - *, - parent: Optional[Group], - binding: Binding, - bindings: MutableMapping[Group, Group] = MISSING, - set_on_binding: bool = True, - ) -> Group: - bindings = {} if bindings is MISSING else bindings - - copy = shallow_copy(self) - copy.parent = parent - copy._children = {} - - bindings[self] = copy - - for child in self._children.values(): - child_copy = child._copy_with(parent=copy, binding=binding, bindings=bindings) - child_copy.parent = copy - copy._children[child_copy.name] = child_copy - - if isinstance(child_copy, Group) and child_copy._attr and set_on_binding: - if binding.__class__ is child_copy._owner_cls: - setattr(binding, child_copy._attr, child_copy) - elif child_copy._owner_cls is copy.__class__: - setattr(copy, child_copy._attr, child_copy) - - if copy._attr and set_on_binding: - setattr(parent or binding, copy._attr, copy) - - return copy - - async def get_translated_payload(self, translator: Translator) -> Dict[str, Any]: - base = self.to_dict() - name_localizations: Dict[str, str] = {} - description_localizations: Dict[str, str] = {} - - # Prevent creating these objects in a heavy loop - name_context = TranslationContext(location=TranslationContextLocation.group_name, data=self) - description_context = TranslationContext(location=TranslationContextLocation.group_description, data=self) - for locale in Locale: - if self._locale_name: - translation = await translator._checked_translate(self._locale_name, locale, name_context) - if translation is not None: - name_localizations[locale.value] = translation - - if self._locale_description: - translation = await translator._checked_translate(self._locale_description, locale, description_context) - if translation is not None: - description_localizations[locale.value] = translation - - base['name_localizations'] = name_localizations - base['description_localizations'] = description_localizations - base['options'] = [await child.get_translated_payload(translator) for child in self._children.values()] - return base - - def to_dict(self) -> Dict[str, Any]: - # If this has a parent command then it's part of a subcommand group - # Otherwise, it's just a regular command - option_type = 1 if self.parent is None else AppCommandOptionType.subcommand_group.value - base: Dict[str, Any] = { - 'name': self.name, - 'description': self.description, - 'type': option_type, - 'options': [child.to_dict() for child in self._children.values()], - } - - if self.parent is None: - base['nsfw'] = self.nsfw - base['dm_permission'] = not self.guild_only - base['default_member_permissions'] = None if self.default_permissions is None else self.default_permissions.value - - return base - - @property - def root_parent(self) -> Optional[Group]: - """Optional[:class:`Group`]: The parent of this group.""" - return self.parent - - @property - def qualified_name(self) -> str: - """:class:`str`: Returns the fully qualified group name. - - The qualified name includes the parent name as well. For example, - in a group like ``/foo bar`` the qualified name is ``foo bar``. - """ - - if self.parent is None: - return self.name - return f'{self.parent.name} {self.name}' - - def _get_internal_command(self, name: str) -> Optional[Union[Command[Any, ..., Any], Group]]: - return self._children.get(name) - - @property - def commands(self) -> List[Union[Command[Any, ..., Any], Group]]: - """List[Union[:class:`Command`, :class:`Group`]]: The commands that this group contains.""" - return list(self._children.values()) - - def walk_commands(self) -> Generator[Union[Command[Any, ..., Any], Group], None, None]: - """An iterator that recursively walks through all commands that this group contains. - - Yields - --------- - Union[:class:`Command`, :class:`Group`] - The commands in this group. - """ - - for command in self._children.values(): - yield command - if isinstance(command, Group): - yield from command.walk_commands() - - @mark_overrideable - async def on_error(self, interaction: Interaction, error: AppCommandError, /) -> None: - """|coro| - - A callback that is called when a child's command raises an :exc:`AppCommandError`. - - To get the command that failed, :attr:`discord.Interaction.command` should be used. - - The default implementation does nothing. - - Parameters - ----------- - interaction: :class:`~discord.Interaction` - The interaction that is being handled. - error: :exc:`AppCommandError` - The exception that was raised. - """ - - pass - - def error(self, coro: ErrorFunc) -> ErrorFunc: - """A decorator that registers a coroutine as a local error handler. - - The local error handler is called whenever an exception is raised in a child command. - The error handler must take 2 parameters, the interaction and the error. - - The error passed will be derived from :exc:`AppCommandError`. - - Parameters - ----------- - coro: :ref:`coroutine ` - The coroutine to register as the local error handler. - - Raises - ------- - TypeError - The coroutine passed is not actually a coroutine, or is an invalid coroutine. - """ - - if not inspect.iscoroutinefunction(coro): - raise TypeError('The error handler must be a coroutine.') - - params = inspect.signature(coro).parameters - if len(params) != 2: - raise TypeError('The error handler must have 2 parameters.') - - self.on_error = coro - return coro - - async def interaction_check(self, interaction: Interaction, /) -> bool: - """|coro| - - A callback that is called when an interaction happens within the group - that checks whether a command inside the group should be executed. - - This is useful to override if, for example, you want to ensure that the - interaction author is a given user. - - The default implementation of this returns ``True``. - - .. note:: - - If an exception occurs within the body then the check - is considered a failure and error handlers such as - :meth:`on_error` is called. See :exc:`AppCommandError` - for more information. - - Parameters - ----------- - interaction: :class:`~discord.Interaction` - The interaction that occurred. - - Returns - --------- - :class:`bool` - Whether the view children's callbacks should be called. - """ - - return True - - def add_command(self, command: Union[Command[Any, ..., Any], Group], /, *, override: bool = False) -> None: - """Adds a command or group to this group's internal list of commands. - - Parameters - ----------- - command: Union[:class:`Command`, :class:`Group`] - The command or group to add. - override: :class:`bool` - Whether to override a pre-existing command or group with the same name. - If ``False`` then an exception is raised. - - Raises - ------- - CommandAlreadyRegistered - The command or group is already registered. Note that the :attr:`CommandAlreadyRegistered.guild_id` - attribute will always be ``None`` in this case. - ValueError - There are too many commands already registered or the group is too - deeply nested. - TypeError - The wrong command type was passed. - """ - - if not isinstance(command, (Command, Group)): - raise TypeError(f'expected Command or Group not {command.__class__.__name__}') - - if isinstance(command, Group) and self.parent is not None: - # In a tree like so: - # - # - # - # this needs to be forbidden - raise ValueError(f'{command.name!r} is too nested, groups can only be nested at most one level') - - if not override and command.name in self._children: - raise CommandAlreadyRegistered(command.name, guild_id=None) - - self._children[command.name] = command - command.parent = self - if len(self._children) > 25: - raise ValueError('maximum number of child commands exceeded') - - def remove_command(self, name: str, /) -> Optional[Union[Command[Any, ..., Any], Group]]: - """Removes a command or group from the internal list of commands. - - Parameters - ----------- - name: :class:`str` - The name of the command or group to remove. - - Returns - -------- - Optional[Union[:class:`~discord.app_commands.Command`, :class:`~discord.app_commands.Group`]] - The command that was removed. If nothing was removed - then ``None`` is returned instead. - """ - - self._children.pop(name, None) - - def get_command(self, name: str, /) -> Optional[Union[Command[Any, ..., Any], Group]]: - """Retrieves a command or group from its name. - - Parameters - ----------- - name: :class:`str` - The name of the command or group to retrieve. - - Returns - -------- - Optional[Union[:class:`~discord.app_commands.Command`, :class:`~discord.app_commands.Group`]] - The command or group that was retrieved. If nothing was found - then ``None`` is returned instead. - """ - return self._children.get(name) - - def command( - self, - *, - name: Union[str, locale_str] = MISSING, - description: Union[str, locale_str] = MISSING, - nsfw: bool = False, - auto_locale_strings: bool = True, - extras: Dict[Any, Any] = MISSING, - ) -> Callable[[CommandCallback[GroupT, P, T]], Command[GroupT, P, T]]: - """A decorator that creates an application command from a regular function under this group. - - Parameters - ------------ - name: Union[:class:`str`, :class:`locale_str`] - The name of the application command. If not given, it defaults to a lower-case - version of the callback name. - description: Union[:class:`str`, :class:`locale_str`] - The description of the application command. This shows up in the UI to describe - the application command. If not given, it defaults to the first line of the docstring - of the callback shortened to 100 characters. - nsfw: :class:`bool` - Whether the command is NSFW and should only work in NSFW channels. Defaults to ``False``. - auto_locale_strings: :class:`bool` - If this is set to ``True``, then all translatable strings will implicitly - be wrapped into :class:`locale_str` rather than :class:`str`. This could - avoid some repetition and be more ergonomic for certain defaults such - as default command names, command descriptions, and parameter names. - Defaults to ``True``. - extras: :class:`dict` - A dictionary that can be used to store extraneous data. - The library will not touch any values or keys within this dictionary. - """ - - def decorator(func: CommandCallback[GroupT, P, T]) -> Command[GroupT, P, T]: - if not inspect.iscoroutinefunction(func): - raise TypeError('command function must be a coroutine function') - - if description is MISSING: - if func.__doc__ is None: - desc = '…' - else: - desc = _shorten(func.__doc__) - else: - desc = description - - command = Command( - name=name if name is not MISSING else func.__name__, - description=desc, - callback=func, - nsfw=nsfw, - parent=self, - auto_locale_strings=auto_locale_strings, - extras=extras, - ) - self.add_command(command) - return command - - return decorator - - -def command( - *, - name: Union[str, locale_str] = MISSING, - description: Union[str, locale_str] = MISSING, - nsfw: bool = False, - auto_locale_strings: bool = True, - extras: Dict[Any, Any] = MISSING, -) -> Callable[[CommandCallback[GroupT, P, T]], Command[GroupT, P, T]]: - """Creates an application command from a regular function. - - Parameters - ------------ - name: :class:`str` - The name of the application command. If not given, it defaults to a lower-case - version of the callback name. - description: :class:`str` - The description of the application command. This shows up in the UI to describe - the application command. If not given, it defaults to the first line of the docstring - of the callback shortened to 100 characters. - nsfw: :class:`bool` - Whether the command is NSFW and should only work in NSFW channels. Defaults to ``False``. - - Due to a Discord limitation, this does not work on subcommands. - auto_locale_strings: :class:`bool` - If this is set to ``True``, then all translatable strings will implicitly - be wrapped into :class:`locale_str` rather than :class:`str`. This could - avoid some repetition and be more ergonomic for certain defaults such - as default command names, command descriptions, and parameter names. - Defaults to ``True``. - extras: :class:`dict` - A dictionary that can be used to store extraneous data. - The library will not touch any values or keys within this dictionary. - """ - - def decorator(func: CommandCallback[GroupT, P, T]) -> Command[GroupT, P, T]: - if not inspect.iscoroutinefunction(func): - raise TypeError('command function must be a coroutine function') - - if description is MISSING: - if func.__doc__ is None: - desc = '…' - else: - desc = _shorten(func.__doc__) - else: - desc = description - - return Command( - name=name if name is not MISSING else func.__name__, - description=desc, - callback=func, - parent=None, - nsfw=nsfw, - auto_locale_strings=auto_locale_strings, - extras=extras, - ) - - return decorator - - -def context_menu( - *, - name: Union[str, locale_str] = MISSING, - nsfw: bool = False, - auto_locale_strings: bool = True, - extras: Dict[Any, Any] = MISSING, -) -> Callable[[ContextMenuCallback], ContextMenu]: - """Creates an application command context menu from a regular function. - - This function must have a signature of :class:`~discord.Interaction` as its first parameter - and taking either a :class:`~discord.Member`, :class:`~discord.User`, or :class:`~discord.Message`, - or a :obj:`typing.Union` of ``Member`` and ``User`` as its second parameter. - - Examples - --------- - - .. code-block:: python3 - - @app_commands.context_menu() - async def react(interaction: discord.Interaction, message: discord.Message): - await interaction.response.send_message('Very cool message!', ephemeral=True) - - @app_commands.context_menu() - async def ban(interaction: discord.Interaction, user: discord.Member): - await interaction.response.send_message(f'Should I actually ban {user}...', ephemeral=True) - - Parameters - ------------ - name: Union[:class:`str`, :class:`locale_str`] - The name of the context menu command. If not given, it defaults to a title-case - version of the callback name. Note that unlike regular slash commands this can - have spaces and upper case characters in the name. - nsfw: :class:`bool` - Whether the command is NSFW and should only work in NSFW channels. Defaults to ``False``. - - Due to a Discord limitation, this does not work on subcommands. - auto_locale_strings: :class:`bool` - If this is set to ``True``, then all translatable strings will implicitly - be wrapped into :class:`locale_str` rather than :class:`str`. This could - avoid some repetition and be more ergonomic for certain defaults such - as default command names, command descriptions, and parameter names. - Defaults to ``True``. - extras: :class:`dict` - A dictionary that can be used to store extraneous data. - The library will not touch any values or keys within this dictionary. - """ - - def decorator(func: ContextMenuCallback) -> ContextMenu: - if not inspect.iscoroutinefunction(func): - raise TypeError('context menu function must be a coroutine function') - - actual_name = func.__name__.title() if name is MISSING else name - return ContextMenu( - name=actual_name, - nsfw=nsfw, - callback=func, - auto_locale_strings=auto_locale_strings, - extras=extras, - ) - - return decorator - - -def describe(**parameters: Union[str, locale_str]) -> Callable[[T], T]: - r'''Describes the given parameters by their name using the key of the keyword argument - as the name. - - Example: - - .. code-block:: python3 - - @app_commands.command(description='Bans a member') - @app_commands.describe(member='the member to ban') - async def ban(interaction: discord.Interaction, member: discord.Member): - await interaction.response.send_message(f'Banned {member}') - - Alternatively, you can describe parameters using Google, Sphinx, or Numpy style docstrings. - - Example: - - .. code-block:: python3 - - @app_commands.command() - async def ban(interaction: discord.Interaction, member: discord.Member): - """Bans a member - - Parameters - ----------- - member: discord.Member - the member to ban - """ - await interaction.response.send_message(f'Banned {member}') - - Parameters - ----------- - \*\*parameters: Union[:class:`str`, :class:`locale_str`] - The description of the parameters. - - Raises - -------- - TypeError - The parameter name is not found. - ''' - - def decorator(inner: T) -> T: - if isinstance(inner, Command): - _populate_descriptions(inner._params, parameters) - else: - try: - inner.__discord_app_commands_param_description__.update(parameters) # type: ignore # Runtime attribute access - except AttributeError: - inner.__discord_app_commands_param_description__ = parameters # type: ignore # Runtime attribute assignment - - return inner - - return decorator - - -def rename(**parameters: Union[str, locale_str]) -> Callable[[T], T]: - r"""Renames the given parameters by their name using the key of the keyword argument - as the name. - - This renames the parameter within the Discord UI. When referring to the parameter in other - decorators, the parameter name used in the function is used instead of the renamed one. - - Example: - - .. code-block:: python3 - - @app_commands.command() - @app_commands.rename(the_member_to_ban='member') - async def ban(interaction: discord.Interaction, the_member_to_ban: discord.Member): - await interaction.response.send_message(f'Banned {the_member_to_ban}') - - Parameters - ----------- - \*\*parameters: Union[:class:`str`, :class:`locale_str`] - The name of the parameters. - - Raises - -------- - ValueError - The parameter name is already used by another parameter. - TypeError - The parameter name is not found. - """ - - def decorator(inner: T) -> T: - if isinstance(inner, Command): - _populate_renames(inner._params, parameters) - else: - try: - inner.__discord_app_commands_param_rename__.update(parameters) # type: ignore # Runtime attribute access - except AttributeError: - inner.__discord_app_commands_param_rename__ = parameters # type: ignore # Runtime attribute assignment - - return inner - - return decorator - - -def choices(**parameters: List[Choice[ChoiceT]]) -> Callable[[T], T]: - r"""Instructs the given parameters by their name to use the given choices for their choices. - - Example: - - .. code-block:: python3 - - @app_commands.command() - @app_commands.describe(fruits='fruits to choose from') - @app_commands.choices(fruits=[ - Choice(name='apple', value=1), - Choice(name='banana', value=2), - Choice(name='cherry', value=3), - ]) - async def fruit(interaction: discord.Interaction, fruits: Choice[int]): - await interaction.response.send_message(f'Your favourite fruit is {fruits.name}.') - - .. note:: - - This is not the only way to provide choices to a command. There are two more ergonomic ways - of doing this. The first one is to use a :obj:`typing.Literal` annotation: - - .. code-block:: python3 - - @app_commands.command() - @app_commands.describe(fruits='fruits to choose from') - async def fruit(interaction: discord.Interaction, fruits: Literal['apple', 'banana', 'cherry']): - await interaction.response.send_message(f'Your favourite fruit is {fruits}.') - - The second way is to use an :class:`enum.Enum`: - - .. code-block:: python3 - - class Fruits(enum.Enum): - apple = 1 - banana = 2 - cherry = 3 - - @app_commands.command() - @app_commands.describe(fruits='fruits to choose from') - async def fruit(interaction: discord.Interaction, fruits: Fruits): - await interaction.response.send_message(f'Your favourite fruit is {fruits}.') - - - Parameters - ----------- - \*\*parameters - The choices of the parameters. - - Raises - -------- - TypeError - The parameter name is not found or the parameter type was incorrect. - """ - - def decorator(inner: T) -> T: - if isinstance(inner, Command): - _populate_choices(inner._params, parameters) - else: - try: - inner.__discord_app_commands_param_choices__.update(parameters) # type: ignore # Runtime attribute access - except AttributeError: - inner.__discord_app_commands_param_choices__ = parameters # type: ignore # Runtime attribute assignment - - return inner - - return decorator - - -def autocomplete(**parameters: AutocompleteCallback[GroupT, ChoiceT]) -> Callable[[T], T]: - r"""Associates the given parameters with the given autocomplete callback. - - Autocomplete is only supported on types that have :class:`str`, :class:`int`, or :class:`float` - values. - - :func:`Checks ` are supported, however they must be attached to the autocomplete - callback in order to work. Checks attached to the command are ignored when invoking the autocomplete - callback. - - For more information, see the :meth:`Command.autocomplete` documentation. - - .. warning:: - The choices returned from this coroutine are suggestions. The user may ignore them and input their own value. - - Example: - - .. code-block:: python3 - - async def fruit_autocomplete( - interaction: discord.Interaction, - current: str, - ) -> List[app_commands.Choice[str]]: - fruits = ['Banana', 'Pineapple', 'Apple', 'Watermelon', 'Melon', 'Cherry'] - return [ - app_commands.Choice(name=fruit, value=fruit) - for fruit in fruits if current.lower() in fruit.lower() - ] - - @app_commands.command() - @app_commands.autocomplete(fruit=fruit_autocomplete) - async def fruits(interaction: discord.Interaction, fruit: str): - await interaction.response.send_message(f'Your favourite fruit seems to be {fruit}') - - Parameters - ----------- - \*\*parameters - The parameters to mark as autocomplete. - - Raises - -------- - TypeError - The parameter name is not found or the parameter type was incorrect. - """ - - def decorator(inner: T) -> T: - if isinstance(inner, Command): - _populate_autocomplete(inner._params, parameters) - else: - try: - inner.__discord_app_commands_param_autocomplete__.update(parameters) # type: ignore # Runtime attribute access - except AttributeError: - inner.__discord_app_commands_param_autocomplete__ = parameters # type: ignore # Runtime attribute assignment - - return inner - - return decorator - - -def guilds(*guild_ids: Union[Snowflake, int]) -> Callable[[T], T]: - r"""Associates the given guilds with the command. - - When the command instance is added to a :class:`CommandTree`, the guilds that are - specified by this decorator become the default guilds that it's added to rather - than being a global command. - - .. note:: - - Due to an implementation quirk and Python limitation, if this is used in conjunction - with the :meth:`CommandTree.command` or :meth:`CommandTree.context_menu` decorator - then this must go below that decorator. - - Example: - - .. code-block:: python3 - - MY_GUILD_ID = discord.Object(...) # Guild ID here - - @app_commands.command() - @app_commands.guilds(MY_GUILD_ID) - async def bonk(interaction: discord.Interaction): - await interaction.response.send_message('Bonk', ephemeral=True) - - Parameters - ----------- - \*guild_ids: Union[:class:`int`, :class:`~discord.abc.Snowflake`] - The guilds to associate this command with. The command tree will - use this as the default when added rather than adding it as a global - command. - """ - - defaults: List[int] = [g if isinstance(g, int) else g.id for g in guild_ids] - - def decorator(inner: T) -> T: - if isinstance(inner, (Group, ContextMenu)): - inner._guild_ids = defaults - elif isinstance(inner, Command): - if inner.parent is not None: - raise ValueError('child commands of a group cannot have default guilds set') - - inner._guild_ids = defaults - else: - # Runtime attribute assignment - inner.__discord_app_commands_default_guilds__ = defaults # type: ignore - - return inner - - return decorator - - -def check(predicate: Check) -> Callable[[T], T]: - r"""A decorator that adds a check to an application command. - - These checks should be predicates that take in a single parameter taking - a :class:`~discord.Interaction`. If the check returns a ``False``\-like value then - during invocation a :exc:`CheckFailure` exception is raised and sent to - the appropriate error handlers. - - These checks can be either a coroutine or not. - - Examples - --------- - - Creating a basic check to see if the command invoker is you. - - .. code-block:: python3 - - def check_if_it_is_me(interaction: discord.Interaction) -> bool: - return interaction.user.id == 85309593344815104 - - @tree.command() - @app_commands.check(check_if_it_is_me) - async def only_for_me(interaction: discord.Interaction): - await interaction.response.send_message('I know you!', ephemeral=True) - - Transforming common checks into its own decorator: - - .. code-block:: python3 - - def is_me(): - def predicate(interaction: discord.Interaction) -> bool: - return interaction.user.id == 85309593344815104 - return app_commands.check(predicate) - - @tree.command() - @is_me() - async def only_me(interaction: discord.Interaction): - await interaction.response.send_message('Only you!') - - Parameters - ----------- - predicate: Callable[[:class:`~discord.Interaction`], :class:`bool`] - The predicate to check if the command should be invoked. - """ - - def decorator(func: CheckInputParameter) -> CheckInputParameter: - if isinstance(func, (Command, ContextMenu)): - func.checks.append(predicate) - else: - if not hasattr(func, '__discord_app_commands_checks__'): - func.__discord_app_commands_checks__ = [] - - func.__discord_app_commands_checks__.append(predicate) - - return func - - return decorator # type: ignore - - -@overload -def guild_only(func: None = ...) -> Callable[[T], T]: - ... - - -@overload -def guild_only(func: T) -> T: - ... - - -def guild_only(func: Optional[T] = None) -> Union[T, Callable[[T], T]]: - """A decorator that indicates this command can only be used in a guild context. - - This is **not** implemented as a :func:`check`, and is instead verified by Discord server side. - Therefore, there is no error handler called when a command is used within a private message. - - This decorator can be called with or without parentheses. - - Due to a Discord limitation, this decorator does nothing in subcommands and is ignored. - - Examples - --------- - - .. code-block:: python3 - - @app_commands.command() - @app_commands.guild_only() - async def my_guild_only_command(interaction: discord.Interaction) -> None: - await interaction.response.send_message('I am only available in guilds!') - """ - - def inner(f: T) -> T: - if isinstance(f, (Command, Group, ContextMenu)): - f.guild_only = True - else: - f.__discord_app_commands_guild_only__ = True # type: ignore # Runtime attribute assignment - return f - - # Check if called with parentheses or not - if func is None: - # Called with parentheses - return inner - else: - return inner(func) - - -def default_permissions(**perms: bool) -> Callable[[T], T]: - r"""A decorator that sets the default permissions needed to execute this command. - - When this decorator is used, by default users must have these permissions to execute the command. - However, an administrator can change the permissions needed to execute this command using the official - client. Therefore, this only serves as a hint. - - Setting an empty permissions field, including via calling this with no arguments, will disallow anyone - except server administrators from using the command in a guild. - - This is sent to Discord server side, and is not a :func:`check`. Therefore, error handlers are not called. - - Due to a Discord limitation, this decorator does nothing in subcommands and is ignored. - - .. warning:: - - This serves as a *hint* and members are *not* required to have the permissions given to actually - execute this command. If you want to ensure that members have the permissions needed, consider using - :func:`~discord.app_commands.checks.has_permissions` instead. - - Parameters - ----------- - \*\*perms: :class:`bool` - Keyword arguments denoting the permissions to set as the default. - - Example - --------- - - .. code-block:: python3 - - @app_commands.command() - @app_commands.default_permissions(manage_messages=True) - async def test(interaction: discord.Interaction): - await interaction.response.send_message('You may or may not have manage messages.') - """ - - permissions = Permissions(**perms) - - def decorator(func: T) -> T: - if isinstance(func, (Command, Group, ContextMenu)): - func.default_permissions = permissions - else: - func.__discord_app_commands_default_permissions__ = permissions # type: ignore # Runtime attribute assignment - - return func - - return decorator diff --git a/.venv/Lib/site-packages/discord/app_commands/errors.py b/.venv/Lib/site-packages/discord/app_commands/errors.py deleted file mode 100644 index 3cc12c7..0000000 --- a/.venv/Lib/site-packages/discord/app_commands/errors.py +++ /dev/null @@ -1,537 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -from typing import Any, TYPE_CHECKING, List, Optional, Sequence, Union - -from ..enums import AppCommandOptionType, AppCommandType, Locale -from ..errors import DiscordException, HTTPException, _flatten_error_dict - -__all__ = ( - 'AppCommandError', - 'CommandInvokeError', - 'TransformerError', - 'TranslationError', - 'CheckFailure', - 'CommandAlreadyRegistered', - 'CommandSignatureMismatch', - 'CommandNotFound', - 'CommandLimitReached', - 'NoPrivateMessage', - 'MissingRole', - 'MissingAnyRole', - 'MissingPermissions', - 'BotMissingPermissions', - 'CommandOnCooldown', - 'MissingApplicationID', - 'CommandSyncFailure', -) - -if TYPE_CHECKING: - from .commands import Command, Group, ContextMenu, Parameter - from .transformers import Transformer - from .translator import TranslationContextTypes, locale_str - from ..types.snowflake import Snowflake, SnowflakeList - from .checks import Cooldown - - CommandTypes = Union[Command[Any, ..., Any], Group, ContextMenu] - -APP_ID_NOT_FOUND = ( - 'Client does not have an application_id set. Either the function was called before on_ready ' - 'was called or application_id was not passed to the Client constructor.' -) - - -class AppCommandError(DiscordException): - """The base exception type for all application command related errors. - - This inherits from :exc:`discord.DiscordException`. - - This exception and exceptions inherited from it are handled - in a special way as they are caught and passed into various error handlers - in this order: - - - :meth:`Command.error ` - - :meth:`Group.on_error ` - - :meth:`CommandTree.on_error ` - - .. versionadded:: 2.0 - """ - - pass - - -class CommandInvokeError(AppCommandError): - """An exception raised when the command being invoked raised an exception. - - This inherits from :exc:`~discord.app_commands.AppCommandError`. - - .. versionadded:: 2.0 - - Attributes - ----------- - original: :exc:`Exception` - The original exception that was raised. You can also get this via - the ``__cause__`` attribute. - command: Union[:class:`Command`, :class:`ContextMenu`] - The command that failed. - """ - - def __init__(self, command: Union[Command[Any, ..., Any], ContextMenu], e: Exception) -> None: - self.original: Exception = e - self.command: Union[Command[Any, ..., Any], ContextMenu] = command - super().__init__(f'Command {command.name!r} raised an exception: {e.__class__.__name__}: {e}') - - -class TransformerError(AppCommandError): - """An exception raised when a :class:`Transformer` or type annotation fails to - convert to its target type. - - This inherits from :exc:`~discord.app_commands.AppCommandError`. - - If an exception occurs while converting that does not subclass - :exc:`AppCommandError` then the exception is wrapped into this exception. - The original exception can be retrieved using the ``__cause__`` attribute. - Otherwise if the exception derives from :exc:`AppCommandError` then it will - be propagated as-is. - - .. versionadded:: 2.0 - - Attributes - ----------- - value: Any - The value that failed to convert. - type: :class:`~discord.AppCommandOptionType` - The type of argument that failed to convert. - transformer: :class:`Transformer` - The transformer that failed the conversion. - """ - - def __init__(self, value: Any, opt_type: AppCommandOptionType, transformer: Transformer): - self.value: Any = value - self.type: AppCommandOptionType = opt_type - self.transformer: Transformer = transformer - - super().__init__(f'Failed to convert {value} to {transformer._error_display_name!s}') - - -class TranslationError(AppCommandError): - """An exception raised when the library fails to translate a string. - - This inherits from :exc:`~discord.app_commands.AppCommandError`. - - If an exception occurs while calling :meth:`Translator.translate` that does - not subclass this then the exception is wrapped into this exception. - The original exception can be retrieved using the ``__cause__`` attribute. - Otherwise it will be propagated as-is. - - .. versionadded:: 2.0 - - Attributes - ----------- - string: Optional[Union[:class:`str`, :class:`locale_str`]] - The string that caused the error, if any. - locale: Optional[:class:`~discord.Locale`] - The locale that caused the error, if any. - context: :class:`~discord.app_commands.TranslationContext` - The context of the translation that triggered the error. - """ - - def __init__( - self, - *msg: str, - string: Optional[Union[str, locale_str]] = None, - locale: Optional[Locale] = None, - context: TranslationContextTypes, - ) -> None: - self.string: Optional[Union[str, locale_str]] = string - self.locale: Optional[Locale] = locale - self.context: TranslationContextTypes = context - - if msg: - super().__init__(*msg) - else: - ctx = context.location.name.replace('_', ' ') - fmt = f'Failed to translate {self.string!r} in a {ctx}' - if self.locale is not None: - fmt = f'{fmt} in the {self.locale.value} locale' - - super().__init__(fmt) - - -class CheckFailure(AppCommandError): - """An exception raised when check predicates in a command have failed. - - This inherits from :exc:`~discord.app_commands.AppCommandError`. - - .. versionadded:: 2.0 - """ - - pass - - -class NoPrivateMessage(CheckFailure): - """An exception raised when a command does not work in a direct message. - - This inherits from :exc:`~discord.app_commands.CheckFailure`. - - .. versionadded:: 2.0 - """ - - def __init__(self, message: Optional[str] = None) -> None: - super().__init__(message or 'This command cannot be used in direct messages.') - - -class MissingRole(CheckFailure): - """An exception raised when the command invoker lacks a role to run a command. - - This inherits from :exc:`~discord.app_commands.CheckFailure`. - - .. versionadded:: 2.0 - - Attributes - ----------- - missing_role: Union[:class:`str`, :class:`int`] - The required role that is missing. - This is the parameter passed to :func:`~discord.app_commands.checks.has_role`. - """ - - def __init__(self, missing_role: Snowflake) -> None: - self.missing_role: Snowflake = missing_role - message = f'Role {missing_role!r} is required to run this command.' - super().__init__(message) - - -class MissingAnyRole(CheckFailure): - """An exception raised when the command invoker lacks any of the roles - specified to run a command. - - This inherits from :exc:`~discord.app_commands.CheckFailure`. - - .. versionadded:: 2.0 - - Attributes - ----------- - missing_roles: List[Union[:class:`str`, :class:`int`]] - The roles that the invoker is missing. - These are the parameters passed to :func:`~discord.app_commands.checks.has_any_role`. - """ - - def __init__(self, missing_roles: SnowflakeList) -> None: - self.missing_roles: SnowflakeList = missing_roles - - missing = [f"'{role}'" for role in missing_roles] - - if len(missing) > 2: - fmt = '{}, or {}'.format(', '.join(missing[:-1]), missing[-1]) - else: - fmt = ' or '.join(missing) - - message = f'You are missing at least one of the required roles: {fmt}' - super().__init__(message) - - -class MissingPermissions(CheckFailure): - """An exception raised when the command invoker lacks permissions to run a - command. - - This inherits from :exc:`~discord.app_commands.CheckFailure`. - - .. versionadded:: 2.0 - - Attributes - ----------- - missing_permissions: List[:class:`str`] - The required permissions that are missing. - """ - - def __init__(self, missing_permissions: List[str], *args: Any) -> None: - self.missing_permissions: List[str] = missing_permissions - - missing = [perm.replace('_', ' ').replace('guild', 'server').title() for perm in missing_permissions] - - if len(missing) > 2: - fmt = '{}, and {}'.format(", ".join(missing[:-1]), missing[-1]) - else: - fmt = ' and '.join(missing) - message = f'You are missing {fmt} permission(s) to run this command.' - super().__init__(message, *args) - - -class BotMissingPermissions(CheckFailure): - """An exception raised when the bot's member lacks permissions to run a - command. - - This inherits from :exc:`~discord.app_commands.CheckFailure`. - - .. versionadded:: 2.0 - - Attributes - ----------- - missing_permissions: List[:class:`str`] - The required permissions that are missing. - """ - - def __init__(self, missing_permissions: List[str], *args: Any) -> None: - self.missing_permissions: List[str] = missing_permissions - - missing = [perm.replace('_', ' ').replace('guild', 'server').title() for perm in missing_permissions] - - if len(missing) > 2: - fmt = '{}, and {}'.format(", ".join(missing[:-1]), missing[-1]) - else: - fmt = ' and '.join(missing) - message = f'Bot requires {fmt} permission(s) to run this command.' - super().__init__(message, *args) - - -class CommandOnCooldown(CheckFailure): - """An exception raised when the command being invoked is on cooldown. - - This inherits from :exc:`~discord.app_commands.CheckFailure`. - - .. versionadded:: 2.0 - - Attributes - ----------- - cooldown: :class:`~discord.app_commands.Cooldown` - The cooldown that was triggered. - retry_after: :class:`float` - The amount of seconds to wait before you can retry again. - """ - - def __init__(self, cooldown: Cooldown, retry_after: float) -> None: - self.cooldown: Cooldown = cooldown - self.retry_after: float = retry_after - super().__init__(f'You are on cooldown. Try again in {retry_after:.2f}s') - - -class CommandAlreadyRegistered(AppCommandError): - """An exception raised when a command is already registered. - - This inherits from :exc:`~discord.app_commands.AppCommandError`. - - .. versionadded:: 2.0 - - Attributes - ----------- - name: :class:`str` - The name of the command already registered. - guild_id: Optional[:class:`int`] - The guild ID this command was already registered at. - If ``None`` then it was a global command. - """ - - def __init__(self, name: str, guild_id: Optional[int]): - self.name: str = name - self.guild_id: Optional[int] = guild_id - super().__init__(f'Command {name!r} already registered.') - - -class CommandNotFound(AppCommandError): - """An exception raised when an application command could not be found. - - This inherits from :exc:`~discord.app_commands.AppCommandError`. - - .. versionadded:: 2.0 - - Attributes - ------------ - name: :class:`str` - The name of the application command not found. - parents: List[:class:`str`] - A list of parent command names that were previously found - prior to the application command not being found. - type: :class:`~discord.AppCommandType` - The type of command that was not found. - """ - - def __init__(self, name: str, parents: List[str], type: AppCommandType = AppCommandType.chat_input): - self.name: str = name - self.parents: List[str] = parents - self.type: AppCommandType = type - super().__init__(f'Application command {name!r} not found') - - -class CommandLimitReached(AppCommandError): - """An exception raised when the maximum number of application commands was reached - either globally or in a guild. - - This inherits from :exc:`~discord.app_commands.AppCommandError`. - - .. versionadded:: 2.0 - - Attributes - ------------ - type: :class:`~discord.AppCommandType` - The type of command that reached the limit. - guild_id: Optional[:class:`int`] - The guild ID that reached the limit or ``None`` if it was global. - limit: :class:`int` - The limit that was hit. - """ - - def __init__(self, guild_id: Optional[int], limit: int, type: AppCommandType = AppCommandType.chat_input): - self.guild_id: Optional[int] = guild_id - self.limit: int = limit - self.type: AppCommandType = type - - lookup = { - AppCommandType.chat_input: 'slash commands', - AppCommandType.message: 'message context menu commands', - AppCommandType.user: 'user context menu commands', - } - desc = lookup.get(type, 'application commands') - ns = 'globally' if self.guild_id is None else f'for guild ID {self.guild_id}' - super().__init__(f'maximum number of {desc} exceeded {limit} {ns}') - - -class CommandSignatureMismatch(AppCommandError): - """An exception raised when an application command from Discord has a different signature - from the one provided in the code. This happens because your command definition differs - from the command definition you provided Discord. Either your code is out of date or the - data from Discord is out of sync. - - This inherits from :exc:`~discord.app_commands.AppCommandError`. - - .. versionadded:: 2.0 - - Attributes - ------------ - command: Union[:class:`~.app_commands.Command`, :class:`~.app_commands.ContextMenu`, :class:`~.app_commands.Group`] - The command that had the signature mismatch. - """ - - def __init__(self, command: Union[Command[Any, ..., Any], ContextMenu, Group]): - self.command: Union[Command[Any, ..., Any], ContextMenu, Group] = command - msg = ( - f'The signature for command {command.name!r} is different from the one provided by Discord. ' - 'This can happen because either your code is out of date or you have not synced the ' - 'commands with Discord, causing the mismatch in data. It is recommended to sync the ' - 'command tree to fix this issue.' - ) - super().__init__(msg) - - -class MissingApplicationID(AppCommandError): - """An exception raised when the client does not have an application ID set. - An application ID is required for syncing application commands. - - This inherits from :exc:`~discord.app_commands.AppCommandError`. - - .. versionadded:: 2.0 - """ - - def __init__(self, message: Optional[str] = None): - super().__init__(message or APP_ID_NOT_FOUND) - - -def _get_command_error( - index: str, - inner: Any, - objects: Sequence[Union[Parameter, CommandTypes]], - messages: List[str], - indent: int = 0, -) -> None: - # Import these here to avoid circular imports - from .commands import Command, Group, ContextMenu - - indentation = ' ' * indent - - # Top level errors are: - # : { : } - # The dicts could be nested, e.g. - # : { : { : } } - # Luckily, this is already handled by the flatten_error_dict utility - if not index.isdigit(): - errors = _flatten_error_dict(inner, index) - messages.extend(f'In {k}: {v}' for k, v in errors.items()) - return - - idx = int(index) - try: - obj = objects[idx] - except IndexError: - dedent_one_level = ' ' * (indent - 2) - errors = _flatten_error_dict(inner, index) - messages.extend(f'{dedent_one_level}In {k}: {v}' for k, v in errors.items()) - return - - children: Sequence[Union[Parameter, CommandTypes]] = [] - if isinstance(obj, Command): - messages.append(f'{indentation}In command {obj.qualified_name!r} defined in function {obj.callback.__qualname__!r}') - children = obj.parameters - elif isinstance(obj, Group): - messages.append(f'{indentation}In group {obj.qualified_name!r} defined in module {obj.module!r}') - children = obj.commands - elif isinstance(obj, ContextMenu): - messages.append( - f'{indentation}In context menu {obj.qualified_name!r} defined in function {obj.callback.__qualname__!r}' - ) - else: - messages.append(f'{indentation}In parameter {obj.name!r}') - - for key, remaining in inner.items(): - # Special case the 'options' key since they have well defined meanings - if key == 'options': - for index, d in remaining.items(): - _get_command_error(index, d, children, messages, indent=indent + 2) - else: - if isinstance(remaining, dict): - try: - inner_errors = remaining['_errors'] - except KeyError: - errors = _flatten_error_dict(remaining, key=key) - else: - errors = {key: ' '.join(x.get('message', '') for x in inner_errors)} - else: - errors = _flatten_error_dict(remaining, key=key) - - messages.extend(f'{indentation} {k}: {v}' for k, v in errors.items()) - - -class CommandSyncFailure(AppCommandError, HTTPException): - """An exception raised when :meth:`CommandTree.sync` failed. - - This provides syncing failures in a slightly more readable format. - - This inherits from :exc:`~discord.app_commands.AppCommandError` - and :exc:`~discord.HTTPException`. - - .. versionadded:: 2.0 - """ - - def __init__(self, child: HTTPException, commands: List[CommandTypes]) -> None: - # Consume the child exception and make it seem as if we are that exception - self.__dict__.update(child.__dict__) - - messages = [f'Failed to upload commands to Discord (HTTP status {self.status}, error code {self.code})'] - - if self._errors: - for index, inner in self._errors.items(): - _get_command_error(index, inner, commands, messages) - - # Equivalent to super().__init__(...) but skips other constructors - self.args = ('\n'.join(messages),) diff --git a/.venv/Lib/site-packages/discord/app_commands/models.py b/.venv/Lib/site-packages/discord/app_commands/models.py deleted file mode 100644 index 3e9d250..0000000 --- a/.venv/Lib/site-packages/discord/app_commands/models.py +++ /dev/null @@ -1,1091 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations -from datetime import datetime - -from .errors import MissingApplicationID -from .translator import TranslationContextLocation, TranslationContext, locale_str, Translator -from ..permissions import Permissions -from ..enums import AppCommandOptionType, AppCommandType, AppCommandPermissionType, ChannelType, Locale, try_enum -from ..mixins import Hashable -from ..utils import _get_as_snowflake, parse_time, snowflake_time, MISSING -from ..object import Object -from ..role import Role -from ..member import Member - -from typing import Any, Dict, Generic, List, TYPE_CHECKING, Optional, TypeVar, Union - -__all__ = ( - 'AppCommand', - 'AppCommandGroup', - 'AppCommandChannel', - 'AppCommandThread', - 'AppCommandPermissions', - 'GuildAppCommandPermissions', - 'Argument', - 'Choice', - 'AllChannels', -) - -ChoiceT = TypeVar('ChoiceT', str, int, float, Union[str, int, float]) - - -def is_app_command_argument_type(value: int) -> bool: - return 11 >= value >= 3 - - -if TYPE_CHECKING: - from ..types.command import ( - ApplicationCommand as ApplicationCommandPayload, - ApplicationCommandOption, - ApplicationCommandOptionChoice, - ApplicationCommandPermissions, - GuildApplicationCommandPermissions, - ) - from ..types.interactions import ( - PartialChannel, - PartialThread, - ) - from ..types.threads import ( - ThreadMetadata, - ThreadArchiveDuration, - ) - - from ..abc import Snowflake - from ..state import ConnectionState - from ..guild import GuildChannel, Guild - from ..channel import TextChannel - from ..threads import Thread - from ..user import User - - ApplicationCommandParent = Union['AppCommand', 'AppCommandGroup'] - - -class AllChannels: - """Represents all channels for application command permissions. - - .. versionadded:: 2.0 - - Attributes - ----------- - guild: :class:`~discord.Guild` - The guild the application command permission is for. - """ - - __slots__ = ('guild',) - - def __init__(self, guild: Guild): - self.guild: Guild = guild - - @property - def id(self) -> int: - """:class:`int`: The ID sentinel used to represent all channels. Equivalent to the guild's ID minus 1.""" - return self.guild.id - 1 - - def __repr__(self) -> str: - return f'' - - -def _to_locale_dict(data: Dict[str, str]) -> Dict[Locale, str]: - return {try_enum(Locale, key): value for key, value in data.items()} - - -class AppCommand(Hashable): - """Represents an application command. - - In common parlance this is referred to as a "Slash Command" or a - "Context Menu Command". - - .. versionadded:: 2.0 - - .. container:: operations - - .. describe:: x == y - - Checks if two application commands are equal. - - .. describe:: x != y - - Checks if two application commands are not equal. - - .. describe:: hash(x) - - Returns the application command's hash. - - .. describe:: str(x) - - Returns the application command's name. - - Attributes - ----------- - id: :class:`int` - The application command's ID. - application_id: :class:`int` - The application command's application's ID. - type: :class:`~discord.AppCommandType` - The application command's type. - name: :class:`str` - The application command's name. - description: :class:`str` - The application command's description. - name_localizations: Dict[:class:`~discord.Locale`, :class:`str`] - The localised names of the application command. Used for display purposes. - description_localizations: Dict[:class:`~discord.Locale`, :class:`str`] - The localised descriptions of the application command. Used for display purposes. - options: List[Union[:class:`Argument`, :class:`AppCommandGroup`]] - A list of options. - default_member_permissions: Optional[:class:`~discord.Permissions`] - The default member permissions that can run this command. - dm_permission: :class:`bool` - A boolean that indicates whether this command can be run in direct messages. - guild_id: Optional[:class:`int`] - The ID of the guild this command is registered in. A value of ``None`` - denotes that it is a global command. - nsfw: :class:`bool` - Whether the command is NSFW and should only work in NSFW channels. - """ - - __slots__ = ( - 'id', - 'type', - 'application_id', - 'name', - 'description', - 'name_localizations', - 'description_localizations', - 'guild_id', - 'options', - 'default_member_permissions', - 'dm_permission', - 'nsfw', - '_state', - ) - - def __init__(self, *, data: ApplicationCommandPayload, state: ConnectionState) -> None: - self._state: ConnectionState = state - self._from_data(data) - - def _from_data(self, data: ApplicationCommandPayload) -> None: - self.id: int = int(data['id']) - self.application_id: int = int(data['application_id']) - self.name: str = data['name'] - self.description: str = data['description'] - self.guild_id: Optional[int] = _get_as_snowflake(data, 'guild_id') - self.type: AppCommandType = try_enum(AppCommandType, data.get('type', 1)) - self.options: List[Union[Argument, AppCommandGroup]] = [ - app_command_option_factory(data=d, parent=self, state=self._state) for d in data.get('options', []) - ] - self.default_member_permissions: Optional[Permissions] - permissions = data.get('default_member_permissions') - if permissions is None: - self.default_member_permissions = None - else: - self.default_member_permissions = Permissions(int(permissions)) - - dm_permission = data.get('dm_permission') - # For some reason this field can be explicit null and mean True - if dm_permission is None: - dm_permission = True - - self.dm_permission: bool = dm_permission - self.nsfw: bool = data.get('nsfw', False) - self.name_localizations: Dict[Locale, str] = _to_locale_dict(data.get('name_localizations') or {}) - self.description_localizations: Dict[Locale, str] = _to_locale_dict(data.get('description_localizations') or {}) - - def to_dict(self) -> ApplicationCommandPayload: - return { - 'id': self.id, - 'type': self.type.value, - 'application_id': self.application_id, - 'name': self.name, - 'description': self.description, - 'name_localizations': {str(k): v for k, v in self.name_localizations.items()}, - 'description_localizations': {str(k): v for k, v in self.description_localizations.items()}, - 'options': [opt.to_dict() for opt in self.options], - } # type: ignore # Type checker does not understand this literal. - - def __str__(self) -> str: - return self.name - - def __repr__(self) -> str: - return f'<{self.__class__.__name__} id={self.id!r} name={self.name!r} type={self.type!r}>' - - @property - def mention(self) -> str: - """:class:`str`: Returns a string that allows you to mention the given AppCommand.""" - return f'' - - @property - def guild(self) -> Optional[Guild]: - """Optional[:class:`~discord.Guild`]: Returns the guild this command is registered to - if it exists. - """ - return self._state._get_guild(self.guild_id) - - async def delete(self) -> None: - """|coro| - - Deletes the application command. - - Raises - ------- - NotFound - The application command was not found. - Forbidden - You do not have permission to delete this application command. - HTTPException - Deleting the application command failed. - MissingApplicationID - The client does not have an application ID. - """ - state = self._state - if not state.application_id: - raise MissingApplicationID - - if self.guild_id: - await state.http.delete_guild_command( - state.application_id, - self.guild_id, - self.id, - ) - else: - await state.http.delete_global_command( - state.application_id, - self.id, - ) - - async def edit( - self, - *, - name: str = MISSING, - description: str = MISSING, - default_member_permissions: Optional[Permissions] = MISSING, - dm_permission: bool = MISSING, - options: List[Union[Argument, AppCommandGroup]] = MISSING, - ) -> AppCommand: - """|coro| - - Edits the application command. - - Parameters - ----------- - name: :class:`str` - The new name for the application command. - description: :class:`str` - The new description for the application command. - default_member_permissions: Optional[:class:`~discord.Permissions`] - The new default permissions needed to use this application command. - Pass value of ``None`` to remove any permission requirements. - dm_permission: :class:`bool` - Indicates if the application command can be used in DMs. - options: List[Union[:class:`Argument`, :class:`AppCommandGroup`]] - List of new options for this application command. - - Raises - ------- - NotFound - The application command was not found. - Forbidden - You do not have permission to edit this application command. - HTTPException - Editing the application command failed. - MissingApplicationID - The client does not have an application ID. - - Returns - -------- - :class:`AppCommand` - The newly edited application command. - """ - state = self._state - if not state.application_id: - raise MissingApplicationID - - payload = {} - - if name is not MISSING: - payload['name'] = name - - if description is not MISSING: - payload['description'] = description - - if default_member_permissions is not MISSING: - if default_member_permissions is not None: - payload['default_member_permissions'] = default_member_permissions.value - else: - payload['default_member_permissions'] = None - - if self.guild_id is None and dm_permission is not MISSING: - payload['dm_permission'] = dm_permission - - if options is not MISSING: - payload['options'] = [option.to_dict() for option in options] - - if not payload: - return self - - if self.guild_id: - data = await state.http.edit_guild_command( - state.application_id, - self.guild_id, - self.id, - payload, - ) - else: - data = await state.http.edit_global_command( - state.application_id, - self.id, - payload, - ) - return AppCommand(data=data, state=state) - - async def fetch_permissions(self, guild: Snowflake) -> GuildAppCommandPermissions: - """|coro| - - Retrieves this command's permission in the guild. - - Parameters - ----------- - guild: :class:`~discord.abc.Snowflake` - The guild to retrieve the permissions from. - - Raises - ------- - Forbidden - You do not have permission to fetch the application command's permissions. - HTTPException - Fetching the application command's permissions failed. - MissingApplicationID - The client does not have an application ID. - NotFound - The application command's permissions could not be found. - This can also indicate that the permissions are synced with the guild - (i.e. they are unchanged from the default). - - Returns - -------- - :class:`GuildAppCommandPermissions` - An object representing the application command's permissions in the guild. - """ - state = self._state - if not state.application_id: - raise MissingApplicationID - - data = await state.http.get_application_command_permissions( - state.application_id, - guild.id, - self.id, - ) - return GuildAppCommandPermissions(data=data, state=state, command=self) - - -class Choice(Generic[ChoiceT]): - """Represents an application command argument choice. - - .. versionadded:: 2.0 - - .. container:: operations - - .. describe:: x == y - - Checks if two choices are equal. - - .. describe:: x != y - - Checks if two choices are not equal. - - .. describe:: hash(x) - - Returns the choice's hash. - - Parameters - ----------- - name: Union[:class:`str`, :class:`locale_str`] - The name of the choice. Used for display purposes. - Can only be up to 100 characters. - name_localizations: Dict[:class:`~discord.Locale`, :class:`str`] - The localised names of the choice. Used for display purposes. - value: Union[:class:`int`, :class:`str`, :class:`float`] - The value of the choice. If it's a string, it can only be - up to 100 characters long. - """ - - __slots__ = ('name', 'value', '_locale_name', 'name_localizations') - - def __init__(self, *, name: Union[str, locale_str], value: ChoiceT): - name, locale = (name.message, name) if isinstance(name, locale_str) else (name, None) - self.name: str = name - self._locale_name: Optional[locale_str] = locale - self.value: ChoiceT = value - self.name_localizations: Dict[Locale, str] = {} - - @classmethod - def from_dict(cls, data: ApplicationCommandOptionChoice) -> Choice[ChoiceT]: - self = cls.__new__(cls) - self.name = data['name'] - self.value = data['value'] # type: ignore # This seems to break every other pyright release - self.name_localizations = _to_locale_dict(data.get('name_localizations') or {}) - return self - - def __eq__(self, o: object) -> bool: - return isinstance(o, Choice) and self.name == o.name and self.value == o.value - - def __hash__(self) -> int: - return hash((self.name, self.value)) - - def __repr__(self) -> str: - return f'{self.__class__.__name__}(name={self.name!r}, value={self.value!r})' - - @property - def _option_type(self) -> AppCommandOptionType: - if isinstance(self.value, int): - return AppCommandOptionType.integer - elif isinstance(self.value, float): - return AppCommandOptionType.number - elif isinstance(self.value, str): - return AppCommandOptionType.string - else: - raise TypeError( - f'invalid Choice value type given, expected int, str, or float but received {self.value.__class__.__name__}' - ) - - async def get_translated_payload(self, translator: Translator) -> Dict[str, Any]: - base = self.to_dict() - name_localizations: Dict[str, str] = {} - context = TranslationContext(location=TranslationContextLocation.choice_name, data=self) - if self._locale_name: - for locale in Locale: - translation = await translator._checked_translate(self._locale_name, locale, context) - if translation is not None: - name_localizations[locale.value] = translation - - if name_localizations: - base['name_localizations'] = name_localizations - - return base - - async def get_translated_payload_for_locale(self, translator: Translator, locale: Locale) -> Dict[str, Any]: - base = self.to_dict() - if self._locale_name: - context = TranslationContext(location=TranslationContextLocation.choice_name, data=self) - translation = await translator._checked_translate(self._locale_name, locale, context) - if translation is not None: - base['name'] = translation - - return base - - def to_dict(self) -> Dict[str, Any]: - base = { - 'name': self.name, - 'value': self.value, - } - if self.name_localizations: - base['name_localizations'] = {str(k): v for k, v in self.name_localizations.items()} - return base - - -class AppCommandChannel(Hashable): - """Represents an application command partially resolved channel object. - - .. versionadded:: 2.0 - - .. container:: operations - - .. describe:: x == y - - Checks if two channels are equal. - - .. describe:: x != y - - Checks if two channels are not equal. - - .. describe:: hash(x) - - Returns the channel's hash. - - .. describe:: str(x) - - Returns the channel's name. - - Attributes - ----------- - id: :class:`int` - The ID of the channel. - type: :class:`~discord.ChannelType` - The type of channel. - name: :class:`str` - The name of the channel. - permissions: :class:`~discord.Permissions` - The resolved permissions of the user who invoked - the application command in that channel. - guild_id: :class:`int` - The guild ID this channel belongs to. - """ - - __slots__ = ( - 'id', - 'type', - 'name', - 'permissions', - 'guild_id', - '_state', - ) - - def __init__( - self, - *, - state: ConnectionState, - data: PartialChannel, - guild_id: int, - ): - self._state: ConnectionState = state - self.guild_id: int = guild_id - self.id: int = int(data['id']) - self.type: ChannelType = try_enum(ChannelType, data['type']) - self.name: str = data['name'] - self.permissions: Permissions = Permissions(int(data['permissions'])) - - def __str__(self) -> str: - return self.name - - def __repr__(self) -> str: - return f'<{self.__class__.__name__} id={self.id!r} name={self.name!r} type={self.type!r}>' - - @property - def guild(self) -> Optional[Guild]: - """Optional[:class:`~discord.Guild`]: The channel's guild, from cache, if found.""" - return self._state._get_guild(self.guild_id) - - def resolve(self) -> Optional[GuildChannel]: - """Resolves the application command channel to the appropriate channel - from cache if found. - - Returns - -------- - Optional[:class:`.abc.GuildChannel`] - The resolved guild channel or ``None`` if not found in cache. - """ - guild = self._state._get_guild(self.guild_id) - if guild is not None: - return guild.get_channel(self.id) - return None - - async def fetch(self) -> GuildChannel: - """|coro| - - Fetches the partial channel to a full :class:`.abc.GuildChannel`. - - Raises - -------- - NotFound - The channel was not found. - Forbidden - You do not have the permissions required to get a channel. - HTTPException - Retrieving the channel failed. - - Returns - -------- - :class:`.abc.GuildChannel` - The full channel. - """ - client = self._state._get_client() - return await client.fetch_channel(self.id) # type: ignore # This is explicit narrowing - - @property - def mention(self) -> str: - """:class:`str`: The string that allows you to mention the channel.""" - return f'<#{self.id}>' - - @property - def created_at(self) -> datetime: - """:class:`datetime.datetime`: An aware timestamp of when this channel was created in UTC.""" - return snowflake_time(self.id) - - -class AppCommandThread(Hashable): - """Represents an application command partially resolved thread object. - - .. versionadded:: 2.0 - - .. container:: operations - - .. describe:: x == y - - Checks if two thread are equal. - - .. describe:: x != y - - Checks if two thread are not equal. - - .. describe:: hash(x) - - Returns the thread's hash. - - .. describe:: str(x) - - Returns the thread's name. - - Attributes - ----------- - id: :class:`int` - The ID of the thread. - type: :class:`~discord.ChannelType` - The type of thread. - name: :class:`str` - The name of the thread. - parent_id: :class:`int` - The parent text channel ID this thread belongs to. - permissions: :class:`~discord.Permissions` - The resolved permissions of the user who invoked - the application command in that thread. - guild_id: :class:`int` - The guild ID this thread belongs to. - archived: :class:`bool` - Whether the thread is archived. - locked: :class:`bool` - Whether the thread is locked. - invitable: :class:`bool` - Whether non-moderators can add other non-moderators to this thread. - This is always ``True`` for public threads. - archiver_id: Optional[:class:`int`] - The user's ID that archived this thread. - auto_archive_duration: :class:`int` - The duration in minutes until the thread is automatically hidden from the channel list. - Usually a value of 60, 1440, 4320 and 10080. - archive_timestamp: :class:`datetime.datetime` - An aware timestamp of when the thread's archived status was last updated in UTC. - """ - - __slots__ = ( - 'id', - 'type', - 'name', - 'permissions', - 'guild_id', - 'parent_id', - 'archived', - 'archiver_id', - 'auto_archive_duration', - 'archive_timestamp', - 'locked', - 'invitable', - '_created_at', - '_state', - ) - - def __init__( - self, - *, - state: ConnectionState, - data: PartialThread, - guild_id: int, - ): - self._state: ConnectionState = state - self.guild_id: int = guild_id - self.id: int = int(data['id']) - self.parent_id: int = int(data['parent_id']) - self.type: ChannelType = try_enum(ChannelType, data['type']) - self.name: str = data['name'] - self.permissions: Permissions = Permissions(int(data['permissions'])) - self._unroll_metadata(data['thread_metadata']) - - def __str__(self) -> str: - return self.name - - def __repr__(self) -> str: - return f'<{self.__class__.__name__} id={self.id!r} name={self.name!r} archived={self.archived} type={self.type!r}>' - - @property - def guild(self) -> Optional[Guild]: - """Optional[:class:`~discord.Guild`]: The channel's guild, from cache, if found.""" - return self._state._get_guild(self.guild_id) - - def _unroll_metadata(self, data: ThreadMetadata) -> None: - self.archived: bool = data['archived'] - self.archiver_id: Optional[int] = _get_as_snowflake(data, 'archiver_id') - self.auto_archive_duration: ThreadArchiveDuration = data['auto_archive_duration'] - self.archive_timestamp: datetime = parse_time(data['archive_timestamp']) - self.locked: bool = data.get('locked', False) - self.invitable: bool = data.get('invitable', True) - self._created_at: Optional[datetime] = parse_time(data.get('create_timestamp')) - - @property - def parent(self) -> Optional[TextChannel]: - """Optional[:class:`~discord.TextChannel`]: The parent channel this thread belongs to.""" - return self.guild.get_channel(self.parent_id) # type: ignore - - @property - def mention(self) -> str: - """:class:`str`: The string that allows you to mention the thread.""" - return f'<#{self.id}>' - - @property - def created_at(self) -> Optional[datetime]: - """An aware timestamp of when the thread was created in UTC. - - .. note:: - - This timestamp only exists for threads created after 9 January 2022, otherwise returns ``None``. - """ - return self._created_at - - def resolve(self) -> Optional[Thread]: - """Resolves the application command channel to the appropriate channel - from cache if found. - - Returns - -------- - Optional[:class:`.abc.GuildChannel`] - The resolved guild channel or ``None`` if not found in cache. - """ - guild = self._state._get_guild(self.guild_id) - if guild is not None: - return guild.get_thread(self.id) - return None - - async def fetch(self) -> Thread: - """|coro| - - Fetches the partial channel to a full :class:`~discord.Thread`. - - Raises - -------- - NotFound - The thread was not found. - Forbidden - You do not have the permissions required to get a thread. - HTTPException - Retrieving the thread failed. - - Returns - -------- - :class:`~discord.Thread` - The full thread. - """ - client = self._state._get_client() - return await client.fetch_channel(self.id) # type: ignore # This is explicit narrowing - - -class Argument: - """Represents an application command argument. - - .. versionadded:: 2.0 - - Attributes - ------------ - type: :class:`~discord.AppCommandOptionType` - The type of argument. - name: :class:`str` - The name of the argument. - description: :class:`str` - The description of the argument. - name_localizations: Dict[:class:`~discord.Locale`, :class:`str`] - The localised names of the argument. Used for display purposes. - description_localizations: Dict[:class:`~discord.Locale`, :class:`str`] - The localised descriptions of the argument. Used for display purposes. - required: :class:`bool` - Whether the argument is required. - choices: List[:class:`Choice`] - A list of choices for the command to choose from for this argument. - parent: Union[:class:`AppCommand`, :class:`AppCommandGroup`] - The parent application command that has this argument. - channel_types: List[:class:`~discord.ChannelType`] - The channel types that are allowed for this parameter. - min_value: Optional[Union[:class:`int`, :class:`float`]] - The minimum supported value for this parameter. - max_value: Optional[Union[:class:`int`, :class:`float`]] - The maximum supported value for this parameter. - min_length: Optional[:class:`int`] - The minimum allowed length for this parameter. - max_length: Optional[:class:`int`] - The maximum allowed length for this parameter. - autocomplete: :class:`bool` - Whether the argument has autocomplete. - """ - - __slots__ = ( - 'type', - 'name', - 'description', - 'name_localizations', - 'description_localizations', - 'required', - 'choices', - 'channel_types', - 'min_value', - 'max_value', - 'min_length', - 'max_length', - 'autocomplete', - 'parent', - '_state', - ) - - def __init__( - self, *, parent: ApplicationCommandParent, data: ApplicationCommandOption, state: Optional[ConnectionState] = None - ) -> None: - self._state: Optional[ConnectionState] = state - self.parent: ApplicationCommandParent = parent - self._from_data(data) - - def __repr__(self) -> str: - return f'<{self.__class__.__name__} name={self.name!r} type={self.type!r} required={self.required}>' - - def _from_data(self, data: ApplicationCommandOption) -> None: - self.type: AppCommandOptionType = try_enum(AppCommandOptionType, data['type']) - self.name: str = data['name'] - self.description: str = data['description'] - self.required: bool = data.get('required', False) - self.min_value: Optional[Union[int, float]] = data.get('min_value') - self.max_value: Optional[Union[int, float]] = data.get('max_value') - self.min_length: Optional[int] = data.get('min_length') - self.max_length: Optional[int] = data.get('max_length') - self.autocomplete: bool = data.get('autocomplete', False) - self.channel_types: List[ChannelType] = [try_enum(ChannelType, d) for d in data.get('channel_types', [])] - self.choices: List[Choice[Union[int, float, str]]] = [Choice.from_dict(d) for d in data.get('choices', [])] - self.name_localizations: Dict[Locale, str] = _to_locale_dict(data.get('name_localizations') or {}) - self.description_localizations: Dict[Locale, str] = _to_locale_dict(data.get('description_localizations') or {}) - - def to_dict(self) -> ApplicationCommandOption: - return { - 'name': self.name, - 'type': self.type.value, - 'description': self.description, - 'required': self.required, - 'choices': [choice.to_dict() for choice in self.choices], - 'channel_types': [channel_type.value for channel_type in self.channel_types], - 'min_value': self.min_value, - 'max_value': self.max_value, - 'min_length': self.min_length, - 'max_length': self.max_length, - 'autocomplete': self.autocomplete, - 'options': [], - 'name_localizations': {str(k): v for k, v in self.name_localizations.items()}, - 'description_localizations': {str(k): v for k, v in self.description_localizations.items()}, - } # type: ignore # Type checker does not understand this literal. - - -class AppCommandGroup: - """Represents an application command subcommand. - - .. versionadded:: 2.0 - - Attributes - ------------ - type: :class:`~discord.AppCommandOptionType` - The type of subcommand. - name: :class:`str` - The name of the subcommand. - description: :class:`str` - The description of the subcommand. - name_localizations: Dict[:class:`~discord.Locale`, :class:`str`] - The localised names of the subcommand. Used for display purposes. - description_localizations: Dict[:class:`~discord.Locale`, :class:`str`] - The localised descriptions of the subcommand. Used for display purposes. - options: List[Union[:class:`Argument`, :class:`AppCommandGroup`]] - A list of options. - parent: Union[:class:`AppCommand`, :class:`AppCommandGroup`] - The parent application command. - """ - - __slots__ = ( - 'type', - 'name', - 'description', - 'name_localizations', - 'description_localizations', - 'options', - 'parent', - '_state', - ) - - def __init__( - self, *, parent: ApplicationCommandParent, data: ApplicationCommandOption, state: Optional[ConnectionState] = None - ) -> None: - self.parent: ApplicationCommandParent = parent - self._state: Optional[ConnectionState] = state - self._from_data(data) - - def __repr__(self) -> str: - return f'<{self.__class__.__name__} name={self.name!r} type={self.type!r}>' - - @property - def qualified_name(self) -> str: - """:class:`str`: Returns the fully qualified command name. - - The qualified name includes the parent name as well. For example, - in a command like ``/foo bar`` the qualified name is ``foo bar``. - """ - # A B C - # ^ self - # ^ parent - # ^ grandparent - names = [self.name, self.parent.name] - if isinstance(self.parent, AppCommandGroup): - names.append(self.parent.parent.name) - - return ' '.join(reversed(names)) - - @property - def mention(self) -> str: - """:class:`str`: Returns a string that allows you to mention the given AppCommandGroup.""" - if isinstance(self.parent, AppCommand): - base_command = self.parent - else: - base_command = self.parent.parent - return f'' # type: ignore - - def _from_data(self, data: ApplicationCommandOption) -> None: - self.type: AppCommandOptionType = try_enum(AppCommandOptionType, data['type']) - self.name: str = data['name'] - self.description: str = data['description'] - self.options: List[Union[Argument, AppCommandGroup]] = [ - app_command_option_factory(data=d, parent=self, state=self._state) for d in data.get('options', []) - ] - self.name_localizations: Dict[Locale, str] = _to_locale_dict(data.get('name_localizations') or {}) - self.description_localizations: Dict[Locale, str] = _to_locale_dict(data.get('description_localizations') or {}) - - def to_dict(self) -> 'ApplicationCommandOption': - return { - 'name': self.name, - 'type': self.type.value, - 'description': self.description, - 'options': [arg.to_dict() for arg in self.options], - 'name_localizations': {str(k): v for k, v in self.name_localizations.items()}, - 'description_localizations': {str(k): v for k, v in self.description_localizations.items()}, - } # type: ignore # Type checker does not understand this literal. - - -class AppCommandPermissions: - """Represents the permissions for an application command. - - .. versionadded:: 2.0 - - Attributes - ----------- - guild: :class:`~discord.Guild` - The guild associated with this permission. - id: :class:`int` - The ID of the permission target, such as a role, channel, or guild. - The special ``guild_id - 1`` sentinel is used to represent "all channels". - target: Any - The role, user, or channel associated with this permission. This could also be the :class:`AllChannels` sentinel type. - Falls back to :class:`~discord.Object` if the target could not be found in the cache. - type: :class:`.AppCommandPermissionType` - The type of permission. - permission: :class:`bool` - The permission value. ``True`` for allow, ``False`` for deny. - """ - - __slots__ = ('id', 'type', 'permission', 'target', 'guild', '_state') - - def __init__(self, *, data: ApplicationCommandPermissions, guild: Guild, state: ConnectionState) -> None: - self._state: ConnectionState = state - self.guild: Guild = guild - - self.id: int = int(data['id']) - self.type: AppCommandPermissionType = try_enum(AppCommandPermissionType, data['type']) - self.permission: bool = data['permission'] - - _object = None - _type = MISSING - - if self.type is AppCommandPermissionType.user: - _object = guild.get_member(self.id) or self._state.get_user(self.id) - _type = Member - elif self.type is AppCommandPermissionType.channel: - if self.id == (guild.id - 1): - _object = AllChannels(guild) - else: - _object = guild.get_channel(self.id) - elif self.type is AppCommandPermissionType.role: - _object = guild.get_role(self.id) - _type = Role - - if _object is None: - _object = Object(id=self.id, type=_type) - - self.target: Union[Object, User, Member, Role, AllChannels, GuildChannel] = _object - - def to_dict(self) -> ApplicationCommandPermissions: - return { - 'id': self.target.id, - 'type': self.type.value, - 'permission': self.permission, - } - - -class GuildAppCommandPermissions: - """Represents the permissions for an application command in a guild. - - .. versionadded:: 2.0 - - Attributes - ----------- - application_id: :class:`int` - The application ID. - command: :class:`.AppCommand` - The application command associated with the permissions. - id: :class:`int` - ID of the command or the application ID. - When this is the application ID instead of a command ID, - the permissions apply to all commands that do not contain explicit overwrites. - guild_id: :class:`int` - The guild ID associated with the permissions. - permissions: List[:class:`AppCommandPermissions`] - The permissions, this is a max of 100. - """ - - __slots__ = ('id', 'application_id', 'command', 'guild_id', 'permissions', '_state') - - def __init__(self, *, data: GuildApplicationCommandPermissions, state: ConnectionState, command: AppCommand) -> None: - self._state: ConnectionState = state - self.command: AppCommand = command - - self.id: int = int(data['id']) - self.application_id: int = int(data['application_id']) - self.guild_id: int = int(data['guild_id']) - guild = self.guild - self.permissions: List[AppCommandPermissions] = [ - AppCommandPermissions(data=value, guild=guild, state=self._state) for value in data['permissions'] - ] - - def to_dict(self) -> Dict[str, Any]: - return {'permissions': [p.to_dict() for p in self.permissions]} - - @property - def guild(self) -> Guild: - """:class:`~discord.Guild`: The guild associated with the permissions.""" - return self._state._get_or_create_unavailable_guild(self.guild_id) - - -def app_command_option_factory( - parent: ApplicationCommandParent, data: ApplicationCommandOption, *, state: Optional[ConnectionState] = None -) -> Union[Argument, AppCommandGroup]: - if is_app_command_argument_type(data['type']): - return Argument(parent=parent, data=data, state=state) - else: - return AppCommandGroup(parent=parent, data=data, state=state) diff --git a/.venv/Lib/site-packages/discord/app_commands/namespace.py b/.venv/Lib/site-packages/discord/app_commands/namespace.py deleted file mode 100644 index 7fad617..0000000 --- a/.venv/Lib/site-packages/discord/app_commands/namespace.py +++ /dev/null @@ -1,263 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Dict, Iterable, Iterator, List, NamedTuple, Tuple -from ..member import Member -from ..object import Object -from ..role import Role -from ..message import Message, Attachment -from ..channel import PartialMessageable -from ..enums import AppCommandOptionType -from .models import AppCommandChannel, AppCommandThread - -if TYPE_CHECKING: - from ..interactions import Interaction - from ..types.interactions import ResolvedData, ApplicationCommandInteractionDataOption - -__all__ = ('Namespace',) - - -class ResolveKey(NamedTuple): - id: str - # CommandOptionType does not use 0 or negative numbers so those can be safe for library - # internal use, if necessary. Likewise, only 6, 7, 8, and 11 are actually in use. - type: int - - @classmethod - def any_with(cls, id: str) -> ResolveKey: - return ResolveKey(id=id, type=-1) - - def __eq__(self, o: object) -> bool: - if not isinstance(o, ResolveKey): - return NotImplemented - if self.type == -1 or o.type == -1: - return self.id == o.id - return (self.id, self.type) == (o.id, o.type) - - def __hash__(self) -> int: - # Most of the time an ID lookup is all that is necessary - # In case of collision then we look up both the ID and the type. - return hash(self.id) - - -class Namespace: - """An object that holds the parameters being passed to a command in a mostly raw state. - - This class is deliberately simple and just holds the option name and resolved value as a simple - key-pair mapping. These attributes can be accessed using dot notation. For example, an option - with the name of ``example`` can be accessed using ``ns.example``. If an attribute is not found, - then ``None`` is returned rather than an attribute error. - - .. warning:: - - The key names come from the raw Discord data, which means that if a parameter was renamed then the - renamed key is used instead of the function parameter name. - - .. versionadded:: 2.0 - - .. container:: operations - - .. describe:: x == y - - Checks if two namespaces are equal by checking if all attributes are equal. - .. describe:: x != y - - Checks if two namespaces are not equal. - .. describe:: x[key] - - Returns an attribute if it is found, otherwise raises - a :exc:`KeyError`. - .. describe:: key in x - - Checks if the attribute is in the namespace. - .. describe:: iter(x) - - Returns an iterator of ``(name, value)`` pairs. This allows it - to be, for example, constructed as a dict or a list of pairs. - - This namespace object converts resolved objects into their appropriate form depending on their - type. Consult the table below for conversion information. - - +-------------------------------------------+-------------------------------------------------------------------------------+ - | Option Type | Resolved Type | - +===========================================+===============================================================================+ - | :attr:`.AppCommandOptionType.string` | :class:`str` | - +-------------------------------------------+-------------------------------------------------------------------------------+ - | :attr:`.AppCommandOptionType.integer` | :class:`int` | - +-------------------------------------------+-------------------------------------------------------------------------------+ - | :attr:`.AppCommandOptionType.boolean` | :class:`bool` | - +-------------------------------------------+-------------------------------------------------------------------------------+ - | :attr:`.AppCommandOptionType.number` | :class:`float` | - +-------------------------------------------+-------------------------------------------------------------------------------+ - | :attr:`.AppCommandOptionType.user` | :class:`~discord.User` or :class:`~discord.Member` | - +-------------------------------------------+-------------------------------------------------------------------------------+ - | :attr:`.AppCommandOptionType.channel` | :class:`.AppCommandChannel` or :class:`.AppCommandThread` | - +-------------------------------------------+-------------------------------------------------------------------------------+ - | :attr:`.AppCommandOptionType.role` | :class:`~discord.Role` | - +-------------------------------------------+-------------------------------------------------------------------------------+ - | :attr:`.AppCommandOptionType.mentionable` | :class:`~discord.User` or :class:`~discord.Member`, or :class:`~discord.Role` | - +-------------------------------------------+-------------------------------------------------------------------------------+ - | :attr:`.AppCommandOptionType.attachment` | :class:`~discord.Attachment` | - +-------------------------------------------+-------------------------------------------------------------------------------+ - - .. note:: - - In autocomplete interactions, the namespace might not be validated or filled in. Discord does not - send the resolved data as well, so this means that certain fields end up just as IDs rather than - the resolved data. In these cases, a :class:`discord.Object` is returned instead. - - This is a Discord limitation. - """ - - def __init__( - self, - interaction: Interaction, - resolved: ResolvedData, - options: List[ApplicationCommandInteractionDataOption], - ): - completed = self._get_resolved_items(interaction, resolved) - for option in options: - opt_type = option['type'] - name = option['name'] - focused = option.get('focused', False) - if opt_type in (3, 4, 5): # string, integer, boolean - value = option['value'] # type: ignore # Key is there - self.__dict__[name] = value - elif opt_type == 10: # number - value = option['value'] # type: ignore # Key is there - # This condition is written this way because 0 can be a valid float - if value is None or value == '': - self.__dict__[name] = float('nan') - else: - if not focused: - self.__dict__[name] = float(value) - else: - # Autocomplete focused values tend to be garbage in - self.__dict__[name] = value - elif opt_type in (6, 7, 8, 9, 11): - # Remaining ones should be snowflake based ones with resolved data - snowflake: str = option['value'] # type: ignore # Key is there - if opt_type == 9: # Mentionable - # Mentionable is User | Role, these do not cause any conflict - key = ResolveKey.any_with(snowflake) - else: - # The remaining keys can conflict, for example, a role and a channel - # could end up with the same ID in very old guilds since they used to default - # to sharing the guild ID. Old general channels no longer exist, but some old - # servers will still have them so this needs to be handled. - key = ResolveKey(id=snowflake, type=opt_type) - - value = completed.get(key) or Object(id=int(snowflake)) - self.__dict__[name] = value - - @classmethod - def _get_resolved_items(cls, interaction: Interaction, resolved: ResolvedData) -> Dict[ResolveKey, Any]: - completed: Dict[ResolveKey, Any] = {} - state = interaction._state - members = resolved.get('members', {}) - guild_id = interaction.guild_id - guild = state._get_or_create_unavailable_guild(guild_id) if guild_id is not None else None - type = AppCommandOptionType.user.value - for (user_id, user_data) in resolved.get('users', {}).items(): - try: - member_data = members[user_id] - except KeyError: - completed[ResolveKey(id=user_id, type=type)] = state.create_user(user_data) - else: - member_data['user'] = user_data - # Guild ID can't be None in this case. - # There's a type mismatch here that I don't actually care about - member = Member(state=state, guild=guild, data=member_data) # type: ignore - completed[ResolveKey(id=user_id, type=type)] = member - - type = AppCommandOptionType.role.value - completed.update( - { - # The guild ID can't be None in this case. - ResolveKey(id=role_id, type=type): Role(guild=guild, state=state, data=role_data) # type: ignore - for role_id, role_data in resolved.get('roles', {}).items() - } - ) - - type = AppCommandOptionType.channel.value - for (channel_id, channel_data) in resolved.get('channels', {}).items(): - key = ResolveKey(id=channel_id, type=type) - if channel_data['type'] in (10, 11, 12): - # The guild ID can't be none in this case - completed[key] = AppCommandThread(state=state, data=channel_data, guild_id=guild_id) # type: ignore - else: - # The guild ID can't be none in this case - completed[key] = AppCommandChannel(state=state, data=channel_data, guild_id=guild_id) # type: ignore - - type = AppCommandOptionType.attachment.value - completed.update( - { - ResolveKey(id=attachment_id, type=type): Attachment(data=attachment_data, state=state) - for attachment_id, attachment_data in resolved.get('attachments', {}).items() - } - ) - - guild = state._get_guild(guild_id) - for (message_id, message_data) in resolved.get('messages', {}).items(): - channel_id = int(message_data['channel_id']) - if guild is None: - channel = PartialMessageable(state=state, guild_id=guild_id, id=channel_id) - else: - channel = guild.get_channel_or_thread(channel_id) or PartialMessageable( - state=state, guild_id=guild_id, id=channel_id - ) - - # Type checker doesn't understand this due to failure to narrow - message = Message(state=state, channel=channel, data=message_data) # type: ignore - key = ResolveKey(id=message_id, type=-1) - completed[key] = message - - return completed - - def __repr__(self) -> str: - items = (f'{k}={v!r}' for k, v in self.__dict__.items()) - return '<{} {}>'.format(self.__class__.__name__, ' '.join(items)) - - def __eq__(self, other: object) -> bool: - if isinstance(self, Namespace) and isinstance(other, Namespace): - return self.__dict__ == other.__dict__ - return NotImplemented - - def __getitem__(self, key: str) -> Any: - return self.__dict__[key] - - def __contains__(self, key: str) -> Any: - return key in self.__dict__ - - def __getattr__(self, attr: str) -> Any: - return None - - def __iter__(self) -> Iterator[Tuple[str, Any]]: - yield from self.__dict__.items() - - def _update_with_defaults(self, defaults: Iterable[Tuple[str, Any]]) -> None: - for key, value in defaults: - self.__dict__.setdefault(key, value) diff --git a/.venv/Lib/site-packages/discord/app_commands/transformers.py b/.venv/Lib/site-packages/discord/app_commands/transformers.py deleted file mode 100644 index 8f00918..0000000 --- a/.venv/Lib/site-packages/discord/app_commands/transformers.py +++ /dev/null @@ -1,877 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations -import inspect - -from dataclasses import dataclass -from enum import Enum -from typing import ( - TYPE_CHECKING, - Any, - Callable, - ClassVar, - Coroutine, - Dict, - List, - Literal, - Optional, - Set, - Tuple, - Type, - TypeVar, - Union, -) - -from .errors import AppCommandError, TransformerError -from .models import AppCommandChannel, AppCommandThread, Choice -from .translator import TranslationContextLocation, TranslationContext, Translator, locale_str -from ..channel import StageChannel, VoiceChannel, TextChannel, CategoryChannel, ForumChannel -from ..abc import GuildChannel -from ..threads import Thread -from ..enums import Enum as InternalEnum, AppCommandOptionType, ChannelType, Locale -from ..utils import MISSING, maybe_coroutine -from ..user import User -from ..role import Role -from ..member import Member -from ..message import Attachment - -__all__ = ( - 'Transformer', - 'Transform', - 'Range', -) - -T = TypeVar('T') -FuncT = TypeVar('FuncT', bound=Callable[..., Any]) -ChoiceT = TypeVar('ChoiceT', str, int, float, Union[str, int, float]) -NoneType = type(None) - -if TYPE_CHECKING: - from ..interactions import Interaction - from .commands import Parameter - - -@dataclass -class CommandParameter: - # The name of the parameter is *always* the parameter name in the code - # Therefore, it can't be Union[str, locale_str] - name: str = MISSING - description: Union[str, locale_str] = MISSING - required: bool = MISSING - default: Any = MISSING - choices: List[Choice[Union[str, int, float]]] = MISSING - type: AppCommandOptionType = MISSING - channel_types: List[ChannelType] = MISSING - min_value: Optional[Union[int, float]] = None - max_value: Optional[Union[int, float]] = None - autocomplete: Optional[Callable[..., Coroutine[Any, Any, Any]]] = None - _rename: Union[str, locale_str] = MISSING - _annotation: Any = MISSING - - async def get_translated_payload(self, translator: Translator, data: Parameter) -> Dict[str, Any]: - base = self.to_dict() - - rename = self._rename - description = self.description - needs_name_translations = isinstance(rename, locale_str) - needs_description_translations = isinstance(description, locale_str) - name_localizations: Dict[str, str] = {} - description_localizations: Dict[str, str] = {} - - # Prevent creating these objects in a heavy loop - name_context = TranslationContext(location=TranslationContextLocation.parameter_name, data=data) - description_context = TranslationContext(location=TranslationContextLocation.parameter_description, data=data) - for locale in Locale: - if needs_name_translations: - translation = await translator._checked_translate(rename, locale, name_context) - if translation is not None: - name_localizations[locale.value] = translation - - if needs_description_translations: - translation = await translator._checked_translate(description, locale, description_context) - if translation is not None: - description_localizations[locale.value] = translation - - if self.choices: - base['choices'] = [await choice.get_translated_payload(translator) for choice in self.choices] - - if name_localizations: - base['name_localizations'] = name_localizations - - if description_localizations: - base['description_localizations'] = description_localizations - - return base - - def to_dict(self) -> Dict[str, Any]: - base = { - 'type': self.type.value, - 'name': self.display_name, - 'description': str(self.description), - 'required': self.required, - } - - if self.choices: - base['choices'] = [choice.to_dict() for choice in self.choices] - if self.channel_types: - base['channel_types'] = [t.value for t in self.channel_types] - if self.autocomplete: - base['autocomplete'] = True - - min_key, max_key = ( - ('min_value', 'max_value') if self.type is not AppCommandOptionType.string else ('min_length', 'max_length') - ) - if self.min_value is not None: - base[min_key] = self.min_value - if self.max_value is not None: - base[max_key] = self.max_value - - return base - - def _convert_to_locale_strings(self) -> None: - if self._rename is MISSING: - self._rename = locale_str(self.name) - elif isinstance(self._rename, str): - self._rename = locale_str(self._rename) - - if isinstance(self.description, str): - self.description = locale_str(self.description) - - if self.choices: - for choice in self.choices: - if choice._locale_name is None: - choice._locale_name = locale_str(choice.name) - - def is_choice_annotation(self) -> bool: - return getattr(self._annotation, '__discord_app_commands_is_choice__', False) - - async def transform(self, interaction: Interaction, value: Any, /) -> Any: - if hasattr(self._annotation, '__discord_app_commands_transformer__'): - # This one needs special handling for type safety reasons - if self._annotation.__discord_app_commands_is_choice__: - choice = next((c for c in self.choices if c.value == value), None) - if choice is None: - raise TransformerError(value, self.type, self._annotation) - return choice - - try: - # ParamSpec doesn't understand that transform is a callable since it's unbound - return await maybe_coroutine(self._annotation.transform, interaction, value) # type: ignore - except AppCommandError: - raise - except Exception as e: - raise TransformerError(value, self.type, self._annotation) from e - - return value - - @property - def display_name(self) -> str: - """:class:`str`: The name of the parameter as it should be displayed to the user.""" - return self.name if self._rename is MISSING else str(self._rename) - - -class Transformer: - """The base class that allows a type annotation in an application command parameter - to map into a :class:`~discord.AppCommandOptionType` and transform the raw value into one - from this type. - - This class is customisable through the overriding of methods and properties in the class - and by using it as the second type parameter of the :class:`~discord.app_commands.Transform` - class. For example, to convert a string into a custom pair type: - - .. code-block:: python3 - - class Point(typing.NamedTuple): - x: int - y: int - - class PointTransformer(app_commands.Transformer): - async def transform(self, interaction: discord.Interaction, value: str) -> Point: - (x, _, y) = value.partition(',') - return Point(x=int(x.strip()), y=int(y.strip())) - - @app_commands.command() - async def graph( - interaction: discord.Interaction, - point: app_commands.Transform[Point, PointTransformer], - ): - await interaction.response.send_message(str(point)) - - If a class is passed instead of an instance to the second type parameter, then it is - constructed with no arguments passed to the ``__init__`` method. - - .. versionadded:: 2.0 - """ - - __discord_app_commands_transformer__: ClassVar[bool] = True - __discord_app_commands_is_choice__: ClassVar[bool] = False - - # This is needed to pass typing's type checks. - # e.g. Optional[MyTransformer] - def __call__(self) -> None: - pass - - def __or__(self, rhs: Any) -> Any: - return Union[self, rhs] # type: ignore - - @property - def type(self) -> AppCommandOptionType: - """:class:`~discord.AppCommandOptionType`: The option type associated with this transformer. - - This must be a :obj:`property`. - - Defaults to :attr:`~discord.AppCommandOptionType.string`. - """ - return AppCommandOptionType.string - - @property - def channel_types(self) -> List[ChannelType]: - """List[:class:`~discord.ChannelType`]: A list of channel types that are allowed to this parameter. - - Only valid if the :meth:`type` returns :attr:`~discord.AppCommandOptionType.channel`. - - This must be a :obj:`property`. - - Defaults to an empty list. - """ - return [] - - @property - def min_value(self) -> Optional[Union[int, float]]: - """Optional[:class:`int`]: The minimum supported value for this parameter. - - Only valid if the :meth:`type` returns :attr:`~discord.AppCommandOptionType.number` - :attr:`~discord.AppCommandOptionType.integer`, or :attr:`~discord.AppCommandOptionType.string`. - - This must be a :obj:`property`. - - Defaults to ``None``. - """ - return None - - @property - def max_value(self) -> Optional[Union[int, float]]: - """Optional[:class:`int`]: The maximum supported value for this parameter. - - Only valid if the :meth:`type` returns :attr:`~discord.AppCommandOptionType.number` - :attr:`~discord.AppCommandOptionType.integer`, or :attr:`~discord.AppCommandOptionType.string`. - - This must be a :obj:`property`. - - Defaults to ``None``. - """ - return None - - @property - def choices(self) -> Optional[List[Choice[Union[int, float, str]]]]: - """Optional[List[:class:`~discord.app_commands.Choice`]]: A list of up to 25 choices that are allowed to this parameter. - - Only valid if the :meth:`type` returns :attr:`~discord.AppCommandOptionType.number` - :attr:`~discord.AppCommandOptionType.integer`, or :attr:`~discord.AppCommandOptionType.string`. - - This must be a :obj:`property`. - - Defaults to ``None``. - """ - return None - - @property - def _error_display_name(self) -> str: - name = self.__class__.__name__ - if name.endswith('Transformer'): - return name[:-11] - else: - return name - - async def transform(self, interaction: Interaction, value: Any, /) -> Any: - """|maybecoro| - - Transforms the converted option value into another value. - - The value passed into this transform function is the same as the - one in the :class:`conversion table `. - - Parameters - ----------- - interaction: :class:`~discord.Interaction` - The interaction being handled. - value: Any - The value of the given argument after being resolved. - See the :class:`conversion table ` - for how certain option types correspond to certain values. - """ - raise NotImplementedError('Derived classes need to implement this.') - - async def autocomplete( - self, interaction: Interaction, value: Union[int, float, str], / - ) -> List[Choice[Union[int, float, str]]]: - """|coro| - - An autocomplete prompt handler to be automatically used by options using this transformer. - - .. note:: - - Autocomplete is only supported for options with a :meth:`~discord.app_commands.Transformer.type` - of :attr:`~discord.AppCommandOptionType.string`, :attr:`~discord.AppCommandOptionType.integer`, - or :attr:`~discord.AppCommandOptionType.number`. - - Parameters - ----------- - interaction: :class:`~discord.Interaction` - The autocomplete interaction being handled. - value: Union[:class:`str`, :class:`int`, :class:`float`] - The current value entered by the user. - - Returns - -------- - List[:class:`~discord.app_commands.Choice`] - A list of choices to be displayed to the user, a maximum of 25. - - """ - raise NotImplementedError('Derived classes can implement this.') - - -class IdentityTransformer(Transformer): - def __init__(self, type: AppCommandOptionType) -> None: - self._type = type - - @property - def type(self) -> AppCommandOptionType: - return self._type - - async def transform(self, interaction: Interaction, value: Any, /) -> Any: - return value - - -class RangeTransformer(IdentityTransformer): - def __init__( - self, - opt_type: AppCommandOptionType, - *, - min: Optional[Union[int, float]] = None, - max: Optional[Union[int, float]] = None, - ) -> None: - if min and max and min > max: - raise TypeError('minimum cannot be larger than maximum') - - self._min: Optional[Union[int, float]] = min - self._max: Optional[Union[int, float]] = max - super().__init__(opt_type) - - @property - def min_value(self) -> Optional[Union[int, float]]: - return self._min - - @property - def max_value(self) -> Optional[Union[int, float]]: - return self._max - - -class LiteralTransformer(IdentityTransformer): - def __init__(self, values: Tuple[Any, ...]) -> None: - first = type(values[0]) - if first is int: - opt_type = AppCommandOptionType.integer - elif first is float: - opt_type = AppCommandOptionType.number - elif first is str: - opt_type = AppCommandOptionType.string - else: - raise TypeError(f'expected int, str, or float values not {first!r}') - - self._choices = [Choice(name=str(v), value=v) for v in values] - super().__init__(opt_type) - - @property - def choices(self): - return self._choices - - -class ChoiceTransformer(IdentityTransformer): - __discord_app_commands_is_choice__: ClassVar[bool] = True - - def __init__(self, inner_type: Any) -> None: - if inner_type is int: - opt_type = AppCommandOptionType.integer - elif inner_type is float: - opt_type = AppCommandOptionType.number - elif inner_type is str: - opt_type = AppCommandOptionType.string - else: - raise TypeError(f'expected int, str, or float values not {inner_type!r}') - - super().__init__(opt_type) - - -class EnumValueTransformer(Transformer): - def __init__(self, enum: Any) -> None: - super().__init__() - - values = list(enum) - if len(values) < 2: - raise TypeError('enum.Enum requires at least two values.') - - first = type(values[0].value) - if first is int: - opt_type = AppCommandOptionType.integer - elif first is float: - opt_type = AppCommandOptionType.number - elif first is str: - opt_type = AppCommandOptionType.string - else: - raise TypeError(f'expected int, str, or float values not {first!r}') - - self._type: AppCommandOptionType = opt_type - self._enum: Any = enum - self._choices = [Choice(name=v.name, value=v.value) for v in values] - - @property - def _error_display_name(self) -> str: - return self._enum.__name__ - - @property - def type(self) -> AppCommandOptionType: - return self._type - - @property - def choices(self): - return self._choices - - async def transform(self, interaction: Interaction, value: Any, /) -> Any: - return self._enum(value) - - -class EnumNameTransformer(Transformer): - def __init__(self, enum: Any) -> None: - super().__init__() - - values = list(enum) - if len(values) < 2: - raise TypeError('enum.Enum requires at least two values.') - - self._enum: Any = enum - self._choices = [Choice(name=v.name, value=v.name) for v in values] - - @property - def _error_display_name(self) -> str: - return self._enum.__name__ - - @property - def type(self) -> AppCommandOptionType: - return AppCommandOptionType.string - - @property - def choices(self): - return self._choices - - async def transform(self, interaction: Interaction, value: Any, /) -> Any: - return self._enum[value] - - -class InlineTransformer(Transformer): - def __init__(self, annotation: Any) -> None: - super().__init__() - self.annotation: Any = annotation - - @property - def _error_display_name(self) -> str: - return self.annotation.__name__ - - @property - def type(self) -> AppCommandOptionType: - return AppCommandOptionType.string - - async def transform(self, interaction: Interaction, value: Any, /) -> Any: - return await self.annotation.transform(interaction, value) - - -if TYPE_CHECKING: - from typing_extensions import Annotated as Transform - from typing_extensions import Annotated as Range -else: - - class Transform: - """A type annotation that can be applied to a parameter to customise the behaviour of - an option type by transforming with the given :class:`Transformer`. This requires - the usage of two generic parameters, the first one is the type you're converting to and the second - one is the type of the :class:`Transformer` actually doing the transformation. - - During type checking time this is equivalent to :obj:`typing.Annotated` so type checkers understand - the intent of the code. - - For example usage, check :class:`Transformer`. - - .. versionadded:: 2.0 - """ - - def __class_getitem__(cls, items) -> _TransformMetadata: - if not isinstance(items, tuple): - raise TypeError(f'expected tuple for arguments, received {items.__class__.__name__} instead') - - if len(items) != 2: - raise TypeError('Transform only accepts exactly two arguments') - - _, transformer = items - - if inspect.isclass(transformer): - if not issubclass(transformer, Transformer): - raise TypeError(f'second argument of Transform must be a Transformer class not {transformer!r}') - transformer = transformer() - elif not isinstance(transformer, Transformer): - raise TypeError(f'second argument of Transform must be a Transformer not {transformer.__class__.__name__}') - - return transformer - - class Range: - """A type annotation that can be applied to a parameter to require a numeric or string - type to fit within the range provided. - - During type checking time this is equivalent to :obj:`typing.Annotated` so type checkers understand - the intent of the code. - - Some example ranges: - - - ``Range[int, 10]`` means the minimum is 10 with no maximum. - - ``Range[int, None, 10]`` means the maximum is 10 with no minimum. - - ``Range[int, 1, 10]`` means the minimum is 1 and the maximum is 10. - - ``Range[float, 1.0, 5.0]`` means the minimum is 1.0 and the maximum is 5.0. - - ``Range[str, 1, 10]`` means the minimum length is 1 and the maximum length is 10. - - .. versionadded:: 2.0 - - Examples - ---------- - - .. code-block:: python3 - - @app_commands.command() - async def range(interaction: discord.Interaction, value: app_commands.Range[int, 10, 12]): - await interaction.response.send_message(f'Your value is {value}', ephemeral=True) - """ - - def __class_getitem__(cls, obj) -> _TransformMetadata: - if not isinstance(obj, tuple): - raise TypeError(f'expected tuple for arguments, received {obj.__class__.__name__} instead') - - if len(obj) == 2: - obj = (*obj, None) - elif len(obj) != 3: - raise TypeError('Range accepts either two or three arguments with the first being the type of range.') - - obj_type, min, max = obj - - if min is None and max is None: - raise TypeError('Range must not be empty') - - if min is not None and max is not None: - # At this point max and min are both not none - if type(min) != type(max): - raise TypeError('Both min and max in Range must be the same type') - - if obj_type is int: - opt_type = AppCommandOptionType.integer - elif obj_type is float: - opt_type = AppCommandOptionType.number - elif obj_type is str: - opt_type = AppCommandOptionType.string - else: - raise TypeError(f'expected int, float, or str as range type, received {obj_type!r} instead') - - if obj_type in (str, int): - cast = int - else: - cast = float - - transformer = RangeTransformer( - opt_type, - min=cast(min) if min is not None else None, - max=cast(max) if max is not None else None, - ) - return transformer - - -class MemberTransformer(Transformer): - @property - def type(self) -> AppCommandOptionType: - return AppCommandOptionType.user - - async def transform(self, interaction: Interaction, value: Any, /) -> Member: - if not isinstance(value, Member): - raise TransformerError(value, self.type, self) - return value - - -class BaseChannelTransformer(Transformer): - def __init__(self, *channel_types: Type[Any]) -> None: - super().__init__() - if len(channel_types) == 1: - display_name = channel_types[0].__name__ - types = CHANNEL_TO_TYPES[channel_types[0]] - else: - display_name = '{}, and {}'.format(', '.join(t.__name__ for t in channel_types[:-1]), channel_types[-1].__name__) - types = [] - - for t in channel_types: - try: - types.extend(CHANNEL_TO_TYPES[t]) - except KeyError: - raise TypeError('Union type of channels must be entirely made up of channels') from None - - self._types: Tuple[Type[Any]] = channel_types - self._channel_types: List[ChannelType] = types - self._display_name = display_name - - @property - def _error_display_name(self) -> str: - return self._display_name - - @property - def type(self) -> AppCommandOptionType: - return AppCommandOptionType.channel - - @property - def channel_types(self) -> List[ChannelType]: - return self._channel_types - - async def transform(self, interaction: Interaction, value: Any, /): - resolved = value.resolve() - if resolved is None or not isinstance(resolved, self._types): - raise TransformerError(value, AppCommandOptionType.channel, self) - return resolved - - -class RawChannelTransformer(BaseChannelTransformer): - async def transform(self, interaction: Interaction, value: Any, /): - if not isinstance(value, self._types): - raise TransformerError(value, AppCommandOptionType.channel, self) - return value - - -class UnionChannelTransformer(BaseChannelTransformer): - async def transform(self, interaction: Interaction, value: Any, /): - if isinstance(value, self._types): - return value - - resolved = value.resolve() - if resolved is None or not isinstance(resolved, self._types): - raise TransformerError(value, AppCommandOptionType.channel, self) - return resolved - - -CHANNEL_TO_TYPES: Dict[Any, List[ChannelType]] = { - AppCommandChannel: [ - ChannelType.stage_voice, - ChannelType.voice, - ChannelType.text, - ChannelType.news, - ChannelType.category, - ChannelType.forum, - ], - GuildChannel: [ - ChannelType.stage_voice, - ChannelType.voice, - ChannelType.text, - ChannelType.news, - ChannelType.category, - ChannelType.forum, - ], - AppCommandThread: [ChannelType.news_thread, ChannelType.private_thread, ChannelType.public_thread], - Thread: [ChannelType.news_thread, ChannelType.private_thread, ChannelType.public_thread], - StageChannel: [ChannelType.stage_voice], - VoiceChannel: [ChannelType.voice], - TextChannel: [ChannelType.text, ChannelType.news], - CategoryChannel: [ChannelType.category], - ForumChannel: [ChannelType.forum], -} - -BUILT_IN_TRANSFORMERS: Dict[Any, Transformer] = { - str: IdentityTransformer(AppCommandOptionType.string), - int: IdentityTransformer(AppCommandOptionType.integer), - float: IdentityTransformer(AppCommandOptionType.number), - bool: IdentityTransformer(AppCommandOptionType.boolean), - User: IdentityTransformer(AppCommandOptionType.user), - Member: MemberTransformer(), - Role: IdentityTransformer(AppCommandOptionType.role), - AppCommandChannel: RawChannelTransformer(AppCommandChannel), - AppCommandThread: RawChannelTransformer(AppCommandThread), - GuildChannel: BaseChannelTransformer(GuildChannel), - Thread: BaseChannelTransformer(Thread), - StageChannel: BaseChannelTransformer(StageChannel), - VoiceChannel: BaseChannelTransformer(VoiceChannel), - TextChannel: BaseChannelTransformer(TextChannel), - CategoryChannel: BaseChannelTransformer(CategoryChannel), - ForumChannel: BaseChannelTransformer(ForumChannel), - Attachment: IdentityTransformer(AppCommandOptionType.attachment), -} - -ALLOWED_DEFAULTS: Dict[AppCommandOptionType, Tuple[Type[Any], ...]] = { - AppCommandOptionType.string: (str, NoneType), - AppCommandOptionType.integer: (int, NoneType), - AppCommandOptionType.boolean: (bool, NoneType), - AppCommandOptionType.number: (float, NoneType), -} - - -def get_supported_annotation( - annotation: Any, - *, - _none: type = NoneType, - _mapping: Dict[Any, Transformer] = BUILT_IN_TRANSFORMERS, -) -> Tuple[Any, Any, bool]: - """Returns an appropriate, yet supported, annotation along with an optional default value. - - The third boolean element of the tuple indicates if default values should be validated. - - This differs from the built in mapping by supporting a few more things. - Likewise, this returns a "transformed" annotation that is ready to use with CommandParameter.transform. - """ - - try: - return (_mapping[annotation], MISSING, True) - except (KeyError, TypeError): - pass - - if isinstance(annotation, Transformer): - return (annotation, MISSING, False) - - if inspect.isclass(annotation): - if issubclass(annotation, Transformer): - return (annotation(), MISSING, False) - if issubclass(annotation, (Enum, InternalEnum)): - if all(isinstance(v.value, (str, int, float)) for v in annotation): - return (EnumValueTransformer(annotation), MISSING, False) - else: - return (EnumNameTransformer(annotation), MISSING, False) - if annotation is Choice: - raise TypeError('Choice requires a type argument of int, str, or float') - - # Check if a transform @classmethod is given to the class - # These flatten into simple "inline" transformers with implicit strings - transform_classmethod = annotation.__dict__.get('transform', None) - if isinstance(transform_classmethod, classmethod): - params = inspect.signature(transform_classmethod.__func__).parameters - if len(params) != 3: - raise TypeError('Inline transformer with transform classmethod requires 3 parameters') - if not inspect.iscoroutinefunction(transform_classmethod.__func__): - raise TypeError('Inline transformer with transform classmethod must be a coroutine') - return (InlineTransformer(annotation), MISSING, False) - - # Check if there's an origin - origin = getattr(annotation, '__origin__', None) - if origin is Literal: - args = annotation.__args__ # type: ignore - return (LiteralTransformer(args), MISSING, True) - - if origin is Choice: - arg = annotation.__args__[0] # type: ignore - return (ChoiceTransformer(arg), MISSING, True) - - if origin is not Union: - # Only Union/Optional is supported right now so bail early - raise TypeError(f'unsupported type annotation {annotation!r}') - - default = MISSING - args = annotation.__args__ # type: ignore - if args[-1] is _none: - if len(args) == 2: - underlying = args[0] - inner, _, validate_default = get_supported_annotation(underlying) - if inner is None: - raise TypeError(f'unsupported inner optional type {underlying!r}') - return (inner, None, validate_default) - else: - args = args[:-1] - default = None - - # Check for channel union types - if any(arg in CHANNEL_TO_TYPES for arg in args): - # If any channel type is given, then *all* must be channel types - return (UnionChannelTransformer(*args), default, True) - - # The only valid transformations here are: - # [Member, User] => user - # [Member, User, Role] => mentionable - # [Member | User, Role] => mentionable - supported_types: Set[Any] = {Role, Member, User} - if not all(arg in supported_types for arg in args): - raise TypeError(f'unsupported types given inside {annotation!r}') - if args == (User, Member) or args == (Member, User): - return (IdentityTransformer(AppCommandOptionType.user), default, True) - - return (IdentityTransformer(AppCommandOptionType.mentionable), default, True) - - -def annotation_to_parameter(annotation: Any, parameter: inspect.Parameter) -> CommandParameter: - """Returns the appropriate :class:`CommandParameter` for the given annotation. - - The resulting ``_annotation`` attribute might not match the one given here and might - be transformed in order to be easier to call from the ``transform`` asynchronous function - of a command parameter. - """ - - (inner, default, validate_default) = get_supported_annotation(annotation) - type = inner.type - - if default is MISSING or default is None: - param_default = parameter.default - if param_default is not parameter.empty: - default = param_default - - # Verify validity of the default parameter - if default is not MISSING and validate_default: - valid_types: Tuple[Any, ...] = ALLOWED_DEFAULTS.get(type, (NoneType,)) - if not isinstance(default, valid_types): - raise TypeError(f'invalid default parameter type given ({default.__class__}), expected {valid_types}') - - result = CommandParameter( - type=type, - _annotation=inner, - default=default, - required=default is MISSING, - name=parameter.name, - ) - - choices = inner.choices - if choices is not None: - result.choices = choices - - # These methods should be duck typed - if type in (AppCommandOptionType.number, AppCommandOptionType.string, AppCommandOptionType.integer): - result.min_value = inner.min_value - result.max_value = inner.max_value - - if type is AppCommandOptionType.channel: - result.channel_types = inner.channel_types - - if parameter.kind in (parameter.POSITIONAL_ONLY, parameter.VAR_KEYWORD, parameter.VAR_POSITIONAL): - raise TypeError(f'unsupported parameter kind in callback: {parameter.kind!s}') - - # Check if the method is overridden - if inner.autocomplete.__func__ is not Transformer.autocomplete: - from .commands import validate_auto_complete_callback - - result.autocomplete = validate_auto_complete_callback(inner.autocomplete) - - return result diff --git a/.venv/Lib/site-packages/discord/app_commands/translator.py b/.venv/Lib/site-packages/discord/app_commands/translator.py deleted file mode 100644 index 1741054..0000000 --- a/.venv/Lib/site-packages/discord/app_commands/translator.py +++ /dev/null @@ -1,305 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations -from typing import TYPE_CHECKING, Any, Generic, Literal, Optional, TypeVar, Union, overload -from .errors import TranslationError -from ..enums import Enum, Locale - - -if TYPE_CHECKING: - from .commands import Command, ContextMenu, Group, Parameter - from .models import Choice - - -__all__ = ( - 'TranslationContextLocation', - 'TranslationContextTypes', - 'TranslationContext', - 'Translator', - 'locale_str', -) - - -class TranslationContextLocation(Enum): - command_name = 0 - command_description = 1 - group_name = 2 - group_description = 3 - parameter_name = 4 - parameter_description = 5 - choice_name = 6 - other = 7 - - -_L = TypeVar('_L', bound=TranslationContextLocation) -_D = TypeVar('_D') - - -class TranslationContext(Generic[_L, _D]): - """A class that provides context for the :class:`locale_str` being translated. - - This is useful to determine where exactly the string is located and aid in looking - up the actual translation. - - Attributes - ----------- - location: :class:`TranslationContextLocation` - The location where this string is located. - data: Any - The extraneous data that is being translated. - """ - - __slots__ = ('location', 'data') - - @overload - def __init__( - self, location: Literal[TranslationContextLocation.command_name], data: Union[Command[Any, ..., Any], ContextMenu] - ) -> None: - ... - - @overload - def __init__( - self, location: Literal[TranslationContextLocation.command_description], data: Command[Any, ..., Any] - ) -> None: - ... - - @overload - def __init__( - self, - location: Literal[TranslationContextLocation.group_name, TranslationContextLocation.group_description], - data: Group, - ) -> None: - ... - - @overload - def __init__( - self, - location: Literal[TranslationContextLocation.parameter_name, TranslationContextLocation.parameter_description], - data: Parameter, - ) -> None: - ... - - @overload - def __init__(self, location: Literal[TranslationContextLocation.choice_name], data: Choice[Any]) -> None: - ... - - @overload - def __init__(self, location: Literal[TranslationContextLocation.other], data: Any) -> None: - ... - - def __init__(self, location: _L, data: _D) -> None: - self.location: _L = location - self.data: _D = data - - -# For type checking purposes, it makes sense to allow the user to leverage type narrowing -# So code like this works as expected: -# -# if context.type == TranslationContextLocation.command_name: -# reveal_type(context.data) # Revealed type is Command | ContextMenu -# -# This requires a union of types -CommandNameTranslationContext = TranslationContext[ - Literal[TranslationContextLocation.command_name], Union['Command[Any, ..., Any]', 'ContextMenu'] -] -CommandDescriptionTranslationContext = TranslationContext[ - Literal[TranslationContextLocation.command_description], 'Command[Any, ..., Any]' -] -GroupTranslationContext = TranslationContext[ - Literal[TranslationContextLocation.group_name, TranslationContextLocation.group_description], 'Group' -] -ParameterTranslationContext = TranslationContext[ - Literal[TranslationContextLocation.parameter_name, TranslationContextLocation.parameter_description], 'Parameter' -] -ChoiceTranslationContext = TranslationContext[Literal[TranslationContextLocation.choice_name], 'Choice[Any]'] -OtherTranslationContext = TranslationContext[Literal[TranslationContextLocation.other], Any] - -TranslationContextTypes = Union[ - CommandNameTranslationContext, - CommandDescriptionTranslationContext, - GroupTranslationContext, - ParameterTranslationContext, - ChoiceTranslationContext, - OtherTranslationContext, -] - - -class Translator: - """A class that handles translations for commands, parameters, and choices. - - Translations are done lazily in order to allow for async enabled translations as well - as supporting a wide array of translation systems such as :mod:`gettext` and - `Project Fluent `_. - - In order for a translator to be used, it must be set using the :meth:`CommandTree.set_translator` - method. The translation flow for a string is as follows: - - 1. Use :class:`locale_str` instead of :class:`str` in areas of a command you want to be translated. - - Currently, these are command names, command descriptions, parameter names, parameter descriptions, and choice names. - - This can also be used inside the :func:`~discord.app_commands.describe` decorator. - 2. Call :meth:`CommandTree.set_translator` to the translator instance that will handle the translations. - 3. Call :meth:`CommandTree.sync` - 4. The library will call :meth:`Translator.translate` on all the relevant strings being translated. - - .. versionadded:: 2.0 - """ - - async def load(self) -> None: - """|coro| - - An asynchronous setup function for loading the translation system. - - The default implementation does nothing. - - This is invoked when :meth:`CommandTree.set_translator` is called. - """ - pass - - async def unload(self) -> None: - """|coro| - - An asynchronous teardown function for unloading the translation system. - - The default implementation does nothing. - - This is invoked when :meth:`CommandTree.set_translator` is called - if a tree already has a translator or when :meth:`discord.Client.close` is called. - """ - pass - - async def _checked_translate( - self, string: locale_str, locale: Locale, context: TranslationContextTypes - ) -> Optional[str]: - try: - return await self.translate(string, locale, context) - except TranslationError: - raise - except Exception as e: - raise TranslationError(string=string, locale=locale, context=context) from e - - async def translate(self, string: locale_str, locale: Locale, context: TranslationContextTypes) -> Optional[str]: - """|coro| - - Translates the given string to the specified locale. - - If the string cannot be translated, ``None`` should be returned. - - The default implementation returns ``None``. - - If an exception is raised in this method, it should inherit from :exc:`TranslationError`. - If it doesn't, then when this is called the exception will be chained with it instead. - - Parameters - ------------ - string: :class:`locale_str` - The string being translated. - locale: :class:`~discord.Locale` - The locale being requested for translation. - context: :class:`TranslationContext` - The translation context where the string originated from. - For better type checking ergonomics, the ``TranslationContextTypes`` - type can be used instead to aid with type narrowing. It is functionally - equivalent to :class:`TranslationContext`. - """ - - return None - - -class locale_str: - """Marks a string as ready for translation. - - This is done lazily and is not actually translated until :meth:`CommandTree.sync` is called. - - The sync method then ultimately defers the responsibility of translating to the :class:`Translator` - instance used by the :class:`CommandTree`. For more information on the translation flow, see the - :class:`Translator` documentation. - - .. container:: operations - - .. describe:: str(x) - - Returns the message passed to the string. - - .. describe:: x == y - - Checks if the string is equal to another string. - - .. describe:: x != y - - Checks if the string is not equal to another string. - - .. describe:: hash(x) - - Returns the hash of the string. - - .. versionadded:: 2.0 - - Attributes - ------------ - message: :class:`str` - The message being translated. Once set, this cannot be changed. - - .. warning:: - - This must be the default "message" that you send to Discord. - Discord sends this message back to the library and the library - uses it to access the data in order to dispatch commands. - - For example, in a command name context, if the command - name is ``foo`` then the message *must* also be ``foo``. - For other translation systems that require a message ID such - as Fluent, consider using a keyword argument to pass it in. - extras: :class:`dict` - A dict of user provided extras to attach to the translated string. - This can be used to add more context, information, or any metadata necessary - to aid in actually translating the string. - - Since these are passed via keyword arguments, the keys are strings. - """ - - __slots__ = ('__message', 'extras') - - def __init__(self, message: str, /, **kwargs: Any) -> None: - self.__message: str = message - self.extras: dict[str, Any] = kwargs - - @property - def message(self) -> str: - return self.__message - - def __str__(self) -> str: - return self.__message - - def __repr__(self) -> str: - kwargs = ', '.join(f'{k}={v!r}' for k, v in self.extras.items()) - if kwargs: - return f'{self.__class__.__name__}({self.__message!r}, {kwargs})' - return f'{self.__class__.__name__}({self.__message!r})' - - def __eq__(self, obj: object) -> bool: - return isinstance(obj, locale_str) and self.message == obj.message - - def __hash__(self) -> int: - return hash(self.__message) diff --git a/.venv/Lib/site-packages/discord/app_commands/tree.py b/.venv/Lib/site-packages/discord/app_commands/tree.py deleted file mode 100644 index 5bdfbec..0000000 --- a/.venv/Lib/site-packages/discord/app_commands/tree.py +++ /dev/null @@ -1,1255 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations -import logging -import inspect - -from typing import ( - Any, - TYPE_CHECKING, - Callable, - Coroutine, - Dict, - Generator, - Generic, - List, - Literal, - Optional, - Sequence, - Set, - Tuple, - Union, - overload, -) -from collections import Counter - - -from .namespace import Namespace, ResolveKey -from .models import AppCommand -from .commands import Command, ContextMenu, Group -from .errors import ( - AppCommandError, - CommandAlreadyRegistered, - CommandNotFound, - CommandSignatureMismatch, - CommandLimitReached, - CommandSyncFailure, - MissingApplicationID, -) -from .translator import Translator, locale_str -from ..errors import ClientException, HTTPException -from ..enums import AppCommandType, InteractionType -from ..utils import MISSING, _get_as_snowflake, _is_submodule, _shorten -from .._types import ClientT - - -if TYPE_CHECKING: - from ..types.interactions import ApplicationCommandInteractionData, ApplicationCommandInteractionDataOption - from ..interactions import Interaction - from ..abc import Snowflake - from .commands import ContextMenuCallback, CommandCallback, P, T - - ErrorFunc = Callable[ - [Interaction, AppCommandError], - Coroutine[Any, Any, Any], - ] - -__all__ = ('CommandTree',) - -_log = logging.getLogger(__name__) - - -def _retrieve_guild_ids( - command: Any, guild: Optional[Snowflake] = MISSING, guilds: Sequence[Snowflake] = MISSING -) -> Optional[Set[int]]: - if guild is not MISSING and guilds is not MISSING: - raise TypeError('cannot mix guild and guilds keyword arguments') - - # guilds=[] or guilds=[...] - if guild is MISSING: - # If no arguments are given then it should default to the ones - # given to the guilds(...) decorator or None for global. - if guilds is MISSING: - return getattr(command, '_guild_ids', None) - - # guilds=[] is the same as global - if len(guilds) == 0: - return None - - return {g.id for g in guilds} - - # At this point it should be... - # guild=None or guild=Object - if guild is None: - return None - return {guild.id} - - -class CommandTree(Generic[ClientT]): - """Represents a container that holds application command information. - - Parameters - ----------- - client: :class:`~discord.Client` - The client instance to get application command information from. - fallback_to_global: :class:`bool` - If a guild-specific command is not found when invoked, then try falling back into - a global command in the tree. For example, if the tree locally has a ``/ping`` command - under the global namespace but the guild has a guild-specific ``/ping``, instead of failing - to find the guild-specific ``/ping`` command it will fall back to the global ``/ping`` command. - This has the potential to raise more :exc:`~discord.app_commands.CommandSignatureMismatch` errors - than usual. Defaults to ``True``. - """ - - def __init__(self, client: ClientT, *, fallback_to_global: bool = True): - self.client: ClientT = client - self._http = client.http - self._state = client._connection - - if self._state._command_tree is not None: - raise ClientException('This client already has an associated command tree.') - - self._state._command_tree = self - self.fallback_to_global: bool = fallback_to_global - self._guild_commands: Dict[int, Dict[str, Union[Command, Group]]] = {} - self._global_commands: Dict[str, Union[Command, Group]] = {} - # (name, guild_id, command_type): Command - # The above two mappings can use this structure too but we need fast retrieval - # by name and guild_id in the above case while here it isn't as important since - # it's uncommon and N=5 anyway. - self._context_menus: Dict[Tuple[str, Optional[int], int], ContextMenu] = {} - - async def fetch_command(self, command_id: int, /, *, guild: Optional[Snowflake] = None) -> AppCommand: - """|coro| - - Fetches an application command from the application. - - Parameters - ----------- - command_id: :class:`int` - The ID of the command to fetch. - guild: Optional[:class:`~discord.abc.Snowflake`] - The guild to fetch the command from. If not passed then the global command - is fetched instead. - - Raises - ------- - HTTPException - Fetching the command failed. - MissingApplicationID - The application ID could not be found. - NotFound - The application command was not found. - This could also be because the command is a guild command - and the guild was not specified and vice versa. - - Returns - -------- - :class:`~discord.app_commands.AppCommand` - The application command. - """ - if self.client.application_id is None: - raise MissingApplicationID - - if guild is None: - command = await self._http.get_global_command(self.client.application_id, command_id) - else: - command = await self._http.get_guild_command(self.client.application_id, guild.id, command_id) - - return AppCommand(data=command, state=self._state) - - async def fetch_commands(self, *, guild: Optional[Snowflake] = None) -> List[AppCommand]: - """|coro| - - Fetches the application's current commands. - - If no guild is passed then global commands are fetched, otherwise - the guild's commands are fetched instead. - - .. note:: - - This includes context menu commands. - - Parameters - ----------- - guild: Optional[:class:`~discord.abc.Snowflake`] - The guild to fetch the commands from. If not passed then global commands - are fetched instead. - - Raises - ------- - HTTPException - Fetching the commands failed. - MissingApplicationID - The application ID could not be found. - - Returns - -------- - List[:class:`~discord.app_commands.AppCommand`] - The application's commands. - """ - if self.client.application_id is None: - raise MissingApplicationID - - if guild is None: - commands = await self._http.get_global_commands(self.client.application_id) - else: - commands = await self._http.get_guild_commands(self.client.application_id, guild.id) - - return [AppCommand(data=data, state=self._state) for data in commands] - - def copy_global_to(self, *, guild: Snowflake) -> None: - """Copies all global commands to the specified guild. - - This method is mainly available for development purposes, as it allows you - to copy your global commands over to a testing guild easily. - - Note that this method will *override* pre-existing guild commands that would conflict. - - Parameters - ----------- - guild: :class:`~discord.abc.Snowflake` - The guild to copy the commands to. - - Raises - -------- - CommandLimitReached - The maximum number of commands was reached for that guild. - This is currently 100 for slash commands and 5 for context menu commands. - """ - - try: - mapping = self._guild_commands[guild.id].copy() - except KeyError: - mapping = {} - - mapping.update(self._global_commands) - if len(mapping) > 100: - raise CommandLimitReached(guild_id=guild.id, limit=100) - - ctx_menu: Dict[Tuple[str, Optional[int], int], ContextMenu] = { - (name, guild.id, cmd_type): cmd - for ((name, g, cmd_type), cmd) in self._context_menus.items() - if g is None or g == guild.id - } - - counter = Counter(cmd_type for _, _, cmd_type in ctx_menu) - for cmd_type, count in counter.items(): - if count > 5: - as_enum = AppCommandType(cmd_type) - raise CommandLimitReached(guild_id=guild.id, limit=5, type=as_enum) - - self._context_menus.update(ctx_menu) - self._guild_commands[guild.id] = mapping - - def add_command( - self, - command: Union[Command[Any, ..., Any], ContextMenu, Group], - /, - *, - guild: Optional[Snowflake] = MISSING, - guilds: Sequence[Snowflake] = MISSING, - override: bool = False, - ) -> None: - """Adds an application command to the tree. - - This only adds the command locally -- in order to sync the commands - and enable them in the client, :meth:`sync` must be called. - - The root parent of the command is added regardless of the type passed. - - Parameters - ----------- - command: Union[:class:`Command`, :class:`Group`] - The application command or group to add. - guild: Optional[:class:`~discord.abc.Snowflake`] - The guild to add the command to. If not given or ``None`` then it - becomes a global command instead. - guilds: List[:class:`~discord.abc.Snowflake`] - The list of guilds to add the command to. This cannot be mixed - with the ``guild`` parameter. If no guilds are given at all - then it becomes a global command instead. - override: :class:`bool` - Whether to override a command with the same name. If ``False`` - an exception is raised. Default is ``False``. - - Raises - -------- - ~discord.app_commands.CommandAlreadyRegistered - The command was already registered and no override was specified. - TypeError - The application command passed is not a valid application command. - Or, ``guild`` and ``guilds`` were both given. - CommandLimitReached - The maximum number of commands was reached globally or for that guild. - This is currently 100 for slash commands and 5 for context menu commands. - """ - - guild_ids = _retrieve_guild_ids(command, guild, guilds) - if isinstance(command, ContextMenu): - type = command.type.value - name = command.name - - def _context_menu_add_helper( - guild_id: Optional[int], - data: Dict[Tuple[str, Optional[int], int], ContextMenu], - name: str = name, - type: int = type, - ) -> None: - key = (name, guild_id, type) - found = key in self._context_menus - if found and not override: - raise CommandAlreadyRegistered(name, guild_id) - - # If the key is found and overridden then it shouldn't count as an extra addition - # read as `0 if override and found else 1` if confusing - to_add = not (override and found) - total = sum(1 for _, g, t in self._context_menus if g == guild_id and t == type) - if total + to_add > 5: - raise CommandLimitReached(guild_id=guild_id, limit=5, type=AppCommandType(type)) - data[key] = command - - if guild_ids is None: - _context_menu_add_helper(None, self._context_menus) - else: - current: Dict[Tuple[str, Optional[int], int], ContextMenu] = {} - for guild_id in guild_ids: - _context_menu_add_helper(guild_id, current) - - # Update at the end in order to make sure the update is atomic. - # An error during addition could end up making the context menu mapping - # have a partial state - self._context_menus.update(current) - return - elif not isinstance(command, (Command, Group)): - raise TypeError(f'Expected an application command, received {command.__class__.__name__} instead') - - # todo: validate application command groups having children (required) - - root = command.root_parent or command - name = root.name - if guild_ids is not None: - # Validate that the command can be added first, before actually - # adding it into the mapping. This ensures atomicity. - for guild_id in guild_ids: - commands = self._guild_commands.get(guild_id, {}) - found = name in commands - if found and not override: - raise CommandAlreadyRegistered(name, guild_id) - - to_add = not (override and found) - if len(commands) + to_add > 100: - raise CommandLimitReached(guild_id=guild_id, limit=100) - - # Actually add the command now that it has been verified to be okay. - for guild_id in guild_ids: - commands = self._guild_commands.setdefault(guild_id, {}) - commands[name] = root - else: - found = name in self._global_commands - if found and not override: - raise CommandAlreadyRegistered(name, None) - - to_add = not (override and found) - if len(self._global_commands) + to_add > 100: - raise CommandLimitReached(guild_id=None, limit=100) - self._global_commands[name] = root - - @overload - def remove_command( - self, - command: str, - /, - *, - guild: Optional[Snowflake] = ..., - type: Literal[AppCommandType.message, AppCommandType.user], - ) -> Optional[ContextMenu]: - ... - - @overload - def remove_command( - self, - command: str, - /, - *, - guild: Optional[Snowflake] = ..., - type: Literal[AppCommandType.chat_input] = ..., - ) -> Optional[Union[Command[Any, ..., Any], Group]]: - ... - - @overload - def remove_command( - self, - command: str, - /, - *, - guild: Optional[Snowflake] = ..., - type: AppCommandType, - ) -> Optional[Union[Command[Any, ..., Any], ContextMenu, Group]]: - ... - - def remove_command( - self, - command: str, - /, - *, - guild: Optional[Snowflake] = None, - type: AppCommandType = AppCommandType.chat_input, - ) -> Optional[Union[Command[Any, ..., Any], ContextMenu, Group]]: - """Removes an application command from the tree. - - This only removes the command locally -- in order to sync the commands - and remove them in the client, :meth:`sync` must be called. - - Parameters - ----------- - command: :class:`str` - The name of the root command to remove. - guild: Optional[:class:`~discord.abc.Snowflake`] - The guild to remove the command from. If not given or ``None`` then it - removes a global command instead. - type: :class:`~discord.AppCommandType` - The type of command to remove. Defaults to :attr:`~discord.AppCommandType.chat_input`, - i.e. slash commands. - - Returns - --------- - Optional[Union[:class:`Command`, :class:`ContextMenu`, :class:`Group`]] - The application command that got removed. - If nothing was removed then ``None`` is returned instead. - """ - - if type is AppCommandType.chat_input: - if guild is None: - return self._global_commands.pop(command, None) - else: - try: - commands = self._guild_commands[guild.id] - except KeyError: - return None - else: - return commands.pop(command, None) - elif type in (AppCommandType.user, AppCommandType.message): - guild_id = None if guild is None else guild.id - key = (command, guild_id, type.value) - return self._context_menus.pop(key, None) - - def clear_commands(self, *, guild: Optional[Snowflake], type: Optional[AppCommandType] = None) -> None: - """Clears all application commands from the tree. - - This only removes the commands locally -- in order to sync the commands - and remove them in the client, :meth:`sync` must be called. - - Parameters - ----------- - guild: Optional[:class:`~discord.abc.Snowflake`] - The guild to remove the commands from. If ``None`` then it - removes all global commands instead. - type: :class:`~discord.AppCommandType` - The type of command to clear. If not given or ``None`` then it removes all commands - regardless of the type. - """ - - if type is None or type is AppCommandType.chat_input: - if guild is None: - self._global_commands.clear() - else: - try: - commands = self._guild_commands[guild.id] - except KeyError: - pass - else: - commands.clear() - - guild_id = None if guild is None else guild.id - if type is None: - self._context_menus = { - (name, _guild_id, value): cmd - for (name, _guild_id, value), cmd in self._context_menus.items() - if _guild_id != guild_id - } - elif type in (AppCommandType.user, AppCommandType.message): - self._context_menus = { - (name, _guild_id, value): cmd - for (name, _guild_id, value), cmd in self._context_menus.items() - if _guild_id != guild_id or value != type.value - } - - @overload - def get_command( - self, - command: str, - /, - *, - guild: Optional[Snowflake] = ..., - type: Literal[AppCommandType.message, AppCommandType.user], - ) -> Optional[ContextMenu]: - ... - - @overload - def get_command( - self, - command: str, - /, - *, - guild: Optional[Snowflake] = ..., - type: Literal[AppCommandType.chat_input] = ..., - ) -> Optional[Union[Command[Any, ..., Any], Group]]: - ... - - @overload - def get_command( - self, - command: str, - /, - *, - guild: Optional[Snowflake] = ..., - type: AppCommandType, - ) -> Optional[Union[Command[Any, ..., Any], ContextMenu, Group]]: - ... - - def get_command( - self, - command: str, - /, - *, - guild: Optional[Snowflake] = None, - type: AppCommandType = AppCommandType.chat_input, - ) -> Optional[Union[Command[Any, ..., Any], ContextMenu, Group]]: - """Gets an application command from the tree. - - Parameters - ----------- - command: :class:`str` - The name of the root command to get. - guild: Optional[:class:`~discord.abc.Snowflake`] - The guild to get the command from. If not given or ``None`` then it - gets a global command instead. - type: :class:`~discord.AppCommandType` - The type of command to get. Defaults to :attr:`~discord.AppCommandType.chat_input`, - i.e. slash commands. - - Returns - --------- - Optional[Union[:class:`Command`, :class:`ContextMenu`, :class:`Group`]] - The application command that was found. - If nothing was found then ``None`` is returned instead. - """ - - if type is AppCommandType.chat_input: - if guild is None: - return self._global_commands.get(command) - else: - try: - commands = self._guild_commands[guild.id] - except KeyError: - return None - else: - return commands.get(command) - elif type in (AppCommandType.user, AppCommandType.message): - guild_id = None if guild is None else guild.id - key = (command, guild_id, type.value) - return self._context_menus.get(key) - - @overload - def get_commands( - self, - *, - guild: Optional[Snowflake] = ..., - type: Literal[AppCommandType.message, AppCommandType.user], - ) -> List[ContextMenu]: - ... - - @overload - def get_commands( - self, - *, - guild: Optional[Snowflake] = ..., - type: Literal[AppCommandType.chat_input], - ) -> List[Union[Command[Any, ..., Any], Group]]: - ... - - @overload - def get_commands( - self, - *, - guild: Optional[Snowflake] = ..., - type: AppCommandType, - ) -> Union[List[Union[Command[Any, ..., Any], Group]], List[ContextMenu]]: - ... - - @overload - def get_commands( - self, - *, - guild: Optional[Snowflake] = ..., - type: Optional[AppCommandType] = ..., - ) -> List[Union[Command[Any, ..., Any], Group, ContextMenu]]: - ... - - def get_commands( - self, - *, - guild: Optional[Snowflake] = None, - type: Optional[AppCommandType] = None, - ) -> Union[ - List[ContextMenu], - List[Union[Command[Any, ..., Any], Group]], - List[Union[Command[Any, ..., Any], Group, ContextMenu]], - ]: - """Gets all application commands from the tree. - - Parameters - ----------- - guild: Optional[:class:`~discord.abc.Snowflake`] - The guild to get the commands from, not including global commands. - If not given or ``None`` then only global commands are returned. - type: Optional[:class:`~discord.AppCommandType`] - The type of commands to get. When not given or ``None``, then all - command types are returned. - - Returns - --------- - List[Union[:class:`ContextMenu`, :class:`Command`, :class:`Group`]] - The application commands from the tree. - """ - if type is None: - return self._get_all_commands(guild=guild) - - if type is AppCommandType.chat_input: - if guild is None: - return list(self._global_commands.values()) - else: - try: - commands = self._guild_commands[guild.id] - except KeyError: - return [] - else: - return list(commands.values()) - else: - guild_id = None if guild is None else guild.id - value = type.value - return [command for ((_, g, t), command) in self._context_menus.items() if g == guild_id and t == value] - - @overload - def walk_commands( - self, - *, - guild: Optional[Snowflake] = ..., - type: Literal[AppCommandType.message, AppCommandType.user], - ) -> Generator[ContextMenu, None, None]: - ... - - @overload - def walk_commands( - self, - *, - guild: Optional[Snowflake] = ..., - type: Literal[AppCommandType.chat_input] = ..., - ) -> Generator[Union[Command[Any, ..., Any], Group], None, None]: - ... - - @overload - def walk_commands( - self, - *, - guild: Optional[Snowflake] = ..., - type: AppCommandType, - ) -> Union[Generator[Union[Command[Any, ..., Any], Group], None, None], Generator[ContextMenu, None, None]]: - ... - - def walk_commands( - self, - *, - guild: Optional[Snowflake] = None, - type: AppCommandType = AppCommandType.chat_input, - ) -> Union[Generator[Union[Command[Any, ..., Any], Group], None, None], Generator[ContextMenu, None, None]]: - """An iterator that recursively walks through all application commands and child commands from the tree. - - Parameters - ----------- - guild: Optional[:class:`~discord.abc.Snowflake`] - The guild to iterate the commands from, not including global commands. - If not given or ``None`` then only global commands are iterated. - type: :class:`~discord.AppCommandType` - The type of commands to iterate over. Defaults to :attr:`~discord.AppCommandType.chat_input`, - i.e. slash commands. - - Yields - --------- - Union[:class:`ContextMenu`, :class:`Command`, :class:`Group`] - The application commands from the tree. - """ - - if type is AppCommandType.chat_input: - if guild is None: - for cmd in self._global_commands.values(): - yield cmd - if isinstance(cmd, Group): - yield from cmd.walk_commands() - else: - try: - commands = self._guild_commands[guild.id] - except KeyError: - return - else: - for cmd in commands.values(): - yield cmd - if isinstance(cmd, Group): - yield from cmd.walk_commands() - else: - guild_id = None if guild is None else guild.id - value = type.value - for ((_, g, t), command) in self._context_menus.items(): - if g == guild_id and t == value: - yield command - - def _get_all_commands( - self, *, guild: Optional[Snowflake] = None - ) -> List[Union[Command[Any, ..., Any], Group, ContextMenu]]: - if guild is None: - base: List[Union[Command[Any, ..., Any], Group, ContextMenu]] = list(self._global_commands.values()) - base.extend(cmd for ((_, g, _), cmd) in self._context_menus.items() if g is None) - return base - else: - try: - commands = self._guild_commands[guild.id] - except KeyError: - guild_id = guild.id - return [cmd for ((_, g, _), cmd) in self._context_menus.items() if g == guild_id] - else: - base: List[Union[Command[Any, ..., Any], Group, ContextMenu]] = list(commands.values()) - guild_id = guild.id - base.extend(cmd for ((_, g, _), cmd) in self._context_menus.items() if g == guild_id) - return base - - def _remove_with_module(self, name: str) -> None: - remove: List[Any] = [] - for key, cmd in self._context_menus.items(): - if cmd.module is not None and _is_submodule(name, cmd.module): - remove.append(key) - - for key in remove: - del self._context_menus[key] - - remove = [] - for key, cmd in self._global_commands.items(): - if cmd.module is not None and _is_submodule(name, cmd.module): - remove.append(key) - - for key in remove: - del self._global_commands[key] - - for mapping in self._guild_commands.values(): - remove = [] - for key, cmd in mapping.items(): - if cmd.module is not None and _is_submodule(name, cmd.module): - remove.append(key) - - for key in remove: - del mapping[key] - - async def on_error(self, interaction: Interaction[ClientT], error: AppCommandError, /) -> None: - """|coro| - - A callback that is called when any command raises an :exc:`AppCommandError`. - - The default implementation logs the exception using the library logger - if the command does not have any error handlers attached to it. - - To get the command that failed, :attr:`discord.Interaction.command` should - be used. - - Parameters - ----------- - interaction: :class:`~discord.Interaction` - The interaction that is being handled. - error: :exc:`AppCommandError` - The exception that was raised. - """ - - command = interaction.command - if command is not None: - if command._has_any_error_handlers(): - return - - _log.error('Ignoring exception in command %r', command.name, exc_info=error) - else: - _log.error('Ignoring exception in command tree', exc_info=error) - - def error(self, coro: ErrorFunc) -> ErrorFunc: - """A decorator that registers a coroutine as a local error handler. - - This must match the signature of the :meth:`on_error` callback. - - The error passed will be derived from :exc:`AppCommandError`. - - Parameters - ----------- - coro: :ref:`coroutine ` - The coroutine to register as the local error handler. - - Raises - ------- - TypeError - The coroutine passed is not actually a coroutine or does - not match the signature. - """ - - if not inspect.iscoroutinefunction(coro): - raise TypeError('The error handler must be a coroutine.') - - params = inspect.signature(coro).parameters - if len(params) != 2: - raise TypeError('error handler must have 2 parameters') - - self.on_error = coro - return coro - - def command( - self, - *, - name: Union[str, locale_str] = MISSING, - description: Union[str, locale_str] = MISSING, - nsfw: bool = False, - guild: Optional[Snowflake] = MISSING, - guilds: Sequence[Snowflake] = MISSING, - auto_locale_strings: bool = True, - extras: Dict[Any, Any] = MISSING, - ) -> Callable[[CommandCallback[Group, P, T]], Command[Group, P, T]]: - """A decorator that creates an application command from a regular function directly under this tree. - - Parameters - ------------ - name: Union[:class:`str`, :class:`locale_str`] - The name of the application command. If not given, it defaults to a lower-case - version of the callback name. - description: Union[:class:`str`, :class:`locale_str`] - The description of the application command. This shows up in the UI to describe - the application command. If not given, it defaults to the first line of the docstring - of the callback shortened to 100 characters. - nsfw: :class:`bool` - Whether the command is NSFW and should only work in NSFW channels. Defaults to ``False``. - - Due to a Discord limitation, this does not work on subcommands. - guild: Optional[:class:`~discord.abc.Snowflake`] - The guild to add the command to. If not given or ``None`` then it - becomes a global command instead. - guilds: List[:class:`~discord.abc.Snowflake`] - The list of guilds to add the command to. This cannot be mixed - with the ``guild`` parameter. If no guilds are given at all - then it becomes a global command instead. - auto_locale_strings: :class:`bool` - If this is set to ``True``, then all translatable strings will implicitly - be wrapped into :class:`locale_str` rather than :class:`str`. This could - avoid some repetition and be more ergonomic for certain defaults such - as default command names, command descriptions, and parameter names. - Defaults to ``True``. - extras: :class:`dict` - A dictionary that can be used to store extraneous data. - The library will not touch any values or keys within this dictionary. - """ - - def decorator(func: CommandCallback[Group, P, T]) -> Command[Group, P, T]: - if not inspect.iscoroutinefunction(func): - raise TypeError('command function must be a coroutine function') - - if description is MISSING: - if func.__doc__ is None: - desc = '…' - else: - desc = _shorten(func.__doc__) - else: - desc = description - - command = Command( - name=name if name is not MISSING else func.__name__, - description=desc, - callback=func, - nsfw=nsfw, - parent=None, - auto_locale_strings=auto_locale_strings, - extras=extras, - ) - self.add_command(command, guild=guild, guilds=guilds) - return command - - return decorator - - def context_menu( - self, - *, - name: Union[str, locale_str] = MISSING, - nsfw: bool = False, - guild: Optional[Snowflake] = MISSING, - guilds: Sequence[Snowflake] = MISSING, - auto_locale_strings: bool = True, - extras: Dict[Any, Any] = MISSING, - ) -> Callable[[ContextMenuCallback], ContextMenu]: - """A decorator that creates an application command context menu from a regular function directly under this tree. - - This function must have a signature of :class:`~discord.Interaction` as its first parameter - and taking either a :class:`~discord.Member`, :class:`~discord.User`, or :class:`~discord.Message`, - or a :obj:`typing.Union` of ``Member`` and ``User`` as its second parameter. - - Examples - --------- - - .. code-block:: python3 - - @app_commands.context_menu() - async def react(interaction: discord.Interaction, message: discord.Message): - await interaction.response.send_message('Very cool message!', ephemeral=True) - - @app_commands.context_menu() - async def ban(interaction: discord.Interaction, user: discord.Member): - await interaction.response.send_message(f'Should I actually ban {user}...', ephemeral=True) - - Parameters - ------------ - name: Union[:class:`str`, :class:`locale_str`] - The name of the context menu command. If not given, it defaults to a title-case - version of the callback name. Note that unlike regular slash commands this can - have spaces and upper case characters in the name. - nsfw: :class:`bool` - Whether the command is NSFW and should only work in NSFW channels. Defaults to ``False``. - - Due to a Discord limitation, this does not work on subcommands. - guild: Optional[:class:`~discord.abc.Snowflake`] - The guild to add the command to. If not given or ``None`` then it - becomes a global command instead. - guilds: List[:class:`~discord.abc.Snowflake`] - The list of guilds to add the command to. This cannot be mixed - with the ``guild`` parameter. If no guilds are given at all - then it becomes a global command instead. - auto_locale_strings: :class:`bool` - If this is set to ``True``, then all translatable strings will implicitly - be wrapped into :class:`locale_str` rather than :class:`str`. This could - avoid some repetition and be more ergonomic for certain defaults such - as default command names, command descriptions, and parameter names. - Defaults to ``True``. - extras: :class:`dict` - A dictionary that can be used to store extraneous data. - The library will not touch any values or keys within this dictionary. - """ - - def decorator(func: ContextMenuCallback) -> ContextMenu: - if not inspect.iscoroutinefunction(func): - raise TypeError('context menu function must be a coroutine function') - - actual_name = func.__name__.title() if name is MISSING else name - context_menu = ContextMenu( - name=actual_name, - nsfw=nsfw, - callback=func, - auto_locale_strings=auto_locale_strings, - extras=extras, - ) - self.add_command(context_menu, guild=guild, guilds=guilds) - return context_menu - - return decorator - - @property - def translator(self) -> Optional[Translator]: - """Optional[:class:`Translator`]: The translator, if any, responsible for handling translation of commands. - - To change the translator, use :meth:`set_translator`. - """ - return self._state._translator - - async def set_translator(self, translator: Optional[Translator]) -> None: - """|coro| - - Sets the translator to use for translating commands. - - If a translator was previously set, it will be unloaded using its - :meth:`Translator.unload` method. - - When a translator is set, it will be loaded using its :meth:`Translator.load` method. - - Parameters - ------------ - translator: Optional[:class:`Translator`] - The translator to use. If ``None`` then the translator is just removed and unloaded. - - Raises - ------- - TypeError - The translator was not ``None`` or a :class:`Translator` instance. - """ - - if translator is not None and not isinstance(translator, Translator): - raise TypeError(f'expected None or Translator instance, received {translator.__class__.__name__} instead') - - old_translator = self._state._translator - if old_translator is not None: - await old_translator.unload() - - if translator is None: - self._state._translator = None - else: - await translator.load() - self._state._translator = translator - - async def sync(self, *, guild: Optional[Snowflake] = None) -> List[AppCommand]: - """|coro| - - Syncs the application commands to Discord. - - This also runs the translator to get the translated strings necessary for - feeding back into Discord. - - This must be called for the application commands to show up. - - Parameters - ----------- - guild: Optional[:class:`~discord.abc.Snowflake`] - The guild to sync the commands to. If ``None`` then it - syncs all global commands instead. - - Raises - ------- - HTTPException - Syncing the commands failed. - CommandSyncFailure - Syncing the commands failed due to a user related error, typically because - the command has invalid data. This is equivalent to an HTTP status code of - 400. - Forbidden - The client does not have the ``applications.commands`` scope in the guild. - MissingApplicationID - The client does not have an application ID. - TranslationError - An error occurred while translating the commands. - - Returns - -------- - List[:class:`AppCommand`] - The application's commands that got synced. - """ - - if self.client.application_id is None: - raise MissingApplicationID - - commands = self._get_all_commands(guild=guild) - - translator = self.translator - if translator: - payload = [await command.get_translated_payload(translator) for command in commands] - else: - payload = [command.to_dict() for command in commands] - - try: - if guild is None: - data = await self._http.bulk_upsert_global_commands(self.client.application_id, payload=payload) - else: - data = await self._http.bulk_upsert_guild_commands(self.client.application_id, guild.id, payload=payload) - except HTTPException as e: - if e.status == 400 and e.code == 50035: - raise CommandSyncFailure(e, commands) from None - raise - - return [AppCommand(data=d, state=self._state) for d in data] - - async def _dispatch_error(self, interaction: Interaction[ClientT], error: AppCommandError, /) -> None: - command = interaction.command - interaction.command_failed = True - try: - if isinstance(command, Command): - await command._invoke_error_handlers(interaction, error) - finally: - await self.on_error(interaction, error) - - def _from_interaction(self, interaction: Interaction[ClientT]) -> None: - async def wrapper(): - try: - await self._call(interaction) - except AppCommandError as e: - await self._dispatch_error(interaction, e) - - self.client.loop.create_task(wrapper(), name='CommandTree-invoker') - - def _get_context_menu(self, data: ApplicationCommandInteractionData) -> Optional[ContextMenu]: - name = data['name'] - guild_id = _get_as_snowflake(data, 'guild_id') - t = data.get('type', 1) - cmd = self._context_menus.get((name, guild_id, t)) - if cmd is None and self.fallback_to_global: - return self._context_menus.get((name, None, t)) - return cmd - - def _get_app_command_options( - self, data: ApplicationCommandInteractionData - ) -> Tuple[Command[Any, ..., Any], List[ApplicationCommandInteractionDataOption]]: - parents: List[str] = [] - name = data['name'] - - command_guild_id = _get_as_snowflake(data, 'guild_id') - if command_guild_id: - try: - guild_commands = self._guild_commands[command_guild_id] - except KeyError: - command = None if not self.fallback_to_global else self._global_commands.get(name) - else: - command = guild_commands.get(name) - if command is None and self.fallback_to_global: - command = self._global_commands.get(name) - else: - command = self._global_commands.get(name) - - # If it's not found at this point then it's not gonna be found at any point - if command is None: - raise CommandNotFound(name, parents) - - # This could be done recursively but it'd be a bother due to the state needed - # to be tracked above like the parents, the actual command type, and the - # resulting options we care about - searching = True - options: List[ApplicationCommandInteractionDataOption] = data.get('options', []) - while searching: - for option in options: - # Find subcommands - if option.get('type', 0) in (1, 2): - parents.append(name) - name = option['name'] - command = command._get_internal_command(name) - if command is None: - raise CommandNotFound(name, parents) - options = option.get('options', []) - break - else: - searching = False - break - else: - break - - if isinstance(command, Group): - # Right now, groups can't be invoked. This is a Discord limitation in how they - # do slash commands. So if we're here and we have a Group rather than a Command instance - # then something in the code is out of date from the data that Discord has. - raise CommandSignatureMismatch(command) - - return (command, options) - - async def _call_context_menu( - self, interaction: Interaction[ClientT], data: ApplicationCommandInteractionData, type: int - ) -> None: - name = data['name'] - guild_id = _get_as_snowflake(data, 'guild_id') - ctx_menu = self._context_menus.get((name, guild_id, type)) - if ctx_menu is None and self.fallback_to_global: - ctx_menu = self._context_menus.get((name, None, type)) - - # Pre-fill the cached slot to prevent re-computation - interaction._cs_command = ctx_menu - - if ctx_menu is None: - raise CommandNotFound(name, [], AppCommandType(type)) - - resolved = Namespace._get_resolved_items(interaction, data.get('resolved', {})) - - # This is annotated as str | int but realistically this will always be str - target_id: Optional[Union[str, int]] = data.get('target_id') - # Right now, the only types are message and user - # Therefore, there's no conflict with snowflakes - - # This will always work at runtime - key = ResolveKey.any_with(target_id) # type: ignore - value = resolved.get(key) - if ctx_menu.type.value != type: - raise CommandSignatureMismatch(ctx_menu) - - if value is None: - raise AppCommandError('This should not happen if Discord sent well-formed data.') - - # I assume I don't have to type check here. - try: - await ctx_menu._invoke(interaction, value) - except AppCommandError as e: - if ctx_menu.on_error is not None: - await ctx_menu.on_error(interaction, e) - await self.on_error(interaction, e) - else: - self.client.dispatch('app_command_completion', interaction, ctx_menu) - - async def interaction_check(self, interaction: Interaction[ClientT], /) -> bool: - """|coro| - - A global check to determine if an :class:`~discord.Interaction` should - be processed by the tree. - - The default implementation returns True (all interactions are processed), - but can be overridden if custom behaviour is desired. - """ - return True - - async def _call(self, interaction: Interaction[ClientT]) -> None: - if not await self.interaction_check(interaction): - interaction.command_failed = True - return - - data: ApplicationCommandInteractionData = interaction.data # type: ignore - type = data.get('type', 1) - if type != 1: - # Context menu command... - await self._call_context_menu(interaction, data, type) - return - - command, options = self._get_app_command_options(data) - - # Pre-fill the cached slot to prevent re-computation - interaction._cs_command = command - - # At this point options refers to the arguments of the command - # and command refers to the class type we care about - namespace = Namespace(interaction, data.get('resolved', {}), options) - - # Same pre-fill as above - interaction._cs_namespace = namespace - - # Auto complete handles the namespace differently... so at this point this is where we decide where that is. - if interaction.type is InteractionType.autocomplete: - focused = next((opt['name'] for opt in options if opt.get('focused')), None) - if focused is None: - raise AppCommandError('This should not happen, but there is no focused element. This is a Discord bug.') - - try: - await command._invoke_autocomplete(interaction, focused, namespace) - except Exception: - # Suppress exception since it can't be handled anyway. - pass - - return - - try: - await command._invoke_with_namespace(interaction, namespace) - except AppCommandError as e: - interaction.command_failed = True - await command._invoke_error_handlers(interaction, e) - await self.on_error(interaction, e) - else: - if not interaction.command_failed: - self.client.dispatch('app_command_completion', interaction, command) diff --git a/.venv/Lib/site-packages/discord/appinfo.py b/.venv/Lib/site-packages/discord/appinfo.py deleted file mode 100644 index 129e543..0000000 --- a/.venv/Lib/site-packages/discord/appinfo.py +++ /dev/null @@ -1,362 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -from typing import List, TYPE_CHECKING, Optional - -from . import utils -from .asset import Asset -from .flags import ApplicationFlags -from .permissions import Permissions - -if TYPE_CHECKING: - from .guild import Guild - from .types.appinfo import ( - AppInfo as AppInfoPayload, - PartialAppInfo as PartialAppInfoPayload, - Team as TeamPayload, - InstallParams as InstallParamsPayload, - ) - from .user import User - from .state import ConnectionState - -__all__ = ( - 'AppInfo', - 'PartialAppInfo', - 'AppInstallParams', -) - - -class AppInfo: - """Represents the application info for the bot provided by Discord. - - - Attributes - ------------- - id: :class:`int` - The application ID. - name: :class:`str` - The application name. - owner: :class:`User` - The application owner. - team: Optional[:class:`Team`] - The application's team. - - .. versionadded:: 1.3 - - description: :class:`str` - The application description. - bot_public: :class:`bool` - Whether the bot can be invited by anyone or if it is locked - to the application owner. - bot_require_code_grant: :class:`bool` - Whether the bot requires the completion of the full oauth2 code - grant flow to join. - rpc_origins: Optional[List[:class:`str`]] - A list of RPC origin URLs, if RPC is enabled. - - verify_key: :class:`str` - The hex encoded key for verification in interactions and the - GameSDK's :ddocs:`GetTicket `. - - .. versionadded:: 1.3 - - guild_id: Optional[:class:`int`] - If this application is a game sold on Discord, - this field will be the guild to which it has been linked to. - - .. versionadded:: 1.3 - - primary_sku_id: Optional[:class:`int`] - If this application is a game sold on Discord, - this field will be the id of the "Game SKU" that is created, - if it exists. - - .. versionadded:: 1.3 - - slug: Optional[:class:`str`] - If this application is a game sold on Discord, - this field will be the URL slug that links to the store page. - - .. versionadded:: 1.3 - - terms_of_service_url: Optional[:class:`str`] - The application's terms of service URL, if set. - - .. versionadded:: 2.0 - - privacy_policy_url: Optional[:class:`str`] - The application's privacy policy URL, if set. - - .. versionadded:: 2.0 - - tags: List[:class:`str`] - The list of tags describing the functionality of the application. - - .. versionadded:: 2.0 - - custom_install_url: List[:class:`str`] - The custom authorization URL for the application, if enabled. - - .. versionadded:: 2.0 - - install_params: Optional[:class:`AppInstallParams`] - The settings for custom authorization URL of application, if enabled. - - .. versionadded:: 2.0 - role_connections_verification_url: Optional[:class:`str`] - The application's connection verification URL which will render the application as - a verification method in the guild's role verification configuration. - - .. versionadded:: 2.2 - """ - - __slots__ = ( - '_state', - 'description', - 'id', - 'name', - 'rpc_origins', - 'bot_public', - 'bot_require_code_grant', - 'owner', - '_icon', - 'verify_key', - 'team', - 'guild_id', - 'primary_sku_id', - 'slug', - '_cover_image', - '_flags', - 'terms_of_service_url', - 'privacy_policy_url', - 'tags', - 'custom_install_url', - 'install_params', - 'role_connections_verification_url', - ) - - def __init__(self, state: ConnectionState, data: AppInfoPayload): - from .team import Team - - self._state: ConnectionState = state - self.id: int = int(data['id']) - self.name: str = data['name'] - self.description: str = data['description'] - self._icon: Optional[str] = data['icon'] - self.rpc_origins: Optional[List[str]] = data.get('rpc_origins') - self.bot_public: bool = data['bot_public'] - self.bot_require_code_grant: bool = data['bot_require_code_grant'] - self.owner: User = state.create_user(data['owner']) - - team: Optional[TeamPayload] = data.get('team') - self.team: Optional[Team] = Team(state, team) if team else None - - self.verify_key: str = data['verify_key'] - - self.guild_id: Optional[int] = utils._get_as_snowflake(data, 'guild_id') - - self.primary_sku_id: Optional[int] = utils._get_as_snowflake(data, 'primary_sku_id') - self.slug: Optional[str] = data.get('slug') - self._flags: int = data.get('flags', 0) - self._cover_image: Optional[str] = data.get('cover_image') - self.terms_of_service_url: Optional[str] = data.get('terms_of_service_url') - self.privacy_policy_url: Optional[str] = data.get('privacy_policy_url') - self.tags: List[str] = data.get('tags', []) - self.custom_install_url: Optional[str] = data.get('custom_install_url') - self.role_connections_verification_url: Optional[str] = data.get('role_connections_verification_url') - - params = data.get('install_params') - self.install_params: Optional[AppInstallParams] = AppInstallParams(params) if params else None - - def __repr__(self) -> str: - return ( - f'<{self.__class__.__name__} id={self.id} name={self.name!r} ' - f'description={self.description!r} public={self.bot_public} ' - f'owner={self.owner!r}>' - ) - - @property - def icon(self) -> Optional[Asset]: - """Optional[:class:`.Asset`]: Retrieves the application's icon asset, if any.""" - if self._icon is None: - return None - return Asset._from_icon(self._state, self.id, self._icon, path='app') - - @property - def cover_image(self) -> Optional[Asset]: - """Optional[:class:`.Asset`]: Retrieves the cover image on a store embed, if any. - - This is only available if the application is a game sold on Discord. - """ - if self._cover_image is None: - return None - return Asset._from_cover_image(self._state, self.id, self._cover_image) - - @property - def guild(self) -> Optional[Guild]: - """Optional[:class:`Guild`]: If this application is a game sold on Discord, - this field will be the guild to which it has been linked - - .. versionadded:: 1.3 - """ - return self._state._get_guild(self.guild_id) - - @property - def flags(self) -> ApplicationFlags: - """:class:`ApplicationFlags`: The application's flags. - - .. versionadded:: 2.0 - """ - return ApplicationFlags._from_value(self._flags) - - -class PartialAppInfo: - """Represents a partial AppInfo given by :func:`~discord.abc.GuildChannel.create_invite` - - .. versionadded:: 2.0 - - Attributes - ------------- - id: :class:`int` - The application ID. - name: :class:`str` - The application name. - description: :class:`str` - The application description. - rpc_origins: Optional[List[:class:`str`]] - A list of RPC origin URLs, if RPC is enabled. - verify_key: :class:`str` - The hex encoded key for verification in interactions and the - GameSDK's :ddocs:`GetTicket `. - terms_of_service_url: Optional[:class:`str`] - The application's terms of service URL, if set. - privacy_policy_url: Optional[:class:`str`] - The application's privacy policy URL, if set. - approximate_guild_count: :class:`int` - The approximate count of the guilds the bot was added to. - - .. versionadded:: 2.3 - redirect_uris: List[:class:`str`] - A list of authentication redirect URIs. - - .. versionadded:: 2.3 - interactions_endpoint_url: Optional[:class:`str`] - The interactions endpoint url of the application to receive interactions over this endpoint rather than - over the gateway, if configured. - - .. versionadded:: 2.3 - role_connections_verification_url: Optional[:class:`str`] - The application's connection verification URL which will render the application as - a verification method in the guild's role verification configuration. - - .. versionadded:: 2.3 - """ - - __slots__ = ( - '_state', - 'id', - 'name', - 'description', - 'rpc_origins', - 'verify_key', - 'terms_of_service_url', - 'privacy_policy_url', - '_icon', - '_flags', - '_cover_image', - 'approximate_guild_count', - 'redirect_uris', - 'interactions_endpoint_url', - 'role_connections_verification_url', - ) - - def __init__(self, *, state: ConnectionState, data: PartialAppInfoPayload): - self._state: ConnectionState = state - self.id: int = int(data['id']) - self.name: str = data['name'] - self._icon: Optional[str] = data.get('icon') - self._flags: int = data.get('flags', 0) - self._cover_image: Optional[str] = data.get('cover_image') - self.description: str = data['description'] - self.rpc_origins: Optional[List[str]] = data.get('rpc_origins') - self.verify_key: str = data['verify_key'] - self.terms_of_service_url: Optional[str] = data.get('terms_of_service_url') - self.privacy_policy_url: Optional[str] = data.get('privacy_policy_url') - self.approximate_guild_count: int = data.get('approximate_guild_count', 0) - self.redirect_uris: List[str] = data.get('redirect_uris', []) - self.interactions_endpoint_url: Optional[str] = data.get('interactions_endpoint_url') - self.role_connections_verification_url: Optional[str] = data.get('role_connections_verification_url') - - def __repr__(self) -> str: - return f'<{self.__class__.__name__} id={self.id} name={self.name!r} description={self.description!r}>' - - @property - def icon(self) -> Optional[Asset]: - """Optional[:class:`.Asset`]: Retrieves the application's icon asset, if any.""" - if self._icon is None: - return None - return Asset._from_icon(self._state, self.id, self._icon, path='app') - - @property - def cover_image(self) -> Optional[Asset]: - """Optional[:class:`.Asset`]: Retrieves the cover image of the application's default rich presence. - - This is only available if the application is a game sold on Discord. - - .. versionadded:: 2.3 - """ - if self._cover_image is None: - return None - return Asset._from_cover_image(self._state, self.id, self._cover_image) - - @property - def flags(self) -> ApplicationFlags: - """:class:`ApplicationFlags`: The application's flags. - - .. versionadded:: 2.0 - """ - return ApplicationFlags._from_value(self._flags) - - -class AppInstallParams: - """Represents the settings for custom authorization URL of an application. - - .. versionadded:: 2.0 - - Attributes - ---------- - scopes: List[:class:`str`] - The list of :ddocs:`OAuth2 scopes ` - to add the application to a guild with. - permissions: :class:`Permissions` - The permissions to give to application in the guild. - """ - - __slots__ = ('scopes', 'permissions') - - def __init__(self, data: InstallParamsPayload) -> None: - self.scopes: List[str] = data.get('scopes', []) - self.permissions: Permissions = Permissions(int(data['permissions'])) diff --git a/.venv/Lib/site-packages/discord/asset.py b/.venv/Lib/site-packages/discord/asset.py deleted file mode 100644 index d88ebb9..0000000 --- a/.venv/Lib/site-packages/discord/asset.py +++ /dev/null @@ -1,516 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -import io -import os -from typing import Any, Literal, Optional, TYPE_CHECKING, Tuple, Union -from .errors import DiscordException -from . import utils -from .file import File - -import yarl - -# fmt: off -__all__ = ( - 'Asset', -) -# fmt: on - -if TYPE_CHECKING: - from typing_extensions import Self - - from .state import ConnectionState - from .webhook.async_ import _WebhookState - - _State = Union[ConnectionState, _WebhookState] - - ValidStaticFormatTypes = Literal['webp', 'jpeg', 'jpg', 'png'] - ValidAssetFormatTypes = Literal['webp', 'jpeg', 'jpg', 'png', 'gif'] - -VALID_STATIC_FORMATS = frozenset({"jpeg", "jpg", "webp", "png"}) -VALID_ASSET_FORMATS = VALID_STATIC_FORMATS | {"gif"} - - -MISSING = utils.MISSING - - -class AssetMixin: - __slots__ = () - url: str - _state: Optional[Any] - - async def read(self) -> bytes: - """|coro| - - Retrieves the content of this asset as a :class:`bytes` object. - - Raises - ------ - DiscordException - There was no internal connection state. - HTTPException - Downloading the asset failed. - NotFound - The asset was deleted. - - Returns - ------- - :class:`bytes` - The content of the asset. - """ - if self._state is None: - raise DiscordException('Invalid state (no ConnectionState provided)') - - return await self._state.http.get_from_cdn(self.url) - - async def save(self, fp: Union[str, bytes, os.PathLike[Any], io.BufferedIOBase], *, seek_begin: bool = True) -> int: - """|coro| - - Saves this asset into a file-like object. - - Parameters - ---------- - fp: Union[:class:`io.BufferedIOBase`, :class:`os.PathLike`] - The file-like object to save this asset to or the filename - to use. If a filename is passed then a file is created with that - filename and used instead. - seek_begin: :class:`bool` - Whether to seek to the beginning of the file after saving is - successfully done. - - Raises - ------ - DiscordException - There was no internal connection state. - HTTPException - Downloading the asset failed. - NotFound - The asset was deleted. - - Returns - -------- - :class:`int` - The number of bytes written. - """ - - data = await self.read() - if isinstance(fp, io.BufferedIOBase): - written = fp.write(data) - if seek_begin: - fp.seek(0) - return written - else: - with open(fp, 'wb') as f: - return f.write(data) - - async def to_file( - self, - *, - filename: Optional[str] = MISSING, - description: Optional[str] = None, - spoiler: bool = False, - ) -> File: - """|coro| - - Converts the asset into a :class:`File` suitable for sending via - :meth:`abc.Messageable.send`. - - .. versionadded:: 2.0 - - Parameters - ----------- - filename: Optional[:class:`str`] - The filename of the file. If not provided, then the filename from - the asset's URL is used. - description: Optional[:class:`str`] - The description for the file. - spoiler: :class:`bool` - Whether the file is a spoiler. - - Raises - ------ - DiscordException - The asset does not have an associated state. - ValueError - The asset is a unicode emoji. - TypeError - The asset is a sticker with lottie type. - HTTPException - Downloading the asset failed. - NotFound - The asset was deleted. - - Returns - ------- - :class:`File` - The asset as a file suitable for sending. - """ - - data = await self.read() - file_filename = filename if filename is not MISSING else yarl.URL(self.url).name - return File(io.BytesIO(data), filename=file_filename, description=description, spoiler=spoiler) - - -class Asset(AssetMixin): - """Represents a CDN asset on Discord. - - .. container:: operations - - .. describe:: str(x) - - Returns the URL of the CDN asset. - - .. describe:: len(x) - - Returns the length of the CDN asset's URL. - - .. describe:: x == y - - Checks if the asset is equal to another asset. - - .. describe:: x != y - - Checks if the asset is not equal to another asset. - - .. describe:: hash(x) - - Returns the hash of the asset. - """ - - __slots__: Tuple[str, ...] = ( - '_state', - '_url', - '_animated', - '_key', - ) - - BASE = 'https://cdn.discordapp.com' - - def __init__(self, state: _State, *, url: str, key: str, animated: bool = False) -> None: - self._state: _State = state - self._url: str = url - self._animated: bool = animated - self._key: str = key - - @classmethod - def _from_default_avatar(cls, state: _State, index: int) -> Self: - return cls( - state, - url=f'{cls.BASE}/embed/avatars/{index}.png', - key=str(index), - animated=False, - ) - - @classmethod - def _from_avatar(cls, state: _State, user_id: int, avatar: str) -> Self: - animated = avatar.startswith('a_') - format = 'gif' if animated else 'png' - return cls( - state, - url=f'{cls.BASE}/avatars/{user_id}/{avatar}.{format}?size=1024', - key=avatar, - animated=animated, - ) - - @classmethod - def _from_guild_avatar(cls, state: _State, guild_id: int, member_id: int, avatar: str) -> Self: - animated = avatar.startswith('a_') - format = 'gif' if animated else 'png' - return cls( - state, - url=f"{cls.BASE}/guilds/{guild_id}/users/{member_id}/avatars/{avatar}.{format}?size=1024", - key=avatar, - animated=animated, - ) - - @classmethod - def _from_icon(cls, state: _State, object_id: int, icon_hash: str, path: str) -> Self: - return cls( - state, - url=f'{cls.BASE}/{path}-icons/{object_id}/{icon_hash}.png?size=1024', - key=icon_hash, - animated=False, - ) - - @classmethod - def _from_app_icon( - cls, state: _State, object_id: int, icon_hash: str, asset_type: Literal['icon', 'cover_image'] - ) -> Self: - return cls( - state, - url=f'{cls.BASE}/app-icons/{object_id}/{asset_type}.png?size=1024', - key=icon_hash, - animated=False, - ) - - @classmethod - def _from_cover_image(cls, state: _State, object_id: int, cover_image_hash: str) -> Self: - return cls( - state, - url=f'{cls.BASE}/app-assets/{object_id}/store/{cover_image_hash}.png?size=1024', - key=cover_image_hash, - animated=False, - ) - - @classmethod - def _from_scheduled_event_cover_image(cls, state: _State, scheduled_event_id: int, cover_image_hash: str) -> Self: - return cls( - state, - url=f'{cls.BASE}/guild-events/{scheduled_event_id}/{cover_image_hash}.png?size=1024', - key=cover_image_hash, - animated=False, - ) - - @classmethod - def _from_guild_image(cls, state: _State, guild_id: int, image: str, path: str) -> Self: - animated = image.startswith('a_') - format = 'gif' if animated else 'png' - return cls( - state, - url=f'{cls.BASE}/{path}/{guild_id}/{image}.{format}?size=1024', - key=image, - animated=animated, - ) - - @classmethod - def _from_guild_icon(cls, state: _State, guild_id: int, icon_hash: str) -> Self: - animated = icon_hash.startswith('a_') - format = 'gif' if animated else 'png' - return cls( - state, - url=f'{cls.BASE}/icons/{guild_id}/{icon_hash}.{format}?size=1024', - key=icon_hash, - animated=animated, - ) - - @classmethod - def _from_sticker_banner(cls, state: _State, banner: int) -> Self: - return cls( - state, - url=f'{cls.BASE}/app-assets/710982414301790216/store/{banner}.png', - key=str(banner), - animated=False, - ) - - @classmethod - def _from_user_banner(cls, state: _State, user_id: int, banner_hash: str) -> Self: - animated = banner_hash.startswith('a_') - format = 'gif' if animated else 'png' - return cls( - state, - url=f'{cls.BASE}/banners/{user_id}/{banner_hash}.{format}?size=512', - key=banner_hash, - animated=animated, - ) - - def __str__(self) -> str: - return self._url - - def __len__(self) -> int: - return len(self._url) - - def __repr__(self) -> str: - shorten = self._url.replace(self.BASE, '') - return f'' - - def __eq__(self, other: object) -> bool: - return isinstance(other, Asset) and self._url == other._url - - def __hash__(self) -> int: - return hash(self._url) - - @property - def url(self) -> str: - """:class:`str`: Returns the underlying URL of the asset.""" - return self._url - - @property - def key(self) -> str: - """:class:`str`: Returns the identifying key of the asset.""" - return self._key - - def is_animated(self) -> bool: - """:class:`bool`: Returns whether the asset is animated.""" - return self._animated - - def replace( - self, - *, - size: int = MISSING, - format: ValidAssetFormatTypes = MISSING, - static_format: ValidStaticFormatTypes = MISSING, - ) -> Self: - """Returns a new asset with the passed components replaced. - - - .. versionchanged:: 2.0 - ``static_format`` is now preferred over ``format`` - if both are present and the asset is not animated. - - .. versionchanged:: 2.0 - This function will now raise :exc:`ValueError` instead of - ``InvalidArgument``. - - Parameters - ----------- - size: :class:`int` - The new size of the asset. - format: :class:`str` - The new format to change it to. Must be either - 'webp', 'jpeg', 'jpg', 'png', or 'gif' if it's animated. - static_format: :class:`str` - The new format to change it to if the asset isn't animated. - Must be either 'webp', 'jpeg', 'jpg', or 'png'. - - Raises - ------- - ValueError - An invalid size or format was passed. - - Returns - -------- - :class:`Asset` - The newly updated asset. - """ - url = yarl.URL(self._url) - path, _ = os.path.splitext(url.path) - - if format is not MISSING: - if self._animated: - if format not in VALID_ASSET_FORMATS: - raise ValueError(f'format must be one of {VALID_ASSET_FORMATS}') - else: - if static_format is MISSING and format not in VALID_STATIC_FORMATS: - raise ValueError(f'format must be one of {VALID_STATIC_FORMATS}') - url = url.with_path(f'{path}.{format}') - - if static_format is not MISSING and not self._animated: - if static_format not in VALID_STATIC_FORMATS: - raise ValueError(f'static_format must be one of {VALID_STATIC_FORMATS}') - url = url.with_path(f'{path}.{static_format}') - - if size is not MISSING: - if not utils.valid_icon_size(size): - raise ValueError('size must be a power of 2 between 16 and 4096') - url = url.with_query(size=size) - else: - url = url.with_query(url.raw_query_string) - - url = str(url) - return Asset(state=self._state, url=url, key=self._key, animated=self._animated) - - def with_size(self, size: int, /) -> Self: - """Returns a new asset with the specified size. - - .. versionchanged:: 2.0 - This function will now raise :exc:`ValueError` instead of - ``InvalidArgument``. - - Parameters - ------------ - size: :class:`int` - The new size of the asset. - - Raises - ------- - ValueError - The asset had an invalid size. - - Returns - -------- - :class:`Asset` - The new updated asset. - """ - if not utils.valid_icon_size(size): - raise ValueError('size must be a power of 2 between 16 and 4096') - - url = str(yarl.URL(self._url).with_query(size=size)) - return Asset(state=self._state, url=url, key=self._key, animated=self._animated) - - def with_format(self, format: ValidAssetFormatTypes, /) -> Self: - """Returns a new asset with the specified format. - - .. versionchanged:: 2.0 - This function will now raise :exc:`ValueError` instead of - ``InvalidArgument``. - - Parameters - ------------ - format: :class:`str` - The new format of the asset. - - Raises - ------- - ValueError - The asset had an invalid format. - - Returns - -------- - :class:`Asset` - The new updated asset. - """ - - if self._animated: - if format not in VALID_ASSET_FORMATS: - raise ValueError(f'format must be one of {VALID_ASSET_FORMATS}') - else: - if format not in VALID_STATIC_FORMATS: - raise ValueError(f'format must be one of {VALID_STATIC_FORMATS}') - - url = yarl.URL(self._url) - path, _ = os.path.splitext(url.path) - url = str(url.with_path(f'{path}.{format}').with_query(url.raw_query_string)) - return Asset(state=self._state, url=url, key=self._key, animated=self._animated) - - def with_static_format(self, format: ValidStaticFormatTypes, /) -> Self: - """Returns a new asset with the specified static format. - - This only changes the format if the underlying asset is - not animated. Otherwise, the asset is not changed. - - .. versionchanged:: 2.0 - This function will now raise :exc:`ValueError` instead of - ``InvalidArgument``. - - Parameters - ------------ - format: :class:`str` - The new static format of the asset. - - Raises - ------- - ValueError - The asset had an invalid format. - - Returns - -------- - :class:`Asset` - The new updated asset. - """ - - if self._animated: - return self - return self.with_format(format) diff --git a/.venv/Lib/site-packages/discord/audit_logs.py b/.venv/Lib/site-packages/discord/audit_logs.py deleted file mode 100644 index eebcecf..0000000 --- a/.venv/Lib/site-packages/discord/audit_logs.py +++ /dev/null @@ -1,865 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Callable, ClassVar, Mapping, Generator, List, Optional, Tuple, Type, TypeVar, Union - -from . import enums, flags, utils -from .asset import Asset -from .colour import Colour -from .invite import Invite -from .mixins import Hashable -from .object import Object -from .permissions import PermissionOverwrite, Permissions -from .automod import AutoModTrigger, AutoModRuleAction, AutoModPresets, AutoModRule -from .role import Role -from .emoji import Emoji -from .partial_emoji import PartialEmoji -from .member import Member -from .scheduled_event import ScheduledEvent -from .stage_instance import StageInstance -from .sticker import GuildSticker -from .threads import Thread -from .integrations import PartialIntegration -from .channel import ForumChannel, StageChannel, ForumTag - -__all__ = ( - 'AuditLogDiff', - 'AuditLogChanges', - 'AuditLogEntry', -) - - -if TYPE_CHECKING: - import datetime - - from . import abc - from .guild import Guild - from .state import ConnectionState - from .types.audit_log import ( - AuditLogChange as AuditLogChangePayload, - AuditLogEntry as AuditLogEntryPayload, - ) - from .types.channel import ( - PermissionOverwrite as PermissionOverwritePayload, - ForumTag as ForumTagPayload, - DefaultReaction as DefaultReactionPayload, - ) - from .types.invite import Invite as InvitePayload - from .types.role import Role as RolePayload - from .types.snowflake import Snowflake - from .types.command import ApplicationCommandPermissions - from .types.automod import AutoModerationTriggerMetadata, AutoModerationAction - from .user import User - from .app_commands import AppCommand - from .webhook import Webhook - - TargetType = Union[ - Guild, - abc.GuildChannel, - Member, - User, - Role, - Invite, - Emoji, - StageInstance, - GuildSticker, - Thread, - Object, - PartialIntegration, - AutoModRule, - ScheduledEvent, - Webhook, - AppCommand, - None, - ] - - -def _transform_timestamp(entry: AuditLogEntry, data: Optional[str]) -> Optional[datetime.datetime]: - return utils.parse_time(data) - - -def _transform_color(entry: AuditLogEntry, data: int) -> Colour: - return Colour(data) - - -def _transform_snowflake(entry: AuditLogEntry, data: Snowflake) -> int: - return int(data) - - -def _transform_channel(entry: AuditLogEntry, data: Optional[Snowflake]) -> Optional[Union[abc.GuildChannel, Object]]: - if data is None: - return None - return entry.guild.get_channel(int(data)) or Object(id=data) - - -def _transform_channels_or_threads( - entry: AuditLogEntry, data: List[Snowflake] -) -> List[Union[abc.GuildChannel, Thread, Object]]: - return [entry.guild.get_channel_or_thread(int(data)) or Object(id=data) for data in data] - - -def _transform_member_id(entry: AuditLogEntry, data: Optional[Snowflake]) -> Union[Member, User, None]: - if data is None: - return None - return entry._get_member(int(data)) - - -def _transform_guild_id(entry: AuditLogEntry, data: Optional[Snowflake]) -> Optional[Guild]: - if data is None: - return None - return entry._state._get_guild(int(data)) - - -def _transform_roles(entry: AuditLogEntry, data: List[Snowflake]) -> List[Union[Role, Object]]: - return [entry.guild.get_role(int(role_id)) or Object(role_id, type=Role) for role_id in data] - - -def _transform_applied_forum_tags(entry: AuditLogEntry, data: List[Snowflake]) -> List[Union[ForumTag, Object]]: - thread = entry.target - if isinstance(thread, Thread) and isinstance(thread.parent, ForumChannel): - return [thread.parent.get_tag(tag_id) or Object(id=tag_id, type=ForumTag) for tag_id in map(int, data)] - return [Object(id=tag_id, type=ForumTag) for tag_id in data] - - -def _transform_overloaded_flags(entry: AuditLogEntry, data: int) -> Union[int, flags.ChannelFlags]: - # The `flags` key is definitely overloaded. Right now it's for channels and threads but - # I am aware of `member.flags` and `user.flags` existing. However, this does not impact audit logs - # at the moment but better safe than sorry. - channel_audit_log_types = ( - enums.AuditLogAction.channel_create, - enums.AuditLogAction.channel_update, - enums.AuditLogAction.channel_delete, - enums.AuditLogAction.thread_create, - enums.AuditLogAction.thread_update, - enums.AuditLogAction.thread_delete, - ) - - if entry.action in channel_audit_log_types: - return flags.ChannelFlags._from_value(data) - return data - - -def _transform_forum_tags(entry: AuditLogEntry, data: List[ForumTagPayload]) -> List[ForumTag]: - return [ForumTag.from_data(state=entry._state, data=d) for d in data] - - -def _transform_default_reaction(entry: AuditLogEntry, data: DefaultReactionPayload) -> Optional[PartialEmoji]: - if data is None: - return None - - emoji_name = data.get('emoji_name') or '' - emoji_id = utils._get_as_snowflake(data, 'emoji_id') or None # Coerce 0 -> None - return PartialEmoji.with_state(state=entry._state, name=emoji_name, id=emoji_id) - - -def _transform_overwrites( - entry: AuditLogEntry, data: List[PermissionOverwritePayload] -) -> List[Tuple[Object, PermissionOverwrite]]: - overwrites = [] - for elem in data: - allow = Permissions(int(elem['allow'])) - deny = Permissions(int(elem['deny'])) - ow = PermissionOverwrite.from_pair(allow, deny) - - ow_type = elem['type'] - ow_id = int(elem['id']) - target = None - if ow_type == '0': - target = entry.guild.get_role(ow_id) - elif ow_type == '1': - target = entry._get_member(ow_id) - - if target is None: - target = Object(id=ow_id, type=Role if ow_type == '0' else Member) - - overwrites.append((target, ow)) - - return overwrites - - -def _transform_icon(entry: AuditLogEntry, data: Optional[str]) -> Optional[Asset]: - if data is None: - return None - if entry.action is enums.AuditLogAction.guild_update: - return Asset._from_guild_icon(entry._state, entry.guild.id, data) - else: - return Asset._from_icon(entry._state, entry._target_id, data, path='role') # type: ignore # target_id won't be None in this case - - -def _transform_avatar(entry: AuditLogEntry, data: Optional[str]) -> Optional[Asset]: - if data is None: - return None - return Asset._from_avatar(entry._state, entry._target_id, data) # type: ignore # target_id won't be None in this case - - -def _transform_cover_image(entry: AuditLogEntry, data: Optional[str]) -> Optional[Asset]: - if data is None: - return None - return Asset._from_scheduled_event_cover_image(entry._state, entry._target_id, data) # type: ignore # target_id won't be None in this case - - -def _guild_hash_transformer(path: str) -> Callable[[AuditLogEntry, Optional[str]], Optional[Asset]]: - def _transform(entry: AuditLogEntry, data: Optional[str]) -> Optional[Asset]: - if data is None: - return None - return Asset._from_guild_image(entry._state, entry.guild.id, data, path=path) - - return _transform - - -def _transform_automod_trigger_metadata( - entry: AuditLogEntry, data: AutoModerationTriggerMetadata -) -> Optional[AutoModTrigger]: - - if isinstance(entry.target, AutoModRule): - # Trigger type cannot be changed, so type should be the same before and after updates. - # Avoids checking which keys are in data to guess trigger type - # or returning None if data is empty. - try: - return AutoModTrigger.from_data(type=entry.target.trigger.type.value, data=data) - except Exception: - pass - - # Try to infer trigger type from available keys in data - if 'presets' in data: - return AutoModTrigger( - type=enums.AutoModRuleTriggerType.keyword_preset, - presets=AutoModPresets._from_value(data['presets']), # type: ignore - allow_list=data.get('allow_list'), - ) - elif 'keyword_filter' in data: - return AutoModTrigger( - type=enums.AutoModRuleTriggerType.keyword, - keyword_filter=data['keyword_filter'], # type: ignore - allow_list=data.get('allow_list'), - regex_patterns=data.get('regex_patterns'), - ) - elif 'mention_total_limit' in data: - return AutoModTrigger(type=enums.AutoModRuleTriggerType.mention_spam, mention_limit=data['mention_total_limit']) # type: ignore - else: - return AutoModTrigger(type=enums.AutoModRuleTriggerType.spam) - - -def _transform_automod_actions(entry: AuditLogEntry, data: List[AutoModerationAction]) -> List[AutoModRuleAction]: - return [AutoModRuleAction.from_data(action) for action in data] - - -E = TypeVar('E', bound=enums.Enum) - - -def _enum_transformer(enum: Type[E]) -> Callable[[AuditLogEntry, int], E]: - def _transform(entry: AuditLogEntry, data: int) -> E: - return enums.try_enum(enum, data) - - return _transform - - -F = TypeVar('F', bound=flags.BaseFlags) - - -def _flag_transformer(cls: Type[F]) -> Callable[[AuditLogEntry, Union[int, str]], F]: - def _transform(entry: AuditLogEntry, data: Union[int, str]) -> F: - return cls._from_value(int(data)) - - return _transform - - -def _transform_type( - entry: AuditLogEntry, data: Union[int, str] -) -> Union[enums.ChannelType, enums.StickerType, enums.WebhookType, str]: - if entry.action.name.startswith('sticker_'): - return enums.try_enum(enums.StickerType, data) - elif entry.action.name.startswith('integration_'): - return data # type: ignore # integration type is str - elif entry.action.name.startswith('webhook_'): - return enums.try_enum(enums.WebhookType, data) - else: - return enums.try_enum(enums.ChannelType, data) - - -class AuditLogDiff: - def __len__(self) -> int: - return len(self.__dict__) - - def __iter__(self) -> Generator[Tuple[str, Any], None, None]: - yield from self.__dict__.items() - - def __repr__(self) -> str: - values = ' '.join('%s=%r' % item for item in self.__dict__.items()) - return f'' - - if TYPE_CHECKING: - - def __getattr__(self, item: str) -> Any: - ... - - def __setattr__(self, key: str, value: Any) -> Any: - ... - - -Transformer = Callable[["AuditLogEntry", Any], Any] - - -class AuditLogChanges: - # fmt: off - TRANSFORMERS: ClassVar[Mapping[str, Tuple[Optional[str], Optional[Transformer]]]] = { - 'verification_level': (None, _enum_transformer(enums.VerificationLevel)), - 'explicit_content_filter': (None, _enum_transformer(enums.ContentFilter)), - 'allow': (None, _flag_transformer(Permissions)), - 'deny': (None, _flag_transformer(Permissions)), - 'permissions': (None, _flag_transformer(Permissions)), - 'id': (None, _transform_snowflake), - 'color': ('colour', _transform_color), - 'owner_id': ('owner', _transform_member_id), - 'inviter_id': ('inviter', _transform_member_id), - 'channel_id': ('channel', _transform_channel), - 'afk_channel_id': ('afk_channel', _transform_channel), - 'system_channel_id': ('system_channel', _transform_channel), - 'system_channel_flags': (None, _flag_transformer(flags.SystemChannelFlags)), - 'widget_channel_id': ('widget_channel', _transform_channel), - 'rules_channel_id': ('rules_channel', _transform_channel), - 'public_updates_channel_id': ('public_updates_channel', _transform_channel), - 'permission_overwrites': ('overwrites', _transform_overwrites), - 'splash_hash': ('splash', _guild_hash_transformer('splashes')), - 'banner_hash': ('banner', _guild_hash_transformer('banners')), - 'discovery_splash_hash': ('discovery_splash', _guild_hash_transformer('discovery-splashes')), - 'icon_hash': ('icon', _transform_icon), - 'avatar_hash': ('avatar', _transform_avatar), - 'rate_limit_per_user': ('slowmode_delay', None), - 'default_thread_rate_limit_per_user': ('default_thread_slowmode_delay', None), - 'guild_id': ('guild', _transform_guild_id), - 'tags': ('emoji', None), - 'default_message_notifications': ('default_notifications', _enum_transformer(enums.NotificationLevel)), - 'video_quality_mode': (None, _enum_transformer(enums.VideoQualityMode)), - 'privacy_level': (None, _enum_transformer(enums.PrivacyLevel)), - 'format_type': (None, _enum_transformer(enums.StickerFormatType)), - 'type': (None, _transform_type), - 'communication_disabled_until': ('timed_out_until', _transform_timestamp), - 'expire_behavior': (None, _enum_transformer(enums.ExpireBehaviour)), - 'mfa_level': (None, _enum_transformer(enums.MFALevel)), - 'status': (None, _enum_transformer(enums.EventStatus)), - 'entity_type': (None, _enum_transformer(enums.EntityType)), - 'preferred_locale': (None, _enum_transformer(enums.Locale)), - 'image_hash': ('cover_image', _transform_cover_image), - 'trigger_type': (None, _enum_transformer(enums.AutoModRuleTriggerType)), - 'event_type': (None, _enum_transformer(enums.AutoModRuleEventType)), - 'trigger_metadata': ('trigger', _transform_automod_trigger_metadata), - 'actions': (None, _transform_automod_actions), - 'exempt_channels': (None, _transform_channels_or_threads), - 'exempt_roles': (None, _transform_roles), - 'applied_tags': (None, _transform_applied_forum_tags), - 'available_tags': (None, _transform_forum_tags), - 'flags': (None, _transform_overloaded_flags), - 'default_reaction_emoji': (None, _transform_default_reaction), - } - # fmt: on - - def __init__(self, entry: AuditLogEntry, data: List[AuditLogChangePayload]): - self.before: AuditLogDiff = AuditLogDiff() - self.after: AuditLogDiff = AuditLogDiff() - # special case entire process since each - # element in data is a different target - # key is the target id - if entry.action is enums.AuditLogAction.app_command_permission_update: - self.before.app_command_permissions = [] - self.after.app_command_permissions = [] - - for elem in data: - self._handle_app_command_permissions( - self.before, - entry, - elem.get('old_value'), # type: ignore # value will be an ApplicationCommandPermissions if present - ) - - self._handle_app_command_permissions( - self.after, - entry, - elem.get('new_value'), # type: ignore # value will be an ApplicationCommandPermissions if present - ) - return - - for elem in data: - attr = elem['key'] - - # special cases for role add/remove - if attr == '$add': - self._handle_role(self.before, self.after, entry, elem['new_value']) # type: ignore # new_value is a list of roles in this case - continue - elif attr == '$remove': - self._handle_role(self.after, self.before, entry, elem['new_value']) # type: ignore # new_value is a list of roles in this case - continue - - try: - key, transformer = self.TRANSFORMERS[attr] - except (ValueError, KeyError): - transformer = None - else: - if key: - attr = key - - transformer: Optional[Transformer] - - try: - before = elem['old_value'] - except KeyError: - before = None - else: - if transformer: - before = transformer(entry, before) - - setattr(self.before, attr, before) - - try: - after = elem['new_value'] - except KeyError: - after = None - else: - if transformer: - after = transformer(entry, after) - - setattr(self.after, attr, after) - - # add an alias - if hasattr(self.after, 'colour'): - self.after.color = self.after.colour - self.before.color = self.before.colour - if hasattr(self.after, 'expire_behavior'): - self.after.expire_behaviour = self.after.expire_behavior - self.before.expire_behaviour = self.before.expire_behavior - - def __repr__(self) -> str: - return f'' - - def _handle_role(self, first: AuditLogDiff, second: AuditLogDiff, entry: AuditLogEntry, elem: List[RolePayload]) -> None: - if not hasattr(first, 'roles'): - setattr(first, 'roles', []) - - data = [] - g: Guild = entry.guild - - for e in elem: - role_id = int(e['id']) - role = g.get_role(role_id) - - if role is None: - role = Object(id=role_id, type=Role) - role.name = e['name'] # type: ignore # Object doesn't usually have name - - data.append(role) - - setattr(second, 'roles', data) - - def _handle_app_command_permissions( - self, - diff: AuditLogDiff, - entry: AuditLogEntry, - data: Optional[ApplicationCommandPermissions], - ): - if data is None: - return - - # avoid circular import - from discord.app_commands import AppCommandPermissions - - state = entry._state - guild = entry.guild - diff.app_command_permissions.append(AppCommandPermissions(data=data, guild=guild, state=state)) - - -class _AuditLogProxy: - def __init__(self, **kwargs: Any) -> None: - for k, v in kwargs.items(): - setattr(self, k, v) - - -class _AuditLogProxyMemberPrune(_AuditLogProxy): - delete_member_days: int - members_removed: int - - -class _AuditLogProxyMemberMoveOrMessageDelete(_AuditLogProxy): - channel: Union[abc.GuildChannel, Thread] - count: int - - -class _AuditLogProxyMemberDisconnect(_AuditLogProxy): - count: int - - -class _AuditLogProxyPinAction(_AuditLogProxy): - channel: Union[abc.GuildChannel, Thread] - message_id: int - - -class _AuditLogProxyStageInstanceAction(_AuditLogProxy): - channel: abc.GuildChannel - - -class _AuditLogProxyMessageBulkDelete(_AuditLogProxy): - count: int - - -class _AuditLogProxyAutoModAction(_AuditLogProxy): - automod_rule_name: str - automod_rule_trigger_type: str - channel: Optional[Union[abc.GuildChannel, Thread]] - - -class AuditLogEntry(Hashable): - r"""Represents an Audit Log entry. - - You retrieve these via :meth:`Guild.audit_logs`. - - .. container:: operations - - .. describe:: x == y - - Checks if two entries are equal. - - .. describe:: x != y - - Checks if two entries are not equal. - - .. describe:: hash(x) - - Returns the entry's hash. - - .. versionchanged:: 1.7 - Audit log entries are now comparable and hashable. - - Attributes - ----------- - action: :class:`AuditLogAction` - The action that was done. - user: Optional[:class:`abc.User`] - The user who initiated this action. Usually a :class:`Member`\, unless gone - then it's a :class:`User`. - user_id: Optional[:class:`int`] - The user ID who initiated this action. - - .. versionadded:: 2.2 - id: :class:`int` - The entry ID. - guild: :class:`Guild` - The guild that this entry belongs to. - target: Any - The target that got changed. The exact type of this depends on - the action being done. - reason: Optional[:class:`str`] - The reason this action was done. - extra: Any - Extra information that this entry has that might be useful. - For most actions, this is ``None``. However in some cases it - contains extra information. See :class:`AuditLogAction` for - which actions have this field filled out. - """ - - def __init__( - self, - *, - users: Mapping[int, User], - integrations: Mapping[int, PartialIntegration], - app_commands: Mapping[int, AppCommand], - automod_rules: Mapping[int, AutoModRule], - webhooks: Mapping[int, Webhook], - data: AuditLogEntryPayload, - guild: Guild, - ): - self._state: ConnectionState = guild._state - self.guild: Guild = guild - self._users: Mapping[int, User] = users - self._integrations: Mapping[int, PartialIntegration] = integrations - self._app_commands: Mapping[int, AppCommand] = app_commands - self._automod_rules: Mapping[int, AutoModRule] = automod_rules - self._webhooks: Mapping[int, Webhook] = webhooks - self._from_data(data) - - def _from_data(self, data: AuditLogEntryPayload) -> None: - self.action: enums.AuditLogAction = enums.try_enum(enums.AuditLogAction, data['action_type']) - self.id: int = int(data['id']) - - # this key is technically not usually present - self.reason: Optional[str] = data.get('reason') - extra = data.get('options') - - # fmt: off - self.extra: Union[ - _AuditLogProxyMemberPrune, - _AuditLogProxyMemberMoveOrMessageDelete, - _AuditLogProxyMemberDisconnect, - _AuditLogProxyPinAction, - _AuditLogProxyStageInstanceAction, - _AuditLogProxyMessageBulkDelete, - _AuditLogProxyAutoModAction, - Member, User, None, PartialIntegration, - Role, Object - ] = None - # fmt: on - - if isinstance(self.action, enums.AuditLogAction) and extra: - if self.action is enums.AuditLogAction.member_prune: - # member prune has two keys with useful information - self.extra = _AuditLogProxyMemberPrune( - delete_member_days=int(extra['delete_member_days']), - members_removed=int(extra['members_removed']), - ) - elif self.action is enums.AuditLogAction.member_move or self.action is enums.AuditLogAction.message_delete: - channel_id = int(extra['channel_id']) - self.extra = _AuditLogProxyMemberMoveOrMessageDelete( - count=int(extra['count']), - channel=self.guild.get_channel_or_thread(channel_id) or Object(id=channel_id), - ) - elif self.action is enums.AuditLogAction.member_disconnect: - # The member disconnect action has a dict with some information - self.extra = _AuditLogProxyMemberDisconnect(count=int(extra['count'])) - elif self.action is enums.AuditLogAction.message_bulk_delete: - # The bulk message delete action has the number of messages deleted - self.extra = _AuditLogProxyMessageBulkDelete(count=int(extra['count'])) - elif self.action.name.endswith('pin'): - # the pin actions have a dict with some information - channel_id = int(extra['channel_id']) - self.extra = _AuditLogProxyPinAction( - channel=self.guild.get_channel_or_thread(channel_id) or Object(id=channel_id), - message_id=int(extra['message_id']), - ) - elif ( - self.action is enums.AuditLogAction.automod_block_message - or self.action is enums.AuditLogAction.automod_flag_message - or self.action is enums.AuditLogAction.automod_timeout_member - ): - channel_id = utils._get_as_snowflake(extra, 'channel_id') - channel = None - - # May be an empty string instead of None due to a Discord issue - if channel_id: - channel = self.guild.get_channel_or_thread(channel_id) or Object(id=channel_id) - - self.extra = _AuditLogProxyAutoModAction( - automod_rule_name=extra['auto_moderation_rule_name'], - automod_rule_trigger_type=enums.try_enum( - enums.AutoModRuleTriggerType, extra['auto_moderation_rule_trigger_type'] - ), - channel=channel, - ) - - elif self.action.name.startswith('overwrite_'): - # the overwrite_ actions have a dict with some information - instance_id = int(extra['id']) - the_type = extra.get('type') - if the_type == '1': - self.extra = self._get_member(instance_id) - elif the_type == '0': - role = self.guild.get_role(instance_id) - if role is None: - role = Object(id=instance_id, type=Role) - role.name = extra.get('role_name') # type: ignore # Object doesn't usually have name - self.extra = role - elif self.action.name.startswith('stage_instance'): - channel_id = int(extra['channel_id']) - self.extra = _AuditLogProxyStageInstanceAction( - channel=self.guild.get_channel(channel_id) or Object(id=channel_id, type=StageChannel) - ) - elif self.action.name.startswith('app_command'): - app_id = int(extra['application_id']) - self.extra = self._get_integration_by_app_id(app_id) or Object(app_id, type=PartialIntegration) - - # this key is not present when the above is present, typically. - # It's a list of { new_value: a, old_value: b, key: c } - # where new_value and old_value are not guaranteed to be there depending - # on the action type, so let's just fetch it for now and only turn it - # into meaningful data when requested - self._changes = data.get('changes', []) - - self.user_id: Optional[int] = utils._get_as_snowflake(data, 'user_id') - self.user: Optional[Union[User, Member]] = self._get_member(self.user_id) - self._target_id = utils._get_as_snowflake(data, 'target_id') - - def _get_member(self, user_id: Optional[int]) -> Union[Member, User, None]: - if user_id is None: - return None - - return self.guild.get_member(user_id) or self._users.get(user_id) - - def _get_integration(self, integration_id: Optional[int]) -> Optional[PartialIntegration]: - if integration_id is None: - return None - - return self._integrations.get(integration_id) - - def _get_integration_by_app_id(self, application_id: Optional[int]) -> Optional[PartialIntegration]: - if application_id is None: - return None - - # get PartialIntegration by application id - return utils.get(self._integrations.values(), application_id=application_id) - - def _get_app_command(self, app_command_id: Optional[int]) -> Optional[AppCommand]: - if app_command_id is None: - return None - - return self._app_commands.get(app_command_id) - - def __repr__(self) -> str: - return f'' - - @utils.cached_property - def created_at(self) -> datetime.datetime: - """:class:`datetime.datetime`: Returns the entry's creation time in UTC.""" - return utils.snowflake_time(self.id) - - @utils.cached_property - def target(self) -> TargetType: - if self.action.target_type is None: - return None - - try: - converter = getattr(self, '_convert_target_' + self.action.target_type) - except AttributeError: - if self._target_id is None: - return None - return Object(id=self._target_id) - else: - return converter(self._target_id) - - @utils.cached_property - def category(self) -> Optional[enums.AuditLogActionCategory]: - """Optional[:class:`AuditLogActionCategory`]: The category of the action, if applicable.""" - return self.action.category - - @utils.cached_property - def changes(self) -> AuditLogChanges: - """:class:`AuditLogChanges`: The list of changes this entry has.""" - obj = AuditLogChanges(self, self._changes) - del self._changes - return obj - - @utils.cached_property - def before(self) -> AuditLogDiff: - """:class:`AuditLogDiff`: The target's prior state.""" - return self.changes.before - - @utils.cached_property - def after(self) -> AuditLogDiff: - """:class:`AuditLogDiff`: The target's subsequent state.""" - return self.changes.after - - def _convert_target_guild(self, target_id: int) -> Guild: - return self.guild - - def _convert_target_channel(self, target_id: int) -> Union[abc.GuildChannel, Object]: - return self.guild.get_channel(target_id) or Object(id=target_id) - - def _convert_target_user(self, target_id: Optional[int]) -> Optional[Union[Member, User, Object]]: - # For some reason the member_disconnect and member_move action types - # do not have a non-null target_id so safeguard against that - if target_id is None: - return None - - return self._get_member(target_id) or Object(id=target_id, type=Member) - - def _convert_target_role(self, target_id: int) -> Union[Role, Object]: - return self.guild.get_role(target_id) or Object(id=target_id, type=Role) - - def _convert_target_invite(self, target_id: None) -> Invite: - # invites have target_id set to null - # so figure out which change has the full invite data - changeset = self.before if self.action is enums.AuditLogAction.invite_delete else self.after - - fake_payload: InvitePayload = { - 'max_age': changeset.max_age, - 'max_uses': changeset.max_uses, - 'code': changeset.code, - 'temporary': changeset.temporary, - 'uses': changeset.uses, - 'channel': None, # type: ignore # the channel is passed to the Invite constructor directly - } - - obj = Invite(state=self._state, data=fake_payload, guild=self.guild, channel=changeset.channel) - try: - obj.inviter = changeset.inviter - except AttributeError: - pass - return obj - - def _convert_target_emoji(self, target_id: int) -> Union[Emoji, Object]: - return self._state.get_emoji(target_id) or Object(id=target_id, type=Emoji) - - def _convert_target_message(self, target_id: int) -> Union[Member, User, Object]: - return self._get_member(target_id) or Object(id=target_id, type=Member) - - def _convert_target_stage_instance(self, target_id: int) -> Union[StageInstance, Object]: - return self.guild.get_stage_instance(target_id) or Object(id=target_id, type=StageInstance) - - def _convert_target_sticker(self, target_id: int) -> Union[GuildSticker, Object]: - return self._state.get_sticker(target_id) or Object(id=target_id, type=GuildSticker) - - def _convert_target_thread(self, target_id: int) -> Union[Thread, Object]: - return self.guild.get_thread(target_id) or Object(id=target_id, type=Thread) - - def _convert_target_guild_scheduled_event(self, target_id: int) -> Union[ScheduledEvent, Object]: - return self.guild.get_scheduled_event(target_id) or Object(id=target_id, type=ScheduledEvent) - - def _convert_target_integration(self, target_id: int) -> Union[PartialIntegration, Object]: - return self._get_integration(target_id) or Object(target_id, type=PartialIntegration) - - def _convert_target_app_command(self, target_id: int) -> Union[AppCommand, Object]: - target = self._get_app_command(target_id) - if not target: - # circular import - from .app_commands import AppCommand - - target = Object(target_id, type=AppCommand) - - return target - - def _convert_target_integration_or_app_command(self, target_id: int) -> Union[PartialIntegration, AppCommand, Object]: - target = self._get_integration_by_app_id(target_id) or self._get_app_command(target_id) - if not target: - try: - # circular import - from .app_commands import AppCommand - - # get application id from extras - # if it matches target id, type should be integration - target_app = self.extra - # extra should be an Object or PartialIntegration - app_id = target_app.application_id if isinstance(target_app, PartialIntegration) else target_app.id # type: ignore - type = PartialIntegration if target_id == app_id else AppCommand - except AttributeError: - return Object(target_id) - else: - return Object(target_id, type=type) - - return target - - def _convert_target_auto_moderation(self, target_id: int) -> Union[AutoModRule, Object]: - return self._automod_rules.get(target_id) or Object(target_id, type=AutoModRule) - - def _convert_target_webhook(self, target_id: int) -> Union[Webhook, Object]: - # circular import - from .webhook import Webhook - - return self._webhooks.get(target_id) or Object(target_id, type=Webhook) diff --git a/.venv/Lib/site-packages/discord/automod.py b/.venv/Lib/site-packages/discord/automod.py deleted file mode 100644 index 84a00c8..0000000 --- a/.venv/Lib/site-packages/discord/automod.py +++ /dev/null @@ -1,600 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations -import datetime - -from typing import TYPE_CHECKING, Any, Dict, Optional, List, Set, Union, Sequence, overload - -from .enums import AutoModRuleTriggerType, AutoModRuleActionType, AutoModRuleEventType, try_enum -from .flags import AutoModPresets -from . import utils -from .utils import MISSING, cached_slot_property - -if TYPE_CHECKING: - from typing_extensions import Self - from .abc import Snowflake, GuildChannel - from .threads import Thread - from .guild import Guild - from .member import Member - from .state import ConnectionState - from .types.automod import ( - AutoModerationRule as AutoModerationRulePayload, - AutoModerationTriggerMetadata as AutoModerationTriggerMetadataPayload, - AutoModerationAction as AutoModerationActionPayload, - AutoModerationActionExecution as AutoModerationActionExecutionPayload, - ) - from .role import Role - -__all__ = ( - 'AutoModRuleAction', - 'AutoModTrigger', - 'AutoModRule', - 'AutoModAction', -) - - -class AutoModRuleAction: - """Represents an auto moderation's rule action. - - .. note:: - Only one of ``channel_id``, ``duration``, or ``custom_message`` can be used. - - .. versionadded:: 2.0 - - Attributes - ----------- - type: :class:`AutoModRuleActionType` - The type of action to take. - Defaults to :attr:`~AutoModRuleActionType.block_message`. - channel_id: Optional[:class:`int`] - The ID of the channel or thread to send the alert message to, if any. - Passing this sets :attr:`type` to :attr:`~AutoModRuleActionType.send_alert_message`. - duration: Optional[:class:`datetime.timedelta`] - The duration of the timeout to apply, if any. - Has a maximum of 28 days. - Passing this sets :attr:`type` to :attr:`~AutoModRuleActionType.timeout`. - custom_message: Optional[:class:`str`] - A custom message which will be shown to a user when their message is blocked. - Passing this sets :attr:`type` to :attr:`~AutoModRuleActionType.block_message`. - - .. versionadded:: 2.2 - """ - - __slots__ = ('type', 'channel_id', 'duration', 'custom_message') - - @overload - def __init__(self, *, channel_id: Optional[int] = ...) -> None: - ... - - @overload - def __init__(self, *, duration: Optional[datetime.timedelta] = ...) -> None: - ... - - @overload - def __init__(self, *, custom_message: Optional[str] = ...) -> None: - ... - - def __init__( - self, - *, - channel_id: Optional[int] = None, - duration: Optional[datetime.timedelta] = None, - custom_message: Optional[str] = None, - ) -> None: - self.channel_id: Optional[int] = channel_id - self.duration: Optional[datetime.timedelta] = duration - self.custom_message: Optional[str] = custom_message - - if sum(v is None for v in (channel_id, duration, custom_message)) < 2: - raise ValueError('Only one of channel_id, duration, or custom_message can be passed.') - - self.type: AutoModRuleActionType = AutoModRuleActionType.block_message - if channel_id: - self.type = AutoModRuleActionType.send_alert_message - elif duration: - self.type = AutoModRuleActionType.timeout - - def __repr__(self) -> str: - return f'' - - @classmethod - def from_data(cls, data: AutoModerationActionPayload) -> Self: - if data['type'] == AutoModRuleActionType.timeout.value: - duration_seconds = data['metadata']['duration_seconds'] - return cls(duration=datetime.timedelta(seconds=duration_seconds)) - elif data['type'] == AutoModRuleActionType.send_alert_message.value: - channel_id = int(data['metadata']['channel_id']) - return cls(channel_id=channel_id) - return cls(custom_message=data.get('metadata', {}).get('custom_message')) - - def to_dict(self) -> Dict[str, Any]: - ret = {'type': self.type.value, 'metadata': {}} - if self.type is AutoModRuleActionType.block_message and self.custom_message is not None: - ret['metadata'] = {'custom_message': self.custom_message} - elif self.type is AutoModRuleActionType.timeout: - ret['metadata'] = {'duration_seconds': int(self.duration.total_seconds())} # type: ignore # duration cannot be None here - elif self.type is AutoModRuleActionType.send_alert_message: - ret['metadata'] = {'channel_id': str(self.channel_id)} - return ret - - -class AutoModTrigger: - r"""Represents a trigger for an auto moderation rule. - - The following table illustrates relevant attributes for each :class:`AutoModRuleTriggerType`: - - +-----------------------------------------------+------------------------------------------------+ - | Type | Attributes | - +===============================================+================================================+ - | :attr:`AutoModRuleTriggerType.keyword` | :attr:`keyword_filter`, :attr:`regex_patterns`,| - | | :attr:`allow_list` | - +-----------------------------------------------+------------------------------------------------+ - | :attr:`AutoModRuleTriggerType.spam` | | - +-----------------------------------------------+------------------------------------------------+ - | :attr:`AutoModRuleTriggerType.keyword_preset` | :attr:`presets`\, :attr:`allow_list` | - +-----------------------------------------------+------------------------------------------------+ - | :attr:`AutoModRuleTriggerType.mention_spam` | :attr:`mention_limit` | - +-----------------------------------------------+------------------------------------------------+ - - .. versionadded:: 2.0 - - Attributes - ----------- - type: :class:`AutoModRuleTriggerType` - The type of trigger. - keyword_filter: List[:class:`str`] - The list of strings that will trigger the keyword filter. Maximum of 1000. - Keywords can only be up to 60 characters in length. - - This could be combined with :attr:`regex_patterns`. - regex_patterns: List[:class:`str`] - The regex pattern that will trigger the filter. The syntax is based off of - `Rust's regex syntax `_. - Maximum of 10. Regex strings can only be up to 260 characters in length. - - This could be combined with :attr:`keyword_filter` and/or :attr:`allow_list` - - .. versionadded:: 2.1 - presets: :class:`AutoModPresets` - The presets used with the preset keyword filter. - allow_list: List[:class:`str`] - The list of words that are exempt from the commonly flagged words. Maximum of 100. - Keywords can only be up to 60 characters in length. - mention_limit: :class:`int` - The total number of user and role mentions a message can contain. - Has a maximum of 50. - """ - - __slots__ = ( - 'type', - 'keyword_filter', - 'presets', - 'allow_list', - 'mention_limit', - 'regex_patterns', - ) - - def __init__( - self, - *, - type: Optional[AutoModRuleTriggerType] = None, - keyword_filter: Optional[List[str]] = None, - presets: Optional[AutoModPresets] = None, - allow_list: Optional[List[str]] = None, - mention_limit: Optional[int] = None, - regex_patterns: Optional[List[str]] = None, - ) -> None: - if type is None and sum(arg is not None for arg in (keyword_filter or regex_patterns, presets, mention_limit)) > 1: - raise ValueError('Please pass only one of keyword_filter, regex_patterns, presets, or mention_limit.') - - if type is not None: - self.type = type - elif keyword_filter is not None or regex_patterns is not None: - self.type = AutoModRuleTriggerType.keyword - elif presets is not None: - self.type = AutoModRuleTriggerType.keyword_preset - elif mention_limit is not None: - self.type = AutoModRuleTriggerType.mention_spam - else: - raise ValueError( - 'Please pass the trigger type explicitly if not using keyword_filter, presets, or mention_limit.' - ) - - self.keyword_filter: List[str] = keyword_filter if keyword_filter is not None else [] - self.presets: AutoModPresets = presets if presets is not None else AutoModPresets() - self.allow_list: List[str] = allow_list if allow_list is not None else [] - self.mention_limit: int = mention_limit if mention_limit is not None else 0 - self.regex_patterns: List[str] = regex_patterns if regex_patterns is not None else [] - - def __repr__(self) -> str: - data = self.to_metadata_dict() - if data: - joined = ' '.join(f'{k}={v!r}' for k, v in data.items()) - return f'' - - return f'' - - @classmethod - def from_data(cls, type: int, data: Optional[AutoModerationTriggerMetadataPayload]) -> Self: - type_ = try_enum(AutoModRuleTriggerType, type) - if data is None: - return cls(type=type_) - elif type_ is AutoModRuleTriggerType.keyword: - return cls( - type=type_, - keyword_filter=data.get('keyword_filter'), - regex_patterns=data.get('regex_patterns'), - allow_list=data.get('allow_list'), - ) - elif type_ is AutoModRuleTriggerType.keyword_preset: - return cls( - type=type_, presets=AutoModPresets._from_value(data.get('presets', [])), allow_list=data.get('allow_list') - ) - elif type_ is AutoModRuleTriggerType.mention_spam: - return cls(type=type_, mention_limit=data.get('mention_total_limit')) - else: - return cls(type=type_) - - def to_metadata_dict(self) -> Optional[Dict[str, Any]]: - if self.type is AutoModRuleTriggerType.keyword: - return { - 'keyword_filter': self.keyword_filter, - 'regex_patterns': self.regex_patterns, - 'allow_list': self.allow_list, - } - elif self.type is AutoModRuleTriggerType.keyword_preset: - return {'presets': self.presets.to_array(), 'allow_list': self.allow_list} - elif self.type is AutoModRuleTriggerType.mention_spam: - return {'mention_total_limit': self.mention_limit} - - -class AutoModRule: - """Represents an auto moderation rule. - - .. versionadded:: 2.0 - - Attributes - ----------- - id: :class:`int` - The ID of the rule. - guild: :class:`Guild` - The guild the rule is for. - name: :class:`str` - The name of the rule. - creator_id: :class:`int` - The ID of the user that created the rule. - trigger: :class:`AutoModTrigger` - The rule's trigger. - enabled: :class:`bool` - Whether the rule is enabled. - exempt_role_ids: Set[:class:`int`] - The IDs of the roles that are exempt from the rule. - exempt_channel_ids: Set[:class:`int`] - The IDs of the channels that are exempt from the rule. - """ - - __slots__ = ( - '_state', - '_cs_exempt_roles', - '_cs_exempt_channels', - '_cs_actions', - 'id', - 'guild', - 'name', - 'creator_id', - 'event_type', - 'trigger', - 'enabled', - 'exempt_role_ids', - 'exempt_channel_ids', - '_actions', - ) - - def __init__(self, *, data: AutoModerationRulePayload, guild: Guild, state: ConnectionState) -> None: - self._state: ConnectionState = state - self.guild: Guild = guild - self.id: int = int(data['id']) - self.name: str = data['name'] - self.creator_id = int(data['creator_id']) - self.event_type: AutoModRuleEventType = try_enum(AutoModRuleEventType, data['event_type']) - self.trigger: AutoModTrigger = AutoModTrigger.from_data(data['trigger_type'], data=data.get('trigger_metadata')) - self.enabled: bool = data['enabled'] - self.exempt_role_ids: Set[int] = {int(role_id) for role_id in data['exempt_roles']} - self.exempt_channel_ids: Set[int] = {int(channel_id) for channel_id in data['exempt_channels']} - self._actions: List[AutoModerationActionPayload] = data['actions'] - - def __repr__(self) -> str: - return f'' - - def to_dict(self) -> AutoModerationRulePayload: - ret: AutoModerationRulePayload = { - 'id': str(self.id), - 'guild_id': str(self.guild.id), - 'name': self.name, - 'creator_id': str(self.creator_id), - 'event_type': self.event_type.value, - 'trigger_type': self.trigger.type.value, - 'trigger_metadata': self.trigger.to_metadata_dict(), - 'actions': [action.to_dict() for action in self.actions], - 'enabled': self.enabled, - 'exempt_roles': [str(role_id) for role_id in self.exempt_role_ids], - 'exempt_channels': [str(channel_id) for channel_id in self.exempt_channel_ids], - } # type: ignore # trigger types break the flow here. - - return ret - - @property - def creator(self) -> Optional[Member]: - """Optional[:class:`Member`]: The member that created this rule.""" - return self.guild.get_member(self.creator_id) - - @cached_slot_property('_cs_exempt_roles') - def exempt_roles(self) -> List[Role]: - """List[:class:`Role`]: The roles that are exempt from this rule.""" - result = [] - get_role = self.guild.get_role - for role_id in self.exempt_role_ids: - role = get_role(role_id) - if role is not None: - result.append(role) - - return utils._unique(result) - - @cached_slot_property('_cs_exempt_channels') - def exempt_channels(self) -> List[Union[GuildChannel, Thread]]: - """List[Union[:class:`abc.GuildChannel`, :class:`Thread`]]: The channels that are exempt from this rule.""" - it = filter(None, map(self.guild._resolve_channel, self.exempt_channel_ids)) - return utils._unique(it) - - @cached_slot_property('_cs_actions') - def actions(self) -> List[AutoModRuleAction]: - """List[:class:`AutoModRuleAction`]: The actions that are taken when this rule is triggered.""" - return [AutoModRuleAction.from_data(action) for action in self._actions] - - def is_exempt(self, obj: Snowflake, /) -> bool: - """Check if an object is exempt from the automod rule. - - Parameters - ----------- - obj: :class:`abc.Snowflake` - The role, channel, or thread to check. - - Returns - -------- - :class:`bool` - Whether the object is exempt from the automod rule. - """ - return obj.id in self.exempt_channel_ids or obj.id in self.exempt_role_ids - - async def edit( - self, - *, - name: str = MISSING, - event_type: AutoModRuleEventType = MISSING, - actions: List[AutoModRuleAction] = MISSING, - trigger: AutoModTrigger = MISSING, - enabled: bool = MISSING, - exempt_roles: Sequence[Snowflake] = MISSING, - exempt_channels: Sequence[Snowflake] = MISSING, - reason: str = MISSING, - ) -> Self: - """|coro| - - Edits this auto moderation rule. - - You must have :attr:`Permissions.manage_guild` to edit rules. - - Parameters - ----------- - name: :class:`str` - The new name to change to. - event_type: :class:`AutoModRuleEventType` - The new event type to change to. - actions: List[:class:`AutoModRuleAction`] - The new rule actions to update. - trigger: :class:`AutoModTrigger` - The new trigger to update. - You can only change the trigger metadata, not the type. - enabled: :class:`bool` - Whether the rule should be enabled or not. - exempt_roles: Sequence[:class:`abc.Snowflake`] - The new roles to exempt from the rule. - exempt_channels: Sequence[:class:`abc.Snowflake`] - The new channels to exempt from the rule. - reason: :class:`str` - The reason for updating this rule. Shows up on the audit log. - - Raises - ------- - Forbidden - You do not have permission to edit this rule. - HTTPException - Editing the rule failed. - - Returns - -------- - :class:`AutoModRule` - The updated auto moderation rule. - """ - payload = {} - if actions is not MISSING: - payload['actions'] = [action.to_dict() for action in actions] - - if name is not MISSING: - payload['name'] = name - - if event_type is not MISSING: - payload['event_type'] = event_type - - if trigger is not MISSING: - trigger_metadata = trigger.to_metadata_dict() - if trigger_metadata is not None: - payload['trigger_metadata'] = trigger_metadata - - if enabled is not MISSING: - payload['enabled'] = enabled - - if exempt_roles is not MISSING: - payload['exempt_roles'] = [x.id for x in exempt_roles] - - if exempt_channels is not MISSING: - payload['exempt_channels'] = [x.id for x in exempt_channels] - - data = await self._state.http.edit_auto_moderation_rule( - self.guild.id, - self.id, - reason=reason, - **payload, - ) - - return AutoModRule(data=data, guild=self.guild, state=self._state) - - async def delete(self, *, reason: str = MISSING) -> None: - """|coro| - - Deletes the auto moderation rule. - - You must have :attr:`Permissions.manage_guild` to delete rules. - - Parameters - ----------- - reason: :class:`str` - The reason for deleting this rule. Shows up on the audit log. - - Raises - ------- - Forbidden - You do not have permissions to delete the rule. - HTTPException - Deleting the rule failed. - """ - await self._state.http.delete_auto_moderation_rule(self.guild.id, self.id, reason=reason) - - -class AutoModAction: - """Represents an action that was taken as the result of a moderation rule. - - .. versionadded:: 2.0 - - Attributes - ----------- - action: :class:`AutoModRuleAction` - The action that was taken. - message_id: Optional[:class:`int`] - The message ID that triggered the action. This is only available if the - action is done on an edited message. - rule_id: :class:`int` - The ID of the rule that was triggered. - rule_trigger_type: :class:`AutoModRuleTriggerType` - The trigger type of the rule that was triggered. - guild_id: :class:`int` - The ID of the guild where the rule was triggered. - user_id: :class:`int` - The ID of the user that triggered the rule. - channel_id: :class:`int` - The ID of the channel where the rule was triggered. - alert_system_message_id: Optional[:class:`int`] - The ID of the system message that was sent to the predefined alert channel. - content: :class:`str` - The content of the message that triggered the rule. - Requires the :attr:`Intents.message_content` or it will always return an empty string. - matched_keyword: Optional[:class:`str`] - The matched keyword from the triggering message. - matched_content: Optional[:class:`str`] - The matched content from the triggering message. - Requires the :attr:`Intents.message_content` or it will always return ``None``. - """ - - __slots__ = ( - '_state', - 'action', - 'rule_id', - 'rule_trigger_type', - 'guild_id', - 'user_id', - 'channel_id', - 'message_id', - 'alert_system_message_id', - 'content', - 'matched_keyword', - 'matched_content', - ) - - def __init__(self, *, data: AutoModerationActionExecutionPayload, state: ConnectionState) -> None: - self._state: ConnectionState = state - self.message_id: Optional[int] = utils._get_as_snowflake(data, 'message_id') - self.action: AutoModRuleAction = AutoModRuleAction.from_data(data['action']) - self.rule_id: int = int(data['rule_id']) - self.rule_trigger_type: AutoModRuleTriggerType = try_enum(AutoModRuleTriggerType, data['rule_trigger_type']) - self.guild_id: int = int(data['guild_id']) - self.channel_id: Optional[int] = utils._get_as_snowflake(data, 'channel_id') - self.user_id: int = int(data['user_id']) - self.alert_system_message_id: Optional[int] = utils._get_as_snowflake(data, 'alert_system_message_id') - self.content: str = data.get('content', '') - self.matched_keyword: Optional[str] = data['matched_keyword'] - self.matched_content: Optional[str] = data.get('matched_content') - - def __repr__(self) -> str: - return f'' - - @property - def guild(self) -> Guild: - """:class:`Guild`: The guild this action was taken in.""" - return self._state._get_or_create_unavailable_guild(self.guild_id) - - @property - def channel(self) -> Optional[Union[GuildChannel, Thread]]: - """Optional[Union[:class:`abc.GuildChannel`, :class:`Thread`]]: The channel this action was taken in.""" - if self.channel_id: - return self.guild.get_channel_or_thread(self.channel_id) - return None - - @property - def member(self) -> Optional[Member]: - """Optional[:class:`Member`]: The member this action was taken against /who triggered this rule.""" - return self.guild.get_member(self.user_id) - - async def fetch_rule(self) -> AutoModRule: - """|coro| - - Fetch the rule whose action was taken. - - You must have :attr:`Permissions.manage_guild` to do this. - - Raises - ------- - Forbidden - You do not have permissions to view the rule. - HTTPException - Fetching the rule failed. - - Returns - -------- - :class:`AutoModRule` - The rule that was executed. - """ - - data = await self._state.http.get_auto_moderation_rule(self.guild.id, self.rule_id) - return AutoModRule(data=data, guild=self.guild, state=self._state) diff --git a/.venv/Lib/site-packages/discord/backoff.py b/.venv/Lib/site-packages/discord/backoff.py deleted file mode 100644 index cfb93ad..0000000 --- a/.venv/Lib/site-packages/discord/backoff.py +++ /dev/null @@ -1,108 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - - -import time -import random -from typing import Callable, Generic, Literal, TypeVar, overload, Union - -T = TypeVar('T', bool, Literal[True], Literal[False]) - -# fmt: off -__all__ = ( - 'ExponentialBackoff', -) -# fmt: on - - -class ExponentialBackoff(Generic[T]): - """An implementation of the exponential backoff algorithm - - Provides a convenient interface to implement an exponential backoff - for reconnecting or retrying transmissions in a distributed network. - - Once instantiated, the delay method will return the next interval to - wait for when retrying a connection or transmission. The maximum - delay increases exponentially with each retry up to a maximum of - 2^10 * base, and is reset if no more attempts are needed in a period - of 2^11 * base seconds. - - Parameters - ---------- - base: :class:`int` - The base delay in seconds. The first retry-delay will be up to - this many seconds. - integral: :class:`bool` - Set to ``True`` if whole periods of base is desirable, otherwise any - number in between may be returned. - """ - - def __init__(self, base: int = 1, *, integral: T = False): - self._base: int = base - - self._exp: int = 0 - self._max: int = 10 - self._reset_time: int = base * 2**11 - self._last_invocation: float = time.monotonic() - - # Use our own random instance to avoid messing with global one - rand = random.Random() - rand.seed() - - self._randfunc: Callable[..., Union[int, float]] = rand.randrange if integral else rand.uniform - - @overload - def delay(self: ExponentialBackoff[Literal[False]]) -> float: - ... - - @overload - def delay(self: ExponentialBackoff[Literal[True]]) -> int: - ... - - @overload - def delay(self: ExponentialBackoff[bool]) -> Union[int, float]: - ... - - def delay(self) -> Union[int, float]: - """Compute the next delay - - Returns the next delay to wait according to the exponential - backoff algorithm. This is a value between 0 and base * 2^exp - where exponent starts off at 1 and is incremented at every - invocation of this method up to a maximum of 10. - - If a period of more than base * 2^11 has passed since the last - retry, the exponent is reset to 1. - """ - invocation = time.monotonic() - interval = invocation - self._last_invocation - self._last_invocation = invocation - - if interval > self._reset_time: - self._exp = 0 - - self._exp = min(self._exp + 1, self._max) - return self._randfunc(0, self._base * 2**self._exp) diff --git a/.venv/Lib/site-packages/discord/bin/libopus-0.x64.dll b/.venv/Lib/site-packages/discord/bin/libopus-0.x64.dll deleted file mode 100644 index 74a8e3554ff00d07d979d7763f03555d8e392f21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 441856 zcmdqKeSB2qneac!3=k!9LXDcXsMGEAX>e$pHna^pxXmGFz3WNyKdJmKD#QxN;8uHNkAYWz67Zn@NHt$Mr=)jn)!XN z`^?RNM1{Qmm+k(_hx_xrl9`?{~!dlKK==JWe}z5xGnIiIhMr~Fr||NewmY}ul z%HYkn-f-jR&pGGpP`>G}|K*oHbN=+}zE}8{xMk(-6?`Xdx&HQ#>*qDM-^cU9wb$HU zqMu&=g=??B{UV*e>h|+^oQ9X&)3mqA6t@&#p%g}L7Kk#e=y zf88>#GJU>#r0O8~GM9h*Xt~ed_TAg+r3k|k80vBl|Dkd>-gGMk1(rS^e@b{f`jK*r zB=`T%|JiD9+^Mawo#kb=W0$NjueLY6eit*2*FPTW{M6t=T6 zxWq00n)-3b2b@jSV>|1z=3}|9N#6QF^>`>PO*pFu%*S&Z)zeX9+3)&K8hbio znO9~>tAcWU5ewCD55?Tx<#Kmy|@S-%%MLx!3e}+1ul^B9P2d)iidM7sr^X}-Vm^iUFilh(rdIIU=-=7+HWLusY}w;nd@L5F>(+oY17XK#c5=rAk3t2g<+zp0{a z(>ED$q@%%zGs%v%y?64RIX$ak!Brt!0d5kRa!l1#^o=vE9?RGn56vT|3QRN1{&6W) zYXAv#sQ+ZFz9Xu7?fL_@UxVoZ;9oqDHrk#TXYZ|(7O8a^)T*wZk2j1|mm>b(B#TNbMRO(%UDX{ootGOUdB znoFDhqjcI}Ie}%7{muIX$iLQ|PR=D&}o-f8@VrM84h$S~VvZz>SaR!6e` zcEuT#v)IA1`7JU-W^S+LzbDkqcYb4QG_)eG8e3Z4&*kDwr^d{66*Y%~v1B@srvp@7 z?(Kfd$&(Vj<@L_idw!CrY&riuX{Ir>I<9UCt%<7}LhEeR99nOyheON~eExArI1_u* zUZG9q^{YCc@cy%%>p~^Qo@18kG20CCEMw2Jrs~dhTH#JJ*J*|in&IOO{U=T1(e4Jb z|HN*=QPxm4RG+!~y^DOlwH=>1oArKiX1LqTzq8>@Kg-;n$(P^R5$+Z;K&sT+l$K`L zb4S5&V^fEGWlkGbxP!grw-tl(Mz}U3>o-l-Oea|E-k^X0l6zIC?8+72xSDfqh4~E# zZ}RmTOZ_Y)=n_}srpmCf-48||N5Nmr^(dwT5lc}Sv zpRrVjy1;hX@{t3I&AzP1iaaZzHRAo2dN!8K7BxL@jvkLj4n~co2cxMTW9tiyDW;ay zL|rRXWQVtSgEaO4r}DYy zHSPv}XsWV=TN_YEa_RolP#j}tkLB-+bT+>-yvR~7(D?@{l>Sh5NkfBi@n#y3CD}DQ z;l=`{I+#nd?0};qYV1r${k^ntf(F!q(c{^tii>=y6?r(cgD+#tA}N#HTVq~te#=~CUU&VsR$W`bY!AQX-23DBVuKqc)oDx3 zRwHrs?VuX4>&-Hd$5yc_OFgL1?0Egdn!126G67qT9a}+}7S#w2)>t6cLo%H9a-sdb zyjt#@4yaY*r_JOV&jEi?Qi-i7YNR67NS-M;kxGdM%8q!vcMQdQ|O`)!V_V zuo>A0mKOQcNK8GEoi#|3H)ZozvWFw@8=F@Lyaf}OMA=!JpJJhlIRC zaF*Hr;)Oon=x9T@8#GVzk6q2i1lxr$L8Hn*xy;x(CIm`eHHULsu_T^82R`Y5rfF_q zmYk%fzf*HJ;VyU-m>zR&Mi=!T)N~Kp*ydxRP{3}lqshu_36^zAZ4!FSLcIfCjh^fk zr*k<*U_Q2ysW6rf{vD=jgBk8%0Gja-EK?WZeBRrl7%f z7B6bFZ^CkKDT=E1nKlT(imer(J#XB7l3MPSMaIs4%dIQwJ3W*oVf0v}ujOB=j}QNo zdR~_G0m0DLe^6cbg**DjEHwrRaOcPT`@xI>%F|-w7tQdf8F^ttxm$j%rMfM5kzep< z>5$Ji++ewZi%2xx~AS+`^JhDD@KRZvzg(G{m%}Ugb%yd z6q)`P@(rIQ4b$pyiL@q7$tf+}OEce~naqo`K(Efx(WJ*LfWnPm9tty4_-XY_xYMZ-H)=;)}2`Q^`1Z=m{U_{Vy~tJ8&TJhvkCj*;3g zfZY;G(|`3*$r|L%JI!I;+kI)Mz@bl74(&#FKJ0sNO;L`7yWP@5T*bT|}FD{kKt1&a(b&^D9#zr$z*8HopheO}*1}MV@lR zg^!E#A+$nh#t!|A3uSE7tadQ_`?I`-c<#7>tpKY$@a9%j=Y|gF$-PH#_7@0F_Bisz z&=1MX&VF9++M(O|(Bo+21&&HkJC!pwzs=L5DaKaW2j+t7EhF`>yj7>wbE+5K&Di=A z$w*EFZ@X1>CluXy!;U2fIqK8FZEqX5)(+ZkZEdn6Xk6W6Co{nYW4!xqV}reeZ^?eB zknm7GAzesF=MxYGyehr1NO$vtX5{IXOJqVCK=mEATWXqWf4D>SZZmcj*+@JMqXP|& zIbnzUo8I^@fc5W6gw=UiA1-F{FUnfOW^zMiS!;-eOywF4vrRC7W&F$w?5VQHSO_<9}@<+ z|K;4F{+B`K*9Erf2y}G65K(it&{^{_A+nqf(7vf8b&{59GHAMivpgc&J zhVXtNrT!y%8Y*-edZ>vs?8#NBgdo(doVABU$KOSq-~N4ED?Z=+5K=U06c zHtwsj`p&pp{uTH~)OkK%!oP2lA5>8PPJc(P1A!Ojki3ot(+R{Q{mm~TAHUbE(onlsP4G>PKB`lYHek_{>PdX1>a?P!R6N%!`yv~mnSXf zL0uy`UetJwsrKDBI&MXJEx0gB@1S(`8!6a*Yq&bCpBMef-!U|_CV7Ke@z~P9Dht^r) zY@&W&EHhXPh1`@iFP1gFF0`7>6f7(*9De8SoSd4!66I3Er~4X2-LdQF+5=kkG;VCl zh)PPdPD3JY9@M(316sExM8tnU*hnYBFqqTChM8JGH9Zy7=rM0%wWtz2dFUhaJ2`cJ zL!YD>PteH!)%Yf&s0fU3;U>GWD++<6Ia$xBz=G~HKhY`KsRV{T)p zEbd-e5{1{DyAZuehnakF%no-NSHBaNzb_eAzhPX>!cLXf-ZqWaMeOXamo*qQpB{L7 zkIMo`pCe`1j2tw!+yXc#@`_Q(WO(_lQMoWg?%oFDy8{eiVzBTL$banfau^D2 zPRPJ@ie#gbG+Jr5r)8n+knpp1_%xUpRqU1k%AJj1kO*CVqrHR^8@}cMlCIGnpE03d zk9p#@&9+%?Ic4%(X*q22>yY0-sp~s+mi|7IU*=^M7FE;Be->O7CBQe#Z`jUFp$c^h z$|kE@zu#1E+76nVIDabpCgScwAG)V&>fFFr)I?mUUO!YX<_0d-`-L5NHaO<1b4yF2 z;qJA4qAD}j_Q=Cy+c#z8z(pCNk38pN34ecsBScb@*>FwK-*>hCy=(8L%GY}d2-yNQ=kdXRcEF_>p)(I%A+E4TExavYjt_~VIQE2$P zv!6T#)ySn`=b33*b>5eGbr!-j?1rU!kzsgmFmCBlPwABI2IJd34aT}2ABh=0;Puv} z5ous0VP%DtWHa~imb`S^8oinK^3f)eH|!;}d+cqaHO;>sTOHQhi-xkX@R69iSoY+n zPkd-UvtNtGKxej3&8K^*Ses3DNXc4nN6Xt2?2bM=xsT+NPn|N>bqu_1tn20vb=jxu z`UV<|rjF z$P`s66I$^GQpFCCI4;co6%}anMAs#DlTdY9v_N_K8?Da8>qn~JD4dt~tJ=0F2KC{FPOow+h^W%}vm|MQtRDsP=7|$7K zbhL`{aQ~o)6uFGC^GJ;SFS=;w>{zm+*oqu%?iN-=SQ7N`nisKi`wAM#JS1${7#FfJ zI7fnJZl51e2q3J;gPKh=wv1>I_Bt4{`V+|&;5>2C9$_ipr__pkGwKVR)Vf4SUyK2qyF_f+vjnwWD#e)pt; zIw4g{FP`nhc2X;0Jk&8;rSv$Q)Ox=8vSn0GD(HPJ_rBJ6U+cXuPg|baroWzk80!uvx=xg=y|#0&te&mztsy_5R#(`mqZ9*W?(HD6g1Q_6l8}PGYqk&cyZ7=B28bUxd2l zspE}dtVo}wzd#&i;m!`s2g4VURfWEC^FlDpiDKP|Rt?SPolGnlVr^`n9LAI}AWrEq z+*9O@!L9w2T$Urnpvp5TuLYpN1aqJ zV^XPgtgn-LSjMMP8|C4o9?&_fb&hC-RCJw_`i)LZ>%^CM2g1fr(#|74&f7DP%PK&q(*e&;vy$C##>yug6pUT`7f^Y7O<5o8_{{>AqohZ+=2Mnd`GdRM!?Ne ziPX_p{RAjG4>9QuFs&@+mj2I}VI8!>kj$N@NvesVWOZ7C*_*l<;))WHZ&P>CoRjj= zwCW6JBBuMxx_VF%P$%XRBz{ujG|(X;2V(_zRI|;Wy)*sq`JCC}E#HwItoI{dvZe--pY4&&{wu_rkMh#rxY5`CwX8+Vi5*$}3OJrSX^Jnek9-&YWuICtdP0Wbyi#s=$VJBt|HP8#$VZ$@y zYL!k?(OOg@kyB0QFzzZJ3#1EJDiIeEbhD_-l6zJIU4PT8WJ_t$h7yrXg~HLdhZVdt zy(q+}kAcc$S##THFM==$aLh1fi`Zb)zjsm|LW}6eCL}+1z{LIF4OU(%nz%LvC5M+wbi7fJzZL88Lg{39~eig`%J;T3WUY`v6(a3re>a)T^Xen+X=60r=cIh#n3&1R{E zMONfpbx_-QP(B^O&eM^}UhEfztN&TagY90{g=uC_8pUz4M+SKU(UsXdXUNGNT`41^?d_yzZy~KK zB}D|d0HEn?Z;5bT(klcw^a{oNPvuvrOjc;h>YRa2B1rS7+C_*21R#$rf>>Jx4($ zUpXK(2`#&Rz&3W?FQsBedl%#}sFy2MqwDDkcII7UvQn+2Z>Nq|0h`{5Y4{rOzS7=T*87qLB5%z5 z8uY$Opsv}0X(BAHsL`Ec6C`P$B)NgFv64Z-({owDcW`9n8gKe}zac=Dr zm0f9r(TYCg*8N(4hd+$%?>9PEarIzNh|c(>&daS~0h!g*0W>5W6MHJA;aCDVAM5>N?J zd3(rK{c6n2ozJHLOfu>@$(}5rp8S3n}{epJ)3cl&ZO4MYRl9Wfcdj;LR^kDWYq{Frd(%A038jpYm zU)ee23>EQ~XVYb|rX^Hn*!U2^*Q?|algU*YMr4DJVyR}H%9Gk7Q%H%>^V+z|$P(pO zOA{1UN=Se#l_-I;>!Gv5t-5F0^Lm~_$fops=8&Oh&dD=9L+o|Wtmhx2^U~oTJXb21 zz8X_U0Om@0#Y7ryL;?Z5*W~tF&iz@SZf~!>Yhjs}XK%kNUWV5Z%2|Ejf=g?p;+!J9 z?cS%b&ws!0|Ni@ZBrk}<9_+b`Z{sH&v0Rt4Vx?M98FzG2q-njeW%1kMn&qyOHc|r= zbc%-kro%z%YApi>y2iKtEVif9sPuFim3f^;WnQOInb&Dl=5-pCd7VaOUZ+u+*J)Jd zbsCkPPQ(3qFYx~(>Xj$7f1m~Akf2d*Y5zdaH*mf3Ts3g^-Jhr*OTJsgNy2IMT3q$1 zvy6L0t96xl2z61BL-@8iqi+k6+(7zjwxD?aV#W6ygN5fuy1=+67#_pPFu8ZVj7dDu zhHekYp7WfsQ5DCXpJ@wy9BZRMD~>vRT~xhk8B5=^agOS66kE^ZN9|DG)7n&x4) zvqU~j1lJY#xfIsBx788QuJIFQ|Aeg$nd<56`LCjAfU>yf&7(2avVTIx^fB_F8`;rU zSa0{dGV)Mzh=wd<_I25ru|V>KVLbY9Sggy4>`m+=xUp+H( zB>U}`b2)7zKOr9O>US)DYs7S$Lq&1-GdHx03Ah&GfF}^D3G`aJwtOtAWu*jS^Kl>7h>sdrhg$3{fwve2$_2W`9nL{EI zzq{n6o0n-@2wtK{h~U*Sgwj$I4kL<=G-vzw*^#l^&$1(jjHIacwC8c6z6*QF2!%@! zZjijNMbgutjr$>bGSA*ej#ZKu)39%fHRK?o*%QeQtj>Emy9yGTE{I6x8AGn1rK!a~ zR1OI&Uyd68K{?o;d^u|T;c}BD5Vr=6EpeG{eMhYR8GJVI0t){Y6AH%6Uf{79`5Eob zTyX$G;7*HAiZ}s@6U3{C8vxJOKbY(O^oY21uT%KQdW2*uvH766&+~WCHcGL#1%*2< zo9ZDQwA5U5_O@CZtbQkvg074w)L@)Y3*+9d-Qt&q2E6(>UPL9$)nFP()p$NeiHl4< z9L`z1iDvwY1F-Zl8DI8Ck3wJul8Yfo+X#&UL>#o0cXs`H^Z4OmQ z0e6e{lyks#?+IOMeW zaeFACv_)Cun44fLDDEky;`sRQpiFiNzPaL1X=omwG2cTfD>mxcCvxoTHVBC@f{ev7 zq7blAh9OhJwRG;XN_0Y-9@oYUUr@->6LhlLHkKVs7|Xy994*BDvmVn_qh&34Tm!Fh z9y%pU?K9f102SN6gQX=NT4U@KN0lNRpTegyZ(htnan5d5ewNO}0`(JAtq>;<9@-a7 z3^bK8676^5sL@_bUH@$i zpcw5did9y;VAePI-_b}U?qT9=+ef$zh*n0K1Y4?CQcPz#8q>|8%>c_T``vV2IpL{{e=i8X$Wg~ zs8B=EOp@YMk+iyEx~G0a(URh!*O?kCFAJphg*S(`(1UiBjbu3q;>4Nc(2GuE8HcAu z-ZbLBXV9|f;Wy_lt|VAUEw0R?92tV3k>7jf4uNbQ>YFvxEqt~~6g(96V-m_DE|4zA zl3**ZFtnRB%<~usu(O$W*aFKc!&@|Z`w!>$RdT$d)et-p@uP8Ca$nXzlplzk6gd1I zl7S$n$oVMX6ITe^)021|N`lr}XeWuG$0(yuJZe+Tt9|4@Sz9AU_B_U#A0OZedl=~7 zmmI5T{a69{YxQvVXZ?bq0yhmS=}q87njmT(UjGGPu_Ag506Dw$_kip{y@LvTZA5<(b@c7B>YO%)pNhJ- z5;?NZ*m+qAQC%X>s_#p!IBID-?%yhy1&aY&a!l{zM~mQPN=uTNQY+GDY~3q~$#;v5 zt>Wbh*axM2?ugkp996^UF}^8h;cARYP3N=rdN+1|`mjGev)joZ40*CGAwwEV+=e2- zWFhARG-mMuZNDnChLg1h-w3nsJ=6^r3|@hd%QpJqA#mcVP$NbNAystPTJz6h4{7}3 zrM@5*k}@JQ5DA0Fz>WzPU_=^3)oF_mIKE&`L( zLa1k!Lg6>*u6b@9d}7FguG=GyJe_7cSNR-OA)dMQbU1_WC@fK*nkJ zj%Om7q$?C~hlB}OEesFc_QQ%C{76@_J7tjhF7+XK1F-!&9Fm#tAX$Cm{e$Mr{X>UX zZQU>(;F~LR@Fs9b_}znY$Pj9K%SUG-(mv#MpR8XnYteG}K|K>h>pThkt4ex#HTgaS zaFfibwm?ySKRGP`g%?!lCg7IGDw?g8@ynVpl5V=lyL91l;2n2BPlIxDUi*pPo7pu~ z#9WB8JIl-+fM0jbqP{FXNw0zDff6%<0d2@K;vH_3xQDc46*5|;iL?GwCeaK24l;0M z8ZYEg<23&=rfe^Nw(otrexKerX5>K2bdG#e{g!ZvBL7o;r(skrb-IvCt@ourlfVGe z->b6=c~Y|j$pR*#iICkjx#1E_Kjh9Up%JfC_<$9DioIzO7n`WZ{XX3kP+h|_>X^>i zxwNI0R9d)=IZG<tkrIN*iULVd@&MNW^!?ylMWkSe7!}AyXb)fNc`JQwrsg+03{#SB`txrGQ z^f_GZ@XPb3rQPMf^An3Av6|iV4Uyf*W2&MR$V(K7Hd`G7*b+aqkJPu_uNUi}OWH6V8#I7o zgHhLoKdm);qQO~&kTO)%gtFum09*(-iE;M8Artwh^9c~!KlCM$eK-$F&iManS4r4+ z{A1&|71`=^OnefB%?w(4dvRMl9oawR3Q}rPbLJBx`3+kuYF75!S_f z($-=|!EI6>T|yerA0avkJ1R;fJ!ISS5q}K_sp{h*PRJoBmVXGQ_V#^CPqu!G$L;eG zu$=M`jg?jtQr2!Q#Vp%izLbbjs`MpKml#`y$!s7p*7`B7A7K45gVRRevM}!f zo~SAfiMOn*%6jx_kqiZB14sBshKx^INQK0jC;Aq-bBcxiuaF!`@Lv@w@jn~&9}~D2 z7Q_;`56{xI#8*`hg2j4(q293z_`VVoAr}tpJi;XLdZP1f)RRMDJ5M#6 zK=Z!S&TIuy?{1ow>m{+RKTjKc)Bgf>#I`l$B! z&AeEGHFWfCe^K9RjrzuX3FK;>5Z1a;OehEpUQNAUyv75%_ zfNVYoIBy!?sL#qDv(i&aOz~Bd*SPx4l@hWdI@C?Cr=>k(?sq{Y2qP9S+?#PXfi~jh zh1eZ)>)6vnk`hFtg!blbTj4bR?RN+#MKkgaq^mpX)K_SxDSM<>lp`MZC5kP4bcu2X z%hF=QU>)bXyX_8(Rn1 zCs1~2#d24khO@_Ucp-_&ORrw2m1SSx1B=?{&T0?%+{=oLxgNeHw4?AXV<@!t;}Gbn z0o=t!TwHJqMEO>Dk+~j%K+t(d!GfePM)s}e9sYFy`tYRD-bn_L6#TsbO{;0#!lK;L zt<`Rx55c#OQb9CYv^s#sP0Dn}!r1ywjq-jgsRBt2t?KR%A z&>x9MSc$THZ;1{?@DZBexiWKk0J^#!{!Sdg>#~HG4>?qvKu0H$0`I?wMAPZ%*QAbk zJA*tYkDO83c}liL#?x2%v?6Y=Zk))02^sjwG$qrXqlPz%yxz_fuV_6&5@fPxhV=i{ zaCF0ed^p~~WgH{%$Wddhs-YMfk>>eed?Y8xJ34eK@E2*ItUFLM=z_ zPQvGOyn()lLvG11!`%&0xe=s~mZ4!!`}_M((+ujGN;$sd=pulQM9&ojUFE-slq=g# zG{}0(RpzzhoA#zj)-23*P#+y|`IP2%j%2_7s^2&K6r4Z>_v7fGBH`S&eoBZEoSSjy z1-vCM{qqHSbDYhGY>v{$1D>{63!1k3%@Sko{1EIV_&gE=?_W|aJ~SE>+OMglUBT=Lu=)?RU1;E{iV@vSzK49Pxa1!&wp2rgjLP}A zJs@DiG%;n;TP}+e7vlylkB9rT{p2zjsR|ajMAr8Y1)1anOB{QmVUcrH1y1^`AaSmH zE3_bghU+0zBd=wpIgfC`t{Lt3=q1KuGOpfgNF8nZTmvj+(`R8Xjm@3NwQ)SDJ!E)B zhjJBk1=kO)ei;VL`Eh7aaALPyHewTLr^#^ya{Zv@bWjiwM$#*kTuy8=k`eRS4k_$@ z`7a(rwL(ETMiDEzGlg1DyOuo z=GRDx7y(S2Asea4{yF%e3ZZy@WL{6g%dO)8#Q!!HPSfc^j%!s3$VYqeCCQhy)WRAW z@tVR-N@ubpd9@1E(4%Ze?jGuIIzJleYnm+qk3rdCk>{d@HAu94K0!;tiTc;0sh5nc zVl~7{5mztJ(0o+v+{hEF?~^hsncEE^@jOkz1^U=(@$fN>->EYBQdl;+1cjF8DFL?t z$Y9`{-}3Bxi&Wqf`C$n^Bi{ATrD=(@UuFSK)_Y{^rAQNW=;S zxO&EaG+%&W3Do>JTIe=v^2K0ErWEUr)z_7fql;ALyO756LqW`z+Z_0VG$b_+Zf)dP0_9SYsoo0CN61VhUag3DhnLT*I z?;Da(CL~iSf*6l{f~fEV!iB#t!&Qi1)YDL{Zlm zTBsHOcG$yplA1%ISokeoZU|LkYj@}AEjUS^(N4{(QwuAR3eNQ(vA4(MLNmOHfFiF? z$LbIActRjgbQtUC&zOGSr5cVi+B6u?-YsB^WJJf|ph1MY$ONKDr0TeOLCYaO65edP zj1Xks!BfsFAugiNd`Le%q9mHmZSp-yvpUb1(yr#1LdsLI5>vfpsw~71c5s6}hfMXX zTtZf{*qu)x%2atg!JSv8ds$Af%)OSt)(wamlnFrB8>4MZN&r! zRBgCdF5e-f5l>tW=VHrQ_MTi;hC-$J7joAV@aH5DsVOKTPNf%6WxLb9_-Md4sg!li z8OgC3x1WcOm#m8(!3Bp%8$uIobUVAZGuCHtwAN)MeN~DCp;Q5J7 z~;Q@D5Vk#U1W{qjW#>bKF3Em}wpAXrB`o=mt%&9<( zf?Hm9=39H?C*1jUkaZ;6DB2Zd@LWUl~W!-)pkax-*37uQTZ`ckrJ zoRwN(?nLdVdYS!yNI;74X|`1Wu9$o84)_n&U$G@)+`lO^cfTIUjFpNBK9=O7u9vI@ z(V&qMiA}G{y@NEtVOEt;9bHzaQs9mzj@MuXIoWS-q@Z?ni@W!}L<(LqyQz#h@f?4* z7ge$?QD023w$K1H80|ee9<959fF2lbC|$2UW5OL#XVH5EidVE^$V;rl2X2sd@T6e) zyrAha#nJKZ?=#cgzB1MymB3??MWZE%T*dGT0}ZH(Vi~lmn#X$?Nm*{FZT^zBgGJp% zP>_RbJK9>M!B{aAS1hOPCehRSp2h+kelz?d%z|X)kexSWq*=`9Q-!^mUQ! z)9aTO+Qdgt+Wh4IU4s@L$%SQPPZH>EgqJmL+ z{Otk1EQr>q_4JSV$5^6TV4UWCK(7ojka)QFkkh1#z zr{IZ3vY&X?&w;<9grjIx06O$Emr>zxVQj@T4<76}v&(QjM}lACF8mrpacu0!;3n2%=c@Ki9A=7I~)mJam^wW8r6{vv~M0L2J^b zV4BU%h%7@)-zwD2@tiqPiXWgbD<-}f9K?EOv8%Mj9ro^Q%YVX74i`23BSRI$U=m#7 zfhJAwTWH^MwhR}Ln7aj?w?T#`Hz;6yZ*qg8etwagKWfF1QfaSKkPW6B|4nwQY*X7! zNn65yRu&L6JLiYOF13`R1^*tdeyV?T;Mc-G2n7KUOq(`T(FZt;X_5U#e7{o!rRS~_ z#HANx#MB-gklq0pa)k!iJ{d2={OGj(eKFCP4|46!QDPg$h&mlK?yg~cj3h`~=)Xn> zw7|3-Rq&ayWdHm(LTQ^S)Ur5aOZtJyTV^v!ZfnJYy0}&xdYR-(9hkdZ^V{spTK?7G zUd?@$sLu3X%w64lz%Lxko{L_Kz#<&X{t6Pa8Uhjz4=0FWbFaz8-79iS-8nx}1Iyg< zZ)k?5AWx(7D}sPc#OlvYxYxcHs~2h$fYa?IXA!h5R_w98rwz@n_0>7|RK5pGp%)#y zVvEnzs7I$YX0i+6e-->LvPRRIxLSbMkOfm*y<1LC)DNgP4$A#w`UbWm zqsKH`RPK7~{uKLFW3?vGI}gaV)q;s9l|Z5i6JGRQfvtBge^0OJ6Z8@3G~8=tEa9#M z+BQT^d>79w;u-sjU0(z~2O#x`6Jv&BzNaxNJ9Htn)rL8O2!Bm>T^eO6?obvkT@ zZ+Ipt9O=K6vlV1P&Jf;F2cup=FlryS0ZktLX#Yky<+Gc*#NNT#89u3^0kK%z9E_@o z-E!x4+`UfRfL2u`vV7__+P5iJ}=yAt94Xn4Pz(}nd1K7o&MhlLo3 z%y3VH7=Wc2F$n1+^8_8~_H&(4|9f2B_ftIL*`h6Y6tAjKO|Z_*p?M61P>fQ%JdLe# zb%MlBb~&p;upu=#BO30{Nfe~C)Quc^`=jAkkQ-pEEq%U4*rxLD{FJ)%`1xxzy)GAjnJ zRwqu{ma;3eC*KuF=uyX#uNO6?Bxq2EPKg?s7E|yav*8r-LpM@i(=H?#^rDeUG`yZ0_oJU0WVmo`%@=()$ z^qB&Czm9~sTEMj_cKvrst8+?j+B`~ZY*Ybr9+^;_YeotE`Z3sYMbh^fU~+GObTxNWqIpz-lMGmC_(m`l)h%%{RM6Up@7y$^$$9PGjDqDU3doL z2j`JPM5&D2XKbFK%Pp&{MpBfUB7+)~n)iH0Zol!Og`GrsLH!dCr-d-vY+C<#UVce3 z&>|c8rIM-H&gQ4eXwbIm!7FZo`PvGw!35q&a1 z6))y|0jA%3(@x#O1cBtAjVi*jbbLt+!6b!X!R7!vAE}{2+$q#cw)l!9aEt*9BhrK` zO1kya1k>3POE<=ScV~0u%r~JL{K4ZBGNSLbdDT=)gNxkxFH;GCwQ>-=f)R%x-|$%O zNMxelNh1us`Jxi?3JxXdUWz}kMX*`EoYJ#g?_M6US70e{r67c<6 z3Km;OtTh6!K%ig0D zp7i_wG2qLdpb+v&L$0e$Zuj4Av~%}qHv^>RWkG>~Or05sWA~Tb#eN#uaEXq@mcbl_ zlaWGVJg0oV>~JYls~MUBB|=T1qH9v`IFMcLxOP%M({t3#7?aH?n!({8t|`HaCZKT9 zGPMH3H8yg{2{B4XM71FtRWSSc0q}{qI~tmD-sCw*9q;exC?$P8LP63TPs8J@))K_T z$(f{c-mmO+Lb7i08r&rryzN1tZ$)E|Y5>TMajG0XEp%XSC_%FD4whJ{o}T zivY~^T22(D1d-rrDszjk<6Z9%$+Rp}(GvAM7utXF4L5MMH1S!1+uu4GT`HJcp<*+CvBZw?7SV2bvmRkSJ|jfZA$f zto|u2>zDQ!k6K?Wt_ggx@l)D2T6&vDZ}~3NSiTe8kh)g}%pJ}#Zd094JBztF3QqD6 zsZ;zpxX0vg{M{V9y{uW(P4@MBp`2^_N2B3a zlj#z@pww+X%s5RwBwOu~VbW`UQYM@lBIdcSnN!`#v0@LA<80|F!KCCqG*P+=NM&r1 z%RL0K^6P;(G)QX&kbd}f$A|ZLkacU3Ydo;hm`p;bLWQYK&MfwI|KKh5X667Iz(JwE zM}hbfeB_Puv#Ug7pq>ykPqvi!8ZR`H?-w^;0Q$WlRE&`SndajqykT(|p3Wc6W*Jg! z_vGaxf+#YP|Z1|NPRp^jLNXUr_%lziVskMi6oPZi}n zX$-9w60}b2G$@{>%CzfX8s3Y)C?5~Vq(B(QyT;PyQuFOnRjpV_?l#HQaFz=&Wx3)Q=r-~M zR_p0Ts>@oT9E!3sESie0=doI`BFLsHDje%_r4J$AZ0bm(QnXg$5o$#86L?n%7hB0h zz=2@)iAUwK-uj#x z!fND<{6SxyDb`xBq}KZd2&_xLm(DS;E~&NEGuDDS%ZqGb6&I3PCkxH(Drg>fK`Ac= zOI#=Q5R6@Q+V{VTm&?U}68?B`CC?z9p733DR(AUdeSvf1H|ac9zpPTNzy&K&%Z=Nr zu9lK3xefJhy7D@m(oxi#tL~4vTG~Cc&|xK@VM(9KE}(fX9*srb$=}yi$2}}aYZxK* z(lP|EPTl1)^f~}ZOLew$Wv#P>t6AP?JlnZaQZ9FvEEj$@u72rlg{I1;@}+LzW`OGh zGY}W6vT8rhhLBPtwFQ`QCbW?mQ#ekEK=;+`Uy-lhOTS8$>~&K7uWQcMdT*7uiJwe? zN9$=tqST^>ttJxwC&c&}3y-V5ZQQ>R5LKJL6pr{F(S#;&TybJvoY)K0+enY-&tzAk zwb7%4T&4NM_Xpwn*Me;M__+kq@t0)mYCINxk{hgIVR+IbllHga-k})YBF-GqG3gr6+sPV!ZiM}%825{sekg=4FIxyfVYRsj zu%nD!iafLADtP3eQ#Vhg1}P2#)PU%+Lpkd7?MOoLA>G=1BbbzZrzFqAA)eHD>@O!; zBoS}Dq76sx+>of4fUfvT9!If~2a+XD3-@{pH164>ja?ULGkZrv1P>9kWzGfO-NP6F zUL5*IQRyUGt9*?!y6UPJoDe}C_l^E_`S5k%t?))D)6OTB(i^=@N2V2XuNDFXRXhBr zCNr1GOlfvn8xz39tHY~BJfHh0=YaC0YvoDTtS+Ol-JfsdQ4rSky~njzif^r0D$~2g zPWKqhw=esZf2ND&0aeRS1BlUy>w4YNJ24Mk$CU8>2u}WL#)tfM^-Z=Whuv$4?X;uG|v{ORl ztJP%zBs!Z)GYZy`=WbN5ZWnr&4OTw>|6iZX_lrW7^eh+&;l zscvQxHLTNUVgkscFvmtpe*eWLhrVPTDBDRWE*j#AaAk^FxztB zPNior5RhjpekMCSTA}al;RNX8*Kx3`TloIEfxC#DXVPWalk9}9D1tU45zS*eFBk$6 z?h1Q~|9gUi2+oZGXh#H^!J11eo-9IlH3a+X@C~^epb{Td`u{tYDH$ybNL#rs6IQQ{ zwGGN=b&r!koSUStUi;z=fPy$b%0Jb9+x?6*f!34O;k&y6G-*bTH2*u3W}!7%6qU`d z#E?3xwfMnl@!^xA3L*D>)kQc7l(-L?US_#bo{UK;L-Z7*^%H z4I-=YOyl*i#7MPZmRW%YT5h_l5^s zJv`J*SJgdn=SDp8yP^P_&5G(sy~vfG`SC(>@FOxsg;`i-y~{zES{C|0xx>G*gN}}i zW`C8;>ksUwPH#WKgje9%@*nIdFWl=!9F}sO(w6Keewn8EQQ5KZ&j<>+G=$o}V!l67 z!?vy{$!{@^^-`GeS~S+oQf@6}?`)A9;IRh4Tt+L0zDHb*8R4$7cqd!cDdy)tj4gLa zBC(YCL`TJw^P7AFjOB8+C;nBR?V7kNkGQKnJAfnS!s-tk?0Gf(l=C6^`f52GIKx)0 z!%qV_ch5$tsiu8)R^d3SQu^S)OP@oH?Gvx(GRvk4r=<*1&q07k%DZS&#R`MF0lUA8 zH*0|w=Zw^2x;bw=p4Km}&XOojOI@t451*f8<5x-)G$qjqx zSzHo1OaG*p|DeA=UVkjXuQs`xe6S&Q{j=C}`L#LBVb907$Vgvi6iFM)x{0D7Kn?CV zLv}-*V;S$ccS;?p@Szeq8v_(Znr)VIv2%T3r~@K~G8`kifYL_4)y<)HMv0L;fr%`W z{T2}f2y*&R4WHoTOwov1ixY5f}V95<}=;UO7Q&wKo)sY=h4?aS}r#p`?UVmu;S7z3lWkBa>a)F|;* z4USjZ?uu&e=Q5}CABF;)nR0l&N_tY;&!O-yG_Gd_-odD^dH)aCYq>F1KU7$h0 zt05sEFgEW$Gxx?da@NTz+x5pUcNcn+S?0xJaXjHyD%1dO2q2JF(EI_+!H~HfkHSbt ze!6UFeiFurryHE&xc{K-e0CjAM0Z(ef^L7qfJ^aG~3VYV!6Gt;PUer z-mFziSt9bXvE`@GR&uI@N__SgnqgcgCPgI7jWS>N#@atbACQ#FL>#XWok~!I0sOa+ z)?wc_oxb3+Fa>wJ;E?wdUz<9jsP&Sk%Z(r0L!z*U?s=Eo!TGV}&g@+z_z&bx#8ipC z+)-a+P*))uq;7*u@czl_GX(A|q!i#lrcgZ|-lG|{s5D7(mRg>9y*)NEeOZky3 z>=J(uQZq;7DEn25x2T2q4@ore7r71|NUs~v#`$$w(U(h{R!}$y#@bc4kO_etjPGm02xjlH==*Ap^PpcI#a&T&;vT7s`{v8IagMB z)i%9W!NN4IPrg>%c#Zs7kbKSGcv13nQRB?EcSRV~!=zKklnG23bmKM5&_2_VsY>`| znr5un{)k<&A>u5VQ>Z{zs%QONFQ?^G&XS5LIjF3e(CsswC1r(FPYl(4p(j6y;yA~@ z)u4s^d+rC`b8r4xNdM0~-=WSqv>`{DcAuRZbQ%Bfee`m9$Ov%b$2aG~cj7&QXvHSI z<*m3P{)m{e1lMTH6~&=C1-BTo)Vrb=3+@)*tV?~!j6^FNyM~76T)GhxV#_Bi_W|E@ z&g9JdXLG~CzFL01_+@SI3KHViMpvAJr@#d(?|&V4Fa1ncfKSiTZ6;rtfurz46f|}X z$JAB)9>@{YH0PqVvCb`)U$W~zVTJioCqbP`!a*2_=Rl0&%!8PebNe_v?3>nuv&J4u?^BCI=`Q3ctD?DH?|7a z7u=SARU#ktKhx#%{8vm}?Tzl6GP-a6iP70EzD@z(qFnh1gWP_f(SE49BitcMr}#eH z5{zBhSmZa&zc@2ui64;FVdUnoJ{~CZG4Nii`luC_ABcStZ)F)gzgkDE@WJqbZ1W|Y z5#G;|5=k@bpjUoUu9q&{WHGm5S&F3`bXd~Q`5?CEGtnP% ztrtHdNI>dmW=x73W4Sb$7gmsoGYu$V?8H=fz;w-kAaGw&e%OPEI#Y)qO*|=~X@RAP z51huQ`JtYP{EzsMY%Qf|O)VVJEl3m-DD0?5do}^NM7P`?4^_15r46far5C z$A3}4SzDaI`wQ~~F|0&bSpEUc#vG@gmQQPWiXSw@>h?t(q6qW2jQwzy8Q$l)3tIkh zzR$J%W7Wr%7fhYo7a20P$glkwJ7s3SW&C&oic^xlXB1jb9vNB5kfeb3(VFEKC+-`~ zVasI}ZU6F%UtEIE{Ny#l+(o_NEPjETqrF#*-F*_Ro|WnD+M**VG*&f$Hgfk#W_&sx zxx}H!6bjTWt6t-4{PNpe$jbd>E2kCT6+l|NX4;qZa~_eCk)CFLpB#1~-OO+N z?7|sUesH=W8qUh^A=U0aTRNCL3%3*`5@B zCc#qIlyG|%at$}G<9H3{BNJh^V!u z!HLE({%w>Bc%#ejFmy%dBYVr4+_apwgii1f9#)c8^5+rRZSs6b=jk88L+p%}%MDmt z+CsD?UMf3zF?L>qTIp%rbEsQ}^UcNh-XLEb5a*jnXJZNR6jtPD>l>n0<98#<_%QBn zq9$duypNu0S*5sGM7gnGpYR#tV7MLUnXlp2vx%t*N|Ob79W# z7h+Jlt~El$b?XS2tMTqFL#e$aXsW-i2#@EE;H6}_w+GD3gx~v7f!*Rl6nTqZEx<1| z8pN_4-ft%FsKPK-)%ew@GUu7ev0Nh>`)H-AVGfy`pXu^DpyU1w+l0PT4>IsfZo1QQ zRXb?p8@^epaS5~P_43dW>qcy81P!e!!4ZSsW74J3i1BNqR6`X$j_PSaY`$@Ch94Ce zQBc~$Z2uW*6g}XuK^Sym#Ayl+Ptz6EeunBquTraISsvR4NcvC9ub}$O@PXuOUvdLK za@;hZZeU+I4;)L^?$@Qp!X2JZksei<6-Gd0Z4zlORRGJ;kI_|o5F-F&2X7Uy;@j%p zznp%E50Uj#dgiKW4lMl=fX1fAyPNJE(J7%vWBWrPxVH!JTF z<|g*?FJjdPRM>4!Y-xWB?}S(Ct6}GO+Ys>iY6== z1Y&Yf>f~*@1viY${bD(4S&h;a3C`Fx4&`JKqwIjV>-l5g_9Fa>kQsisil5OMU{Z6r z?kmdA>Ui{bm-ex0h(J!4jzgm|oW}{25#m2>s-L_>buO}oB6ah-z8PaFKe)W1j@~>+ ze4LXpKE4-KXva2E6oRSw>JNG3OSnYAAO9E)6pP@sZM8;RCde6wu z7Zl#zOrl@*5! z9=KUyP(7l0vtRfhNXy5YusRE})Ai>G#VYQKRtdsOa7UcI133r^LSi~Ta%RD@bs!Jx z>CV?nXzW=WbeiUfTbZ+1yvk4p)g;`1+Dk(iwqy~|X0dTA_>lrUux_eO^V2t$%Hoey zCPTxqQLjg={&u$YLflUG*?xYZV9xgiH5!uZKL)SUzP`-R275iF-_j@{(XC&{(FvuN zrmP8nj~4GI^~u^5_u7EU#0YR4EJYiysKJhZaoA)InHBMvJf}h{T!$`f(-{^uHD~!}h-ppjnoN2}uTrTpr(&FK;wm&T3vGVFDM_(e(9Ium9*-n{8Z$Av_Fs6uRur4Wp3WF zqYlQ{NVs_?xD_amukFQL5#$ub{M?lWG=7_}4g{W-AHw@Q_b5)4-{DgJx5{Wps&Od) zm=pNlI9v%Zks(ibu+-~afaTEtVc-G*NSlshG1dP|+uO%SRi63(lgtDL6F5<0O>HXE zb$)B~(3%?Cf`c`O%)l9#AwfYb!pvS0>)b70x>D8y~iI%Z{DJPOiW` ztrku2Cs7L!dvfNfI)+rnl^Yxbrep;qzvfI9OKEqLpBnFH3i_cuzF@UeJ?w@vae=UMXT98cOnNEi6dVWT zY3!19Ew{e6T)yF_y8Yv`pEm49L}4f|@);X1_%8OehP#Yuk#PN;f-t!#**ITo)Qsfr z=O`tA6?y6TWt2-z2e2sPgC->|x|MQN=Z@=>!`zcG%M{FHTJr_*Eudrgj0ef z(6cU+1Xy<#^Px3Yu(#Jh1QwR+NC5evBWo|_o$2I+aoxo*nx$ZY%KD4lbE&fhu$Lx9 zrkc;Av625YmT}e#;Oxz#MS+Jl`~X!+!twAH`v=U4T1iS3>bS9?Q5&xowJ5N^gJxDA zI#=G(ndOe+W3sypT+BMUV$25Rej}isrtmB{kThS=t5xSACN&g9?9=@P(&z!K;aIOQ zIpEVlPh11rBr%(^*uis6jr;#usz9M5Ah$NYEtZW9nAzy$NK9g|Vm@GPy|H!C8Sf2(zqIBe=yI74k+FG18s+`GcsuK%Kcz3I@YxF97nQ zo^;h(nU9nW?iwh@=h(7-%N|YM+4Jg1h?0lxDhqn}Fk3sET&SGA0BoNsqbgTVCX-uL zCK1#jka0ebSkYLTUk_0YG9kr>%Ohaj2v%tLX~9h|DaVLIb)?Z1#L-bz2g@SOiQ9Ws zIlup|5bDM-7ERwO6Px^+YH3Cki>x1O*3ig)VdJa1))!6qunHm}Gd*w!Mn3K$oD$@` zrpcOxR||yl2qn=car*$Dr3S6+Q!7=h?EUVPKlUS;5-xP~+(8`om>R@bqBZVKK^L5# z22*@VU@_LuIyuVR@pDDZ**0Fmd5v`&wH={0u*pLGl*Um)I!2}~31f)h$gt~|vhgyU z$OZ~p*{ar{OmQOZM8qlkWoDgN2MN%|?2iB|0=KZ+FK6CV%zm4hEP_V#)T^-SJseS; zUVcXT5yDSk)!6WJE`p``0@@~C#>bWbv@xe9e+%w|vCj?>QQ?KgLjE2=th5jGiwq>b z+vmfG@$xg1a3PL&Zid4}?_*#S(vXLSkZ%>82C+rUW z5Mr^nCk$f$`;4(vjz)t(lG?H^Rp(@V<=mFVyuDGPZDm^$v(%H?Mu`^^v+rI?A=2U0 z>JZYM_+Jq*?WP&Rl}e>`6(mA;kIhDPic*(n5R|c~j34@qBozc%MrktJAvz z-0T{FMU1tP>bHihfsS-6ZXa&(zDd9#O=ljE+-N=zwl$uQ-cZ{!8_xEI{NYx#5GSQ; z5Ab-@eoO{CZojH+Cos)XGqHrRIuh1f?IByqf|cxCVvogNfS{lG^@Sr|1Kg3GjRJxK zd=ygZj5S1!PzL~`iY~<17AEclv{jiYo?|5}!n);cn7cE64YwO(JEiAXFz_cub?LXpp*2Xk z9V2}Saw4q!y`{gv(0F8 z#mRZUrwhX-*GtG+58RYBiM35{hV36&-;DEA(MAHy==h?@v7z*uafI#rZ9go6ep=h{ zk_4fxFXg%ED{~Kq(!xNfyQt=(sAs$+PsZ@^pHg*c6qaO3!L(!d05#hRpjh9}l$04JB~smA$N^4UavP;EyD48_Y1Ip6wFH!O*2*OGP8q&aQ)CqCSEHX%c_&@! ze$b9jCu0Qb$OWbF_@C1Ec#iZdGT$1Jk@sYNBDzUM)`=$Y7q%qX6)vuqwX1M_LdA2N z5l|yRB?mI!{DCw?HlxqWW)vOWjJBM$9cBBhHL~mlhQ+XN4jA?WrTrI5qxvVRzvpG2 zp$mzUrVn6;3N==({S3Hy71#mLa3-@D^#Jp(el-k8^tllRq>)Wsf}|)n#1TO9Ud4a- z9u?tLH9_Q80dpS7?uM{YE<_pJrK~~KEaj6xR|Yb-STf_|f}$(Bt5pj_H$KaHtuK+` z%x{I5aAdFBfN~aWS+?FrA(8l{4V0Rf?omq@}qPyP<8?Z z;{h3kNS0Va67@E{gJ?MtXQ7MeK7LG17eHC_(!CQg;?#w8>gj0sg7 zZtQ0(POsHO(BI5wi$)y;C0YHr(d;p7y4uMJgKR+Y6@0oyg({ zWUDeY&Gk=eQ?3C}i#r%06YVHuoKdLaY$`j=77Av_Dj4BqGIk6?99csKVf8P`!Bgzk zM3QG0C~lV?n-BMotozZod>$OJ?ERS^-;(XyT}(abt-^ewm|S(SN~L(}?)kQxM^QAF zT?W|Z!~*DK(PKQ#+Hh(1xl1Z)xmzzwidlyMzgJZ)OSFZKTfYe~W|>}mGlV7O*eUx| zibTL(f&&){_RNR#s8C`79!MG0@dy`Am?yJDuEq)efH8oE#PvhKWqBEn1#MX;M}UL? z@6@8O6>jS+Jd3ucHb3Un!ep|Fie1mIY+xU809&CPz)nUG2mpI$eZY)R3m#y{D-UPA z>-0Aa?>^kb?31D9#x=7-(~BDCiB2wbD%%?EM@^Xz7f4-I<1&{^TU?B5=#JNv8b7(jE>qH~bQyxhw?K`qBmxK3`-Ylq%TkjsHZaic)5S#7k5a3gh_M zV;^T#m&feYAVGFZrwXC7cgwUJtM7tZ5uW7Md=`9nZ!953J+B;e#tANX3#(bQmt*K3 znTUNgcmWg%134=?oVHuHV(_+8l^uG=RxuWPQT?X$R`1JPN8deu^u}@T2}*5%AHS1i zJ^0{1M1`bkDtLoSL?q|0wqxxjb=_~PCW>!z9X2w6Mu+OWt+bq@PNCDwQx7rwC5QqF z1&N%KkN~o6z!wNkl9g%6>AX=?v@W!crQ_TsxfvRl?(B~LUGb^+(cr!--`{nSJk()2 z7ft5@3;?JANk2-vz_-eh{7r+50zHpfiZQ^FXm@CHVb;@)2!Nf2RTAv~8w^flDLt%C zE|RafpUr*5CJu7kG@M9{ z3s*uoC`}%(<8To)q&7=K#0SR2cMNr->-?{X2ozq}hYHyrpxdeq|M0rB;W(j%!8lnD z%SW;rb2{dy|4U-~91@~!?81W0{&ysE{Y~=7q0HrTWmiyZxqp04%WnVXS3D++^&>)` z#2fq>F-y@w#Rg)Wvf>BU@~u>}EZfk~U|&&T*{rF+Ne1M5H7MoIl8 zgsW_q#o{4CnSMIi+N+rZsL7_{C&gay@T=Uh4@v|bUe`AMZ#f0YAyg+i?cw7b)WKwJ zlFRW$c&^LYI?gcA(0=yHS)yNEDf&3+v}GfZZnjIf7UiTSE^D<+K-D{{Yt$Z-Mr)87Ye?~UFzX&rY7luamtRuh?o&)SpZP0bQK_&aVRq= z0Gz-J(9J#qei-(r>9@zx%c~~rS;s?R=i3h%_M^QV5>=e*1ewL9yl4GsoEtrjR}K^8 zLfuWjS-d{&@sxNn8}5>s5I51YX1~On{o{gQoO z>wZgrgLpD+hW-;7bu-b;((X_JWe)Kvd6M+D)}wNhWEf>zBi2vkz2vd$y#&`8htoHe z)FREwdasnyw2rAP4J42pF&YAyZ$RNC75LqOvv$SNI4YwCxh5skR6LaBl-W0PyCKdJ zC{W$|#iRFguFq#V!XIC+-ZvzD_#w0eIXNiPI-5BQ^M}@ZxI_8nUIJ-vxQOJ8#k4Ba z*>Ikl^QrQ1{{&(X0;qrNkDP~!6)3of(yHuLzkyLjSK?9_;^K1`@gz8 zEiOUs6)CtsxIDe|o!pfRHLu=r{BZAHE`a5z0n*y*p6%D#lguT5>&*dGm)djTVrrk%{|Rd;;u4gl?~C8*ajK zQy6NsUm~t-f4=<^pQa|;sEKr;sxIZyky2MFtAgWRZW|V*$!8V1QNHmWoRce(%m7o| z^e2uo6W6IBPBwawVq8%Z-A2~c)wRLFewqESb;A5amf{s&t1qcAY#4LbBbUP%hrf{T z+f`*8ZsQQ5nhSiJjdLq72X1cS=1A2y1lP&4syk`NYPrD$`1h4Waiz7Y3zrE^GoGWd zvdb*B-7XgTS3RE#$eLyRn7k~d$zW7T2p{s>ssYF~he4sEUQ)~}?1MW9WvJ36+x>l$ z#dmyf^1;>l0FUjTN!P+wp=-;u$CziBWz;onA-HX##z(9`?&;-&ERL)l*3iSjQf#iB zGFhmRjJx8WWvbu^^qXz+xQq^gtL*wBVNDk^N<02h_M@MPcqc}wjinsOmp|A-f{l2I zSS8v}H&QA-Ggb665s>B(LDlvZi{T5sWIT{H3cdb`>`hVPoixA#wLr?}!z^ zer$jSSvRiGb}Xo^vu<4JnzyVQSJjsS&#b>tg;G3%j?6;{*NTjW@GIn^ej0sIK_f@n zD!MF|u_yB`jzHO~S@jl7t-5oVJN-2fXVHl=9c5QlZm4n>y^O1WH4`t<+M;>rx{D-m ze7vZ3xK*^Q^9)i)y_x-P|D@3h$e6(4l}M7oC#0+}F2p#EJu6+X1*`2;;E+*~Up|TI z1TG&U|5+4dB#~v&7b7oEKaW43CIC=9^s~Xb-#DG8dd@$lYtkOOsc#t1mOev8fd`MebFwNW z1qN`~Vp%7pqPq#W`Bw}Z5$WW)Zk>kRm+@0NQk+1r9u_i$XQ#H|adm(u^idAv+osPc znpb(4{a$_kAnu*=`K){A2DD1z-Wjs)^}8;c_ZH#TDRLvxG>dTHRQO_RP6d!-v29gP zX|29S?pk-nTB~K=c(QJwt<`0sUTCeZD&;3L$Ua3v)65M>$yRj$`M78&fh~tex*TQ2 z7`IRR>_1OMB`2;~_pzNq7lTWtm>C1CVAI#I>eW%tG11?Wk>Ku_S= zFJ-aJ53Y_TGWE48-SKQN$Fje8#O#lw#q%7-Nfjm`{73K=EYkZF{$xN<6U~G|*0#TF z%{-I-#H(ODuk``<_K>It;#~^_2pObTN?%n99s9ME?&@rAfF6OGqyl0jhoZN}?H5!) zM05n8H%MbKxe9yI_^9`^;5ph<>EJmimM}s8Pvv0@Bpp!de|GU3%{CoFO?>|>_zfx( zdQtEjBo{TTOC@&lB3UUe)bjRR`XB6*EN$gLA^Vz}KYIR1M=lH7%ggPP_B_07Ps9-b zzOV4&VcQ5G^a5h-r8#B9q0!V(6Uof;Kw5F9vNCY) z!#LEIMa@UOV!xd#`=wL_g+MEm(o&v%;>>1(ZOHr_B!wiwsTyvU6jLe65w|#E&^;+L zrj2u{Z9_0Dk;ZGmW6NhDf`W{dwvaQ{fQUj|+(wZ0Wb@aAm=5IEU&kcsV#G5NVA?t&==kS>`?%x~{uKs;f4|ElRgjTe&9 zxVT`)tv-)-3)t_g()ax>S10}>7tpP|NVfvk`4*0*i#xPi`MDWa(kbb%-sXPbfAInP zAVQC-gtnt(rnUnK1RBy&m&{xuG)oNBcvf}gdmphE<=_*=Y5(Q zaf+g=7E2C^g*0uJFV`;GRPg`ZLc(%c_tHaaa zbXRFSanZf%&J_7J&Kg3+i0AY*`OMXl8BqikAcb3@zsJ1EV_pV^&0u?4#K(NvdR|2Q z!eC*E6xl=q#|$qK8Tk5^Kzr$U|*(eVXr* z(fyTG^^8faXH`j9Cmlp8wmj9002*am2z#5+FyFLOjC6I==%>cnJ3aU3d2}R^>qLfI z%dC1}g3<)bDf)ms^bC?&@o}2LFt}f)R6b4*cZecPh9?Y;-)7q{s!NEte`>kBSn;nr)4c>U``--1}SXNYf?bvI^SG zFH&lqep>Ge;d!9V9i|!t4g;%;&{_;&Q;;D~NbffM2ZpMzO5>!D0I2ZaXjh-rsSkW7 z+o^Q6^wn867ju)iyX6XUh3q8tyqZcX#XJH^M_lh91M>*JK--Z=kNEtE0KN$>dk!Dc z=f<(jub(OJ8^V^`Em#U-ddpm==;EmTX>NatI=+e0a{$u56G{`x+TUsM#ih_tGxHzH1a zh?!RrO`HZ{x0*eOXm%xQqQh--@o(9}`@AcOjbsFdD1$}lmXZ8`q(?LIA9z*Tv<9_j z6(o}xC8NX`7I-?*r)trZsed@OKE6w}9T$cLnqDK*gzX2`?U;~?c=|dIQS(s8$WK2D zx-JB;J9Ypb8alZ%z!(xCTYSS#z1%&Z42Kv482w)+cNg>VtF=cSM>m^Ph^9Pkv&{)` zTVblTjcYhT>0E{7q#n=+0i3U?2bnrd+&6^lSNSQ$F3L|C^KmK*Wf3c^7VU>$p;ndY zv&f0#+XUuTugEcpd*P9&c^jB|8{$2Zi|MQc*)?TCTz@y}T(c_X?LXVzv}5iNl;bn}ds*9Y z6Hppl_;<|AuZw7NkIE9om1wT``83zb4MEut@{gpaJ2*YW&>vn?#BK6;?4W;k?5BX# zn#pw$EC-V~PHQ^=GHLPl{>wR2hi(03a-&g`hj=A>f4thMV{MY*=}VG2KtF`}VeL(- zQ29(D-{V9ihEI5Q%_Y>RaRO6}{%@jqf)1iiW)}8;j*E>&s=^{mH1!jcl{>Kk9uNi~ zLf*HTmhVeuvV{(PA9(#A6~bi*w!A5+hqd~ZvgH78$9vmN2sAjLGq z&fo~BDmnKhibf;Dogs>qvZ*!~W2l)Ts3^qoaEGtdt%pj^4n#b%2!M1+DLq{yf31>I zS=4&e26Fx)aW=-#H$j?B<{SL63RTV)k+j~n7v!D8e$p1iATG@*G5|<$**Ju8%Hn&+Wb!d&)gPKRewMDtR;Se ze?er*WBMo5jC4ZxLO}Uo(X~Q>Rbe@xoFcy{h#nK&F0}SmbUrb?n*zqlD-sVF)zSrw z%v}DWPoo_5D*oEajq2Hwn;`>xB!f0+OlHnpr{r9?cz2LX~3ux>8;=qigpP(t-A6Mih=^LpxwvrYMK~@pcHu4NioF+0Y7kr6pF2FObF>^B4qg@ z+x30}*+I?R5R%x0eXxa7geSe6`68kIA`I?}5|SLv82H?}Ep=VfMt0c`QU3GTm*p{e z##YZH2mOM!%M%{N%1aIwHF$Z6pwAe63}oInL|+dpWj`hw!sNA{RnALD^B=J!o(Yk6aHr*sn$8?ivIDd9Ne|@vXdasP+$U}qU8ZXlJ3^RTrz&3@m8sL7& z(IIU5YXZ*n7pOEIYwiQcCtH)p#`BzT>)!q{)G*5J6Q9q)^aqo@G8MSH)}ZF}^aOhP za_Q;6u~lS6Jic6rM4#;Y-1qVe1QQy-P(i z7+t0`gWGrn&EPN8kIP^?cdpFIp*gi63Yxzh-{AtLv-aqvP#tYUKO?ff={BfCa`21V z!(YNs=f-!KjbN@ly&=E!027fo5Bs?xaUN7mgY&e9_wzb2*K%P1)a5(0ho4fHr;oWz z=)JSfDn`%z>ra2g_t#EHo*vdVKESKXtNq(fc_By$MCkg)Jn9$&$$?_+;Tz=xbE0GZ)oub){;2cQuLWx!}r#7o&bpuk=W`4X{hR%!9 z4iJEC`nBzI2(qx|atTYZOX<5&sTH~LC}6&G@hIdmlpAl2jYtu;lCLuKt<{U@IDY0+ zIer$)$|6YR9VjKngsS*ku1dhok>(QJLE`s3Jdqo!I;rI8JnhG+jqMf*$ncfJ=wVe8 z)k;cP-;@D@tm1x19CdeIT>TZ4*Bc%(nHG4i4);UVRfb zbnECNk2>m+@-dHOLrdIm%_$naN+gSGa%WLeya>cL$*Wp1|C`0y`9=eN)&cE&YqPp) zGP$(#*Z)XP&bNNWPp&`Y-Bojl`D9w_rLLo;%EYKIRBC4TVVW^!f~asBfJa9Qveq9T zQ^1(W8|*VB?H3Jb@{;dp=cLg9q->b6Yg9eM94<;m}v?5`Ye<=%* z6v6nr&h2?3kktdEnBP!LT0%!uQHZxOCl)M@OOBO&qUMmqA&NhUotG2QSZSkN$$2mu zSa)9O19m71t;<<}umdG?gdN~-uJrre(h+Iylw~0?nTlg%6?9_ZNl;S+QBrxwy&sYZ zF771q!)V|1SJZyQ_e+Wdv@{8=7F;tj1gsk0K&P+GO+5~1z0mHE^R*cC$dr{v;a2AWF;;j`?`!2#9-U|VKE4Tl+*#!@r9ezx9yHoOG7yLM#(+^>aCQorMA}5l=JGg6+fq+Fo~D7Q&?xR;V^wSWd8kILgEWWZw`yZ^x>ZA zjSv^CM3qHauFS(c6ZY2QD0r*iUJw{=G1j-L$#Jq_ds4YfP(L$@Ot&rHkz^<|%h=V;E-zYs@f&j@ zw3Ej(pIt0ZD3(PTpY#akXzAPtaY{AblY$gRYO1zl)=EJ=RoJsusB%UM`TpNYA+x6M z8sZb;kP;4^KtWt{VtL!Yz@Li_az_{La5(29#EDeggbx&F1n8LCgh`e|pu_t`WNzyx z|2$!d<=cqH`(cax(lJC=OHT8UL$A^_CUuuM$}++ivQ*+t?w!kECl{`CO1wzDNThgVH6x*u z3w>_WGj+Idiu|fmM+t`}0u_{sHWI=E5RDL;{pc=y{44MOrc{z7aC&EJMA?V!HpNdO z)gn!Wy3r5B$t}C5!_|YJ);ZOuV)QeTM!IjZG29;Z3dTm%%PRi|>JVbsn0z8$j!81l zRW1VJWUAFKGVE?E9*o#;@%3VBK^Y$Tz|hqUmz z&E?9psbdI8O{-Z!HaxASW`%^luxeJ2(|9*y;UV>z>G&R2Sso(GGEd&+#SdWBongCX z73zzHD^2?|0{Kh?`+@q5TXuF<%NL~=*iXy^A=&VB=X)i8|EJ%i+3KUDHN!cg zN^NSk${E4sDtp!{ewgB<&*UIm2Qi8Tq(PZ{D#CYa;rXY^CvasLyTn&z~9ZBiO0RLG{Yc$-Kh@h@$2e7`cxND8z{wezOLTJhN#PXE6Rm#zq)JC00 zb3b0fYXhPMk^h5kQV;MxZ^uH(A4M}>Xd4Zs(ezz9Tm^$Do~x{+!HG(aH9+CD5RSEiDMADsHZ{hV zHltW$d&IVUCu)z9Jh$1`c=VG*g|7E>{{h66nRwkGY@g|U#e7_VHH72MJo!zD`g{P$ z4k3ZaOLv6w7!PHt_%r!MwLQ4Cpc}^|f@MwYTG}2WZFOP%T>qv71Et!7i0SqM*)I6n z1VTSie{I9R)2!rRp0?p%IpFJpDzleViHE}!>Og&6q`iHFm}=dFa{UfMQ$(EG@VgMI)LuIpRd2V?})ZUaPRx8^iniy)e*#QAxU#Yf(Iq`G>d|tWI_h61TJ z4;US>sbA9K@E=+nOx7T+VK9K`_96SRJkUpOd`|^YP+Bi7jG})#II9SGhl)yRW&LM1 zw$oC(6&=k8p<}2!%)7L=%SB*4l*EutM9o0*sVh z2_yDL`h-tAz5JNYb>VBpB=?wDIne&&*hb78ItkMgvlg7yLCG*2v9D%B|FygsOJrgW z(Q5}u>xH%bG|WRuM2nn>S$9u`-p&>}ASr{RI=~aQP;U=Q+^i#?!t*hGn4}HuI*QWg zi}bDDc0v@iR1WHCeQ+yrYqae{*xD+O>PIlZ2zebNcf9IQ}J-{t`DmD006ttJ~Y!Q(+CH9IinGG?g;wy7R9bmU^sZj2%&n7x1kbt zrn45wE~PqQ%oE|zD+K9z#c;|9;qqQyJ^8-xW{F2CvOPqIR8h@JCj+~$4Sk};-T+9N zZ&;<-QCP$%ECDacYpUA|7+*D~meA*S7EOx;8zmNnf}{vW0UiQU(O4C8zWB^kpJZ50 zcvEa$7y`Ymw7aNWI*fx@d7kuGkA9-^C?O8&i}j;hrJn@nUD*`Yn?SU*M7*sM!RC>d zWT5Qd$e<1%1TGm(>}5+OfsjC>uX^YLqs|V+dhy@Xnda6 zqy_xOg3^L8Uc)_=N4e!T;N_79NX=+OZdeTO(Foqw$_nyrApu0LqS>s_)p##5C@bB3 zriS*!zKAttoikJ9MKTXxE7f9nmJ$9p2JnHPe@x6RMshkC^6a)%K6nQ&(UGl~ha8|8 z*3LV554;H&RFI{RKxZ9&A=~s7^VK$;l2ed_>c`z+K@M_u);6sGu)@@oE&u>Fid+hi z13M^BL(9M}#S({&ozmI3S^>e01PuFb*z44LBfX%+l6ghN_YjU=y@XRN1Ry&CbXTG`6;y8*BLH`d<>=|~75Tc;x_$Lo*5Gl0#wqEy-j!+VGMZQR}QiJF>x??N8-sY24S7dVaSZd z60UCyf0TT8Wez;Cjxu46ol^56)&>e(r=bnWSKWVNv1vk zy@8s-O9-9PG4^2cn}qGxNp>ZPWxf%&k31{T%29i`VV_5|X`)L`fN7I0UvIMk-0trh zAUp$WH>~%h2lLkt%HD<9Mt=GWLgd2k#t>C9OW9L~Q}Ix1!*67N(iWn~)XpET9A0O! z3J+yEjtI^y&mGriNTbPYilwyOZ0&8BdbDpHUWM|ZMSy2Z@Fok~voH>8=+p$F$==>A zDj+{%Pyo|LRh@PMbkSO4n_PV|clIP_QNmH2=#YT_fUHzdfA`5w*t~{k-EWh;t8o&# zr0(D>b2!CW14hD+=^%kJ5J>GN!-@Nh?vz1nkP-TZD(MIL@Sr~stkrf=Pp$KKyl_vh zo+oAKK*>*lMdID=0Sr|Hq3|sP9S3vOW`?>Oo@bkdLLS5j27r6@bs{Rk9M2lHpDSPk zm{vGx5?H5Cdnu)z*V{2Ni_K8U>xNLD!wS$8FUov8m0lFMQ%|O!Lq0{gCU!+_`~Iz6 zr-#$0PJ?n!o-SH*YuJf?h-L>_AofalmFW@l9v^N3wt$bBC$ykU+q?vJBfC1()L(yE=%@X<_LJsm%G9#z z0%yG-6|Z}QP3ryvo7|7*-*x(P%&U|5HzxRe6Kw0Ks6!rw!LkqsN9B+Tbm01_HO2#w6Q z9li;)Zp3K$K3-tHc;aQ=Tr-CdIzv(YWZVm;XfUb|)NO$wC+c^}cudGwgRhdfvSQXo zK)@Ev&DfU(9aSaQ<(gqdv9S`Fq?PT3vhXj49!HJees`dH#f1 z#?Jn&UO_^ChgcEbJF6Y*QTyeGGl>1`8K6%Bb=o&lBqgcS z?&$^Y(#*k-q$1gSQd^no`A}Qg*5f|hD-Wut2ol^yXc!(dv?H|~{prI5(*3g!Q^=n_ zeEcswOd(?*c0VhhJRT3dtZkmk`f@uHOH&jB>6cLiAz{uiy3@=CBHsWi&*n3R6kaV5 z006&8eK7OR*M+NjVjbO$%upP+ zn=$)pn|3icVSD1c|GNOn1^|;+5i+~j@k-H{#chFrz@Nksf(atQB8S>3tw6P=6H`vEYqHBA3*1B?}N*OmN~wgM(Mi@iLVx}oS4C+z;&t^ zwyBqO%AYh>Ou}7Gtzx)`_A)nm)d1GYwd^CgyA1TVdt#wj$LIkNG}l_ia3Xi{px#hHz>a6 zZe#u1Xq?wIo@WdnGLnamGm9en8>Ukoh$p&p@&>zmRWGZI_Ev#`XS7ZVOHd^&LDiGF zGhqo#*4Rm52~1%Lsu)uDNmzoxH9O73;V3qx!tS7ikK}L-MxAz~J&1m}5d9lXA^K2m z8_I1%xt%*JMmc%aq(H+V^;<D{d#|`geO61-7Ff{#>>rER3!n zW7N78QKT&NAdd_*J4Wy$+ov z`hNaBbATpYHM(A-31OE=AU1zP6)5ViXu|XnP+&63dbt*sYXTxv+_JiU7*$|Hn`!d_ zlXwyrqn!d=7*CXKHWRT8Rb)STnbbCuZQr%_iy&1DFWFe&>3Wb~U!%63%(M!;nUN$9 z!p|f+;m@oZ3`B%#MmA&9BywTv*!mSyzcaHFvCUQZ9cP)U$=>t~D=b&iaz$2idSEhN zvZ{RX(Ef&YGqI11FNdSlIEs>!rHNn@1R_3J?*r@}$~2&=p#`i75pQt*h=yL*HXmdu z3Rb)V#g$|kP~FRKih4^7{+;{^f9rZq$k1fCLQ(_mp*J{CHqDXH7Rdy3ez-SiM5p$YaN4pJgj87XCc^R8=x93o-z0J9o#E+qI+n z9D5E6aqMQK3Rrs96X$M(QpQSD?Zw%rj@0)4>6b?CWz5h?ZSx(p$;|r3Na%J^$C`=u zXy{<$B{n0G!-T=HgySRtPIIRLMeF9^Hfbdm*BinRfc1N2nHaYjIURe|*@t@|HyQ#6n&!i}V9@;7q5Ua{s;z!+6TH_Q2qd2dVTKi8Nlvh+|nYqQ{=Cniw zB%O?-Ub1P32*Pz+;MduH!Ngm>IjYtN8s4o;IdeW0Ewl_SZo1AzM-o0yvUhycS>nSV z6N_t9{}fDn6Y4+|?16M9e>g?t&#bu>L*tnJr1}hsyK;QRP!^DkkmwBBp6Vgat;iID zkEnwRF6FDEYXC+@bx|8d_&64-7meWy2y7yzR&eWq0)YghWq~7V@sZ&N)6V3N?8p># zJ$wE!BGK6M0n#6jJs*q$_0~3igCP}PTso0Bow3AmnZE2zF`_g%|IPSD?N`xP)vJ2w zuZ!{@ZTYDl;zq^2pGLi}#C3s|!*xVT?SkaLGE(#f-0SrcRQzp1UH(pc!-Y7&=IEN)s^qDrNd*eE0xE8=0Fb^5i@nr{RUvxOd>@!B` z73Koi2Q1@b*ayVS`K7`=z)2|l$5B4k_<0JaWQrBGKf>M-5l;aalI?9?K&O#Xlr)5{ zTM+OLI1kIPM~7P&VH4yx$U@&#l|!kZ@c%9F#6tCcZSzCQBnGm8-S+oYvfH|=XiVm$ zKTWW3*7{rj?lw9gr^HFgv0c!yEw==bwv>B4u{6W>&yI6DW}ig3@|z=Cnpi^Vc9{}^ zD2href@V9;0wu^{&IFW;9&z}3wK5IwY2YCet`ymhC3-iM&&^-vHSG>2$Z?2#=4a~R zH&GgiUPolB+oR4+gwu$6JI~Uej;?2y44Lc({dD3~74=sZeW&;{jjqq^`p1wA38;Yt z$QykUnzAK~f}_OH2QVRiG&O)wlQ6B7m;#)89IHn>KZ?RTTK|v?}<90kLe?k0za$gx2P44ycrA62iKsxxQ3KNW3rvd`Gg$0EghS2H4#qY;Zm^jHO zl`8`I34_ie4a~t~2Y$8`OaUef5?MUwV`0SgKQMxRd*X^G3OqH=lqcif-^KLKxc+ur ze<|iA9+b|YH?MO)0;GPeD|6KhVOZhP{A-133hNox!J4HTx)jGLugeQe*EniJLUTb{^`oMvhtD*? z2+8z1U9|qRJLPw&DSw`Ff)_w;8-vR3Q%SN*e?Gu*Mi0`;`Y%HN`mRjma&fDPU?XDK z?TNqmVF3|v_xV`yGW45GA+#ts|Ca9u6m0=(1%~#Fv}cE?g3h3{yoa3ZX6VC)_jqch z(Byd`MUzu9KxYFE#*k%97&no`u2fuZt1w(Z@z5nn7_L7UuP-0NTOFE1@A~ zO($dT7yla_q!>dg*s>L$El%-M*{B5!Tx_5@eK2lohCPT*!hXlF7q1tC%=&Psn>ZBJ z&EOJdO)K%=7X)}C1U0uGgYiR$VTboY;Yb?7JbSPIvo^VfI_|qbo>TX^wO($W4CBc6 zN!{n#>#*Jqw~M17svY7q-2u{oLSCSdGWP!P3)o(yw4?V=jD))G^@sIt=1KoNPHb@g zM{P_Q)oJRq<cvOj zWe8(79S5_|@~4NgArvI?qvKmZC!;((8j%!A)yKm+v0NFCh%-A6rP``VOtlH3V8NY_ zz$cMVkJJX-&S<;QW7l~_X^mPwjZyD>khfT=Bi1-(ZbxMo7PpjP-Nbx9jERT<$AZf( zg)v@CP=hi5$&ez=<@~SRP!_g|f!!A5P z;XuDQfttne6R>^j?Vhda{>dYzNY>Brp}4b_{3~7TgrLyWNXFTIJJr!#j@p<%FM7OX zn+#jSp;zSRh<;|F6Odhw?(Xf?`YfvW6h*1Rdo0Mqpj zbH$2QSVpjqDKCI=Xf1oY5ir&dpeyre4{zZ*oi~Nbmt{Lm5#v(Q0Gp6n`+?wC`j~9? zi_ylqnM4OhARIb)FX69PoHBpIbZkD~D+5A9@221KM+%Ro-}W0_pBSgQ!_*3cE%}X( zdIz*;PEEER2xe<>-!DyQlk#L&Bftpzvt&V4DHrcVc8WmQ{!YNTWtckC*&W*M4=WE> zzQ@)>Iv2YoIpo(Kd7UOD->1V^&7uzKW+bp93^y64PLjEhupYC@8C&Dj2?g-P5KZbX zNS`)?nRr;2L_vBd2@auIU11h;L_ZqQPhv9;mM^ zm{ro9v1X0VH{-IjQP>(2vJ`5*@8;H7;^O7$pG(!rgkh9JNl=!mwj9^nhTEZ&Vcb+_ z^l?>xL8e(djc9XjMwf9YqQ4x`Pi%Z8+lm%G7s$LTcpWTNizOb|3J{%Q@4js`UJBMZ zrb{{VRSF7U5e*W2ZIW;++fz({zF*1vOeZ}pXFqm{W_Iq%5BCUi!)%bQcWZ1LK{AS+ zIv%mXlMo%GEesK3Cp5GfR2a?%kDVFA+3{zHk%u4=YWpGarVLwc*mL;tpSCF=~08!c-`IPqERJ zAy&0qHcoX$E^AW(KZPGBl@`L8m%NYz;5(daT9p07zHtf}u#9y7#m4$ihIvfe(8%8i z%ZUIY7^s<(H;RpHpBE5VHtQ(AE=RKE%LmxL@#JtGfR<;(|-7Xv8;}Lf1;WooR9jWTi z@I~h=C-y%UglvAyTNv5ye&Kw*Z3MTvQhVAURhe+wk-Qs&jPN}C64Bc4=L+I$cf`6e zaBJTjnM3Mw_E~lHD_oW3cL4t_0L_+BWEmy=1TCXNHoz}%pAC?|>spN|(n#4NsoeSp zxG4MDKJLke403^~dfJ_;8`VXFDGX|I(9hl}^Y!L3d!DS=(7dtpH7}Ci6xrnS4jVG* zjEdv~%-63&44JSqWWp*%jC!+k%$tyYw!_Y_%yfgX&b@6gNuV%KLnmd*3hj;t)87dA zvr{)|ltKvJ^k*BuHX78vcRdX|yT{>i43!5M`W4Z8M#v)QJF$RwziA}DTjsg%0%3VR z?mB!d{5Ssad8{9QvtiGeLVJsiQ(bU8m$iipJK%?=G>eXZ9i>4erp*Z4|5++=F|_Jp z^<3n#*+HWa?(2qNv(Y+3O{cRer0CH?cV9M`ye|`Wd!9cE;@W$@eJHAvJfbi&3rWy= z5V=Dp6dTMK{%Mq+Web@{>%`rgMEj^2@-mb)x%b+w19YH{&L*6+=%UqML|_1A4rKXJ_tuL{6C zV(#6J1VwZUS;#$+yjz0sz%1MEQwAJ8x3~lKr5Nx28Ojn{CS zWws&D+O@yR*5H7A%QAoA*5FsX`dePGYdcZQB-&%kyX1r1ge|Cg@)Q<8Vv@^sRUg%= z4ylf1cG|U1Wh?Ppsf1-d=~mz=!MSJ~`(Y!;tSIrXf&Y#L{le_7lz3a)nD!!oV?0Fu z6|lo2mk7Ae`cZHbx6sause$uwFu=)+xf8UnD+s;|7rYcTT1@Yf2z`r0mr@HKgJDCW zteT2Tp6!&q$hd(I#EZwY%7T<51Qg8+Vw9BZM}ag_a;cfvpaR%}z{cfPoNaRZWz=2< zK6|E5!uDYm@U=;(3;R>y?U`kLTjB)xi#zxE`K`&vwuF1&nV5GdmJkD=A6vj6Qwker zJ9gC$Oq%$J%r6~?0ftw3%%Y@%(Y7Cz?w0N~)5Ds6+Dw0<&2q}l=cxtxa}%+^0A-k7 zLSSVJI!r-WOiydN8Ysh_J0NknBHm7PA0eo<{)uUq1-l0I4j7?JEb}86N^zZJwjJ#n zv}67OnUw>PyqRo~Tn^`P$*%neyZXwypsKQoD*0q`(`5VJQZIIn5B_qC1xs#G{) z2d6JhQRLK0Cod8{ajEd`%fwEpW<+xD%3RzpQzB%U*cqyrRkaMI>BoM*5c_?b46lv% zZy!cW@j@31;4`qjrnM+zTFZJ(Yh{mVt?rCjD^swiR9FE`oLRoG#Q502`?AHFXfIB% z3W_57al6=l$2N=gK6_D#z0xrS@tp09Ao7V+1v(&nxv04T!S&uHlqSBQX`b zmvr!P7D%yWzKYU-LFnb@YnJ)DuzrdViq^`H^n;d}af-ggNQgzRKH2vc>j0QSTxz1Q z1!Oqj{BAiX2gFGFo&*E3!L{LLXKcAF0Xn)|0z$49u)#XssoN5_mrjk7&yrQ+#~vu# z6Fx=3pn`(kz~`a~@u7Q+ht-N(#L39ISjx!_;*}t40xzLiECbOfu?*x2KDTKV1g1=_ zt=u9Mr(EY=>>~^-kGl7G9Jaqz!5gN#mz-HVBbaFJEdz}tQ-HbWnIOB`TX?- z#om^Pd*b%-Xkr12Oy&yfKo%DNPVz53J5lr{Y&;jLEDQEYwWPG|CuAZ=(?c3Ugvn2} zGsRz%@ae3tIr%K9PAQq4h7#K6CVW=`R=Dbn6d{j82W?+4mPe*pA;%0kA1LNkGhf`z zd7IZ>mgmNl0*YAT&d_FkND2Z_!N+^5ZC^PG6>qZ?g}tU+P#QdiDd5XOQT)u8N_43a z{X^L=OCyf&3e$@lt)chDxKL|-M(+Y<%wQ8%LyhGO+jk}V7KQ2HLh>ff%;VgOoQXSk zBRRDAMW?2>$XNKfJfMFnYcjx^q|awq4doJ?n8-d1LrlW6+?R2HJ~D+SGv1)t)&1o3=a?yuh~s~VkM4sLM3bl1OH`|IB=WtqpxD;2X3Q@1M4 zV&Hb92+69rs6f8HXn@6koW&0jSlt`5may@F-6NQjqI$h0;GMROtO(no&ilSS0Uw8Szh+g-7#BY$E3u1)IuCooQBStqTH^w^W*%g}Ir+E8RkL;KMsq~md zwu}?Ce!(X~Ih4;KI#*M2)v$)~ReFK11N#Kl04*?0`b$)1vLVZJHesDmQ+|xWlSm@! z+0o*k3vT04wM1iRd65KTY!h-mRYqHeY_2`UYbI_y1AZ@-@RAc@5^MJ+mdcxEIunq# z3hEBUA*<#v|77_dW7&qx1n~>iQjx7tmdqKJ4C6&;V4-{KD14T4jjX%{`TU8fE_4f` z^9RC=jhX=NB?Fn}`DUaeRc6UB^7mKb!&`zB;W zwr$7=bm4Pn6lWw<0YZXK!kK=->_iE0K^b>e*=maP@UIqTphpH7;y@F-_?0Fz=%0uu z(AV8!ATeqbH_6Bx+&WB|&dbba{(< zNLuRNO1y_Up6-y&G<1v)$IazO!rx65 ztudv?;>%mydxg>E`_8F1%?W!uqsv?6y4w~SVlHn{pI`o>s*GwT+)Jl09gtC=Vv6v_ zyid6l$?L{1HaQnTQb1%ftz&sH#&>zE6hgyPk=)v*9+724!75{%@Te7vHDil}=+cG@ zP`wgxDJ0Di4F`=0aGINP7_AElq3DJi5LsQeXi z#M*@(_jGvLgf+LZI=@4LhOR9!lvU!$1LR2{Qc)5)NkBDi`;jR00(4(`u(*2=Iugqt zA`ITa+`~L551oB`{y|@;(bMqnI2snk90mU$ZiN6-Q7l%AgV$hFIt~1yIHtcC(_a%s zC)PZOVQqf39m_usQqhN8Nemfe@w()-dDT|T`)>U!S>lK_FczOgfrD8i9W9n8Sch!R2&@W@?Z)+Gk^bZsf z*$Fel$PkDIq>nKeKt##;+w2KniKtX`rM5j>!W6iHT+ag%ur~R?1$h>i>R+SxJ#0;* zy`Pa@XYbpldcRE6D4dgw1^XjCk8j2*J=gK{yDt5%ZP>_D((Sj%pR4G5ZR0~+BJ6cp z#s4q@_9=R9@n3uD&JTI&tAFjO4+tF4kA$thsK(*fADlf7*NM;yX<{8^+m{=R?n@Yq zq#Nk__7Qd{r#~OD=ZfYEbqZl3VMqF$g<9tC-xivIZs4U*^F0ZyN6+-Gg-&IXeaYz;NMuXEG{|UD6taFSX3VcAD_vXeCtR*u5f^ zqUuRu$<;)mcIg%))ZTbg#EWAJE*qWLs8RQ1@7BMCl_gto%nLe(>8=5+ITG_Ej_qYe z9u!;x4#Fy-NWw-I)@HQ`KDx5W@}i$3F8ry(k;^&_FNRktDM%(2#ROxOG#P9Xy28Gj z-y2m|9S}W#9-dh2*q-|)?DP=hO;6ix%CT@`hqgg{1h`9QHr@sjVV4XV4Jwdd_8bB} zE^oRgpMh-Kxgen8+SGZ|yWaXdjzDl5xyJ}(zH5kn8hcG|DiB-^5nTxwGn{G$`|$tc z2TpZ1lLmX0w=&gyDlJW3l}l=|qiKw~=zz96jnx|@$e+)0K`aj3HFvIFjciLd6BIMN zylHPUx;r{UvRFfC+a$h#N@)QqgQuEkHSSU>o5f$bT_>gj`V{p*@tO%#;du9;-PF9R z*dud{EE}9CvN!UFd5-%i@#6P%?fS24h^f{z?GiOIbU9VoSwJu&1XScb9->{SZ>gjB zd@*)y+<8Wgq`F;4gjp|ckL}1LfQhBbdam-1XJ4W{xzrn~4k|y0^s4K5(J)To1GA|@ z#C4OE9D(=`1G$upArn2z*S^5EWr`8Dg4z*v%KxTsTsDH($sV zUz7{kd?C`lhfy2m+Lzv?yjk_O$N8AId!QLK$I0&AvwBR{H<_EU?4h5=J*P9-^p@R$ zd8NRRFr_etbTYvsxH29!V>e00#Rvcja-DQ5aIsD|4GK81Ip?N9+24Ka+0pso?f$=* z9x9OPUz{Ch-5s4ApA@h0^LZu*8Ccx8!Ka-W_zluEUYHwE3N#TbT1hg9Rd5v$kbH4q zAPzrFpt`0q#6eCrUB~XqSfVcEHct?sh}@ zi*}u+|Hk4QW;woFQ2r5zgl+T^6`*-mvw=yv>m70mx#wM&;~0+zx+!)vpU918Bl{QG zpGCb%t_b2DqzH)?#rr$)eI*W~ZO1_lWq5Khzu|A48ADwetgM*9%RF1UJ^_{9^-0`~ z7#DYn43*G`;5kPdC#ai5@SchMOAR)wd=~h`+Ra@9@V?vVgY+l)!wBj^@>#`f`bz$O z9F9TubNGTR-`h1H!JtGE72*6B>ehZ?dJ%c2KWsw0CU>iC-Eq4KC*RiWfq(LT$@ zB0RIarC2@GApzJpG}Q28??=3p;DVWH~E25+kvD-51J{G3!4w{^B-87=fy+bkYn>fTI`pvFS2~_cOQ(QhJ zu7yYjRT8l;=6q`??tLGh9|Zde~EA5Bb-Cl>kua{1$l#X(#q zn&OF~phN~ibB$LH^h?RFV9jVDr#;dtSG=RyhE;=(STtVPMCS*Ku#3zF40;tJG2O8z zk{@?pq%3(krPSit0z@@Ja}r)XYQ{!yNes}=bNOzF59s@rs0HB0isQNIA< z(ZKX|4S=G#}>x zN3uFt_4uE)NiK~MFM+l4O5(AUJf{&xvA2a}6p<1|$ni44 zo4;8k;>Flc#+RZw^ahZlI*FQ?k@4~Xl*=_J8GnHC0Oc!mI&DQlrG)M3pU zuw)_>ld2w^E;}7*)8;l2Wl1zRQwey>tZrfPznfS8c&=T}#P1#*VuG0CVvs4i=jX{XMqq*<}zU{}vtqVE@YGugQc0KSppi9?dGV+U};*^hhU%i^Si`~T=wa*uo)a9dl$9v2DYpE$Lv$+i_9O96_V{kJ zUw{ki9&p9y@QpZq(W6cIlDb?1iPawsPg@aO*{Cs+V;=5g5-&w1G9I-%pAJup1(#`$ zyh)c}{DCQ^higy0jAtODu@c&=aMz?^ChFCidgQxtb_WwBzq?mtI=IRNhL$}C8UBL| zJu_jDkj9*$0(N;z!s&dSCl1IHa4zTEDh1QTNHI)SHQr=9j)g4(A9nN?a*UH>HQMGu z)Aj}J7jV)nDWxf1J}T`V>>gmTtOUE{JuLE;N7`j12lFJPCrTZ09fJPlheOy*wawQu zNrc)hV$v0lFnu|mFGt^8b@)oC+w52j=~gW@nw7OyT8W3R>W2UBKdv3&pVR@)b9ST>-WE|zn5g*!}C1vbGV=Txz9IQ zz#;eswMh(#=u02+ArjwtJoHXWWx}0>&-GQsVfV_xRnAPs zdMWVnL4Gu9^=mZ95UwJK z0gWcRO`{|ESK3#b+2+lsa_#45+h^HF#hiVO*HzS4y3W4AzD!#Q{9e3U@^iZze{hFgqdhL1pCyssCytx42FY{vXn=XxSnl7e-$ zvZeu?J0Uju3`H31j*z=C^lHnqVMLnxj5GoBGCz2FaL|bH%x%uTWI=b;t?Esz0IEiS z-)Z9`X9OxKn{-c@fxIGCZJvn<%`*7*Ai^&H2i9c4&IbG{!p?IGdcBL^a?HTPuVK4ci5lDs0ugyutyr+Co6q~GGl$+a}u7o@Vog)j_XVyl9pkQ>aHkd1Uf{=_yJ($N;nBxLu^b-0Vy6qewkSESF#f5U~^D)$7 z)@7C#N&g{*`BO)9Ud`8e)$cRsm6u3FA?ijjQ{eZL{GGeZ(te#e_agdQlZkfh6h2?C zJ(uO9+V@f@;_S84#|kj*fn$OMKTw6!5YqEVX>=Vlm;MtAL(JKTwDDtLInYK7IWlk0 zIWoUeK=*?CYTfCh(t`!j`d8)9%!(5+=0i&V$}5c{2LcVeh>=@J+D+0wYGhd_?;B%> zVkFHUf59owHTS0&o@hhi#F3 zV;m>MMd~Gf_T9tdRa!24H=f*zSeI@($hSYH0=fR{{qE_rc#W%R)7wydr}T3Uyy4uF z(ddYmnm%3-cMJd0cN`PzM&RNQClXPa101E__-oc9{J$v+t5$)buA)Y)5>1I?F*@2m zW2@7hBPnr~bEleRq$yq=A|8e4$q3L-RLSRJ&JM`Q$UJ-SbUc)C=_XS4)gmS5UjH{K z$+`1~2uUh4!yG~AggJ>Hf^kHmRrm#U-)Y1e?dAae_eLjgx#NH|p-KjtuYwz_G5sg9 zWR|8xkd~;{?jD{`k^~SQn2s{8S@t0A35g1Y2~AX|{EtId;!8mwOH3KagtuE?BeW5Q z!y*W&2TNN4*$iIgXDcE6VK^XYGq)j`BGjFt=6ewwo%e|Ej6uJ(;^PIH+6c9=acYjn zoi1nm==n@9wi&4igDF+4-njdZMF<*zCtuI3)TBp^n;^tY%ehWu5~6Emi12&|d1$Tt zftb+oU0*F!F!6}9b?4E9vs)%WhAlV>rM8+CH6GbN;lkPSp%Jm1ZX=k*KxKG-Aldw* z#q4t-qrZSiHTJ|w;js2^f*RWZX}0$rD6+8s;BYaKb-<@7kqwKrv+1W4|674AXyir6 z+WJFS7>Azs0$U*3AY7Ff*h2gwXzFwYvQ$v4TwDv=1hgobIlLcCJPWu46VHP1bGwgb zV`3qZ8!h*2^DGuBtX5QkE$TS&b|1xL4W>K*-S;t4)d~PmmT0k& z4;jxOD-J105UrH|QCOt}4BX2)2#A~Ij6dgEcr!&Ks^3K99-Ouj-Vg}|pY7yZ1^8ye zh+7?FFg;_Vl-q6u^N+ce=%^KbAO3i&0W_ctD#8P_@#wyz^>a%>7FXlng9vMG7y<}~ z1|;kVeZ!95;mRm1$ypqBN}Q;d0RqD~5te8|NJ{t#$r+hPs7miGbI(f%C{hv)_TpTL z*o%M$i8{FaQRcN#Hk=yA3a zo*~uf&zyyThfkJ(HD5Rr&t=4gwQfnd@=iPnF3OX*ba=lbORC!C7Juw8A%_n}Lho1| z!Yz32H)1wgJe7>3p+uQA`|bXK?T`pwB#`T`J^VK6_WH!62wsT_)0c*GC5^=&EHiZvz51Bl109Vo<4>UUN$`JQF1P&|kBcY%e&q2r5->~$tw z#6;i-y1wK0(q{&k8<5MCs5^e#S;)Sci#gW`EIujbygJCyH#ME3AB?!_IhaSk3G19URJF*3j6sAQ+`4-&9NNYPJJ~-TdT&AZvZJ2j8T~d~&)Tn*P!y!ZoR>v9uRC1?kiAskeKf)1i_e!}T5RW# zb=9A2_c9*@Oz-WVVe+>M>o+`1O^Dq^ypgaYOcQr{|>DpNO{zB@YP| zs|N#jBhfw>^&t-57{%bzExCLcA42wA5g6d_dj4HJ0GAI1v=0JkA7X(t!p$zESx0v2 zrJ;EU)<^|i)^tJRY=k7rsCKTB3X3*^BJxTYqA3yD)N~I<)G_jr)yC?#67G{6k8#kZ z(-UWhxqiHoTNw=e4DmhJl!z27Xi#kE^idxfQcWP}%^V5_Wxf=~XrAyb^8UyREh?|G zI-bogK?R*65;{hj^bGoyC>f7?{3mQ&PR6!Z?{p&>8#gU`u_8$iOfa@GIgyX2gC7y! zxb4k4vqc^*Z{@Qb=$Q2I^BZF}nKB8nqfTLHZuWR@@1j)l>G>3boCTNsav_(5ogf3j zja(rea(*+93+L%5f1y88bBlT+?2Ej-#u z*3-3R&LySt#wWzOYvauuGELgntZg0+K=YS-=qOjmtY?CeBIv#3z}S{koK1>%9NM_J zs3HCOXfVT{lTWwOGzLJ_ChwJv=w?{aXax|<^;i=l3#~wHK%qUr2NNUnxhqo$GHYUc zE0qs%UwMcZ)h2IEPUrZgcSM)$Rl%s+QLd6O^%WX2y8QX+U0*qUcSVt{~kLi4Zh%l6gW$ zbAElj{6;Jw=WEQ!o#wF$b=viiM#z^OSIZ;fsM<>h1(_SE;0;=^9UjfJ04hcOfwHsO z_o=kAH4`Qzhvo#r&k9@~uma zo`-mWZy2&NszCH+%HV;BW`<@i*<~amQtF-@V*B~G%{&wABW3eu{J=DBh}VKJX+oHZU9?PUz)DhRt`@jQ{l~H z-1%iS6QJp&Wiy>bAg|!j(5%W~pl0NJItE&q;0g)J%Q9zCT8q4B;j~Ce(a8H?vH4N%~n^roPvh-exWsEbw62A;9Qd zHd>Ddy_qw40UgnwV0?uW{dwZ0z6Kr3X@wvWYvWOfvW>lgFHvfzCiK^sEkPS>N{wx} zsqM!FyRPOSTc&dO<$v)K_SsI2qDYsz4c+kILDle3k>jBv$3sQ#kNYT-!)7^)Qe*!! zL^=#9QslgOBcfC_TlFV-aT?CL%g5D0o)PIv7UO%k#2SbtC`0lmHDm>3<6=TGMSRfu z&W=nRsc5dcgoAf`=Jot)&cl4-A%5`!9&4@H_;}T+L4U*{zx+Ln76$lkL8Uh`{Xx^CP!;P6wiqoIO4qL`fG3<$-bWn+Uzi9ITD1fmrSqNCZ=8SEMkX+ zoeQAlAZ@HU8~EN{%u8RxBhgO3HaZggvz>gi6)7ZMm^cdJ(378+J~}aVx0zK+=kswi zAVi+RtJuQe*AY0Wo>^r%Qn@_hzp~iDBI8eM- zPZ?K$yhW$O4>e6BzzF?~b~}C8YIV^iWCCX<2dt)AO^`WMU2kk_b!dh55U0@@dhhNHcJ~5(fQ5eIqE*b@{%r7Y{ zYUG!qZ6aq24?sC9_4p4Mi ztAS_y8^b;c?x>HF6T}Ja%`2X zBkrQ|`N`~>lXPhtaszZ;H{t{^ER;9&t3euKHBK}ctWypf4<#H3gB=7C*bXY97Yq^S zg{P7!6PBsS(s!n#wu8Ilp=fBQx(b#Weq!R{MQi$iL+geyiTi?QghT16SmI@@>Q=-&#{VtKsm@hV%haf*#Q~wBXoc z>?G6+>dGScH04w6FcV2WhSi%I(tiX!z0mfCGIH-es%FG9Aap@~wR+Q_X}H0jj6^l` zm!=M5v*#fGkdgx)0Q7?BYj7i8KYnA{7*~X5W%W=2us-u5YsmZQ$6yzTs!T%8j(vuN zebB%m>o9_k$RTf7z^Jn!j(;>pI;EEz$LQpnHPL!hF&XGdt+cC*+jvA4VVO_w@r&Gx zUnD+}^ZVog(#kjG8!7LkiB2oQLNfR#RcEwx5@TwbhcWBG66Od z+$3qD36S@7v`)zlH5`K;Obebp);Y^I%RZt~Cy-XdIU28ju)LKk!#Qt;B{Q%O&!mWy zXT@*o`*hSTypMErad&Oy92s&PRZNRdJ>DY}Jc~qA)%j$wDX9i6jRFH@9^IyC^NwThe^;h9n9vLp2E7f0Uf+*QUIc2dqo~_l}K#pOj z%ST?v&1Bk$YgfiONr}p6&A~otg0ib9D(Y&JKV?L@&SDC$-jY1fnm$rQkX0fP*&)=} z@vY!aQ0U-Bq3G0D4o+*e#}b5zBIYCZ-2}yz40&nBtd4HB*I*AF;=d5Sp;pI3JQ38~ zD1LFi82CGYl}f>iBrk>m6ujV{%BdjyC$v;_A`)aLd-3Pt%s4lMi%dM?En%Wpfcj8L z8)TNnf3gaA8@os^JA{s(ho~Vf=}+|=Bo#G86$YCBn#E_Kx2%p;yaM$#-#Keqd9d+T zl@_d2(R*)45A*Zdd~11U7AUh~HF}yII>(qpy3S_q>>KRy5SwqiB7kJ05jf)p(r)=Z-?-h_8#%% zv$8DoyIEI4teP=bdpkzrMCV8}^jFLM51JBQYSnM>&zk!AGH|<5l-@!eHkt_L<`GR& zrKZ84FmB3{p}dyqRfA6p=Q*cBj%U96E8&|tfYgq`9%jI|(F_>qo9&FlL?O7bA-}*5 z9czN{paE}qGO*HiENlFg2G2M6vhWEoqTVDoRBJdSRvVJ{4;dk~y=hoI*Rya#KJbuw zd$I}e$0A?^Pj&6I@1+C=aL)IN*wF3BByn?&V1u~dexgW~>n|m0D0v3wbfMWRi-a)F zya8Ja6yI3$X34w5PiNxB|kptPm4Jb)KT(|lCh|?Y` z&PT>vf|*InC>853MTkjeBHE8w2^1xS-AT|uq)6tuL$Sl7>3x`KAcj?{*&IjyFd;3n zY<8D=oQll*K$+zqC{y==GS`2gOw9+%)a1%|8xCXPXe9JU%RR`45w8T8LwD+Lxq%%c z`b`f((0jQ-mqI4VNbofXKA-KmYwq5J*7QC*x#2ycfS*DJ&agWVmC^w820BisrW7VF z9w-ni7YOz`o7@ttthUKOEm4}@?@J%`bEMDiCM<&$C9vo$t23M}&3eETY~bG}{wd0l zBF&A8NTp<#(gJC6flu+y94gw@Ap~nsUoLVJZq+D zcIj-_e{bBmAqrGkt0Q>Mz8?3IE@x*n9wgY!9@zba@1=zATEZ8XTuMi3;=y-=sDSFR zIOx3iIF`uAxtLjiE%IP6t&|{G2abciV#G|r?!CChU>8+|~!3dY>pb^^XWg0GHh zKCOMQaiZ%tYZvNkIwRs1zt}&KSEG%Tz1B*UV1leC{|O^-C_n`#$>T&bi|h*v7%Uo;y{44nSZ9QqzFr~qV~;b(P~pAmNh#vCAbBb zAhKFib#aK|q=FP106q`H2Lp5A(A+$$BWTF02$lyPpvk)86;H;3;vFhQrwi#0opvLZ z@#0rF?PZLPmp|ntSqMtKImKGQUfmNK8kYP#kIs8H8QN_7xFw((&KPRUm^xd z6CVryH5U9+B1l@OS4Y?*JK@uhp%h>@%g1t*uOQ_Abn^r(A{nc`NF--z^`*{#}@9kirEX0hObYQmw7m^dEc9}#{t`PfUErLfwk1Ad}v zs+j|lR}ctJWB4~Z7@z#`31bk;E)YpLe~Hty8G{c)Nsqrv5CMQ@H0T8RP&BL^;KEfi zo%qLd1KN>3GRil0W~lg-=85d0#^TUcoSUrpMyD5%h~bF{zjGFdB%byi#02Z~nEWE1 z%JnZdB2j>X|A<>V2<;cnda((lLQ4#TY^``j%dU~bN?aI6n+!P#8-75b1G(pSkBMsH zrcxA87u`mB77ik6jB;oYsrZe`*j3ccJrUoF9^nhG!klA|wfYT7b9@akDd)aZC#yBn&}|6%QVU$obBDq=~m4n?5SkuShJ;dUxuXtZI5NE3_i^Mx{SC zxDB%j=6S(g68PwDUJzK2cN z3}#*%T$@Tmk|aq}s94Nd0ZGdoC===hdr2lRC3`?!Gj?q zS>Bv(&WdV%*UYaFxCiFWM2%$Ce=?GCGdA7k|4;&p4ikhVmES)ucO6dU=faT$|11^e z3$bJuJQB;|g+p=EBL0Xo5M=P-%dal|3FXc5k$OIDc-hhvVSZmiK|d<-hk zSeZ1K=s;xzhNV_~3_8N2eM(*TP;wIiT$J>(x(2iT<9%NJ{g?sPJv5@0X)2Se^~g!Z z-%xQq%zeZZKbR}tbyD#|Dz1mw;<<8t!{sPIUcBe54#k$mKjd(<{`nZ02hNE(c~G)- zqDtzFxMr)JUwpSo0l2GaKdAvNccH{Y*mfHE_lf15jmQ)eX*=J4cQBK!^xOF49~o?m z_taDHNSKB`Wr7JMH^LPxF=4h6!DF%DhTLX=g_Eme+}Yc(iuP^iRG>;Y!S+1|Mq9Md z(Af)v2Y0`2(zMUum0A)?$9$c_Izyl4E^k(_xD+=O%qO>Dbz!GYMTF6KZs_e6A~Y>A zkUFgby&l)vRH14pza}D?E5#nBaG2caRTm9G<5%6@zs7SSlsnJuK8ltbQ+5w|%yFkrS}Slx>k;Rp zC8if~kWe%=3V%V&^!P+o7vj_Jk)vX?L$)1{%%C&&WMBWMoNjf%klAXCSgTkSS+QPk z%2E^Tp3(F};mulVozr3boV58Mmivl((S=h$7o#s=&b)^8-E`Hvc5ow(NqmJe)JIU;6CMqmQJOZ1611@0IJ5)ylkGicL0&~rGjzp(0El7VY2is*>2WsUjmFwhfD zLD_pL{NNsf7(l#lxtr-Q&T7`TySPwBDz~JaD-Z+;Zto``=mod~kBw)|t{Fcre*~Nf z{qFWL3G#O*mr?d&*Z*-2&9W$oO$y_ozFQmPx&oQpdQ;mz^h>SHqX#!9HyF6&=zhA0LM|4c4APe769&V=~i7q7?thXADe3zX30NX(r{Cco|v=!}1` zyMW!As6!gy9V!wDLE2y}Xma6Z+E`*If*fZnw73pfEQ?XxWWHP|5J+HC-Q(8TR-ciS_I{K5^1IukU0kb350&JOQWr}HV8!#e3C zw`W*G_ItwUOTSJpVZWfV7&Kx5vA$6B0SWyi)M0)+*Pai~4|8*E)zI7^y}}m>n_X!GAsC=RA zdnR)>8aG^cIr=v&=#rft>Qe|(ymrsUU<;Kv0X_y;^Vg6No3u~XnoMv<=6P;Gp6}BQ zS#!y%!S!x!zGN!s#eMivo@{4pwl_$!2OxPM)J8eX4iK*M$!#9Y_J0w{G;x2{Y$E|# zmNt4J3wPTybErXElTclo=5TVzLZ#QD_{W&a0vqjFG)yitrQr7q0~p0doZN_=fJ1O+euAJ949`KS(?>qNR-Bhhz0yA&li>Q@m2o!{e0y z%MUFhZ#%M*;B5o%XWi3{G=w$K8@Ix)&efcqQu15o{tAHwPnI0^N|!>1QayjGAA=KyZlp+G>t-Z(f)K zrtd{}cD_7ocMhOeTc#U1XZbMCZ%CEY8t0ddO@C1DSeUO%sIiFiBzZ!ldau(X?AHj- zEu3G5WV%%onEK6f^Yip7{WyhfpUok+Xrlf=6n9F*iUjtQNIJH5gcDT_=jhGU0UgvK z4eq<$7ek2!rb8&4`S)!S2=9-&!qte7Df>&WY}VO|$R;@ts9PvY6o{f|a9`ESSTS-m zC_ffSolNZ@5}QaRp0*(BO6W=MP_AkH3W)c`df|gWaBe&w*4W1z9%!iQCY}W1pC4<@JJ5K}I})}-#;kbWjD9O7?t%|7EpeQw&mV(d{^;A+NDpcR%UBEw>5*r`j8(KI>Dajfpd2#_t@8LmFw;CtJ< zZSd_f?<2uGkCD|}gZ#Bdr-7O&RjNa*a>Aj3mb1ZWKCE$jXk&+b5?AkR@Er>0UwGg% z3@LSupA%V#^IYy?%zQz_%zU+Se54|iG%dsOWNXdGh#mE``r|Ke7{smci0#{i5$^AL zB4RuF`tE2?q)e9_Mb++{{M|q?$~o*z_`Gse~Uc)qe%);A?TGyS%}7umK+yCEUDx=Ai#RJd*6t4yz+y z5*lQYC-mPbsg{TS;g<&2S6y|?cSZHF)K$mONjJUDIU=#LjI<7KF|x!~GbP@xbG%*W z-Y}%*_f$$BieF$$Ad65=yW`2l!PzgjwWvbAzet#XwDJ)N2Z4S52h{V~M}>O&ked)= zqpe#|4X^=Y5VpMy*4J=aU$~hVi`I%Sv3?QP&L>m7_3guSJUOH0(}pX5gB!@*vkyJ& z%X4StQ*$o~!EvtZO74Y)J%roS{ymrkL;F^rFWX=rhQtBg@P+D{ZE($y#`~W+WGzfn zZecI!uNUs*&-15JxVGqjQ}S}TYt{a*8ofNAqNV?WHw`;n0rezX$gM zv%BowinWH70*UXn9ftNp4sLbM`tY%DNY&!y3o-ushhyic0~%XcrgNi?*wsZwzk#_1 z?k1QTEJTlhf_SHMSZC6bdsqa#m}QkAN(e_RJl#ZxC1*TZVHV@F+*p$rW^k`AvL@fL zhvPPEO|I!Br>OCo{KjA`xXHTeU3eD^%OiL%N}y3EgYO=RF0Rg#dp8rgj|JG*msIQm z8IQh?LHCiDOj*{{Te|btdo}a`<8RwK-i7trEnR9W*8sJt`93Wic}c|psN>stNOY}S zBVO&S>3FUTkrHm%hjymp8YbSVfIg<;>*8nRGjTi7>lIPq5*>1ygh{ zf~HwL-J6o<*mUUA}8DyB_>kv`5*>MzeNBv3!}bbd5>_GVQ`MvoPWej zFD`0;y9L(}Lx8=JZ&{@Q;`j%hzOM%z?<5l*Ti6@KkfF zC>~^896Z&%BOfm00xTt*9nPN2WG)Oz*bw4m`#N?Wow!P(U4}Gn{uU+opt(log;5>^ zbo!5&Dfe)A$b$4-!doIA+)T$F|Ig1V8etR*N<-0!dJCo@vWJ60CNrm7*~R3DV}1_JXdHzsb=x6tJ>^kAkGd&7a88E!EEV*77{& z9F*T75(pw`J;DRj*`>Y8gUkJbELllvCA1e@T*VUR=TrEzU&U22z05DSZE;0)udCaZAznF6g z)#agdrXU`C$0Vl@yX8ipfi`~=m6PJ|;G1{U2 za}-$_K}3RLn5kp*f+Cd7qMi4xeVBwB!QpZIGH%)hn!Vi1M)70xsHOOp$xRAwI1mZF zX1Tk;C!AVEQRme}{V|lFvEZx72Lj40@AN1pJt;|iFU@wR-ieVb-7KRgc~0Rc%2@+O zwyNq~#a#e-nfP4L>tL*vOop*=TdKv8FxP)NBw#kPJm|wubg%zg8RgY`hW@vlZ>^T! z!7acj#5va86rEyhu^`5e7^QwWrl|Kl32vEfIo|qu$SIHCtvDXQ$3Efw_wva@yBPml z&-GUMfW&H8#^k!(>NM3d_Ey^SOhoY8}li4cA6y?IFg(npJZ zeQigD0$N6!I1~Njz38YUY($-b%`2|8xUFfmlyaWv*`qLcDsT$#|2T_*dfdy}@=plh zC}h&kf1}$FB4+bcC`iFD`H>C$Z1^qlH|TERjO{C#CL+(rB$>eS^Z*fXh<<}6ILc|? z^5r0 ztAN&U{(#q)7EmJ{p zL_KD5yAz@9mit|GTF&Ag#9k{AOn@Xt#9iD3yA>7eI`0d1qru}I?0Rr3e9{?(r@%9O z7-HccUeY6^IY8_#>g6}?k@O+EGZ<_1@o?l367Jq=g zEIK`TA%VfI9t>{vU~uaPVX!v`gT|Y0##`qY7*sHd{}(WLBK`UQV|cvMgU1pC+haeFXxT|2#Dx9Q190d5U|&B|HzQ+AQ{T>jxmxV zwz04aF`@j#fv+X7196UPeKB{+#olE;nps^EkpWtUn06Oq6&wq0AwY0ngy@}yKq-R9 zD1uGq-);Q6S@`jM6G@|H0Os!%_SC{>=jtJcL(4@xtFG~4rg1yV+(Nt@hoe~d?9aJi zpttm^;$W^$WJDd+&K5u3FJ8=Qzs<1jM(VB+L3CqG`C>BxQr8p0ihP7fZb0$1;CB&J z1$>r%!Vq|*liBMF_h{?a&4ycturJnyW zQK>M0B$7cOx!L*wvdnM&OVws0RwCJzt2zZ%eS7`f99>1 zLsB)8=CUSVg4lopDgEFH&hn&Ei?_erc)Hdm_h$Lfo2o8|(R;d*UB020H;s5X^zh1| zherNjjG9g~b4Etqc>z1-eSWXQ4D=sHaq-W71#d)Dc*OauNWOVuQk|%u#N!U)`{yG> zu8ojg7~RH=K!<`xOWqyG2GxPUDCY3Ev48AHetLAodB*AtI!KKAko!Ohke?upsyOWY z$xa233!%o15GOT~swOy%IiqRi8EWFhZcPYSI8Q za&uExl&wug!pe2lqiLh^fGKPHUO)~=WmWQOn5r8-P?bgRDWdwnj55_T2oj2{)dx{b znEt)NWY|dQQWZ)kkXq;m3J79xMLDth$hw^ECjJb_mGLp#!_#6f-yZWreq6jUpbVcy zG=?(tugy~x)E28fril+BI_%V7?EE~!!XbyqM_q`-NKb0K8RDWCSq&Y04hj)jSo0SY z%9-e&k#Y^>Kv!w9Nsr|VLs~h!&J$2guths z*>u?mePniPm<{qF^d?>xqBNDZ*?BP{xcZgQk|ExH#8q;}V`rFyQ~p1oW}?|j`i#J1 zJ0zOH-HJ%#@lW3Q$ZBx$q2!uk|7c%}B15=9fSO4o=SZVll2U1X~P(jqpC8oq2Iycm!K4N3fyLuGLBZ;q)3Ix;~6v<73Upm#?@+ zV(j8;Jq`qV4JVr%T_&tPM6f}r5nbj4DlYE45=(u>WcGPo~H zkvdToq!v}=PNyexqaWF$yioT%4MM>#{?1SG7**ZpRH(xAhZM?*w0_zWiHBqP>D+N8Xf-ydie+aGm0jH$@|F2-DDO zq6?>wfab>aSH$Xf=#;tRe7>92@4*HP7b$l1`p$k33Brn(7Z(xpvAKjRYk3zlclagl zt(CtqSb1Zt{w*Ylor>(s+*o%T$Fo(@`r=>ULrQ8J#JBmfevzq5UwXec;%`LjVKo20 z8!?mvGow5S0S5d@xUIn`NuST=v)=y2MP;Z!aZ)7Foo{NWquV#%IfjcnirY6Y=8!pv ziA(<}XjRs>0x~G|NRYFe1U9Hs2=(c+I!XK41 zuD>rt%8N}a20ew8e&FyC-+-(i%S}*P^qFM5_U#aJgbz=H6^F2mmsjHdLJYn+k_Q1$ zmEq9!!rj3>03yVZN+n>#WX&XiGOF_hMi~2IoBo z{t16gQykDNdW$`Rt1o0H09g)v8@L5QnpQaO1mt$xfQD|Zm_}8Gt(aOBj6Gnjlnjg> zOkr9uPeMeNpSOFjTAv4#n>iC{gSm;jOU&NVUez|utYif2(dB>s;2zyTlWaToX6U2$ z=J!n@x};7%-F4d6ON;-!o!U>ti6T+6F?Jt)Ow8G3*;Bl(AqG^9qy zAemauJ5m0!CVUH8F+9Nhw?qdw#zL8a-udRq=Oy}Q>87E}OB2LYaRyL6!}s6A*z$V( z09QViPE+%GFc8nj0Ah2?A|f5(vw)s;XTr5nNWK~m?ujGG(>5{jPi>!~LLNK3hxDLh zN!({2vx7DM+EjQPxf!r|X8GWPW*>`70=a91{?m5CMKDBL?8*Kj$M)w-J9{kJzH9O8 zF|vhtu4|qzciiDfOecr{_34;YVW{ZW>lOr^`3!o;-PnBOZW>ME*&DV}tRO`#0a6J~lPVxzcaS6`WLVhsv1) zyf-!5kL52h0f^Ikr0s|&7&Iz^e&Vk@gGlh1U{Ax$RPngFw`1ypDoM9WyM}dx+>IDh@4)GK-`muoB5eX{BP)f z%+Fz+2%STos|(p$L;$zj_Un?FGt(wZL$l#EXVu!@HN=I{gaO2mmT$-wt}dP;|8DRo ziJFKh?~R@*$kuk-}JE!$;O3G&nVihHDU5+ICwtAO?BzjBaE`32~JwfQaOu z(xb=Cd``zGmeI+Dutsx=fd(i~jG-}V8DURSlS{A1F@Y+v{bhU4N2KWc{K zSZGL9`#Uqk0$CL3n(C|^}u^d>c90Dni;`zq((eWxg*i9^FOj)liwo_L^#9!n$o#0bab>RlpE3?u% zBBt=%7pphvH+uD9b7ZQF(kqvg+o{=FG38%XW`KV$93w;;uw`9 zKA1uJReuq~WAr0FOp81xfRfa^x&E}R7Z?!6A^qM23KTysD7M?)Guw>Ndiw1jO|)A= zdc5eit1vX{)#n^P8FC7VGZjyBVx0rim38&I&6vq*kpLG2t7ZYUl;A33*`renwHVPA zB8v7yn$p3|32^)069Y0H_xcSJXCXOO!8HOd^LrA<>XlK*2$aMX& zk%h6RiJgEA$rn|>3m}Yv;4#zUs|lRYz9{>F?DsB#VfJ!$5(HXpX_|33bHKX8pG#m$ z^V}u%#dpayIy;}Wsp7lVKLfs>QFAU%CZCaOg=u)a=p$1^cG1qIfwrTj zKuOzC^S-$4sP|gFMp$02l$2ctLLE{NDFV&PRxYCTc4=~8`t9E&W}J7_2BOvvyKntk z^3JmBZ=ajIvoinoSn|%P`M1wV-dT}<`{$jBh{m8>Zal-aOl1pVa66+6?WRnDP#_e2Z+k*(Ormf zqz8?<&YKqCPsDscccP52!XZcHoBG4fU1~k`XdL3BCt1he);lWm!YR}6v`6Rhz-qq| zJT>jntIf5{OZdXHN7X<}9GjuIy9`BkUOea-SmfXfMmE3~QI&NRRKV)VR4TY7x*+`u z+e;h0!PgB2t~s9T%yv3cLZevxBL;FdVWZeGCE+HJ%o=+uXN;_@h>fp2eY1%%(G|ii z@}M<)3x<}V?xx>G>zzr|C!HH{3qUpaiWILT)DtQD3NoMh4di5fQU$QoCE6z-ze#VP z+oT~ZNoK}U#0*WnXqo5SH=kh<@idVAK3*skUeJ5iDH;GcY-bc}$_2gCf5Qx#!V$+D zWOir^ISQR!-a{rq1PsGeyG?7dv%2J5CI#Z}=^6oNHbnV{M0EB4L><5D5oRB2JMdca zL0uwai@TBuuxpiJuq?0n@1pg~)a4m0V&3A(QDk=XPdnS3zM$2;h3a>(H#3KCGk13S z^`idstj?9!QH_R7-i6KS{e{6TnJGg>I2?|Xy^wBVlh!;T%g=(2Lp_U+I4iH$EaAj8 z6(%_5&aELbpzzv)&0kpZ=r}0{+R``GpZP`1H(2%3*!gM4zl$|NdHP)w(QUe*6D z;m)08ucPY&m;!?Jhvk*bWa5-qJsqjP42hok91{h{+?n9qQeyDVM6sqM=P0my^7Sn31{^EnGp~IC!gu;=tDA22m zQc`D8=`S>F?oZbdD>#Xe7t^Xxpc?p-lUhMKFy(ZvTZJQItaCwls}agp$SmXJrfN zZnS9RO?*${9$%JD--`6WU`+Ro)3}Gx4rWrlKMBD40g}A zb4LSy(+`-#qHXAjccz6ETY0e(o?_A1Wj_vSkoR~gf5O3D^)fL5{AJ5!(w3b5)x4HZ*v9`#QkOCq zo6ME}BsSLEZ%MUzP>X*OE0PmFd8?)XjHO_ zS3@uU@5lG8S3YWdE&ucQYCmdx1mz7a=~{G_!#Trn(?>_!k0Wo&!~ULeeq$k0F2!+r zFVOTHqY7k4^|SwBRKxTS@VR%Q#A#%_*sQ?du`(f zx@OUzAVw;XO9r3b_0%YBnb~7cf*U|unO@)g52nUsnSN5EbS>K`Z$u5^*wZQ{sY93Y z)WW33V8oeOZ95m2Cewv>&rGT1l=!q2aV7#kN=H&Nt4-17>Dh|jVLGz{6} zTvn92*Q}84dD0o>TH6zZfQsd`?4d+Ja0z$Ch8ou4PCv!XV8>_#v%vrIQ z&Pu3MjfkQ&b#D=!VH8uu#Z{)3>Mi;8K5P8u0oS6`(m(L1|Lo`jWNIKfS~aJ3uv?*s zds8d)x@W1zrZt3S9ocp5f+6@%Cy(Yg*8ps7Qz*Ud8HmZYa;`2Sbj{-eu~<)QNv@sL z@=08}(NT6!>r}4v-2*@36UgkEZ8f5*`lQ#~%5Kw8s;5o$TjO$;obQ_SJax<6-Z9gmECH8LHY%{mOMJDId<}> zzWFp$t__v##N!A|b*?PfNPAqpXu9)%_~e+sLihrFJU^Rrk#F!Ao_TYIgVRDOn<9zop@Kr(OyKs zwu3@r7ZaFjQ%|y$&8ta8A4Mp{A!I8 zHekQU6xa0Fhn4<11!dz^;s!Fumwvx*g)X^{K4E$b(|b3~<0ZDXjL%yWlckejC;sji1q8a3L2jxx0MYODdJVxB9&IwH z>Cq+LkDBdCc2V_un(0YabFa~EGVP4*Nj43=>flN*mnWa*D)pr13Z0|X{;xb{!jNJ{ z-i)Sxp?*V+{H4p6_XMnbUg|C_KLeW2kL&MDCEuhbGColaR_6;TN3-bqzsuyf#k+i) zQ^|w+fYWOppQ5Hy$-i)8$gH*6+*YI)QCiB;lWsxBK$?XQ_DOn7G%E{?YN& zlj=}%u-IB+lCHXiV>i(=?WzM`(;=2TLZXqvZ&Eqxj=xqvRs=O!vQE7QE!H8ym84RH zi&E|l8wwaeJ;8siCMVs1(jv!hs+n4aTMiSp&`3D~&VLyQlg$1|=uqRwoRkikX)ARW zG>%W1->NR-^%QpQ)4TR}IV=}!5|t2^o1K&rD<5LoEjhfL-I-1ZVQ*a7 zQG|V&To~ZaP2`T#I5U&!OGG|)_o*49*fB$f~am^5h4e8W(1pPR)db_IeG_ukp_glX1Cn^V&3c|01j4!b> z8^`0<^z38!HMy5w*MA-W(`fPJf;C{5CnSyQSAq5BRy?@vI=%d?J-5C8(!&R!D4i`# zVKV)$BJ7gE(M{>oz?*u(L!F-=z<-|icbV0BNVZJ} zL3z%LuKzL6)dmLFRF- zN(S7Z_fAq(oZe7R*oWrR{P~>}`(UvK^iyyW=bY5~Eh5IM5 zjjrMug%-hF_8F<4jnI>fawFtcwW}xT z=UONaWi$ABQ?iJA(4B;T`Y-d>9~Xe*G!@~LnFJ%}#t;K6fXthe4mngX>*?+*jI5bz`V|5- z0R$m-h<@B$U4^zOQie#)U!F?%k+7BUlG}K>L~rHZ4Xhz=h&VRe<+N)?nBIH-1j;& zS%>B-v+(;`&!+#tR^I>bgu%Q|a~F4~&cXmMynHSizEO%6==40`9IQGNJhW(n_4Ia6 z1Q8ByR+RKI8ng#7#P31tDWTE1cxgXiV-|8GaF|Rkl6)cJLU1SeI2t(oQhINIxL5Id zDW}rL4_v}CBpJxhKvNeUei4;MUaJvD?S60fKxj|PDPcnDe;hUpuXiiHXZP>>KgA8{ zbagq2m*|(UW6>RyQCTz5#rN!fk1#ARhn;gHq4%sMXRs4wy;9X3?A9Q<>?b5g2?zTa z#1q~i5P;*5{`>ZKRbZ37)+^AZz-L~8UbK9SEIZ0SGRhs1Ac;sBs77g&ZA38PLCo0b zFyJF)>3zO1b_LiEXKkd!Rwuj1-&t!Pe(4E~l+SvDB`t5LPlMf}!NPp+B$C+f{ry31 z7_2Vw#oWSR>FQ4IAXSc*HKRpGaJgmoQ3i}^Dp6Xsnb}3Szl7GshWS(I0J|jWL4uZ& zO%4=H(;r!H5=|A-hy1)`r!*2eL2Hx+0vm?qfz)W?=XVN06*N}1b_z5K7JZ5|&;_@i zSJf3u&6z!pna(rVs$*^0ob!e}Fj*mFgmn*>5^{Ux8s z^?dOB#RfxNQ$$d!0yGLTZ8T9ea4L?H5*ytfTX*>h_7Kr}V-3NOj0!ttv)Ay?$Q)3* zrg;5I?GkX5_JHlYtuXY#!^uAvn6Fnl%REKJ-1$CqvRyH^4M86pv-l!5OXh128uaFE zAJdRmo~Uz#q4fJUp{6MGDwJF#k3gpp^F5-|4<+0PV~$jY@;K8_!^p{4a~4iXQEVRp zkmbuY!`A8-qv`ho>E9FP;i3X$CrI}}E@Amm$H`43=YQf!pg39O>1Q0X?~(UofYK$c zEtYegak9x84gZlq>S87UgOnHg{i-a#H6jddvV#O4YNp99Zw#?ySHT?Dzf4p7Lpq}P zGI)QNB?O#x1Bg_u&RN%kzhd>#W9XDnJ+JQ5v+JZC;szs)&RI7~@@quoNYA5h<{mfb zF^&oK(SznuJ=P}P6RUIfd_AglWH`e!@S<;v>yO%`5XJ~4<^Mk7uIx0UQtVKKSGm`v zm?Kis>_xW!2S%N!W05vE_X(i9i9_K*2C9oQdb!X{k#04Qi93dFHHU7iTGSk> zfOH7bHV;3M>cHf<87gy3Pt2flwPfZY9Aw%U%Z)J=@ui(DQg6r(uKl}ellgjzUz8lA zX1VMclpF?QV^@HQJe3Kwp94<1;5{GseyE3XwvtWTfijv+7}M zfA}K{pP>9WJ6lZXcr-yu)TXga7@_~zf&QaNlX{Z=!&6s`#XfIv5RrBq`SdtD2iY!N^PzrwNn=*uZBESR~3GAZ+hE_BKbkZ3X;G40*s+d`Z9~4Y&?35!C>OG0!W_ za}fpxr@6&#@L9B&s0Jt5Tvs~@|6m#tBjiyG9s3T$e$se3S`iT>Y6hBPVwM02h~}7> zB|vy1eTfK=5y^EfOo`v|2+I@G>14enO}wa_o%D#9S~c*eSm89oDHVSDK#o5p3dqky zB0+n?KgON?1ofu=OSJ*?A9C$QpNEYuXq*_WZ<|m3S^qNl-J}p!S_>783jf{jD0wK97*c z6<$bBc#(ZrLua#1@oI(6(Mcox) zmMnAcJp_`e_qysm;(&|#2vFG!^_|L04S}!2!g?{ojH+xX7`*tC%Z)P0gjk!;>QDKjR^Pb&AhdY6 z{2|sxp>^chu(|Q$3Ku)AqirFdYdj6b8m9oZx2OHn)4sgSrFGEXr8&*eX_xU#;nMz| z$DD48r6)X$Xs+nW$v0I_BP8ek0ig&4)|6GcWVLYcCGXr|pD0^cwZb>*G)JHqX>H_S4anmwsm2FEoEG ze;0Kh-Av0P?L)JQtbCsBjUiL5iO@fW@wC>Nj!T2riKGMl9T84; z#C&zxNyuDi`rgMEjHWDGO=1^fZ?EgkeC{eut|KNE*`@9LnG6%(ENE^-NSUJ#LC04t zBIkwXD(brw4aJU3X11csHl9HY*6jRmd6N0x$>YO&;D9j*CNyLhQ}W+DSB=MbmFy~- z;vd|&d`Z<#b%^`{-j_-5T7VVuy~!svCr~NgqT{`ln~J^JRuz;txp=7 z(=ybRS+?r%v?p&AWPC2-UNnmD(t|LIlKDF-Hb6$5VXbk#PJxExfiVp}aImwVhWcj@ zed*oomqt;+al~$WuXY|G6ax(^97NQ)OKf~YDyhnumlL#|Z?0)wk0>y2s3zag7c~k0 zMM+aI?Y!?;n?(S#T0)Lt7RL1}Y zd0)aIQ?03wz(kE7WBA#HnMTUTOtoqK0Il?o-jviYXe6oGqYLj5uF-2emDJ>^r=zK$ z5ZFJZOtKVZKp&U;WjQq1lYQ0e=`-z_=CyF73Pgfle} zq0+4J$`!zL)||whU6Z-q2Jb&9w1|%0?gb#lJfq7swt1de#=|UlV*I4>DCTP` zvnlBA<=1Ne2h%45V|X=LkKHAZ$U=}A^>--{cTfAurN;*W0s|Zgr=vT=+D|iErR7_3 zH)&wRz4E%;evMh{Wb>6zpab`^u^jcSGf^pzA*Bf>|1O?XUx_U>JCN7_*HZou66 zvUf+#oj-ebEM&ge^#73++-7qzTpCs)M5 zdn#v8PuzJ&{tZD?on(jZGeV!3$zj_uO7o5d8=-0m??oWP2H#Fhw67?xlf)z@6ZJkt zKUG^pEB_53id@@RMQ6ToA$|FxF%2b#oh&yvpfhWc0(oGiRMxF=OrqS`^I6`^fAFSe z`IFjUsdc7DG8E{{&l}JlMU9_KzUN1# z^!^Xo;O>l1@?$?aPBVahRPi;DG)4CGe~wa(gd3xxJLB^d3cFu9hX5gNahGqi!sqs% z$BQmgTM96hH18;**91BY$6f#D;?CBgc!ulpe4DWLw?f@5ey6*?#E_`{)9QKg4_*!iqd@zs;2J#Z-8DU2oj!}~W9QZgLMGiF zb4VAzgi=6E?hqaKYaKP)GC?}-PC|3^R(|7t1T&Lv*HN529%w=ksFjee9}C68S!0kY z+qeiNH~1r=x0>3Ol)(!>?9H|kTx#~^E~M26vv*)FumVs*Jr5e5m&tqu-^Dm!szGZ{ zzO1vQ!vxXSMjO{`HkzPIXUd4stL8j8!CtrR%^J3j;fk&T7Ku5dz#6Ud2@x}lhV0M8ATVj(_- zrfJ&6{+4rNuA%g^`zxF(i@L2{oCSmF(8d0yx15=*($ZDuLC&2Tb64n1=07KcPa=Fe z;>VJ?@fLguLvtPoP}3+CRw?p7Y7v z^YJ}CQ>wO(S*M$Gi_=HP4tBdU2Y&Vr%&pa)$LEqqOROb_i&Q2|Dr2vlg=6X5T%zWKh8g~tm1hVkVw`;l7XiF7Eeo-^cwy?sZM*84i?RX4|qR(yCp?^8oM5Gz$8p zPHP>x)Dm)8^cmT~&!~BjUMzco5ID)fd~3tpU?*E2e0-N~-s zvGBA{wt&{JE!Mz>vInf62||I5_==ynYhP;m&2{6Thk55wr$dMV-no-YZ?V# zH{z3QK!pwoRLtkx8UOx>kD1FGTDYpNi&INJ-%4L*^1GbhX|<(`u8h|E1fo`|c2a+A z?H5?V14WD}=3LQpFo*NDXWpd`+7IJeJ`s0oCyl_59=qfz+|cw4bP_)`}yh+xOP6((FfUvtAM0i=c3NnLVSrai5s} z7I4XYakNbPN58d1*iAhCrwHb7K1^q6)SX+ISpldif@OHx#~a6IpB87LJmu_IG}ZuD zc-p5L$-nU|zO5!9R2H!15{jOJ+NFZ=>)!^JmtFuVLBk8-mL~9T7MLqhYS7pp1~em# za(%R|M=O$D7$i{$ajs;z>PNpe17|`vVM+@R4%nmz`_ ze@=+ikG7LfE!Aq}FCueUr`a0>ch%*$fx}c}YX4{8ug$QPSMY9RW}4l*G@JFKBh!Ag zv{HL#iJ(HbO?y=nmIzO~p}6rPcH!N$lixUl{kP#XX(2t`W9DBG;vi1haAsB`xoK%H zmt!NTpG?vQ=vi7syR0Elo?v*5#StE>wq|~aCC`DYc!0GiQJ5vZ=p0fuicHUj&Xt2fHgxX%+c-Lc z`{g4;0gU}c1adL}M0^-}W^S2okPrEz7$~O@wWsFRNRBXGlaO%UgvHp{UkNB`E*7Cm zhxaGRVj~vnOUvk@7C~LjUsOnGbUlWP7l;zGE~BaT4u^z;9AqHsHr6QIbppx$8N{?L zLe1z*5F0^;vdjg`3-bDJbMk`g+q)KH%=~PBm61}Nj(@9lHCH$3}fwz?wj+&m8;bQvMa@2|%qn3wm`fvSW&5 z&V=zLyRABfk;z;RBNV8S4FH8eAsZQ49DY{yJa>^IBS*?m@=_FER4M@uVZgx(?-4jy zd|u))L_sj|%E0r{t&OHNqhfA?6r%3TY+XL+RTpTXI}rk09m1wBn9Ot_gXA&Rvd`u^ zF)h#%XQj$C^i@PoR$StSR6ZZ`6HFi!XzK6BpmQ!&o|!hb90lm$JJtAXLXo`}f1JSW~h4{$LONUiEKpwfJs zbd5-Xrv1dwWtBj85$)*w*pvrTZ0I+F5JW9Lg9FOXBf1D>sJ<;^v(5pT9_tQYuScWHAei7ekxdoR=dhNW}DI&*PAECZGpeM3t zr6J4vjrptW0L%_ctq?JkTA`kaIx#=I(gPFpN*ds7kNakp(u<-@F?BiV*~s!ONFe2>nh{%M z@@KLQoE3TysX`+D7Shr?3oQ2@GpB}$y=IKH4hPuIGvZG7bbr(Nai3jjGLvFDuYvrk zMuSz4@Bay7eZ$`m>mI92_|nslEj~}j#rCj!aZzTeDd(fyLdrd%TxZxK_}n`G(Bx&V zqfE9taA|Oh1*nN6Obsg`*&?d2ku+QW#xoh(xioekjSV+&9u3&7)63cS7v{5(ymc1+ z@%PO0{TTH%eqQv(gIrPhD3$ScIxFnX85QhB^qw3z_4ZL=cfpwcFPolc`YzPmb>4gy zr61O(oOQA<#31g0or8x5hrUek@jaOzdWCzur`eCg8e=Ec6$xgTd09Nhi33IW4yNu_ z%9GmUEU!GTjbW#=9n@iZ$Pg!GW~XA5fCq!I&*XpU_~5EI zkXz=p$-?lVInI)eM!s4=6;W+~5mcKdvS}B>)iY@SJm#Q?Z@l~?@zmQhFMNrj9*`IQ zf@gF|)0b;@E*N=x=D#Tx+dntf0Ujh0KrQh?*h$~TvkN|!+kZLR;vM&yOHTG%9UT(>A+}4(%^pXbTRunPdiLUh`l}`~y^`$`&}qkMY^8Q@nh--gfcngL>K5O-qlM zc-C_z^j}dWsYXVHx-yzQvU%?`i1(V=RYKaM#jfTsPy~j-n z8lg&{Bf#r&yFW+_f^62wS;t{uLP652d*S@ed;!~ktO>);EY6|AzrP3ux3j(I?+Ri4 z4OLNN1rzF!D$Wm(Gqx5=blbwaLvOj3p1-T>cJrq$m5Tv&+w0oEOd$i zoqk~R3fkh#T4YRGS27)9_VI}QAsRD9iEr>FdskoLu5I1}Yx1=8vlnq&oH+A^5h?5Z z4~Az=i*x03( z!!7L8{*ZjA$NW6js~@{?XHRAaZEZ6V0JOzc%-je5c^TSasJ~XAb-<=knT*ZFiZdCj znzJCdx;VK(h6%|HMYH(3X~}H;l?4MWPhYW_u4T*Y4X@R3BFq8D z(AxL{mDzW`cP4FcHuXZ*rGLi_++|1buAK55Om4WB7sAO6_wkeHIKtn8XmZp2{05Vo zw)4}y;kW$FtI|zckl|rx!z!ARQDqOvnbG-#nwm)a@8Oq$8dQ(Es$so-gk2Wq(vsYu zZ;{?7O9tJ4*^20kr`2=!$3BmsNu9hguP^-{tgM#zKvXKlX#y7zXyGl|5>F*n@wyQab!GRfJeFT|b#OmswLi z!Q^+`&wyRtyi1w=gAJYTw=!NRLzGWrn&=nB-72YzcJu9smN+z)l$TTC1q_kw?Z)xX zg2~$V@Sc-|-fU8t0e`gI+kmNM{q#Vhq1;R7ylZVdMImA5o)+HaW9zT6?=;_bH3n|n zefIiO_2;y{zvfKS1|oV~3k^g*k8c05Syirj7>nj7*Rp7AcQx4VYOvka;QVqkwPf!! zSM9>K14YR}%{OfOvK=HgnNV%$r$BdRrq|yyr{=->LUzm5GfhwI56-z$rbCTiK#ANO zm!s!pFbUJP3dJM;Cgo^&nma=$lC_Z>Z0HI4>Y`$sVLErrmLCA;%v4av|1a?n42YSI6s+n{olHv|0Dw(K3vFt zk`CnvhW~I%H*u$Qai$&V_02SQo3Y=*0A|znnd+JQ`HM2_boZ{l*K~(JSDGvNh>D$-K>QCdT*38}7?abx!rK!Gy?EuU#(fp?WND^0%p?V=+2A zaf06S@({86>F=*_%0a_dWd!G# zY1bIooM{DIt}T4+e7B^4$5rhG)MftTU!j(c^{3diJUzHyN#3T%px+eG(CLoI01CrP zD^TeDDhOWb`))%1ZN4rub~#PTjO+aLzpcyksB4pV1FASN*m*!aZ1oECJ9t5TSulBz zb_6vJjl|3-VKwkvuhIOj8vf;tFW-?Uoy@nD;UA95A~_w~>b zaz=3(z!unc)oIkk>e(UgvdD@j-+#VsDNNM#_rA>iN_)52UEY;^z{ym>j);W(tChn* zTMMrS6^>J^QOImIU`bb@b^6DzZ!_Kck5J*{9xU4%-hw$|-P74tgQmj1)t^ThCBO09 zMRrT~3bY#_?lRX_T9Y2Elu{l$JuMl32-w(mtw?leKcnK4*2e41B*ZlCo~PAW@Svm4 z)+G=N=x?GuZ$4ludF-B;^U#c!L5Z?o&E6jpjb1i7tK|s_6RUL&CU;+f4RwStrWWDC zg{Tp5JFC+4NS_Ot7noC@S8rJlb9*(p(&@Wt2XqJf@#H|_>#j^qG7l+!XJj6Sbl7M! zH!_bqR60ZIPyhN&5m?}zH1Aq6jX1YRB;K<5uy(dwG=W%a=j|62@*8CnhH*VtTV^D6 zbVAf~KvY_k!y$$Fi=kDkT>sDt&!&4`ax1MXtfucRI?w@iLNVHyA)$wSb z7w89`-hnUcrHivKnJnX88O<$QI}a`?->jeDyHj;#X1(2YS77@!bo+7hU5ElE0bRHK zuZTf4gk!w}Q;w}Ed((@&8ykgxu<^{GfA6{qV=ptv!A465J}rZpiS{5of&skE@5P9OYtf*128IgZ zh`UFFY_)!cX^YG->fEWR9rg5r*ajS-vqAe3CX(8W+}YW5ltE^Ou!rgJW@3c3{qUAX zc`o59d&7fn3RkmGE%wwdu`k!?W$7;6VB(XTemh4s<<;Mk=y;EZ{Q4`6q4B0`KIaOp z%G9o@8`2kZC_D)}MZ><~2z7UF*gP|1NW3AMdD?68O={cV5YfHiO8!zLPa@^{v^@Kc zA^y@(P0{qmck}ZGiuSh5sU=xkSp6k@ynwTFm*Ee8q_%p3vwuBXIqPRw58pmp&DOT@ z*CY;n+TQRB!pRLoXCi^M+ppGda+BgRRWh5-r#ex<>~mm$e!%u+ZM>3J;hv}x?rLq+ z9zePivKPQhKMaqx{(OYgXkymjfGe{7f3eLS#{+8L2lg&a(L)1&0g`Y1=iNLL$aC7j z^Ah%!%G?{%)UR>c zq`4O0wr_3x8r@-U)9&tn)@r?gPylr)1pHif8y7J3o7h`|Hf~foe`4{?d0tIS0soy< zw;46M;sQw2;N*Q7fADX@&Z_d5sGdl3r`l%Rr0vo4nid3h9*ZrOJ}Tl*rr-4GB+WY)PanYGZK|i)h z!YI#cx5{vxry{%6z{(`&72B2(8kE{b9tZgDwtTVi__uJFYMe+&aVAq8Z*nSK@_op8~ODEvk$3^g&(Ec3= zDPf_8O;4$x5dH}j6=9(+^%;So@S4YeC_E89^pLP|?RU(Fs^g{BT1!{*smtskf#EI> zJf^yX&hl>n(bbWD8fk1@z_*9Jf)@51AWa)YTk+Q}LZfdu6}af}#tD4Q?t#;-hf^*4 z9?>9L;Z&RVYk=_9&!fxO8qZ90;r#XKMg&wnaKJANT(lc&RV(^*+u3br9=nxSh!Lox zi5OU8vhnqHpE3-rxX?p+rkEm<==A+yKu*D%4$yN2`)Ley&n<8C{#&`4(KGkdc8Sug zXb*!#Dld3YlRc|oU*N)hfr1`#BS5~0>wXXWO+ioFC%oG=Vwu(v$GHT7vZRtH9aB_6O@(TaTUW?HfuHL zma8cTRdhX4U&f^BuH%n%l4AFyFBPLC{?ipKEqmxOdBCHK=jQo7OwS?3+V)hPPZoE( z>O4BFHF=LRrls%jMU8Z~;Xi99rWOtPM|T(z;dr6F)4WIqq=imt*Nwb3E3vey5T9xnd-fAi*n zOMg3osNF*!6-8WElo60;FMmPaUnb$-uTu_VB10&BASE*XGiQH3rKmw9LRp6~ui|2M z%xTP|!Lghfk1{5M@$(n+A8z>hf5CA~Bz}mye%MZj(Ytg0nO0`K#@u8MRM%?^4oi&J zmdf0NB0L6j!nZ$Szo0=n67k{3iz(w&8>!P+ ze=)?%h7w&85X#Xbyj{ls1VcFc^Z5IiU4=`vSD%neHP>~un~i}t9;`p?*Xx9yUE)dq zsn^ClXGy^@EI{0j8Uu*KS~?}NOSEw5riM zITCaN6~_=r;KZDnKi^1z`9?~J- z0LCxE&|RrxZW-L3Tpo=I?ms$K4@G_N zhJF9(^4E;NFoVpAbFE8J)azJ?XS1!natB7`{7k?Hp`sP!*F(_iSUky1#Cw=Yl;#bI zHIq!LMTm!}f7jYz%vm@*j$a4nI_L}d$cWgT;p4r$v!rGck-_*n}_<&vq$4CRFVQqX=gAbkSux0t=yPrwiN#iZbZ(!?cR zgFeF5&!2*H4O)v*)}nqutT`qCOY%S2faV06=JiE=CqMs`r*GgiXYok?$q{@4xK3}a zjqgy^_ThB}dCtOoe{W#>&Jm93C{wbhFrR@0uI8@PiGt%NB<_AP=<7_^{*yFZ_JDmc z$!Z5d74_lYP)6(f*2W2J0YUp^;jvDjB8;18likyIQm*y_{U_9t2_dJngiE9IP5dC8 z3}k)py6C+@<(RBC4w-Cc$-Ut>^C^bBPX=^7M!}tNq6boJuiqi&-KaiY= z(Ipb%g8m}`oFU+<*>xLnEv-HFx6EBN_OJQ1E?_4}46{2*zucJ*JNQO+qeZ9|%o|}d zxHW5G?s5o{-3MJ|5hAFy?1%Xy7WaBrRU-QN-Q zPKG}##Ru+&my{&-aH`$(1WGMzo-fF4rOvIV+3s-e{_4vdT{`TDf8lYxqh0P*3VWru z&Kl^GH%WIxbl)?(;Z1n6eD)IZnbJP7q(4@MdH>lM2Sg~ONc~VD#FpkDgL@u2d zfD;Ld0uuU@z=?Ly$Lpv(W$=~_<;b4)$n%Kl9*FPo z^c4n%YU=^EBXM$A6O|Nejed&?0vDpn_7>WTF3i9GQo1m^k(rb?5n~*g>_arqt$?K}J2cdK*7iDRZA+jt_i&+l za}TJq-ep^S_nH5+)-Ax*QN$2F*vR8ET`?{byI$Ddts7)z zB#!f;=c8~h0Q|HZi}RByj~djE&m5Ly(c1W==5%reol$&AIJpYN`upw`pU{4=Z41BQ zBh7G{-|*%xO{%Sedsqe~?F? zti8oIEX6W+5|yAR2a26NA>fkXI;lkF0=0M$MEG0>*TOTEHUM;^%)N&cwHL=0BATpY6qiL2rWth{0u9ev5W zpyafe{zt0_&V5UhMlXqzRlB8ET^qru&*XmBDk;3|7Ehk?*@a7ZA{XoKW}d=HNKh5& z;x&pV1mmdi{GVl(BpbZF5<{y&^!ecyfR}a?J|OZ)<;1MD|C+HxyHzgdFu}!hTF}>n z@3??CI(8?JdW6%L04(Gb`?iY_tUajK-?MI_ad;d-c}8*;%w;OE$v50k6*wEVg5)<9 z_|_2sL|BXDiU5lwv3nUDMcL|#pD4Ho*ATeyhJPB}L{yI)x;lkJadh2>k%6Bz%oEFm zPl)1sKmwyBoWtm4E?w(EWikkgHToJ0)##xj1_t&<(AUYGdLb15!UD+oSMeIWwX+5l z(5ZM#LaNC}da!Vj@2q67r7{Yo{HXo1=?~n|Iqil558AuZml%?kE?R>9Iq^L#^Yq0; zf~$rgXI|8aJ~#t?jB5LKueNVpI;uUldqu$`u=75yUthad?@5)JyS8t?aRBI@5lBWL zOwma03Opjl9o<=Gnt+TLl$sCH&tO+8%=D*bzK~9y6nu)+`V%@xzzAV}gU)vVfBdbn zVh=k1kPpDW&uPf<0=56%Fn z5(Y-;&0+tE?*Tu`3t@Pbi5E#{bN!3|^*N@Tb9o7aD^AeMvZB(%+nNHPlvR-{qn{(% zwdx4Qb*OD!QpR^zL4&e0Yo~s74|Hs2mX6KPpvJ>@)%|}a*CA7G=by+ZYBeEwV>Oc^K`NmS}t{joK6n&PUJUU zh`eDzd`a`EYCG6G#D>{FK38?Vw>dJ>6QTNbhcCFr%knVpP*BFMN8gqfXw{cw9j#|5 zcC&u*KhXR}6Rly-`PJQ{dydRrC*dno7!Rx(W;9j{un*G50lmi1<7xm3K@EB`fSA~+ zfjsSm2wcv&bh$CTW9K{&_4VYA2dKhJyk+pBxw$WdF$Erp_p|I+sgp(Q28D@q-9X_j zo@mcBDpNzZCHe zMtp~K{ujY6@IoX_k-nbw@FZ>%0+B=8sS&p}{0vNJMeq{dOD$gZl9c&0aTl;-2%)0) zXxP5I3Je1{9=p=lq4A;3(4d4Ynro(oy3Xu}SAf&@;!+^3E{iz7nx+}q{6>$NN`;sH zB-5|0_mewfIi zaY~Eit7~#yAd&h}U83tp1LxFFFu#_f_;+$-wU>yx2y`Qawo}|%p@!1=FphR{I3$Co zv$=MSh0yjmd0OL-k<-nlImnca?3HP}LXAS1vo3kn@<0cTT!&^9?V1JAS_XaC=Jl#u zTD5MX7)*z`SyzO8dxQ4fmHIFVk$zF0r`+&MA>%Ja_0+wOslku5>Vz(UrMyC|oOCDUI zmTMVTz|>UBr93a1s)~;;^^j1`r3QkH{~2c_Vja7PtmFfGJYWy&b>7^Sj6S$R-#sp` zlxTa@eaZ)A^B67RknrA*&VDlLT@jW~rJWhk)@+#}Fd^Kjz>Zh2ZZ$*ESRQr&uC$+v zAasIZu6^!d8G@D!ceVxl290&&n;{QZcjg1{_bpPF6J>J|-mCp#0#)R-odSogX-#E?p6{uPj{?^6$b= zkhLu`#Gib)8-XEw)OmS8o_K)qB409Cx(0(7z~H#%*f?1Vo^>BfB^f;nrc*S+@TK60-0+tEAP0y71KbH{zy0JYiC+t+YgSz&F9E?q%C)+M8%<;g2sW&CWF z1fN+2%Hy6@$8OeM0W~_?4z*zxTb&pD;wn4TZXR2{*hE|H(B@1?M2sD}JrlZDAr@|A z1lb_VY-GO~O*|JPf@JNrB7rcgQLEdmQnN(OlC+Y>5p|F)0djb`0fo_Ww%z4Tv8(V< zN2%A_Yg@RA56Ln0tf2pd*hfQ*nW1Oso~NvP=s=7PiQ~$=_z+tCRK6NKG9r4d#fPm$ zU6iwChq|33eo>FL_<3?P>_EUNU=diPM8ukQ$TB#a!T*%;7Gugoa^KlF&E}f4bXDT0 z2Ly6}0B`{PWcm(naZ-Ki4&@JV zYD>pCMr)B`;}5m*V-z=jvzaFYSQ)D2)Tk;zgK=5J25BrATZNSfHhHtryGx(PrvaRM zc4Ye~)B!vR!B%B$+#`~?9UTGC>_sIpdtQ-_3IR~ox+4WT+|%hu zk(xODA-)L`q@H8D#){g*VgIi0ebhz5c@#!|iP5;6gt7GoeI>?1OUy9ul2a8(|++}TjVP+R@o9pn$T9Snef5hc1_6(rGc0T2! zs$}oGtN#yUfZ~t3IS!HIQRQF@ipIP9|3gf*^Y5|`aQuXP2S%a7xhwAyThZlB38q(2 z;l2|AC&Im`8yb;mVw?(sFb^oYVSE`rQ~yx^Npu?EJ9dii2**fFzWyWPJ9dE+u1ENe zNEqOf*`0*4e81T=hJ&(zR_C>5efPEHu8}pX7{hJ#R6@bjR`I0Xh46U zxrP#g?V-F+|6uv`_`O zGC--*J!>SlGlbONX~QlHIrZcGZ(1EbV@c1Z!(G?+49WmO`<0;oc*8t%|Atil2Uuo} z(Cr<;#$jJi*zT6YR}Qln8ci`y3K+Q{%FEyqt~zYyZiG4^|I3XKCR7K>@hOZqb&jkN z7t;Qaf+{Hp-Z39jT#uya!l`^m>Yu_?cEh~(j( zY{2UV8uv%Ark=|EjJ~VklF2E#V)>xYD?}g!! zecbCK{(bA-A!qcf!y)c`>^)ztc8V=X1#DJ$4Y}@AyzMofizno{0e|P(2`n1a(5szN zs}4?l9pw&uo&@P#kuVMF^eJuuNAv4Kp8fu=I#xX1UbcZ_iZF+9sSEUdK(F>g5iR-Z zFe%>iT<5^vuWHU1+xOys09m!vYTv_xuv!nRvt4uimg~63Zkt>;XG)#5cuHLoSg#NB z8^0B`UyeE~dfy8nCkA!W-(h6PzGt)j&z-M;``D6c!(i5Wdb2{q9p)ZZ=zq?NK35l* zQvx?)F@KUJ<{Bnx)Lt`_ygoXpaX9G1=oi!5&@lM;`mm!A;MX(`bN}Qb@$4eUyC~}G z5BuP3>;gEZqiBKS^-yhT2^VU6W%A zGP54R^Dvis#;X>Z33+B0wNSIEyNJQ;s3{nM{NLKCyg|<{L5#Bs9**Yo!iY&1P}L0_Ke|s8 z>6^Jpz$F;_R&7GuXCujlMH!XBiZI07@)#FaDGnVBYXzRia+J0TiUpSzMUq#Pfbp8< zetRThKwe`>*x<<-<hV&^^L{$zu>}B3UT=#n^C)Cj?;m`u8!dQ{j;(nAH=* z{9c*<>rZ>Glw<`ZrcS(H}Dh3l= z3GLzj``P{gu7?%#nUnTYdhry0E*=(^lpxzLgJKXGo7|qcxqti2HY-rgcRx zFxC^Ym0wzlwR)^L=Gz0hM#Q%#nl!JHBW*?^R5ebY2YbT4bYOB97fexrx;ku$Ii=Oe zHZl9?B`PXVPRCo#1)x^m%Wdb7igCO+EeM5cY;T!8*f*T|eF@iw?hU8-5dAlKkezk$ zxlKZ`GBkl*TCV19*KINh#+DV@6=>aCe;wmkhR!VL!5U5`xNSNW6)m>!y}te2frGw% z9s{2*H!d^)Xe(JeCZvSPzEuI6pu8+*cct%n9-JZ51o|9^VU_6it!WG-bS0D@1U1+~ zlq2J~+DvciLJb_9jGzqDjHlV6C?$!>(7pymOyusCA{B1n0_>*{&u%f5=_{DgmxHb5 zbP_`~l_YL9iE=wipv?p{X);n>7e`?Ys{6EbRT2Cc6 zxoi0;s?vJI5LCkvso2Wj zOUnS0z0dr(+lq7Tsw{0Vo>C%N5s2hE_#7>vst6fyVShQD^dG*aHY||aHhl2Z#Vet86iV)Ghq!E z4w}`5B3K{R#$q@lVJbO7LcspMwmtA{G%SW2qc1`VaCr8O^nIwYn-;+h5wl;K zfRI!VmUogl$}v)AMix<36A?+b)zKtQL(W$O#s9>(Sy%UehZ(Y zW=bqR|FuZ`a&(Uuzah1AMHX|Ll`o;1NjxBn?WjR7{bY#;ZXmw0tPZ~}!p4ux<%2;v zyjd)VH|C8A**Cnd=(ty}P{)wG4J|&Et)U>B?F>`oXmQ5jj4Gsfm3zeGi%;ZdNChf) zfKxs-g8L%RNs!QV;*`|a>z(uXj@`V3->>$?Y-6qIW4x*iono=dIX15VT9-ED$cY^s))2(}A{>Rr|KBgbMFn;@O4dj}i{E7KRkQ-ezjKj0} z_D^op>uN+z@^<&x?FRA`FCrcl>y&9OT|==A55W9yFV|^6X+Kk`k@)wI@S{TORHzCQ zd&=4>?xs;(aQi^a5(GqCsH*rBEySd|Tq5ybuRrCL2S}IUZEcmRygK4_-yUCzA@9+& z#?CL^Uf#=-r!yL_K^xU*Kk(ftd*P60GWQI)P<@QVJ}U3iNSiS~XqG3{R-=>S*~5`F zP=Ll1YjrbaN$t))jUAzv)Wi-g&pfW#7w4@pvMK$@&rl1d7uckry5wT6+r7SL@!@%5 zQovONZagQzncCc$2Y*I4#4li)>FXgKQ{hTPMM39V_XjZp_CI zqdh$V;<04lsn&zHcn3aRe`e6x2zD?hC6Q>O*mxb(aIwbm2BsO1k{%v)D_fd3G0Oh*qRfIhS` z=ZN|yL3+}i0>O_m3inb0G8A}OzcwQRbclVsyRSm4>IRyxNf=0C_2e>(pjc4iW%lS* zny5WD3ge?FkldjqBKelaHb{wW{5sxN{^t3H9IupX^N7|)Pj1azAG+9PItG%zU9VG# zp!R)s&w-zZ{2-8TNZ4>h>~T4vb`+E!sVIp(($UYuGyIIrb2_mgJg5o~AI!zbck`m-hpEzjc8rbMD>f>I7@9IJ8};BA8x^MyQTSm>$g)wp zTsErRGxK0Z@gOkgha$ni&W4(_IxJoJ*_?VLlfA-h)5(RH!I?}AF9#Bj8lqO$$=cQb z6GJ)7&pMU>Vzq@2F>GHh00G-J^Q14}dnWOE0jn7Bzx|L8>c())@wSTROW!`JTr-Cgz*0pB4rBz%ONU>-yzIl@RpXsveZ zEN451tKFN}b^0w|KmGzBWBn)khf#lTEDibl*8OGB|19P{bo!Hw_`sJ4HWq0^BJf!< zz+3DS^asH+5+C6Fl7J~ghuA(ycX5VtkCu_hQ#Ov{Zm!FXbNZmbE$6WTt;m1}}{*vXAG!FZw~H`WB>i5a=ECKyj> z7aCWt3C0t%a$`*}o|v5*Yl88F2<&ksm|#57l-uhj7*Dk1#+qO}(Uu!)g7HLqZmbE$ z6Pt5mO)#FgJvY__tO>>w_vOZ#U_9~b+*lKg zC+^RUHNkk|!Q5CAj3>6|#+qO}@!Q;36O5xnmecDd7*FiZjWxk|q9-@j1mlUvb7M^~ zp6JbuHNkk|>D*Woj3*A|#+qO}@nUYQf@W9b7)mCFObDF|@u9ffW>3`Y4KRmcn!}%J z;-C-1pE|0iMmf+-ZT z_Xg)|Q(e}^cU7_T!(vK@AGkC0xnS~Uq*>orbuRQ&;)o}?J`G)wT>l1tZL?1$*B>#@ zuhGop`qy~I*`)SWyFDS2I(gfX6G#n8%)SM^apeChWNUk|rrtJaLS~N;ErLXkG%aP) zN=(SCN79-onY7JRL)vB&GIO7_d)+imQPS>r(=@S2>vYpJ9Z2gX1WK0q;`Xzl6=3fz zJ(oWr6ae<)8Q8Ga`mlt>MNvK8-i=T28)6>A<3nn_y@GDS*D_Seka1u924UQ33mF&) zQ6r7|1yPblS?j@k!AA4q?;0CThX4|d8=vA}#I9(clrZ}~BBmnh+_z_g9c)AS-XWza zU&_d}_eu%UyFSr{;OQiqm$T>eC?>eR#FbUKaj>FO4bLcbyr7D_<0MrIp@sjHFjGto zoO}_Etc!B^bKct$X%GHIuyyFh+9HU#ATU{f7$^<3zSd|3oM8EfnN*VOP2#nTaZcfT zh0e#JyQYC>e_MzSN+Ek`r308^qqzN}T+X{oHBAje^oX(`^j`=*!Y5_D`D0npMdU~w zrz|m!85;ap?iIGT9Cf^VO-o#s2$~z43EFu{bG`#sbSbzb?sz86!Hy@yz;77~$og0r zY{Xdn?KyX9#I22cnc}d>G*Tg?UiKa04Mb(S2R{q0Wd%WTAd!}r!7<$>?q&Fb)-vVt z^@brhfgmJ8!ru(%jVvY6q$!AHzDD{}6f~qJc8P1c%dktsE-Q4Iz{MB>oJV{y!+A zKQb56>Nf9$NWA?AokWG>^NmMru~bqgPM7L&^9fho)O7hf*5j(8tzAF+a^3$sCcSkT_& zPT_rAYJ9OG$WjkN@O_#Ir8O=?yVfwYH{>w1;U6zcKe3D5-7Eo3TPo1RaF;?b`EyMc zYiHnG6ou%~DlxX@y=?_Iw&j_npxfIrp4Gv6uC-f5S@RTjrwUJ1Fo>7K9_3=%uRLNH z8x}IhTxf-2%F?^}66$773xiiGez-M3Aakzmwz|bIW5P}dr(G_OCd>u6ld;ZJ<8sOD z4OR3FDfgQcbrga7Od!J}zt;o|kNiP%gC>L76%0FFS9rU1wmzYyyomq}T4Q^QXyh6` zQ>)nxts{n~gGW$|yn+oFi z{MbKX*~ES}FqxVMO>?LVmqKV)2kkqxumbiE%$iP|%mh(Oc5>;R-Sm6%}L{U&HgA*FV@ zsrP15d)-tKLrOj3rgmmh2i;VWLjk)TNFD7f zu0W+Ged%X7x!n|yQdC?fLykZtk@hK{?Yf>v<7xWo3c94Q?UKT_OA0%`yq8IsC91Px zl^l9n9Vz9@GKgvID&TpC&Cg@C`mqb&x;{%x=MiDw-D#r1HHa;X#+@NTk?T^kfi;|s z4g)%w%cD>bNoO+^qed9T$5b?Fni}=@es5A_RPQl@$EgSczqclXqVX=Dkmq&;NdBYpDTkqu&c06cxc}(7@eRq?2qqT`Q$Wq4oZgXSYjcbrV zGBnq2?J*Cm^!v>NFkbhWhhQ{mG$PqBO6ZrO#M;>$@Qo_Y>cEwK{IbDtd{I{5Qk|79 zR2#Mx+)_9>PU$zvk`*vi7a$NYa+aXuT|j~nGw3YD`A|SOY4IsQyBCT5CO#0W3VcuV z$@84jOWfWSyXGL0WlRei>(~s|*o%e$A}B4wGPk%jwVmcQ8MEBUDKVPXS+QQ#gvl!? zHd@YxwS-7nNAOVuy5hUVBqI^SDH}!2eDZXzMQa8oc88`@YMz0>`rnAn*h@>$L;sCp z!6T%z@EC;vA~rYbl+QsP*hE6#5IQ2Qb9q9WG%A8Ugz$jsldZi((%ttd*U9A4D05J< z{#MLDASR7OJ?ulgR?op950tI?sO@v82NAk55@as4b}IVfk3}C+v{c|FaCc^y+}kfA zYzn<$1>8S3?z7prJC5*5*qQ4_f6k3YPahMHR0h%6*qXv@^>x~NC+^J$@BFZ$)i1L<{8vz$@)@V){;aQQ! z23e0Lm2yh<7DM4k0zxAvo1_eqUBPb8Rx_G7MTw)LLXcjw#hzg#YtizoysJiXxwIuknb%iM_3sxPpc7cWQ+R~B0eC&)PNZL?)Thg4t}DPFIqmN zCa4y-7mzopEg?@j=z+Q{o*VJJ7)Hx7^*eD6Iaz1w{Gr7)p3+j31Cyn5qezOat?^ zB}N0I^1gT|NJJ;&Bf+21Au%U97eg9pb|`O8>eYgI&a7VC4~FCI8}e9$X05vKnN7i& zew)2?Izx!GZl>MkORbrFysve?ks=J7cKl##pFt4Nz90=NJGKnVQ^}XAZG`VehL`9l zDx`UTQiKNf#c7^ICpAl$BI|nxGD&~fCoS?f;=R6Jt#aHX`aDSI*9%k z>St0*G-IhnLWF#!X(mgU|#9UJ_UlMtk=1rVzXF->y9e7kr$I9dZ! z6_&lS8-=oJW>N%`i>3#Y^G+ofO|$2n;_jR2-?bQ8q6|_7v05_E@s@~$p6?V_pqGrY z$`(oJdXtxd{)3d%cVNxw28F`Kh8UP^;2?Inr$)3Vd0CM?ZyIkT7jgW}E2YZuwfynY zE3&0eKHje>+tm7ePT85G85K5;B~w%J};hAWbnmD@|BR9=bt%Mdwf z1E0pVYtal2N4&k=unOgStod~JTMpdq7G;7jz`_pLmLY#f_6ghdqxaQ7(z<0rB2~dJ zhIq2NoB2L{+obnBhs}!|eieb^0|Da`D5r#geGZr2pzlx!OvP_7?Xkb?oEsR~_p$rD zxeipJxzGBG?M185kB;%6xy+-u`x0D@itx(4A?-u)7s9}yVI+bqdxK~f&f7-d&E5Nu zvv4_=noW4+4$jG6eR^{hiu)rI-D^M8lda=PZ1UEsZM{uq*7W3x6H47NKi71mqG|n_UnP7$?CT zy|gE2>)#;a=U#HdsMr&=)2`f z<2YT};|BIdJo_@rMw_yc@>fy3DV<*;{XNVau6ts3%S=Gtl8SqH-0=GHM2aRud<+G-jJkKQ_JH!{~tvf9wr=FRUVL4IEIabU= zYj}*=d$^)SeVum8kH+1P0&U!3}oVmTJEcW z+iX|&MB;;E7Ht;f%Y;Ouf9@*7TXY!^^2&@8EDIvdUkVQ(~ zfZe7iy|CiAUf4~ILrO#4+-hCHtX8g(U3RP%4@jA{9JCFkpCRF0LRge?viMf_W)Sor zq9g9*8(|$Xj)wRb;cm5uuq@G1T59-xtz?l2e~=xx#5*zUbZAlllCG~t;y>|}ey46S zKP4>_i{S*2YJNzaZi1WiV;oOm|Lo*3DssAX<%n$E-P@P#-o9-2_T~JtgghU;zvb!& zlo`#qQCz4n`V(z5)#wPUF3;N9pd!&ktie+`5!jhg6fpK|QWS`IUJoaKZC(t{iRHnM zXRYO`3GDsjY62Z}{(qC2K%d>+e-f0ZURhfml$rpl00+63^uH==t6tOu^oX_9K_u3w z5F8|wRTDVae-dje!RyRq0vWio&>X`tX#A24X=W_w@#gU^sfXwHqQQd*(T-|}EGP(oL zNq4{m{>!=pruPgV1Pv2);1|_*W7-3oGwK6sj=D=-rJ*v+-G*0DC)2K2P=7^s(CWWA zszMM%A4x~Mt4hGOh-hXe{92SbT1NR@k+=aLQTZ^!Dc-1ZxLOG275vF@Wmy#yrzs4hI)Y@h z;T1{{ai1yhR5-3%wj1IQ3F{V?Nkc&{JeJ5~Jgm!GCbgKLuI-s%2|?YBGQm=U)5d~W z`Gs{4%cM>xST+_cBUnBb1eGXUF&3;KIAbh0gJ9)Yu#(`cvEVF%v&Vwy*o5bf1?Lj1 z8Vgnt;K z7Kyhlr?6~lAZdb;u~7&li^y|LZXN|A;|3>?#07Y~O$XDslH7A@Y|O}|vaZj~r66UE z4kfu@{I;#i&7~l@Mn{-j-0|DwrgmJ73X*Gd;K@}=t~I&26eQQ^d?42}ay8`UQjlDu z(}Y~p2{(;Z7j7avI&VlXBiu4By@l}TL?XSMaGTQ6qpCH`gJj!mx0*xaUV~g{o15Dh z1$p_!ak*Y3S5($!nwH=Bv*P|F0`)OqPe*gB-b0` za=k&W+T2_Ul522Wu0e7w$<3u8x!xO>>pgNU%gv=AxrWB&8Y0(~xw#Z1*Qs&2P6=Si zYMm^V|3c9-E-~fev$=Fcj=Dyr)HNXUQG3i1C7@MSW%0i4WHCq|ep`Aht1q?_@(mA= zUNUhF5#2^JMz}uRMjOU``YkD?Y|!0_?L0vo=OxYS$a~~F>g=G7?eyOeKayBR4m2eJ z05^Y+U4z#q%mW^`o3j-)n~Iu$O-56Ev-tMz(`ZG_*@{MWOg@T7AU=s$;(Tr4;LduZhKK@?pNW$!$HME>M$aBYwK{}F=KA(TvJ{dvv+Hs1ndE_ zxN1>+$=xM@x^g~aS|3b^t!5a-;Ed(y2P2!^gKTyWvRSY2mpEiW6x$c`bORMF|FRzx zH2eyULkz<4QM)_r#46LXYx43IJKit2(SVD^D$?b|*|8aTVdLVAv5|%p(<6;%|4BPG z3$n2b)#VXvKJB0A+nuw%z3amfbfHtpmJ?GI^>)iIKO zfsG;>f51)rff9`se{4B|p7f1~{1cCAE~8icL;hy!+n!gYam=d^)%g;uNPgrAL=`;W z$TL6JyFY*D{;bfCzo*fIk*d{U-$&5e*2$$37zI9dpbGVwOvBRG|3(_-ra9ug6`8N( zsY(DJ(G(nsXq>&HqZ{VtPz3XcKx$-4IR2<+ci8zsP*=VOw6dZOB2>iwP*6b8=HX;ORd#r}=BfaeLwOME1Tpq5hjOo94e52aZJ z!7mC^7mgH@AKldqz3;w6tjW(bVE@TpT8O&dunwn741(?+#t@(l?Tpp_g6+W?2Sa_I94A#Jq+OgP~ zy91p(9m7J+z?@*QvXv9&d43sbv)t#!*qrLflROjYDW!yFN1S!jnIN^OJ~Qm0ztcyFz3*XlEf)Q$!A60^j5JXt z*{HhFC{dOs*EOS2A|p-I{~V1H&1j;Qk4BZ5D5M8&;m843xiRSaj7Ht4C>VrpOy7{F zH{^f5@yl#QtE0~1A#)x9Mu4_YB%UvPN#)mKb6*Jg`x{?5taXGANPil?tkLCCabtrjSQ>(wYgXg9JAl5&*Fmg>!HB8jzux{Wp*<1=v9N-ju zmI|K*j!T`}#RBL|US6)9V7yVyx{3b1G;5&H!05rV#?-xA2wU*BQtq%bV<0bLVH78= z_VYEn>PxhL2s{SMP1sW#IQ=!fc#dw6R)i)Mf#8NRQrsCu3IvYaFq>(GDv~yIFdrV! z*_o_NuJR^V6(v^zAmlV@>cFY`_ctJ3oL`z7HOBWcSh@OJIoK+q$BccJ@rPkNBqSa& zhn-BqojCy8q)+2z+o);V(eg0o;!Iyp|D!4z@Un7j!#x2u`+bj;k!xfhkaPS7`u_vwHXzqYQAOWpo1;Kz~o* z{jU7&w?4?BlGnr+273i)0{%ol5Ewm)qw7RpF{z^~Q_s+jj5rnt8Q$$8Z4nRNb$l3# z6PoNx93gd^7XZq!m{)lT_YE*iPL{wwCJNIwURa0ku9PrcpX)XX^OX6q-qtXV{%81& zuCojKFiHg0&gAb5V&loAEmFxCi0`6Xqj9t4!S0_oXUT1+tc^dT=(^1z$cz?ANJG9J zytgDd{&m2K!0HGtz7j*6#ozMa?IO7NZ`_|{?$2fXY)dF>z<;pu8;Hs}gZ9BKj<+e% z`9XLK;J?B7%YpuN4}fjK`71aK%odJe8=$UR?C6G5a&Tm83%3(GT?A_@VS0R@Ke*|X z)vk-ayjz+wGOx1+eqhdw=95p%0JHhKW^}jb&3Yj3E`vF@c>nPe#^lbec`IH*Cgq+( z9Q1CSjv&r%;Rm`AUK^_ym>4(U z9^dA5#pTqih>zB*xR2I5Wng;dpmT~lQ%6sm+39v&Zuem1?NYXvS3%EaiOf6S$4|hv z4Prf0vglDv!_6==3Ps_h{p-;&NE%xP+oUE9`L4xY>8^8Tor|9;1ms>y;}UjVSeGyZ zqkgYqtd3^+%fjJ(c;(QIfA|1+&j*c7X#_N9nfKbSH+L_9dSN!Q;r@d6D?R2zF|fP?CL{ zt!=?2RdDy0EN5%jU)MJT@nJxJqDw$+>mp;rivxuM^?H}_H0~)KdyAP1iRJpyOma0# zpS2USh|zTiCEl|1RJ@n5-5Hz-M;9kE3z&WBbGQewLNqCG;x04*u^m=}w7S#Q1kBDl z=9?xPb1pp#bn4N<+?h67;1lV+KOY&9fR7cqv`h=rej;7)pOP%OcD2G{eD^iNxQeEx zz}2Im%VYQo!iGg}3RR%-u0~jhoHR1btzrs>ozrJd_HbEwp*vVEcIG++#KM!ke&+iC zMgf1pV%$uAu*u(j;6nhbPKGh<)y9yq-&yP zw;QIt@}1LY1o71O+*LnBSHIvarPIFEam+6J(Yf% z{)0S#Zj6>+!$&R?GbL`ha4+f1vXKT|bQ`$k(J_UyUEJ9A{9 zgeG01$Y+SGcIH-u6ML?~D^DpJ{E@^PY)fKv3R^;*8pMKi6-_ZC!N{sxWz{V?ArP(Q z*GqYPc@Q?;ash!B5$y+Rc-;k|wzBN@qv3|c&q(0(4;~8cGF0pXT#uEKzA@93XlHVhw!F%vURs~ zYG{SFJQoSl%+7J+g}u}{PVr_TzF|#+OUu&yy40%^>yl>*dMq(i*zi&WzmP&O!+B|o zX;d&d4acylbU~o+O`v4~tqP%5@I<-^oc%|d0Ivg{YRh#!A1Z$tZAlif4m7Jr`Iuu6 z3goDHy1vKYN&&nd-oo+>p#ADhm&WK4Fl@#5NTZaMXK&INL_Dux z4yBhQt#0`Z74xuqH4x;h{a}^j57gzp^ESBSf9jp5NFVsC+;a9^RUTV+B|IX7B>$ouhkkQ4T9S4c3*~Ax9)+8E0*F#uUioQuI@?UbceLe zTbUeDOof_l1WerfKDwrcHM% z;WJFpe8#Z*8UIAy{~t~L{`jU|{IRC~h^B(Jlx)?A8b8>_-!?x$>>YnA02?}WlDkY# z>e%_lx(B5?Ik9ims-uPMi3s`L6hVJ0X#6N8(#?T5>%ww<8 zDVC$Vj#K&&e{r^~HH0b)9PD-e-uf@lq4Nto#A`oNe0OUpPfRfwLLz}*^|*PcJF(8Ge&Fh z2mIY@KR0fFgoSQyghp2F?{0Y8&8ej%GCC`w$y}UA@8j14!opEib~%1^B6d2AD-YwL z7fRSG6(N2;DSo#PG1+2k(E80|B{X%E4lLVk8__RAhUB za~IYkMgwd?&u`zXO%s`i14vlFo?w;0MXJNa#LAM6BMe{EIsHYZnE!YTbv65G5J#=( zuxLAYaud?c!_KuO*)uz1(BhsC_~FE=?J%>s@lu!+q$@uc5~KL^Z$^~>AF+%FKGX($iU6^t*SC$4@Ye?FM)N7 z!G*VZy_^oP%CNSceM7qvlKZjUYaPkhGPMz7_VZ+RAt;OMhG2 zgj+<=cO1bP8YkUq5`MLU+2N$%X@SIWe&gwCVB_zhRaP?elwFcuMTm!K8rp00aW)-i z({X5dGPLIWH#j(>(ph)^lD}00ffJ1b;Q}Ch)W+AvVO-XoVYLi%1n@M?YPpoXou_iE z^#mMG36Gbdz$(3+VKR&mE=SH-mXmn4o4CSL4R6=Ay>Q<;!%bM_sh*yjFvU$+ ztO*2+Q_IeTS9@lb+Q#aE-&0g9U_EZORU;3Pz5cO17MJv`p6bd>9frkkS6}0)uE>4Ehy(2E>pj(Fxd}#eU{|m9RAbLG zzGIA-!LDxbRI~kzPtexbW3O*9-&mBJ=5^EBm1cPTqn~ejCX*T3q%dGSS;71?_QFLt zOEgGubZkFq0}&`%n7sk zx+$6xN~tA<88I$JpRJT-qaITiOWoL6KCc)aSZ2Z9cFDu;yB*OMoo&uFP%#VOVld1Hwm$L&1~9~ z`3%UhMehO#%f~FNBBKn$st5Ik9^TUn+Ty5amc|0tj_L%Y$P0w|$j|#GZ@i|`trXE! z$0c}gPbuwWrcY*M@>G}#;x%UTQ{RL+jU zY&0utL`zre*8ic^Ucs!8lR?fzqoMSX`7tWX&_mAoZRo|akDT8pznne4OGeLcMDtwz z)5aq}tjO_(ir9KkD2{m!a_0vrrt4#_K+f!gCtebmX2{EH49Vy%5899Dly=LFz!vQNc$bC9l?@g~%j$vr=)E}k_aN#6%xs%!X%2n?dz)6Fk9Mf0qx3-~qLnk|> zIO{5|+Ky&a9qL);9 zGvT647@rU(eS#bQayIPEgtPezGT{O@zgt}CmkD`r9zNw`B;)8h4|!hEfCl}qSnYoa z$za!eCD?><5cI)ZtcOOqJ~XDrB)ajla8Dbjh;D%(_m&^~#sA~&ZQ!FS&%FO6Gl7Vq zXGWuo6>8eX?!aK73+!TpZ4S)f49+N4D2WDP8_h#owbT;Cn($(XFnbuGTU@op>a%NG zcWW1SR|Q>_1ds$!3E)dat3ho$Ay`oq0%G$2{_b;TlA!Ig&;RrP{P~bM=iK*ozrS5? z_jS1_WRVrDfKcETD2T?#d;TJ#Veo^S>2V>F&`3}hb3`cxpprxrkmcakOngeEanx6ECxKgcC zkACaAjpzX@)C|LH58o5B2L`joW2ScUO1N(EnhtT@(ieSDgzwArC0`x}KU!>Haei=7 zR#FZ*zW5BtDYOOB5xk?qRJ-HuUKs92YQt~T%2|$(3ij+5OuW)u3{cGXQs!C%m#GbZ zRNM6K((8ahk*P2T>KWKYq0-$JcAeem5+Vp%arcsvu9UELLEb?`fZs5tei1bCI zr#7m{C;!yT)`fw;bFumPI)5M9&U4%x#PT~X)HZe1riLcc7hORHY;enP_HxPYA-q$W z3#iPq_GWE7WTcve;=Wfh4=clPrkfS8>98`XODWzpn9x;{s z(5qZ=ZR(cK)r#$~!X1TepQ_*puY&D&4H&hhRg{6`zwl~0WN;?4#2TSFjX``l0*yJ?0jU}}4T-s;`;M489 z$E(DV_1X4Wn|7-R4ZsVhx9z1&8*sJZBXS+C0WdwuWmN`X1Ov0)TK&*cfN1FkjV zkw`1-4h@vAStRGre@3UKhZh5j4(RiKk{nxlKBtJA#!Z2Hqx0B$QBA+@77MG z{j-l2x={UN?>$q5YQYTDKXl}zhaaW>>iN9FCw{7W>MOPI;5}|1;4@)RFPT0-#<4rI1qdDa z6f!Ql^6d%7j1zQdr;PK0!BfQ7mM3Gw6~GYPId42% zfJv~+S$MA{uvTI>zJ0__+ourvqgt@AS&F9>u1}_$WaMsH#REk98(VPHWUS`lg$ccZ z7DdG#!O1D%H=zzd$}E5!$L}&pn+;UEjRV)8m+x-i1`(*G|8_f7Bz4lh7Q&CZZUpGD;@eY++sU`Bzr3j`>vq5HB%^K@DgRyl zL!KX+YB8TdUUFW42aFdys&C7(`>Rn{d(H<2JfW8=LuJ2;poylLxEYgzme6Zn}!N3v#t zpgP%J|Gy*U`y0;3e=T$I4!6HjLEV8wg_5ZH_xlI1R0DXEu&z)%y_9>=xEAWIT^C`? zOJ4=K^(>}izQ(=aI8v5G_=Rl!@g0$W3Pq`gbL>=cKK_%P*eT?#jTt|;O>RASX=>IT zI3R8HPfu0z()X-4m=Ecg<&1dEE`PnDhSB_mH(n8LqL(LrajIcz`l{XpgGsR$(P{Wi zc^PvuD-z+Cb$y#6+ZxV+!;2U5Hpf1Nm5j!&Y>|mO+~VBv^he8IcgK^V%*sqS3#&bU zLUP_zgT*}Tetw+4bcSnZ8)~f9^w*`%aQ*yqUl>dAt<%u6`X7J;h^Fa5yT^O)mU zF6}GeHYdL9sYhYuOfqSMAd<^-CuA4uL}m>cMVw}_jLVFHf@dTFvyW%?p2S>6*9E@4 z9Il~s@jphwh~YSEU2z4C6_N~OHp2@{hI=yQWatK_rk$c7%M1UqTjTUKF#Z38a2`56 zgdRZ|(I{4yru{QHapfxh9`tVfQ`tfzQ!)S5jC|;4=OOdk#PL|m5e_?`7Kg4F{=Y}s zQluSA+NckIyV2C={zB^U{i#vx!FC3$rshbv%|_&;l<#~3BJ)J&5qYX;NC`DS&Oa)0VycT#7iY5u&o-SE#Ju|Hk zytJ6)rpvwgY&~-}@cWKu^Oxv8^OIhb#jeUHqGeFT9wNA`%sik+&HNcJWDkQ4(uy_p z)&4_$*l@A3e&AjlLr>Tmfj4g4X5voMHS@j~EmSm4pDfjg_U&@E0f<%aw+GxCHoi99 z_?^ib)M9r^WO>2s55B@YG;a6RgHtjAish!Pg)UDMRK#{h^a+Rq} zm+kLCZC0N3K40FxY&0pf~OB>E2XKn%E z@kpJ)P7*LIpdv{{^)X-tslU*2LLO>xTHJ-Pkj6V3%9c|@V@iK((mCjE-%<^NWrHhD zsr3D`oV4o$i)8Y%OyH7Cnm}fCnQhEwNQJl*7}KJRb;Tj)*~ZR%AId1LvfJJkah~0e zf{^okco&K0??1^YD9^l9Tv~Gx0sT zxpRW)JRf`?)si=1qrJBG6B!6XE&1LE_HfWw3-8N}9|iRD5T*O~cY5kVHg5X3;Ex#B zUq%i~kV9dBCVP3y&iBKkmhnl6CDB4L#{69VG%Cj}Zw(2z`*wk!FUh<(QhD2(X@4Ga z>~IA8Q1|5W@$nhGcuJYW>eH)r#S|p3uVgNV!S1xV+>0~p)**%)KWsuXLYjDsof@J6 zTtMG)#A(>JfZl+V1+;0Pn$R|M{?EeQLyVFvO zKgqp4wZ0Z-*WMF&o%HR(No>UDA8g^YP&Z9pASO|OJhizXCTG`=B0HPeUsq>30!&7A zI;^Cj$(k3EzMa?!`Xaj@kBd{&v1x6?scgB$C$%iuv|jj>TF|L*&Fb-7Wh@;8aD@w? zsZJ!0+rYiQjTs4uzhwAz7C}7xI_I#CjNEyF?;N?Yi}mUr2IlE_ujuu)?>#9AH7%Is zL%)4f#VI_+Bj%6zPU;$J9sG7Gku$?>YLPX)y%S$nUNsZCnK>x(VK*|ND~hV#oTT%T zgqg|kD`pVh1V#D3t6xEX{WKEP4_z~s?$bTYsYLqnVrxrNhSw)!Os6N-a-2p|4Oq*4 zc3OJm7T;@;@}pK{7v@z<#oU(o2NpPY(jjW;LX3nZ$IB;KY362b{mTj~S(b41j|i*= zM?*5ZHC;S&b0vlQ_HvsqKMy6>#4gHy zQYJ02t!zcMM#7oRR1q87SR^Zp+v)XXd3nPjPZJpirS-cVN{*f!7g1MiYey3zvl06% zn1AUY5%(9gc!!p6Yq-iz<5r6@?9>G)G?5~_+i)6ESNLtCX{_x6DG1!k@b1j_$mGAZ zV>xZ9xkWgQH+LZ}XxeFOZNi3*wRNA3zMg>zw*X_qvT}Cggc{k(mS_lH(#|j20nPSZ zt#4Q3(?^sT=ba<%9saVsMPH)pklM;pNk^6DPjE}vm zxVrCsH#%a;7xMB7*ImzM+E%Z!D6l44in;P^Nh?lFK*HDXJ%n^!J}-WAQ{&VE)hoa2Unz@{+CXWzKWs|6;j>H9^r@e@S!({ZoOQu$ zgEIG;T)V%o3Rqh-mHtv4z7Mpu<=T(4Ff{@edy%_o^Mkm2V!9jR!My?ja;=8uc( zMq8WY({@KK-m%e|1TU=3pI(Y&yA*%CLrvFr2Q~-(T0=3tRLSz{M%sI)FW_Vow{uav*VME}orBh7$6v>2-!N|PNpO&gmIB6wD5M%SNfu%oiV@J>ayYt;4SYe%2}>50*s3JL zNC_>Cv{<^Rd57^qcIsi!|*#kJLkgwkIvV%D21b(FrV;~2`q07*x#_= zcPbj@CI%N@-?p~Q>5cgQ#BGU|&NF;CmqqQ#hiSYsvC=MHu#v1;TeeHSC9f!wy4855 z{-l9ZT%N5T0ySh`T=SB5)zih*#l|F*=VKh2!v77CrLJC$tVQS?aOM^vErHvXEat}B z0`zE{{Z7(>+rtzl8lk+c+0lX&yBws8Njxgb%47;no#b4Df8-$QX^ zb|ukQr2W&P;rB6KY$$>O`+H3LyTnN|xp{O3jnB5cg_fHguT_nu&ENyiY4h{7$OT!5 z&pqzvz)NqsmM5XSCkSHC4Y21noA%YMQ`W8>P)BDm;JTpvxRsWahOZlC6%!X#N3KX0 z|4>bX(;D99HY*u^Ibm8hAASSv@n6i(tc&qbyruYygJ+!A5?ZkXCY@;nH+VJmRBsyc z|E2|Xju|Ph30x^O27qc)`DV~+Q+5G*!Fw5)rAtva^547!9uqoHCATGcN)&ts#$sRk(6yYR&Uku-XI7xpC#?Ig4Z}FNPZ7@aAq185|47rJW;-<;TqT?1$YQ&#m3}+xJZ5G zLl-mL@`R=dS5aACS+&4IVG4Ue#7caFq=<#a9sn#1{Gqj&eW83${eNWFPwu{mM{jV)xCdd^3>+`)N%V!-|pnTwq+m;j6B=GoyL9{q1-9NSRTxd3@K zq`b=nz*pVI7o)zHqu~R_vj0$cE*KWkX*j;_v^!fWcAr>!5=Zzp|N zJvT4B4N0un6T)q*Egx{7(V2tk&X!ySn_0L!@CP0Zi-@(um-@NZKn>d?w014|}G+#)SiGZ2RogGQU0g zn_62r=5;@L^qiQG(6mswNKRi9qhh>`VkA4+WEAJ@^bc8@oM{J{zKd?<`m1ppCwe#( zab9uuz$btyX@@b5&t}M{X;<`21&_0k{U;F+;vOz37 zzO%f$fujzSA6rVM6K!G)#}p>)qT#v_i|}*U6HJc2Ev4)Q;XP5D7SNcvrbvx?XY{rBpWKHei&E*uRrZjf>9*P`gj+0SUs zM|?vtE*!79dW!wTa#|S0-UzOqj~_`F|Bg=tK|Nd+URnr;rTa?}@av&ZY!B5Q<+-v=Df=wF*fz~aQWbk8S$M{6xUfVY#f!FfX3@A{U z*+(I02VYZc=j!>sYw@!(wSwM#W5T}UM?s0r@r3NR{8g_Wc6rBudcZSqsg^%ikMGTN z>+!7cmjP9nX{s=DP!%eu!gaoDi>N~6|H~@O`s^yqGF6y0s0tBhak1^Yc>z^`9*rHN z7moG!LPz=g%f4)vA89DU%7ix(yR$uzsKLDG!84`Iq-i`NTE1ITtdvIA!q#}z4qsgv zt04@w66YFN)y7@-nsM{Zs5Din)Nu6JsUL$R9jihdzkJMEL`>z8*9$*Y;SZwnVrWF4y!y1_Vu<$B4BCrQ)4EK0EeBx4Qks|bo zrs-Z$YVHX5IlY*b!i*~i_>FMhcIyUOsUYHrH!|Z)^mg7cJi1L(FCdD|oMU2MK+_mO zPwn0*mm#L@+&tlD)P$DH#1mJ>c>%o)qhvEJ;*t69Ulvq!|sKdLY3{t6B|mX3Ba z^!UZ#nSZCcaimXW^YO{KD;_*bF(IvsHD`n8G=A*+(V4vGvspGZqii9UL=m6i-!9|w zVH+gP_^9u=X_L-IzqMu(BMo^FZ`|%Dc5>g&6gI6=WSc_aAzA@HZtYe$j~Z|2-B{+O zlfvn)Hy;Txy)OFrkBA-}AdcJ5Xh6LB(x0)IZ-*0r8}20hQ^K!G)kBp3@vX3c`|5_a zyj9fK(p}hcf`_veDv)7}Oj?lHcMTT@)64U?I?0xeIiqG@&x(&RAD`FozhtMuaI}pz z1~K)+I~Nrrs2y_r)&1ML3-<4}kG15(%4{}f6pTRyV@u(L%q_qg-ra9XA@<#!B1g4G zeY;u?4ng7z{%DZL88yXUWf3>`Q)MT*i(09iIEUDdroaBgoy-yHyw-ag-}1r4YdKMn zX&uVC!TPsvU#+<*A)!XwMz@T{mgSjWAEZs}?lm2m4ZLctB(QMo%%0^W6KE3(ON%;p zbTTWW&YhZ^cIu8L+-S1HvtxERS%E(vI~{7Dk4_=NC-Vx+ z(Z+Z7?ma2%Akn=|`xTCK2K%6!V2@2=SpNZeNB6UY~aI5 z-rPqYIlEg<3?(bfvs+tsQzzZLXX&%)t1#1rbk-J3qP}Gmk}0>YVDHIf_#;A3#?o~Q z;^B|t>A9iY`f(y(=m`7Vf?Q(o%+#5gm#g~vF4EqMDR#ymUvV@tv#^sH*mz?g-%hRk zLWS-XrmykWJuR+2K0l!TE_ldLe`cc`Oz&mI`Oje#4I7-nd@E?PU)rT9dvdE?{WmnO z)t(Px$3q4pcr3tX0FNoFVYRi|iOuODJSw(hH=@;^`NQ*v^N3WyHfgnI9sF?#kC<3( zt#;*#%g^U=12^({gz~P_W32la?>;8#;Ua0DdEZ(x2sU@u#gddv@tNlYB2Fb5kg*~s zR_x3SOn?r1YpC7w_E5wrT*l(@n)!W|V9biN<}oXm9Y4_O({snrJp3zZ*EP8VN^w|OTH?g0a&<`tk`_K6=n5Gt|a*)J}qIVD$e%`8!~6{irb@tPNb-6gu# z_GQd+dw$8XCN??#S(n3ZIx{`82*sFx`nGlzx4PLI&&F8DO5@&L*c{!WF|;11h!y&J zfUokvGAIt$d3p*2$Gh{+*giyTY6JnAL#y+FX;#Rv?x9|o6tO2`Lys8c%RDH|&Mq#9 z8&XCi@6Ezk$^|R;X5*RyslLKH(3Fj^0K_1R@pylHN=VVKt&-nl&cIk;1MAK8gfyn2& zXxe`P7{LORU18W`CF?KZOBeo&E2D6p16?vwiUH_SlzMP|`*~ypnUNm~V`}9Ui%saJ zJ};~Ylqd@mPtPgJ96u_c9lQqs6fLJY(GQe)831lF2zRpg*24t1HqA=r34Qv!3Fsvt zlI*RuM@I;DQK&x%;M%&7Umi~vgN4t1G#{P zJ@Ug&U#;~KypdiQCO>FL$t1rH(e3OJeBrwL)mrPuT~L?OVEVvX*z!5UP=Wu_5=Y5o zX{_e!ac;&z;^W1o{tA${3%KJM3-6Ena7}ioKvI@d``KaJ0tC% z5c9Qy$t0qAS%hz=)1dn$AZ=}py)M#LgmQ+9wCxnq27)@b)X2zT!%hZyV}W5ejy-(` z%rX9%ZfooXg%f^;R|LeELg6a>g2ojIg}b63g`1f<>wT@b2BB~>9H$+T-8GpNEVdkuFosPdne3}3M5xBn| zjKIAw1n!cBE&|tz>X8t*zv75Q0yO}GE9^xD<1b)vzkfw3UJwR%fLEcyE(TZaBxiXT zTn=Z$IGG(zl!3KXN-+K@w5gAUde zg1dG5THdli;HsdV4CeNKiL!b5>KMu5Y?NURpTI)JBM^1NU9Ts; z*WfaBU#w8fKh%v$7oVSH9U8AF&ViQh3w#Hl470&5N3nYd4&ulzR&%sp5|477FWd-grD`z z9`PjP5SLs}_0|o8cCwFu;OuZY9_igq*t!FjOVv~Zv7Vchv+GDT(d=DNm9 z@;>q971ZD0>^{wUl(Q||f~tRl11^1ODcfsBr;TrM$kqxt4eYa%E2Lyt@qnTp$$dV; zXN=8va>XuUV<;K^pn~E(;P!a=&ien7G5_)x8qV*>{~Z5Xh^>@=El7ea0l$|Wi1XR# z=m8K?n~JWd{w5ecXd}Vl9&@c8JuKKa?K!a=oS=S97vvjzn5?5FB;3lRs)emDw$!>lc$;tKT{H*#LW!qC!gT zIoR!m!+kIJw8Cg|9ogH1vP!Jxh;9h|Gnu-&$&L$r_qYJ`z+w=I0^@?0a}`3e4g=2(uDu`ghCeOjpx9}JKbJ+k1SZA z6*JQs{g|v-Sfiho#iNKdx@n>NOwV_pcg=L4_f@#hUygU5zb$p2j|JT4(|J7ES3l_S z_SL2%P`!;$lrcoid93X`Ho1t=vF7waT(irfveI$X3P#5tjab2kl7zE0HJ4VLV2>_k z`>UucX*o)`ws1+EV{9QpFNdp%iew`O9$OTI~zp-c7(y_J` z+OC`@>IXFKyro|wLE)n=Ty#WZ&vi@xW;3*PUU!&{uh|N{YF)!dbgk+$SE=U4-0;0_ zIQHyi_6GtiIPQ^^voi%IK7m<|Yis`ivY2K%r9-;}G+u8A?gxgSD-jPVJ z*w5$XY5yv81aX*!2WawOl~v#**?pUggJky&0tL>pD2}+ZKeMw3#L$%D+ijYvE~#8q zYPvfZ9Z56I$BGjwvEj^=f$ggO8da%TRiYZ9MoUBm@+|hb^RHQ%^TdW2|FdH%0}I^Tuj8d0GOwa!2l ze*BWud>_*nP$%>iMiKPxVl^TaU6M%OznZ~Kg#SqN8*X$W{2oyYVqsi-H!L80S2nzr z@Ja%nHo4A4>jb89!xBPgGHkb3zz9QH99UoSA*^{bf2%l$$KprJMhJYkTeIuOC_gt9_cCs}J#u=Qd_rgVvq{|SQMw`fDW`)@ z{ZQeToyq|R)(88upQ?J^9y>jejnMn18AZ7?rvAmIfXS!BPCaZ2=*a@BLjnUzIHD2~ zr>C+5Dxo-=$ZbN2DPiL2uv6bLC486#Rte`0C?TT~BA3P#FxC_hIvsZEbEbey7Fc~WumteFn{KZ@J(WFPC5+4_a{FkaDWPmIEL`6C z`4IIXJ2iECGX1SbOmXiZW1dOsWcnI5bj|d@`m>+QP2Q;*g4;heV{8rBjNF8AOEt5o z@l!K#YOyJ3@Kl_t$#c7=I&?MVvwJe<+;Vd(@Q4cOpZ2En%vxyt)N-0?*3M;v7u3`u ztLa=*L_>w`Zf)tipEEq}wc1!S)9%L(;3}OJ-Z6o5PBvX_HOPL7S8N*(2Mv5QEFnXsZ=woz|h4IrT%`*K1nNdn|q5c#Z(J>D7WsUr{WqVbY&oWb3Byh|>2( z|7^a0)x(Cb@8PvS-wnDG)c*P(ym0Kg$xX#6AkYrESM%rPGdu#Cw!alY_A6TKS1QV$XP^Mp^td|NG*?$p$h9bI^C)s zd4?6*L1Ej7dHd*8tGXAuuX94J?uDF;YbFZnoN;iNtRD% zR+gP-g%}16MJ3}DxW33ts;c2T_nHYY{6@DC#9iBBK&uOH@}j<_D0x4<*d*qygt6ML zps_*yjyzAPs0}J&$}Q+WPl{==6(`M(u;v4{E6Tj^E@I>9=|yG%P39w(zUwd~LOgw^ zxWh5LqO9_P;>XfW6U}#1wC-asJzme3(T~o{lRQdE` zd-IZmpERcqV<`btwcP;p8<{W_tVOM#I--ZY5Yt#Ny4M8zoq z@)pnps%E*&(;^F$kmo$jZ{X<8V4lEu39!n6dyb!ZBMX3Op)7$ZFaIq7k$Iq^s6R6= zj!TX(O;Ccen&QxMUF$X1L!-Lckm(6E%L-leE?+X(8g74reVW^KYT-crGq%yR=`}A& zU`=`~Nn^gP973l5ta)viK3Q$e-OKc+F{~VhYPE(cj$ZpS)Gj(gV>4R>5U+e=cN+qV zz~F2gFqmO^@+>L|mwGu~Efa1K)OI|K_r_KA|2N-cqLkNG79>)k;>gR_$F{HC9MX!vhF6*)8Xw%-QuUTcBmTYk*eQk+3Hmmk2 z=7us>a^+E?RBSWPJ{5gOhJ%{`74WVCE{9;P>`@iWIn2{!>@OpzvIEF{yig8@Wfi$_ zXcGRa;P;WdvXh{X6m&pe2lexoe*UPRKPcjD-U6e({2Y58iQZPw?``Yq?V0vp<{Ok@ z(oczFlj~$z#KNyY7XE5CC*Yi&u$SjU*l`Q?UIIR_u5ODs-LX_!1Y*K@+rZxc5CcGa ztJwd8>E+CL6?e{9lV#IX1iAwkbJZje^YSy1u`Hoa% zLfq?p^z(Y>d}}3>U_*$vJ<;-)t#mi}!kuCCSdx4g(69*3HLiw1?bP9^)*oPMo2-zKc}7l;=C(0X(ZfA1c*zFPJRJ zVXI&xXXpg1RKGk6F1C~KT?#KgLtt(FU~JJXTESokWJR25Sz8=a?#(=TgNbp^=1wzFPMKsJ;8UwQA+GerKnDr8u09SDnRy)5M_QoO zEcgm?6gcXHL_UqNZMsCH3G)b;cB0mg&?;m!hdi>~7i@IG?|o&Fnzd)w@5SJ(aYl)*9Eg_^V(j8gwvy{y<#X7L&Sq z)T&m4ubtmLoXTE!tNTR`RDdAQ6Fz{cKxsAw&aH;=VZr%g`-KHmzjRAulR*vf4L0t%N#Bk8d zPap7JexC7O{zarKxF(2{h>{?}Q0wX)nM;0yA4;~14fvU#w?1Z5BVSmcpVjE7^1>wK_thu-%_X%sTBBlyYE>N2hLdrP`pol5*YRI zc6WR)JfxI_T=c#dGU*0Fpx||0Q39$A<{&f-l%S)gNLPVov79QkZYZGfle4hj$c<6T zYtrF}$%we}gRuWD*`cVw>qUnMLQRY`O`Td`R`rf(I>}}eY?2Rv0rF|KlfcSC9i9x? zG$#`9PYe443VpCpplnQS3ND%!CXR||+kBo34~j^D#9Cjd5=fkdEEZ%Di-IZ(x_Sp- z!S#jjn2IRvyiT{&)hZQQSo;_t4;D@|1(J1tZUN=SaL#3I_2;&sF!QP0)|kYcG$yOb zpU$d8Sp`0w)!|QNwQf*WQ$C&52xV3B>8wQfx&4!Ept^igbJ z_8QUtZZA_7rEUY2v72N=;VDzcZ2cY>n1RVMVM20QeL90Y1CY(&!E6R5@l5kYQ>jZX zB{3Tc{r#z!CbRfL>8eZ;607O!Y>sGs*@i$|H_b@|DmY-(Nf9-AL*XL8!!6UCS%I(~FRBgD$~A>$fEt8l4DgA-WE@0s+-@jbsPd;;bJrA>>P<;ay}a;X zHr&mQ_%=5eQ`kfbGr8Q5%Vp%CT)c2{al^BfYB!lwa(=kg!P{O~n9AJsg(KXosG4ZP zY=v^+beS7&5Hl7cZ4@5nwmuYYcXKJp<#OGiT)c2{al=o~MZH2L0=eY#2POByN$!T9 zo?KWM$%}Kzs|O|b!bz@hO~f*HptK3*8sg?rl*^-XP##`5dAQ;IRdCap31tRFlZh}k zC@+jO3KI(HPOyJ9r*EK18(1Q}sS_-O4lg{k1wN^-ZecWi>)GtNmwdiitcu@p8V3rW zAD@S#bi@`F)=@Ubd zu<>pVAOrJW1#k~fcgAV)h|PKRwhzEgnlnvz=R;>911sN-baA^56npiMxV$C3mtXgf ztQ(xpl!0Ak<@;nmYCiRfrB^AK&%Zx~@&eD%{QXeq)~$wWUG3n2!Uq)*y{{!QVGMivfZGg)gqEAF`X;s ziGZqOZ2y(q1`cr!R#&irn`FcoC}DOnwqgST9;V3Z3bsWP`>brHeq5OG*@Ae{0u96`DxRPIl9bnE<;9N+GbLLVFK#{+ zisxrwS(WGlwJ$0H8x;%bfHWx^n`5!YlSS5=-$HeeZ?Yubrw#zAZ;3H=_-^bW`Wq&? zYWRVtG_$T9{^O^??5}RgoCO;0G>tFP1pcLF7kQj>D?kVWj)>m2V2w65_fVVb#jVF? zh46VR-nJQF4Aw+Zc*JrD>BE0?XJ+vF1wxDXc+bUHlJj|ICSI$dg02Y8WmH7&fnxC! zrALFaDJhsly*;NN3ke|VpCo@I>Uu8TJz5X|2_sy1kyvas8%#)|{3vufb&$n*+zJ^g zeG%V=7#EFBD0G)0w6ZW6%zrGIDC>Y1l4e z5muh?X#5386*zLqOep!78EESp*3Y{HjhTN0NMXlSI|)`|YDT!$PUVLL8D`J-N<5PH zqyPj3waDAM0Ei6*HEmTk_<0+%@I#j>uKY-S4UCBw8bJfktD@u+q@A8ijO8mZG)BjAShhq-YZ__|aN(`-C1CgDdaGLq$}mgYIybz7QLs ze-uc*^^a<9Pv%FnC157dg->#@TjLJjLc-wnrB>)L?lLMG&LqipLZYGWGk9g4Gp|Tf zx4`A_7vB9O$wHDhRh?yxGkE#%%Lrque38K5S&Qe|;Wv!~A5p~DUAjit`o*F_Ao$DQ+a>POfme{(f^K5gLAZfI-wFq36BLM)a7 zZ9;vP47vSpX4RY4I4W;iIq!Ar?q;qyPfM-*k|uuK+;wO1aOe4KYt8G>fGd_2NxkOD z5*CDtEc}hSr0G8IbFOyWs!_k%T##43t4;-9_+tQ!FsRc+H4^1^%cjYgt_9-8$<%VU zI!DGVE4%rbC;pI56h<+ag_{&Jt*hFho`80)dW*k5Aboj#vF=Qk?^=Xa2E=t#V1JYy z%eL-*Hj?^n8_Tl07`08knBq)pt#KKibw!JZuuVMM&F+TWvTh;et^CI89IKJ?lXb(f zin<8vvaE0nYrOH}0_a+lWKL#o z`zJ_H=FSL~mdBG=l}Fy13y5k~Z_;R04Zn^q;Tw|Lu;uUen^Qe#KsE?4A|DDo?cA9FlJiWKi2h$bNwsdA4)J|jf|#qwiLmqd~FTlXk5 zu_F{ag0rL4h2UHF)R|U=<9zqI z>0$S|n^>Ue-!@ppd&IG0@BX&ECteB^yx4MhOJ;vgtYRWs6w(dPO42`u5 zL#V`XQ#IUfK4dY{L=$C_ihyhvOlb~=C~6d#QI^Yx=#YsfN)?sjn_Jdc7p5vnKe_pg zH-KLBL@!!BR+aQ;Vc3nUKsdKn@HAXO&?Kb}BJ^uU^tR7hv&TJC3im&1wot>inLU%e zp-pH6pvmIKkB2p|Pta?DWWbFHz6=@LEy$x5P!*PE=^PozUZ=&BCw(^ggC zzszFIvWbxyxd+g`B=C;^GP7c>3q-1?NaYybXkYV%Xh6tka9d+r57-vdcKAO7|AeeL z>8o&|NgcT40rxrSDV`~l*jXiBWnZ&wgtVpBx|*B8HQ(6mRcea63$LwrpZ8bmNtRnS zcrSN9<-Kftzy;aZ>;>Hapb3!rsLN>8Z6>4TpnZF;-wL(!WJ)uP!lF5TDx0)3dDE*J zG+Su0!hsB|TJGgX_Ze2@+6n^L)ZbSJ&je!ae79)H9XMpklcTJ%=_#|D1&umCVdkXG z&S4e8m{he|A?BV$Ic`}iy|S1SZdnnxtb@v#DIHjQomW;TA5G0}wWXI3OfKQ)uH~lC zz}?#cqtMsYD5Ff#Opeg;UZEW5rqB*TK`?@I7b@?VDLt@iwfp?_L+@?NYwH&M?%OP#5)XprJ@vQA;WnOpY|ta@8tO z$I7avdjm-=9b&6bkY$yWUf$!yEE0?>SfOUnv1;KBEe5l$;*=1flmRH{&Jd1W;B*w; zXX?wz#V#InXNwj1Z8MEvyckaQoGKK9$xu5_n>z`lDJ)e0Q{-B8Dme{*^bxZhHN&d4 zsDpQ#ri1JJyNRhfX{t??wH@`S?x6WD=Ubf6D)71B)1Bt%r+Ku9(FsHu-)c4j>fZFu zfVg(W(d*Sl3Lm^HL!8U&FQjQ*#9lZ-#e$}&cLGm8Wd^1Sby>&_LZ4TtX(>e?CRE!i zBOfq}z$mD&QwBkktl)izP04{#&uvs2jaWy5vFZ#TFDi}EW{|)rP&b({F>xiD3d~(1 zD00_Eu3c5C5y9UcG5J+{{mK3-wU=P}LlYdltB0p`=l{|dInIrd(e;oPpk8FlL=~Wv{dJQ;<>%9-Ad~j8@_fg3}wwr%3F59rB=Y+CLC z&s56!-iMjxTPi%*2fa`hK=A&RUf^|JpqM7XjS(;OAulwf+*W%ZERNu+1$?02$gj6I zrB*#`f^Og!-9z)9Fz*U+R;@GdkC^v`=3ODqs+s0pAZFES-lt2UdkCH$sVDaKhFh*!lHlBxy2HPNPu%H^;dJ!yv*eW!_*?oc~bpdsz3NU*ViZ4dtyREgpD zRiCpFa8u{dTVAz;zbrP$cwnW6KU5d?{+pT^Y$|ml)_B-X_3%-ortoMn8&P42`3R=V zT&T4!jZ;1RAun|(o2{@OmSf>h-H7yf6A^40%QN#m>^x9ux2AW80Hwm`P~l7|)-6!6 zb%XADgo#1S`HJ~l(ol`2M+u{zE5Fg7G@dA`KW|-Q zS5aRxuMNlS)C%Qqr`%ZXrwmKSHt?y?Y_^!O#bS!%Ue=71?^`;&{LMvY$Oz7LwiW3p ze=~wJ1A9viqXG%OAKPu1>%yJ;R_w`fl@Lo_`y^;8($GO-`uJE=BvhP_%K|1!gU#2p zQWN)%7dJk7vCmq0E2?{J^nt7V*qBW{Y`l(u+{V1yd3O2-|B^_#m*Z^QnsS2;)8DuJ z!WzxR7i+X!7h0paX2)*=!{XNHSvZWdMvpA(=Qqa7Q9rWtu~Hecq8)a6YCfGzQ*ih2 z6ZQI{OYACVclqlH0^gdZ?cew|JASA z9?V58kc)XjvV&Z%Yy8Ao`o;96h5!A(A>FxeWItKRu;5PkfbY$|*2cc;>V1vxU8iks z_|{*MfjCcrNfvo=P9IFx{D;~LW(Z#-a8Zn4m{XXvc`t@gpysIQfa&Uh4!|&OPO0-c z6)LoQs#Ue2NXs|Y*jp1zPp3mMJXeE(l4x5Tqp2$&(7J8>gt%yak{(Vk%TLhDNtCTt zt|SipQz%7TGpECyIX&v{^Im8rzA7Cr`y7G%VhrlqfQ4*y!A_Aq`do2jS zwbDSHD-PZ~{M&>)dBHr?$Bl%!Q&nDRs!W=Wt_Xdm`-1az&(l=ayL_qpmf}d0qo|AE zH6>O^?6J9r$cg!+0#H*9jVxm*-b1|e1_Lq7N^c+yE6*ruhFRUN9Yl7v1;^ls=;ZiAPcG>GeDbB0;kGmO@vq)q>@U^JEVtgkCT1K(J7Yl?5Ds$RNdguHB#P9%@X_vO~&$hwQCr zXp&s{t?4j!GP`t7brQ!^tY*ErCYy9X5(5{#%hB!77l8}kN zqHZ=^RtHt7(t3nG=k?RzEj`J6rf zs6Z#m*Ht(WZ z+)V!8(LM3>Rk(7%6b;s3WYBNQU7EPIgKyJqIG4c>9p+ukb+Hz6oQZ$n3LsEnWe>7@ zPKP~U7wW&w$k$2x9css{wWzaJyk@aqee8+amsh7^_C_)4iEc!7&jp z|G0i=_Z3Md{0uDIjKe}PGuli%4DBSsd-}8I2JoM0qg4r8IEW*Pt>n&<+Rfa(PrVcO zeVFhaiTk=;wbBjD+=MfwOyi5vu^AEuN3+*VT%nmG+@UsGWW{VDr$vl6*MTz_VdWyZ z#`~9KEsM--aok$dJ{Je#n!xvyu6l^R&D;wUem_?N#83;AICP{cz&I26qA-p zXd$vBRkgG? z%n4#uUw7@;ViRd>XO#C~WSV<6jp~+odG9S}BypGBcsF0p^D7Q=CX3O#vvKDUOmRIc zvE~(}c(eyeW0qiv$@mq!DG>nal7Wx;7@d~k>6;I7rE-2VAN<|i$=y&WO#1=r8p#k7 zfucc>#5|IX!RJ%+;CzVXE>sH-r2ozJtK&6$W6nph@|Uc%h$!J?Y@|l!o#H!@zLb08 z{&k6T@)L6)WaUk9X9(L#zb{N1I)l&;7SZatF-=&G_=PYOKj1?pCFF7SvKh!dr) z7}@TR_%L3+xBdaldNh1xfV{&%_m^b_{j&cd;~&3|JKx3(-R?w+gC0*lnCoSSDb37) zHgxubBG)ruH{aqsd!g6;@Y#>_HCv%`RzFmb7tSPV&`r6t6wF!;%(joKM4imQ3LLnJ zFkm>u4GYE|;ET9N+^6n7rQ$$5{fQ&4|NjQd7( zZ!El*`NKV-L+B8A8(Q&C$Vb*rD0Qp4Rl7u8w{jZkt{=8n|5|o6cD7*7Xv?9Pyy)&` z3${i-TGq_?*%x0sVi5`rfk{{W9BEyQ z$0nnvjA0SHYo7O@!Ei2_L{3mUD-Al!i)*IN;QwC&yC=j&NfdHUi5tQpsLxThn-+s| z5CQK1$}ymbi|XA7jGE|k(l38zGU6!J=OsHtS1>w*>Ob**aLra^#Bb>2ezUvYw#I#M zi*97T+P#qAKP-l~J?A61pe^F2f_Jp?Bkd-bC@Ko@$uI5Z zm(JkV?Id2@{^P~%Q7h#3xD|4TFp=J148+8pYXWiS`y=Ack4odtZK1gH_5hp3*sqx_ zlma8;@$_%nbO(9GVLUNIgN?rJp{OJoxb@+nmV&l#a1xVbYxIgX6uVIK{9eDu)L*ywGhJbm_v#?y`m@6w^Q4=Q&JZ1 zU#L~d^z=`xXZ%5`)@(f!3Ffo^^4_NR0)w0cBWXw|&VU!QFup8|j6o2s36e;2M!B~E zABo{0;JjR>qPdlaF}}2?{*Q4^EJ&4PyUdbue(jHnPr)gR2`Sm2D$U#gFDcGx%$Y%F zI{;#71g9V(9b!4C=|Guvx8h&iwVS*f@>>{V%z0zbe$L#F+-Lau&^1-9nTOHg(hC!u zzaVjDTX?hnWmC88bm-1ahl5_n+3Cxf4=sswqHHG47tUoutbhdhnmHzAA;iaq*rJ1x zx$*Fyn;S|#p9zAwqndWNqBm)B$?xV(iD8_Nr=4r3&k^BQ*<*0n;5niwoq;ANPRJI> z2#!OHcx$R~w<~w(0;H%;oJUw|ek>FXiVEN9Y2oNe$Ios4R`0m1|9&!k`6rMk;CsSf zadO~i1mil|Ad;Sm6n)~&2=meFO`G*IH80lB%0bDR1s^WX8;q<6k0!p_;B%ad4^e!> z7r^n)oyyUh2c(O&0y)#1hp)&O77G^zwFyz?_K27ULbHO|;mw`#g_=9?7~DADE7{3o zrWRnC&jF!nGJ$E5J8vQzM8-=v!u(hRqjcc>*g)|d8_W;v;=~&J{PlH7r?`x2)Il|a zeeTsN>fgU{(1;J%Z<+4l{o`!2pPA|!Z(uc;u1TA&0V3Od+4W{RCQZk<3u+?^s{YLG zuc+2vRLPg6OMb{03{%gNxmjP-5#wg8FEL{(*&Lmh&8GI6rlHx?%=VVu(VBz{(${Oj zfL5b~V^BlwYe`JUH|iGFXYOmpW)4<&-2{m=egh%Mld^7eUnhyU*B1xjNOEJ*c_A5o z)1`O7H^4RA*%(OVb;6yTRbWsMp%Vt3=PG-h>N{#oM?^jHH!9u(W3lUMJXHi`VVT6=Wd8%AQ&4sE^bE<79 zFA$XrmIGwCsgb-MrUa^os$GHJQ9hy`I7d;CUlT@v!GzBQ6c-4@&_Y~Q2HA1rju>R; z-?c-2H75H*aXF#kbkXiX@j_jclI(&j-9d4O^>^a+RA9*SZzIh7$?S|X>3HU|SrOPi zHOs)=KgTjF1s+2O$&9O3h)Lnw?=6EDv=aQlC7g%L@|Z1VuE+$1u&X1=AU(I;U_$MJ zN>4ft)}rmU@T`ACM>~uW2auy?;tWnC$%bOjIdz{wZXPUK=Y?GOCpYBbvgL$;8NEw_ zN6Qv^(Uazp9U)JZ&G$ksIq?$@Agdw&fEj&gFrx$A zi-`J@!HkXpjig`rOyTuZz}@P>jW&NbhZ`ve4>@84OYQ)6`14eI0CEI~n1O!@J9?Ex zw8@1F_(yoSlV$@PAqka(iN{!)J7PE@S~EdtO3NQHB|97Q!>w`ru(nspH5q7;n$L^d zGrYL{#f#gOysR%%FY}V^caW-fLX_wT&zO@I+9Q9nKfX*No~Oz>-2@xT9#H&>?FMO@ zCkM0xB{aB6vF^N6Nx_B!SIvfbBYIc_FOFPJ#KfA3VI`2mxdK**h~Jnj^@{TC#C|Jg zdnfE;TeQ~fV>}XU(UoccW4xM`Gb~;FqeM-{_d?pw^L-e1@WzTTRhy{!IKh?9@JXx; zkHIlW`ck-dhYZ(F9J`TC$|1`on8tp0ady8GH;yI99Z41(o>`vpkItSeL`f@n%n6bmu{dDOne;XZ&6=K0q_wW?x!QR?Ho>?utP!dGwzE6Hx)$ z$pDL(kk$}?)h+I;v?o}EDCfBNmeCGwHiSc#hM?LsxpDyi5XUzwPMo5u z4QE7F7Z~k%1Rakzm-)u}@t|Q;L2(_udKk_r3L>kg<_}0Kh7L}d@}n!8ZykkK3L}(j z>GCxm^zDD^_@S1QLtVk#RyW7_Q|8x=Ffhjt*~glT7X4jLbO(gf=B8{s;j266`@5!W z-k)V6zXX|kkkN@Pful8)OtU%s^laX*&a&jb~UsJt$_@$GL~cZiN=CBUq1zGOLSg4Wsvg!Ju6-_&=krD73Y zM0;sqQ=fIG_9pA`vteTNZF6=lKiP*cv<=&Xz7xJ4X~pSZj0) zT903rZ$C+M^6)fSQ0r@}O%1cdxbWK40)eqGiZ?HCpS2GGAYp9!GUOK>IK|`81$Wt6 z5WxkAgUIP%{hd@{^>W}MuoO#WPgNh7{f;)hW36oA9fYvgdF6_e~f#u=v}xO*@xNW15%mSvJM&AFraZZLPeGc4F^;8}(RL7GoUml$Z}pYMQkv@@-73 zr~H>2G;de^yWKa`rp9bWvmI6^EgMX7Fe)uiS6xzRIEMv8(M;;$&dZWqwcG{G?n;vuT1VgVCo`?6Mnpg zV8M55Djx&ti@vDHb&4e1A4`pVpUnJ=b?Esz;^iOI|4~9Gb!!ZNTtmYLY~P!y5em~N zDr}hb_!?uib#)PQsVhulyT*wdHf+9=gt2?FXWKkG1v`Rgc}n zw4kI&cxTtGe7h;4>F@WMPLLSGUipdD)XobYRAgHdr!^9Nbj>i}bb4ObH}#7DJ_N{X zf5m&(Fp7{-bS@AN>RI*|vp%)-~0#`Q3wFpUbd;djiZkw=gw&lX$_bIFy*jyMpwZhuH zu;5H%V)_0EG-LW@>d3(|>MN^NCmk_p+N!{Iqxu=VlCyp88CgKEt20daT>Qd$ zi3y8yN2VoU*yj&Y)rP;e!|j)){Xd0PaG{Zdxg`NyBu#2_*uR}{)*BPWap%1#`_Rfi z89Fd5^}PBEdKmJ&t*QIPFKLVYO<7tG|l}x^c}`qdP`bEo^6Du{&CT3Hn!jHt@fa zGsiTXD@HR5s=Az(=?V|d0D)!s#RK{JXXW{$D&>cJ-cO)pZ6E53*=&*CuZgm_?DFRu zCdz8-M!chlMH7JPG8)LH1wR6zu4?IPv3+jsRoYKTQ?FZEfnapPJL)gnc`;i4dnDe0%vQofqa zSO*lCq53M~Yb|fL)+{#N^HRfC9L|i5_;3;C8t^OITSk!OEob9|(znMhf2sa$eyo+x zbLK~!eG%t?+7e;uF_0vgxB{|hhZXw6Vn00NgD4J!(=#}IH}3J;OV%C}*}p>b=H@f) zzBU^#iA~MRlyyVh;QfVsU3g}O8DOQkl0wL)WpOEm@Y3G>1>E#>eTP*-Q$tLl_1#6QDV41aW5a zwftT~&L<^pY-MXo8AXE%pNS1)&KtREv-<%>bi~av7Jfgwse#S0r1b|& zKn1$=Nb!G~sGogS)Xx-kmP>mw*^OGbhA&v4h~g*RRiPLu>=-J>|6~FuC6a`uwPoSf z@f*|;N3g%8kvd;mWA{j@z^$tms1?XRy==D7xMbz1jdY3$uyP3<)_4+}=?A<(&9D%` z>d}@t16C7*gi=pur2H)_eFgE_SlrbnRhIsa#p@>v&s3r14{py!%Dk@i)3xYpM9RFr zm3J1~*)HG&@}im!lW8pc>cFloTiMTFW5h8l^OAZ5nTP)#Dfyt;pkrdcdaQ(yK@gii z1wqI_2==|fSp){ePos==g8OV%aivPH%dZe&i=Aq`V$1d`HR=iA{I-TpTlYOXk| zGJjBJTq2A6IG!1RSEJ6`Ons|q3>I$8-NT-k<42C|o=XX5gOOLMjZ<#tLaq*sSoyQo znq62kf%fAt;ny52Ax<0KIekQD%@oBoU-IyU5*;szIZu@>XTW6s-kf3Ntotol#VuF` z!fB+*1YH6hP#=b-0=FIp-jwH3WXzHJbF9bX`5rcH$TFgfwi&cZfF4Z~OBdezxG(!9 zea^#B(yojM?Z;)qvUpY{`c9BN6(W)*^EckZ5qS+sQd63Fe>jyKOf8<~uVcQkOpikv za;d|eVgnd>;m>}S_1D1;*)Tuu;A6bgb$q}{?^U4d4VvuCUVuZyMHhiPE)6y9t1Clw zw3q`1XGoa{^o@v**Il?sc@K($=$5iGOh+82BkV8vx2(HZejqyKw^dFCB=V5E4H($f zQbXCpLk=$ye!XPqp^Tr#I_*u(OQ+k;7m~UGOx1U%hM;|R#<1^pIe3u&HI+YxsN|vOO6P?QloLzCe3oP4i`2^Pp z&!W4F#~*Ii<6djBypN(gy7y#M?zUzZ$(4EehYiCvgU|PMJqO?4CDtL}eV%%5+W)Oc z`4OB<96|joe_4q$t-?5=np;6|{Wq{9-+eI{`=YNo)5LRK;QR5Mm#*+pGX&~SZTg)7`+DO`-C=8k19O_X^%MDZJ^6)~tkfOr*o$0i#| zU7!IZnycQ#B3$q0qw740D#|}vnxLf-rboyw|A>hqaeiWlREYMmGDu7(#CN6SB0I+S4M z^9S}5j91=@lZO;@MkJNQ|LpMw)DGuz54NF#!xWFJb7PCX=}enKGbX!`b;add7maPa zEkc^^vP+b>ZWL9C8su&(*#ta5zth(3!^;;~NBjv4YwMpCgPos_S(2>!;?B-k2*s~?d5pfeuE^N|cO_)nsQ!o+)i!VWA_ZG$*@>|{k#hO$E19wbkwaBoVY})Zoa*u zN6ocX%H&DYzJwJ$zT&nirU!*;k#*GfZtJv>6&G+tXNniJ;>6`ZY?e=mCp*7N z9U@zSN=+Nt{do_<#1TMn_YnJO4XudI^kuk5>+$eEXWH1P)5cVq9COf^Nmin89MT>< zp3RZ>1)^#~wzVF&cFZ@7Vr53NrWlWM!?w5)5}izucGHV&Y{`&qwyiI-%Nfiul0pO$ zFJO9aHPgGj{;;sPW<1$2Mc@E2T~(#nJ<0UM=?sdsMiTvqbK_+7TjSGeKDYJ9@W}P{ zC_YT@Su4-t)q2`^XNWj;{s}u*+%~z3UNpD;t^bF&cY%+xy7T{&%mhLRJVAp}MU6JL z)X^;!w?ap@8JK~IP7p6BtvA|eDupVw8Kr9y5{Ce@4}-K@UEH?TZfm!9+-{YC7iNNx z015%Bg4T-YwojZ|@m3OU^M8NN^Gq&kU3dSl{h^uXJm;L}+|T!X&-WVM7U;6uS}1}0 zu&)awvGC`!udyhPdtfwW|# z!bBWDevFnH70!tLQrNX|83wP+UKDzQd~BF!ouBblf2KcpnefI<_ke(LKZW6^yd%(+ z$PB}C8`RB6;GklVjfL)%Z*wSB1Blxe%tWl(u87?c{#5OvAnrSAaT8g)3HVw@Bte*= z5x-qqrZe5FSG(IAx6nouPPl%Cd!a*wBT*}iPiJ#%;U5n%W42)Cj`wUSdbi)hOPjk!T;w?^LbohRWuush1LH zwx-V3DnBXIj(?ki?C4OtTF7E;=lFx05U<=Y{*$8i?Qnjy;+R(5KeV&Ak@rYFKn7{F z*lM5c9!Iu&9NF%1lzQ+X@(dhpDlW`U+c3^6a<(Zl{wsS<89f`paq6dI z+DhjE)8XJ>AP`5a*s)+&LnT0aya06^@9(vh8y-^)HC`$IMk(HQGiwKXf7P5g?8I@X zC3I`K3Lxl1aT48zyVy$of@8VXrUJpeWF%%SEoANY=;Ex8>pLUmw7u>1_-Feeg$pD; zfgFT;y&QZVz7JjiQOyp$GSO7Vfn^4InCZo|{7`E&T9>(_{X8pVQhK0?aNLl~-6^+b z8Z~WC=i#p&%elj)cFiF>KA8**6UxO(nTOl2Sm4lVk!(*w_}bSM3T|yi2y5Ne?5Ng0 zc~EXDUatp~WcN#nbBa`q_#wU#;~+F&(>%@tecW({mc#xww}De=pt=&ZBjDwWtF5JC zn5kP<+ayNLOpB1twcZCMd@#_{r=5TC;txUse&4#{!}l$#E%T4%`j?bSp5vA9Yf4~G zaG-LRi`Y+r$?6xBYa8@uUV z0Npb!XEz753{#3NwO ze3?M4NF-nIVpbrj!0bFS4A-Vmfprgp?Kpg+U|_bqYMy=UqIuQUcRE`;h12N-`_gch z!xd$^{)MZqbS{4d66jxtA(Mh2Qn zM1>Y91g<8rxy=;DQQnsR=D9Zh=-l>*H)F;Jsel^;oLH?->Yf(5K7^Y?j4b1rWC3x)5T?7rO3i#N)yhw^5@})?QY`b5mqZOkkj`BRH;>Jr9+7+c1w_qFPM;`PV6ELO zOrO#Vl6T_6_s(i_;0ReP3p+R9VwM%NVk8SZ`3*!adkVEH|NG{E(^fh^1giEJ&XD$f zXK)Lb1#Oj{$M{vVVs=lyHFr+7kI^JG0QfR1W+OG;LZfu!vUkj&@r{cBY`D<2pH+Xs zhAQcd*UoiZb=1x}3ceT>j>bj4-k9&rnp|gX@L1zx$vcr=>X|{}q}T0ZrbJVg3Su-> z)+F>2@}-2#ps<^We zaThGz;qMD-IwXf7 zI8{dLzRos7%qmtlBI3Cqd_K?}RjWt2remG625>S%T57^YG?L^Y)(p;>-_aM>W|fSuU4Fnpwy+aDWh|ye>O4bs3z|y zN!~Frc|#e>s>Bo|Zy3j>o0~{O*K?x2HE+kgCQLC1~gARL(dVw7n7p zMseHz@mS7mfXPyMyf zZ!SX|$T{ibLJw~mW)|@#s-leeFpnhO>uVTh=-`{6j*~~?8RWsW=>E?SlxXy`yczFR zVHF`$8tYE5O%h;0G_UC5)ZD`Cxd}=hZbTunl`5JqRQ7wn_(CBn*bf8^JF=F@KcL)&~rgxDrp;cm^ zsTa`Ky;BACjd!F6SrSWLP=$kcC`Zi=MkBS>eh~%_K(^MmTRNP9-`Ci^HG!i*a=2E8 ze`{?VW3H_r0DfPsZ=1Dtw{+kF+rVPUE& zBc__bqG)0ZO3;6SFC!a$G5Z1p*=d$U>&mrY#%V;%p&{-@=vt;Fj62ap@A=IYDgU=q z6`L#Q99wIL^sNKCxl6<=+ULxf^9*i}cOAApvkpG^tQ=})(L$B^BG|*WLp?;HrlmH5 z_NEPSI-P1A$5iR`oYvYW{3$*@l;|sNx@|hXBHF(K9bXbnXnN!f0^qE64@Iw zhxWp@p4DwVzKMBEL%ZTqlE}OjN|kYFev<*&mK`-D7Um)>-`(;SEjmHsNQrfq80?9u zTU&4&Zml#DB%96#XCAO27e?&z>K7OeRK`)R)cSebY6fOiqh2%lUtWZA<@N4@opy?l7QJO2VVMK8_I;;;(JniLdj zjg-062#Xp&jYGg(z32n}E4Ux+=?(id65%Vj0vS4hV$#z2`@KFbBdvmryZ0RSy@dov zIr`SD&2d6$n2h@l9nsn>*|UEDRG4GO%okDz$q<5fsqtokVsWFri?QN5$JA}|b)+h) zT@>OqJiCW7eWhGw&3fqa6z4-2K$)N34}N0yG%{g_Q!C6}z)rKkQe`g!{|Z9BP4^`Z z4EJ$w^fA#PNYuehbNPBvb0An>nlViT^wLmcoM2!*p=YZ_1(JzSTV?GpR7 z`$CwXpns{c*=8R^f^KA1q9Fq{kt@AHaZ|=DDKq4gOhq)ft?>=?Q4l+yND}N~Ij&}R zqV=)t&m2S)RQ4@UvYOQRRczhiaZ3_=fsB#v^7*pJ*89KBg2U7HvQS_vZ~qcyYHa_# zVvN`bH*AXpGS=FWz6|5gn~L7ZwJy@tdQ7CqRO`8P){5vxz=k_g6dxUOkKV@O^Bgv? zI-iFn;M1DJ34_$tT=_6_XO$j#H8L5J4O+wol}P5~`$R&S$nax>0ZTPdoq(&A>(6KO zgPHa}Eh#IwFU+uGKY^whxEQhjR3Cue`v$gFjwM%CwUAZP3ifjx(1sluOMN|8lleXTvH3if){H)Y`ZRHTk)v*2cxdtc^FLrczx_H}Q+cLQ# zefE-Xm+udvF1&6EI%XnY^zF(VDK*8t68633!t0p^Ub_rw-S8GO0%$QT4h2p^_9+s$ z#UBaOm&B}%OU(ep>bBKF6sf8Eomkq7AW(GIK>LXJMn^e3LcXg?YU-YrY~*B;7`#sT zP7nEJ`GM#Wt0u#5a+sdGL&+If;H^0v33f)3&6t+Ev^Uh6b7k3?DQlHZe^!lCSA3i! z7gp@Xz0TEy;X7^Yb!rvbX**8XP4?q_dhHR!6Ki*-t}YBEXZfAyNr7x4zF;-b5)fc* zJZ^1#F|f_CNQzh+XOyKbDP)Sed^?e>?7VMMN1$WP{Im!xY)%y7*Je2Q*09}m5?2CL z3)=4nFTD>w`>Zk(Wo^7_G`2uCW`cmMS=}UDH9Cv^zjarQhRT#GYcb>+L|@^2T-t@y zD|kk=bO8p5nh(Gmo$O{mSE6{Sy&OgC2IlkGf4CVbKU+2hPkW9aD&z#mK52scYU&O` zRcXEqwqFDVB+0V+AX>Nt-aNfe5>kk?B;Zj$g(F01xNetiie0izf$;cwnFwYaHg-)* zmVLV>*AYVz`YDd~>O^m@`HMyk_z_KrwKnT>RC2Tq`;H%4UdWeKd4*-aVROWSe{Fn9 zdl*yzii8omXBajmdXK}*Gu+Qea9{HrL{O=$IbuIUReM6dUHSGKd5-_4zCCVz%ds&Z z3vOwADwNAa&{z7!2h_`X{65f$uFs?#23jKao7kU-+C3W8NjeD1(LvxGph?gBz!ly8 zV;SOkXbO=6hU_k?tPO5z>@i@9aht4hn~v!PYgH@b#-zLz_8lA~KY&NAi0>`)ePP)K zK&`AbyyhWGg8-ZcXj*=Nb~Rs!3X2Rnd=kzw%|RFqB}2(03N+z6a^sb?1=9*EmgU=H zhG1JG?ivjiHmG2;>IQy>$QwLFlO=Dk2$2r{;`l0myhU+#@so=^NrMPPnOb1nLBs=? z&wZf{Kxy4YiyHhh!JrcBzr%Y$JeXMjW1hK&^X=Bv1neEOduz&Ho!ReWm)Z6ML;{af z{u(>AhOiC?v1z-q!`uivldR>;#a7tyFtTXvM>#Ky0KugP83pt~#7p}dT(tPfVi@iB z$aax&HvZ)ga?%hNQwKv3MPtdYA^-8TQ)AP*M2l(8k5-t+o$&O^?dgkQ721i_7joZ9 zD8WuVV8Y64Cl)C@eQ`K>Q&~9KR00;>Frst%Vrqe-mQ1W68ER4p#wPmC!XLt^dRR)m zq2SRl)K`uu>wD?M;}4KR`B#3PYo|q8ytLC)CiK;wzDRT^drl>!uG+dcV!p4TU=4tW zH6$YaG`mf6#+f$Hby}wD#awX=X6q-aA1HXNOC?McONl4cK^BBF29evg^x}HSz~~n4 zj>Zu>O6=@hXT*0rWbR_(5$nJ}oTnsg-&B@()J(C?Sl0yKP0#*miyd zmf!gcIzFa|b3h^yZ0Tw^6Na+6LFlD|i%3g2xV2#;n*QyfRW?&awO*QMU|s@lG*P z;M~C9w>E}{9p|j)=E#tV9TG}LU27^2XKz7)4do29KA#QQZ|C9F7RvYg@GSk`7eAfi ziw@_D*P%@D)rS>be$+js6>-#vpFe1>rD&L3Sv6OkrN?wXW?xhV!VedfVMBi|c)SUq z&KT_Gyo}lWzqQtvt_|z}#p05?Ch%NM%0FX(A43nzL>4!!o@7alkGlpYG#s}cBxv1Q zgD*5b$PquzsQV4RQZPFVa_eC&ohGY(wQqMQ*Wtc4zU{J(;}b$HXZolunWqG^EyPxI{MNvusj(a%>!!F$BJhZ>1Dsm!Wkh4nsMa%t{9Uuh3de zvBrm*rg%kk6V4}TWVQaeg%9#)(?rfDifW?N;=pbBg9-VkgM-_>&uw?D-G_R$vxfnb zj7eSq@eRteuUN!=9+F2VXwruZBUO#jf$}nTvZT`tWhUKxJ&4fR7u_HS^HRwe`}YK) z{SiFvEQ0QO=WT?Gdu6Odl$+%&~$DsxNijJRi}oRlOaFCHTG_T)#PU6Wio8YFbfPUCH=3{uc7Ls8d1= zIZmN!J&1{QMkctyN9J-?G6UAC{d9{huxc;QL|qbWrCiY?ABC@!(d7-a__+)Kmd>BLL7Cv%2bazobgW|?eaCL_#r+kP^dwS<_K3QJ0L zhJ%6$V4JeYCfjX`Ngy=QZd>Grz!<>Zoio0X%Yo(GK#$wxeN4KoUyRl*o6UT{L`6(y zZrEP+TWY95?!%t3C^~=dOWdlWnIo3-7Kdwa?~-v|4)QAp8J)ePAgX%5ifPLsZ5W9q z4i;vir#8*ajtx(FWIwHMDD!&heBoy-i)AaR#Vm&@X4D(5%r{E7Au1UE%m_??_KoVqC;n(f+)aP*OJp>y7!P{PFT3r=qM{!!7X!^uaYv@CUnFEza=b?5iP zZjIK`AJK%?=0=emF*JjbGUV{X+5A zRpS@aawGa#qMcSm?_^RaY5LeM!7Y@{?Nk9Hp6DxEQj)x1?a6*J(KmWYS?4mnh~}O> zDbZKnJTlRDf_n3Vw67y+(h|*!isGM0G%qe}s0`a?PsCEI+G#BSVJ_q1tosW)%v$Fl zC}<BUZ8ZP%8meA!~E2QZ3b6!QCGUTMg=Qo`^)ex9gew+B# zzImuNLh2+Owy$55=cPn$hTdq;n1D)*S@ko{<-w8{k{s({ZO&?>8?Alo5x|KLe{>0L z$i`axHs}>n>mRb8x6M@9vlfCmpD};$OlB%`1cq)Q&;^NyZ}3HMuNB*5@6DcwFcYzl zP9)AGaK4A_s}=((w2-(0hzd3$nz~o_i)_dXnAp#7&u8;PDO*2#MnS>+u5QS+M(Q-v zH#$7!6s*i}pYU;Yx3-{t z(aE&o(hSUlV-zR)Nrp@Blt@|A$>HSvs*Sys9jUzGq^ZLlun3afu7phJ&>Q`F?%mQ|{HB zH$I+$3?pMo6UM04GA{CFF~gKV@@PwPMjn_vq0Z#jW9ZN^dfJ|uB1}{wZ+aeYoQaG;@vMgBU*{v*bXx4VM8!<0lz7SsqIj--f7lEH%pJk^LC&XSwe|9)r(oyCf7C0oj%V zU!@uXE{k$RGW7rjhwP|76hLEkEvg8Rc1fx6CsRLmllZg-R@*>QNiy|QH>r%IvcXAZ z$<#01q;irlU^(zrc{25on^Zwk#o(lhWa_tW(m0aF4Ne-DOo=Bz3&)c*esI!wSn|n~ zR!B5u9s~G^9Rj2mqDd4lpK|Yy>2PClD3E4eeQ9)bnoh`VtI45K&{I<5O4Kje(Rx^i z(?%U*R`@x-Oq%bK_llMhPF?-o_?h7;W?46kV@Br2Prx$PrO&zP*<$k{%Yw}IvZc&n zu&cR*(?{tuAQMelQ8pj{$O8T#!cb`F2uk)6Hu>#|3OuaHrh~z2E!ZplEiN z%llt4HuR`i5-EzvIE48IgF^(nmy8N-ZywzWsJYDgW{UfKFRy#z97=wq?Iqb&y`io0|~Tr|`rqw~8&Rfknj zKBe|b>+Ti`O&lq1u7oTjysNo9ltYinOnoTvT2c1i{#n^#H(j*hN#Hn}y;9eq85cOa zzl-RHne+`>Yu;V?gjO?SnvnP~Z_Q0{q30<^M8RDOfRkk8qU;HVOP0kfzWEBW-bLOW z{Um(-HIH$RgC359_4>(MnQT?p-Qu1iIPb=HWc zpjeFNQb%Y4!_Qq@1S@XX{{gDhbH&MgJ>`*~G7t^p+(QQZS+ATQ;{d}H>&;EbKF(q| znr!lOr$8LdoFe} zN?7o-i1#LS>f&N+cRouHF$bE`q zT0~_ZTufIx0|hAvKKl<>alGI&V`E4x@O z_n^@Ud%?a>Jt0j#f(rupU&@kjy0i8;oFv6 zrRYpwiSsTWfU(9>_qS*$J!G6C04ge~g&5!U?dCQsG{|cEPpVimD^+n;cz)NvgYgXbQtov$q}E zm%K-WEZ^4TJ!^O-Q{Um2+d&I=>utD)Q6fzrWoH;5#(`69ciJZ%43umYdkG=`l~ZWM7st;e)Vtfl_~X+Aan z7z8%37=dAH?RDVR#{_JwwsQKuAX0EX%?aB(;Y{1xT~dd=Y!QX(@`3^x*!%?qE1j(` zNj7KILnPVV$r)9$iqf{3LhA#2;DQR=xH9qMj7&U6+{f%XTptdg*LhQU&#%Y`cjwKf zlhLg*tsInS0NnqP*!)R|&71o693H4Kd!{QzKM><;FqL{8OkQugw-g~m8A4i$ZMK5M z6A#e`#_bK=$jH!41A<0$p;ah=xLaiPaWu5m@!MoJ%u6rJ>8yM9q>f6$y@koh9l2^X1HBwA}+FL9bFFQxBSmK;UO&7V9vxA|V!}OR{b>AWB z7_>jFo~=cWVC$iMzOD7X?)IyYpVG7*>Vf;X*;{BHAH(f<#7K6PVy*=VweI4Fpo~gn zY6QfyQr1WIW2v&sJ#nZ04G2p%c~#Z?h&kRu>or>L`DQ<1)?9NLA~newm5_9jC}_9l zbb`lGX`MA5{&etC~xwK?S~s$@M=Ej=0v`mOz-n_KK23-jA=E4UG3h)5=~J+Muz4?M}VOHg4CBi0i`Td&DkL% z*n+7N#5rB6VdltidlM2%zP;|*6`0WwkX-4Jb0LF(30+Q^P(fT$hTHZ?G?rRszG}h{=2aye>^dF+{fi9(0bLQbw%ICw zf|Ok=oyFfmXE%9!lu2uvU`Hw<;&4JdwCBvre%0DfdGRmjsdzH`o8kKLF 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

?{OTS8Mq@SdJN#9A| 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Ν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 B;I9Ax diff --git a/.venv/Lib/site-packages/discord/bin/libopus-0.x86.dll b/.venv/Lib/site-packages/discord/bin/libopus-0.x86.dll deleted file mode 100644 index ee71317fa6291e8a015b57b5b42a968b49ceb7fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 366080 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

ss8*YJa`<&!F4OE!PF< zqi$%O6ztESK_Ni0Rsn?Hl-2roX`j$r4ya!tMbdV~X9(=IP1C~mdh4_ST9j(et66oG zDA~tep#wH(Gktc=>N)Z59q*${o3S6SwxjmQAvsH>D{zQXML1;Hu?d4g+)>ilA7QPx zw$*Xc^)`9OCe`W6xL+so)k`R{iDXNs33lfeJ+Y=TiyM|)-YaxKiY}d9vn5B+DV`?v zfP&rR-b-C@CA{_^UW8w01m4(qvy^4fcWhR@hD~(>QZ1HK4RY)C8g_Dx1O)O6+Y2PH z^aa{bnvI^}ZX+p1hF+S_E8VP>-?xaz=x~|zYjpNwF-)b{1{+b*p)jl*J4uQs@)e1E zne=aywuvw>mwiCDjZ70oWR^T!feG;#BD^8tncefTvfR02YqoeZow*t}=A&Ax{7+H$cTyC;bGDdixpB7?+tJl~DAxNb zwTSFsXD3jJ-F1eVlms zld_Xv!rIW4j_<{Qa&@m12Z+^S319~6eN%FoC7J4{#gDY~4HE)-86?EPESP8m4heiB2`;)740y6~1x=

C`!Yl29KD9~wLBFIW>#KUj}}Aw6yQ97F|88!BwU&#@Ix z6Ia*=t#FWxTpDKye$s)nj(Z>S8f{@Jfe|$k;(4VFSds$@eI6yaI44>o-L@6vn zDeL@F;pmv9N;sOZ?kL~hV5wv6aZ4@W)|T!Czh2u)VkL(21f`9E0n4VFRtU2E!9$8| zpR7>=53X8wwjE;IVKN8Rq6pY=o-~mxC2_ocqDKHtLlKDo0Mc%F{UJzoynOq|Vg=xr2MUmk}x{Zd|%d%cfr@!v2Q^{YwR@=L6^yxxv>EV;fv<8V?b7GPw-#%tnK zwMi%G`&*YJkp$ccRw_p)zCU1Uu&LNJd_=KU4ch@wcnC{bD2* z|9w|SJ2utvb&hy~VZDRMqn&D}(_AMfzEO+<2B)oYxg5gkA1(E4rk-JL#}tdi)Q(g+HaKjz z`B~?o^vL-1{bs(oWH8vqrj+XN(0+5ZemD1oW0-7=HuVlZ{BIbcoX=4 zf4`Y#0{`#rH)okZ(qL2PxCt|6*oFLmyx+WD##V!}mt}qI^pBU3yhRs1e8HjWlPXQ* z*bXg|EzzXSpGei!_e^Y@Au-MLIM$h`M!8b6ZJ1)H1ToF|BD#7>J%g-^>%})Zf*YN| zjqa{$x@LN$@;ZzEA`)b5bo!G}hrOiUB^|=C3XCDNh9`WWq@*HJjE=;gtp18+o~a`l zAG0Jo+=d89Iosjwuu(>Jl)1#Y&Y91(&09@KX_58L$a=>hjGx3{_@2oPF5!gUpt4N+ z&H&?yCdMNL<3qS*2(EAjSCFvlA;I}jS;mF_G{Jd=(?3Sze1=UDYN?tkzJvGX)UY^n zDx^pbcqgj|bct!yY7py7G}gsD!8%VgUV~`=K?Cz&Q&>2NxQ0^nNhqDKO5NQil!RDq zqAq!l;Rnl&_a*d9S{d|BSxj~fIU;ffj!iEHr)0GcFy@g@2cfP%!wVocFHApF5==Ed z!W!kp;D)wf-r?Z#P9$PqL6%g8*zfZB1^Jto52%QqTn)K6ZM@ih6c!e!%>qJPS)yGH zj|&yG;bB?(VMYRt#81S^t{Ty?iF|&yJ%}bOf&32}8`_M#!$t!-?io!+uhB~WhBI+^ zGg*LjMCMDuqEi?2^u98s+xG>O`3DV$K3m@%JDH!?%{_vBwszG23n+%$-#UzpP;Z&9~D55+-DUwF|c&&SIRT zwjvwMY+jd8;VfO*!p&Ksl~!AOg|$$d0b$X;k z{;B(4jv-ui?0#6+AtPyh0$1yX9l`s44X43fgi~s*^Sd4 zl$#0PG<33B>*ktANj~pde_CjXHM7|_?iMs9g(d2!IUc%Rp|95JH0g%`Hxh6O^RBIJ z^v7+t&e(@JM^5lTxgD*yE%>15Qi?CA4?eh>z?6odzDq4wvzfQxgLm@W{NPB~4b@0(ar=_;do5>o)#Sl?M603EH{AFJCA`!2G3uW%^%k zRoQnBDg;>oxsMK8fth~d;3M(7EDk%2SA#mqk?Fv_)w~MW9${)KjXTFNL&?IMK%Z_pmewEgtCv=Yx56F%zRYj2^)+*(U~|^`y1SLqRS(Zk ztgqP`;wRVF4@Z0gN~MOf-GmZbUvI^pZm2WZrCC*oBo!BXv7l*)HT8;}cFZ#7<|O-U zn{$$Jo)OG(26Lij_*KWQID2;E_+3a2T9nIhEnrHxOAi|Vm>8S$;XW!v3l_;l=y3-g zJ}O;474uQziJo2HBf9%$WH86=Hp5gw!`6Fq0lXCLa8m1RRpW9$4>$4Urb(4$} z%q`}wMl1Nvk4T`kf)~C;+1k+Szu+D7D#>IL>S?P~%Cu_D4b-RR7ewZ~j8;s242NYT zJS{Gm3dH0!H(qRh0NpJg9L9p& zpfy?+7A?`lTK8$UWe+_Ae=BN!^XGB%XS@E<9hO;xIfG8! zi>5R%trO(Lf&&+|{;^H*@(S9xhpeN~!dC?PK0Z78afwa|^!4MB+jD9tgOTkxcczK% zDa8d*af$XjpB@RVO-1XP`%{|u2jCn00mqM=!9P!=2WiTNe&Brc(MPpQk{KV>+ONTT zlep;kFk}cdcL;TB?HQY`IdUD}hiLnw40_eER7`n>mRQaHmQ-!D%baN1ScPg-ADso` zrbx;&xa^_4o$KDmZ$_;Z2CAbF@S&Q1DX4^B^5qK$QgtO$g87LKTQc~qB=V$Gy-+Qk zD+4y0EUd4Rawtu?*e=G>U7^!WH5y${-RqHJdK#?0(UmtQoae5+H@+X>;gp_+I5R3u zqJS5Ut9^0vy$M1=sobvcb+J0X7%KQ>XhB+_@4WRRD{mZqo;#G2#>wC_=dDi)Ek4iI zQ0Yhu<#duC;*6I3Ihp&`yeMnY3R#RE`@yiqh~pai#6|+i#9-@3AcKQ;XApwMtoOtYVc{zMz6~~`LNLkqjoBAsYU&#v<)t%GEe$1 zP$yoDnf@6kOH|=r2Fps}x>_3b#kBG2Yg|Cclp+>ju7=bviIJVV>P~H$#Br?Ex#}Xx z)07BM3kMZFxX=pb=JMN9DW*(u{@?b*i#3APzcs|kFW6(Ok>W!hjuwmAk}$fa`Hom5 zVW0B=Y=;!>s{XdDd7fm$vQ3-?cdg(Rn}k%EeZE!8YK*4)DC?u`@0<{O={{zkkG zuNQA--wtC#r7A(+D=P8zxsrUjGc(YN z<+6nTfM+P+-6`<6?ciLqel-cx`Ms4{M`iT;=QYKPd4&LOikI1{?q4M&)7tj?!2eH& znam{xeYxUe<)l|L&+d+w+}v&4sK2R~4#`yPpx$z2j%gKXTF;Cs03&sH|?nYu>K#+@IMk!W*rPQv)lqVj0v2!-30H0q^Orgc8Fgbr> zm5}bb!XDV5;!IHf9hDo7ljpc^vdK!G?|O2->q$pALB@+cCv(rbo#8>}%=@sbSM%hl~OBI~WE>*Khw)Bk?g6EuCXnkH4MmqU%_H1PZNgVO-!EXlA#!k>McRRs=ooSKKS-`tY> zIqu16EwPGqGvt$T=()xv?B!GUXv&l8i*SH)GIUx<$6zfpLVZNGit%A5$=8lk@5$T6 z;t=u@6P&GLeCeRvgXIkqS{wjijQndn$~=j{#?x1umt1}0tn>UAq#wvAa^t6y8Ht`` zUp>WxvAeMocF~4ALRrC9oMoP>nPv8zu$eNcv26Y;%}4L&{AEf#op75toQ$OGl3+i< zm`f}w|MZ+)^vj0z(|z9v^j+>-l{JI+btzd_%FiuXSMlTfQdYYBEP@jXUzT)y+HOnxrUlCJNYlBLanktjF=M;ybCLJ5P_OzAicZwbGx#~r+L`T-6TOBT*X z$o4X!_HUUl`Qsk5)@h`g*I(+pDRBC7-}P0eHCA)0PHVI>s!nUXuBtjMh=nh#I<1kK zTy=p}3${Zm zH@>Ji&QOLc%*n;LQvGgRnPH{hmSr~iKb-N>{?no48_=Hc-G5|7Xh9sdP`ZwCE;5qR z3Mix7Ja$p6eh(V#yp6V!8L#dChy*3kTTG^!+xIVWrbadheX`zMC}(2X`~<#Nok|xn)+>Wa#b!$3rv#`F4jz1P*YYG?ziz3AZNM|aHEYEBc{K@gG?2Or5xJX zEf3$7nZ3SC0=xSI8?nS5r&A|kdOVok8#vCU&kp%Jxac0a!BA64eKY(H--T?$`XQm@ z8@#k!@@4uRxZmZJMYNF^1l#Oj8htHR7c=E(JIo0TrlIqUV$K$iE<()x$;-M~D(mJ| zSeNQ!aTfJWNM*9^+WVgIQsBr%>2n13!Iy@eyO5(IpIq%^EwrfH1%$x9Uts^0ee{s` zMaQRtcb^OXAGu-7b4RXH8jjg0)IC?u+{_dveR2SY1vp|z(4Go>V?~Ql=hT#`OE!O` zFd`lLM|bhtlA5tvX8Lm4nll@?Vz|hWk#7eAK7bqirvyfHnRQm!{*Lis5f5iJ4iMw94j+>H>LXKgce7n zS{LieT`Et%2bOVQl<)k&fD7@!K=Q`ffr0UxINBxNu~}Tg*C~gH&DsEomtXCV@|&za zk@R9U76kPPudyn5XN;|0FaYC(=O3fFqeL{MCt$4w9~TXuWi zwwR}O4)Zm6m>bG;_rX0RV)VL$MV-N-mjh?4xc%Skc^fwU_L>8x|8vFy2#>-K;DFtK ziAeN3t%0xEE%*n$P7Bp=Md{hA{zg5TEcZ(1D(d9h#ka-pm8P-TZcA#_0VJ%_M&kmj z9N20(!`+(kLH--G#`vbOZHxcgK*&(PWG3RMM2V5t86B!co!;JM>;#zGE3t#y{To^k|3cR?AXIP@|cm{@&j@|Ylx(ehvz+5ERx zaN}6T*zm}TF&t;JbDYhwvH&g)3FYtTS&)Yu+gRFDukf?w~4fEjQkbI%L#}-1dH)py2#tXkb2q zQ{{^I@PtPkdLCTf_y{ttiny>GV~l5TFK>j^3v|ZW^qBu#6os5=p@r(P8FCoEhR8c z2Hw7?r_tdX-{WyxeRBEP5`DJk?cS~jX;z~Veht#d4P#fDA3o};=0i`T)m8m}s3Z9t zuIep>Dv)cEgsq+TY4PnarNOr}3p)~v@0u)q`t^J!(XYZ!wI4rx9vbZUdKA6rw|{VB zICn5s-mfq}g|8kS`~3@}u@{~di{lm1i-)7X?VTOx1>PR$IwF`g#<{B7OcdGVyhMnZ zy~Oya;eC6DCGd_Fa-y9_H}5j!!UnO1HkH@E2WkB7(tN0YVZA$wy4#Oeoq353&4$GE z$ZIW2!ry#NtHE>pBbaTVhb3$`r^TM9ZT-x_ovuK$yDaGG$=ttTmf`6}VN!Ie$J0&k zg2T2h*{^!I6qh}&&w-0FOC_QG@1mfRT}+$Y{?WlFJf(qgM`}1eor?^X)I?S?kGR#t zG_^PI_QySqZr>Q_pT>NZrhaV3zRy9@o)t{IF`h}-=!xfeHqm!H(&vV_hV&K$sGK&E z^Lr)FgHk;+8DZ`*M5NHu;KuR4$MO7+`7ol?E&>mhNyqa)I=Gd`|o zXBr%-$1$Q5)MEX3j@gedHv6$K1D8p1hb=r=@U;dy2jtEnD-)gh`thj7aJM8$>lY}@ zYK(?7%%vC&lKo=+?alD{(e&>Gn(ZjK%*^3HGopA>7V?=3M zU_+Y4cZC30m39OZiFUfRqrDXAAYWJUG?q^ctXjn?3NpJ?Q)iX{;!9kz~AZbb!S&P$0L!UFrhTG)Sq=6J--+-vq%`tWg`)RlPm`;Tb#*=l&b0IuEv~0}iETJ;uX~Jya2tk+x3)&Hq8ZO7V%I}(ls2hk7_Op<_!$3=~c)Cv7@5n`V-*`QnHsfno-Cz zco*xd<@j&R8@;0sI+RV>Q9ej%pE(YwEFN?!jIkF!i8)z|**zF{dDE?fg66XeK4Gh11!4lVD0 zKxRX6)M&`l`ne|{6Hv$y^C89R;c{R0(6k=Y-*&qr=T&&eAdrQvpQJ}9KftM)-uIA-wZ1d`5D|6fz6TNEf&o5~e zEnn5A{O9U>`_8$v&pb^(xkTN-vLol$59__Rf0Fvj6L2lvrV=ZdpuWNDfA#FY-XvxT z60xn@;MxBql{^SA%>By$?KA(U;Yq{e)N_x=&{RE-F`9?Y`d1yh7s3tW!68bsQ3PK+ zzp(hW?zuRoCEp$>aR&*s8V-ZN_3 z7D$v=AKLKi^!i7+BtDo|{ph2{hMxsD9L^kY1riu6hW`<69r66t@N5q*uWRzO3A@6j zzv5$n-B;CVt+A<@NwiV)c%c4D+fHnDJonF?$i$u#I30i2hsK7VV^@MplDsx9*!j_~ z1c0a2_2i9n_b(C2Eb)Dxqdu~Y1lYe)3R}_;lIDuK7R9}lv4{b_us|z z*J^AyTvNXh|3^UZ+evecYahv%l2dTpgCGJi2Fj869lX-8JWlYT7a0TWh zkSx>lb5~#vaOIkXI*75ZUeEu!yz4c(d&8*}))I}3ci6`(_=pl4P07(ENY!wjQ%9R4 zXZLSb<(y?i?+JWycOXs<=qpJjFuM&3#H`27t3&kWCATW`?+NQP&t z>+V*fD>wXgq<=OZ<_ek5Uk-V;!UBXmFQ1+N7bFa9*lKm%{UD);=l6>Nk-337g#>b5 zb=TeOWN=|~iQzv?i`ov__8U&!^J?ws3pXzsc_l4RugiS>u1@-?t+#SRvjrI8LNc9* zWjZ&DPXAW;C8KD&G{W*Xqt|~*FNp>#Z?w*|FAi^yP9C0L&t2Y(oZ0hCV5?|?K4#hu z`G3v!$mmP|%fk;p%zUScR}G485O%U)r`L1q3Azjn>{ys=O{~_KiXw*5A(LrQ<4IeUcsYbfEkd#%d!6-@&9GTzHmvCFl zT-h2%2OfgXkK|TWR$|-!U`-!Ai-{(9-zfr*KAO2_?ONkmi3~l_&y)95%<1Nh^e09Z zI(8={Ek>Oj@_dxpz2+#IR#F7>+%vjE8V+LDVly%y&eH6XIIPm&tVmUMui^Bu+t5X2 z?pgETAO&sGY+TGF3ejJ&WsX(NEmd3b)&FkQx^>mU{=q6ub3G*j@<886t`=SBh^t6i zSr)u5up31U$Cw$oXQPnGfdghYjE@=t@u zz}m^Kr(E>j!0D0x5fw>aE(^L*yWus3XDF{Pvti94xr4I2h#4{zl0Hxn3Q5)(4g34@ zjfQ-_$;zVs_BI_C86*=@jUpM{ydeD$&pA*ibc~o8jm%BD-EF8EpAZxWJH#cn2PKK2 zvu3uT3vZeMlZd?hS;5wI_hJ$cQjA?7juOqTanCZLn0R~>zNGke6APUFq$ zwE)2UjEqsIz1KK4gbox(VhDL*n97&rkby9cuo>ZC?+ZhC&(KXglv8I6G0#%wpY&Z?pkE}gD)9dchSkn!@>NtW zI^R|i&bjlw!2fQ({{zIK2CBjSo)TY5uw3gy)@sp43lcgL&!P=96jU$R@vl?+#spc_ zRyY&#lb577b>&aRX()r=X&JnUQ7pEFCk9Y4FqEvofv@3QDps!Dg{1fol?j;w2X-8L zd=~yt6^%C8)^7#r_1HKmO@G7?S@W1MNb(-ZQy_2qkP8~nDf~A9RpSgU&|7ztQyDYR9vv0|B+P4ow zTaOkU-l9dX>uAxxjbWQH*sCs$jossHC3&dL>G>l@mgg**;x)4V#z+zW61uu$=Qzx~ zd~IaAhkui5O3I5|e zzbbSe)MNru-f^uW$8xIc#LlWT;2pO_b5b<6-Qc1D7U)&6EG}Yvep7xfRPBEdt}coG z9blss2sUmfSoc2(#&AU0EUO*^e~I;PN0PW5w8!#$MxnjG^%N|FO4|oQ*Ul34-?p(V z;9jE}1m|er=mH2-(%^w6Syw87Colc(lAZ9!4T{?kl0sD?l+L5T9`qBPs7Us_+W(;H zhy11bCNfcOH(?5cM@)1y;t=u(us?#gYxT?-dditaL_Wr%o_wFYj83 zYRDt{+==}I9W9*Im9PrDWs#tKqpiTY5eFDro`c24M%vC@al164UyKS_L#0$uIN+Py$kz{p73?L@M7BJF;+Y*J}?r9f-*0WWAHdCf0D}X~J z_0Vzo9mt=V#3re|n%E@`^MC9nDI?C$1{J?wkePp8=oCQv7cVIOxR}iprF<9C&CR&t z&PXJ3S9*{px?}>{XKa|;K1(LAbi}z-zK1-Euq}f+U3{>3 zY#QEXWw}8=-$}9Hc!EA8BHm#Pg4# z3m&O6S#-|DJ5i7A#krW>C;i&+4;zfZhB$W_p38;!XHo4g=_)f?)&8a+^No5S`LR`2 z9;BtR_)*!JPq^Z=q79qygdR*$hM7npPb57truR@wA~>GAq!R9=mXcGrff($DFF?X| z6FbwBiq)tcC3ndN`jLLC;$&6x(KmpH2?xC-xzzkmdy1ljZ0ROysmHd;@tvR?0fk1< zK@fl%1(U&2L3@I?w|<7AHknNwaW1vA7)?(nXlfy?yd)MfdOC9G-+TshcKGb_uRhBQ zU0jnCLYEF+;{KDD@FGN5a`wT?A70}APrRh^Z@i?E^{>1%9WkT4g!wz|7_`y-F|43! z8j@(tU5VAHYGzULgdEwva}bOSM+d_;oFj2L4rjE(D;+A|D9jdgAq$%R(ez?WOLvzv zXjG%kEl1)@-TXJ*NCuNwzt0<0!?M448+lR;6WkLTkIp9l42%wE|f!k42T-WP-HQb5EP%bjqn6;8K%n;|z*wpKXTZW19k8ECB_X*ZcJHyL8B@UGp& zg_?8(gc$^REd+gY&O%hiO-n=ShBs;H z6ue0$ZKRLW=;IjKqc43NA$ts6HaZLk5upQ#qKo@myK++IrF&PVa`(}i{p zq>U2sG)y*GN=G;uc*BAQT5dGcMVt%pkGOkEdO!mQY7r11(Fr|TmltV}qVdWYms#JS zr#{5XC6q~BCHvjr?-vxIp4Ezf{RMFtYWrgJ#G%m*LvFR=W#tXvpY|G6CYF&&VZ;?7MwKBraNY9v zTKk@uKERnP7}sgje=>~}+TTHy#exBNba6fvmZ`}<))zUzSNbf1#wU11MD=|CZT0zI?MI+eO#-L@ zevj`BCZ=1o=~;X)S_{8PAx;=)3a2PZ^CtlAQrdDi&V(9e`zm(X5K8opGTI-;pd|>) zA8COoI7U}76s-S_|5R_c;0ysVsCP|J?;A?|*U=7$Y`ng5E%LQPCwP@BUS9cCp?-Xb z4%xlxoG}Kna zi8sVIpr$p%q5@~E%f2lxRO1&-X2i#+kA;rX{4w1y_{$$JrQN$1Vp+81?!~f%u&5Qw zD3Oy60`un5C=}7yi7Uoo9t#gB77IU7gZQFs@q!{X*pMgV8x?B#7)?R(6|ro6$c+!Y z18r<{P&*Vh<&of{XvzYV^ngd`a!ZfN(&~!b^j|G&dda`GyLf|H?ti$zNLY6C^{oz{ z<(9oA6>@vx9GTB`@(7BTQ|jc2L(ku|Zc7{vanG?PkYU{%XCf|=aRSs~Wu7jlZ*n(s z?{8VRCE2!nDN8-}C+nspeeZu{(?6`sEoM9vuczrR4@G>8`q`)`=U=&Hah1h`_FR9O zsPFChM|V^fs^EURHFh_%5@%V^*42qd-tK=m@?WA# zqZoh3`g^Q(J738d!J?g8t!3->0R)?Tpi8_PIGwBL|o)~`jgu;Hjsl;a0Z~gz3u#4q7 zs1|DC8!${lbzTq4N*5WdFKm2`=7*E7(|Fb5zW9bWRt8}l)VYw;HJ>g{k2j@D5I#aH zhE%D5PkytA`3?p_$M5uPSp`WxckL1jFe1kEJP5J!w5gT*P9qbO-8cc z8%I3;%XS|0yg{$_^yd#}bZEsmHvZmEPwka?JCGFK_zzRAgPy@wI*-oHcBx--Yjls7@ z1?XJI(iIg>v=zp%+*T%{{9fcG%}POIqC0-XROKWUUMUNcBsv@{qQ3|^JGO~uEUu6L z_mR4|vV%qsk3aQ2?JjAfr<(v9iP z-)3}b6d+o^Rd|JJKl( z$v*VeWcxE@UxbB|RBtB-%Rg|~0yO=3*>sZKx{0@_1b53C4-YJ*NYMT5IJ(1eju_u% zJ1P`$hW&}i0P9M0aITI)5L6jHpjxRT76;LvmM=1JtyYr7qFR}%{lnHsnrN7jMz`vF z2bD?)2n9i(QjacI!bo>_tck&)H8q4j?~Q^#HMT-GEQ|2x;zR7q-U zz@|0X=XlF1#1-w@3zU~NCBDmk^YXH#$PzjUhi)axK>NX2-_cF$m>!U9!;loQ)ukfB zBIxBX?viR4p^(5-F$7FjL&vvt2hh!C&?D*Sr*xE3luvIjPt5PB*2KHfl9;Y`+~LUd zQUh8}d#k)GREjr6$uvUA%&KNaHpD89e38Ury&hSOrz$*M99fU^3!vC|!?I>%eLVLB zl0+KIYQ8V7m@(78y^omn&iGI1kk@Q#v}P;tdjt_AvP0o)Ul4~iL#VU3r!L<^N3^mL zr?g-%YAmzDcGNBC^(lw9O?xv2OpA%35n~k-W*4fC&UgDeyCzu^yr94}dJqkriUL20xs#+(r_gA$)Jal!-uRr2FhRg8Jx?c%pDU_fm${I{J{9}b zTUW(t_nG$+kqCkOi+b1%4~lPSD~B~{m^F)4h6v>;Ch=^kD1}dwhQe~SQ2!xL6u*ID+-R6$&ao24Dt-JX2*!QXq3O>{A zg>g)4Wrdjip5hO7dnbH+odMX6>h9jalgoP>Vz zdF!n2iV3|WrSMpS)=Y{zoz~d@;Q+mbj+z4krn54A@=&`T7}s*{Q;oy_hvPBh>!i|u z9FKV$udx3=9*?O8h4IbU`apg><|I7*e>xsh4GR%Ej>n9V1p%=aovoFc@DXL%{$Qxn z=z2VFv5O7+67RT!2Jg6!BK8hoSD>NmLDe~;)vViMxndV(_BHF4SQW>tb7t1JVkI&G z+wYN@oa0gdg|~%TVR9_gej}Sddoyy6xP$Q#fUL?IP}xoaUHzz;yZp;!HM4EC(BQg~-a?3FWlQ300KIkP$B02})&n z!f2NYOFD|W?CyoKt)Y4j=fX`e=Hpq-@@Df#aUGtNac>e=HP43mCGkaiXWwXa#xoWx zV1HCKYUjqA8xL>1y-}xHlklbav$zSiG+<+lF~9jW`$lXhYuHOtj^$ayZX$Q01wQn^ z7LAq<@uZ9=wdM!Sb=V?Td>NyN`!t-Hm3-Mo*6mb!drgHP;5~c(lkHF zsv|h*o7Mu9Y+ZcRaK<<7Ki_omO}jm6+SG&JQRDxPns$5Cv}IANLn3Iy6Ajqr-)OvX zUlz58h#HatQPY)0P5XD$G}@!amq$$-5z>`KO%_SF6s7-&-K2yLGryVsG^WB9`#4Qu zi$RZ>z+WmN$i1FeE`%S>CLo{b%ni+cE2~G@O_D3welniKHZ6=~OjwWyN!4 z*><$p&N=!a;dOg>0#aaNREsXdt$K?V%bTBhQ9SG+j14Q}v43zp-Ej7@(WL}!y78>h zCEl3|b~UsHutw{W6qDzT*FEv!zERzcXAo9a7+o4?bY(_|r7@Lg%W1F>T8ywf*IZ45 zir3_o@~kiO#=x6+182EmLL=QF7ygCtMg}=I*%wV1(ZqACNO%tq%9_B;M%bP616qQ3 z(oXM57)ozpgWr4KjeaCxuT|MsduXJ!do?Cr6k+Nh9$0UML@rKyglt={UJa!Ru*5csQEZL7Dv(=+@ZVEhhXCNEa&sk`93)Vo3dT7j zuf+RcnV5&%FriVk&Rbkn@q+KAS|?U1m$tQKKt-$B@(R0&-IDcDn$;w=thKzDRms7O z7sH4W3{B`Q{uaGKD?{`eUJDb>&-9;Rd9JF+QHs@2j;$lB;)h{e_jcrqc+>2c@y{zH zd>CoM=pKv|VN}~#Jkwuhy~wc*j^Xr|{MJfuU^S2SDcY zsi39FZkH(Du7rbGIaDij1xQU*2~|Uk?^B|T1{Q{Nod^v1=#k(JN;mY)fRDFMWs78Q zWs7AuS@#r?`Ty^lmZm`BfhE8W;3RMtXaW?|6^Je{4441}0I@(WumRW&oCGcd&w(F6 zmkb3m5*Q0i0cHUazyJ0oLxl2nh(ePRSuQlR5k`z%(EN zNCOrFyMQtvE+Hr=I4+KaMJ5JDgv~YxjGdD(FE}!ux}B8}5)vG15FZs~5H~L{B7&NQ zMaBomMg~S01joik#S#(}6&srn9UnZ~ATB;OIB*`d6B`_p5F8h85E&J35H>G5BA9v@ zJo|STaq)ri!LTKd9dztA2Av47QvVJZpAvzu952@hSa6!jh@WjI^YA-sWAov?%Lnu?Q{13{stq z907+SpOguoXcJ@7mkcIWWE2@qT*xFc4MXl+giDY3{_}(TfBdk4e7i5Q!!iGBSd@00 zBOd8B*4nb4nTeskZg(B6ZkifhyL9IBdAv^Q>T0-DRaI3~RJgKBnO;h=OYz?>g@0U} z|LFq5{Od(obJOb8C3d*idz77}cY90ADmzQrb<1weYI@zL=CF6)&gI#Bjs4DV+TY*U znforP{A%`vzT*1W;{aE{4VVOY0G_~9z#H%ZW&nPGKM)860krL(1B3x{0orMZ0%CwT zAOT1MQh-z-9S{H_APdL=@_+(B3={#2fMQ@NupC$ktOnKs>w%5HW?(C@9oPw!0DFLa zzyaV8a0EC890yJSr+_m+IZy#q0T+O3pa!@CTm@=@8^A5#4sZ{+4?F}O15bfxzzg6N z&;Yyv8iDt~2jC;{8Tbk`11-Q$;1?hT=)RKlOcDivZcoPr=xm5Ozymr1T>(u%3!uC4 z^#JI+u|8l37y%}LDPRs*0CXYU0ALVc3DD(T!+{ZiHDC+a0S>@uzzJ{$=yEStzzvuL zcmSTjRKOeX0qAk>etH)sf z1yAaMPkVxA^#KDs8^Wv?z8S%eG3=VaO>ek0g&#dZ4FiqCLF)+6JQB29BMwN+<)aWMJH*Waadbpn#~{v5h`Te=zy)bB9%+_X*zgT0EqCM1+yG{%Y&T)*cHP~5!^0< zA7FrEOX25o_`M2YtU*}o5GGdZJ=+8twt|-JplK&)D*=srLF<0dd=RuBK^%@DE@g<* zNyP0m;#iKjRv^yj5%-HogBqm86{N{Eq|J4t(JiFa9i&+u((WPB@G;V|9%=dlY5NLk zEJ0c~BF*0;?VIFvAEF>DvndST!GjKL)Il7?2Yg1CgFAqq8o);_;2l9%>q)9(64hB;k|)>zwo^a zLsC#^?NAUMrZXfjo*_Eedt15}?^hVo@RlJhSjsBs&myA9ETWXmB03vcq`VrV#7`{J zpvNXDu5401pG_+Euu0w%Hqq(IA%bxnQX%4yhEp8U(#(NSPJu9q3Ph<)f#|d<5IaXj zA}UlQ4Yw6ZilGv*i&i2IC|G$K%0wqznMf;?iGwbeG$eCL%RMd;j8Gw>^(sV(qe^t< zsgm+KRl+!{k%r@HB*j9Vly6oi72P|LycL~@jwX)?R`Br7Ck>nVq{X5$k(PBP%(yN@ z=}{M=6Wf*8scI0>P7Ts9R+FT>(Ij?@x)BE}Et2{`mRfq&gl^yaZgh2qfeN=2Bd*8BqQh|b)mtjnF=9mzHXKzw5+LSa5 zHzO?r%!$;Z5A0hIrGb5kj#WQmH>N)kO&LHMLI;u*(I8^CVK8whw?z0uh)$p zI7C{JhHWEA%hQoWpl?G&LAFF`?O6GnduQ93%6=uGq`cJHSVQSo%rFwz(C_ak=e{fUED zAksgG=+w<7(oG@6Au5zKIEIs!9uY+FW1g(8E&-o%6~J4l`y4vqxf|*p)I}Bj!Cww2 zhtpt&GAmjIRN=W9WaAnD4b9+^qwM=&>ac&9ow1b6a9=??{-P&ZHv1jg&-t!cQOKuqgoLcn;xuM3EB5 zB;v49Kt$pB#C%sV;rgy6OyPFI3_D1;vriFo?P?PboFd%{imNh(xSu*6e` z;dU`+N*0e`Do&4Qn6q$p`Yi7G z5iEz|DXa>&XckwxfK{@4H_O4Rh9y#Z!!ke5WpkHUu$iQZY$hd^&E2q)ZT{{ITNL(+ z?V#ICFX<%%(Z%3Qw^s(Dkcswm>Qs)K^PT1n+bHSRt}z2dK6b%#EGsdKLl=~QxV zW2Xugbslppjc0!8Zywhzh%cJ(fG?``?96>y+u1yOVi)F8ZI_B8o?T1aA9UsJ3es?> z`k+yK%tri)uNRJGfX-s|w^dXh(p08j8JnlD;+v9oyC;I3y5AJv#+IH{ZYT9$TKhwC~QY) zhf|Gv6@AY&Zgx^NJ+c0<`HRquzM9>m2W;$DFnF{1m7x|JhL7+wxo(pew8DOz(tIdH${Z=mv&|0G$a=-cH+^nj7F~@XXB$fB_%g{4IyX%H_ z7j5jX-V6y=W05yWY_fWb0vU?(+%H<4JbT%d7*^?$_s7jh!V)Xur8K#9^20)=$9-vGrqrWp83}klLySZ^m^## z9V2W59ekbkZ48)r>~EiGItzV+!gMpDUS-`$lb%8Sg{=`5&1I918x)D1ks7J6)g+5b zjmXE=5k%@SgD^j^duzfC5>q~yv0GEdR6Lr;;??@IV-{}UNK%Za{#k$q&06=uW>QC=X~r6Gv`%Idy&m_;*erPF6rF2 zD{=VSgg8ucCdH$Lq;vCQ!i4vTgwJ1AaL>wI`^mtx+U?o9VY z6J~X(<nbYLq@6~D=k(I~yVzBf zY_Y-e8FxzP6b|3ao5O$U!{M*<syxd*KI#>@KV5YCd<50tlr07t8AJ2&{jyA&vm>TGGRzt@xSCAY# zCve78xv9C4o)%w)SzM5r7Be^4f7;{;W9>)4XT$D1W>s-vc4|UY*eqW!_wl1`hYzwa z)?l`*UA8bskP;UW5-@#=n=``e-;>$9eZ#6n1zG8d(c!aadV5f!`)OQizb;msK7M%L zuB{tZFB8#C-Zd~Tk06JM3KP%#&7`ul*%#S4oT&=K6it=Pl}B=Cs4P(ZORYzz6y7Vo zf0x%?Q#Ez9E^B9ZAE&F+^Rxav!}CTbOpcqLHm|m*>-S-R%3$*$uEV0NmXADT^L&)D zL%-4PPEpR{aa&!Fxm8ZOG;xdm)mH< zD4G67;pffxGa*a_)A6O_F1IlV-|5dEzgQ-j$zZa;Li93|&-VYn|2N}l>FW0~?rmz` z$D(h){sRUK8f-aa=&<3#M~t+#u^nY+=ioScjMG?WXEO~$^MON0*xEZfIgfLlFwuST zRBxXdzB2=612r}vDRfwM!x=0?ROrle(vvhu_W zi{c)9VL7BA39>BJIG<8Pte@h}+J`6`m?ywf)ek3)k*GdHw!}j{b1h8DR;+ z!X;}q@7jO##Mw*N?>%|d*z{G(H+Jxe6fWMl@5K4q`_JEg`k`t*evWYE-trsIK1#V3 zlOhYZo~(WGP0iFfD0T6+(u;Rre*DGl>k+eX*SWimQl&xD1)ItrH7i>B=kC7pR%w8D z>e{l~?-hpx7VN*?q%b0U<+%n0>!=NvKPwEMv-DKGf=$fkYu`Bz^AFT>Mhi;c*0*1q zaGf}D;_%^Jxwa-9hE2F?YiloFJige`jM|_VY@Mj6s5pLnZ=ro}YJ*;|RSVgCMa9uY zj%L&by6YWiH)lab*s$}+-)$MZuCOBc>Lf3!Fx z{76x-=HcAgl?Ues#T^KrWwzfd@abOLfVF!J{ipAi`t>Y%;QMOlp&18uWKB=sKH0~8 zo8C0jtuMWpEjy>yZwi@meq%4sJsTc)tXRL$J#U@;q|~+V-Qw1)oDj3x)-`U`^Kr>5 zMK0MZ^qiM0FLm0v%xz5h(&vtkmc%)<6*Km|ix-TVyja6FYtb6(6AOEe{9Lrb%Cbmz zc=Cc(L#xD{hjbAa3=S@A9eB1Na)4ezeLrFT#J+FxPWAE5>ur8HcaiCs+;1k8IWvsM z=9KrU&F*FBo1LZqG3&WrVU~lgS=PqxS2J6*6Eml3nPl$Md>~TNSSIrC;wdWS>xk5N zFNCwyj|z{g77Eo=f`tLfV}(Z*`wEp5x(j{Ts>1yYONic#(6fyt+|jBkZ26%hbZhA= z+}u1?`0Z=3aQv47;l@u#gQd5zpz6UzuP%HpnsdHv;rq(0MTr%Y7n5@)#f#3i6&s#; zwB+civrAo1?pXGsY{_!r@yr#5rO7MLAB|lVek5wO=Ha+C$lbMZ2Xfb$?O(C}>E7KN z*6yj=IDPliO+8DPEw6U=-g;oiq;2Wj)3>{C+rPtf>x-St7TuEiO+LHNZ(Ory&xR*^ zSFG>7KW|;^fz-9<4#utNdN^iv*pawZRY#Lo_AJd_AvnHd`HQlh%f_E9UwY)!qa{7h zv=tYf?OiM_pS(D}B5TpR$`cDi&VMd?e!;S6R(0}%mzS!R#KN9DoTob3;5k#fG-Po8{4N){qT&9cg0T+Ix8 zm57u!$=oA(Ao6^>Ow`ioDcbyAM>PJ!3*nchqrwfJ3Wejo1Pi}>9V^__+*dfEr8{y` zRk*E{C7j&GActAPeT=GbI$H-h-&c4xeHA% z=Ng-P=bh;DCT~JtVgBQOx&`wFoGoY_7+jb)m@noJsT8jmnzW$D@WDmvtv(m^7+JP( zwRP5_uC|jG7mhM1CiZQ`F%FNGJas&~bi$Y&%Z@oMS+3`txkBiYyz=R|*i|;JQL9%> zh+EU>Hh=A?NxAEa+*hox^Vq$?(6ee|@RX;Uc1&fqJooCowa2tc+dO>Iw`Wb?zvJMH z7d!9!>Xu0Te0Cf7ui0Z0@MQ1Qz~1}AXT=^!2|9N$XLi@aMZsZ57KKzDEt=D_G(S{u zJT2@+S!DS5lRk5goN|chdB%8N(OFicwERJ2e8v8#ca`bUA?KZAo?lRpomG7`_T{Dg zxX{bC@gJ`I9iMb{Z33s(F>%TD7l{Tpg-M5RX(c<|DM@~CcUVeH-RTsS2czb1e|U1f z!{b4zPo8W`O|R#nHcU(_e^Hkf_{tKsWMTRq$-{Kdx4ko38Y40`zu%WJ{zF5?mnJ>I zhEEd&L*_WZ95s|T1(=@|V>tT9}c47MZ?w09xx^-#K z^^(%E^!aIqhTBrhds(JVH$FB0i^-_@3r)|Y7@H4EInk#ic|u>Udm%xU^uJ?F@9p-V>C({cHsHm(cjte8+7(&$zcjNF}F)~@~M%MJK=?7;__POt?H%;pI(#ybq=Tw`3kSS9GdwGV>df<@~ zw9q|gw*91{;P-BeLRL;Fnq%vlANqV;TA0WsGF;EuXKtyJLxkHH<9W{=S&?xL4rAKSnI>)TBR*&sD@@nh`tNb|K;kNOshW;JjdC1y?g29f6@r%UB0m7vEep<;B z`<5i1>N6~*xB2OmMW&3C zGxljlWGHFu%kb~gkWtFl6R7bf2xh4#3XZF;6{xA46a*;W793T4jhy@{@MX6N_M_Jp zK+X{ZM#vZtA*m63)w}KnNa2u!zaKJX{3y3qrX_ka4-%! zPmGyt#+YQ2mt+jHjTwW!EQguRoM+T968MYsWfm}fvG4plGJ)C4OdxxS8hWIEF*vx7 z+$KYqWy}z=jC>(en4`=Ta+GLb7*oS^hD7HE z`pCu1Ajow-LMC*G@qlElGZVwyV00kUyAS!!YGwqab1je%onU+*XVYO)nEQ+ZB!d?q zoyuWMAme)lIn#E=iEJkdOfYkSQHPxHDr8kfm`X2#%*>71$GAaur_Rh{t}>dC8s35A zYB@6$^1rW;K^ z*eXZ@vlt`DQ(r))x0M+U$tar%VyYNb$YifTE+}R!AYE;Qgl`Yy3OT7NGncu-bcKZW z7Nmqr8B54oKSSPkgz<#bv?~+G++uoQwDk}&!?lbxB(Faq{X50XfDE+9*$OcHaC(T9BaDP)uz89PXNrI0q3Gyag->N5i7Da!9alwfpY zFn3^&^0)~l(tx<5EFVN^=8z#MXUkC1G{_i~nr$dI#$*ag+)n@a6GiZzDqm)W8dtrl8xDMq|mrOvJ+KW=vm-wPQo<@np4%jG3#VAXiAv=#j3A#ZH zAte`~JUkCxV1`C>Pv%rm&qziEbe{KPX_QGg66MXp`I&j0l zcPqeo-N;yQ(GKuYZ{h_GECmm$kdff`HQ@N}WIVWcH~6;?nGViB3EuAneYr?*)HTu* zvosmt#wVmdnF;914+pD zd&Cra0(r>A2Iw(ZgYVXY^Ljw1AQk-f5V{F7z=5a0gFNUTL?LHup~o-@d3^x6Jpeid zi;%}32tnQqMD7G2w+xV9?#MAda>*X~6pj4VMGj9u9;+c=ZIH7O$mzbwYhUCxBxuN` zamXhw@@52bCk(k|j{NdLjwv90ha!c8k>Vyu^QlO6O{BCF(mDa@+#M-B9%-$D^c{&5 z4o8ajL7GoTsw*Omh9Q+gkZQe=ZeB>aZb+@MNUubsRS%?=E7D69X=II5nu}DkK)TI9 z$|)h9!x7Uth`A}^?v2=EZX4<5kCdaDrc{G*AmYYH?9329WyHw-xZIxPduUbrv-70U3JgC8vX;|fUN@ayMcju02bs4}+@mC9@>fO_3p z9kp+e^2aSiqcXP;5g;6@|Dp}I|2<56hSJC%w>EgCG%MiF2B2Y#`+pA;pGng{+{)*o z+62D@KLssAlMUtJWO6Pyqn7VH*m5v&mu3-Sd5L4she zAW+~Xa241Kh6v0AJp`QujNnVg>x{aLnv9bfdotE$h%-_%!ZUm_Tr!4b7-w|Jkfy&& zzn^{~{ZRV)^!)U=biZ`x^g-!8(mCnx)9$35N!y;bAT2I!dYVI;X_{Kvr__6?r&Bkj zW~YXxx~BF|?VS2~{+;>9=dYTdGJpE~k@LIH|B-S(r7UG-NaZh#iS>RrHKm@gA;8NyC%L(IG3;@VQzwbf@Z?o__Og# z;)CO@;#K3H#2t*wjGGc?689~(I(B93oY>*9im`WNw#CH7IK=Q`9!2ktPKq8K&5wQ* zwKFO%YE%?A>Q?0X$T^XNB7e-QnzvxylzF=IUPkPVh>I8*K_aT>7R{YJS9|W`@GapX z;eEpY4m%u{5M~wjGxThzFw`-W6MA7z?i}YiN^>rS*yn@ZKN$>=BSxp{r36= z`E~cZ?wjjt6?$2F zy_>pj>V&DSQ}#}oF-3LCNzYJEEzb*+<0czUuJuUsF!#9Yp5;E!{n4cSNkb;pPZUoa zHu0I;0=MCA&nAc`44v@QHQ#lx>%;Ncpxau z>>ei%r{*#1$2g8@7`%7c#QaHRctlL>iY2L;k@Ddhq(=VH?(l5`OxYiAwxJr zwpiL(J|3JpSbOlXL6Zl47`R}d`M`?6bmg1)-`_MWyq@90J7arD;eTIycz5!j=p`{M4V-OuVw)p@6#sjZ`ZP;0E#<8E=? zRJv`_9Hx0yBS@pA>!PkET~BrK=+e+Rt#g;oyZE;JTf8t{Tc>56%sZV`pQ8RoEkjL1 ztweQ{>MfN}l{W5Dt{L}?@?_-(r8K3^N;?!sD%L8@R%qcYu!(pIbi_e=_}a`s3t}4Nd7yU7B`%81>=S-(i1C-!Fe}@xJ1n z_q+FvS&cf42i}f-`{+&V8}6Hpl3|jo4M7b*UKhVMdtLs@>(%?0*)Mfp9(m#V;`#IW z&pSUadFJr!etk?mw|?`}kxy?vnfrwOWZmPTkFP!oc_e+f`r+V*R~`gEXuH4a{^0vp z>VoT}_txASa_`#Ru)CbQ8}5v_bNhDGZPnX5ZaLg~d^6>y#?6B_+-|(No^!p|^|Q4z zYQJAwer@oz+N<-fs$AXm*Vw;aUdg;-aHagR-{sbtwKXGa?q5p2q3d_m{J$@4SLw^psMva5PlnN?|0SzQrUp;oc~oX5E@<*UlA%b%XjJlp&1l`~Oi zx}GUJ?RT1Wdgm#(Q=d+*Iyvg(%M;=ggHF_y3CenxT|J&~T<`dW(s`wtrDumbLeJ+&2^g=ZyL9WwdvHx_>KKHN;YiS z;I~10!>#oT*N+?X>jn zk_}5jmJC?(y||)STs*Z{zxeIqV~d50CoI-l{9@6;Md^#iFVb4{YT@C9qJ@(d_FVYB z=uA;jkzY~2qP7LK3pOu^T`*>W)`BPs^X0KQLb<|5e_(ytR2rd7gO#^3?L);+( zo!Te$!~7%j6Xp+_|1ITcN=!=Ml!oL@$==E8$(2coNoGm+6AKcDC%#HpoM4^sGJZk4 zWqe&+TAY4dMQmU!iQN!m9dkE2I+`23Icj*+)yTle&+~HTY0ldgF*u@puIt=8;r`(b zVUb~9LX$&V=VZ*0h6qC1g42RqW+%-45EK^lY}T|{*8;}`mIYV@toK*K`#dC4fGnYu>Zw=zxod8JJ(`!pS$L2 z=Jsasrn`DSH0fmGU>s+(z1LksB||HNQ2kXstM!_7d+Sc=k=6Z>&J%4l?Gaib-Ii*W zYrN~K-F0-AsLpHo7kM8$>2`8fk5OBvdQqi`+nqZ`IZ|nrVx_`6jwZ*B9mZP1oF=cN zJgHUNtY6~RV?Uq%Q2sHv#rJz|^TBTqzAAhj@WtnI_NN0MA2ca64gBEycmDe$@18cQ zHCnw5ezQbU-thi)kJsZ~CB5A7;?8r<^C8b>*Drf|;mNnhW{-UyEqHkL!N>b1_kHS$ z?p5AxzSHkc(CyW?uHRI?X@4W-`r+EfYrU@pTwV89-4%^19+wx@T)m`r$+cR1@vjT& z7bcxwQgx?Nr_!%t>$x}O1Im-mmY-2RGx_woQw=9APYO<4E$dMhe*9#qN~!O${YROj zQ;(D!mL8gVXzxLVgEJ2t-`{0_wYhB{H4{O8MzFrfw=Gp3i)z4PVTJ>sW z*vh|G#IN|dJbStN@>R=>mmOMax3qSN|B{cz*~L1=`xiSce!M7gQRhW_7mi!lP?T3> zT2!-O-h$2xj*DlC6~zY&rxz*}9xVte=vr_-KPlfLzdmne-lRO`yvp2+T$|hc zb4KN`a;mczW_xApXTQxV&C1G}oYgDqOXkJQwVBbG&Y1?8KSXy#heV4+QKCtrK_X4j z4`IFVlJJmltuRj*FANfT3dabCqdXf5wNa8)QHoiz^4lu-EO;fjE+`eO6vPUg1zLh< z8QU{vXY|atkuFR(PyZ_|JdK^UBGo8$&;0)L_of)9tW4%4M)6t>2HB zXVo|?Wav{%ufdlG+78&)uSehfKA+5Hm{yvY8jE|qH<+luPftxZwEKB&eXV588(q!2 z2>EwA^;H+C-r@F9PFK9aF=i(*m!*1bF|Fr+Xt&I5KKE7QOW3FKrfwhRy}!`d^KG)^ z*6RVU7QA@-Y<&HmC!HS0KCHWMSGVhK*E_;nA8rI(zje*!YWbBBmycbttUh{S`1v!H zV=Hc!2b}$QI_H$`$>U{Hj(<6}>Zsk3w})099Cx5?U+Lc1J%e|D+jVAV{*GzeEw-_? zKHhw0)25C28{*doubaNsbB+6I&s9DvgI6RhFIcv9X~mM4#j3?ti^CReTKKR?w=#+-S-M#jnR7FHWL_7EMXsXGqQ}Dh z!W?0saI~CU9ZtJ?b@|)E*aa|NYu$D`$Tc3X~{5s^*v%eQNj+Xp* zS^6yLiQPlBx@Wh~+}M0=;g#%5*%ua8ZY{4m{o#b!@p(tf59uE$+N-jA#m>RoA8%Q` zDP+Uwb%WPft{S@{V%hd39~ZkXswx`4;8o%Bg6a7~@{Dp#a~!f`vPv^MXJ(01MZ1K4 zXsNhD;VFU{Am|#m<0|xaF@!bP1^pK~wuG9c?7J%NB#gtq4RZA|;JJEHV z^ThE^E@Q_}aJHcr+|$cN;2?4oItcC24%_4BJJENN@5Jeo;?3jCV$HI;1qt;56O>_Qx8IR%aP zah@@5#zY@4cV9<8`w;6nHla2NLsI(|8s+E*_IB%MJKfJFtj}EY$bRv?V|qvTPV1iC zBfskcjkTRN@;7wZt$s-5l=3;n1Kf=&nuo0;oxNPAPVt=KIBlG_i?8b}m#~p@hs6zv z9Ug5ZvdlJHVYonVmXTYZJ}Ci?5f)Kq34K!yl8uuL1%|o3#F|UBR%vX|S<`)o=01Lz zdYQ@!buq8oVY}Gzlc#w4PM$L=z$IXG@VL1yF~bvwqz_3Pk}y1PP=V=sgJQivLpL)P zo%V>sM2{!2uS!ty_8qWBhbXJ_yJ~7_ckiLA*HhoXz_3>@BV%I|6R3w{zC}JCft&oI zjPnl!7%}_~TsL6&6dhLSJ-Ro;r)bh+`0o00{PTO$al-FFeGi6D@z3vsXF9}o%=k%D zruq5@g@i>!K|5qVRRYP$D-bVSRJ?Tg%GGPvZ`ibD>-L?ycJJA@|KOn`M@x^NIC<*K z*>e?@=Py)Ws=4yl)!OSfZr#3fukQZCM~|P@KYQ`=b%W$>$mSMKU(R& z+_Fp8Vu-cF*zprRrg~5J^Pfc(Pv%9%#Kk8j&reMk2s5*Ca`Ouc7Zfd8T)cGI@|CMr zuUWT#!$uIWZTpU$yGr)#-M9b1!9$0S96eTgybN@lK7HnFIY_BGf8ipCxqJoWTmwBf zLD1d1An5^Udh)cs{@L>vFJFPKHz4fY`@cUlfwnJSzcquppRK>zI_M+HdggZ>OA+4%*v^r_@vOK|dn!o<@MifJTAFK^6(bfu{^rdo?yo zT}45W+le7uMK(u4nPJh%HhQrzS%+yiXm+>H(8=fN=zsZ>6fBI-(A48=_oAj!`X^=D zSZ!^rUo7^oR(30g^Hbr+PsJ8R1!d@o%iX~R9%Qzq3_Oui`)w>Z=&&FQk)gKeS1JBj zEGfIK4Ts`Umv9RcDU00(GY;pM!mn1vRz-!M%0GU#aDOUG6{U);DnC@(aQ~^&toBQ( zO{qm)=C_Ohc#I%fZL;uWUcnzWwN;j}CS^@ZNJv?RWt<{vP$h(?LRgAjRMas0M{7|o zM~Q%LSGbFp61lbHV$ww}|jb9*m+Bn=@u zr4p$NGp>)|Wl^R1DLw>oiERCI<)L;V1kko(?OE;MG#S!^3vDlcaTGY3_C~KqT|EC88Ki-kSq1V;dPmwSb-*0566jHu-j;f> z1}F|usaAXGt#E-&K1tt6KT5H(19QAOq)B>0x?FllIv8@oDArxJvO<}{vbl54cg8#? zH1o+f>09Y@X+8e4F*`gP@{7-qgQY`uR?T$%y8N|Im(S+n#}9#2Vb{0#$X01**4t07Las}{u@*FK_d6&pU?+S~^jt6fi=Fu)#Cf^2nk{ZJ zwO%b1vI9Tu@4sEDz^?r=v)2h}5NmVus%|%>CCug@M^)b=jMcz6peI1}FJ&xhk9B)~ z2tOL@p0IZ4a5^Ez0(^vd1lZ9Lm1Y-A{<e8hgelm~`>;et~ z=YV=Zc^TSh;5$H;bNGBfnQuUxtt@(KswtA{?Tgd?4|(qa7S-|njbC;bwin9M%K}T0 zE`p%K4j^{y-Dm_UHUt9*_QeuwG%>~4q9)c@q9(>(5GzelQ0Xka!_pR57WRK;OVs@G z{pI)m-{<+i@ALfUa`?nNE&l(pv%tc_rr4j8FdC%`&IemEl_6-Tk z!{<#KA2h<-&C%A%)QHET>yilWwmo}}9=&{d%%a5PZF~0ZIe75s!J{Y7p4^tY1MUMH zIB?+LQE>PkD@ae5Ui(A_D}HF z=`sA=s)t}j>QQJdF&>>T=8#GBrdi`#yFHdQ(hMBEObF@NnN3XH?ls1}a+5V(WODCf zONxv;IiOuh*+^259cP)=k=QP58@|Hd19r}t+G*GqJg=w2h%$X>l@T$C+@{;(wy;-c zz<7*}eDRPjU8m7Jg$^NK>sQk0ww_WyU6)Cw!iy=4c^;$%a~FL!W67$u$*eCD*Q7*_ znj4SeS5Mo#anr^v>o%KghkNmx#p}P^x+6L{<-q1S8`o|~xo~;qDgn&EMjlZ*^PoKs z9i;F~4@3JOfwl(h1quTHF(8(Gz|7d~KV5%W%@z1fj^6a+m5d5Qmyr1hyMMX$x|U_; zJw9UXcb8t2o4bu!kg)T_^_&W}vG24MTaR7Ospguw1uaP2fBs3Cp{Zy_)Y=2*AG|ZR z@t(SL?T;6-s`ys!!7DZ%y!b?7J#Fcv;#pZURNfF5h&ZQTc z+4_(D?2E6@JSpef4I3Y^=D@`#Wky!sqZh3C=KRxAV;irK#cRHWGE8lUO-|Zz{Q3(C z-*W8S6&ruJkX~qR>l-w4&7sTL6&7~Ei(|JO{q0SKk@@(@FSZ@I`l8s*HE_zJgrnDT zYD}z#M{L}4>W|ko){g%3leZlI{Y4$$YABi=zyH*uG7GQCOTRq+$CLNsGSby96s7; zZ8Qd5K{Em0c%~6!0Ud#~lBPbsrQM_p;ZVoLK1BDXf5UpoP)jRmmuV+xZ)xAsj?phb z*aFRg=u08Zk8CM(Duk=^!sWcByEi-?TvLPLKqx_$dXSHa!87rO4=E#9;A=&jqklWrb8v}=3ety>pP z7hXKNx9itiw=bM7C@qNpUY^l=RA zQ8eG2K~s5}t}oEXo?gkt2x|&X)qHue0~I{5sh{2f_^(tpFXD!)Jn1vd#+72iZvmIQ-+Oq|q}* zEgT;;e<1n=p@X)zfgFBpMe0E0p$Ww zO&o`hnH`n1?Ym!of0SF^#x@(`H)iIN)#Cj>UA&uB(#(ayF>uPl6`OY*I(Iv#LdxI^ zz0uUgahv!3boqWxX^Xy*!?00P=C9naS<2wus zp1S0V&3lfX|0C^n5sPc*ho;PpP2TqXx!YOA%{)Va(0}S@vB|rRT)dNA(!#WK9XWCS z^0hk;p1J-cud-c_XX_C#Y2nHZyN~^P`}w;HrlGal2#Bz5=b>NkWEM5D46QsyjGGs= zcKi2dZagn&&^NL7@SnVJ#fBZAZ+2M=N8jBSO`5+lar=)K@4YOQ(s@?S{^RB?P1$|q z;{BYm7M`KdYed-G<;mL*p1Yk{)XdVi8a{6N=gT(l`r-7AjM5garKf0WMB1Ju8yMc>%oW#p7aahvuYy>RcPL`vh@ zd5@kMnYis+Xph&DHa2fa$b>nI<5PDZJazMBMZ3P4gAbatFeYXDHz%(=%&#-F85%q@ zYR#A5{rubA7jLUN3~YQt=Pg~cdCw20u3`OnR-S=j3s$5+gsYIBl*_mG4xBJ2A}(di zzAMj)S|)H-G5_iKj`j6R)N2la?xi5Yl&wr1k+ zuNdB}@hVHGb;q?=TV|EUw}Q75O0t1E;u@_2T}CjYKu4_aCe{e%RnAq;C6*1u!J*?p zo(wtTym9;}1_$i7lZCC84CUjz*(_YP`Y>YXa;01=_C2;S%o^#C)*IRbTYfIo!5V68 zVPtK1n5E18f*rw{&YaEOz{YdP7f=Tr3U8zGayZ3cQ(QLIpaDYEgf);s{T~?CF$>w3 zSlIrlP?PB}H{kyEuL4dgGHx9>M3x1 z16IWS|ZR%41-sV-Vvy<4c||ua#xU z#`Yesiih>W+To*tAqD$k>#N%b=ZbrYI&3`5l~jXr{Rq|w-znqi(k10~|N#@bjzouwKZPJupy z&$v|RPhzli3AFw)b|KqJ)l%5DYWrnDjOh>$pOaaTR(+;oTdOsl#uamMPqbox1Ls6B zXt$R01+2opgf*BE!;?{wopI~tmE%Va?@USjB5qaWlEqU)eZ0NgT?IB41`INx>~E^g z&v8dgAejX{)BJyuEj6bZ-8>y_XMfSSnQKq~oPVLFmp6 zDJe_GED2q@HaR(F+>#x;e!6wz@ZKG{=X)pJ|9ag@!BAK=5c;GyO?x-o-o1RslAX(L zMBTi&BWi5u*pLvrZ9!*aLWM9R?*O#33)!A8JHB`2%DFL7#hcdePF}h_Vdw7U7gu=O zoqo6P>)SuBTbc&f!r*jrS53UTqwmD-n7AX!bE8wD;mS}b3<7#!$=yF+-!S4bSyp8nS()a!(<$758U{`y<9sH!;9J99WHPuuUG zS?l5jL)En?Lo9)f?I=g!zfxHh!(FKIyq#$}z8U)thS{QbfDhJ9cJ;#>rg!fi=Q?UH z4%!yt9kMbV77R&Ye!iQO$}8WWy!!j)-%elq?a7U2X*WVeApzsp%wCYZ>&N{k_a7zT zE(IB$X;ZHibm4h54qUG>fv3T9Y*awJrwqOie{nWJq@@NCIY(mPjd9pd@aOpx{RNk;-GWYn#`1Wh;EhJD9r+ zqs(HgCJI8FPW$%t$hx~4-(+UIc>3FnQT~3zJ&f@!1nun#LVAkA>jLU5O@p^xvCdM+ zK8j#0?cmJGskXwnX2w?5{38@IjAQkOGFr$>j4&3F-c$RYUFKr6yD>wzNPe1uacrlD zwQJQRj!jIesim70qbOp$LCdi&y=E^%X4N-mC@rV0NR0B8o&!UpCRl!NQ2c(4)Y81cE5fxOwi- zo{jNK=1me3QQp)9d5snNkrS-q*0cC6yc7h7|_KI|_s*w^&(bn;{m3m${2j-wptYb$wpEM@ix2NSNU zTFQZbSxb4=ABQ$BndIke1v`sC&+jSuWyNS0O9K`iSBq$W@cZ_;6Nhk!@<%^?wPJ*m z0o220#LAO7Ik=~4-5Af&@n=7g%$PWJ@v77VCokvZptIun+0+FiY}jOCP}Y!t^Sf0O z+)NlGLMfM)KZB5wwmdx;5Bj_6-u(G(+$0Y(79J-CdRt4MoK9UBU~fRfmsbOQ9W}Yv zzl{s?vf$toaSQRvn`qu*M0DRC&mj8VZgJ5gAtqD9_Xc<1}ru}%h96Gdm`3((8onvE}P z6y0^Nak-vmOw11SwiKtIN?jy!FjVO^C~vRKxpp9a>M(1r9%Q?P$Qn*GZZRRcZ%tqj z^7mVY=n{(h%X3W0#DMh07Jn{@80acI{kbCpZt!+j-rqjX0u&gK)n%Pn?r(yN?`?Yf z$CtA`4Y3slJ4@3~tQqUT!U_-eHs->pPn5r}x=xKWQ$M#unhUy_7 zn)S(v)nkMzbHGUh_Pe@kk)H)qJy{GW+Dg-puL*N8P>l?OLq|`Zu_*Ex)4VP^K_eOzGbxPwyM-9od`Qb3-QU_V3=~FdB-jQ)Lso#8 zK5{{NWS*8JtH|(NHTje9)ho!nzi12ifj&yE@utEr7XR-l*WtS8#}SuB^fMSmAAk&psR;YA42R)3I4(|u)8evmnYb)m2F@Gji_5{~Vm+{4SWm1Y)(z`~b-_Ap z3OpxzvzLJh`&ESfScb#?Ega{G%f{v5{BW6AA6y?h*A3ST*Av$p6ZT^n4#RP9T$~1{#d+Z}aM@T7TrMsL=Z(w6x?ml#URV!YF4h6- zhIOu8;Nzb%W!Q+k!i*8$9vC(4{xTA%1RwJ>a9cMs1%Q{MxEdD>!>le zGDht@+dQh?gC6i(j8#AnX;{E_$_W8e=Pe2NTz_ML$AP^8_n#jQSa|7tKxe?MfGz7@ z1hg(L3>YD842X0Y2=JxS0(sf`fjQL{ff3Uj1G6}=OPx(X;9%;wz-K-)1CjsYz~y^a z29EJq8@T+Nt$`c7b_Ys&z7E_|b1-m2-%o+phMftt{q9oWG}G&W!_w~tPCf8A&|rI3 zAn9mcpv}AD!1u$d1Fu|f4z!)u9eCbqF!1NCWKoA6P4xUIOH>-9FY=M`MPu%oi}b&- z5zR^xin5jt5e-}6A=#7K#`^1Xwm#><3;PwPZr%|&lJr_ohPCZpNnRF z6)EZvE*Cju#)*U*l0=vM)~n8&iw#>veFgBiRL(BZwC8(8e$V!cdNK}({&@4f$Wij6 zh}&^Q6iYiUvb6tMqzpbS%8fcFy0-U%$nwTz(X8sLqCEa}(VdAmMfF?ni2Cl|7qJy- zqRN0LqB*J0MdO}jihkg{6!p)04KJ$Zi`qNii!4KnMTI|YqM6^-i&%|K zqAS5|BFiHkB2H(wXjfRD$nLBH^dnH)B^`8cJ{hgk(?uP>>!BfwX-LjspgA{~$Ss16 zHZr-$@J}AbVB}X3f>I`jqQ^JJpeD<4Xiz*JHJ497-v&%V6+eWb#-_<= zooFihdfznUS~wk9+0I0X(X$Zy>}=FjIR_~$<{{7N^HJi~1t{anXNXg{5RD#Ogyz{S zMw0@n2^k0hZ>|BOq8<(SFt5%>r^H-wRL9uA6 z{VGJ!i9_v$aj5fhJhI%h8ci7Y1=`3;K-aSqkaTAv;)#-wVOtWCA6bL`2u?<*DjDq) zr=ZKmYtiQOYmtucI^=V29WoWIM?c+JkJ5*3Kq;p-pu60S=tS~HL@L;by5JSx=slZI zXz?cWhvR1Sb?j!;bZIj>Rks-xS&ET3OpLZ9ixKIl80Fp;Bg;H7dRi++SzTh}IUol6 zr6LM6GJZ@1|89y0ci4&&-h?6G4Ir3TfSiH6fc$}ifTjV31FZ(y1#}W94M+-P-1KLV z^~%qK>`zys+fTF6XB)o=x|PTXN(%oO?dsl-43Bmr#(R71BSVr!3Emq2Hvz_T>W*I_ zzrp-Tj5*n1fjQaPfxt`3Hx^@r^1s1-GWE~iYE|FFGH|JLe7y11!^tg|LolW#eYXr_ zP{sP~7-7Hi{TRW0qv4OM!b>8rVNA2XrNWbLIyW#6`9Ym8}@f%z()I8lsIVzIFtBlfD~8RiujAzn2`f$&C+3WFxs zVhkV0ufv!+)=PyacV?^k^zM2rPs`43R)rh=)`k(BR3)F^Ez|InAeES)Y0z4O0u9<} zP^du<4SH+PM}r~_PSao%M!}uct$>1H@T**OP7e5`!F?qDv|krT&I21g1b;3L)YB05 z<7e4a&$D4B2q<|hr2rx+H)5tfUQE@?lTDc||?_cu4Da99ET&;tB9%co*cM4st ziL~+>9IBRr{EbQ)q?P{qIM@e=o85r8gxZheKFq>7u!}+ZSKPN1su*do&*5X(OILNn z=AsLhKFq>eeJq`;>CbAZ*$rHVI$x}VD&M~}`}HxT2Uj=YgASPg)O}jd4`Eo2uQM@W z2agaCUn^|!X$sxze%mjqyBDx$uIt9q8+Gllvn!4>wcrc#HK)(BQ@aRBDl`G@{f)Y1 zroZMNs>6PDoNG>Bkf#4k{m^$FA`mKFY%abLz4}8a<0}Sx;SYS;I%+vZ@QQAIISdZ2iAhVBh^Vye|Gc zoBIsDV^%sBVo$__891H**Xx?oFT+&zg1YxQPc+5#`nc}p&(-;i=Be|+cH3_EX+GG_ z<8lN39eAv&^%pjLu?a^%uj8I%L-|H?SRX|_Ic5q`2?5sv3+p6Pc4AD<93HOrM;hM zirf7|o8t2RJNKXZ;iqYoVm%OG`pX5uIf4(B!{@o?oK6E7CU74~Rk85DPs>w^p}|yR zMkDrs%VYfgz|x^kL!FLa8|t*mZkeSD>;*s>-hk_!QO(KIOF>mVbP{tMbEn{-;BgFsE>sV~XivJJ|EmRCo9= z$9~wgcy}G_q*uDTE(gvZ7@az1vuCq^&RguZ*zM;$%w6ob*rDZT!`TYYl|ss#!W1}@ z4%^|>!yI7`@r)GHrKLDGbw1Ey>B@9HGaO%D3pbQiGdA`?e=t*Xup@HwUc-6s8b%Vt zymyPL_Zpsp{(OE2>@5ED{E#)Oaf2sO9Ri;EP;(LuC*VnNemLct=6Ua6XXcSO^U^{%%4@Ms%5+Rvre~(s3Fia5B{ zys2H{JarsKA*1jWzThW@`Vxc;>aO;|{_L4*4t8wk`!;4cjfT-T!^xwp))D6;72$fR>v0Xv7hDtGqp4l$dTw#UasJJHdj9>V z*nh=RtvAw?gjpyV6At8F?bp_0=NNAG$;@7$ju5k&Y((#6y{@Oi)^j6*^%hM6(8mAddr{ zNb=qXMdpt{(p@5y*As#++K)pf+)1e5-V}7%a|T+mVm5jiKMx%V`3&u^S%fBi7LMZ1 zET~ z8`0<88%@(82a>WR?5km3r#b{fR7{!!|5nm!kTPwvV zr&^3^;o2alUW~qN6r-`tV)UX#jGWuVXsuL?&bEuu;|?);*eOPL;QHbFZZY~?CPq#@ zV)P0qrB{pwfWGe&Bf1=}J%GA^=J$)yWgs1e7|jAY1XK)U4c8yjfVKkt2~-C}9~7fe zK#PDj1APs273d966;KxtUnxe8Kz=~ufaYmvIpBH??FBsg5nTd5ru!e!OYr}l%0Tu{ z)CThZRl?U+|8r8GHR|~Iy5+R$e1ctygCHarwXIy}XfttvNID*$813w8!2Z#gr3oCm_UAjsdolfgCXe;a2?4F85T?_*o;1``C_jJLP*mrM{%RNib=A4!Br0ksjVAIx>>mq?>)GAPf&u+LHgi-9L$8%!ljRMD%r>_2s&m$u zs!T#*TQ}%vFKqW9bxM1CS@k^`{XGIEmDMV{P&C}3&fqPzrY4h3Hy*2J-)GXEFQ-1Z zC~$7+>0`B1NqVJBOTwI^qeEdC*c-PFaFkR|ZwI_D-qNS6t1+t`v~8@Zqx4Yu=9P?| zW~K#0x0RzHwe|P)baJh9WKx;Eu&*&+-`be3H0~Dk_UX!Wt(&cy%UBAzUMHjfp3;D?p7#_%8ZTZ zbr$`WRaSa@dFyb>8xwvCSL6En?H8G&3f( zs+($5S(L|Vt?mg9G|noL3O$Sp1&`(OlJeGS|7dq+bwkx-qt_%ai#8o+9dZuW-qP6K z_i+_V-ozj`lj?NjHp~GXS+?HhAJ>ah#qbx)5__eVU~j5;KD^8e0RK+?X0$2zH?iZ5 z>GRG{9rpS_EobKWZ%plvF8L`p&tvA3YwpeO=@g&gi)0iwd4t~P2kv%MFj&6Vx|;^` zZ!HXd?q4K+f%BQO=Fe1d%TM1xIk^eRsi|w)n@p zsTK{_c5M-l53!;?c(FHim{f<|FPHW)5v4liAqv{y&^ zqF!z=XrkvKml@gTx4#ndbo;K|XN?`WmU*$>v(c76M#(hhNTrR{-OTqkwdE}e3&BfW zSy5xJeTB~Z_HH-Jw)YMCq=wqg&Ne+xMIF7xsh47-%3aS$W#9*;py?nzRl1!w1vc#T1pR_mwFaHv9@W*?o9Hmvv#&_B(Z8*ZDba`4_F*Z zZFMJ^U7O>eOKS2Yv(4Vu^eS|(ms>LEZ*CY`n%NA`2z9KNkSL){Wuz`|@P@N_t*wpn z9!G9Qw+aZP_7U~e$rL58kKNv4Sy3-_FlAdaDw#}~ae$@!KtX!{5xS%%lh5sUc-!sJ z;+d9Ov!DN9l*d5VuRRpQuS=$ks4ex6Q${p~AK}&5V7eT4JGF+Q4lzgvU?~8!S3q zt*Yeog7R_+otfL)knN%0_|CrlJf6(ZzCk)oU+ybudZ`=vq(6&M!Rn_@6B<;|mk1w~QaY>a zEjtZ(%GNT55tU-aH0u*`+)Z_))_V5x?s~S;!pX?1ThVFBtZ22VG9GM}>RNYI4=j?J z7*y$H7F!MsydEgY7#Je+95iw1yInIgjapALZ{xCTDvLVHUr^eN40I~{879ey=Z^Y+C5n zZox6^sqWS#mkpAPH>t=D6zV-<0iyZAIPLbm#CriF%%3PDYJF3pVUn>D;y_|ate}} z4;0)ZSLV=KYTgX<87^F~ki+gLctcC7fB18Oi(J&hyH07YL3i8z zPQGKlP->;GD>KlSkZ8s)+9l4eh8}&#P8#}}@@sRC{ubzXvARr&`um-niUeKNM$Ww? z8&+wjQJpo7+}YDi>NItb+3Fcd>*ey6eq%m^sel)Vh7M_e&QG6wx0AS`(^u51hb$@P z*)tH^z1%JPVbhyeL2Uxl&_Zc{t)=ecYLY3ltDIguP;Fe?Wk|FRa&#!PoNvx|F+`{dUvy53Mtn<_i# z+^$Z~nmT16Vbr5XrI4vk-o|~LW}UIsR___o{_4SEL94!~yZNP%pWgMt$6KH5<@O#v zkvc%w%DEPHb;fl4ZXs`w#m{yhlzH%5M^|@RJGk(An3Je!1v0A<4Z6O6klXq_GfGQ3 zeX?%*9B8PmwtDLao1+ZxD$g%$kyXg}j?ZC2fj9eET(dfErJQc&V5qQZBvD90D!J^c zP&U|aQ!@09Q3>DF>`jjFS#E*MZ=5GXsY7~mkH;o%R87ck?WX4cCb?6sEW9Uw&uWx9 zch?Q;;ZrDO)Zck}MU{j30>U^*_tszs4BU0Bm}d^M2JTR5AE{a5F88vuwpAL-t%KXF zCOXv0xb=n)jAa$d)*hyV!d-U=ydh)yY=~|Shvv$YDcuEWi7h zp(SicLw){3WxLKeq-!+5Z?KUV3|iQD^cVJ*8nhP3$Sl%eqqD9&KuET#VVGs=nmgIo z7h9jPR5aBT%5_<(j#8_it7Z(^lUTGy#iZhl98t;D=R zzpvU{ZmCyGVs|uj7<%wX?Y)m@iKjLLjjwXb_HQ8z+Z zu4mgzLdQ%Y*26nQI0mr`X(?c;Vg=aukg**&c^-b@Rf+Qz@^_70Mi3{HQ6VPBuQf}{hD!LKlP?V(7V)3b%fj>f{1da{OB z-161|VhF#5Z&KJG*YotJOeBt5z3wRCHyZQUEM7lbzq4JZtk#?*uwdV}Aki2GJfpU@ z5ox*{Lz~w8H&RNS{?>XY3eB&s%t=b7j~ic+p~t8bTx>Gv<+5t}beabHy`%;@jkP>Z zg@wGmiPB+EVl?_E){wfP`S#P}JnbHIaGuy%-DC{0pHD3{rdl-1{mn!4Y%_dynmGEQ zexnG39^LnP{rkJDTpAeDYmBlg)14QaDaZ!B?Nz^#o)0{(sv1hl(7pT9s~o*L)_k{e z-61+A#l_XRWXk)>=cR?p&KLdOLx(67wv9?#I|Ju;EFJlvfxeR)Gx$j!<1;=zy_+`1 z!L*WZUZYcO8q%wG+s@Q&zno zC52;MVeBmEE-QID(u|+k;Ot>Qu!f)f>8Wl?k+&a9I-0Pvcd}QGF}0{HRoo%v_sI== z0^FKp4zAJx>-L8>83xD0g3L@?`|imcEuIK%dDeD?#WpP8Oit~q)Xx6K?u&lCIo;*5 zitF!9+zK+c95rlc=UR+>LgSR{c=dFDN%l3NR2!43?h9E|zovOc%BD8*5P__t|M}<< ze3QYNoAqn?2Bj{2Z7{hr*{`W6GVeGKZvf}pGK;p}0ZxrA z+sU%8$cpD?=r=&`eD3OML!4?ed_n1|bGX>K$F|LX+*O5McdKW%8Qtp#9lp^3L#i;< zw|U(9(p1J8XU-geCwuw|3>?cG^=V}!{su{{E2m7^;~>>*OAj^HXZ~q>Rn+rmnDBjX zLHBLvLeZ-$yq;{IK>fotvfj++d=qK5(16iT<5uam6w|Ww42vDxycooEkFizJOt<_2 zQzn_y!{p?#JqDhKx}haz)eT&M%vV0xBj^3l-CaFuM5Ck2ObcDBN>)>+jbqbDnXG-V zpUJveU1UtEn~>d=A$Y_eX6sYyS6e$mqR4*CFF%tr=4@6`KI?k(xvIJ%5CY+}-jsa7_;Hug(H-G*V( zeoB29Bdfaa;Y4R?l|cHcbYRrUmv7%bZtpEAEALI*$v$wNwDCnk@xa5%OChQ%uC~Y}RKBr7!`p(LjYRPhNDr^aU@^VmT zhLd5#+s6B)WrCRLV&UjKo%`7edn3znb4q(Im$B##B#vbRwa%TYUre;vm^;@<^>v#} zOv5vLS~}!9-eq&L97)+FodFkj38-DhWBYz_yk61Ft)}WZ`_3af8uT_c40GsVOU#-q zY>W(gI(7K+23@=CBasN7BcXY73+C z%BHF;n*vi;MGJqlQIz!56nSfQaZgA^uekxmv{8Ss(}JM2*6B9Y_ZghxQ%Qf0@$PSL z3wYM6tyg{vL8mv4Oe#cNFF`xbDVE^vAUry z)qiS9q`a8gdG}3~Sx}R{j>`j`Y333>m#e2I0FR>y$kd;6!RfdjGQI%b#!=IYXOn(GEQ<(z>sV^&L%l*H$mS4?uN z;F*W$_cS&d=Nns)Ms_f6zVoYlJYH%2tPYvy7MNEC(At!(&92RgYVkp^d1Rkbs@ut940bRTc!MNudGxLaoeUf@AsbBa!+~gs$c~bZodg!EmY4h1c6`cg47-0uetVo4gzsN|>@csAX#%wO zI0<;h6+6shB6LWQ>xcbrV54)D0NYg+j(J_RomCN4ydD7}LdEMrI7OFAklb|6z@EA8 zgbDl(iQhi_uWqVmn4_!Up2cF*`~2gE<@zgl?p#ZbCwnpLJd?sqV6@Vc>2&&8+9aBc z`YSbpYE6~soyCm{PFo)>f<>l+crkvQ8;3g|*5$1Q;{U9E22=1J_6-2J8zAmnJ{mp< zkPdtpAnq^oG#CYl`%aQ3JQWZZy-UM?ufdamIKT6NIQ?}%{F7^%COi`mSRxw`+b|yx z$1efIx=R4DU8^-%uaP%vc&P@vG}sG>>p>|{r=tPld{`Qur$Hl)+*E^>8WaHHwh(G~ zXAQb(&=;#sXr!R%&!V?090b)K0&=v3`AdY_zPyi?av;(A+z<1*Sy#Qh8 zAr=DS2SU~Y;(ojfP#^FZAnu>qetBLazXyop7XV^=H3MROSf%RUPPFm0{Y~4SwC%0! z2hLz;+#j{}cZT%%2i?Vsmqa8+M`0Dg9~l)L84I{NA~7-|RxL|RiUL1o7B5a(wj2il zvv_e#L}HTGpBx>T6rZ4phVzNlGK&{SM=V*6<0qypk4aiQRF#j~@2&E$PD&W=1K|nL ziAf2|Ba?94HE|KK%a_JQM-f^nR!|TZodQ4zqM~D?lcHhIae@%Rc#AjhvIT!22yB5q zTLj-sUmcwg0XpIM?hpst-W3|k9iHXEkMrO*!~Mlw0LZ`*{2PHj2MSM)Ns3q!8|?&X!;_bM zBEpl_t&Wb5!NEj$Y&-}BiAfPj%OeF#*F+>lspZ%(aZAK*Uc&Av`KNCSpx&k{~iZPMb^+85^ItCPA$iZqtZ_|D0Zv|HsLfC#mg=mHJTr zU%7uA{8zYI^?%MKJb8IS(i*6J)bhmDv9QC`s_3{R!K#SWxPH;g1plJK$8kQ`M({z6 zkMj8M)F8qm<5#cy4~7a~6O|-Lh)!CQ5T|O6@G;|w@ENmaP597uf3>!zEj9cP&xQM0EQU7MVzsLJW z17h7iZil~F>4T*|iKn&oe~cX-wJt7V6?Avl88&G-ob~IY69h5w2?AVqZCFH7^xEY~ zA9ZVO42bhr$M}y${1xY4mBDrVFE;yc^8Ms|O3L1=VhWWw^*>eHGKgy2(sbZkUo;zuEZh$MmYCt<+}2@&hS zUYe-mm&2)<5V>sKM~NU5hsUp4jYm$w)Fmrm#1@3Xc%vyRJR&YWZr!T*HHiXfkLbkJ za0=o?VK7hZ0(t@z0Z&UWhtYEtZ0P4sq<}vTFcQAMkN{tSaEDF)mJ>_Bm!Jxdg|95Q zYltBJEo~xv$0H8%S_Wy#wG^GLc6FX z>a{V*#wJ8Zt3-GW1^l?^q&X3>Yd(?9)XMNYiQ`T9t4oeffX)dgno_~1dX}3=Tpp*2tP4vZ zydJ^M3j7*1;oB%5{QJO<*LK+L|H%LKNB(a<@*nuf|LsTq?>_QhCw<8C&yV~pD1!`y z*J#)+eyF~F*ssA2@5#KgKnsD#51=O{WS+2;%sb4a zsN#P{`>?ktPLJc4YVau_mhAwF)%bBZcIwwu;cZ%#;}YCn?D;xGi(pqQ5dVe#^1%>~ zTI99#`FC?WJz#~Pb~w_IF5>=rLM~OQEIIf7_LnhVTw@2R zLzPN)P|xtutV3q99|n+GCPC!rwW~F$;j$3E!19#L3x5G`-vLc~rnc~3;b}^xZ~8LZ zUy8UHN~HA-YVy+7o)$!-&}f(l3QJ9z45Ua*(xwsxsqNS%RtKt@61<1f)cm0!HA*$% zYEJuKo%Ta}s^n>^_a2~^79*afeYFVTU=fvd)VTJWWFmXKB`P|so0%_lAz2l-x0Dd||>@sJkm@i2D% z0*$3%PeB;Zv||`&3V{4;DZK4Kcz#X;B3q`S+jK0)g<^*SR&Xh0m@Ws5(TwL`5)_o(?&ub*m_A|33td1+XJ`jDp-%MQLQO) zAI5#?)0R=!F&geF7c6sDFSfy(gu(P5QRxOW%`y%milcSTC#Yf?|*o8Jxc;kV>fTjV> z0-6W35GWjI8PIB=wLsf}z5zM}bQc8-cb1eGhaV=sFONp9Yi-Q~*>D zqyS>I!khr)0~7!h3N#NW73h1QnQP*R$?^~f@Mu?M$1rRSz?IUpf1eFl#4(U|!A?=z3l@H!+i-;q}MlT^I!)IiIS0@0jBPK$b z6W7EN!E2ThGox1%Q{l$ol=x&KG&&N;hkIk|aGC^_2l9oqk;?!f{c=2qLweQ49pnMp zfqc!>DSuj(q0UWCuv+z0uj{+F+d5ULU zRWX|MA9!^>iGRgV=ZCL}KgiU1D1+X;ML{f5%Ys=B9w}+`o=V^^9I2dp#;7mxj8gMF%#kek0pzg_lp&*Y0ROb&nXG3l{A9Xo+WYS8s zW#a39ZMn-;WvI(kHKnTjSdD$uW#iFHeR-|cK|SuP??Gtw!Sg+yVYGVTnL#Vj>iDTF z7;22&G!0G$^aOiF!T)ud@-c@GH$niR>I3g_rIz4W>X_r<+nXby#8vPguN1J025Y;+ z_cHMs^#AWp0QURzaE5pF)yJpuf9A%+4D;U|+hIli_v6#}TVO4(J@AhF|C8h69Jaz< zMB0M{Yxw`kp-nIN|9kTjsrbVYU#h+wvG=QepL{yvsOmcxAALIFzkKQ9Zy&n&=sOo5 zK6CN$S1$hPBNwWl#r3E(I)lk#bGSTx14ARev5Bdf=IbQ3@NE(YM(~#w?#n_OW;Sdn5D~>uUHwoDlUHY7YT_;Ym!seu3P`v!bP7i4*$>L z8#cmsGyYH4|NnIP__+p(?*E4UgF{A#ju|^{{Dg^jE zMaC+x#lj$UdjHYz3x;{b^>5(5lNN(!_1oS?iL1#Td(0w7spEx1JnT{fH22E1_kU7V zV)gzT;FUg9hyQi=PaRC)a+hc4YyCoY(c9-gGUr>(q%Ql{LA zzxew$wEyW=<^6{*QQHXh{ZYtVb*Bw5XdJ)ip?dACy=V6qDzO&eQdR%qUaJPhYQ$F` z*!61T5&yT_J52`bbD#pCYM>RcMskOh&orpTdeyHZqhWo8e-pu1`;%1nv()lgu*TFn z?HyAMZq@9oqD7j9*W$OWNR?8H)*4=mzqP2twHTt|wOF9qzXcvr&|t#fkfY(Xc&SO9 zpBATRcrA7`s>8K-NW*I}M8j*bxj`LYi$^rP7RPINEy`8<&cF-)8ocy3T%zH%XsY40 zn5){q1|A^O;GVzXSPid5l7`n}x@un>g3#ht4X?!z4X;H#4X?#a)&4s0u!sit{|)D8 zcr99McrDgetL>%5s~TR5>ovR<$7*;j8fkbfR#vI=)8g+MUW;2bycTC@cr6MwycT7Z z>io2rso}MFT*GTINyBS#qK4O^K*MXXSG8Xe3=0~}{TrUw@LJre;kCF>!)tN4hS#Ej zhSy@V`nNSgi1fIAF*Zpcn+YJ=D!fX1-xsX0BQ?%-bJLt+2QrNmkcpygN zvYP7f0F|`9L!(D|1rn+G8;`$FL)8=3ZnwJ*56gsyv+@q7qe5EAI$|>9ml~h2cj^;# z{iy5c(=y;s)+Jxnd4_6Ul;^*n0p(AdZcM-W9G%ju%}ZTk1o}}<9+{Sbp7~DxY^gO0 zByxFkcFQtRlq=;<(`SB=-;u1Iec33^dVhCFE9fIwxqhe1OJq*lnX<*+KalWhjVrkM z3XSf!H+y9R@vm-Zpq$A?p{(V#-+O_+hq8XNjCqaruAs6AOL*F6ZCn4AA#c!O#jl&z zUonCFD(+P_yg}(!`wUoKQ2+6F=UAT0L)*5W|1jx6Mj5hulT8xSv|3p43pgl~Tj^{KM zqv=O?7RT*@Cz)t>-`)JS1f|FBRGt{*LHftvaE6zncihl<#cn>(-W8M!`K4&UTL5X1RUDcU>t+{7lmsp0BuLN$bd^Y|1bg}W*3Eb*L3um#j_v-_ERYEEINn6BKy^&f zkflWifkghTykWB|(Br(T=PeIGe>u&(bK|E9wCtDDU(Q%-g0N2 zc_4A`LBUn8O0*$ne4L&F(g$Q%A5W=7>yG*+4x0h?vE1G_VrZni=D)h&^n~lZafjwrKuRKyvg+$ip z7w0^O_9J$5y|SoA+g&)f-^EjL{a$?*S&c4d8sxvN2YU#8meilBMp4^)zWa45)IWAD zKexUb*$?;1O}hs5e{$4ul}ioE*ezRTM}qQuE#DuAtwG1*hQGeDK@vbvMtnByVhxf< zM$6VOc^g2O3NLJJtw9gQ7P0(Ekl%m!z4^nCP|Y|`-iR!Ern~#=!udgz-S}zlUZm^Q zKS*B*<)|7mUWtxe9M;#sed`F&__;yLLX(FL?4FZadVH}JGx&|~*u-j|V0 zXkl;hdPslr-D-X3t0;Ne73aO3z=yXt+Z?-w@@LPqMiS63EqcI${|EYE=~tB0N;qG` zpQbu}cO7+}S(0<<2|S6H+VFXz?hSNe)6e#=9>e*0a^k*}l{eA)xRVC;WJ^e2J%#!1 z7TOv%CA)@z`UDB>t`EC|eCICpS>2A$k8`tb{BRdNpOP&6oHGQ*uLhE1<2{s><*{|h z>!twWWbC8sArDZ)^zFt*)$tTN8=ST13L^ZaBTyHzZOI}e!>rcmtQ(*n-XFj68y%TFh zFFHYjV(KT77q}j$@9i7c@+7hAp**E`nYPD|FXrb@lHMWDoLx+@p1@kqFh1ZEv8=Nd z{}dYWh2r}43r`Uve@Dv(?{K{kQfsfBdzxgWE&kSK(HmU&y%Dftq*N~h3i*ApHl~f3nX@HkY{KS z@{9gF;n~a!BqlwfsaYx7OKx@eaixo7!qI-0YF(i17oNRx{zVeA{n?_f`}MmBsYd=^ zYhEH%7w?>Z*AC;^;QO{gt1pq*@LNi=@hG3)q&{70UnWl$S`~(_#Pu*;^In@}m&uIx z$*CV-L7%#4%)rK1h>%+6<*Qv7kI{D$iu!CmhdgE64rga8qYf8OoCyT5rj?t0ZlxWs}50*#E%o*5meFC6lI>1~^_p zdmQXk>u$kSlB-|M%xWO+2ky>Z`pvJA&yCl&Fql*e>DAmA5O9qc)~jY!Kf|z#kmI5n zz4RJMv|qJ7v?H!}imGFd-MB_X-5Qw>UUq^#9NF|wwd=$-XMer41sKo2Tc1#7eS>se z=*`zVa2Dj>k)9*e%u_H~O;uwitC^m8TMDnHVi=Rv^wwgsnxE$!aFl;qf`6A75kj z;mq5^WHoapF*`DZZKo>zS-(bOe*t z6xuRbO~t1RQhYT96_Y8A(GIf5Y%hi!qia4BdGt^k{X=^$P6zZt}mCi+v8fF(^5PN(IeWJDCn`i?UDfnWs75&Z4H!?UO&VK|})zgsbqacaRo4rfoJ_f z2Av<%HPDgv2pND{kn4ilpeab(-x{n0I)L;ydO4^Ix`T8LlQ&4$HVp)6Klp*PUqV3I zuhAgw=LC@UuL7j~I}@b+k_ys(T?$hBNC&AsZ3bz7W`MN64uZ7*R3PowvmmvzEKu6( z0@8lZ15LnuklIZFNbRo#GzEp4%>Hyi+V2J+?f1H%IcN&fes2NNezyiKKnIYn&60z3 zjg>pt8uSL+fCE8G&<|`2hJYQwXwV)^03ARD*b$rwI)bSn9au|2IhYPQftx`(VVVJ= z+k}H)S5O6Z1J8mUU>4XN%mI6Vc_5wZ%Ll!{0+7xFmVo_1!BEG5&iUzrgFyo@7_19Y zgE0j)U;yTzCTI<6fih4Vr1Oh9pgZJBpbv=u`z-i@x?nhne`zDoH2_t?1jyCEsbF<5 z71Re;fHlC)AT_wXU`>$DWg3EXF4Kt0@W=l#5iWwYs6SX6d;-=53&48dH?TgaYXo}$ zjlqVXDQE(=0ULo1U}Mk~GzGoECg4!8DHsBpfpMTYr~sRRDPVJODQE$%2U~&}U@K4w zwg%6FZNO~M5_}D|1xr9%P}^9?zz#G3+k*|k4qyw=9<&1;KsneE^aMMB1HsN<5afi7S==n5VL-N2JzS1=3g2HpcbzHLm%E11hJ2(LJ0SALYU@#a5hJjPTaBvZr45ot`xPWX2wLv;>T^T$GSr0r3 zRspj>tk)Ipf%Jlt4;q0*pfM=ah8=*_!1`ca&;+yw+ki5#Gw1{2pAZOspbHodhJjN- z4P2-ef!bg?h}jxpJE#X91o5xUg_B@4Fbk{?-UB;>MPL{x)ImD9pc#O4HF!g?GS~vt z1MR>npd6(CUC0xx4-N!7gFzq`Ity{2HmCqAgDIdMxD>1ct_Q1u8DM=-33djvK@D6O zpMZK`0ayk6237-g>mod840ZVKs|5~SOrX{ zdT=|{o1+|551yrZFq`VZJgRSj@=!hajp{+&dhl<9@_>4vDOd$;L;bBWKB+(GO8r6n zlO+QUJB&~24~9^GFpl~=puMOJrchai_M$Slp2~8x7nMOJr7Oxw>5g(zdZL_^-WaE# z_5_Smus*0;Uk7_v*o`$nTCsxrK7LoBhx#`acfJ}Ukgw68t7GUv*U`~~uBKy@9uFW( zw|;5Q3-uqt(+}a{*(x6a>-$(Zx;~K}^!FTk(BE(95y{hySNhN+6g8noJda0Lz|bT1XT4bY!ljiv7+XC55xl%( zkODnI`1%)rv>ZKxdATBZy8dVhdW7+KbX6)nLU??-&XOKsJbV~WFBYpl=@HMULrJ2=0&7>^xkQlp|dqN<-2$ovg*^8dfcv7rz=uDuvU!Ohb4aTqv0d5Zi$}LX8~#_ zmiSeW`cqq>Wv1yEgYnlBQXKDVYK!XrqV{Ns(6pRX zZ;8-OI8Tu3#m>h`;n_L0TXh&}yOyv3T28jAx~tTl)P`x zY>bwZjt{kegwz-6^3#4~=doqt(s4uEjm8a>%G?b-i7%~7aoJd)*DhK!7Ms?Gjw#y9 zgAh_ZwrDESQz|Ts)zVpNMQX=%EU|WvklM7D)JAL^dI-IxG-w@MB>Q9Q1%BGr*yOIUxi zal-oBS!%DceOWfVy8dpc4?S2t-6UIJ_aAr3PT94@Nh%+!vy(J-S)EzivpTy-wj9e_ zoz|gjeyn_~4(hzUrPfgA?J4yX%e${s4wknk&yU&w%Y)_JjgL**W~@)x^~9N%BLep| z^$1Ys;VShh%cG~%^Xfdp6A)gLqw7pU|l3sSw7BEKd9S+jtORe z-KFxgFh1PoXzor@Kd>;K(%4tmoxW?bbeJWxFg>JoCoGINAFnhW7xbArFQ+p7(ND5H z7T38%sY8 z21wgj3H}3~1-F58u7TcHvmws`-4VYs_yjVY%kYM*3l>0L2Yv%Dfx2co2HQbn@Em9g zE&$trhd~GM6zB@>1--$W;7~9N3<0HkJE(%J0I!1sk)Ixz0{JSq6ub|v2XBEH;CWC9 z?gP()$G~hb8_WaOgRj9IU~qAe}2C z;9mI80#AZ{!E}VT1+yS0f)0?If%hPf1g#;PgZYr@8%_~84-A2SYfxyeV-NvU1E+u` z@W+prLS4wy!Flk3QPgBz|~+LxS9GRd~L7* z@<8w`aZ z&<{KTMuQok0z3$&f)~Ja@C=xT^y-5dkcWcw9sevVrr=V@0iXc65wISzAD98zjuP@J@GLkUbceqMm3l+fv8i5m*;Y1D!9hpT2ph&)HibODB<+nZ8@Gr})4!&+p8K{SAj+{r*VjL@ZG zg!AF%VtGU-H1cEJ4EObt7y`?1t%G8uIt<%e#^TbyYX6bwPxX0-)MqSAg!KJLb{;9UDLZE~OzLym?&|Yj`9@1N z!TjkPqB=}`8UHc7-RL`JFh8g7=QNgjUL#bhJDVG#f7SB~Y?h3@qp+DdcFy`seNM+7 zJEwou=iyRcGye!!o%&s!<;&&>nC-H;C$_JS&1I3bcuX%jOzbpRsc`qs!(U)M02FvGKs>Z&+Sz4v)?FvN^l} zsgCTN%>b+4-|4<{dZ=Y){lDaBsYTWEe{9y6&Hu5PV>ZXb@@4Y_%>LLpDqwx>F^ zUDB&5onxZD<^9WEgIV}k*xB#GGyn48=^UiG9q75b?sR^ReszlG#pbryorcaO(%Q0i zWM7X^pVRqLHv7)z8(Dv|xl=Y9&*t=4f3W#dx&xNZ0n&O#BS-aoAe%`lTW99O{+6u+ znnQoX8P zM8Hq|;HE1VzO1@YthD-uRi#DJI;8Zu*W!QbulyZ0ea(b_#K0{(H$IvutsBdG(`MvP zeWKx)*pN<{V&~#Y4#QeMpy`{=sy zxApx|{gQaoM6cNgPifx+zJeU`Q*Zn3TUz4e^W;+Jq!FvqrF|NvcK7G-{PW1bvF3{| zwmU|g>eLETD5ZTQrVmd|{;8jl@@&~ZvD?YIHTo?_ESL7R#>heXjZL^kTkiW>wFaDwYBCkLBL;XeGe&i4BC-U|e|Iq#- z??3Sm{U`GN7yr=zBDWv%2m2AZ{gFS|pUCZ({K0-jZvW&D_Am1BL;f&+L_Yq=AI6`^ z$1nNA_!Y}^{%=kTD#oYb>GkEF-=|EaHFe^gJ$KTkieqWw}m z9sfV$SFnF6eT@H~@hglUDSeE8uFtAC{-pRA|3CE=#xK>=@z3*DQMt@fP(l7V{?*ry zit#I6f2iKHO#Y<8^^5B1^-EnoQsMe1#V=F;iq}u7FWY{k!u3~5zfAjAynajRm+3!J z;rcJ>%k)2~aQ~3>W$cGkxc^A{GWJI*+`lA!8T%y_?tfHI?|;013P^?fC)Jl7KNau4 zR9|-dRlI*o>6aP51mSV8>%KxI-5>Ceuo)GujH=4q|DtsN5#;kZ2QUhJpQ-ApbpH|* ze4nXmER$7EoYffRe4nXmy>vemRHGRcgi+x8Oy&3azS13xiiwD)oNT7$(d6aeYTl6Yj6UWxmf;b)M}TRqbMw|IH|j=l*_N?#8IFO36ZXDZL*`$X0IO!qQb&i9$B zW^y@}b2z65ryZlJF_)_{3ZM9X(8rut80AM8RhziHi0hL%BRPj~y*s0-J(tb6z9wfW z-|zW`QGSz_x z+rQ}hbn>bAcGqvKu)k0kXVdK2Vsh8Ge~>ao3W{2!sLl^Xf+&Eq1$VL)< zw`1J!G=x_S4g9CqcA|Il{Lux;-66MA%z2qXo;GN^Xi1%32)`wuV9P(mb#N`KcQxsL zrxLG_;QeG5*)q3qDwT(|Q`S2~l748tne2!CNpjV#L#L0Bfz5-R^A8|@#l43yF_~oO z+ID7JtdPD+fAXyq6{)1Tx8^Aq?B`Ln>-5*XW5hEqVq3}}gqQEK7}xp)+1)hw`k{1V=+uY87-JTn>ea=I7tJMm?Z z=UFng`|jS?hq@sB?W6k5J4X!O_P;u_A@&dEwbrt}a-Iaw7az2<$9^uqokq6RFOoNp z=ImD1>H+!Y&Cec}NK4B##|P}A^|PFPZpvj+ShxDskF8u0fAM2iK4Dp{-4x6%`RiV#nZ!XH5yJs`xZPNTXp+YvTl-gRf8qiAC_?~b%V<_ zGA#Q=e*ALiy%+8naQ7N_<{e9{E_jK?YBJ*=1FyN5~;# zZl6y%sDu4gej5gMnwLXzM_UajU4s2x-l5o+c$QbybK8*3x5>>t{#BOE zr1AydYwhlkn{(UTjvt8r@H;oJZRQ;^<>I4Mo3W^GmZL?m`(5JKc$HrFeW;&7g8rne zyTtTL^@hjkeprLZ!+wMAksrwy79ZV<{s-SwAU5y+Q;(9hCVf4^{IpYQ0#85tMQNwyjFSkxpipY{O1N{|k&VWCtY2n$qCV{#uKeqc*mtRy*GKKHM}>^XJ1f^v1SJ z3%eo4JU?usGU<2}UveF`x;R_xy0gc%hz|~k@6yC?O15Z|XuE9CiaeztuRi;bLAKaR zJHLf&R4s(B^kmA)>tcWHV=lFmkbd;Ol3H!9i#7{P@*YK2KPnW=*KK(CnrOSROL*nK z?NPt<9fcm(M6bpBe&{8%Lj2Tl`R%Kst!k6wt*)qFhS&A>p;yKAQ|H>9?%f3WlTLbH zv&0Q9dcyYYt&#qnlz}N(;+ot9uQq2~5Wgs;sY#aT^wj8VOsEX)F?!Ng-z(y=KBr8_ z)aruv>!LSl`ejk|t@Ojjs1B%q#1HT7mqb0&zm7}|LV60v{H50~iXG1`cyj5Z&QT$6 zh{@1z7et4B&ibiSEg(<%n%?|^cp$X#i?ku#k^YgvZ@kWnjZX(CBA1}N3fD(&6VHj7 zm->wiY>4(xch}po<*e9maADBlS)M3g)Agn|&WK$$=w`W&LVbj!WBawwh;MK9k5F_% z|H${R@N0KkYq6ERTy_hIt=<>~4+nb@oZ|KPFyn zuz%gngD9`ieC^Z4DzVt#(roF29?>wO z)K<~_)`Ytw8q)rpeC&I|CegO&cF^~0YL&EJycBV2VOM9^o1()8kI8Gq9({9t zt2cnX3Z`${H&`k5EZl2(pfRP%N-*LX>e8c&g^A+by&KI2doX^WK$$5h_oAWxO;u_~w&MeL=oR>K-abD!SzDZ8 zoN`WqQ>D%IoN`WqQ>DfAoN`WqQ>DrEoN`WqQ>DT6oN`WqQ>C5<;FOp74%qLm3d~P2 zp`~{d($C+zSWmA>7x?A1Zf8eKifr>zdh0<}`K`_*#J+R20m^fD9uoZ4*>7+o(|1|; z3(fF6g-xqH!+MaLtyU=;2jKY)yN1p!^(L)!ceHsu4$rfKL6GKzz9h5979WdTJU`=s zvX5_n^4d6H$*clA9|_UJ4?7Pcv$MbaC~|8KSyjDb^PwcED0jw%Ui5nx(Rr8kd`a#O zw*cE=PLNAp9WC}F4Gj<67-8lCIq%ErkO1Okn_9=+58pQs(pS#C6G(z>mmKi_VFS4! zd%9;ZvCW(;YWBhNr?7O*oXio#skmMJxxRQF#s_RxSci}y$|<&?!CsIvz8_c{N**+{ ziAmR?VV;laH4$j`QpqWc%B!s5_^A+Adb5mO&H)n%Qy4J z@~|j!+|h9K{XKZz6SAL{L`IWwrWz6BtJD1BcD8IWnixd1`Pladp63L?&F|r8GJny; z;Ko|Cy|TBgSQbOlCr;`#;#uD*r?v3X2X!=>X&8x?eHq8r`O}D_iR!;86Hid>=w}X6WvoyI*uW4YYxcYLTGtpm6Hp{kk-@9Qo9YJ z<#Dh7Y};5ey0VL6)(IMa<`3`S1Y&JiwfWrzcs>;d?mgBhk(|=pchW(?_YVYPnL|z@ zX;P=f_%4^+A)7AVJAWKG9Mq;;<73W{vyXS^F`isoS@_aTkEXxqc&7FQGB&f_Oq=J_ zzV`m@nK^-oCBqE{TGIYsD$5%?kytlOUDae7ZU6KGi8hnSgr+BVeeF%{$-HvCSCh!$ z4`H)LRHo&d+B$Q65?N8_aKMy))c#Tz*tJ!VR&#s!UXZndEL(OnPC;%|x;QtXDzy)N z+uc_cWbB|T{hK-A`wYUjz4NS+NkZe+vG&Jl`#P9K%}FN5g0H_@IfBXs6Z+&QlO8&; z4-U?vvd?h`x5;Eh7X#x%U+_LDq<(0!b~2g$v8C>k+-{I>8t9i!CT3mrb7oYh_R_!p z_aReA(!(X$E=I+8U+ZM>?%)&>_PPJNqEECu`wJh}no7PD)+xC$h_+wJvAZ!-iScOh zxt#@lf3TW#^U74R=2fFEseSSMFU+*aZZnP8A1>KEFx?EYU1s*IX~gCHy|CBEsXo9t z=h-xJvT(bbNi=N_=e-YHrW1>8wh8sZ@I4Db(>OnUI=OgoK)>bnsr^)ZUbr~_{EjhV zj{~QNq_4sAldz)OmEL2-VDmZQUmDQojl6l+KE{h#iL0{z`sNNfWn^|*yf`7{;F)#J zJRmQ+n%yN{%-ln?Ds}Avx!~gUhjC(Giw&donwZk?gRV}C6Ae8bCZrqE_(5YYwTu(D zE+4bptTKH*4R3z-QmmM)vBh!r6#6{0bi}dIvEs-{pU&7%YXLdO{!p!0F=cTFopteU zkXtO(V*hi#Pq;8(KIH0WcdFXb=f^xV z*Y?q(SLwDZZQD_~px*F3QKIqWY95(8n?UxfZu2El)HYu0y4!`8Pq(RtbEG&czFw8# zO{knT;PR{p@&4ybOUp}m9u}7FTzWNJoZ4&etHNmdyyxBAuU@#g;FF@}@iaW&3;CJm z{$b*le`ap#l~EJ2L&CGoqr^Q!^tG#7;(1qa=(C|9R7{+`bJEsEw0+Nd`a6V*L;kwG zeOy=iJeW1Iz9K{nlYO`@ccA^@zAo#`NO7Y5lsgMvH-oHOI;F-)F=Ax4P4jK^d0!ZB zH(-SLW95Diqwn;2wr-tAtAfRehrHGw-s}X~;d;umAn}9mP-V*Go{+tF*;xgNwNL!B zxqb)QU-E6Y;{(OC2il)(Ur>7}IX(VpfcSWy&+!3A@jNZ~X*SRa5c8}S#eA4p8}h(m z2R!}7OC5TiS`~x$B_ZpU_aZ;>{iV*QH|W#&(T^`5@D;a=(SIpZSW&!|-Q=1}qI9G!I+*Gm2Kv0d;GapwIao5CFNK8cmg-HQf^#?5tg?pf0EdCwa> zWuO@GBgbx<2YsKA+XovC5F4KN`kubFEltm4)S7(P8gpyPOZSKNKSd=6H&0 z$ED;r+tdC{*EcEl5TosyHkzzJUIWd5y?{{{JjjP!9kdD#ZCR8uK z-OS5LJaovZuwzrISDZ+=EfeEgz3k95C=0*4D2~rFwimS$bh|ytmFlx=u9uCtXN6ab zE1mIvh84=Mj4i}z4t?(DETZ)hI@haJNBq%hj_t7Pb*NnNpx^hTzayyJ80D^vf(xU< ziOX^>J2J|~kzRbiCt zak(;=D=`W>j0!C-YjRoOa;Y)vkME4~Z(RPu<l38SKz%OAP?fl*$_s4C#{J1)QB z@@q!n6{F$>m-D&&j8XoSQT3S1kGP!2sK{j$9&q^{m+x}&-~9OUu= zF7M;=UPjd(M)__o@8a@KMqvk|VjGvYa(OeOd=sN;1DDrxc`cXMFyi|ItRAblypqey z8Rg3uRZF?Ngv)<3Di$#c3%NX>%c)#m$LvnEmQl{BSi}9(xm|L~S2J0$itAT$J*RvH z_g~KaIpxcktVrYfrCiS`U&8f^xj(1;Z|=W{QMHikIpqtuem>Wyay_TwFYZ5&`*X_Y zGFg$r^>etMQ$CyPXK{Z{`AqIVgHbh|>pA7qxPB_vPvLq_#boZE%>6m#3MMO(xPB7X zbIK=j{|VfmQ$C)_ig8?@$n~7^1g;;;^!V#`UAPKc_sD`-d>9Mshu;d<54AbA1rkb1DM4e*pLAl>0MT z;m7s9T+b;V&h^8%Kc{>s_aDNj8qD>a@-z9reCet(iH#CzS;~d6DCEgZ;}ce5LP8f?pNYN5_EFPq~Xs==-a% zw5ssQajkA#(2IkT-n_b^#4-E(!;Y78yr}-7zVOA-S!vqq;4(>{Vxaiyczo1~=2N~) z`57CkzB%S;D=t~BqwlYHW0wDL)bR^n7_(PuKi%4@QpYCq-sOkK()kI&xLUeEwq0~M zcBM`wD*vb^*C4YEOmEhVkm}!DU(h6T5B7_j+}oV$2i8z&67NvwdE1N(HOl^TTPg<`r|Xbw2A-xz=SlIiYxz|o zuOhxZx}_(D_pW1FnY8z69MmjLkA`1dS5=ujo*7e6^p$?EQfN_Mp-WnwcOU7WF6DQ+ zfn1Mlb2+@C(M73$V@!l9`rUj&cS-VEQ@^TYR*%&;=4_Vw zJEo~=HS)|gdXL{|BO2b*Jg*x0RygTg@hz#n?3$-nCwr3;;a#AUbp9hP--Fhw8f3&ryW_h9rTTrXEjJ*e2WVZ598ce`h1@!+2ISpH z7t>XtbpAvru3KP0>ed{1yT<}4edGGxHA%P5yY=(?G^Kj`1{pO;y2ItKRHJ18oQ6rThIo>(RXZAyUpA#=IjZKY6_OhC%3opE& z<*V65VMInR9ni{5OR~qNO|y*1no)ue#fMU0X=t!mv%vfoWD(rXcg&A1(h$+GOm)es*M*22Jl<8&z%M`tF|^hCd|x?rddHhnQatI5t@@r25RZ(RIkk zmMw-%7>MtkV*J@;)gjv*NA~|*VnXFxw$^otk=Fy~OC?hLR(6WIB*1&Vwo}OzTHjOc z^Xigh{T;!ZrsDT?Y@4u`*CP{#jGsKImDHa49nm2Hy?eU zCH0?$%)36hI6mS?d=sg?A9l&8PZU+g485X~(py6e8juYyu0OjIsV$}N6y1P)8*jg> z$qlJI&zw~a$oB@@o~`~^jp`4$nl>c+y2M{Jy(Ep#zq%?Kl8d3uw-j2^`7I&bJ+C3T z^)V{*dy3Sbr5@HM#KXtjet&OCe$gYQ1(;JcXKkS;xcS_f3YpOvh!SO4~i>o3{1(3VQVUVyH4w`*k$QpO3t00=dos?q!+D1Oi96}_Mamz zNd0@Q?NU>6=Za~X?nB9*@~zLBlI^=U8fHwB%6HACz?7smJ$&e)ktDyhHElwaZxo3e z%<+4^pr~et`QQ(}hI-E%QTtL@wO2GD!{!vlKXs$?rHZBB>>G$loi6S5L_)A>Hd^-dv8Nq~#dos}xd zezQBLHYM>IPfZ^8p?aZe7gbYYJNxFnu@mX_K;i0G(3EIil(+cWL5iPDOwCA<#fl{l zH%s}Y$lc9|UAx*-#p+a6Ty{z@Bk{c^w$h$Q?O$Q+ve}HZ%#5)g6hr6B6vJF|%!r9r zidBy;()f;X6U<4a9V^erD5!lXR9&sjNxLpKZ>J2FuFr<5*zq z9=^P{rPl}A9)j3iWlpBq1*ca%E{*rR9{J{^^zrzqvW;~9TG6Fv-DV_y&<5|Z=jr`X zv8tDQGjb%^$g9cP+G{vSsh|W@Ko`Y9~9_Y6DqV(kH7Ku|3{# z@V6kzezbjr=48^K9upc@uS~(84Xh5quj z+}fi3y?|*Ehvj9g1(o%(|EevXYN*k7{W1D`r*Ig{fp))Ge^-)(fO9-VIzUf#S?OSH`}8GUDk4V72jT3t&V z?O*?l_ZAl__s)r`B_0wkzirmJBb7C8lUkzTbKg1E+a&$i+l_09b|ag0c)mf(ulb#K z#$wL}D>{eGl+*Cn?})~t!&aM8r>V|VPP+S-v1oHLzP9rPV=A}2=W8s^J+iavpsyuL z$XD;RH5NZCoVTt`<4#ncaKF?@ylQo0%JAcsR5p2V#Yp^+oc?bA4LaW>%zm)TNUSUt zX0Ocgpt5Cdl99OAsMD}6UUWW2xSZ={B$|!&9d-LJDgVg4#zx|X)afl+yO~mbwTJHv zMa!4{Cr$7*q4MU3qM`W8#ChULUneTNJo?K}?9t@j=9EEFdG0;(H583&w7>PC_<|US z&Euba*}dC}#us1IFc7sSb^R9GNeVwbTdX0T*VlWav#C4Pr`+(ZAX7|B~i6r{B)4E;gB9WoLZl zGu5}cv%0#Nw}0xy$ulK=qr0TK*sbZPh$@a)zknYM?&Ve!r?<*IwsV0OmA~CfswP@j zH(lFlwIt`?Z(L1Wy?lplk6BXqtOsIMvA5sJYdJbn`S<4fRuyY)GR>|!*p! ztg$7pgT^Asep@{htB6OY?<(Aw(Us~eJ@Tz0>iV=hzqY6cmGd5z>WK?`TJ65MR_f3F zk5}u7@{$9--%m^ZHTwzC6KmV77#h;=DXq`Ir@6Y~iRWu`qrXZ0)BIVIt~l*X_k&9k zr1}*+Ypg5Yy0-mv{Y?#N`um^5S`+e2+J;oKr?NwSQf1L|<(Vbg<+OMc_ZVp{*D z_p2R|;vak=RuVP-ajv8qBb7hqrEewidElCl&vr}swR%;mBQ9>=T(|BqY5e8ATCF3F zzH0b6_o@_s!E2%;cB((W&(00f^+f(AS6jR{Z?$<19Xg*aynd6UE$a7Ja9{JP1(k=s zCE8+g*4FWV2T1kTe3z>wrWcyK?HD83&&GF2TB65`u@3Y5Na4E{G}aQkmH3X@)21bj z|ENIJ6nC~B_1gK4)czCR`)Z0+{lavfBun;fSXindHnWJ?RLxl`@5aK_8ls-kXVIbh zQvEA^@YN7&8lL{5*-h&2#UDxq@v&K>Q1PM}P2aR=wIFt${a|>`0cm_~E+T^1p@m=f z&x<5`9r{u%&D`(qe6&%m_B6cTtI{8teh*$9wz83~Z$n>`ADO*3@6pv4rSkc_N&237 zU)J9>@2k`vu5ZO}nLV%U3G38P8sAUel5d&DwN|yU_(zkbclKS<*UW<%>?eran@pIs`AkE!oVKWE0J&d`$QOZg8hB%d?ue)#+E^ed8mntwa`IfMS*BFH|GqRej7%@m}jRKC1VNgpydPP80*`-LPcO2op< zYGZd#JvK_}zq+4G-)HuIl2BT?Q5_n8^Jnrtv-s%DR`~cJmF>PH6=ZIH@?wtOmo`+6 z{+RSGbJD%ceuGS<_NrT)^foj5#MKMS4oLMe_*D8jbMmz1rO^i^`!4yE^eQvrzJtM6 z8!5f4lF}EM7Hem3d=?>NcIr&rSw^5j~8zTS*xV$o9Wl2rHe1f zr8GD5mfwah`nl5mBK>RWz03<=Yr1urP=%(a_*Qy5Gd|a-=S)RqD$Bo@-powf+40Fb zm1O?~-%GD&YFz$uq~oy;QurUGS(#yVWL2IeNc|!FD7}zbIK^eOPao-er1(*KCi6(i zqiGL=r1mf^Ej^aG(Xd;NYNS*@d1>i^Oy7{K>dkbd@+eA6H)U4SpVznVKI!^`BK$gP zAN(gEJLx2OJ0NKB#uJH-fqUn)>gK&qtn3up)y3*2-H(8StxKS1?c06b(xr9*IdJLV zvX=hKW&Vn>j?3BTGulM6_DV)@#`PO z&XqkVzTYw|x_~s7?S7OyKSgYg5%)BR;rKAb-9xT=7(_qVB=;67hg zW7g;Jf%^(b75{tPtu`)|ed-p|dcnm4GTQ4=?R$+OE z%beenRUO_h6WcCS_MW%l?9##SiQcxihepXK%f|PfC_5PQp2W|-b;v0-S^08qio@sG z?@3sVC0ET1<}2ebM77u@jz2S3w)oz}`5ui6$(s#} z7ERhRS>_NBA34sUki_Vm**_^GO-45E@w(i*kgP8%%ItS+w(S0dN5O7kh2-`Nd0M-p zlV!<)A0OsUEhH1Glax-L%ajivH2%19RUzqTxMNqo;dEK*?K@dX2Mfu%`VKemRdG^Q z)q1jV+OZg*=ezIM2=3x&Xf;CshuX9`}Zp4r`1pG?r!=(9)0w`+2KjN^66%y6P71F zkP|J3*_V{AQZ}_S^xXL1139v)pr+oP*|LU;?b>c%K9CQe`+qjeTB2-a^{Gjf+C?N` zfpx>s55tv9HhbUxXj4R%Ci*_Ue8xrjU-FzA}zKZ}&kBd)ByQ~M)%yYOh}v@w4v zCwr~z-`egY*)H2{k~vPHtg&F&`Sra&l4Vcdyju}6S9!-`Ux#i{&@VL6Xmcb@_WjI~ zY{R)9$#ausLmvJ;S=Q3W{eI6c0!us>Z^k44$XrXdizfKvG%!|q5z4A%NrYuyNp15e&)uou& z&RQ8Sb5Bt=YuazJLqIWU*Kp7bz5UCTv0FT|`z05XAjeOxJ01LFY~N)u=@+!e$nO4f zrFf@myrHU?RI6G#vj40YW!w6}vOT%QWa~^BwgHDJr!MOKd17fXDb}CftcGl+GS2sP zethFkByHTx>D?lem2t@%+?SD0r1Op7@Y|bHmFGq}_kZR4iCmAc88FB^RY`_D@CsFY zB5i7GRyjCgsceSEt61YTpGey@?YCoVO;zImfM~oq_KDo+S^KJ|;c8hxuPYrsJo-c? zCDuBuIV@UcSl`jdLc4^tS`ra3eZm5z(PhuHS3MLe7)qf zZtBgM$~OyKm){O4A%}~zmzSJgtxOv+`}UdHC8X272_KFxN|W79Z{_@SdkJaYV|xGh zFBZ#ET=&(sy;4H9K7L_4{6@60!`NDBJKvX(@FkDe8eNJa14#H`sstHhft zl}}Gy%CNWpOpZ+2mwd)|q_Rezvlm>OAB~-_Of6V9dH%`IB(rdIM%M`wWO(PU7nuK~+m*_J|5zKX zO8i1j2c9}V>B4fE_&u>-*s3qY=KCl8b6-+r<33y$!%lo5S>eym+b#G@x#RlawAJ}v zNb<#Dc9+&Hk&W0tw`FDhuf+U`!t>*U<;t(Mybi8y_mxz>HPw2!B0$+`(9^jwgT9i- z5r>cDj$WbcHvDVhn53_y({`UpUIXKm-7BrJ&e-skShe)gzy58N^4hT;sf{jvB~w>f zj?3yYS*F+M){x_cUrEf0FmnF;D&>kk)9x>?_l?|l_nsAOkSrUQRqDG<{*6>QJtfcH zZMm$+)d5!TM}EWjaxd*UbAfE%^Gb^%{`y8-hbr8a+egbnQ{UY)J@Ad(^>}ghf>ylj z%ZXwAs^)$pF)Jtc?VK}LIbl}i?v|CmlNI9&|HVos6Bfa`brjmC70G zzuv1m@H?qwKjfC?o5`}JQ_j_XtoTmybKlH4)@Z(Rn(bY!XIs7#+kFwCg4qh0-(HOm zO|E|@$Lkg(47jsE=DU1+yCvVglOa9odR^KuU)gfaN8_%|e~`t-kE~SYq^?RnwyBgfTDajuU-ucZ_oM%6ef)YUd7c=& zIPTTYeZoKYA-2<|PXU6UCX;^sEv@|Pyv&)x1z$s?-+k74ClTaNl zNE6?T3eyo94$`4s0{te{|L(Cq72h%oW8Z1g?oGcmUgpp!bN)YYDqpQ7WUSQ^c5k3x ziNb;07vkgeR&n_M6Xp^0a}ZdvqAh5n99E%0_%|5l^mA1L$|=yMwX(Jj95E8Bc+|2> zA0P99E>1K|weo(0sh>ePKMyIKG5o4QXC=k;aG~K$%ZHQVnwRtQmg2U6pYG4N-t?1X zf_3?D18G3J@_tf!4(0rOr1WIv{iJYm_+{185UgTo{ZR+>yHs9DHjhnU-jY2~yI|qW z$Bi2o6o94?6cIYCtzzN=%{`o?e5RK38!Y8Bv#g&F3zt&PkA+KxUlzK{O3K(gf!5h? zw2p954}QU{Fm1-`2*&W|eP&C;$jke+qkcZ{E7P}j)NkMf9bqRrm&ffu{e)BuQ>&BUs}@gjNBu?1Lg1I)Wd9S;fT01e#mZPwxqS@Kb2~^pna!{mULd@DEL>oW-e@ zZ_Ut>#(`R{s9!mg>1o_loU6lSmq};bEG>gHI2uN+&ncttkg8?i0rw|;{2DETDR5== z70c0WS9yKe^euO58FYaw8^5fc`uk;+*Ox6n)th9N*O!g2cTCHmIvfqBu3yFSP0A^+ zFB_l6t9-k>es7ufq56L+=qr}5?)~!dE9x&*&{xcVz{B$KE9yr-`mgoJ|C{)AD#Wi? zzFE)9r(aQTugk8->h`TzzDZi;^%dj0)F`h%SfPF2)hw^C7=L|*_!af%Ov=Zv*#9${ z|JV8_Ez9dGrr+15yuNJx(_FO;w!=|7DSM!b(wJ@@rz2qaOW#E1{YeOu1V1VqsedR_nu8aRhD zg_FY-pe}9EPMzU;!ui9+z|DYL2X_eW0^BXQ7jWO<^y75|Gq{d$J>UZ2#>1t-9fG?F z_X)1v7#+bL&I>LAZZ6zbxC?M^;Hr+*5iH=`;3DDD;8bvT;ELf45_E*ta6RFM!9~F( z!!3f#gnJ2Rn5ZMPgzE|y43`YI2JSdqE?hC3(KsEUEu0rzFx(`#rEmw~uEV{A6L24D z2uJ^Ol_uIrThI|I36*hg*AuD;RdK(qF6aw2@OV;FFcge%Z>uHL7U~Ffg?d7Lp@Gm) zFcBIFjRjMoiO^Iq!!uhmp}Alov=CYft%TM>8+=jAN@$CJjb$U)3he|tp}o*SuooPJ zjzTA)vmg_?2#x{~so1!fsKoLyM+V3FMh5uC`bR{E2gm+f7aKaRLb{=mp*;8C$X{h+=Vi;r ze9D*Yr=PlPYL9YdQ+v{~{mNhM`zwE{9}^rC8yXeqi>if2j%4MJh!2kog-5V|M7j3+ zw}094{##qV?7!8k>+w5fxjOwWK>7OpF2t|8mesPB_;+2I|DWolZojg&^6ym3*v;>h zf2@-_^*`519pd+OiuMl-Lw82|BZGX^8T_e&{|fl$ zvi>XRuR`;}(6|BqkwIfagW^J1k;`Z>q5?zwBO`;u`H(8F8xi9lp&o4IHRZ-(85Q^U zjSi0Sm1396@@Kp77}5SQv3%5WpE7M19T?#o8#N-%H!wUjnkN$zH7YnTj*cV$h=9=8 zsL0U3*x$Bi^nV$$e1rbiVav4WuQbbE?aD-F-enE@U&``h^>=FZQ2mXroK^ou|Hpc< zg2nj$wld5f|JB0G`wx}*X~VxMty)*Ev@yY~hjE!k6R7VC<$cTC9Lg#FoDi)rY`CnQ zmWx@wLCUFqHAOk^sCa(UsOak(;~zPa8!NqLV=&Y2$ur2R>5tBI}CRo?h)JDmz`N2iPjf0y9w+b!;?l9bGxNC4v;ELg@ zp`K0QWN`iALf|IA&4gPDw;66f+gnwjUunR87H1oRuPTeC&XjsPACj_<`1W(}w_3fJ& z8y6hm6B-fh6pIQ3(=#DZ%L7jwq5k18@xGq8ue&3Pkc1Ms1_#8C92p#=E=iV@Mx1|4 zTzs@g>j`UEv@F?7Hg1Uys$A(C$3fHy!#D({Z92**m zZ)4MVp8m0MZp<8QX)BhIZ8Y3y8ZI#?SfGD+Uv}{ngri!X!Tw`{|K)F>;Tjws9QQAU zZ<)GPh~yL*)HgabQffKYRqENs)D z@C*%z@sCLqcGCLL4s;3%LbqYoMegT6(B2eKz!t3Y9FuO$(hC%_`s_olAujc58XM^z@JJD?Pj+ z-Zh$9-?$*wS%T1u%914{Mh6Si1()!sSl*MuHx1}qq9S9X!h_Mp!B{LSrQ9c&04GMM%@sAOH=%`P9 zqJHWHdzz11e#8hoA>&_c zR2l$d4W@p=OIAjyK6nT>6XFT#f)m{Dep`-%=z7-d9uR!pl49NUQ*ll zrEd#DO_mq$n*l-(w?4hxJlokyZ#BQWi2pz0XWmK>8m;+#W%H~sw~K$GKwSyKQKxXk z4qnWPQn$1dbEdtRKh=5TpCwSI8usg4w-4sS;e?4;iO`QZKm79o>Vz*?FtUg_?-Pgv zSN7OlPjv0|OnyY|7r#_}#z^N=)blIUr|dbEO?4L5qx{{WVfs7Y|K3j%@o2vPtB0mJ z7DxUsMyeQ|&a>0`{r}q!jsND*tZ-=YLtSrmKc~Obmj2HZ^)K5eWzW@dC>0CY|FKg0 z{h!L}bPg{4m9A-_wn6#_ZG*fQ|DFp}hgU7Y{~bYDT+|-_<23l=!Ll~}%dvx#N*|V3Icke!Zefsqu zFmRCcThxD~i2spH{%8gUEc-v2f$4vwc>k$P{x3HN4NdwV#qocTv~VAtoH)4&Z?}!P z>}1Ub#^lv`-{_fql0xEUgg>_K&N@@3{@35+AIwY6x$pmHcqblyKf+&G`($l>;py7^ zwL|`#{-iZhjNW)%?0skW9aF*g&Zs;8{z)|Xdd`Eq&w^kxiIq(KyOVAj{x8(J|K26> zqZ-1SBmAEn9(6Du{_A(ce--@y2@ehYet<8G;5J#ly7V^)tRwi1zaFMQ@RN=7+xEoY z+;n9mAtKzA&xm)iu(7hXFqI~aFf-o8qMuJ!O9uw4|cKvP31rBBi3jqBNrolhTSdEKDjYx@oa3 z?cV1cw!ORebMNQ=d(R)tXU<`Myx$+s^L)Sa&dkh(=ggZkYr*x=hT%E0uAe7oE}S=h zv6UW1#WUwxTu``tsQ*56H0&xI)@2J8Ei8+cNB`K{nEzvM_L$gq*m7aftVO6&Zv4kO zzFAOo!y+7|s4%i%&SKOcvx^q~^T&Vvd15&>jrKiqixwA^giE4-P5R7*7tCLL{dGkP z(!-19oI5Mp-Z1Ic&MaA2lpdb&&;95L|NBw&gnv6HJ>j2&!{&OzuXe-AzdP}NUIXe! zf&Ujb-Q=5tekdICf9QO=kS=4R{j2?D{;NLz0nU%c#u3&yE8n`;I?_4TxidNwA`2QD z3&Eza>sU2g&t7Bu_%LylSSD^Z_#ra1-AH#0kCP+h`La}YD12XliRf6&rhDiW?p<=X zis(E&P3P+ZU8sw7i7wS;x?ET2N?oOw>J@slS!13Ko{P?8D#cB?Sd1hq-B;Xq-CI4Z zR1O{I8ajurqhHY{-DlkS(eJB=z7Mm2B|E=yCOg+U>)cE)REK^Zex6HiAcgcgnrBb5 z^X&q=&@Q%1>{7eTF1IV}O1sH!wp;90yUpHVx7!_dr@hx6!G3a9%Tn`-dE2b=>wOVi zh8dCAStFi?g~jPK-G0&e$!p^$%53$EIm4gs7y2vx%3w(lY8^WFv1BrtMQ$T^k=+Cr zL}NBw&Fe*)%#fLqz)m}`ZH~%S5f$nl8pBq0qMRg`$fMK)YHQRd{X@swV?A!$Y_{9x z-6_74)74An2|p`%A=nl@C#d46-}0?I_-6t8k{xi*^&Y}=YU6N?5M2aoB0WGo_e^oR zwB-SHuddg)7#rJW2_5O>d7a)CRis}H-V8z{E*2|~lAqkJ=)SY!LfKfXAUoY%ZjyJh zx6k|9i{rQO2l$hGD}SH&@Spf5`Ko+dzO1&ZZq=ub(WhvobM*|pQ(qa2kGN_u_Ky#iArfLwvoDClwM)E5 zktA3zTDLGy->6sV7xX*&OMRkw(+rqg|89S^|FVBVAcHyBZfg)Kjf?qd7a40!u{K#R zTW3(4UPM>Y&GZ8MI(v^jS4Jo5L~E_TMQ83*$Hm^Ky@cdjbF4pFHP&NRtF_(w((1QH z(G)7^d2}Y7OP65}&(fFZr?i*;2OXq`+sXDR_8IosHnq>Uzp{^Gr?H9b5_Z1(P}Box zn++Yq^KS7%jYGCQ(M|NmMSp7@`fX>_&K*O){a}rxqv;Yq)IDVPS%}@6$sMHHI-Whv zvYh!&owL!|;=Jk1_BMMTdMEKPPv_(LBEFix$3Nts^M0Nwt`bX7w}<-ULbX`zaenXK z?>^6BcbBLZ+r$p>7hDK-q?QZhjqt=X@__tSj#ZiJN_7q5?-BK$`cNh5 z6ZIs0vAzTO`8qth!mKpUm@VdA^MUyuwm;TC$!EUuFZXBo<^HYyL;f1S#ed!Zv%en~ zmq!F+g0q4km=w$mii5Sm#$Z?QaV%zs#r)&aD`*K_3$J`a_tP`&@%A$NIr{^<*WTlX z@b=y)2BcY;)(FP=h^WoNn16sp57|mbx*^dbmaAsO&OY^}I;6sSoW4L$MdZ!Vck3;B zyqRjQHkD?nS%tXTZ4TmscY>en3xA%!A!rFY5bwicZ-d%NJ|(AFXIta#EPICiJNtIK z+FotD>}cl(XV6J=uW~zF=2d&g@sqgAPZ5j7BjRcCoOnU_GF!IGTs1{4R+A9*9r|c9 z&e*We48O*I#edHq7K{ws;PId_Xbxh&&KefV#~98d7m}$~x%H`)NWZ5E_7r~^OCUfbrr?Oy3!?|tHNK8Y_?PpMY*hT0X&wZEzpbcU|YLWzYm|r1t$eJ1UCljqdqLaybvtr0pT7ZP2_db zPQDU_Kr?T~iC=rwn{r?^-&CBpIJ>oI%LN7;Msv32ZZq_Zj zRk!IKx*ay`)O$5<%Z=q^x;+_aU12Y^?}1OALVRoiC$zacfpX`27kig^b6}lC-p$_M zy(9QB{CK{Nzs+~?JwT>k_;7KA7$L1-cF-Pl1|Q+M;i2kbm>YpPD8wO(oC}QJKn{Zk z%3!7GV7F)3VQQorrA|=757iBeVZ={SK5HBn!_2inuLjX5n#6V)7yZ6ka2FqlGF~*r@SuC67uv`{_^{26XR=^5bF)LxEtc;bj3RcOg*iyCv%({xzuv%8f z*0Ormz#3T-Yi2F1m9?=QtethRPWF~~MSZJI)}fAJF-&YCFOe#`l&+xFbQO(vj&hE3 zQk`Mmd)9z8h$$iQG=V14B$`aeyUZ>3D!qHX zulQ#3qM7N>^=Y7jhmo<^pnn+NnTB2~yPNHFHUf9HdM|rBy$^Mr7m``Lx=8n?p>;VrJw^*=kKwer7(ZW&si%e(l6;$%E`erVmZ4)VFt^UN9^ z!<5x(vwBs%sXBpP=_W82n>4yr2zW>Pf*fQs2 z?x=^r>P6s@;W7VDi0Yuq;h|nE44FzFr=#pKwhgSYFRzis@_M;g{$5te zi4_Hz9}K z&DaD!J?oF-dz){3!-}Kh2T}>#+N~V z@MF}D)x$#-SR{~R$xUPl*+}lP)?3e6?biF&N7gr196g+#L@jy=BCZq4;xPL-dm9^I ze`oPdf|KYZL4R#@8l5Jm*=cd6@?zf2kt<@q_(7~ud)23^2VCEW5lqs{bv3xW24{a= z@I&<2b;Cmms4>#X1Z3tVq?9}bB&)L=dM>@nE&@VU+b=<@eP_qB(Ll5)o-JaJu+8ip zwukLw-?5R-DNZ_6;4C0_xpRwC>pbZUbB}iKbf17;{M7xyjrWqg(>%{B@D_Rxdt1Dh zyjJgHuh;wD`w?+`0vI)uTR{2A{7OEXm+%|-J^VqaoelgM-hr{42jt%_Iz>EmoGr8D z6nJTm?2*av%Wt6NR;%@3ql4;jJx0&fx9iXKFZytEv>9zUo?bB3%rx`N&G1T{*=jyA zhs-cP$sg^X&%_z0rRkV(rhr#n^x0l zF7|8vb^aHAE;zj?mT--YvCV-MJ4*f@4RyMoPvn*F`A$?12}-E4Q7 zJIif!g;(Kif|nlPXM(FP7aK)`Y?1HC_mLq#$_LdNSbwv6LG3}DoeSME6S;Ateo%Mo zk>*%40eEncnQneIhxtcB30wlzG6%Y4xxWGY)(@S3UT{&67u<^6cq1B*9hk3(g-4zw zE3HSY4c5ojQBY`S!R8h8cKQH)lm3M!g1e{LRj_xh{j~ioFkw3?iCy+S`wRPPI|*DM z5vx%i~XOJ)NIv+Y;I^Q}!I7hpu0=ds|se7@T z@6L8h+#B3`+(+H@?k4xSn2tNuJJ&0ME&kxG@SgMD@OF8hVrt(A@H*q?LMP<$W&8v| zgd>Vo9hBTRP}f(X;##Y>>$8nAm%*B2HHJ5T8bd|_me)7Y+Y-u zwsu)(();N~I>|mAycS_|fp&MX4Qw~-Wk0hKPS_F7709%e&J)P`51no&&K>6l?qu-J z@7$%(0Zr~3?nls`BfL@GIPW)JjyKt>@xuH}?(j?a&HOh0NB%H>oYw;%ck(%6k+?(L zD>i{)-xA*nTL$tKIb0p7w3>+gS`Hs?g$8K`8CvN)1RE=6X2Oir=JSdUsyS>IbT!J#wk8xV!} z!iR_Kvz=*9fiuq$ZVgalCiw9~Z$G#$4mM8Xf?vg-03wWoW{QX}M6LWx?lg`5-NExg z^qpGqG3`BQok#2G>+~I(Wj}#T+;0=+F&{O;)oec4{|?MHu9kQz)0N`srBd-esr!FR!6)W=EjF&kV=rjRR0KABI(!^?G6v$fwk9%}J= zx&;1yggy^VK7q}FmUsw$ZFW*oxjHgm&qux91br4~GK~PQ{=wX522lsh^q2UL`MuDg z)xn>l#|g*Bc;s_(hII`xev7rude@pxm(vZj1$om;kFXabV_vs=?5kmk2KF{v;%s$x zIq~l4ZkBtJw+?#yR6d_8F;zSaWNH@gi%-Pi@+f&$tbU#$Yvg0{JH$qvYEq+6cTUu0 zi022P>*Mi`aD2!(GM%&nF^{r{^{n-Y^&R-@I69Vk^a6S%okwq__tGaY)(>z#KO>Vz z+n2FarvyCywU@#t@`w04{A3*YCy}pTMqM)qrSf3#WORI4@v+)?j5XJ~-5NntvDfjm zn9fIE1(kG4z;hW;-HDk6g1o(A1s0Oei`eu_p(Ij`WAQE^uqAJaEc zMvZFdB$I4%O~iyM<6|{=rCOzGP;J+%2Gt0gH6xGO)DG3II)LnZO_%95{iu@$;L#9x zDcMi)Q~j_Xsvg>2qdv;EbL?C@V*hJDg*)2Ga%ClW`fI)kp0{cY2IEaW&kcl!$CP(Ym#(#{#)S3pUmL{-HTeSA;7`i8` z+FoVX*mZWj-H6UjE4nrv=-70lX6y%dgjfPgf({P@s|fUW7PNN+y1M|HyA&B$39VfX zom~fw-3Wc%3T@rN_OfoESwB=v2pT5INdc;5IK<%?RSrfJMS^0d6pEtKSqf!cgF3uE zmKCke4yVJ}3)JfcPYqy-b%LAZrl11KaEZ$i$2o2U+*RNfyQOZqTM0z02BOrt^TNITm0ol~`h$Z&FJx~w?)`#3LVN?kl1MU1 zA*m!x(ntnjM3ZciLvl%k7@e#Uw}1APaSGj?9IA&6CrhU<+g+G;9fae`T^(>y*`;z7 zGPG9K$+hS&G{{ETB%8t3|2;aop`LnWpX`?h<$xT-(W75@ovE4DIve#(9y+dt=(d)j(^`ct&MIKTTHOE)Z$Z7? z4xH%HJ-SaH)Pp+SBmyx~O&YMB8I2gsMfH?#3W4)wrovR273ihZqMB$xUbY}F+kqQh z;MzW*#-ND@2PFeB()>(xg|wgT=lXemK6;}iewkkZwXwoq1^u|zZ}6MYCu;NC(e3N< zd;C8CAh0z)NDPv}T4_OMzycj)2f0vV`9Wb&5|jlMs9IJ8tAbk8r42z7Iyh~ys=h1e zL5>`Z=0_6dEh0bSNfIioFcdmLv}PevBZ$%hL})3Zvl5Y6jmWG+R5l_aTY*&_z^QIT zVLu`;gy>5`ZxX>%nHXmTF; str: - attrs = [ - ('id', self.id), - ('name', self.name), - ('position', self.position), - ('nsfw', self.nsfw), - ('news', self.is_news()), - ('category_id', self.category_id), - ] - joined = ' '.join('%s=%r' % t for t in attrs) - return f'<{self.__class__.__name__} {joined}>' - - def _update(self, guild: Guild, data: Union[TextChannelPayload, NewsChannelPayload]) -> None: - self.guild: Guild = guild - self.name: str = data['name'] - self.category_id: Optional[int] = utils._get_as_snowflake(data, 'parent_id') - self.topic: Optional[str] = data.get('topic') - self.position: int = data['position'] - self.nsfw: bool = data.get('nsfw', False) - # Does this need coercion into `int`? No idea yet. - self.slowmode_delay: int = data.get('rate_limit_per_user', 0) - self.default_auto_archive_duration: ThreadArchiveDuration = data.get('default_auto_archive_duration', 1440) - self.default_thread_slowmode_delay: int = data.get('default_thread_rate_limit_per_user', 0) - self._type: Literal[0, 5] = data.get('type', self._type) - self.last_message_id: Optional[int] = utils._get_as_snowflake(data, 'last_message_id') - self._fill_overwrites(data) - - async def _get_channel(self) -> Self: - return self - - @property - def type(self) -> Literal[ChannelType.text, ChannelType.news]: - """:class:`ChannelType`: The channel's Discord type.""" - if self._type == 0: - return ChannelType.text - return ChannelType.news - - @property - def _sorting_bucket(self) -> int: - return ChannelType.text.value - - @property - def _scheduled_event_entity_type(self) -> Optional[EntityType]: - return None - - @utils.copy_doc(discord.abc.GuildChannel.permissions_for) - def permissions_for(self, obj: Union[Member, Role], /) -> Permissions: - base = super().permissions_for(obj) - self._apply_implicit_permissions(base) - - # text channels do not have voice related permissions - denied = Permissions.voice() - base.value &= ~denied.value - return base - - @property - def members(self) -> List[Member]: - """List[:class:`Member`]: Returns all members that can see this channel.""" - return [m for m in self.guild.members if self.permissions_for(m).read_messages] - - @property - def threads(self) -> List[Thread]: - """List[:class:`Thread`]: Returns all the threads that you can see. - - .. versionadded:: 2.0 - """ - return [thread for thread in self.guild._threads.values() if thread.parent_id == self.id] - - def is_nsfw(self) -> bool: - """:class:`bool`: Checks if the channel is NSFW.""" - return self.nsfw - - def is_news(self) -> bool: - """:class:`bool`: Checks if the channel is a news channel.""" - return self._type == ChannelType.news.value - - @property - def last_message(self) -> Optional[Message]: - """Retrieves the last message from this channel in cache. - - The message might not be valid or point to an existing message. - - .. admonition:: Reliable Fetching - :class: helpful - - For a slightly more reliable method of fetching the - last message, consider using either :meth:`history` - or :meth:`fetch_message` with the :attr:`last_message_id` - attribute. - - Returns - --------- - Optional[:class:`Message`] - The last message in this channel or ``None`` if not found. - """ - return self._state._get_message(self.last_message_id) if self.last_message_id else None - - @overload - async def edit(self) -> Optional[TextChannel]: - ... - - @overload - async def edit(self, *, position: int, reason: Optional[str] = ...) -> None: - ... - - @overload - async def edit( - self, - *, - reason: Optional[str] = ..., - name: str = ..., - topic: str = ..., - position: int = ..., - nsfw: bool = ..., - sync_permissions: bool = ..., - category: Optional[CategoryChannel] = ..., - slowmode_delay: int = ..., - default_auto_archive_duration: ThreadArchiveDuration = ..., - default_thread_slowmode_delay: int = ..., - type: ChannelType = ..., - overwrites: Mapping[OverwriteKeyT, PermissionOverwrite] = ..., - ) -> TextChannel: - ... - - async def edit(self, *, reason: Optional[str] = None, **options: Any) -> Optional[TextChannel]: - """|coro| - - Edits the channel. - - You must have :attr:`~Permissions.manage_channels` to do this. - - .. versionchanged:: 1.3 - The ``overwrites`` keyword-only parameter was added. - - .. versionchanged:: 1.4 - The ``type`` keyword-only parameter was added. - - .. versionchanged:: 2.0 - Edits are no longer in-place, the newly edited channel is returned instead. - - .. versionchanged:: 2.0 - This function will now raise :exc:`TypeError` or - :exc:`ValueError` instead of ``InvalidArgument``. - - Parameters - ---------- - name: :class:`str` - The new channel name. - topic: :class:`str` - The new channel's topic. - position: :class:`int` - The new channel's position. - nsfw: :class:`bool` - To mark the channel as NSFW or not. - sync_permissions: :class:`bool` - Whether to sync permissions with the channel's new or pre-existing - category. Defaults to ``False``. - category: Optional[:class:`CategoryChannel`] - The new category for this channel. Can be ``None`` to remove the - category. - slowmode_delay: :class:`int` - Specifies the slowmode rate limit for user in this channel, in seconds. - A value of ``0`` disables slowmode. The maximum value possible is ``21600``. - type: :class:`ChannelType` - Change the type of this text channel. Currently, only conversion between - :attr:`ChannelType.text` and :attr:`ChannelType.news` is supported. This - is only available to guilds that contain ``NEWS`` in :attr:`Guild.features`. - reason: Optional[:class:`str`] - The reason for editing this channel. Shows up on the audit log. - overwrites: :class:`Mapping` - A :class:`Mapping` of target (either a role or a member) to - :class:`PermissionOverwrite` to apply to the channel. - default_auto_archive_duration: :class:`int` - The new default auto archive duration in minutes for threads created in this channel. - Must be one of ``60``, ``1440``, ``4320``, or ``10080``. - - .. versionadded:: 2.0 - default_thread_slowmode_delay: :class:`int` - The new default slowmode delay in seconds for threads created in this channel. - - .. versionadded:: 2.3 - Raises - ------ - ValueError - The new ``position`` is less than 0 or greater than the number of channels. - TypeError - The permission overwrite information is not in proper form. - Forbidden - You do not have permissions to edit the channel. - HTTPException - Editing the channel failed. - - Returns - -------- - Optional[:class:`.TextChannel`] - The newly edited text channel. If the edit was only positional - then ``None`` is returned instead. - """ - - payload = await self._edit(options, reason=reason) - if payload is not None: - # the payload will always be the proper channel payload - return self.__class__(state=self._state, guild=self.guild, data=payload) # type: ignore - - @utils.copy_doc(discord.abc.GuildChannel.clone) - async def clone(self, *, name: Optional[str] = None, reason: Optional[str] = None) -> TextChannel: - return await self._clone_impl( - {'topic': self.topic, 'nsfw': self.nsfw, 'rate_limit_per_user': self.slowmode_delay}, name=name, reason=reason - ) - - async def delete_messages(self, messages: Iterable[Snowflake], *, reason: Optional[str] = None) -> None: - """|coro| - - Deletes a list of messages. This is similar to :meth:`Message.delete` - except it bulk deletes multiple messages. - - As a special case, if the number of messages is 0, then nothing - is done. If the number of messages is 1 then single message - delete is done. If it's more than two, then bulk delete is used. - - You cannot bulk delete more than 100 messages or messages that - are older than 14 days old. - - You must have :attr:`~Permissions.manage_messages` to do this. - - .. versionchanged:: 2.0 - - ``messages`` parameter is now positional-only. - - The ``reason`` keyword-only parameter was added. - - Parameters - ----------- - messages: Iterable[:class:`abc.Snowflake`] - An iterable of messages denoting which ones to bulk delete. - reason: Optional[:class:`str`] - The reason for deleting the messages. Shows up on the audit log. - - Raises - ------ - ClientException - The number of messages to delete was more than 100. - Forbidden - You do not have proper permissions to delete the messages. - NotFound - If single delete, then the message was already deleted. - HTTPException - Deleting the messages failed. - """ - if not isinstance(messages, (list, tuple)): - messages = list(messages) - - if len(messages) == 0: - return # do nothing - - if len(messages) == 1: - message_id: int = messages[0].id - await self._state.http.delete_message(self.id, message_id) - return - - if len(messages) > 100: - raise ClientException('Can only bulk delete messages up to 100 messages') - - message_ids: SnowflakeList = [m.id for m in messages] - await self._state.http.delete_messages(self.id, message_ids, reason=reason) - - async def purge( - self, - *, - limit: Optional[int] = 100, - check: Callable[[Message], bool] = MISSING, - before: Optional[SnowflakeTime] = None, - after: Optional[SnowflakeTime] = None, - around: Optional[SnowflakeTime] = None, - oldest_first: Optional[bool] = None, - bulk: bool = True, - reason: Optional[str] = None, - ) -> List[Message]: - """|coro| - - Purges a list of messages that meet the criteria given by the predicate - ``check``. If a ``check`` is not provided then all messages are deleted - without discrimination. - - You must have :attr:`~Permissions.manage_messages` to - delete messages even if they are your own. - Having :attr:`~Permissions.read_message_history` is - also needed to retrieve message history. - - .. versionchanged:: 2.0 - - The ``reason`` keyword-only parameter was added. - - Examples - --------- - - Deleting bot's messages :: - - def is_me(m): - return m.author == client.user - - deleted = await channel.purge(limit=100, check=is_me) - await channel.send(f'Deleted {len(deleted)} message(s)') - - Parameters - ----------- - limit: Optional[:class:`int`] - The number of messages to search through. This is not the number - of messages that will be deleted, though it can be. - check: Callable[[:class:`Message`], :class:`bool`] - The function used to check if a message should be deleted. - It must take a :class:`Message` as its sole parameter. - before: Optional[Union[:class:`abc.Snowflake`, :class:`datetime.datetime`]] - Same as ``before`` in :meth:`history`. - after: Optional[Union[:class:`abc.Snowflake`, :class:`datetime.datetime`]] - Same as ``after`` in :meth:`history`. - around: Optional[Union[:class:`abc.Snowflake`, :class:`datetime.datetime`]] - Same as ``around`` in :meth:`history`. - oldest_first: Optional[:class:`bool`] - Same as ``oldest_first`` in :meth:`history`. - bulk: :class:`bool` - If ``True``, use bulk delete. Setting this to ``False`` is useful for mass-deleting - a bot's own messages without :attr:`Permissions.manage_messages`. When ``True``, will - fall back to single delete if messages are older than two weeks. - reason: Optional[:class:`str`] - The reason for purging the messages. Shows up on the audit log. - - Raises - ------- - Forbidden - You do not have proper permissions to do the actions required. - HTTPException - Purging the messages failed. - - Returns - -------- - List[:class:`.Message`] - The list of messages that were deleted. - """ - return await discord.abc._purge_helper( - self, - limit=limit, - check=check, - before=before, - after=after, - around=around, - oldest_first=oldest_first, - bulk=bulk, - reason=reason, - ) - - async def webhooks(self) -> List[Webhook]: - """|coro| - - Gets the list of webhooks from this channel. - - You must have :attr:`~.Permissions.manage_webhooks` to do this. - - Raises - ------- - Forbidden - You don't have permissions to get the webhooks. - - Returns - -------- - List[:class:`Webhook`] - The webhooks for this channel. - """ - - from .webhook import Webhook - - data = await self._state.http.channel_webhooks(self.id) - return [Webhook.from_state(d, state=self._state) for d in data] - - async def create_webhook(self, *, name: str, avatar: Optional[bytes] = None, reason: Optional[str] = None) -> Webhook: - """|coro| - - Creates a webhook for this channel. - - You must have :attr:`~.Permissions.manage_webhooks` to do this. - - .. versionchanged:: 1.1 - Added the ``reason`` keyword-only parameter. - - Parameters - ------------- - name: :class:`str` - The webhook's name. - avatar: Optional[:class:`bytes`] - A :term:`py:bytes-like object` representing the webhook's default avatar. - This operates similarly to :meth:`~ClientUser.edit`. - reason: Optional[:class:`str`] - The reason for creating this webhook. Shows up in the audit logs. - - Raises - ------- - HTTPException - Creating the webhook failed. - Forbidden - You do not have permissions to create a webhook. - - Returns - -------- - :class:`Webhook` - The created webhook. - """ - - from .webhook import Webhook - - if avatar is not None: - avatar = utils._bytes_to_base64_data(avatar) # type: ignore # Silence reassignment error - - data = await self._state.http.create_webhook(self.id, name=str(name), avatar=avatar, reason=reason) - return Webhook.from_state(data, state=self._state) - - async def follow(self, *, destination: TextChannel, reason: Optional[str] = None) -> Webhook: - """|coro| - - Follows a channel using a webhook. - - Only news channels can be followed. - - .. note:: - - The webhook returned will not provide a token to do webhook - actions, as Discord does not provide it. - - .. versionadded:: 1.3 - - .. versionchanged:: 2.0 - This function will now raise :exc:`TypeError` instead of - ``InvalidArgument``. - - Parameters - ----------- - destination: :class:`TextChannel` - The channel you would like to follow from. - reason: Optional[:class:`str`] - The reason for following the channel. Shows up on the destination guild's audit log. - - .. versionadded:: 1.4 - - Raises - ------- - HTTPException - Following the channel failed. - Forbidden - You do not have the permissions to create a webhook. - ClientException - The channel is not a news channel. - TypeError - The destination channel is not a text channel. - - Returns - -------- - :class:`Webhook` - The created webhook. - """ - - if not self.is_news(): - raise ClientException('The channel must be a news channel.') - - if not isinstance(destination, TextChannel): - raise TypeError(f'Expected TextChannel received {destination.__class__.__name__}') - - from .webhook import Webhook - - data = await self._state.http.follow_webhook(self.id, webhook_channel_id=destination.id, reason=reason) - return Webhook._as_follower(data, channel=destination, user=self._state.user) - - def get_partial_message(self, message_id: int, /) -> PartialMessage: - """Creates a :class:`PartialMessage` from the message ID. - - This is useful if you want to work with a message and only have its ID without - doing an unnecessary API call. - - .. versionadded:: 1.6 - - .. versionchanged:: 2.0 - - ``message_id`` parameter is now positional-only. - - Parameters - ------------ - message_id: :class:`int` - The message ID to create a partial message for. - - Returns - --------- - :class:`PartialMessage` - The partial message. - """ - - from .message import PartialMessage - - return PartialMessage(channel=self, id=message_id) - - def get_thread(self, thread_id: int, /) -> Optional[Thread]: - """Returns a thread with the given ID. - - .. note:: - - This does not always retrieve archived threads, as they are not retained in the internal - cache. Use :func:`Guild.fetch_channel` instead. - - .. versionadded:: 2.0 - - Parameters - ----------- - thread_id: :class:`int` - The ID to search for. - - Returns - -------- - Optional[:class:`Thread`] - The returned thread or ``None`` if not found. - """ - return self.guild.get_thread(thread_id) - - async def create_thread( - self, - *, - name: str, - message: Optional[Snowflake] = None, - auto_archive_duration: ThreadArchiveDuration = MISSING, - type: Optional[ChannelType] = None, - reason: Optional[str] = None, - invitable: bool = True, - slowmode_delay: Optional[int] = None, - ) -> Thread: - """|coro| - - Creates a thread in this text channel. - - To create a public thread, you must have :attr:`~discord.Permissions.create_public_threads`. - For a private thread, :attr:`~discord.Permissions.create_private_threads` is needed instead. - - .. versionadded:: 2.0 - - Parameters - ----------- - name: :class:`str` - The name of the thread. - message: Optional[:class:`abc.Snowflake`] - A snowflake representing the message to create the thread with. - If ``None`` is passed then a private thread is created. - Defaults to ``None``. - auto_archive_duration: :class:`int` - The duration in minutes before a thread is automatically hidden from the channel list. - If not provided, the channel's default auto archive duration is used. - - Must be one of ``60``, ``1440``, ``4320``, or ``10080``, if provided. - type: Optional[:class:`ChannelType`] - The type of thread to create. If a ``message`` is passed then this parameter - is ignored, as a thread created with a message is always a public thread. - By default this creates a private thread if this is ``None``. - reason: :class:`str` - The reason for creating a new thread. Shows up on the audit log. - invitable: :class:`bool` - Whether non-moderators can add users to the thread. Only applicable to private threads. - Defaults to ``True``. - slowmode_delay: Optional[:class:`int`] - Specifies the slowmode rate limit for user in this channel, in seconds. - The maximum value possible is ``21600``. By default no slowmode rate limit - if this is ``None``. - - Raises - ------- - Forbidden - You do not have permissions to create a thread. - HTTPException - Starting the thread failed. - - Returns - -------- - :class:`Thread` - The created thread - """ - - if type is None: - type = ChannelType.private_thread - - if message is None: - data = await self._state.http.start_thread_without_message( - self.id, - name=name, - auto_archive_duration=auto_archive_duration or self.default_auto_archive_duration, - type=type.value, - reason=reason, - invitable=invitable, - rate_limit_per_user=slowmode_delay, - ) - else: - data = await self._state.http.start_thread_with_message( - self.id, - message.id, - name=name, - auto_archive_duration=auto_archive_duration or self.default_auto_archive_duration, - reason=reason, - rate_limit_per_user=slowmode_delay, - ) - - return Thread(guild=self.guild, state=self._state, data=data) - - async def archived_threads( - self, - *, - private: bool = False, - joined: bool = False, - limit: Optional[int] = 100, - before: Optional[Union[Snowflake, datetime.datetime]] = None, - ) -> AsyncIterator[Thread]: - """Returns an :term:`asynchronous iterator` that iterates over all archived threads in this text channel, - in order of decreasing ID for joined threads, and decreasing :attr:`Thread.archive_timestamp` otherwise. - - You must have :attr:`~Permissions.read_message_history` to do this. If iterating over private threads - then :attr:`~Permissions.manage_threads` is also required. - - .. versionadded:: 2.0 - - Parameters - ----------- - limit: Optional[:class:`bool`] - The number of threads to retrieve. - If ``None``, retrieves every archived thread in the channel. Note, however, - that this would make it a slow operation. - before: Optional[Union[:class:`abc.Snowflake`, :class:`datetime.datetime`]] - Retrieve archived channels before the given date or ID. - private: :class:`bool` - Whether to retrieve private archived threads. - joined: :class:`bool` - Whether to retrieve private archived threads that you've joined. - You cannot set ``joined`` to ``True`` and ``private`` to ``False``. - - Raises - ------ - Forbidden - You do not have permissions to get archived threads. - HTTPException - The request to get the archived threads failed. - ValueError - ``joined`` was set to ``True`` and ``private`` was set to ``False``. You cannot retrieve public archived - threads that you have joined. - - Yields - ------- - :class:`Thread` - The archived threads. - """ - if joined and not private: - raise ValueError('Cannot retrieve joined public archived threads') - - before_timestamp = None - - if isinstance(before, datetime.datetime): - if joined: - before_timestamp = str(utils.time_snowflake(before, high=False)) - else: - before_timestamp = before.isoformat() - elif before is not None: - if joined: - before_timestamp = str(before.id) - else: - before_timestamp = utils.snowflake_time(before.id).isoformat() - - update_before = lambda data: data['thread_metadata']['archive_timestamp'] - endpoint = self.guild._state.http.get_public_archived_threads - - if joined: - update_before = lambda data: data['id'] - endpoint = self.guild._state.http.get_joined_private_archived_threads - elif private: - endpoint = self.guild._state.http.get_private_archived_threads - - while True: - retrieve = 100 - if limit is not None: - if limit <= 0: - return - retrieve = max(2, min(retrieve, limit)) - - data = await endpoint(self.id, before=before_timestamp, limit=retrieve) - - threads = data.get('threads', []) - for raw_thread in threads: - yield Thread(guild=self.guild, state=self.guild._state, data=raw_thread) - # Currently the API doesn't let you request less than 2 threads. - # Bail out early if we had to retrieve more than what the limit was. - if limit is not None: - limit -= 1 - if limit <= 0: - return - - if not data.get('has_more', False): - return - - before_timestamp = update_before(threads[-1]) - - -class VocalGuildChannel(discord.abc.Messageable, discord.abc.Connectable, discord.abc.GuildChannel, Hashable): - __slots__ = ( - 'name', - 'id', - 'guild', - 'nsfw', - 'bitrate', - 'user_limit', - '_state', - 'position', - 'slowmode_delay', - '_overwrites', - 'category_id', - 'rtc_region', - 'video_quality_mode', - 'last_message_id', - ) - - def __init__(self, *, state: ConnectionState, guild: Guild, data: Union[VoiceChannelPayload, StageChannelPayload]): - self._state: ConnectionState = state - self.id: int = int(data['id']) - self._update(guild, data) - - async def _get_channel(self) -> Self: - return self - - def _get_voice_client_key(self) -> Tuple[int, str]: - return self.guild.id, 'guild_id' - - def _get_voice_state_pair(self) -> Tuple[int, int]: - return self.guild.id, self.id - - def _update(self, guild: Guild, data: Union[VoiceChannelPayload, StageChannelPayload]) -> None: - self.guild: Guild = guild - self.name: str = data['name'] - self.nsfw: bool = data.get('nsfw', False) - self.rtc_region: Optional[str] = data.get('rtc_region') - self.video_quality_mode: VideoQualityMode = try_enum(VideoQualityMode, data.get('video_quality_mode', 1)) - self.category_id: Optional[int] = utils._get_as_snowflake(data, 'parent_id') - self.last_message_id: Optional[int] = utils._get_as_snowflake(data, 'last_message_id') - self.position: int = data['position'] - self.slowmode_delay = data.get('rate_limit_per_user', 0) - self.bitrate: int = data['bitrate'] - self.user_limit: int = data['user_limit'] - self._fill_overwrites(data) - - @property - def _sorting_bucket(self) -> int: - return ChannelType.voice.value - - def is_nsfw(self) -> bool: - """:class:`bool`: Checks if the channel is NSFW. - - .. versionadded:: 2.0 - """ - return self.nsfw - - @property - def members(self) -> List[Member]: - """List[:class:`Member`]: Returns all members that are currently inside this voice channel.""" - ret = [] - for user_id, state in self.guild._voice_states.items(): - if state.channel and state.channel.id == self.id: - member = self.guild.get_member(user_id) - if member is not None: - ret.append(member) - return ret - - @property - def voice_states(self) -> Dict[int, VoiceState]: - """Returns a mapping of member IDs who have voice states in this channel. - - .. versionadded:: 1.3 - - .. note:: - - This function is intentionally low level to replace :attr:`members` - when the member cache is unavailable. - - Returns - -------- - Mapping[:class:`int`, :class:`VoiceState`] - The mapping of member ID to a voice state. - """ - # fmt: off - return { - key: value - for key, value in self.guild._voice_states.items() - if value.channel and value.channel.id == self.id - } - # fmt: on - - @property - def scheduled_events(self) -> List[ScheduledEvent]: - """List[:class:`ScheduledEvent`]: Returns all scheduled events for this channel. - - .. versionadded:: 2.0 - """ - return [event for event in self.guild.scheduled_events if event.channel_id == self.id] - - @utils.copy_doc(discord.abc.GuildChannel.permissions_for) - def permissions_for(self, obj: Union[Member, Role], /) -> Permissions: - base = super().permissions_for(obj) - self._apply_implicit_permissions(base) - - # voice channels cannot be edited by people who can't connect to them - # It also implicitly denies all other voice perms - if not base.connect: - denied = Permissions.voice() - denied.update(manage_channels=True, manage_roles=True) - base.value &= ~denied.value - return base - - @property - def last_message(self) -> Optional[Message]: - """Retrieves the last message from this channel in cache. - - The message might not be valid or point to an existing message. - - .. versionadded:: 2.0 - - .. admonition:: Reliable Fetching - :class: helpful - - For a slightly more reliable method of fetching the - last message, consider using either :meth:`history` - or :meth:`fetch_message` with the :attr:`last_message_id` - attribute. - - Returns - --------- - Optional[:class:`Message`] - The last message in this channel or ``None`` if not found. - """ - return self._state._get_message(self.last_message_id) if self.last_message_id else None - - def get_partial_message(self, message_id: int, /) -> PartialMessage: - """Creates a :class:`PartialMessage` from the message ID. - - This is useful if you want to work with a message and only have its ID without - doing an unnecessary API call. - - .. versionadded:: 2.0 - - Parameters - ------------ - message_id: :class:`int` - The message ID to create a partial message for. - - Returns - --------- - :class:`PartialMessage` - The partial message. - """ - - from .message import PartialMessage - - return PartialMessage(channel=self, id=message_id) # type: ignore # VocalGuildChannel is an impl detail - - async def delete_messages(self, messages: Iterable[Snowflake], *, reason: Optional[str] = None) -> None: - """|coro| - - Deletes a list of messages. This is similar to :meth:`Message.delete` - except it bulk deletes multiple messages. - - As a special case, if the number of messages is 0, then nothing - is done. If the number of messages is 1 then single message - delete is done. If it's more than two, then bulk delete is used. - - You cannot bulk delete more than 100 messages or messages that - are older than 14 days old. - - You must have :attr:`~Permissions.manage_messages` to do this. - - .. versionadded:: 2.0 - - Parameters - ----------- - messages: Iterable[:class:`abc.Snowflake`] - An iterable of messages denoting which ones to bulk delete. - reason: Optional[:class:`str`] - The reason for deleting the messages. Shows up on the audit log. - - Raises - ------ - ClientException - The number of messages to delete was more than 100. - Forbidden - You do not have proper permissions to delete the messages. - NotFound - If single delete, then the message was already deleted. - HTTPException - Deleting the messages failed. - """ - if not isinstance(messages, (list, tuple)): - messages = list(messages) - - if len(messages) == 0: - return # do nothing - - if len(messages) == 1: - message_id: int = messages[0].id - await self._state.http.delete_message(self.id, message_id) - return - - if len(messages) > 100: - raise ClientException('Can only bulk delete messages up to 100 messages') - - message_ids: SnowflakeList = [m.id for m in messages] - await self._state.http.delete_messages(self.id, message_ids, reason=reason) - - async def purge( - self, - *, - limit: Optional[int] = 100, - check: Callable[[Message], bool] = MISSING, - before: Optional[SnowflakeTime] = None, - after: Optional[SnowflakeTime] = None, - around: Optional[SnowflakeTime] = None, - oldest_first: Optional[bool] = None, - bulk: bool = True, - reason: Optional[str] = None, - ) -> List[Message]: - """|coro| - - Purges a list of messages that meet the criteria given by the predicate - ``check``. If a ``check`` is not provided then all messages are deleted - without discrimination. - - You must have :attr:`~Permissions.manage_messages` to - delete messages even if they are your own. - Having :attr:`~Permissions.read_message_history` is - also needed to retrieve message history. - - .. versionadded:: 2.0 - - Examples - --------- - - Deleting bot's messages :: - - def is_me(m): - return m.author == client.user - - deleted = await channel.purge(limit=100, check=is_me) - await channel.send(f'Deleted {len(deleted)} message(s)') - - Parameters - ----------- - limit: Optional[:class:`int`] - The number of messages to search through. This is not the number - of messages that will be deleted, though it can be. - check: Callable[[:class:`Message`], :class:`bool`] - The function used to check if a message should be deleted. - It must take a :class:`Message` as its sole parameter. - before: Optional[Union[:class:`abc.Snowflake`, :class:`datetime.datetime`]] - Same as ``before`` in :meth:`history`. - after: Optional[Union[:class:`abc.Snowflake`, :class:`datetime.datetime`]] - Same as ``after`` in :meth:`history`. - around: Optional[Union[:class:`abc.Snowflake`, :class:`datetime.datetime`]] - Same as ``around`` in :meth:`history`. - oldest_first: Optional[:class:`bool`] - Same as ``oldest_first`` in :meth:`history`. - bulk: :class:`bool` - If ``True``, use bulk delete. Setting this to ``False`` is useful for mass-deleting - a bot's own messages without :attr:`Permissions.manage_messages`. When ``True``, will - fall back to single delete if messages are older than two weeks. - reason: Optional[:class:`str`] - The reason for purging the messages. Shows up on the audit log. - - Raises - ------- - Forbidden - You do not have proper permissions to do the actions required. - HTTPException - Purging the messages failed. - - Returns - -------- - List[:class:`.Message`] - The list of messages that were deleted. - """ - - return await discord.abc._purge_helper( - self, - limit=limit, - check=check, - before=before, - after=after, - around=around, - oldest_first=oldest_first, - bulk=bulk, - reason=reason, - ) - - async def webhooks(self) -> List[Webhook]: - """|coro| - - Gets the list of webhooks from this channel. - - You must have :attr:`~.Permissions.manage_webhooks` to do this. - - .. versionadded:: 2.0 - - Raises - ------- - Forbidden - You don't have permissions to get the webhooks. - - Returns - -------- - List[:class:`Webhook`] - The webhooks for this channel. - """ - - from .webhook import Webhook - - data = await self._state.http.channel_webhooks(self.id) - return [Webhook.from_state(d, state=self._state) for d in data] - - async def create_webhook(self, *, name: str, avatar: Optional[bytes] = None, reason: Optional[str] = None) -> Webhook: - """|coro| - - Creates a webhook for this channel. - - You must have :attr:`~.Permissions.manage_webhooks` to do this. - - .. versionadded:: 2.0 - - Parameters - ------------- - name: :class:`str` - The webhook's name. - avatar: Optional[:class:`bytes`] - A :term:`py:bytes-like object` representing the webhook's default avatar. - This operates similarly to :meth:`~ClientUser.edit`. - reason: Optional[:class:`str`] - The reason for creating this webhook. Shows up in the audit logs. - - Raises - ------- - HTTPException - Creating the webhook failed. - Forbidden - You do not have permissions to create a webhook. - - Returns - -------- - :class:`Webhook` - The created webhook. - """ - - from .webhook import Webhook - - if avatar is not None: - avatar = utils._bytes_to_base64_data(avatar) # type: ignore # Silence reassignment error - - data = await self._state.http.create_webhook(self.id, name=str(name), avatar=avatar, reason=reason) - return Webhook.from_state(data, state=self._state) - - -class VoiceChannel(VocalGuildChannel): - """Represents a Discord guild voice channel. - - .. container:: operations - - .. describe:: x == y - - Checks if two channels are equal. - - .. describe:: x != y - - Checks if two channels are not equal. - - .. describe:: hash(x) - - Returns the channel's hash. - - .. describe:: str(x) - - Returns the channel's name. - - Attributes - ----------- - name: :class:`str` - The channel name. - guild: :class:`Guild` - The guild the channel belongs to. - id: :class:`int` - The channel ID. - nsfw: :class:`bool` - If the channel is marked as "not safe for work" or "age restricted". - - .. versionadded:: 2.0 - category_id: Optional[:class:`int`] - The category channel ID this channel belongs to, if applicable. - position: :class:`int` - The position in the channel list. This is a number that starts at 0. e.g. the - top channel is position 0. - bitrate: :class:`int` - The channel's preferred audio bitrate in bits per second. - user_limit: :class:`int` - The channel's limit for number of members that can be in a voice channel. - rtc_region: Optional[:class:`str`] - The region for the voice channel's voice communication. - A value of ``None`` indicates automatic voice region detection. - - .. versionadded:: 1.7 - - .. versionchanged:: 2.0 - The type of this attribute has changed to :class:`str`. - video_quality_mode: :class:`VideoQualityMode` - The camera video quality for the voice channel's participants. - - .. versionadded:: 2.0 - last_message_id: Optional[:class:`int`] - The last message ID of the message sent to this channel. It may - *not* point to an existing or valid message. - - .. versionadded:: 2.0 - slowmode_delay: :class:`int` - The number of seconds a member must wait between sending messages - in this channel. A value of ``0`` denotes that it is disabled. - Bots and users with :attr:`~Permissions.manage_channels` or - :attr:`~Permissions.manage_messages` bypass slowmode. - - .. versionadded:: 2.2 - """ - - __slots__ = () - - def __repr__(self) -> str: - attrs = [ - ('id', self.id), - ('name', self.name), - ('rtc_region', self.rtc_region), - ('position', self.position), - ('bitrate', self.bitrate), - ('video_quality_mode', self.video_quality_mode), - ('user_limit', self.user_limit), - ('category_id', self.category_id), - ] - joined = ' '.join('%s=%r' % t for t in attrs) - return f'<{self.__class__.__name__} {joined}>' - - @property - def _scheduled_event_entity_type(self) -> Optional[EntityType]: - return EntityType.voice - - @property - def type(self) -> Literal[ChannelType.voice]: - """:class:`ChannelType`: The channel's Discord type.""" - return ChannelType.voice - - @utils.copy_doc(discord.abc.GuildChannel.clone) - async def clone(self, *, name: Optional[str] = None, reason: Optional[str] = None) -> VoiceChannel: - return await self._clone_impl({'bitrate': self.bitrate, 'user_limit': self.user_limit}, name=name, reason=reason) - - @overload - async def edit(self) -> None: - ... - - @overload - async def edit(self, *, position: int, reason: Optional[str] = ...) -> None: - ... - - @overload - async def edit( - self, - *, - name: str = ..., - nsfw: bool = ..., - bitrate: int = ..., - user_limit: int = ..., - position: int = ..., - sync_permissions: int = ..., - category: Optional[CategoryChannel] = ..., - overwrites: Mapping[OverwriteKeyT, PermissionOverwrite] = ..., - rtc_region: Optional[str] = ..., - video_quality_mode: VideoQualityMode = ..., - slowmode_delay: int = ..., - reason: Optional[str] = ..., - ) -> VoiceChannel: - ... - - async def edit(self, *, reason: Optional[str] = None, **options: Any) -> Optional[VoiceChannel]: - """|coro| - - Edits the channel. - - You must have :attr:`~Permissions.manage_channels` to do this. - - .. versionchanged:: 1.3 - The ``overwrites`` keyword-only parameter was added. - - .. versionchanged:: 2.0 - Edits are no longer in-place, the newly edited channel is returned instead. - - .. versionchanged:: 2.0 - The ``region`` parameter now accepts :class:`str` instead of an enum. - - .. versionchanged:: 2.0 - This function will now raise :exc:`TypeError` instead of - ``InvalidArgument``. - - Parameters - ---------- - name: :class:`str` - The new channel's name. - bitrate: :class:`int` - The new channel's bitrate. - nsfw: :class:`bool` - To mark the channel as NSFW or not. - user_limit: :class:`int` - The new channel's user limit. - position: :class:`int` - The new channel's position. - sync_permissions: :class:`bool` - Whether to sync permissions with the channel's new or pre-existing - category. Defaults to ``False``. - category: Optional[:class:`CategoryChannel`] - The new category for this channel. Can be ``None`` to remove the - category. - slowmode_delay: :class:`int` - Specifies the slowmode rate limit for user in this channel, in seconds. - A value of ``0`` disables slowmode. The maximum value possible is ``21600``. - reason: Optional[:class:`str`] - The reason for editing this channel. Shows up on the audit log. - overwrites: :class:`Mapping` - A :class:`Mapping` of target (either a role or a member) to - :class:`PermissionOverwrite` to apply to the channel. - rtc_region: Optional[:class:`str`] - The new region for the voice channel's voice communication. - A value of ``None`` indicates automatic voice region detection. - - .. versionadded:: 1.7 - video_quality_mode: :class:`VideoQualityMode` - The camera video quality for the voice channel's participants. - - .. versionadded:: 2.0 - - Raises - ------ - TypeError - If the permission overwrite information is not in proper form. - Forbidden - You do not have permissions to edit the channel. - HTTPException - Editing the channel failed. - - Returns - -------- - Optional[:class:`.VoiceChannel`] - The newly edited voice channel. If the edit was only positional - then ``None`` is returned instead. - """ - payload = await self._edit(options, reason=reason) - if payload is not None: - # the payload will always be the proper channel payload - return self.__class__(state=self._state, guild=self.guild, data=payload) # type: ignore - - -class StageChannel(VocalGuildChannel): - """Represents a Discord guild stage channel. - - .. versionadded:: 1.7 - - .. container:: operations - - .. describe:: x == y - - Checks if two channels are equal. - - .. describe:: x != y - - Checks if two channels are not equal. - - .. describe:: hash(x) - - Returns the channel's hash. - - .. describe:: str(x) - - Returns the channel's name. - - Attributes - ----------- - name: :class:`str` - The channel name. - guild: :class:`Guild` - The guild the channel belongs to. - id: :class:`int` - The channel ID. - nsfw: :class:`bool` - If the channel is marked as "not safe for work" or "age restricted". - - .. versionadded:: 2.0 - topic: Optional[:class:`str`] - The channel's topic. ``None`` if it isn't set. - category_id: Optional[:class:`int`] - The category channel ID this channel belongs to, if applicable. - position: :class:`int` - The position in the channel list. This is a number that starts at 0. e.g. the - top channel is position 0. - bitrate: :class:`int` - The channel's preferred audio bitrate in bits per second. - user_limit: :class:`int` - The channel's limit for number of members that can be in a stage channel. - rtc_region: Optional[:class:`str`] - The region for the stage channel's voice communication. - A value of ``None`` indicates automatic voice region detection. - video_quality_mode: :class:`VideoQualityMode` - The camera video quality for the stage channel's participants. - - .. versionadded:: 2.0 - last_message_id: Optional[:class:`int`] - The last message ID of the message sent to this channel. It may - *not* point to an existing or valid message. - - .. versionadded:: 2.2 - slowmode_delay: :class:`int` - The number of seconds a member must wait between sending messages - in this channel. A value of ``0`` denotes that it is disabled. - Bots and users with :attr:`~Permissions.manage_channels` or - :attr:`~Permissions.manage_messages` bypass slowmode. - - .. versionadded:: 2.2 - """ - - __slots__ = ('topic',) - - def __repr__(self) -> str: - attrs = [ - ('id', self.id), - ('name', self.name), - ('topic', self.topic), - ('rtc_region', self.rtc_region), - ('position', self.position), - ('bitrate', self.bitrate), - ('video_quality_mode', self.video_quality_mode), - ('user_limit', self.user_limit), - ('category_id', self.category_id), - ] - joined = ' '.join('%s=%r' % t for t in attrs) - return f'<{self.__class__.__name__} {joined}>' - - def _update(self, guild: Guild, data: StageChannelPayload) -> None: - super()._update(guild, data) - self.topic: Optional[str] = data.get('topic') - - @property - def _scheduled_event_entity_type(self) -> Optional[EntityType]: - return EntityType.stage_instance - - @property - def requesting_to_speak(self) -> List[Member]: - """List[:class:`Member`]: A list of members who are requesting to speak in the stage channel.""" - return [member for member in self.members if member.voice and member.voice.requested_to_speak_at is not None] - - @property - def speakers(self) -> List[Member]: - """List[:class:`Member`]: A list of members who have been permitted to speak in the stage channel. - - .. versionadded:: 2.0 - """ - return [ - member - for member in self.members - if member.voice and not member.voice.suppress and member.voice.requested_to_speak_at is None - ] - - @property - def listeners(self) -> List[Member]: - """List[:class:`Member`]: A list of members who are listening in the stage channel. - - .. versionadded:: 2.0 - """ - return [member for member in self.members if member.voice and member.voice.suppress] - - @property - def moderators(self) -> List[Member]: - """List[:class:`Member`]: A list of members who are moderating the stage channel. - - .. versionadded:: 2.0 - """ - required_permissions = Permissions.stage_moderator() - return [member for member in self.members if self.permissions_for(member) >= required_permissions] - - @property - def type(self) -> Literal[ChannelType.stage_voice]: - """:class:`ChannelType`: The channel's Discord type.""" - return ChannelType.stage_voice - - @utils.copy_doc(discord.abc.GuildChannel.clone) - async def clone(self, *, name: Optional[str] = None, reason: Optional[str] = None) -> StageChannel: - return await self._clone_impl({}, name=name, reason=reason) - - @property - def instance(self) -> Optional[StageInstance]: - """Optional[:class:`StageInstance`]: The running stage instance of the stage channel. - - .. versionadded:: 2.0 - """ - return utils.get(self.guild.stage_instances, channel_id=self.id) - - async def create_instance( - self, - *, - topic: str, - privacy_level: PrivacyLevel = MISSING, - send_start_notification: bool = False, - reason: Optional[str] = None, - ) -> StageInstance: - """|coro| - - Create a stage instance. - - You must have :attr:`~Permissions.manage_channels` to do this. - - .. versionadded:: 2.0 - - Parameters - ----------- - topic: :class:`str` - The stage instance's topic. - privacy_level: :class:`PrivacyLevel` - The stage instance's privacy level. Defaults to :attr:`PrivacyLevel.guild_only`. - send_start_notification: :class:`bool` - Whether to send a start notification. This sends a push notification to @everyone if ``True``. Defaults to ``False``. - You must have :attr:`~Permissions.mention_everyone` to do this. - - .. versionadded:: 2.3 - reason: :class:`str` - The reason the stage instance was created. Shows up on the audit log. - - Raises - ------ - TypeError - If the ``privacy_level`` parameter is not the proper type. - Forbidden - You do not have permissions to create a stage instance. - HTTPException - Creating a stage instance failed. - - Returns - -------- - :class:`StageInstance` - The newly created stage instance. - """ - - payload: Dict[str, Any] = {'channel_id': self.id, 'topic': topic} - - if privacy_level is not MISSING: - if not isinstance(privacy_level, PrivacyLevel): - raise TypeError('privacy_level field must be of type PrivacyLevel') - - payload['privacy_level'] = privacy_level.value - - payload['send_start_notification'] = send_start_notification - - data = await self._state.http.create_stage_instance(**payload, reason=reason) - return StageInstance(guild=self.guild, state=self._state, data=data) - - async def fetch_instance(self) -> StageInstance: - """|coro| - - Gets the running :class:`StageInstance`. - - .. versionadded:: 2.0 - - Raises - ------- - NotFound - The stage instance or channel could not be found. - HTTPException - Getting the stage instance failed. - - Returns - -------- - :class:`StageInstance` - The stage instance. - """ - data = await self._state.http.get_stage_instance(self.id) - return StageInstance(guild=self.guild, state=self._state, data=data) - - @overload - async def edit(self) -> None: - ... - - @overload - async def edit(self, *, position: int, reason: Optional[str] = ...) -> None: - ... - - @overload - async def edit( - self, - *, - name: str = ..., - nsfw: bool = ..., - user_limit: int = ..., - position: int = ..., - sync_permissions: int = ..., - category: Optional[CategoryChannel] = ..., - overwrites: Mapping[OverwriteKeyT, PermissionOverwrite] = ..., - rtc_region: Optional[str] = ..., - video_quality_mode: VideoQualityMode = ..., - slowmode_delay: int = ..., - reason: Optional[str] = ..., - ) -> StageChannel: - ... - - async def edit(self, *, reason: Optional[str] = None, **options: Any) -> Optional[StageChannel]: - """|coro| - - Edits the channel. - - You must have :attr:`~Permissions.manage_channels` to do this. - - .. versionchanged:: 2.0 - The ``topic`` parameter must now be set via :attr:`create_instance`. - - .. versionchanged:: 2.0 - Edits are no longer in-place, the newly edited channel is returned instead. - - .. versionchanged:: 2.0 - The ``region`` parameter now accepts :class:`str` instead of an enum. - - .. versionchanged:: 2.0 - This function will now raise :exc:`TypeError` instead of - ``InvalidArgument``. - - Parameters - ---------- - name: :class:`str` - The new channel's name. - position: :class:`int` - The new channel's position. - nsfw: :class:`bool` - To mark the channel as NSFW or not. - user_limit: :class:`int` - The new channel's user limit. - sync_permissions: :class:`bool` - Whether to sync permissions with the channel's new or pre-existing - category. Defaults to ``False``. - category: Optional[:class:`CategoryChannel`] - The new category for this channel. Can be ``None`` to remove the - category. - slowmode_delay: :class:`int` - Specifies the slowmode rate limit for user in this channel, in seconds. - A value of ``0`` disables slowmode. The maximum value possible is ``21600``. - reason: Optional[:class:`str`] - The reason for editing this channel. Shows up on the audit log. - overwrites: :class:`Mapping` - A :class:`Mapping` of target (either a role or a member) to - :class:`PermissionOverwrite` to apply to the channel. - rtc_region: Optional[:class:`str`] - The new region for the stage channel's voice communication. - A value of ``None`` indicates automatic voice region detection. - video_quality_mode: :class:`VideoQualityMode` - The camera video quality for the stage channel's participants. - - .. versionadded:: 2.0 - - Raises - ------ - ValueError - If the permission overwrite information is not in proper form. - Forbidden - You do not have permissions to edit the channel. - HTTPException - Editing the channel failed. - - Returns - -------- - Optional[:class:`.StageChannel`] - The newly edited stage channel. If the edit was only positional - then ``None`` is returned instead. - """ - - payload = await self._edit(options, reason=reason) - if payload is not None: - # the payload will always be the proper channel payload - return self.__class__(state=self._state, guild=self.guild, data=payload) # type: ignore - - -class CategoryChannel(discord.abc.GuildChannel, Hashable): - """Represents a Discord channel category. - - These are useful to group channels to logical compartments. - - .. container:: operations - - .. describe:: x == y - - Checks if two channels are equal. - - .. describe:: x != y - - Checks if two channels are not equal. - - .. describe:: hash(x) - - Returns the category's hash. - - .. describe:: str(x) - - Returns the category's name. - - Attributes - ----------- - name: :class:`str` - The category name. - guild: :class:`Guild` - The guild the category belongs to. - id: :class:`int` - The category channel ID. - position: :class:`int` - The position in the category list. This is a number that starts at 0. e.g. the - top category is position 0. - nsfw: :class:`bool` - If the channel is marked as "not safe for work". - - .. note:: - - To check if the channel or the guild of that channel are marked as NSFW, consider :meth:`is_nsfw` instead. - """ - - __slots__ = ('name', 'id', 'guild', 'nsfw', '_state', 'position', '_overwrites', 'category_id') - - def __init__(self, *, state: ConnectionState, guild: Guild, data: CategoryChannelPayload): - self._state: ConnectionState = state - self.id: int = int(data['id']) - self._update(guild, data) - - def __repr__(self) -> str: - return f'' - - def _update(self, guild: Guild, data: CategoryChannelPayload) -> None: - self.guild: Guild = guild - self.name: str = data['name'] - self.category_id: Optional[int] = utils._get_as_snowflake(data, 'parent_id') - self.nsfw: bool = data.get('nsfw', False) - self.position: int = data['position'] - self._fill_overwrites(data) - - @property - def _sorting_bucket(self) -> int: - return ChannelType.category.value - - @property - def _scheduled_event_entity_type(self) -> Optional[EntityType]: - return None - - @property - def type(self) -> Literal[ChannelType.category]: - """:class:`ChannelType`: The channel's Discord type.""" - return ChannelType.category - - def is_nsfw(self) -> bool: - """:class:`bool`: Checks if the category is NSFW.""" - return self.nsfw - - @utils.copy_doc(discord.abc.GuildChannel.clone) - async def clone(self, *, name: Optional[str] = None, reason: Optional[str] = None) -> CategoryChannel: - return await self._clone_impl({'nsfw': self.nsfw}, name=name, reason=reason) - - @overload - async def edit(self) -> None: - ... - - @overload - async def edit(self, *, position: int, reason: Optional[str] = ...) -> None: - ... - - @overload - async def edit( - self, - *, - name: str = ..., - position: int = ..., - nsfw: bool = ..., - overwrites: Mapping[OverwriteKeyT, PermissionOverwrite] = ..., - reason: Optional[str] = ..., - ) -> CategoryChannel: - ... - - async def edit(self, *, reason: Optional[str] = None, **options: Any) -> Optional[CategoryChannel]: - """|coro| - - Edits the channel. - - You must have :attr:`~Permissions.manage_channels` to do this. - - .. versionchanged:: 1.3 - The ``overwrites`` keyword-only parameter was added. - - .. versionchanged:: 2.0 - Edits are no longer in-place, the newly edited channel is returned instead. - - .. versionchanged:: 2.0 - This function will now raise :exc:`TypeError` or - :exc:`ValueError` instead of ``InvalidArgument``. - - Parameters - ---------- - name: :class:`str` - The new category's name. - position: :class:`int` - The new category's position. - nsfw: :class:`bool` - To mark the category as NSFW or not. - reason: Optional[:class:`str`] - The reason for editing this category. Shows up on the audit log. - overwrites: :class:`Mapping` - A :class:`Mapping` of target (either a role or a member) to - :class:`PermissionOverwrite` to apply to the channel. - - Raises - ------ - ValueError - If position is less than 0 or greater than the number of categories. - TypeError - The overwrite information is not in proper form. - Forbidden - You do not have permissions to edit the category. - HTTPException - Editing the category failed. - - Returns - -------- - Optional[:class:`.CategoryChannel`] - The newly edited category channel. If the edit was only positional - then ``None`` is returned instead. - """ - - payload = await self._edit(options, reason=reason) - if payload is not None: - # the payload will always be the proper channel payload - return self.__class__(state=self._state, guild=self.guild, data=payload) # type: ignore - - @utils.copy_doc(discord.abc.GuildChannel.move) - async def move(self, **kwargs: Any) -> None: - kwargs.pop('category', None) - await super().move(**kwargs) - - @property - def channels(self) -> List[GuildChannelType]: - """List[:class:`abc.GuildChannel`]: Returns the channels that are under this category. - - These are sorted by the official Discord UI, which places voice channels below the text channels. - """ - - def comparator(channel): - return (not isinstance(channel, TextChannel), channel.position) - - ret = [c for c in self.guild.channels if c.category_id == self.id] - ret.sort(key=comparator) - return ret - - @property - def text_channels(self) -> List[TextChannel]: - """List[:class:`TextChannel`]: Returns the text channels that are under this category.""" - ret = [c for c in self.guild.channels if c.category_id == self.id and isinstance(c, TextChannel)] - ret.sort(key=lambda c: (c.position, c.id)) - return ret - - @property - def voice_channels(self) -> List[VoiceChannel]: - """List[:class:`VoiceChannel`]: Returns the voice channels that are under this category.""" - ret = [c for c in self.guild.channels if c.category_id == self.id and isinstance(c, VoiceChannel)] - ret.sort(key=lambda c: (c.position, c.id)) - return ret - - @property - def stage_channels(self) -> List[StageChannel]: - """List[:class:`StageChannel`]: Returns the stage channels that are under this category. - - .. versionadded:: 1.7 - """ - ret = [c for c in self.guild.channels if c.category_id == self.id and isinstance(c, StageChannel)] - ret.sort(key=lambda c: (c.position, c.id)) - return ret - - async def create_text_channel(self, name: str, **options: Any) -> TextChannel: - """|coro| - - A shortcut method to :meth:`Guild.create_text_channel` to create a :class:`TextChannel` in the category. - - Returns - ------- - :class:`TextChannel` - The channel that was just created. - """ - return await self.guild.create_text_channel(name, category=self, **options) - - async def create_voice_channel(self, name: str, **options: Any) -> VoiceChannel: - """|coro| - - A shortcut method to :meth:`Guild.create_voice_channel` to create a :class:`VoiceChannel` in the category. - - Returns - ------- - :class:`VoiceChannel` - The channel that was just created. - """ - return await self.guild.create_voice_channel(name, category=self, **options) - - async def create_stage_channel(self, name: str, **options: Any) -> StageChannel: - """|coro| - - A shortcut method to :meth:`Guild.create_stage_channel` to create a :class:`StageChannel` in the category. - - .. versionadded:: 1.7 - - Returns - ------- - :class:`StageChannel` - The channel that was just created. - """ - return await self.guild.create_stage_channel(name, category=self, **options) - - async def create_forum(self, name: str, **options: Any) -> ForumChannel: - """|coro| - - A shortcut method to :meth:`Guild.create_forum` to create a :class:`ForumChannel` in the category. - - .. versionadded:: 2.0 - - Returns - -------- - :class:`ForumChannel` - The channel that was just created. - """ - return await self.guild.create_forum(name, category=self, **options) - - -class ForumTag(Hashable): - """Represents a forum tag that can be applied to a thread within a :class:`ForumChannel`. - - .. versionadded:: 2.1 - - .. container:: operations - - .. describe:: x == y - - Checks if two forum tags are equal. - - .. describe:: x != y - - Checks if two forum tags are not equal. - - .. describe:: hash(x) - - Returns the forum tag's hash. - - .. describe:: str(x) - - Returns the forum tag's name. - - - Attributes - ----------- - id: :class:`int` - The ID of the tag. If this was manually created then the ID will be ``0``. - name: :class:`str` - The name of the tag. Can only be up to 20 characters. - moderated: :class:`bool` - Whether this tag can only be added or removed by a moderator with - the :attr:`~Permissions.manage_threads` permission. - emoji: Optional[:class:`PartialEmoji`] - The emoji that is used to represent this tag. - Note that if the emoji is a custom emoji, it will *not* have name information. - """ - - __slots__ = ('name', 'id', 'moderated', 'emoji') - - def __init__(self, *, name: str, emoji: Optional[EmojiInputType] = None, moderated: bool = False) -> None: - self.name: str = name - self.id: int = 0 - self.moderated: bool = moderated - self.emoji: Optional[PartialEmoji] = None - if isinstance(emoji, _EmojiTag): - self.emoji = emoji._to_partial() - elif isinstance(emoji, str): - self.emoji = PartialEmoji.from_str(emoji) - elif emoji is not None: - raise TypeError(f'emoji must be a Emoji, PartialEmoji, str or None not {emoji.__class__.__name__}') - - @classmethod - def from_data(cls, *, state: ConnectionState, data: ForumTagPayload) -> Self: - self = cls.__new__(cls) - self.name = data['name'] - self.id = int(data['id']) - self.moderated = data.get('moderated', False) - - emoji_name = data['emoji_name'] or '' - emoji_id = utils._get_as_snowflake(data, 'emoji_id') or None # Coerce 0 -> None - if not emoji_name and not emoji_id: - self.emoji = None - else: - self.emoji = PartialEmoji.with_state(state=state, name=emoji_name, id=emoji_id) - return self - - def to_dict(self) -> Dict[str, Any]: - payload: Dict[str, Any] = { - 'name': self.name, - 'moderated': self.moderated, - } - if self.emoji is not None: - payload.update(self.emoji._to_forum_tag_payload()) - else: - payload.update(emoji_id=None, emoji_name=None) - - if self.id: - payload['id'] = self.id - - return payload - - def __repr__(self) -> str: - return f'' - - def __str__(self) -> str: - return self.name - - -class ForumChannel(discord.abc.GuildChannel, Hashable): - """Represents a Discord guild forum channel. - - .. versionadded:: 2.0 - - .. container:: operations - - .. describe:: x == y - - Checks if two forums are equal. - - .. describe:: x != y - - Checks if two forums are not equal. - - .. describe:: hash(x) - - Returns the forum's hash. - - .. describe:: str(x) - - Returns the forum's name. - - Attributes - ----------- - name: :class:`str` - The forum name. - guild: :class:`Guild` - The guild the forum belongs to. - id: :class:`int` - The forum ID. - category_id: Optional[:class:`int`] - The category channel ID this forum belongs to, if applicable. - topic: Optional[:class:`str`] - The forum's topic. ``None`` if it doesn't exist. Called "Guidelines" in the UI. - Can be up to 4096 characters long. - position: :class:`int` - The position in the channel list. This is a number that starts at 0. e.g. the - top channel is position 0. - last_message_id: Optional[:class:`int`] - The last thread ID that was created on this forum. This technically also - coincides with the message ID that started the thread that was created. - It may *not* point to an existing or valid thread or message. - slowmode_delay: :class:`int` - The number of seconds a member must wait between creating threads - in this forum. A value of ``0`` denotes that it is disabled. - Bots and users with :attr:`~Permissions.manage_channels` or - :attr:`~Permissions.manage_messages` bypass slowmode. - nsfw: :class:`bool` - If the forum is marked as "not safe for work" or "age restricted". - default_auto_archive_duration: :class:`int` - The default auto archive duration in minutes for threads created in this forum. - default_thread_slowmode_delay: :class:`int` - The default slowmode delay in seconds for threads created in this forum. - - .. versionadded:: 2.1 - default_reaction_emoji: Optional[:class:`PartialEmoji`] - The default reaction emoji for threads created in this forum to show in the - add reaction button. - - .. versionadded:: 2.1 - default_layout: :class:`ForumLayoutType` - The default layout for posts in this forum channel. - Defaults to :attr:`ForumLayoutType.not_set`. - - .. versionadded:: 2.2 - default_sort_order: Optional[:class:`ForumOrderType`] - The default sort order for posts in this forum channel. - - .. versionadded:: 2.3 - """ - - __slots__ = ( - 'name', - 'id', - 'guild', - 'topic', - '_state', - '_flags', - 'nsfw', - 'category_id', - 'position', - 'slowmode_delay', - '_overwrites', - 'last_message_id', - 'default_auto_archive_duration', - 'default_thread_slowmode_delay', - 'default_reaction_emoji', - 'default_layout', - 'default_sort_order', - '_available_tags', - '_flags', - ) - - def __init__(self, *, state: ConnectionState, guild: Guild, data: ForumChannelPayload): - self._state: ConnectionState = state - self.id: int = int(data['id']) - self._update(guild, data) - - def __repr__(self) -> str: - attrs = [ - ('id', self.id), - ('name', self.name), - ('position', self.position), - ('nsfw', self.nsfw), - ('category_id', self.category_id), - ] - joined = ' '.join('%s=%r' % t for t in attrs) - return f'<{self.__class__.__name__} {joined}>' - - def _update(self, guild: Guild, data: ForumChannelPayload) -> None: - self.guild: Guild = guild - self.name: str = data['name'] - self.category_id: Optional[int] = utils._get_as_snowflake(data, 'parent_id') - self.topic: Optional[str] = data.get('topic') - self.position: int = data['position'] - self.nsfw: bool = data.get('nsfw', False) - self.slowmode_delay: int = data.get('rate_limit_per_user', 0) - self.default_auto_archive_duration: ThreadArchiveDuration = data.get('default_auto_archive_duration', 1440) - self.last_message_id: Optional[int] = utils._get_as_snowflake(data, 'last_message_id') - # This takes advantage of the fact that dicts are ordered since Python 3.7 - tags = [ForumTag.from_data(state=self._state, data=tag) for tag in data.get('available_tags', [])] - self.default_thread_slowmode_delay: int = data.get('default_thread_rate_limit_per_user', 0) - self.default_layout: ForumLayoutType = try_enum(ForumLayoutType, data.get('default_forum_layout', 0)) - self._available_tags: Dict[int, ForumTag] = {tag.id: tag for tag in tags} - - self.default_reaction_emoji: Optional[PartialEmoji] = None - default_reaction_emoji = data.get('default_reaction_emoji') - if default_reaction_emoji: - self.default_reaction_emoji = PartialEmoji.with_state( - state=self._state, - id=utils._get_as_snowflake(default_reaction_emoji, 'emoji_id') or None, # Coerce 0 -> None - name=default_reaction_emoji.get('emoji_name') or '', - ) - - self.default_sort_order: Optional[ForumOrderType] = None - default_sort_order = data.get('default_sort_order') - if default_sort_order is not None: - self.default_sort_order = try_enum(ForumOrderType, default_sort_order) - - self._flags: int = data.get('flags', 0) - self._fill_overwrites(data) - - @property - def type(self) -> Literal[ChannelType.forum]: - """:class:`ChannelType`: The channel's Discord type.""" - return ChannelType.forum - - @property - def _sorting_bucket(self) -> int: - return ChannelType.text.value - - @property - def _scheduled_event_entity_type(self) -> Optional[EntityType]: - return None - - @utils.copy_doc(discord.abc.GuildChannel.permissions_for) - def permissions_for(self, obj: Union[Member, Role], /) -> Permissions: - base = super().permissions_for(obj) - self._apply_implicit_permissions(base) - - # text channels do not have voice related permissions - denied = Permissions.voice() - base.value &= ~denied.value - return base - - def get_thread(self, thread_id: int, /) -> Optional[Thread]: - """Returns a thread with the given ID. - - .. note:: - - This does not always retrieve archived threads, as they are not retained in the internal - cache. Use :func:`Guild.fetch_channel` instead. - - .. versionadded:: 2.2 - - Parameters - ----------- - thread_id: :class:`int` - The ID to search for. - - Returns - -------- - Optional[:class:`Thread`] - The returned thread or ``None`` if not found. - """ - thread = self.guild.get_thread(thread_id) - if thread is not None and thread.parent_id == self.id: - return thread - return None - - @property - def threads(self) -> List[Thread]: - """List[:class:`Thread`]: Returns all the threads that you can see.""" - return [thread for thread in self.guild._threads.values() if thread.parent_id == self.id] - - @property - def flags(self) -> ChannelFlags: - """:class:`ChannelFlags`: The flags associated with this thread. - - .. versionadded:: 2.1 - """ - return ChannelFlags._from_value(self._flags) - - @property - def available_tags(self) -> Sequence[ForumTag]: - """Sequence[:class:`ForumTag`]: Returns all the available tags for this forum. - - .. versionadded:: 2.1 - """ - return utils.SequenceProxy(self._available_tags.values()) - - def get_tag(self, tag_id: int, /) -> Optional[ForumTag]: - """Returns the tag with the given ID. - - .. versionadded:: 2.1 - - Parameters - ---------- - tag_id: :class:`int` - The ID to search for. - - Returns - ------- - Optional[:class:`ForumTag`] - The tag with the given ID, or ``None`` if not found. - """ - return self._available_tags.get(tag_id) - - def is_nsfw(self) -> bool: - """:class:`bool`: Checks if the forum is NSFW.""" - return self.nsfw - - @utils.copy_doc(discord.abc.GuildChannel.clone) - async def clone(self, *, name: Optional[str] = None, reason: Optional[str] = None) -> ForumChannel: - return await self._clone_impl( - {'topic': self.topic, 'nsfw': self.nsfw, 'rate_limit_per_user': self.slowmode_delay}, name=name, reason=reason - ) - - @overload - async def edit(self) -> None: - ... - - @overload - async def edit(self, *, position: int, reason: Optional[str] = ...) -> None: - ... - - @overload - async def edit( - self, - *, - reason: Optional[str] = ..., - name: str = ..., - topic: str = ..., - position: int = ..., - nsfw: bool = ..., - sync_permissions: bool = ..., - category: Optional[CategoryChannel] = ..., - slowmode_delay: int = ..., - default_auto_archive_duration: ThreadArchiveDuration = ..., - type: ChannelType = ..., - overwrites: Mapping[OverwriteKeyT, PermissionOverwrite] = ..., - available_tags: Sequence[ForumTag] = ..., - default_thread_slowmode_delay: int = ..., - default_reaction_emoji: Optional[EmojiInputType] = ..., - default_layout: ForumLayoutType = ..., - default_sort_order: ForumOrderType = ..., - require_tag: bool = ..., - ) -> ForumChannel: - ... - - async def edit(self, *, reason: Optional[str] = None, **options: Any) -> Optional[ForumChannel]: - """|coro| - - Edits the forum. - - You must have :attr:`~Permissions.manage_channels` to do this. - - Parameters - ---------- - name: :class:`str` - The new forum name. - topic: :class:`str` - The new forum's topic. - position: :class:`int` - The new forum's position. - nsfw: :class:`bool` - To mark the forum as NSFW or not. - sync_permissions: :class:`bool` - Whether to sync permissions with the forum's new or pre-existing - category. Defaults to ``False``. - category: Optional[:class:`CategoryChannel`] - The new category for this forum. Can be ``None`` to remove the - category. - slowmode_delay: :class:`int` - Specifies the slowmode rate limit for user in this forum, in seconds. - A value of ``0`` disables slowmode. The maximum value possible is ``21600``. - type: :class:`ChannelType` - Change the type of this text forum. Currently, only conversion between - :attr:`ChannelType.text` and :attr:`ChannelType.news` is supported. This - is only available to guilds that contain ``NEWS`` in :attr:`Guild.features`. - reason: Optional[:class:`str`] - The reason for editing this forum. Shows up on the audit log. - overwrites: :class:`Mapping` - A :class:`Mapping` of target (either a role or a member) to - :class:`PermissionOverwrite` to apply to the forum. - default_auto_archive_duration: :class:`int` - The new default auto archive duration in minutes for threads created in this channel. - Must be one of ``60``, ``1440``, ``4320``, or ``10080``. - available_tags: Sequence[:class:`ForumTag`] - The new available tags for this forum. - - .. versionadded:: 2.1 - default_thread_slowmode_delay: :class:`int` - The new default slowmode delay for threads in this channel. - - .. versionadded:: 2.1 - default_reaction_emoji: Optional[Union[:class:`Emoji`, :class:`PartialEmoji`, :class:`str`]] - The new default reaction emoji for threads in this channel. - - .. versionadded:: 2.1 - default_layout: :class:`ForumLayoutType` - The new default layout for posts in this forum. - - .. versionadded:: 2.2 - default_sort_order: Optional[:class:`ForumOrderType`] - The new default sort order for posts in this forum. - - .. versionadded:: 2.3 - require_tag: :class:`bool` - Whether to require a tag for threads in this channel or not. - - .. versionadded:: 2.1 - - Raises - ------ - ValueError - The new ``position`` is less than 0 or greater than the number of channels. - TypeError - The permission overwrite information is not in proper form or a type - is not the expected type. - Forbidden - You do not have permissions to edit the forum. - HTTPException - Editing the forum failed. - - Returns - -------- - Optional[:class:`.ForumChannel`] - The newly edited forum channel. If the edit was only positional - then ``None`` is returned instead. - """ - - try: - tags: Sequence[ForumTag] = options.pop('available_tags') - except KeyError: - pass - else: - options['available_tags'] = [tag.to_dict() for tag in tags] - - try: - default_reaction_emoji: Optional[EmojiInputType] = options.pop('default_reaction_emoji') - except KeyError: - pass - else: - if default_reaction_emoji is None: - options['default_reaction_emoji'] = None - elif isinstance(default_reaction_emoji, _EmojiTag): - options['default_reaction_emoji'] = default_reaction_emoji._to_partial()._to_forum_tag_payload() - elif isinstance(default_reaction_emoji, str): - options['default_reaction_emoji'] = PartialEmoji.from_str(default_reaction_emoji)._to_forum_tag_payload() - - try: - require_tag = options.pop('require_tag') - except KeyError: - pass - else: - flags = self.flags - flags.require_tag = require_tag - options['flags'] = flags.value - - try: - layout = options.pop('default_layout') - except KeyError: - pass - else: - if not isinstance(layout, ForumLayoutType): - raise TypeError(f'default_layout parameter must be a ForumLayoutType not {layout.__class__.__name__}') - - options['default_forum_layout'] = layout.value - - try: - sort_order = options.pop('default_sort_order') - except KeyError: - pass - else: - if sort_order is None: - options['default_sort_order'] = None - else: - if not isinstance(sort_order, ForumOrderType): - raise TypeError( - f'default_sort_order parameter must be a ForumOrderType not {sort_order.__class__.__name__}' - ) - - options['default_sort_order'] = sort_order.value - - payload = await self._edit(options, reason=reason) - if payload is not None: - # the payload will always be the proper channel payload - return self.__class__(state=self._state, guild=self.guild, data=payload) # type: ignore - - async def create_tag( - self, - *, - name: str, - emoji: Optional[PartialEmoji] = None, - moderated: bool = False, - reason: Optional[str] = None, - ) -> ForumTag: - """|coro| - - Creates a new tag in this forum. - - You must have :attr:`~Permissions.manage_channels` to do this. - - Parameters - ---------- - name: :class:`str` - The name of the tag. Can only be up to 20 characters. - emoji: Optional[Union[:class:`str`, :class:`PartialEmoji`]] - The emoji to use for the tag. - moderated: :class:`bool` - Whether the tag can only be applied by moderators. - reason: Optional[:class:`str`] - The reason for creating this tag. Shows up on the audit log. - - Raises - ------ - Forbidden - You do not have permissions to create a tag in this forum. - HTTPException - Creating the tag failed. - - Returns - ------- - :class:`ForumTag` - The newly created tag. - """ - - prior = list(self._available_tags.values()) - result = ForumTag(name=name, emoji=emoji, moderated=moderated) - prior.append(result) - payload = await self._state.http.edit_channel( - self.id, reason=reason, available_tags=[tag.to_dict() for tag in prior] - ) - try: - result.id = int(payload['available_tags'][-1]['id']) # type: ignore - except (KeyError, IndexError, ValueError): - pass - - return result - - async def create_thread( - self, - *, - name: str, - auto_archive_duration: ThreadArchiveDuration = MISSING, - slowmode_delay: Optional[int] = None, - content: Optional[str] = None, - tts: bool = False, - embed: Embed = MISSING, - embeds: Sequence[Embed] = MISSING, - file: File = MISSING, - files: Sequence[File] = MISSING, - stickers: Sequence[Union[GuildSticker, StickerItem]] = MISSING, - allowed_mentions: AllowedMentions = MISSING, - mention_author: bool = MISSING, - applied_tags: Sequence[ForumTag] = MISSING, - view: View = MISSING, - suppress_embeds: bool = False, - reason: Optional[str] = None, - ) -> ThreadWithMessage: - """|coro| - - Creates a thread in this forum. - - This thread is a public thread with the initial message given. Currently in order - to start a thread in this forum, the user needs :attr:`~discord.Permissions.send_messages`. - - You must send at least one of ``content``, ``embed``, ``embeds``, ``file``, ``files``, - or ``view`` to create a thread in a forum, since forum channels must have a starter message. - - Parameters - ----------- - name: :class:`str` - The name of the thread. - auto_archive_duration: :class:`int` - The duration in minutes before a thread is automatically hidden from the channel list. - If not provided, the channel's default auto archive duration is used. - - Must be one of ``60``, ``1440``, ``4320``, or ``10080``, if provided. - slowmode_delay: Optional[:class:`int`] - Specifies the slowmode rate limit for user in this channel, in seconds. - The maximum value possible is ``21600``. By default no slowmode rate limit - if this is ``None``. - content: Optional[:class:`str`] - The content of the message to send with the thread. - tts: :class:`bool` - Indicates if the message should be sent using text-to-speech. - embed: :class:`~discord.Embed` - The rich embed for the content. - embeds: List[:class:`~discord.Embed`] - A list of embeds to upload. Must be a maximum of 10. - file: :class:`~discord.File` - The file to upload. - files: List[:class:`~discord.File`] - A list of files to upload. Must be a maximum of 10. - allowed_mentions: :class:`~discord.AllowedMentions` - Controls the mentions being processed in this message. If this is - passed, then the object is merged with :attr:`~discord.Client.allowed_mentions`. - The merging behaviour only overrides attributes that have been explicitly passed - to the object, otherwise it uses the attributes set in :attr:`~discord.Client.allowed_mentions`. - If no object is passed at all then the defaults given by :attr:`~discord.Client.allowed_mentions` - are used instead. - mention_author: :class:`bool` - If set, overrides the :attr:`~discord.AllowedMentions.replied_user` attribute of ``allowed_mentions``. - applied_tags: List[:class:`discord.ForumTag`] - A list of tags to apply to the thread. - view: :class:`discord.ui.View` - A Discord UI View to add to the message. - stickers: Sequence[Union[:class:`~discord.GuildSticker`, :class:`~discord.StickerItem`]] - A list of stickers to upload. Must be a maximum of 3. - suppress_embeds: :class:`bool` - Whether to suppress embeds for the message. This sends the message without any embeds if set to ``True``. - reason: :class:`str` - The reason for creating a new thread. Shows up on the audit log. - - Raises - ------- - Forbidden - You do not have permissions to create a thread. - HTTPException - Starting the thread failed. - ValueError - The ``files`` or ``embeds`` list is not of the appropriate size. - TypeError - You specified both ``file`` and ``files``, - or you specified both ``embed`` and ``embeds``. - - Returns - -------- - Tuple[:class:`Thread`, :class:`Message`] - The created thread with the created message. - This is also accessible as a namedtuple with ``thread`` and ``message`` fields. - """ - - state = self._state - previous_allowed_mention = state.allowed_mentions - if stickers is MISSING: - sticker_ids = MISSING - else: - sticker_ids: SnowflakeList = [s.id for s in stickers] - - if view and not hasattr(view, '__discord_ui_view__'): - raise TypeError(f'view parameter must be View not {view.__class__.__name__}') - - if suppress_embeds: - from .message import MessageFlags # circular import - - flags = MessageFlags._from_value(4) - else: - flags = MISSING - - content = str(content) if content else MISSING - - channel_payload = { - 'name': name, - 'auto_archive_duration': auto_archive_duration or self.default_auto_archive_duration, - 'rate_limit_per_user': slowmode_delay, - 'type': 11, # Private threads don't seem to be allowed - } - - if applied_tags is not MISSING: - channel_payload['applied_tags'] = [str(tag.id) for tag in applied_tags] - - with handle_message_parameters( - content=content, - tts=tts, - file=file, - files=files, - embed=embed, - embeds=embeds, - allowed_mentions=allowed_mentions, - previous_allowed_mentions=previous_allowed_mention, - mention_author=None if mention_author is MISSING else mention_author, - stickers=sticker_ids, - view=view, - flags=flags, - channel_payload=channel_payload, - ) as params: - # Circular import - from .message import Message - - data = await state.http.start_thread_in_forum(self.id, params=params, reason=reason) - thread = Thread(guild=self.guild, state=self._state, data=data) - message = Message(state=self._state, channel=thread, data=data['message']) - if view and not view.is_finished(): - self._state.store_view(view, message.id) - - return ThreadWithMessage(thread=thread, message=message) - - async def webhooks(self) -> List[Webhook]: - """|coro| - - Gets the list of webhooks from this channel. - - You must have :attr:`~.Permissions.manage_webhooks` to do this. - - Raises - ------- - Forbidden - You don't have permissions to get the webhooks. - - Returns - -------- - List[:class:`Webhook`] - The webhooks for this channel. - """ - - from .webhook import Webhook - - data = await self._state.http.channel_webhooks(self.id) - return [Webhook.from_state(d, state=self._state) for d in data] - - async def create_webhook(self, *, name: str, avatar: Optional[bytes] = None, reason: Optional[str] = None) -> Webhook: - """|coro| - - Creates a webhook for this channel. - - You must have :attr:`~.Permissions.manage_webhooks` to do this. - - Parameters - ------------- - name: :class:`str` - The webhook's name. - avatar: Optional[:class:`bytes`] - A :term:`py:bytes-like object` representing the webhook's default avatar. - This operates similarly to :meth:`~ClientUser.edit`. - reason: Optional[:class:`str`] - The reason for creating this webhook. Shows up in the audit logs. - - Raises - ------- - HTTPException - Creating the webhook failed. - Forbidden - You do not have permissions to create a webhook. - - Returns - -------- - :class:`Webhook` - The created webhook. - """ - - from .webhook import Webhook - - if avatar is not None: - avatar = utils._bytes_to_base64_data(avatar) # type: ignore # Silence reassignment error - - data = await self._state.http.create_webhook(self.id, name=str(name), avatar=avatar, reason=reason) - return Webhook.from_state(data, state=self._state) - - async def archived_threads( - self, - *, - limit: Optional[int] = 100, - before: Optional[Union[Snowflake, datetime.datetime]] = None, - ) -> AsyncIterator[Thread]: - """Returns an :term:`asynchronous iterator` that iterates over all archived threads in this forum - in order of decreasing :attr:`Thread.archive_timestamp`. - - You must have :attr:`~Permissions.read_message_history` to do this. - - .. versionadded:: 2.0 - - Parameters - ----------- - limit: Optional[:class:`bool`] - The number of threads to retrieve. - If ``None``, retrieves every archived thread in the channel. Note, however, - that this would make it a slow operation. - before: Optional[Union[:class:`abc.Snowflake`, :class:`datetime.datetime`]] - Retrieve archived channels before the given date or ID. - - Raises - ------ - Forbidden - You do not have permissions to get archived threads. - HTTPException - The request to get the archived threads failed. - - Yields - ------- - :class:`Thread` - The archived threads. - """ - before_timestamp = None - - if isinstance(before, datetime.datetime): - before_timestamp = before.isoformat() - elif before is not None: - before_timestamp = utils.snowflake_time(before.id).isoformat() - - update_before = lambda data: data['thread_metadata']['archive_timestamp'] - - while True: - retrieve = 100 - if limit is not None: - if limit <= 0: - return - retrieve = max(2, min(retrieve, limit)) - - data = await self.guild._state.http.get_public_archived_threads(self.id, before=before_timestamp, limit=retrieve) - - threads = data.get('threads', []) - for raw_thread in threads: - yield Thread(guild=self.guild, state=self.guild._state, data=raw_thread) - # Currently the API doesn't let you request less than 2 threads. - # Bail out early if we had to retrieve more than what the limit was. - if limit is not None: - limit -= 1 - if limit <= 0: - return - - if not data.get('has_more', False): - return - - before_timestamp = update_before(threads[-1]) - - -class DMChannel(discord.abc.Messageable, discord.abc.PrivateChannel, Hashable): - """Represents a Discord direct message channel. - - .. container:: operations - - .. describe:: x == y - - Checks if two channels are equal. - - .. describe:: x != y - - Checks if two channels are not equal. - - .. describe:: hash(x) - - Returns the channel's hash. - - .. describe:: str(x) - - Returns a string representation of the channel - - Attributes - ---------- - recipient: Optional[:class:`User`] - The user you are participating with in the direct message channel. - If this channel is received through the gateway, the recipient information - may not be always available. - me: :class:`ClientUser` - The user presenting yourself. - id: :class:`int` - The direct message channel ID. - """ - - __slots__ = ('id', 'recipient', 'me', '_state') - - def __init__(self, *, me: ClientUser, state: ConnectionState, data: DMChannelPayload): - self._state: ConnectionState = state - self.recipient: Optional[User] = None - - recipients = data.get('recipients') - if recipients is not None: - self.recipient = state.store_user(recipients[0]) - - self.me: ClientUser = me - self.id: int = int(data['id']) - - async def _get_channel(self) -> Self: - return self - - def __str__(self) -> str: - if self.recipient: - return f'Direct Message with {self.recipient}' - return 'Direct Message with Unknown User' - - def __repr__(self) -> str: - return f'' - - @classmethod - def _from_message(cls, state: ConnectionState, channel_id: int) -> Self: - self = cls.__new__(cls) - self._state = state - self.id = channel_id - self.recipient = None - # state.user won't be None here - self.me = state.user # type: ignore - return self - - @property - def type(self) -> Literal[ChannelType.private]: - """:class:`ChannelType`: The channel's Discord type.""" - return ChannelType.private - - @property - def guild(self) -> Optional[Guild]: - """Optional[:class:`Guild`]: The guild this DM channel belongs to. Always ``None``. - - This is mainly provided for compatibility purposes in duck typing. - - .. versionadded:: 2.0 - """ - return None - - @property - def jump_url(self) -> str: - """:class:`str`: Returns a URL that allows the client to jump to the channel. - - .. versionadded:: 2.0 - """ - return f'https://discord.com/channels/@me/{self.id}' - - @property - def created_at(self) -> datetime.datetime: - """:class:`datetime.datetime`: Returns the direct message channel's creation time in UTC.""" - return utils.snowflake_time(self.id) - - def permissions_for(self, obj: Any = None, /) -> Permissions: - """Handles permission resolution for a :class:`User`. - - This function is there for compatibility with other channel types. - - Actual direct messages do not really have the concept of permissions. - - This returns all the Text related permissions set to ``True`` except: - - - :attr:`~Permissions.send_tts_messages`: You cannot send TTS messages in a DM. - - :attr:`~Permissions.manage_messages`: You cannot delete others messages in a DM. - - :attr:`~Permissions.create_private_threads`: There are no threads in a DM. - - :attr:`~Permissions.create_public_threads`: There are no threads in a DM. - - :attr:`~Permissions.manage_threads`: There are no threads in a DM. - - :attr:`~Permissions.send_messages_in_threads`: There are no threads in a DM. - - .. versionchanged:: 2.0 - - ``obj`` parameter is now positional-only. - - .. versionchanged:: 2.1 - - Thread related permissions are now set to ``False``. - - Parameters - ----------- - obj: :class:`User` - The user to check permissions for. This parameter is ignored - but kept for compatibility with other ``permissions_for`` methods. - - Returns - -------- - :class:`Permissions` - The resolved permissions. - """ - return Permissions._dm_permissions() - - def get_partial_message(self, message_id: int, /) -> PartialMessage: - """Creates a :class:`PartialMessage` from the message ID. - - This is useful if you want to work with a message and only have its ID without - doing an unnecessary API call. - - .. versionadded:: 1.6 - - .. versionchanged:: 2.0 - - ``message_id`` parameter is now positional-only. - - Parameters - ------------ - message_id: :class:`int` - The message ID to create a partial message for. - - Returns - --------- - :class:`PartialMessage` - The partial message. - """ - - from .message import PartialMessage - - return PartialMessage(channel=self, id=message_id) - - -class GroupChannel(discord.abc.Messageable, discord.abc.PrivateChannel, Hashable): - """Represents a Discord group channel. - - .. container:: operations - - .. describe:: x == y - - Checks if two channels are equal. - - .. describe:: x != y - - Checks if two channels are not equal. - - .. describe:: hash(x) - - Returns the channel's hash. - - .. describe:: str(x) - - Returns a string representation of the channel - - Attributes - ---------- - recipients: List[:class:`User`] - The users you are participating with in the group channel. - me: :class:`ClientUser` - The user presenting yourself. - id: :class:`int` - The group channel ID. - owner: Optional[:class:`User`] - The user that owns the group channel. - owner_id: :class:`int` - The owner ID that owns the group channel. - - .. versionadded:: 2.0 - name: Optional[:class:`str`] - The group channel's name if provided. - """ - - __slots__ = ('id', 'recipients', 'owner_id', 'owner', '_icon', 'name', 'me', '_state') - - def __init__(self, *, me: ClientUser, state: ConnectionState, data: GroupChannelPayload): - self._state: ConnectionState = state - self.id: int = int(data['id']) - self.me: ClientUser = me - self._update_group(data) - - def _update_group(self, data: GroupChannelPayload) -> None: - self.owner_id: Optional[int] = utils._get_as_snowflake(data, 'owner_id') - self._icon: Optional[str] = data.get('icon') - self.name: Optional[str] = data.get('name') - self.recipients: List[User] = [self._state.store_user(u) for u in data.get('recipients', [])] - - self.owner: Optional[BaseUser] - if self.owner_id == self.me.id: - self.owner = self.me - else: - self.owner = utils.find(lambda u: u.id == self.owner_id, self.recipients) - - async def _get_channel(self) -> Self: - return self - - def __str__(self) -> str: - if self.name: - return self.name - - if len(self.recipients) == 0: - return 'Unnamed' - - return ', '.join(map(lambda x: x.name, self.recipients)) - - def __repr__(self) -> str: - return f'' - - @property - def type(self) -> Literal[ChannelType.group]: - """:class:`ChannelType`: The channel's Discord type.""" - return ChannelType.group - - @property - def guild(self) -> Optional[Guild]: - """Optional[:class:`Guild`]: The guild this group channel belongs to. Always ``None``. - - This is mainly provided for compatibility purposes in duck typing. - - .. versionadded:: 2.0 - """ - return None - - @property - def icon(self) -> Optional[Asset]: - """Optional[:class:`Asset`]: Returns the channel's icon asset if available.""" - if self._icon is None: - return None - return Asset._from_icon(self._state, self.id, self._icon, path='channel') - - @property - def created_at(self) -> datetime.datetime: - """:class:`datetime.datetime`: Returns the channel's creation time in UTC.""" - return utils.snowflake_time(self.id) - - @property - def jump_url(self) -> str: - """:class:`str`: Returns a URL that allows the client to jump to the channel. - - .. versionadded:: 2.0 - """ - return f'https://discord.com/channels/@me/{self.id}' - - def permissions_for(self, obj: Snowflake, /) -> Permissions: - """Handles permission resolution for a :class:`User`. - - This function is there for compatibility with other channel types. - - Actual direct messages do not really have the concept of permissions. - - This returns all the Text related permissions set to ``True`` except: - - - :attr:`~Permissions.send_tts_messages`: You cannot send TTS messages in a DM. - - :attr:`~Permissions.manage_messages`: You cannot delete others messages in a DM. - - :attr:`~Permissions.create_private_threads`: There are no threads in a DM. - - :attr:`~Permissions.create_public_threads`: There are no threads in a DM. - - :attr:`~Permissions.manage_threads`: There are no threads in a DM. - - :attr:`~Permissions.send_messages_in_threads`: There are no threads in a DM. - - This also checks the kick_members permission if the user is the owner. - - .. versionchanged:: 2.0 - - ``obj`` parameter is now positional-only. - - .. versionchanged:: 2.1 - - Thread related permissions are now set to ``False``. - - Parameters - ----------- - obj: :class:`~discord.abc.Snowflake` - The user to check permissions for. - - Returns - -------- - :class:`Permissions` - The resolved permissions for the user. - """ - - base = Permissions._dm_permissions() - base.mention_everyone = True - - if obj.id == self.owner_id: - base.kick_members = True - - return base - - async def leave(self) -> None: - """|coro| - - Leave the group. - - If you are the only one in the group, this deletes it as well. - - Raises - ------- - HTTPException - Leaving the group failed. - """ - - await self._state.http.leave_group(self.id) - - -class PartialMessageable(discord.abc.Messageable, Hashable): - """Represents a partial messageable to aid with working messageable channels when - only a channel ID is present. - - The only way to construct this class is through :meth:`Client.get_partial_messageable`. - - Note that this class is trimmed down and has no rich attributes. - - .. versionadded:: 2.0 - - .. container:: operations - - .. describe:: x == y - - Checks if two partial messageables are equal. - - .. describe:: x != y - - Checks if two partial messageables are not equal. - - .. describe:: hash(x) - - Returns the partial messageable's hash. - - Attributes - ----------- - id: :class:`int` - The channel ID associated with this partial messageable. - guild_id: Optional[:class:`int`] - The guild ID associated with this partial messageable. - type: Optional[:class:`ChannelType`] - The channel type associated with this partial messageable, if given. - """ - - def __init__(self, state: ConnectionState, id: int, guild_id: Optional[int] = None, type: Optional[ChannelType] = None): - self._state: ConnectionState = state - self.id: int = id - self.guild_id: Optional[int] = guild_id - self.type: Optional[ChannelType] = type - - def __repr__(self) -> str: - return f'<{self.__class__.__name__} id={self.id} type={self.type!r}>' - - async def _get_channel(self) -> PartialMessageable: - return self - - @property - def guild(self) -> Optional[Guild]: - """Optional[:class:`Guild`]: The guild this partial messageable is in.""" - return self._state._get_guild(self.guild_id) - - @property - def jump_url(self) -> str: - """:class:`str`: Returns a URL that allows the client to jump to the channel.""" - if self.guild_id is None: - return f'https://discord.com/channels/@me/{self.id}' - return f'https://discord.com/channels/{self.guild_id}/{self.id}' - - @property - def created_at(self) -> datetime.datetime: - """:class:`datetime.datetime`: Returns the channel's creation time in UTC.""" - return utils.snowflake_time(self.id) - - def permissions_for(self, obj: Any = None, /) -> Permissions: - """Handles permission resolution for a :class:`User`. - - This function is there for compatibility with other channel types. - - Since partial messageables cannot reasonably have the concept of - permissions, this will always return :meth:`Permissions.none`. - - Parameters - ----------- - obj: :class:`User` - The user to check permissions for. This parameter is ignored - but kept for compatibility with other ``permissions_for`` methods. - - Returns - -------- - :class:`Permissions` - The resolved permissions. - """ - - return Permissions.none() - - def get_partial_message(self, message_id: int, /) -> PartialMessage: - """Creates a :class:`PartialMessage` from the message ID. - - This is useful if you want to work with a message and only have its ID without - doing an unnecessary API call. - - Parameters - ------------ - message_id: :class:`int` - The message ID to create a partial message for. - - Returns - --------- - :class:`PartialMessage` - The partial message. - """ - - from .message import PartialMessage - - return PartialMessage(channel=self, id=message_id) - - -def _guild_channel_factory(channel_type: int): - value = try_enum(ChannelType, channel_type) - if value is ChannelType.text: - return TextChannel, value - elif value is ChannelType.voice: - return VoiceChannel, value - elif value is ChannelType.category: - return CategoryChannel, value - elif value is ChannelType.news: - return TextChannel, value - elif value is ChannelType.stage_voice: - return StageChannel, value - elif value is ChannelType.forum: - return ForumChannel, value - else: - return None, value - - -def _channel_factory(channel_type: int): - cls, value = _guild_channel_factory(channel_type) - if value is ChannelType.private: - return DMChannel, value - elif value is ChannelType.group: - return GroupChannel, value - else: - return cls, value - - -def _threaded_channel_factory(channel_type: int): - cls, value = _channel_factory(channel_type) - if value in (ChannelType.private_thread, ChannelType.public_thread, ChannelType.news_thread): - return Thread, value - return cls, value - - -def _threaded_guild_channel_factory(channel_type: int): - cls, value = _guild_channel_factory(channel_type) - if value in (ChannelType.private_thread, ChannelType.public_thread, ChannelType.news_thread): - return Thread, value - return cls, value diff --git a/.venv/Lib/site-packages/discord/client.py b/.venv/Lib/site-packages/discord/client.py deleted file mode 100644 index c4c59e7..0000000 --- a/.venv/Lib/site-packages/discord/client.py +++ /dev/null @@ -1,2724 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -import asyncio -import datetime -import logging -from typing import ( - TYPE_CHECKING, - Any, - AsyncIterator, - Callable, - Coroutine, - Dict, - Generator, - List, - Literal, - Optional, - Sequence, - Tuple, - Type, - TypeVar, - Union, - overload, -) - -import aiohttp - -from .user import User, ClientUser -from .invite import Invite -from .template import Template -from .widget import Widget -from .guild import Guild -from .emoji import Emoji -from .channel import _threaded_channel_factory, PartialMessageable -from .enums import ChannelType -from .mentions import AllowedMentions -from .errors import * -from .enums import Status -from .flags import ApplicationFlags, Intents -from .gateway import * -from .activity import ActivityTypes, BaseActivity, create_activity -from .voice_client import VoiceClient -from .http import HTTPClient -from .state import ConnectionState -from . import utils -from .utils import MISSING, time_snowflake -from .object import Object -from .backoff import ExponentialBackoff -from .webhook import Webhook -from .appinfo import AppInfo -from .ui.view import View -from .stage_instance import StageInstance -from .threads import Thread -from .sticker import GuildSticker, StandardSticker, StickerPack, _sticker_factory - -if TYPE_CHECKING: - from types import TracebackType - - from typing_extensions import Self - - from .abc import Messageable, PrivateChannel, Snowflake, SnowflakeTime - from .app_commands import Command, ContextMenu - from .automod import AutoModAction, AutoModRule - from .channel import DMChannel, GroupChannel - from .ext.commands import AutoShardedBot, Bot, Context, CommandError - from .guild import GuildChannel - from .integrations import Integration - from .interactions import Interaction - from .member import Member, VoiceState - from .message import Message - from .raw_models import ( - RawAppCommandPermissionsUpdateEvent, - RawBulkMessageDeleteEvent, - RawIntegrationDeleteEvent, - RawMemberRemoveEvent, - RawMessageDeleteEvent, - RawMessageUpdateEvent, - RawReactionActionEvent, - RawReactionClearEmojiEvent, - RawReactionClearEvent, - RawThreadDeleteEvent, - RawThreadMembersUpdate, - RawThreadUpdateEvent, - RawTypingEvent, - ) - from .reaction import Reaction - from .role import Role - from .scheduled_event import ScheduledEvent - from .threads import ThreadMember - from .types.guild import Guild as GuildPayload - from .voice_client import VoiceProtocol - from .audit_logs import AuditLogEntry - - -# fmt: off -__all__ = ( - 'Client', -) -# fmt: on - -T = TypeVar('T') -Coro = Coroutine[Any, Any, T] -CoroT = TypeVar('CoroT', bound=Callable[..., Coro[Any]]) - -_log = logging.getLogger(__name__) - - -class _LoopSentinel: - __slots__ = () - - def __getattr__(self, attr: str) -> None: - msg = ( - 'loop attribute cannot be accessed in non-async contexts. ' - 'Consider using either an asynchronous main function and passing it to asyncio.run or ' - 'using asynchronous initialisation hooks such as Client.setup_hook' - ) - raise AttributeError(msg) - - -_loop: Any = _LoopSentinel() - - -class Client: - r"""Represents a client connection that connects to Discord. - This class is used to interact with the Discord WebSocket and API. - - .. container:: operations - - .. describe:: async with x - - Asynchronously initialises the client and automatically cleans up. - - .. versionadded:: 2.0 - - A number of options can be passed to the :class:`Client`. - - Parameters - ----------- - max_messages: Optional[:class:`int`] - The maximum number of messages to store in the internal message cache. - This defaults to ``1000``. Passing in ``None`` disables the message cache. - - .. versionchanged:: 1.3 - Allow disabling the message cache and change the default size to ``1000``. - proxy: Optional[:class:`str`] - Proxy URL. - proxy_auth: Optional[:class:`aiohttp.BasicAuth`] - An object that represents proxy HTTP Basic Authorization. - shard_id: Optional[:class:`int`] - Integer starting at ``0`` and less than :attr:`.shard_count`. - shard_count: Optional[:class:`int`] - The total number of shards. - application_id: :class:`int` - The client's application ID. - intents: :class:`Intents` - The intents that you want to enable for the session. This is a way of - disabling and enabling certain gateway events from triggering and being sent. - - .. versionadded:: 1.5 - - .. versionchanged:: 2.0 - Parameter is now required. - member_cache_flags: :class:`MemberCacheFlags` - Allows for finer control over how the library caches members. - If not given, defaults to cache as much as possible with the - currently selected intents. - - .. versionadded:: 1.5 - chunk_guilds_at_startup: :class:`bool` - Indicates if :func:`.on_ready` should be delayed to chunk all guilds - at start-up if necessary. This operation is incredibly slow for large - amounts of guilds. The default is ``True`` if :attr:`Intents.members` - is ``True``. - - .. versionadded:: 1.5 - status: Optional[:class:`.Status`] - A status to start your presence with upon logging on to Discord. - activity: Optional[:class:`.BaseActivity`] - An activity to start your presence with upon logging on to Discord. - allowed_mentions: Optional[:class:`AllowedMentions`] - Control how the client handles mentions by default on every message sent. - - .. versionadded:: 1.4 - heartbeat_timeout: :class:`float` - The maximum numbers of seconds before timing out and restarting the - WebSocket in the case of not receiving a HEARTBEAT_ACK. Useful if - processing the initial packets take too long to the point of disconnecting - you. The default timeout is 60 seconds. - guild_ready_timeout: :class:`float` - The maximum number of seconds to wait for the GUILD_CREATE stream to end before - preparing the member cache and firing READY. The default timeout is 2 seconds. - - .. versionadded:: 1.4 - assume_unsync_clock: :class:`bool` - Whether to assume the system clock is unsynced. This applies to the ratelimit handling - code. If this is set to ``True``, the default, then the library uses the time to reset - a rate limit bucket given by Discord. If this is ``False`` then your system clock is - used to calculate how long to sleep for. If this is set to ``False`` it is recommended to - sync your system clock to Google's NTP server. - - .. versionadded:: 1.3 - enable_debug_events: :class:`bool` - Whether to enable events that are useful only for debugging gateway related information. - - Right now this involves :func:`on_socket_raw_receive` and :func:`on_socket_raw_send`. If - this is ``False`` then those events will not be dispatched (due to performance considerations). - To enable these events, this must be set to ``True``. Defaults to ``False``. - - .. versionadded:: 2.0 - http_trace: :class:`aiohttp.TraceConfig` - The trace configuration to use for tracking HTTP requests the library does using ``aiohttp``. - This allows you to check requests the library is using. For more information, check the - `aiohttp documentation `_. - - .. versionadded:: 2.0 - max_ratelimit_timeout: Optional[:class:`float`] - The maximum number of seconds to wait when a non-global rate limit is encountered. - If a request requires sleeping for more than the seconds passed in, then - :exc:`~discord.RateLimited` will be raised. By default, there is no timeout limit. - In order to prevent misuse and unnecessary bans, the minimum value this can be - set to is ``30.0`` seconds. - - .. versionadded:: 2.0 - - Attributes - ----------- - ws - The websocket gateway the client is currently connected to. Could be ``None``. - """ - - def __init__(self, *, intents: Intents, **options: Any) -> None: - self.loop: asyncio.AbstractEventLoop = _loop - # self.ws is set in the connect method - self.ws: DiscordWebSocket = None # type: ignore - self._listeners: Dict[str, List[Tuple[asyncio.Future, Callable[..., bool]]]] = {} - self.shard_id: Optional[int] = options.get('shard_id') - self.shard_count: Optional[int] = options.get('shard_count') - - proxy: Optional[str] = options.pop('proxy', None) - proxy_auth: Optional[aiohttp.BasicAuth] = options.pop('proxy_auth', None) - unsync_clock: bool = options.pop('assume_unsync_clock', True) - http_trace: Optional[aiohttp.TraceConfig] = options.pop('http_trace', None) - max_ratelimit_timeout: Optional[float] = options.pop('max_ratelimit_timeout', None) - self.http: HTTPClient = HTTPClient( - self.loop, - proxy=proxy, - proxy_auth=proxy_auth, - unsync_clock=unsync_clock, - http_trace=http_trace, - max_ratelimit_timeout=max_ratelimit_timeout, - ) - - self._handlers: Dict[str, Callable[..., None]] = { - 'ready': self._handle_ready, - } - - self._hooks: Dict[str, Callable[..., Coroutine[Any, Any, Any]]] = { - 'before_identify': self._call_before_identify_hook, - } - - self._enable_debug_events: bool = options.pop('enable_debug_events', False) - self._connection: ConnectionState[Self] = self._get_state(intents=intents, **options) - self._connection.shard_count = self.shard_count - self._closed: bool = False - self._ready: asyncio.Event = MISSING - self._application: Optional[AppInfo] = None - self._connection._get_websocket = self._get_websocket - self._connection._get_client = lambda: self - - if VoiceClient.warn_nacl: - VoiceClient.warn_nacl = False - _log.warning("PyNaCl is not installed, voice will NOT be supported") - - async def __aenter__(self) -> Self: - await self._async_setup_hook() - return self - - async def __aexit__( - self, - exc_type: Optional[Type[BaseException]], - exc_value: Optional[BaseException], - traceback: Optional[TracebackType], - ) -> None: - if not self.is_closed(): - await self.close() - - # internals - - def _get_websocket(self, guild_id: Optional[int] = None, *, shard_id: Optional[int] = None) -> DiscordWebSocket: - return self.ws - - def _get_state(self, **options: Any) -> ConnectionState: - return ConnectionState(dispatch=self.dispatch, handlers=self._handlers, hooks=self._hooks, http=self.http, **options) - - def _handle_ready(self) -> None: - self._ready.set() - - @property - def latency(self) -> float: - """:class:`float`: Measures latency between a HEARTBEAT and a HEARTBEAT_ACK in seconds. - - This could be referred to as the Discord WebSocket protocol latency. - """ - ws = self.ws - return float('nan') if not ws else ws.latency - - def is_ws_ratelimited(self) -> bool: - """:class:`bool`: Whether the websocket is currently rate limited. - - This can be useful to know when deciding whether you should query members - using HTTP or via the gateway. - - .. versionadded:: 1.6 - """ - if self.ws: - return self.ws.is_ratelimited() - return False - - @property - def user(self) -> Optional[ClientUser]: - """Optional[:class:`.ClientUser`]: Represents the connected client. ``None`` if not logged in.""" - return self._connection.user - - @property - def guilds(self) -> Sequence[Guild]: - """Sequence[:class:`.Guild`]: The guilds that the connected client is a member of.""" - return self._connection.guilds - - @property - def emojis(self) -> Sequence[Emoji]: - """Sequence[:class:`.Emoji`]: The emojis that the connected client has.""" - return self._connection.emojis - - @property - def stickers(self) -> Sequence[GuildSticker]: - """Sequence[:class:`.GuildSticker`]: The stickers that the connected client has. - - .. versionadded:: 2.0 - """ - return self._connection.stickers - - @property - def cached_messages(self) -> Sequence[Message]: - """Sequence[:class:`.Message`]: Read-only list of messages the connected client has cached. - - .. versionadded:: 1.1 - """ - return utils.SequenceProxy(self._connection._messages or []) - - @property - def private_channels(self) -> Sequence[PrivateChannel]: - """Sequence[:class:`.abc.PrivateChannel`]: The private channels that the connected client is participating on. - - .. note:: - - This returns only up to 128 most recent private channels due to an internal working - on how Discord deals with private channels. - """ - return self._connection.private_channels - - @property - def voice_clients(self) -> List[VoiceProtocol]: - """List[:class:`.VoiceProtocol`]: Represents a list of voice connections. - - These are usually :class:`.VoiceClient` instances. - """ - return self._connection.voice_clients - - @property - def application_id(self) -> Optional[int]: - """Optional[:class:`int`]: The client's application ID. - - If this is not passed via ``__init__`` then this is retrieved - through the gateway when an event contains the data or after a call - to :meth:`~discord.Client.login`. Usually after :func:`~discord.on_connect` - is called. - - .. versionadded:: 2.0 - """ - return self._connection.application_id - - @property - def application_flags(self) -> ApplicationFlags: - """:class:`~discord.ApplicationFlags`: The client's application flags. - - .. versionadded:: 2.0 - """ - return self._connection.application_flags - - @property - def application(self) -> Optional[AppInfo]: - """Optional[:class:`~discord.AppInfo`]: The client's application info. - - This is retrieved on :meth:`~discord.Client.login` and is not updated - afterwards. This allows populating the application_id without requiring a - gateway connection. - - This is ``None`` if accessed before :meth:`~discord.Client.login` is called. - - .. seealso:: The :meth:`~discord.Client.application_info` API call - - .. versionadded:: 2.0 - """ - return self._application - - def is_ready(self) -> bool: - """:class:`bool`: Specifies if the client's internal cache is ready for use.""" - return self._ready is not MISSING and self._ready.is_set() - - async def _run_event( - self, - coro: Callable[..., Coroutine[Any, Any, Any]], - event_name: str, - *args: Any, - **kwargs: Any, - ) -> None: - try: - await coro(*args, **kwargs) - except asyncio.CancelledError: - pass - except Exception: - try: - await self.on_error(event_name, *args, **kwargs) - except asyncio.CancelledError: - pass - - def _schedule_event( - self, - coro: Callable[..., Coroutine[Any, Any, Any]], - event_name: str, - *args: Any, - **kwargs: Any, - ) -> asyncio.Task: - wrapped = self._run_event(coro, event_name, *args, **kwargs) - # Schedules the task - return self.loop.create_task(wrapped, name=f'discord.py: {event_name}') - - def dispatch(self, event: str, /, *args: Any, **kwargs: Any) -> None: - _log.debug('Dispatching event %s', event) - method = 'on_' + event - - listeners = self._listeners.get(event) - if listeners: - removed = [] - for i, (future, condition) in enumerate(listeners): - if future.cancelled(): - removed.append(i) - continue - - try: - result = condition(*args) - except Exception as exc: - future.set_exception(exc) - removed.append(i) - else: - if result: - if len(args) == 0: - future.set_result(None) - elif len(args) == 1: - future.set_result(args[0]) - else: - future.set_result(args) - removed.append(i) - - if len(removed) == len(listeners): - self._listeners.pop(event) - else: - for idx in reversed(removed): - del listeners[idx] - - try: - coro = getattr(self, method) - except AttributeError: - pass - else: - self._schedule_event(coro, method, *args, **kwargs) - - async def on_error(self, event_method: str, /, *args: Any, **kwargs: Any) -> None: - """|coro| - - The default error handler provided by the client. - - By default this logs to the library logger however it could be - overridden to have a different implementation. - Check :func:`~discord.on_error` for more details. - - .. versionchanged:: 2.0 - - ``event_method`` parameter is now positional-only - and instead of writing to ``sys.stderr`` it logs instead. - """ - _log.exception('Ignoring exception in %s', event_method) - - # hooks - - async def _call_before_identify_hook(self, shard_id: Optional[int], *, initial: bool = False) -> None: - # This hook is an internal hook that actually calls the public one. - # It allows the library to have its own hook without stepping on the - # toes of those who need to override their own hook. - await self.before_identify_hook(shard_id, initial=initial) - - async def before_identify_hook(self, shard_id: Optional[int], *, initial: bool = False) -> None: - """|coro| - - A hook that is called before IDENTIFYing a session. This is useful - if you wish to have more control over the synchronization of multiple - IDENTIFYing clients. - - The default implementation sleeps for 5 seconds. - - .. versionadded:: 1.4 - - Parameters - ------------ - shard_id: :class:`int` - The shard ID that requested being IDENTIFY'd - initial: :class:`bool` - Whether this IDENTIFY is the first initial IDENTIFY. - """ - - if not initial: - await asyncio.sleep(5.0) - - async def _async_setup_hook(self) -> None: - # Called whenever the client needs to initialise asyncio objects with a running loop - loop = asyncio.get_running_loop() - self.loop = loop - self.http.loop = loop - self._connection.loop = loop - - self._ready = asyncio.Event() - - async def setup_hook(self) -> None: - """|coro| - - A coroutine to be called to setup the bot, by default this is blank. - - To perform asynchronous setup after the bot is logged in but before - it has connected to the Websocket, overwrite this coroutine. - - This is only called once, in :meth:`login`, and will be called before - any events are dispatched, making it a better solution than doing such - setup in the :func:`~discord.on_ready` event. - - .. warning:: - - Since this is called *before* the websocket connection is made therefore - anything that waits for the websocket will deadlock, this includes things - like :meth:`wait_for` and :meth:`wait_until_ready`. - - .. versionadded:: 2.0 - """ - pass - - # login state management - - async def login(self, token: str) -> None: - """|coro| - - Logs in the client with the specified credentials and - calls the :meth:`setup_hook`. - - - Parameters - ----------- - token: :class:`str` - The authentication token. Do not prefix this token with - anything as the library will do it for you. - - Raises - ------ - LoginFailure - The wrong credentials are passed. - HTTPException - An unknown HTTP related error occurred, - usually when it isn't 200 or the known incorrect credentials - passing status code. - """ - - _log.info('logging in using static token') - - if self.loop is _loop: - await self._async_setup_hook() - - if not isinstance(token, str): - raise TypeError(f'expected token to be a str, received {token.__class__.__name__} instead') - token = token.strip() - - data = await self.http.static_login(token) - self._connection.user = ClientUser(state=self._connection, data=data) - self._application = await self.application_info() - if self._connection.application_id is None: - self._connection.application_id = self._application.id - - if not self._connection.application_flags: - self._connection.application_flags = self._application.flags - - await self.setup_hook() - - async def connect(self, *, reconnect: bool = True) -> None: - """|coro| - - Creates a websocket connection and lets the websocket listen - to messages from Discord. This is a loop that runs the entire - event system and miscellaneous aspects of the library. Control - is not resumed until the WebSocket connection is terminated. - - Parameters - ----------- - reconnect: :class:`bool` - If we should attempt reconnecting, either due to internet - failure or a specific failure on Discord's part. Certain - disconnects that lead to bad state will not be handled (such as - invalid sharding payloads or bad tokens). - - Raises - ------- - GatewayNotFound - If the gateway to connect to Discord is not found. Usually if this - is thrown then there is a Discord API outage. - ConnectionClosed - The websocket connection has been terminated. - """ - - backoff = ExponentialBackoff() - ws_params = { - 'initial': True, - 'shard_id': self.shard_id, - } - while not self.is_closed(): - try: - coro = DiscordWebSocket.from_client(self, **ws_params) - self.ws = await asyncio.wait_for(coro, timeout=60.0) - ws_params['initial'] = False - while True: - await self.ws.poll_event() - except ReconnectWebSocket as e: - _log.debug('Got a request to %s the websocket.', e.op) - self.dispatch('disconnect') - ws_params.update(sequence=self.ws.sequence, resume=e.resume, session=self.ws.session_id) - if e.resume: - ws_params['gateway'] = self.ws.gateway - continue - except ( - OSError, - HTTPException, - GatewayNotFound, - ConnectionClosed, - aiohttp.ClientError, - asyncio.TimeoutError, - ) as exc: - - self.dispatch('disconnect') - if not reconnect: - await self.close() - if isinstance(exc, ConnectionClosed) and exc.code == 1000: - # clean close, don't re-raise this - return - raise - - if self.is_closed(): - return - - # If we get connection reset by peer then try to RESUME - if isinstance(exc, OSError) and exc.errno in (54, 10054): - ws_params.update( - sequence=self.ws.sequence, - gateway=self.ws.gateway, - initial=False, - resume=True, - session=self.ws.session_id, - ) - continue - - # We should only get this when an unhandled close code happens, - # such as a clean disconnect (1000) or a bad state (bad token, no sharding, etc) - # sometimes, discord sends us 1000 for unknown reasons so we should reconnect - # regardless and rely on is_closed instead - if isinstance(exc, ConnectionClosed): - if exc.code == 4014: - raise PrivilegedIntentsRequired(exc.shard_id) from None - if exc.code != 1000: - await self.close() - raise - - retry = backoff.delay() - _log.exception("Attempting a reconnect in %.2fs", retry) - await asyncio.sleep(retry) - # Always try to RESUME the connection - # If the connection is not RESUME-able then the gateway will invalidate the session. - # This is apparently what the official Discord client does. - ws_params.update( - sequence=self.ws.sequence, - gateway=self.ws.gateway, - resume=True, - session=self.ws.session_id, - ) - - async def close(self) -> None: - """|coro| - - Closes the connection to Discord. - """ - if self._closed: - return - - self._closed = True - - await self._connection.close() - - if self.ws is not None and self.ws.open: - await self.ws.close(code=1000) - - await self.http.close() - - if self._ready is not MISSING: - self._ready.clear() - - self.loop = MISSING - - def clear(self) -> None: - """Clears the internal state of the bot. - - After this, the bot can be considered "re-opened", i.e. :meth:`is_closed` - and :meth:`is_ready` both return ``False`` along with the bot's internal - cache cleared. - """ - self._closed = False - self._ready.clear() - self._connection.clear() - self.http.clear() - - async def start(self, token: str, *, reconnect: bool = True) -> None: - """|coro| - - A shorthand coroutine for :meth:`login` + :meth:`connect`. - - Parameters - ----------- - token: :class:`str` - The authentication token. Do not prefix this token with - anything as the library will do it for you. - reconnect: :class:`bool` - If we should attempt reconnecting, either due to internet - failure or a specific failure on Discord's part. Certain - disconnects that lead to bad state will not be handled (such as - invalid sharding payloads or bad tokens). - - Raises - ------- - TypeError - An unexpected keyword argument was received. - """ - await self.login(token) - await self.connect(reconnect=reconnect) - - def run( - self, - token: str, - *, - reconnect: bool = True, - log_handler: Optional[logging.Handler] = MISSING, - log_formatter: logging.Formatter = MISSING, - log_level: int = MISSING, - root_logger: bool = False, - ) -> None: - """A blocking call that abstracts away the event loop - initialisation from you. - - If you want more control over the event loop then this - function should not be used. Use :meth:`start` coroutine - or :meth:`connect` + :meth:`login`. - - This function also sets up the logging library to make it easier - for beginners to know what is going on with the library. For more - advanced users, this can be disabled by passing ``None`` to - the ``log_handler`` parameter. - - .. warning:: - - This function must be the last function to call due to the fact that it - is blocking. That means that registration of events or anything being - called after this function call will not execute until it returns. - - Parameters - ----------- - token: :class:`str` - The authentication token. Do not prefix this token with - anything as the library will do it for you. - reconnect: :class:`bool` - If we should attempt reconnecting, either due to internet - failure or a specific failure on Discord's part. Certain - disconnects that lead to bad state will not be handled (such as - invalid sharding payloads or bad tokens). - log_handler: Optional[:class:`logging.Handler`] - The log handler to use for the library's logger. If this is ``None`` - then the library will not set up anything logging related. Logging - will still work if ``None`` is passed, though it is your responsibility - to set it up. - - The default log handler if not provided is :class:`logging.StreamHandler`. - - .. versionadded:: 2.0 - log_formatter: :class:`logging.Formatter` - The formatter to use with the given log handler. If not provided then it - defaults to a colour based logging formatter (if available). - - .. versionadded:: 2.0 - log_level: :class:`int` - The default log level for the library's logger. This is only applied if the - ``log_handler`` parameter is not ``None``. Defaults to ``logging.INFO``. - - .. versionadded:: 2.0 - root_logger: :class:`bool` - Whether to set up the root logger rather than the library logger. - By default, only the library logger (``'discord'``) is set up. If this - is set to ``True`` then the root logger is set up as well. - - Defaults to ``False``. - - .. versionadded:: 2.0 - """ - - async def runner(): - async with self: - await self.start(token, reconnect=reconnect) - - if log_handler is not None: - utils.setup_logging( - handler=log_handler, - formatter=log_formatter, - level=log_level, - root=root_logger, - ) - - try: - asyncio.run(runner()) - except KeyboardInterrupt: - # nothing to do here - # `asyncio.run` handles the loop cleanup - # and `self.start` closes all sockets and the HTTPClient instance. - return - - # properties - - def is_closed(self) -> bool: - """:class:`bool`: Indicates if the websocket connection is closed.""" - return self._closed - - @property - def activity(self) -> Optional[ActivityTypes]: - """Optional[:class:`.BaseActivity`]: The activity being used upon - logging in. - """ - return create_activity(self._connection._activity, self._connection) - - @activity.setter - def activity(self, value: Optional[ActivityTypes]) -> None: - if value is None: - self._connection._activity = None - elif isinstance(value, BaseActivity): - # ConnectionState._activity is typehinted as ActivityPayload, we're passing Dict[str, Any] - self._connection._activity = value.to_dict() # type: ignore - else: - raise TypeError('activity must derive from BaseActivity.') - - @property - def status(self) -> Status: - """:class:`.Status`: - The status being used upon logging on to Discord. - - .. versionadded: 2.0 - """ - if self._connection._status in set(state.value for state in Status): - return Status(self._connection._status) - return Status.online - - @status.setter - def status(self, value: Status) -> None: - if value is Status.offline: - self._connection._status = 'invisible' - elif isinstance(value, Status): - self._connection._status = str(value) - else: - raise TypeError('status must derive from Status.') - - @property - def allowed_mentions(self) -> Optional[AllowedMentions]: - """Optional[:class:`~discord.AllowedMentions`]: The allowed mention configuration. - - .. versionadded:: 1.4 - """ - return self._connection.allowed_mentions - - @allowed_mentions.setter - def allowed_mentions(self, value: Optional[AllowedMentions]) -> None: - if value is None or isinstance(value, AllowedMentions): - self._connection.allowed_mentions = value - else: - raise TypeError(f'allowed_mentions must be AllowedMentions not {value.__class__.__name__}') - - @property - def intents(self) -> Intents: - """:class:`~discord.Intents`: The intents configured for this connection. - - .. versionadded:: 1.5 - """ - return self._connection.intents - - # helpers/getters - - @property - def users(self) -> List[User]: - """List[:class:`~discord.User`]: Returns a list of all the users the bot can see.""" - return list(self._connection._users.values()) - - def get_channel(self, id: int, /) -> Optional[Union[GuildChannel, Thread, PrivateChannel]]: - """Returns a channel or thread with the given ID. - - .. versionchanged:: 2.0 - - ``id`` parameter is now positional-only. - - Parameters - ----------- - id: :class:`int` - The ID to search for. - - Returns - -------- - Optional[Union[:class:`.abc.GuildChannel`, :class:`.Thread`, :class:`.abc.PrivateChannel`]] - The returned channel or ``None`` if not found. - """ - return self._connection.get_channel(id) # type: ignore # The cache contains all channel types - - def get_partial_messageable( - self, id: int, *, guild_id: Optional[int] = None, type: Optional[ChannelType] = None - ) -> PartialMessageable: - """Returns a partial messageable with the given channel ID. - - This is useful if you have a channel_id but don't want to do an API call - to send messages to it. - - .. versionadded:: 2.0 - - Parameters - ----------- - id: :class:`int` - The channel ID to create a partial messageable for. - guild_id: Optional[:class:`int`] - The optional guild ID to create a partial messageable for. - - This is not required to actually send messages, but it does allow the - :meth:`~discord.PartialMessageable.jump_url` and - :attr:`~discord.PartialMessageable.guild` properties to function properly. - type: Optional[:class:`.ChannelType`] - The underlying channel type for the partial messageable. - - Returns - -------- - :class:`.PartialMessageable` - The partial messageable - """ - return PartialMessageable(state=self._connection, id=id, guild_id=guild_id, type=type) - - def get_stage_instance(self, id: int, /) -> Optional[StageInstance]: - """Returns a stage instance with the given stage channel ID. - - .. versionadded:: 2.0 - - Parameters - ----------- - id: :class:`int` - The ID to search for. - - Returns - -------- - Optional[:class:`.StageInstance`] - The stage instance or ``None`` if not found. - """ - from .channel import StageChannel - - channel = self._connection.get_channel(id) - - if isinstance(channel, StageChannel): - return channel.instance - - def get_guild(self, id: int, /) -> Optional[Guild]: - """Returns a guild with the given ID. - - .. versionchanged:: 2.0 - - ``id`` parameter is now positional-only. - - Parameters - ----------- - id: :class:`int` - The ID to search for. - - Returns - -------- - Optional[:class:`.Guild`] - The guild or ``None`` if not found. - """ - return self._connection._get_guild(id) - - def get_user(self, id: int, /) -> Optional[User]: - """Returns a user with the given ID. - - .. versionchanged:: 2.0 - - ``id`` parameter is now positional-only. - - Parameters - ----------- - id: :class:`int` - The ID to search for. - - Returns - -------- - Optional[:class:`~discord.User`] - The user or ``None`` if not found. - """ - return self._connection.get_user(id) - - def get_emoji(self, id: int, /) -> Optional[Emoji]: - """Returns an emoji with the given ID. - - .. versionchanged:: 2.0 - - ``id`` parameter is now positional-only. - - Parameters - ----------- - id: :class:`int` - The ID to search for. - - Returns - -------- - Optional[:class:`.Emoji`] - The custom emoji or ``None`` if not found. - """ - return self._connection.get_emoji(id) - - def get_sticker(self, id: int, /) -> Optional[GuildSticker]: - """Returns a guild sticker with the given ID. - - .. versionadded:: 2.0 - - .. note:: - - To retrieve standard stickers, use :meth:`.fetch_sticker`. - or :meth:`.fetch_premium_sticker_packs`. - - Returns - -------- - Optional[:class:`.GuildSticker`] - The sticker or ``None`` if not found. - """ - return self._connection.get_sticker(id) - - def get_all_channels(self) -> Generator[GuildChannel, None, None]: - """A generator that retrieves every :class:`.abc.GuildChannel` the client can 'access'. - - This is equivalent to: :: - - for guild in client.guilds: - for channel in guild.channels: - yield channel - - .. note:: - - Just because you receive a :class:`.abc.GuildChannel` does not mean that - you can communicate in said channel. :meth:`.abc.GuildChannel.permissions_for` should - be used for that. - - Yields - ------ - :class:`.abc.GuildChannel` - A channel the client can 'access'. - """ - - for guild in self.guilds: - yield from guild.channels - - def get_all_members(self) -> Generator[Member, None, None]: - """Returns a generator with every :class:`.Member` the client can see. - - This is equivalent to: :: - - for guild in client.guilds: - for member in guild.members: - yield member - - Yields - ------ - :class:`.Member` - A member the client can see. - """ - for guild in self.guilds: - yield from guild.members - - # listeners/waiters - - async def wait_until_ready(self) -> None: - """|coro| - - Waits until the client's internal cache is all ready. - - .. warning:: - - Calling this inside :meth:`setup_hook` can lead to a deadlock. - """ - if self._ready is not MISSING: - await self._ready.wait() - else: - raise RuntimeError( - 'Client has not been properly initialised. ' - 'Please use the login method or asynchronous context manager before calling this method' - ) - - # App Commands - - @overload - async def wait_for( - self, - event: Literal['raw_app_command_permissions_update'], - /, - *, - check: Optional[Callable[[RawAppCommandPermissionsUpdateEvent], bool]], - timeout: Optional[float] = None, - ) -> RawAppCommandPermissionsUpdateEvent: - ... - - @overload - async def wait_for( - self, - event: Literal['app_command_completion'], - /, - *, - check: Optional[Callable[[Interaction[Self], Union[Command[Any, ..., Any], ContextMenu]], bool]], - timeout: Optional[float] = None, - ) -> Tuple[Interaction[Self], Union[Command[Any, ..., Any], ContextMenu]]: - ... - - # AutoMod - - @overload - async def wait_for( - self, - event: Literal['automod_rule_create', 'automod_rule_update', 'automod_rule_delete'], - /, - *, - check: Optional[Callable[[AutoModRule], bool]], - timeout: Optional[float] = None, - ) -> AutoModRule: - ... - - @overload - async def wait_for( - self, - event: Literal['automod_action'], - /, - *, - check: Optional[Callable[[AutoModAction], bool]], - timeout: Optional[float] = None, - ) -> AutoModAction: - ... - - # Channels - - @overload - async def wait_for( - self, - event: Literal['private_channel_update'], - /, - *, - check: Optional[Callable[[GroupChannel, GroupChannel], bool]], - timeout: Optional[float] = None, - ) -> Tuple[GroupChannel, GroupChannel]: - ... - - @overload - async def wait_for( - self, - event: Literal['private_channel_pins_update'], - /, - *, - check: Optional[Callable[[PrivateChannel, datetime.datetime], bool]], - timeout: Optional[float] = None, - ) -> Tuple[PrivateChannel, datetime.datetime]: - ... - - @overload - async def wait_for( - self, - event: Literal['guild_channel_delete', 'guild_channel_create'], - /, - *, - check: Optional[Callable[[GuildChannel], bool]], - timeout: Optional[float] = None, - ) -> GuildChannel: - ... - - @overload - async def wait_for( - self, - event: Literal['guild_channel_update'], - /, - *, - check: Optional[Callable[[GuildChannel, GuildChannel], bool]], - timeout: Optional[float] = None, - ) -> Tuple[GuildChannel, GuildChannel]: - ... - - @overload - async def wait_for( - self, - event: Literal['guild_channel_pins_update'], - /, - *, - check: Optional[ - Callable[ - [Union[GuildChannel, Thread], Optional[datetime.datetime]], - bool, - ] - ], - timeout: Optional[float] = None, - ) -> Tuple[Union[GuildChannel, Thread], Optional[datetime.datetime]]: - ... - - @overload - async def wait_for( - self, - event: Literal['typing'], - /, - *, - check: Optional[Callable[[Messageable, Union[User, Member], datetime.datetime], bool]], - timeout: Optional[float] = None, - ) -> Tuple[Messageable, Union[User, Member], datetime.datetime]: - ... - - @overload - async def wait_for( - self, - event: Literal['raw_typing'], - /, - *, - check: Optional[Callable[[RawTypingEvent], bool]], - timeout: Optional[float] = None, - ) -> RawTypingEvent: - ... - - # Debug & Gateway events - - @overload - async def wait_for( - self, - event: Literal['connect', 'disconnect', 'ready', 'resumed'], - /, - *, - check: Optional[Callable[[], bool]], - timeout: Optional[float] = None, - ) -> None: - ... - - @overload - async def wait_for( - self, - event: Literal['shard_connect', 'shard_disconnect', 'shard_ready', 'shard_resumed'], - /, - *, - check: Optional[Callable[[int], bool]], - timeout: Optional[float] = None, - ) -> int: - ... - - @overload - async def wait_for( - self, - event: Literal['socket_event_type', 'socket_raw_receive'], - /, - *, - check: Optional[Callable[[str], bool]], - timeout: Optional[float] = None, - ) -> str: - ... - - @overload - async def wait_for( - self, - event: Literal['socket_raw_send'], - /, - *, - check: Optional[Callable[[Union[str, bytes]], bool]], - timeout: Optional[float] = None, - ) -> Union[str, bytes]: - ... - - # Guilds - - @overload - async def wait_for( - self, - event: Literal[ - 'guild_available', - 'guild_unavailable', - 'guild_join', - 'guild_remove', - ], - /, - *, - check: Optional[Callable[[Guild], bool]], - timeout: Optional[float] = None, - ) -> Guild: - ... - - @overload - async def wait_for( - self, - event: Literal['guild_update'], - /, - *, - check: Optional[Callable[[Guild, Guild], bool]], - timeout: Optional[float] = None, - ) -> Tuple[Guild, Guild]: - ... - - @overload - async def wait_for( - self, - event: Literal['guild_emojis_update'], - /, - *, - check: Optional[Callable[[Guild, Sequence[Emoji], Sequence[Emoji]], bool]], - timeout: Optional[float] = None, - ) -> Tuple[Guild, Sequence[Emoji], Sequence[Emoji]]: - ... - - @overload - async def wait_for( - self, - event: Literal['guild_stickers_update'], - /, - *, - check: Optional[Callable[[Guild, Sequence[GuildSticker], Sequence[GuildSticker]], bool]], - timeout: Optional[float] = None, - ) -> Tuple[Guild, Sequence[GuildSticker], Sequence[GuildSticker]]: - ... - - @overload - async def wait_for( - self, - event: Literal['invite_create', 'invite_delete'], - /, - *, - check: Optional[Callable[[Invite], bool]], - timeout: Optional[float] = None, - ) -> Invite: - ... - - @overload - async def wait_for( - self, - event: Literal['audit_log_entry_create'], - /, - *, - check: Optional[Callable[[AuditLogEntry], bool]], - timeout: Optional[float] = None, - ) -> AuditLogEntry: - ... - - # Integrations - - @overload - async def wait_for( - self, - event: Literal['integration_create', 'integration_update'], - /, - *, - check: Optional[Callable[[Integration], bool]], - timeout: Optional[float] = None, - ) -> Integration: - ... - - @overload - async def wait_for( - self, - event: Literal['guild_integrations_update'], - /, - *, - check: Optional[Callable[[Guild], bool]], - timeout: Optional[float] = None, - ) -> Guild: - ... - - @overload - async def wait_for( - self, - event: Literal['webhooks_update'], - /, - *, - check: Optional[Callable[[GuildChannel], bool]], - timeout: Optional[float] = None, - ) -> GuildChannel: - ... - - @overload - async def wait_for( - self, - event: Literal['raw_integration_delete'], - /, - *, - check: Optional[Callable[[RawIntegrationDeleteEvent], bool]], - timeout: Optional[float] = None, - ) -> RawIntegrationDeleteEvent: - ... - - # Interactions - - @overload - async def wait_for( - self, - event: Literal['interaction'], - /, - *, - check: Optional[Callable[[Interaction[Self]], bool]], - timeout: Optional[float] = None, - ) -> Interaction[Self]: - ... - - # Members - - @overload - async def wait_for( - self, - event: Literal['member_join', 'member_remove'], - /, - *, - check: Optional[Callable[[Member], bool]], - timeout: Optional[float] = None, - ) -> Member: - ... - - @overload - async def wait_for( - self, - event: Literal['raw_member_remove'], - /, - *, - check: Optional[Callable[[RawMemberRemoveEvent], bool]], - timeout: Optional[float] = None, - ) -> RawMemberRemoveEvent: - ... - - @overload - async def wait_for( - self, - event: Literal['member_update', 'presence_update'], - /, - *, - check: Optional[Callable[[Member, Member], bool]], - timeout: Optional[float] = None, - ) -> Tuple[Member, Member]: - ... - - @overload - async def wait_for( - self, - event: Literal['user_update'], - /, - *, - check: Optional[Callable[[User, User], bool]], - timeout: Optional[float] = None, - ) -> Tuple[User, User]: - ... - - @overload - async def wait_for( - self, - event: Literal['member_ban'], - /, - *, - check: Optional[Callable[[Guild, Union[User, Member]], bool]], - timeout: Optional[float] = None, - ) -> Tuple[Guild, Union[User, Member]]: - ... - - @overload - async def wait_for( - self, - event: Literal['member_unban'], - /, - *, - check: Optional[Callable[[Guild, User], bool]], - timeout: Optional[float] = None, - ) -> Tuple[Guild, User]: - ... - - # Messages - - @overload - async def wait_for( - self, - event: Literal['message', 'message_delete'], - /, - *, - check: Optional[Callable[[Message], bool]], - timeout: Optional[float] = None, - ) -> Message: - ... - - @overload - async def wait_for( - self, - event: Literal['message_edit'], - /, - *, - check: Optional[Callable[[Message, Message], bool]], - timeout: Optional[float] = None, - ) -> Tuple[Message, Message]: - ... - - @overload - async def wait_for( - self, - event: Literal['bulk_message_delete'], - /, - *, - check: Optional[Callable[[List[Message]], bool]], - timeout: Optional[float] = None, - ) -> List[Message]: - ... - - @overload - async def wait_for( - self, - event: Literal['raw_message_edit'], - /, - *, - check: Optional[Callable[[RawMessageUpdateEvent], bool]], - timeout: Optional[float] = None, - ) -> RawMessageUpdateEvent: - ... - - @overload - async def wait_for( - self, - event: Literal['raw_message_delete'], - /, - *, - check: Optional[Callable[[RawMessageDeleteEvent], bool]], - timeout: Optional[float] = None, - ) -> RawMessageDeleteEvent: - ... - - @overload - async def wait_for( - self, - event: Literal['raw_bulk_message_delete'], - /, - *, - check: Optional[Callable[[RawBulkMessageDeleteEvent], bool]], - timeout: Optional[float] = None, - ) -> RawBulkMessageDeleteEvent: - ... - - # Reactions - - @overload - async def wait_for( - self, - event: Literal['reaction_add', 'reaction_remove'], - /, - *, - check: Optional[Callable[[Reaction, Union[Member, User]], bool]], - timeout: Optional[float] = None, - ) -> Tuple[Reaction, Union[Member, User]]: - ... - - @overload - async def wait_for( - self, - event: Literal['reaction_clear'], - /, - *, - check: Optional[Callable[[Message, List[Reaction]], bool]], - timeout: Optional[float] = None, - ) -> Tuple[Message, List[Reaction]]: - ... - - @overload - async def wait_for( - self, - event: Literal['reaction_clear_emoji'], - /, - *, - check: Optional[Callable[[Reaction], bool]], - timeout: Optional[float] = None, - ) -> Reaction: - ... - - @overload - async def wait_for( - self, - event: Literal['raw_reaction_add', 'raw_reaction_remove'], - /, - *, - check: Optional[Callable[[RawReactionActionEvent], bool]], - timeout: Optional[float] = None, - ) -> RawReactionActionEvent: - ... - - @overload - async def wait_for( - self, - event: Literal['raw_reaction_clear'], - /, - *, - check: Optional[Callable[[RawReactionClearEvent], bool]], - timeout: Optional[float] = None, - ) -> RawReactionClearEvent: - ... - - @overload - async def wait_for( - self, - event: Literal['raw_reaction_clear_emoji'], - /, - *, - check: Optional[Callable[[RawReactionClearEmojiEvent], bool]], - timeout: Optional[float] = None, - ) -> RawReactionClearEmojiEvent: - ... - - # Roles - - @overload - async def wait_for( - self, - event: Literal['guild_role_create', 'guild_role_delete'], - /, - *, - check: Optional[Callable[[Role], bool]], - timeout: Optional[float] = None, - ) -> Role: - ... - - @overload - async def wait_for( - self, - event: Literal['guild_role_update'], - /, - *, - check: Optional[Callable[[Role, Role], bool]], - timeout: Optional[float] = None, - ) -> Tuple[Role, Role]: - ... - - # Scheduled Events - - @overload - async def wait_for( - self, - event: Literal['scheduled_event_create', 'scheduled_event_delete'], - /, - *, - check: Optional[Callable[[ScheduledEvent], bool]], - timeout: Optional[float] = None, - ) -> ScheduledEvent: - ... - - @overload - async def wait_for( - self, - event: Literal['scheduled_event_user_add', 'scheduled_event_user_remove'], - /, - *, - check: Optional[Callable[[ScheduledEvent, User], bool]], - timeout: Optional[float] = None, - ) -> Tuple[ScheduledEvent, User]: - ... - - # Stages - - @overload - async def wait_for( - self, - event: Literal['stage_instance_create', 'stage_instance_delete'], - /, - *, - check: Optional[Callable[[StageInstance], bool]], - timeout: Optional[float] = None, - ) -> StageInstance: - ... - - @overload - async def wait_for( - self, - event: Literal['stage_instance_update'], - /, - *, - check: Optional[Callable[[StageInstance, StageInstance], bool]], - timeout: Optional[float] = None, - ) -> Coroutine[Any, Any, Tuple[StageInstance, StageInstance]]: - ... - - # Threads - @overload - async def wait_for( - self, - event: Literal['thread_create', 'thread_join', 'thread_remove', 'thread_delete'], - /, - *, - check: Optional[Callable[[Thread], bool]], - timeout: Optional[float] = None, - ) -> Thread: - ... - - @overload - async def wait_for( - self, - event: Literal['thread_update'], - /, - *, - check: Optional[Callable[[Thread, Thread], bool]], - timeout: Optional[float] = None, - ) -> Tuple[Thread, Thread]: - ... - - @overload - async def wait_for( - self, - event: Literal['raw_thread_update'], - /, - *, - check: Optional[Callable[[RawThreadUpdateEvent], bool]], - timeout: Optional[float] = None, - ) -> RawThreadUpdateEvent: - ... - - @overload - async def wait_for( - self, - event: Literal['raw_thread_delete'], - /, - *, - check: Optional[Callable[[RawThreadDeleteEvent], bool]], - timeout: Optional[float] = None, - ) -> RawThreadDeleteEvent: - ... - - @overload - async def wait_for( - self, - event: Literal['thread_member_join', 'thread_member_remove'], - /, - *, - check: Optional[Callable[[ThreadMember], bool]], - timeout: Optional[float] = None, - ) -> ThreadMember: - ... - - @overload - async def wait_for( - self, - event: Literal['raw_thread_member_remove'], - /, - *, - check: Optional[Callable[[RawThreadMembersUpdate], bool]], - timeout: Optional[float] = None, - ) -> RawThreadMembersUpdate: - ... - - # Voice - - @overload - async def wait_for( - self, - event: Literal['voice_state_update'], - /, - *, - check: Optional[Callable[[Member, VoiceState, VoiceState], bool]], - timeout: Optional[float] = None, - ) -> Tuple[Member, VoiceState, VoiceState]: - ... - - # Commands - - @overload - async def wait_for( - self: Union[Bot, AutoShardedBot], - event: Literal["command", "command_completion"], - /, - *, - check: Optional[Callable[[Context[Any]], bool]] = None, - timeout: Optional[float] = None, - ) -> Context[Any]: - ... - - @overload - async def wait_for( - self: Union[Bot, AutoShardedBot], - event: Literal["command_error"], - /, - *, - check: Optional[Callable[[Context[Any], CommandError], bool]] = None, - timeout: Optional[float] = None, - ) -> Tuple[Context[Any], CommandError]: - ... - - @overload - async def wait_for( - self, - event: str, - /, - *, - check: Optional[Callable[..., bool]] = None, - timeout: Optional[float] = None, - ) -> Any: - ... - - def wait_for( - self, - event: str, - /, - *, - check: Optional[Callable[..., bool]] = None, - timeout: Optional[float] = None, - ) -> Coro[Any]: - """|coro| - - Waits for a WebSocket event to be dispatched. - - This could be used to wait for a user to reply to a message, - or to react to a message, or to edit a message in a self-contained - way. - - The ``timeout`` parameter is passed onto :func:`asyncio.wait_for`. By default, - it does not timeout. Note that this does propagate the - :exc:`asyncio.TimeoutError` for you in case of timeout and is provided for - ease of use. - - In case the event returns multiple arguments, a :class:`tuple` containing those - arguments is returned instead. Please check the - :ref:`documentation ` for a list of events and their - parameters. - - This function returns the **first event that meets the requirements**. - - Examples - --------- - - Waiting for a user reply: :: - - @client.event - async def on_message(message): - if message.content.startswith('$greet'): - channel = message.channel - await channel.send('Say hello!') - - def check(m): - return m.content == 'hello' and m.channel == channel - - msg = await client.wait_for('message', check=check) - await channel.send(f'Hello {msg.author}!') - - Waiting for a thumbs up reaction from the message author: :: - - @client.event - async def on_message(message): - if message.content.startswith('$thumb'): - channel = message.channel - await channel.send('Send me that \N{THUMBS UP SIGN} reaction, mate') - - def check(reaction, user): - return user == message.author and str(reaction.emoji) == '\N{THUMBS UP SIGN}' - - try: - reaction, user = await client.wait_for('reaction_add', timeout=60.0, check=check) - except asyncio.TimeoutError: - await channel.send('\N{THUMBS DOWN SIGN}') - else: - await channel.send('\N{THUMBS UP SIGN}') - - .. versionchanged:: 2.0 - - ``event`` parameter is now positional-only. - - - Parameters - ------------ - event: :class:`str` - The event name, similar to the :ref:`event reference `, - but without the ``on_`` prefix, to wait for. - check: Optional[Callable[..., :class:`bool`]] - A predicate to check what to wait for. The arguments must meet the - parameters of the event being waited for. - timeout: Optional[:class:`float`] - The number of seconds to wait before timing out and raising - :exc:`asyncio.TimeoutError`. - - Raises - ------- - asyncio.TimeoutError - If a timeout is provided and it was reached. - - Returns - -------- - Any - Returns no arguments, a single argument, or a :class:`tuple` of multiple - arguments that mirrors the parameters passed in the - :ref:`event reference `. - """ - - future = self.loop.create_future() - if check is None: - - def _check(*args): - return True - - check = _check - - ev = event.lower() - try: - listeners = self._listeners[ev] - except KeyError: - listeners = [] - self._listeners[ev] = listeners - - listeners.append((future, check)) - return asyncio.wait_for(future, timeout) - - # event registration - - def event(self, coro: CoroT, /) -> CoroT: - """A decorator that registers an event to listen to. - - You can find more info about the events on the :ref:`documentation below `. - - The events must be a :ref:`coroutine `, if not, :exc:`TypeError` is raised. - - Example - --------- - - .. code-block:: python3 - - @client.event - async def on_ready(): - print('Ready!') - - .. versionchanged:: 2.0 - - ``coro`` parameter is now positional-only. - - Raises - -------- - TypeError - The coroutine passed is not actually a coroutine. - """ - - if not asyncio.iscoroutinefunction(coro): - raise TypeError('event registered must be a coroutine function') - - setattr(self, coro.__name__, coro) - _log.debug('%s has successfully been registered as an event', coro.__name__) - return coro - - async def change_presence( - self, - *, - activity: Optional[BaseActivity] = None, - status: Optional[Status] = None, - ) -> None: - """|coro| - - Changes the client's presence. - - Example - --------- - - .. code-block:: python3 - - game = discord.Game("with the API") - await client.change_presence(status=discord.Status.idle, activity=game) - - .. versionchanged:: 2.0 - Removed the ``afk`` keyword-only parameter. - - .. versionchanged:: 2.0 - This function will now raise :exc:`TypeError` instead of - ``InvalidArgument``. - - Parameters - ---------- - activity: Optional[:class:`.BaseActivity`] - The activity being done. ``None`` if no currently active activity is done. - status: Optional[:class:`.Status`] - Indicates what status to change to. If ``None``, then - :attr:`.Status.online` is used. - - Raises - ------ - TypeError - If the ``activity`` parameter is not the proper type. - """ - - if status is None: - status_str = 'online' - status = Status.online - elif status is Status.offline: - status_str = 'invisible' - status = Status.offline - else: - status_str = str(status) - - await self.ws.change_presence(activity=activity, status=status_str) - - for guild in self._connection.guilds: - me = guild.me - if me is None: - continue - - if activity is not None: - me.activities = (activity,) # type: ignore # Type checker does not understand the downcast here - else: - me.activities = () - - me.status = status - - # Guild stuff - - async def fetch_guilds( - self, - *, - limit: Optional[int] = 200, - before: Optional[SnowflakeTime] = None, - after: Optional[SnowflakeTime] = None, - with_counts: bool = True, - ) -> AsyncIterator[Guild]: - """Retrieves an :term:`asynchronous iterator` that enables receiving your guilds. - - .. note:: - - Using this, you will only receive :attr:`.Guild.owner`, :attr:`.Guild.icon`, - :attr:`.Guild.id`, :attr:`.Guild.name`, :attr:`.Guild.approximate_member_count`, - and :attr:`.Guild.approximate_presence_count` per :class:`.Guild`. - - .. note:: - - This method is an API call. For general usage, consider :attr:`guilds` instead. - - Examples - --------- - - Usage :: - - async for guild in client.fetch_guilds(limit=150): - print(guild.name) - - Flattening into a list :: - - guilds = [guild async for guild in client.fetch_guilds(limit=150)] - # guilds is now a list of Guild... - - All parameters are optional. - - Parameters - ----------- - limit: Optional[:class:`int`] - The number of guilds to retrieve. - If ``None``, it retrieves every guild you have access to. Note, however, - that this would make it a slow operation. - Defaults to ``200``. - - .. versionchanged:: 2.0 - - The default has been changed to 200. - - before: Union[:class:`.abc.Snowflake`, :class:`datetime.datetime`] - Retrieves guilds before this date or object. - If a datetime is provided, it is recommended to use a UTC aware datetime. - If the datetime is naive, it is assumed to be local time. - after: Union[:class:`.abc.Snowflake`, :class:`datetime.datetime`] - Retrieve guilds after this date or object. - If a datetime is provided, it is recommended to use a UTC aware datetime. - If the datetime is naive, it is assumed to be local time. - with_counts: :class:`bool` - Whether to include count information in the guilds. This fills the - :attr:`.Guild.approximate_member_count` and :attr:`.Guild.approximate_presence_count` - attributes without needing any privileged intents. Defaults to ``True``. - - .. versionadded:: 2.3 - - Raises - ------ - HTTPException - Getting the guilds failed. - - Yields - -------- - :class:`.Guild` - The guild with the guild data parsed. - """ - - async def _before_strategy(retrieve: int, before: Optional[Snowflake], limit: Optional[int]): - before_id = before.id if before else None - data = await self.http.get_guilds(retrieve, before=before_id, with_counts=with_counts) - - if data: - if limit is not None: - limit -= len(data) - - before = Object(id=int(data[0]['id'])) - - return data, before, limit - - async def _after_strategy(retrieve: int, after: Optional[Snowflake], limit: Optional[int]): - after_id = after.id if after else None - data = await self.http.get_guilds(retrieve, after=after_id, with_counts=with_counts) - - if data: - if limit is not None: - limit -= len(data) - - after = Object(id=int(data[-1]['id'])) - - return data, after, limit - - if isinstance(before, datetime.datetime): - before = Object(id=time_snowflake(before, high=False)) - if isinstance(after, datetime.datetime): - after = Object(id=time_snowflake(after, high=True)) - - predicate: Optional[Callable[[GuildPayload], bool]] = None - strategy, state = _after_strategy, after - - if before: - strategy, state = _before_strategy, before - - if before and after: - predicate = lambda m: int(m['id']) > after.id - - while True: - retrieve = 200 if limit is None else min(limit, 200) - if retrieve < 1: - return - - data, state, limit = await strategy(retrieve, state, limit) - - if predicate: - data = filter(predicate, data) - - count = 0 - - for count, raw_guild in enumerate(data, 1): - yield Guild(state=self._connection, data=raw_guild) - - if count < 200: - # There's no data left after this - break - - async def fetch_template(self, code: Union[Template, str]) -> Template: - """|coro| - - Gets a :class:`.Template` from a discord.new URL or code. - - Parameters - ----------- - code: Union[:class:`.Template`, :class:`str`] - The Discord Template Code or URL (must be a discord.new URL). - - Raises - ------- - NotFound - The template is invalid. - HTTPException - Getting the template failed. - - Returns - -------- - :class:`.Template` - The template from the URL/code. - """ - code = utils.resolve_template(code) - data = await self.http.get_template(code) - return Template(data=data, state=self._connection) - - async def fetch_guild(self, guild_id: int, /, *, with_counts: bool = True) -> Guild: - """|coro| - - Retrieves a :class:`.Guild` from an ID. - - .. note:: - - Using this, you will **not** receive :attr:`.Guild.channels`, :attr:`.Guild.members`, - :attr:`.Member.activity` and :attr:`.Member.voice` per :class:`.Member`. - - .. note:: - - This method is an API call. For general usage, consider :meth:`get_guild` instead. - - .. versionchanged:: 2.0 - - ``guild_id`` parameter is now positional-only. - - - Parameters - ----------- - guild_id: :class:`int` - The guild's ID to fetch from. - with_counts: :class:`bool` - Whether to include count information in the guild. This fills the - :attr:`.Guild.approximate_member_count` and :attr:`.Guild.approximate_presence_count` - attributes without needing any privileged intents. Defaults to ``True``. - - .. versionadded:: 2.0 - - Raises - ------ - Forbidden - You do not have access to the guild. - HTTPException - Getting the guild failed. - - Returns - -------- - :class:`.Guild` - The guild from the ID. - """ - data = await self.http.get_guild(guild_id, with_counts=with_counts) - return Guild(data=data, state=self._connection) - - async def create_guild( - self, - *, - name: str, - icon: bytes = MISSING, - code: str = MISSING, - ) -> Guild: - """|coro| - - Creates a :class:`.Guild`. - - Bot accounts in more than 10 guilds are not allowed to create guilds. - - .. versionchanged:: 2.0 - ``name`` and ``icon`` parameters are now keyword-only. The ``region`` parameter has been removed. - - .. versionchanged:: 2.0 - This function will now raise :exc:`ValueError` instead of - ``InvalidArgument``. - - Parameters - ---------- - name: :class:`str` - The name of the guild. - icon: Optional[:class:`bytes`] - The :term:`py:bytes-like object` representing the icon. See :meth:`.ClientUser.edit` - for more details on what is expected. - code: :class:`str` - The code for a template to create the guild with. - - .. versionadded:: 1.4 - - Raises - ------ - HTTPException - Guild creation failed. - ValueError - Invalid icon image format given. Must be PNG or JPG. - - Returns - ------- - :class:`.Guild` - The guild created. This is not the same guild that is - added to cache. - """ - if icon is not MISSING: - icon_base64 = utils._bytes_to_base64_data(icon) - else: - icon_base64 = None - - if code: - data = await self.http.create_from_template(code, name, icon_base64) - else: - data = await self.http.create_guild(name, icon_base64) - return Guild(data=data, state=self._connection) - - async def fetch_stage_instance(self, channel_id: int, /) -> StageInstance: - """|coro| - - Gets a :class:`.StageInstance` for a stage channel id. - - .. versionadded:: 2.0 - - Parameters - ----------- - channel_id: :class:`int` - The stage channel ID. - - Raises - ------- - NotFound - The stage instance or channel could not be found. - HTTPException - Getting the stage instance failed. - - Returns - -------- - :class:`.StageInstance` - The stage instance from the stage channel ID. - """ - data = await self.http.get_stage_instance(channel_id) - guild = self.get_guild(int(data['guild_id'])) - # Guild can technically be None here but this is being explicitly silenced right now. - return StageInstance(guild=guild, state=self._connection, data=data) # type: ignore - - # Invite management - - async def fetch_invite( - self, - url: Union[Invite, str], - *, - with_counts: bool = True, - with_expiration: bool = True, - scheduled_event_id: Optional[int] = None, - ) -> Invite: - """|coro| - - Gets an :class:`.Invite` from a discord.gg URL or ID. - - .. note:: - - If the invite is for a guild you have not joined, the guild and channel - attributes of the returned :class:`.Invite` will be :class:`.PartialInviteGuild` and - :class:`.PartialInviteChannel` respectively. - - Parameters - ----------- - url: Union[:class:`.Invite`, :class:`str`] - The Discord invite ID or URL (must be a discord.gg URL). - with_counts: :class:`bool` - Whether to include count information in the invite. This fills the - :attr:`.Invite.approximate_member_count` and :attr:`.Invite.approximate_presence_count` - fields. - with_expiration: :class:`bool` - Whether to include the expiration date of the invite. This fills the - :attr:`.Invite.expires_at` field. - - .. versionadded:: 2.0 - scheduled_event_id: Optional[:class:`int`] - The ID of the scheduled event this invite is for. - - .. note:: - - It is not possible to provide a url that contains an ``event_id`` parameter - when using this parameter. - - .. versionadded:: 2.0 - - Raises - ------- - ValueError - The url contains an ``event_id``, but ``scheduled_event_id`` has also been provided. - NotFound - The invite has expired or is invalid. - HTTPException - Getting the invite failed. - - Returns - -------- - :class:`.Invite` - The invite from the URL/ID. - """ - - resolved = utils.resolve_invite(url) - - if scheduled_event_id and resolved.event: - raise ValueError('Cannot specify scheduled_event_id and contain an event_id in the url.') - - scheduled_event_id = scheduled_event_id or resolved.event - - data = await self.http.get_invite( - resolved.code, - with_counts=with_counts, - with_expiration=with_expiration, - guild_scheduled_event_id=scheduled_event_id, - ) - return Invite.from_incomplete(state=self._connection, data=data) - - async def delete_invite(self, invite: Union[Invite, str], /) -> None: - """|coro| - - Revokes an :class:`.Invite`, URL, or ID to an invite. - - You must have :attr:`~.Permissions.manage_channels` in - the associated guild to do this. - - .. versionchanged:: 2.0 - - ``invite`` parameter is now positional-only. - - Parameters - ---------- - invite: Union[:class:`.Invite`, :class:`str`] - The invite to revoke. - - Raises - ------- - Forbidden - You do not have permissions to revoke invites. - NotFound - The invite is invalid or expired. - HTTPException - Revoking the invite failed. - """ - - resolved = utils.resolve_invite(invite) - await self.http.delete_invite(resolved.code) - - # Miscellaneous stuff - - async def fetch_widget(self, guild_id: int, /) -> Widget: - """|coro| - - Gets a :class:`.Widget` from a guild ID. - - .. note:: - - The guild must have the widget enabled to get this information. - - .. versionchanged:: 2.0 - - ``guild_id`` parameter is now positional-only. - - Parameters - ----------- - guild_id: :class:`int` - The ID of the guild. - - Raises - ------- - Forbidden - The widget for this guild is disabled. - HTTPException - Retrieving the widget failed. - - Returns - -------- - :class:`.Widget` - The guild's widget. - """ - data = await self.http.get_widget(guild_id) - - return Widget(state=self._connection, data=data) - - async def application_info(self) -> AppInfo: - """|coro| - - Retrieves the bot's application information. - - Raises - ------- - HTTPException - Retrieving the information failed somehow. - - Returns - -------- - :class:`.AppInfo` - The bot's application information. - """ - data = await self.http.application_info() - return AppInfo(self._connection, data) - - async def fetch_user(self, user_id: int, /) -> User: - """|coro| - - Retrieves a :class:`~discord.User` based on their ID. - You do not have to share any guilds with the user to get this information, - however many operations do require that you do. - - .. note:: - - This method is an API call. If you have :attr:`discord.Intents.members` and member cache enabled, consider :meth:`get_user` instead. - - .. versionchanged:: 2.0 - - ``user_id`` parameter is now positional-only. - - Parameters - ----------- - user_id: :class:`int` - The user's ID to fetch from. - - Raises - ------- - NotFound - A user with this ID does not exist. - HTTPException - Fetching the user failed. - - Returns - -------- - :class:`~discord.User` - The user you requested. - """ - data = await self.http.get_user(user_id) - return User(state=self._connection, data=data) - - async def fetch_channel(self, channel_id: int, /) -> Union[GuildChannel, PrivateChannel, Thread]: - """|coro| - - Retrieves a :class:`.abc.GuildChannel`, :class:`.abc.PrivateChannel`, or :class:`.Thread` with the specified ID. - - .. note:: - - This method is an API call. For general usage, consider :meth:`get_channel` instead. - - .. versionadded:: 1.2 - - .. versionchanged:: 2.0 - - ``channel_id`` parameter is now positional-only. - - Raises - ------- - InvalidData - An unknown channel type was received from Discord. - HTTPException - Retrieving the channel failed. - NotFound - Invalid Channel ID. - Forbidden - You do not have permission to fetch this channel. - - Returns - -------- - Union[:class:`.abc.GuildChannel`, :class:`.abc.PrivateChannel`, :class:`.Thread`] - The channel from the ID. - """ - data = await self.http.get_channel(channel_id) - - factory, ch_type = _threaded_channel_factory(data['type']) - if factory is None: - raise InvalidData('Unknown channel type {type} for channel ID {id}.'.format_map(data)) - - if ch_type in (ChannelType.group, ChannelType.private): - # the factory will be a DMChannel or GroupChannel here - channel = factory(me=self.user, data=data, state=self._connection) # type: ignore - else: - # the factory can't be a DMChannel or GroupChannel here - guild_id = int(data['guild_id']) # type: ignore - guild = self._connection._get_or_create_unavailable_guild(guild_id) - # the factory should be a GuildChannel or Thread - channel = factory(guild=guild, state=self._connection, data=data) # type: ignore - - return channel - - async def fetch_webhook(self, webhook_id: int, /) -> Webhook: - """|coro| - - Retrieves a :class:`.Webhook` with the specified ID. - - .. versionchanged:: 2.0 - - ``webhook_id`` parameter is now positional-only. - - Raises - -------- - HTTPException - Retrieving the webhook failed. - NotFound - Invalid webhook ID. - Forbidden - You do not have permission to fetch this webhook. - - Returns - --------- - :class:`.Webhook` - The webhook you requested. - """ - data = await self.http.get_webhook(webhook_id) - return Webhook.from_state(data, state=self._connection) - - async def fetch_sticker(self, sticker_id: int, /) -> Union[StandardSticker, GuildSticker]: - """|coro| - - Retrieves a :class:`.Sticker` with the specified ID. - - .. versionadded:: 2.0 - - Raises - -------- - HTTPException - Retrieving the sticker failed. - NotFound - Invalid sticker ID. - - Returns - -------- - Union[:class:`.StandardSticker`, :class:`.GuildSticker`] - The sticker you requested. - """ - data = await self.http.get_sticker(sticker_id) - cls, _ = _sticker_factory(data['type']) - # The type checker is not smart enough to figure out the constructor is correct - return cls(state=self._connection, data=data) # type: ignore - - async def fetch_premium_sticker_packs(self) -> List[StickerPack]: - """|coro| - - Retrieves all available premium sticker packs. - - .. versionadded:: 2.0 - - Raises - ------- - HTTPException - Retrieving the sticker packs failed. - - Returns - --------- - List[:class:`.StickerPack`] - All available premium sticker packs. - """ - data = await self.http.list_premium_sticker_packs() - return [StickerPack(state=self._connection, data=pack) for pack in data['sticker_packs']] - - async def create_dm(self, user: Snowflake) -> DMChannel: - """|coro| - - Creates a :class:`.DMChannel` with this user. - - This should be rarely called, as this is done transparently for most - people. - - .. versionadded:: 2.0 - - Parameters - ----------- - user: :class:`~discord.abc.Snowflake` - The user to create a DM with. - - Returns - ------- - :class:`.DMChannel` - The channel that was created. - """ - state = self._connection - found = state._get_private_channel_by_user(user.id) - if found: - return found - - data = await state.http.start_private_message(user.id) - return state.add_dm_channel(data) - - def add_view(self, view: View, *, message_id: Optional[int] = None) -> None: - """Registers a :class:`~discord.ui.View` for persistent listening. - - This method should be used for when a view is comprised of components - that last longer than the lifecycle of the program. - - .. versionadded:: 2.0 - - Parameters - ------------ - view: :class:`discord.ui.View` - The view to register for dispatching. - message_id: Optional[:class:`int`] - The message ID that the view is attached to. This is currently used to - refresh the view's state during message update events. If not given - then message update events are not propagated for the view. - - Raises - ------- - TypeError - A view was not passed. - ValueError - The view is not persistent or is already finished. A persistent view has no timeout - and all their components have an explicitly provided custom_id. - """ - - if not isinstance(view, View): - raise TypeError(f'expected an instance of View not {view.__class__.__name__}') - - if not view.is_persistent(): - raise ValueError('View is not persistent. Items need to have a custom_id set and View must have no timeout') - - if view.is_finished(): - raise ValueError('View is already finished.') - - self._connection.store_view(view, message_id) - - @property - def persistent_views(self) -> Sequence[View]: - """Sequence[:class:`.View`]: A sequence of persistent views added to the client. - - .. versionadded:: 2.0 - """ - return self._connection.persistent_views diff --git a/.venv/Lib/site-packages/discord/colour.py b/.venv/Lib/site-packages/discord/colour.py deleted file mode 100644 index e640f9d..0000000 --- a/.venv/Lib/site-packages/discord/colour.py +++ /dev/null @@ -1,523 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" -from __future__ import annotations - -import colorsys -import random -import re - -from typing import TYPE_CHECKING, Optional, Tuple, Union - -if TYPE_CHECKING: - from typing_extensions import Self - -__all__ = ( - 'Colour', - 'Color', -) - -RGB_REGEX = re.compile(r'rgb\s*\((?P[0-9.]+%?)\s*,\s*(?P[0-9.]+%?)\s*,\s*(?P[0-9.]+%?)\s*\)') - - -def parse_hex_number(argument: str) -> Colour: - arg = ''.join(i * 2 for i in argument) if len(argument) == 3 else argument - try: - value = int(arg, base=16) - if not (0 <= value <= 0xFFFFFF): - raise ValueError('hex number out of range for 24-bit colour') - except ValueError: - raise ValueError('invalid hex digit given') from None - else: - return Color(value=value) - - -def parse_rgb_number(number: str) -> int: - if number[-1] == '%': - value = float(number[:-1]) - if not (0 <= value <= 100): - raise ValueError('rgb percentage can only be between 0 to 100') - return round(255 * (value / 100)) - - value = int(number) - if not (0 <= value <= 255): - raise ValueError('rgb number can only be between 0 to 255') - return value - - -def parse_rgb(argument: str, *, regex: re.Pattern[str] = RGB_REGEX) -> Colour: - match = regex.match(argument) - if match is None: - raise ValueError('invalid rgb syntax found') - - red = parse_rgb_number(match.group('r')) - green = parse_rgb_number(match.group('g')) - blue = parse_rgb_number(match.group('b')) - return Color.from_rgb(red, green, blue) - - -class Colour: - """Represents a Discord role colour. This class is similar - to a (red, green, blue) :class:`tuple`. - - There is an alias for this called Color. - - .. container:: operations - - .. describe:: x == y - - Checks if two colours are equal. - - .. describe:: x != y - - Checks if two colours are not equal. - - .. describe:: hash(x) - - Return the colour's hash. - - .. describe:: str(x) - - Returns the hex format for the colour. - - .. describe:: int(x) - - Returns the raw colour value. - - .. note:: - - The colour values in the classmethods are mostly provided as-is and can change between - versions should the Discord client's representation of that colour also change. - - Attributes - ------------ - value: :class:`int` - The raw integer colour value. - """ - - __slots__ = ('value',) - - def __init__(self, value: int): - if not isinstance(value, int): - raise TypeError(f'Expected int parameter, received {value.__class__.__name__} instead.') - - self.value: int = value - - def _get_byte(self, byte: int) -> int: - return (self.value >> (8 * byte)) & 0xFF - - def __eq__(self, other: object) -> bool: - return isinstance(other, Colour) and self.value == other.value - - def __ne__(self, other: object) -> bool: - return not self.__eq__(other) - - def __str__(self) -> str: - return f'#{self.value:0>6x}' - - def __int__(self) -> int: - return self.value - - def __repr__(self) -> str: - return f'' - - def __hash__(self) -> int: - return hash(self.value) - - @property - def r(self) -> int: - """:class:`int`: Returns the red component of the colour.""" - return self._get_byte(2) - - @property - def g(self) -> int: - """:class:`int`: Returns the green component of the colour.""" - return self._get_byte(1) - - @property - def b(self) -> int: - """:class:`int`: Returns the blue component of the colour.""" - return self._get_byte(0) - - def to_rgb(self) -> Tuple[int, int, int]: - """Tuple[:class:`int`, :class:`int`, :class:`int`]: Returns an (r, g, b) tuple representing the colour.""" - return (self.r, self.g, self.b) - - @classmethod - def from_rgb(cls, r: int, g: int, b: int) -> Self: - """Constructs a :class:`Colour` from an RGB tuple.""" - return cls((r << 16) + (g << 8) + b) - - @classmethod - def from_hsv(cls, h: float, s: float, v: float) -> Self: - """Constructs a :class:`Colour` from an HSV tuple.""" - rgb = colorsys.hsv_to_rgb(h, s, v) - return cls.from_rgb(*(int(x * 255) for x in rgb)) - - @classmethod - def from_str(cls, value: str) -> Self: - """Constructs a :class:`Colour` from a string. - - The following formats are accepted: - - - ``0x`` - - ``#`` - - ``0x#`` - - ``rgb(, , )`` - - Like CSS, ```` can be either 0-255 or 0-100% and ```` can be - either a 6 digit hex number or a 3 digit hex shortcut (e.g. #FFF). - - .. versionadded:: 2.0 - - Raises - ------- - ValueError - The string could not be converted into a colour. - """ - - if value[0] == '#': - return parse_hex_number(value[1:]) - - if value[0:2] == '0x': - rest = value[2:] - # Legacy backwards compatible syntax - if rest.startswith('#'): - return parse_hex_number(rest[1:]) - return parse_hex_number(rest) - - arg = value.lower() - if arg[0:3] == 'rgb': - return parse_rgb(arg) - - raise ValueError('unknown colour format given') - - @classmethod - def default(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0``. - - .. colour:: #000000 - """ - return cls(0) - - @classmethod - def random(cls, *, seed: Optional[Union[int, str, float, bytes, bytearray]] = None) -> Self: - """A factory method that returns a :class:`Colour` with a random hue. - - .. note:: - - The random algorithm works by choosing a colour with a random hue but - with maxed out saturation and value. - - .. versionadded:: 1.6 - - Parameters - ------------ - seed: Optional[Union[:class:`int`, :class:`str`, :class:`float`, :class:`bytes`, :class:`bytearray`]] - The seed to initialize the RNG with. If ``None`` is passed the default RNG is used. - - .. versionadded:: 1.7 - """ - rand = random if seed is None else random.Random(seed) - return cls.from_hsv(rand.random(), 1, 1) - - @classmethod - def teal(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x1ABC9C``. - - .. colour:: #1ABC9C - """ - return cls(0x1ABC9C) - - @classmethod - def dark_teal(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x11806A``. - - .. colour:: #11806A - """ - return cls(0x11806A) - - @classmethod - def brand_green(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x57F287``. - - .. colour:: #57F287 - - - .. versionadded:: 2.0 - """ - return cls(0x57F287) - - @classmethod - def green(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x2ECC71``. - - .. colour:: #2ECC71 - """ - return cls(0x2ECC71) - - @classmethod - def dark_green(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x1F8B4C``. - - .. colour:: #1F8B4C - """ - return cls(0x1F8B4C) - - @classmethod - def blue(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x3498DB``. - - .. colour:: #3498DB - """ - return cls(0x3498DB) - - @classmethod - def dark_blue(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x206694``. - - .. colour:: #206694 - """ - return cls(0x206694) - - @classmethod - def purple(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x9B59B6``. - - .. colour:: #9B59B6 - """ - return cls(0x9B59B6) - - @classmethod - def dark_purple(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x71368A``. - - .. colour:: #71368A - """ - return cls(0x71368A) - - @classmethod - def magenta(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0xE91E63``. - - .. colour:: #E91E63 - """ - return cls(0xE91E63) - - @classmethod - def dark_magenta(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0xAD1457``. - - .. colour:: #AD1457 - """ - return cls(0xAD1457) - - @classmethod - def gold(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0xF1C40F``. - - .. colour:: #F1C40F - """ - return cls(0xF1C40F) - - @classmethod - def dark_gold(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0xC27C0E``. - - .. colour:: #C27C0E - """ - return cls(0xC27C0E) - - @classmethod - def orange(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0xE67E22``. - - .. colour:: #E67E22 - """ - return cls(0xE67E22) - - @classmethod - def dark_orange(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0xA84300``. - - .. colour:: #A84300 - """ - return cls(0xA84300) - - @classmethod - def brand_red(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0xED4245``. - - .. colour:: #ED4245 - - .. versionadded:: 2.0 - """ - return cls(0xED4245) - - @classmethod - def red(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0xE74C3C``. - - .. colour:: #E74C3C - """ - return cls(0xE74C3C) - - @classmethod - def dark_red(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x992D22``. - - .. colour:: #992D22 - """ - return cls(0x992D22) - - @classmethod - def lighter_grey(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x95A5A6``. - - .. colour:: #95A5A6 - """ - return cls(0x95A5A6) - - lighter_gray = lighter_grey - - @classmethod - def dark_grey(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x607d8b``. - - .. colour:: #607d8b - """ - return cls(0x607D8B) - - dark_gray = dark_grey - - @classmethod - def light_grey(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x979C9F``. - - .. colour:: #979C9F - """ - return cls(0x979C9F) - - light_gray = light_grey - - @classmethod - def darker_grey(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x546E7A``. - - .. colour:: #546E7A - """ - return cls(0x546E7A) - - darker_gray = darker_grey - - @classmethod - def og_blurple(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x7289DA``. - - .. colour:: #7289DA - """ - return cls(0x7289DA) - - @classmethod - def blurple(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x5865F2``. - - .. colour:: #5865F2 - """ - return cls(0x5865F2) - - @classmethod - def greyple(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x99AAB5``. - - .. colour:: #99AAB5 - """ - return cls(0x99AAB5) - - @classmethod - def dark_theme(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x313338``. - - This will appear transparent on Discord's dark theme. - - .. colour:: #313338 - - .. versionadded:: 1.5 - - .. versionchanged:: 2.2 - Updated colour from previous ``0x36393F`` to reflect discord theme changes. - """ - return cls(0x313338) - - @classmethod - def fuchsia(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0xEB459E``. - - .. colour:: #EB459E - - .. versionadded:: 2.0 - """ - return cls(0xEB459E) - - @classmethod - def yellow(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0xFEE75C``. - - .. colour:: #FEE75C - - .. versionadded:: 2.0 - """ - return cls(0xFEE75C) - - @classmethod - def dark_embed(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x2B2D31``. - - .. colour:: #2B2D31 - - .. versionadded:: 2.2 - """ - return cls(0x2B2D31) - - @classmethod - def light_embed(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0xEEEFF1``. - - .. colour:: #EEEFF1 - - .. versionadded:: 2.2 - """ - return cls(0xEEEFF1) - - @classmethod - def pink(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0xEB459F``. - - .. colour:: #EB459F - - .. versionadded:: 2.3 - """ - return cls(0xEB459F) - - -Color = Colour diff --git a/.venv/Lib/site-packages/discord/components.py b/.venv/Lib/site-packages/discord/components.py deleted file mode 100644 index 5c3679b..0000000 --- a/.venv/Lib/site-packages/discord/components.py +++ /dev/null @@ -1,533 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -from typing import ClassVar, List, Literal, Optional, TYPE_CHECKING, Tuple, Union, overload -from .enums import try_enum, ComponentType, ButtonStyle, TextStyle, ChannelType -from .utils import get_slots, MISSING -from .partial_emoji import PartialEmoji, _EmojiTag - -if TYPE_CHECKING: - from typing_extensions import Self - - from .types.components import ( - Component as ComponentPayload, - ButtonComponent as ButtonComponentPayload, - SelectMenu as SelectMenuPayload, - SelectOption as SelectOptionPayload, - ActionRow as ActionRowPayload, - TextInput as TextInputPayload, - ActionRowChildComponent as ActionRowChildComponentPayload, - ) - from .emoji import Emoji - - ActionRowChildComponentType = Union['Button', 'SelectMenu', 'TextInput'] - - -__all__ = ( - 'Component', - 'ActionRow', - 'Button', - 'SelectMenu', - 'SelectOption', - 'TextInput', -) - - -class Component: - """Represents a Discord Bot UI Kit Component. - - Currently, the only components supported by Discord are: - - - :class:`ActionRow` - - :class:`Button` - - :class:`SelectMenu` - - :class:`TextInput` - - This class is abstract and cannot be instantiated. - - .. versionadded:: 2.0 - """ - - __slots__: Tuple[str, ...] = () - - __repr_info__: ClassVar[Tuple[str, ...]] - - def __repr__(self) -> str: - attrs = ' '.join(f'{key}={getattr(self, key)!r}' for key in self.__repr_info__) - return f'<{self.__class__.__name__} {attrs}>' - - @property - def type(self) -> ComponentType: - """:class:`ComponentType`: The type of component.""" - raise NotImplementedError - - @classmethod - def _raw_construct(cls, **kwargs) -> Self: - self = cls.__new__(cls) - for slot in get_slots(cls): - try: - value = kwargs[slot] - except KeyError: - pass - else: - setattr(self, slot, value) - return self - - def to_dict(self) -> ComponentPayload: - raise NotImplementedError - - -class ActionRow(Component): - """Represents a Discord Bot UI Kit Action Row. - - This is a component that holds up to 5 children components in a row. - - This inherits from :class:`Component`. - - .. versionadded:: 2.0 - - Attributes - ------------ - children: List[Union[:class:`Button`, :class:`SelectMenu`, :class:`TextInput`]] - The children components that this holds, if any. - """ - - __slots__: Tuple[str, ...] = ('children',) - - __repr_info__: ClassVar[Tuple[str, ...]] = __slots__ - - def __init__(self, data: ActionRowPayload, /) -> None: - self.children: List[ActionRowChildComponentType] = [] - - for component_data in data.get('components', []): - component = _component_factory(component_data) - - if component is not None: - self.children.append(component) - - @property - def type(self) -> Literal[ComponentType.action_row]: - """:class:`ComponentType`: The type of component.""" - return ComponentType.action_row - - def to_dict(self) -> ActionRowPayload: - return { - 'type': self.type.value, - 'components': [child.to_dict() for child in self.children], - } - - -class Button(Component): - """Represents a button from the Discord Bot UI Kit. - - This inherits from :class:`Component`. - - .. note:: - - The user constructible and usable type to create a button is :class:`discord.ui.Button` - not this one. - - .. versionadded:: 2.0 - - Attributes - ----------- - style: :class:`.ButtonStyle` - The style of the button. - custom_id: Optional[:class:`str`] - The ID of the button that gets received during an interaction. - If this button is for a URL, it does not have a custom ID. - url: Optional[:class:`str`] - The URL this button sends you to. - disabled: :class:`bool` - Whether the button is disabled or not. - label: Optional[:class:`str`] - The label of the button, if any. - emoji: Optional[:class:`PartialEmoji`] - The emoji of the button, if available. - """ - - __slots__: Tuple[str, ...] = ( - 'style', - 'custom_id', - 'url', - 'disabled', - 'label', - 'emoji', - ) - - __repr_info__: ClassVar[Tuple[str, ...]] = __slots__ - - def __init__(self, data: ButtonComponentPayload, /) -> None: - self.style: ButtonStyle = try_enum(ButtonStyle, data['style']) - self.custom_id: Optional[str] = data.get('custom_id') - self.url: Optional[str] = data.get('url') - self.disabled: bool = data.get('disabled', False) - self.label: Optional[str] = data.get('label') - self.emoji: Optional[PartialEmoji] - try: - self.emoji = PartialEmoji.from_dict(data['emoji']) - except KeyError: - self.emoji = None - - @property - def type(self) -> Literal[ComponentType.button]: - """:class:`ComponentType`: The type of component.""" - return ComponentType.button - - def to_dict(self) -> ButtonComponentPayload: - payload: ButtonComponentPayload = { - 'type': 2, - 'style': self.style.value, - 'disabled': self.disabled, - } - - if self.label: - payload['label'] = self.label - - if self.custom_id: - payload['custom_id'] = self.custom_id - - if self.url: - payload['url'] = self.url - - if self.emoji: - payload['emoji'] = self.emoji.to_dict() - - return payload - - -class SelectMenu(Component): - """Represents a select menu from the Discord Bot UI Kit. - - A select menu is functionally the same as a dropdown, however - on mobile it renders a bit differently. - - .. note:: - - The user constructible and usable type to create a select menu is - :class:`discord.ui.Select` not this one. - - .. versionadded:: 2.0 - - Attributes - ------------ - type: :class:`ComponentType` - The type of component. - custom_id: Optional[:class:`str`] - The ID of the select menu that gets received during an interaction. - placeholder: Optional[:class:`str`] - The placeholder text that is shown if nothing is selected, if any. - min_values: :class:`int` - The minimum number of items that must be chosen for this select menu. - Defaults to 1 and must be between 0 and 25. - max_values: :class:`int` - The maximum number of items that must be chosen for this select menu. - Defaults to 1 and must be between 1 and 25. - options: List[:class:`SelectOption`] - A list of options that can be selected in this menu. - disabled: :class:`bool` - Whether the select is disabled or not. - channel_types: List[:class:`.ChannelType`] - A list of channel types that are allowed to be chosen in this select menu. - """ - - __slots__: Tuple[str, ...] = ( - 'type', - 'custom_id', - 'placeholder', - 'min_values', - 'max_values', - 'options', - 'disabled', - 'channel_types', - ) - - __repr_info__: ClassVar[Tuple[str, ...]] = __slots__ - - def __init__(self, data: SelectMenuPayload, /) -> None: - self.type: ComponentType = try_enum(ComponentType, data['type']) - self.custom_id: str = data['custom_id'] - self.placeholder: Optional[str] = data.get('placeholder') - self.min_values: int = data.get('min_values', 1) - self.max_values: int = data.get('max_values', 1) - self.options: List[SelectOption] = [SelectOption.from_dict(option) for option in data.get('options', [])] - self.disabled: bool = data.get('disabled', False) - self.channel_types: List[ChannelType] = [try_enum(ChannelType, t) for t in data.get('channel_types', [])] - - def to_dict(self) -> SelectMenuPayload: - payload: SelectMenuPayload = { - 'type': self.type.value, - 'custom_id': self.custom_id, - 'min_values': self.min_values, - 'max_values': self.max_values, - 'disabled': self.disabled, - } - if self.placeholder: - payload['placeholder'] = self.placeholder - if self.options: - payload['options'] = [op.to_dict() for op in self.options] - if self.channel_types: - payload['channel_types'] = [t.value for t in self.channel_types] - - return payload - - -class SelectOption: - """Represents a select menu's option. - - These can be created by users. - - .. versionadded:: 2.0 - - Parameters - ----------- - label: :class:`str` - The label of the option. This is displayed to users. - Can only be up to 100 characters. - value: :class:`str` - The value of the option. This is not displayed to users. - If not provided when constructed then it defaults to the - label. Can only be up to 100 characters. - description: Optional[:class:`str`] - An additional description of the option, if any. - Can only be up to 100 characters. - emoji: Optional[Union[:class:`str`, :class:`Emoji`, :class:`PartialEmoji`]] - The emoji of the option, if available. - default: :class:`bool` - Whether this option is selected by default. - - Attributes - ----------- - label: :class:`str` - The label of the option. This is displayed to users. - Can only be up to 100 characters. - value: :class:`str` - The value of the option. This is not displayed to users. - If not provided when constructed then it defaults to the - label. Can only be up to 100 characters. - description: Optional[:class:`str`] - An additional description of the option, if any. - Can only be up to 100 characters. - default: :class:`bool` - Whether this option is selected by default. - """ - - __slots__: Tuple[str, ...] = ( - 'label', - 'value', - 'description', - '_emoji', - 'default', - ) - - def __init__( - self, - *, - label: str, - value: str = MISSING, - description: Optional[str] = None, - emoji: Optional[Union[str, Emoji, PartialEmoji]] = None, - default: bool = False, - ) -> None: - self.label: str = label - self.value: str = label if value is MISSING else value - self.description: Optional[str] = description - - self.emoji = emoji - self.default: bool = default - - def __repr__(self) -> str: - return ( - f'' - ) - - def __str__(self) -> str: - if self.emoji: - base = f'{self.emoji} {self.label}' - else: - base = self.label - - if self.description: - return f'{base}\n{self.description}' - return base - - @property - def emoji(self) -> Optional[PartialEmoji]: - """Optional[:class:`.PartialEmoji`]: The emoji of the option, if available.""" - return self._emoji - - @emoji.setter - def emoji(self, value: Optional[Union[str, Emoji, PartialEmoji]]) -> None: - if value is not None: - if isinstance(value, str): - self._emoji = PartialEmoji.from_str(value) - elif isinstance(value, _EmojiTag): - self._emoji = value._to_partial() - else: - raise TypeError(f'expected str, Emoji, or PartialEmoji, received {value.__class__.__name__} instead') - else: - self._emoji = None - - @classmethod - def from_dict(cls, data: SelectOptionPayload) -> SelectOption: - try: - emoji = PartialEmoji.from_dict(data['emoji']) - except KeyError: - emoji = None - - return cls( - label=data['label'], - value=data['value'], - description=data.get('description'), - emoji=emoji, - default=data.get('default', False), - ) - - def to_dict(self) -> SelectOptionPayload: - payload: SelectOptionPayload = { - 'label': self.label, - 'value': self.value, - 'default': self.default, - } - - if self.emoji: - payload['emoji'] = self.emoji.to_dict() - - if self.description: - payload['description'] = self.description - - return payload - - -class TextInput(Component): - """Represents a text input from the Discord Bot UI Kit. - - .. note:: - The user constructible and usable type to create a text input is - :class:`discord.ui.TextInput` not this one. - - .. versionadded:: 2.0 - - Attributes - ------------ - custom_id: Optional[:class:`str`] - The ID of the text input that gets received during an interaction. - label: :class:`str` - The label to display above the text input. - style: :class:`TextStyle` - The style of the text input. - placeholder: Optional[:class:`str`] - The placeholder text to display when the text input is empty. - value: Optional[:class:`str`] - The default value of the text input. - required: :class:`bool` - Whether the text input is required. - min_length: Optional[:class:`int`] - The minimum length of the text input. - max_length: Optional[:class:`int`] - The maximum length of the text input. - """ - - __slots__: Tuple[str, ...] = ( - 'style', - 'label', - 'custom_id', - 'placeholder', - 'value', - 'required', - 'min_length', - 'max_length', - ) - - __repr_info__: ClassVar[Tuple[str, ...]] = __slots__ - - def __init__(self, data: TextInputPayload, /) -> None: - self.style: TextStyle = try_enum(TextStyle, data['style']) - self.label: str = data['label'] - self.custom_id: str = data['custom_id'] - self.placeholder: Optional[str] = data.get('placeholder') - self.value: Optional[str] = data.get('value') - self.required: bool = data.get('required', True) - self.min_length: Optional[int] = data.get('min_length') - self.max_length: Optional[int] = data.get('max_length') - - @property - def type(self) -> Literal[ComponentType.text_input]: - """:class:`ComponentType`: The type of component.""" - return ComponentType.text_input - - def to_dict(self) -> TextInputPayload: - payload: TextInputPayload = { - 'type': self.type.value, - 'style': self.style.value, - 'label': self.label, - 'custom_id': self.custom_id, - 'required': self.required, - } - - if self.placeholder: - payload['placeholder'] = self.placeholder - - if self.value: - payload['value'] = self.value - - if self.min_length: - payload['min_length'] = self.min_length - - if self.max_length: - payload['max_length'] = self.max_length - - return payload - - @property - def default(self) -> Optional[str]: - """Optional[:class:`str`]: The default value of the text input. - - This is an alias to :attr:`value`. - """ - return self.value - - -@overload -def _component_factory(data: ActionRowChildComponentPayload) -> Optional[ActionRowChildComponentType]: - ... - - -@overload -def _component_factory(data: ComponentPayload) -> Optional[Union[ActionRow, ActionRowChildComponentType]]: - ... - - -def _component_factory(data: ComponentPayload) -> Optional[Union[ActionRow, ActionRowChildComponentType]]: - if data['type'] == 1: - return ActionRow(data) - elif data['type'] == 2: - return Button(data) - elif data['type'] == 4: - return TextInput(data) - elif data['type'] in (3, 5, 6, 7, 8): - return SelectMenu(data) diff --git a/.venv/Lib/site-packages/discord/context_managers.py b/.venv/Lib/site-packages/discord/context_managers.py deleted file mode 100644 index 09803c9..0000000 --- a/.venv/Lib/site-packages/discord/context_managers.py +++ /dev/null @@ -1,92 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -import asyncio -from typing import TYPE_CHECKING, Generator, Optional, Type, TypeVar - -if TYPE_CHECKING: - from .abc import Messageable, MessageableChannel - - from types import TracebackType - - BE = TypeVar('BE', bound=BaseException) - -# fmt: off -__all__ = ( - 'Typing', -) -# fmt: on - - -def _typing_done_callback(fut: asyncio.Future) -> None: - # just retrieve any exception and call it a day - try: - fut.exception() - except (asyncio.CancelledError, Exception): - pass - - -class Typing: - def __init__(self, messageable: Messageable) -> None: - self.loop: asyncio.AbstractEventLoop = messageable._state.loop - self.messageable: Messageable = messageable - self.channel: Optional[MessageableChannel] = None - - async def _get_channel(self) -> MessageableChannel: - if self.channel: - return self.channel - - self.channel = channel = await self.messageable._get_channel() - return channel - - async def wrapped_typer(self) -> None: - channel = await self._get_channel() - await channel._state.http.send_typing(channel.id) - - def __await__(self) -> Generator[None, None, None]: - return self.wrapped_typer().__await__() - - async def do_typing(self) -> None: - channel = await self._get_channel() - typing = channel._state.http.send_typing - - while True: - await asyncio.sleep(5) - await typing(channel.id) - - async def __aenter__(self) -> None: - channel = await self._get_channel() - await channel._state.http.send_typing(channel.id) - self.task: asyncio.Task[None] = self.loop.create_task(self.do_typing()) - self.task.add_done_callback(_typing_done_callback) - - async def __aexit__( - self, - exc_type: Optional[Type[BE]], - exc: Optional[BE], - traceback: Optional[TracebackType], - ) -> None: - self.task.cancel() diff --git a/.venv/Lib/site-packages/discord/embeds.py b/.venv/Lib/site-packages/discord/embeds.py deleted file mode 100644 index 6a79fef..0000000 --- a/.venv/Lib/site-packages/discord/embeds.py +++ /dev/null @@ -1,757 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -import datetime -from typing import Any, Dict, List, Mapping, Optional, Protocol, TYPE_CHECKING, TypeVar, Union - -from . import utils -from .colour import Colour - -# fmt: off -__all__ = ( - 'Embed', -) -# fmt: on - - -class EmbedProxy: - def __init__(self, layer: Dict[str, Any]): - self.__dict__.update(layer) - - def __len__(self) -> int: - return len(self.__dict__) - - def __repr__(self) -> str: - inner = ', '.join((f'{k}={v!r}' for k, v in self.__dict__.items() if not k.startswith('_'))) - return f'EmbedProxy({inner})' - - def __getattr__(self, attr: str) -> None: - return None - - def __eq__(self, other: object) -> bool: - return isinstance(other, EmbedProxy) and self.__dict__ == other.__dict__ - - -if TYPE_CHECKING: - from typing_extensions import Self - - from .types.embed import Embed as EmbedData, EmbedType - - T = TypeVar('T') - - class _EmbedFooterProxy(Protocol): - text: Optional[str] - icon_url: Optional[str] - - class _EmbedFieldProxy(Protocol): - name: Optional[str] - value: Optional[str] - inline: bool - - class _EmbedMediaProxy(Protocol): - url: Optional[str] - proxy_url: Optional[str] - height: Optional[int] - width: Optional[int] - - class _EmbedVideoProxy(Protocol): - url: Optional[str] - height: Optional[int] - width: Optional[int] - - class _EmbedProviderProxy(Protocol): - name: Optional[str] - url: Optional[str] - - class _EmbedAuthorProxy(Protocol): - name: Optional[str] - url: Optional[str] - icon_url: Optional[str] - proxy_icon_url: Optional[str] - - -class Embed: - """Represents a Discord embed. - - .. container:: operations - - .. describe:: len(x) - - Returns the total size of the embed. - Useful for checking if it's within the 6000 character limit. - - .. describe:: bool(b) - - Returns whether the embed has any data set. - - .. versionadded:: 2.0 - - .. describe:: x == y - - Checks if two embeds are equal. - - .. versionadded:: 2.0 - - For ease of use, all parameters that expect a :class:`str` are implicitly - casted to :class:`str` for you. - - .. versionchanged:: 2.0 - ``Embed.Empty`` has been removed in favour of ``None``. - - Attributes - ----------- - title: Optional[:class:`str`] - The title of the embed. - This can be set during initialisation. - Can only be up to 256 characters. - type: :class:`str` - The type of embed. Usually "rich". - This can be set during initialisation. - Possible strings for embed types can be found on discord's - :ddocs:`api docs ` - description: Optional[:class:`str`] - The description of the embed. - This can be set during initialisation. - Can only be up to 4096 characters. - url: Optional[:class:`str`] - The URL of the embed. - This can be set during initialisation. - timestamp: Optional[:class:`datetime.datetime`] - The timestamp of the embed content. This is an aware datetime. - If a naive datetime is passed, it is converted to an aware - datetime with the local timezone. - colour: Optional[Union[:class:`Colour`, :class:`int`]] - The colour code of the embed. Aliased to ``color`` as well. - This can be set during initialisation. - """ - - __slots__ = ( - 'title', - 'url', - 'type', - '_timestamp', - '_colour', - '_footer', - '_image', - '_thumbnail', - '_video', - '_provider', - '_author', - '_fields', - 'description', - ) - - def __init__( - self, - *, - colour: Optional[Union[int, Colour]] = None, - color: Optional[Union[int, Colour]] = None, - title: Optional[Any] = None, - type: EmbedType = 'rich', - url: Optional[Any] = None, - description: Optional[Any] = None, - timestamp: Optional[datetime.datetime] = None, - ): - - self.colour = colour if colour is not None else color - self.title: Optional[str] = title - self.type: EmbedType = type - self.url: Optional[str] = url - self.description: Optional[str] = description - - if self.title is not None: - self.title = str(self.title) - - if self.description is not None: - self.description = str(self.description) - - if self.url is not None: - self.url = str(self.url) - - if timestamp is not None: - self.timestamp = timestamp - - @classmethod - def from_dict(cls, data: Mapping[str, Any]) -> Self: - """Converts a :class:`dict` to a :class:`Embed` provided it is in the - format that Discord expects it to be in. - - You can find out about this format in the :ddocs:`official Discord documentation `. - - Parameters - ----------- - data: :class:`dict` - The dictionary to convert into an embed. - """ - # we are bypassing __init__ here since it doesn't apply here - self = cls.__new__(cls) - - # fill in the basic fields - - self.title = data.get('title', None) - self.type = data.get('type', None) - self.description = data.get('description', None) - self.url = data.get('url', None) - - if self.title is not None: - self.title = str(self.title) - - if self.description is not None: - self.description = str(self.description) - - if self.url is not None: - self.url = str(self.url) - - # try to fill in the more rich fields - - try: - self._colour = Colour(value=data['color']) - except KeyError: - pass - - try: - self._timestamp = utils.parse_time(data['timestamp']) - except KeyError: - pass - - for attr in ('thumbnail', 'video', 'provider', 'author', 'fields', 'image', 'footer'): - try: - value = data[attr] - except KeyError: - continue - else: - setattr(self, '_' + attr, value) - - return self - - def copy(self) -> Self: - """Returns a shallow copy of the embed.""" - return self.__class__.from_dict(self.to_dict()) - - def __len__(self) -> int: - total = len(self.title or '') + len(self.description or '') - for field in getattr(self, '_fields', []): - total += len(field['name']) + len(field['value']) - - try: - footer_text = self._footer['text'] - except (AttributeError, KeyError): - pass - else: - total += len(footer_text) - - try: - author = self._author - except AttributeError: - pass - else: - total += len(author['name']) - - return total - - def __bool__(self) -> bool: - return any( - ( - self.title, - self.url, - self.description, - self.colour, - self.fields, - self.timestamp, - self.author, - self.thumbnail, - self.footer, - self.image, - self.provider, - self.video, - ) - ) - - def __eq__(self, other: Embed) -> bool: - return isinstance(other, Embed) and ( - self.type == other.type - and self.title == other.title - and self.url == other.url - and self.description == other.description - and self.colour == other.colour - and self.fields == other.fields - and self.timestamp == other.timestamp - and self.author == other.author - and self.thumbnail == other.thumbnail - and self.footer == other.footer - and self.image == other.image - and self.provider == other.provider - and self.video == other.video - ) - - @property - def colour(self) -> Optional[Colour]: - return getattr(self, '_colour', None) - - @colour.setter - def colour(self, value: Optional[Union[int, Colour]]) -> None: - if value is None: - self._colour = None - elif isinstance(value, Colour): - self._colour = value - elif isinstance(value, int): - self._colour = Colour(value=value) - else: - raise TypeError(f'Expected discord.Colour, int, or None but received {value.__class__.__name__} instead.') - - color = colour - - @property - def timestamp(self) -> Optional[datetime.datetime]: - return getattr(self, '_timestamp', None) - - @timestamp.setter - def timestamp(self, value: Optional[datetime.datetime]) -> None: - if isinstance(value, datetime.datetime): - if value.tzinfo is None: - value = value.astimezone() - self._timestamp = value - elif value is None: - self._timestamp = None - else: - raise TypeError(f"Expected datetime.datetime or None received {value.__class__.__name__} instead") - - @property - def footer(self) -> _EmbedFooterProxy: - """Returns an ``EmbedProxy`` denoting the footer contents. - - See :meth:`set_footer` for possible values you can access. - - If the attribute has no value then ``None`` is returned. - """ - # Lying to the type checker for better developer UX. - return EmbedProxy(getattr(self, '_footer', {})) # type: ignore - - def set_footer(self, *, text: Optional[Any] = None, icon_url: Optional[Any] = None) -> Self: - """Sets the footer for the embed content. - - This function returns the class instance to allow for fluent-style - chaining. - - Parameters - ----------- - text: :class:`str` - The footer text. Can only be up to 2048 characters. - icon_url: :class:`str` - The URL of the footer icon. Only HTTP(S) is supported. - Inline attachment URLs are also supported, see :ref:`local_image`. - """ - - self._footer = {} - if text is not None: - self._footer['text'] = str(text) - - if icon_url is not None: - self._footer['icon_url'] = str(icon_url) - - return self - - def remove_footer(self) -> Self: - """Clears embed's footer information. - - This function returns the class instance to allow for fluent-style - chaining. - - .. versionadded:: 2.0 - """ - try: - del self._footer - except AttributeError: - pass - - return self - - @property - def image(self) -> _EmbedMediaProxy: - """Returns an ``EmbedProxy`` denoting the image contents. - - Possible attributes you can access are: - - - ``url`` - - ``proxy_url`` - - ``width`` - - ``height`` - - If the attribute has no value then ``None`` is returned. - """ - # Lying to the type checker for better developer UX. - return EmbedProxy(getattr(self, '_image', {})) # type: ignore - - def set_image(self, *, url: Optional[Any]) -> Self: - """Sets the image for the embed content. - - This function returns the class instance to allow for fluent-style - chaining. - - Parameters - ----------- - url: :class:`str` - The source URL for the image. Only HTTP(S) is supported. - Inline attachment URLs are also supported, see :ref:`local_image`. - """ - - if url is None: - try: - del self._image - except AttributeError: - pass - else: - self._image = { - 'url': str(url), - } - - return self - - @property - def thumbnail(self) -> _EmbedMediaProxy: - """Returns an ``EmbedProxy`` denoting the thumbnail contents. - - Possible attributes you can access are: - - - ``url`` - - ``proxy_url`` - - ``width`` - - ``height`` - - If the attribute has no value then ``None`` is returned. - """ - # Lying to the type checker for better developer UX. - return EmbedProxy(getattr(self, '_thumbnail', {})) # type: ignore - - def set_thumbnail(self, *, url: Optional[Any]) -> Self: - """Sets the thumbnail for the embed content. - - This function returns the class instance to allow for fluent-style - chaining. - - .. versionchanged:: 1.4 - Passing ``None`` removes the thumbnail. - - Parameters - ----------- - url: :class:`str` - The source URL for the thumbnail. Only HTTP(S) is supported. - Inline attachment URLs are also supported, see :ref:`local_image`. - """ - - if url is None: - try: - del self._thumbnail - except AttributeError: - pass - else: - self._thumbnail = { - 'url': str(url), - } - - return self - - @property - def video(self) -> _EmbedVideoProxy: - """Returns an ``EmbedProxy`` denoting the video contents. - - Possible attributes include: - - - ``url`` for the video URL. - - ``height`` for the video height. - - ``width`` for the video width. - - If the attribute has no value then ``None`` is returned. - """ - # Lying to the type checker for better developer UX. - return EmbedProxy(getattr(self, '_video', {})) # type: ignore - - @property - def provider(self) -> _EmbedProviderProxy: - """Returns an ``EmbedProxy`` denoting the provider contents. - - The only attributes that might be accessed are ``name`` and ``url``. - - If the attribute has no value then ``None`` is returned. - """ - # Lying to the type checker for better developer UX. - return EmbedProxy(getattr(self, '_provider', {})) # type: ignore - - @property - def author(self) -> _EmbedAuthorProxy: - """Returns an ``EmbedProxy`` denoting the author contents. - - See :meth:`set_author` for possible values you can access. - - If the attribute has no value then ``None`` is returned. - """ - # Lying to the type checker for better developer UX. - return EmbedProxy(getattr(self, '_author', {})) # type: ignore - - def set_author(self, *, name: Any, url: Optional[Any] = None, icon_url: Optional[Any] = None) -> Self: - """Sets the author for the embed content. - - This function returns the class instance to allow for fluent-style - chaining. - - Parameters - ----------- - name: :class:`str` - The name of the author. Can only be up to 256 characters. - url: :class:`str` - The URL for the author. - icon_url: :class:`str` - The URL of the author icon. Only HTTP(S) is supported. - Inline attachment URLs are also supported, see :ref:`local_image`. - """ - - self._author = { - 'name': str(name), - } - - if url is not None: - self._author['url'] = str(url) - - if icon_url is not None: - self._author['icon_url'] = str(icon_url) - - return self - - def remove_author(self) -> Self: - """Clears embed's author information. - - This function returns the class instance to allow for fluent-style - chaining. - - .. versionadded:: 1.4 - """ - try: - del self._author - except AttributeError: - pass - - return self - - @property - def fields(self) -> List[_EmbedFieldProxy]: - """List[``EmbedProxy``]: Returns a :class:`list` of ``EmbedProxy`` denoting the field contents. - - See :meth:`add_field` for possible values you can access. - - If the attribute has no value then ``None`` is returned. - """ - # Lying to the type checker for better developer UX. - return [EmbedProxy(d) for d in getattr(self, '_fields', [])] # type: ignore - - def add_field(self, *, name: Any, value: Any, inline: bool = True) -> Self: - """Adds a field to the embed object. - - This function returns the class instance to allow for fluent-style - chaining. Can only be up to 25 fields. - - Parameters - ----------- - name: :class:`str` - The name of the field. Can only be up to 256 characters. - value: :class:`str` - The value of the field. Can only be up to 1024 characters. - inline: :class:`bool` - Whether the field should be displayed inline. - """ - - field = { - 'inline': inline, - 'name': str(name), - 'value': str(value), - } - - try: - self._fields.append(field) - except AttributeError: - self._fields = [field] - - return self - - def insert_field_at(self, index: int, *, name: Any, value: Any, inline: bool = True) -> Self: - """Inserts a field before a specified index to the embed. - - This function returns the class instance to allow for fluent-style - chaining. Can only be up to 25 fields. - - .. versionadded:: 1.2 - - Parameters - ----------- - index: :class:`int` - The index of where to insert the field. - name: :class:`str` - The name of the field. Can only be up to 256 characters. - value: :class:`str` - The value of the field. Can only be up to 1024 characters. - inline: :class:`bool` - Whether the field should be displayed inline. - """ - - field = { - 'inline': inline, - 'name': str(name), - 'value': str(value), - } - - try: - self._fields.insert(index, field) - except AttributeError: - self._fields = [field] - - return self - - def clear_fields(self) -> Self: - """Removes all fields from this embed. - - This function returns the class instance to allow for fluent-style - chaining. - - .. versionchanged:: 2.0 - This function now returns the class instance. - """ - try: - self._fields.clear() - except AttributeError: - self._fields = [] - - return self - - def remove_field(self, index: int) -> Self: - """Removes a field at a specified index. - - If the index is invalid or out of bounds then the error is - silently swallowed. - - This function returns the class instance to allow for fluent-style - chaining. - - .. note:: - - When deleting a field by index, the index of the other fields - shift to fill the gap just like a regular list. - - .. versionchanged:: 2.0 - This function now returns the class instance. - - Parameters - ----------- - index: :class:`int` - The index of the field to remove. - """ - try: - del self._fields[index] - except (AttributeError, IndexError): - pass - - return self - - def set_field_at(self, index: int, *, name: Any, value: Any, inline: bool = True) -> Self: - """Modifies a field to the embed object. - - The index must point to a valid pre-existing field. Can only be up to 25 fields. - - This function returns the class instance to allow for fluent-style - chaining. - - Parameters - ----------- - index: :class:`int` - The index of the field to modify. - name: :class:`str` - The name of the field. Can only be up to 256 characters. - value: :class:`str` - The value of the field. Can only be up to 1024 characters. - inline: :class:`bool` - Whether the field should be displayed inline. - - Raises - ------- - IndexError - An invalid index was provided. - """ - - try: - field = self._fields[index] - except (TypeError, IndexError, AttributeError): - raise IndexError('field index out of range') - - field['name'] = str(name) - field['value'] = str(value) - field['inline'] = inline - return self - - def to_dict(self) -> EmbedData: - """Converts this embed object into a dict.""" - - # add in the raw data into the dict - # fmt: off - result = { - key[1:]: getattr(self, key) - for key in self.__slots__ - if key[0] == '_' and hasattr(self, key) - } - # fmt: on - - # deal with basic convenience wrappers - - try: - colour = result.pop('colour') - except KeyError: - pass - else: - if colour: - result['color'] = colour.value - - try: - timestamp = result.pop('timestamp') - except KeyError: - pass - else: - if timestamp: - if timestamp.tzinfo: - result['timestamp'] = timestamp.astimezone(tz=datetime.timezone.utc).isoformat() - else: - result['timestamp'] = timestamp.replace(tzinfo=datetime.timezone.utc).isoformat() - - # add in the non raw attribute ones - if self.type: - result['type'] = self.type - - if self.description: - result['description'] = self.description - - if self.url: - result['url'] = self.url - - if self.title: - result['title'] = self.title - - return result # type: ignore # This payload is equivalent to the EmbedData type diff --git a/.venv/Lib/site-packages/discord/emoji.py b/.venv/Lib/site-packages/discord/emoji.py deleted file mode 100644 index 045486d..0000000 --- a/.venv/Lib/site-packages/discord/emoji.py +++ /dev/null @@ -1,257 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations -from typing import Any, Collection, Iterator, List, Optional, TYPE_CHECKING, Tuple - -from .asset import Asset, AssetMixin -from .utils import SnowflakeList, snowflake_time, MISSING -from .partial_emoji import _EmojiTag, PartialEmoji -from .user import User - -# fmt: off -__all__ = ( - 'Emoji', -) -# fmt: on - -if TYPE_CHECKING: - from .types.emoji import Emoji as EmojiPayload - from .guild import Guild - from .state import ConnectionState - from .abc import Snowflake - from .role import Role - from datetime import datetime - - -class Emoji(_EmojiTag, AssetMixin): - """Represents a custom emoji. - - Depending on the way this object was created, some of the attributes can - have a value of ``None``. - - .. container:: operations - - .. describe:: x == y - - Checks if two emoji are the same. - - .. describe:: x != y - - Checks if two emoji are not the same. - - .. describe:: hash(x) - - Return the emoji's hash. - - .. describe:: iter(x) - - Returns an iterator of ``(field, value)`` pairs. This allows this class - to be used as an iterable in list/dict/etc constructions. - - .. describe:: str(x) - - Returns the emoji rendered for discord. - - Attributes - ----------- - name: :class:`str` - The name of the emoji. - id: :class:`int` - The emoji's ID. - require_colons: :class:`bool` - If colons are required to use this emoji in the client (:PJSalt: vs PJSalt). - animated: :class:`bool` - Whether an emoji is animated or not. - managed: :class:`bool` - If this emoji is managed by a Twitch integration. - guild_id: :class:`int` - The guild ID the emoji belongs to. - available: :class:`bool` - Whether the emoji is available for use. - user: Optional[:class:`User`] - The user that created the emoji. This can only be retrieved using :meth:`Guild.fetch_emoji` and - having :attr:`~Permissions.manage_emojis`. - """ - - __slots__: Tuple[str, ...] = ( - 'require_colons', - 'animated', - 'managed', - 'id', - 'name', - '_roles', - 'guild_id', - '_state', - 'user', - 'available', - ) - - def __init__(self, *, guild: Guild, state: ConnectionState, data: EmojiPayload) -> None: - self.guild_id: int = guild.id - self._state: ConnectionState = state - self._from_data(data) - - def _from_data(self, emoji: EmojiPayload) -> None: - self.require_colons: bool = emoji.get('require_colons', False) - self.managed: bool = emoji.get('managed', False) - self.id: int = int(emoji['id']) # type: ignore # This won't be None for full emoji objects. - self.name: str = emoji['name'] # type: ignore # This won't be None for full emoji objects. - self.animated: bool = emoji.get('animated', False) - self.available: bool = emoji.get('available', True) - self._roles: SnowflakeList = SnowflakeList(map(int, emoji.get('roles', []))) - user = emoji.get('user') - self.user: Optional[User] = User(state=self._state, data=user) if user else None - - def _to_partial(self) -> PartialEmoji: - return PartialEmoji(name=self.name, animated=self.animated, id=self.id) - - def __iter__(self) -> Iterator[Tuple[str, Any]]: - for attr in self.__slots__: - if attr[0] != '_': - value = getattr(self, attr, None) - if value is not None: - yield (attr, value) - - def __str__(self) -> str: - if self.animated: - return f'' - return f'<:{self.name}:{self.id}>' - - def __repr__(self) -> str: - return f'' - - def __eq__(self, other: object) -> bool: - return isinstance(other, _EmojiTag) and self.id == other.id - - def __ne__(self, other: object) -> bool: - return not self.__eq__(other) - - def __hash__(self) -> int: - return self.id >> 22 - - @property - def created_at(self) -> datetime: - """:class:`datetime.datetime`: Returns the emoji's creation time in UTC.""" - return snowflake_time(self.id) - - @property - def url(self) -> str: - """:class:`str`: Returns the URL of the emoji.""" - fmt = 'gif' if self.animated else 'png' - return f'{Asset.BASE}/emojis/{self.id}.{fmt}' - - @property - def roles(self) -> List[Role]: - """List[:class:`Role`]: A :class:`list` of roles that is allowed to use this emoji. - - If roles is empty, the emoji is unrestricted. - """ - guild = self.guild - if guild is None: - return [] - - return [role for role in guild.roles if self._roles.has(role.id)] - - @property - def guild(self) -> Optional[Guild]: - """:class:`Guild`: The guild this emoji belongs to.""" - return self._state._get_guild(self.guild_id) - - def is_usable(self) -> bool: - """:class:`bool`: Whether the bot can use this emoji. - - .. versionadded:: 1.3 - """ - if not self.available or not self.guild or self.guild.unavailable: - return False - if not self._roles: - return True - emoji_roles, my_roles = self._roles, self.guild.me._roles - return any(my_roles.has(role_id) for role_id in emoji_roles) - - async def delete(self, *, reason: Optional[str] = None) -> None: - """|coro| - - Deletes the custom emoji. - - You must have :attr:`~Permissions.manage_emojis` to do this. - - Parameters - ----------- - reason: Optional[:class:`str`] - The reason for deleting this emoji. Shows up on the audit log. - - Raises - ------- - Forbidden - You are not allowed to delete emojis. - HTTPException - An error occurred deleting the emoji. - """ - - await self._state.http.delete_custom_emoji(self.guild_id, self.id, reason=reason) - - async def edit( - self, *, name: str = MISSING, roles: Collection[Snowflake] = MISSING, reason: Optional[str] = None - ) -> Emoji: - r"""|coro| - - Edits the custom emoji. - - You must have :attr:`~Permissions.manage_emojis` to do this. - - .. versionchanged:: 2.0 - The newly updated emoji is returned. - - Parameters - ----------- - name: :class:`str` - The new emoji name. - roles: List[:class:`~discord.abc.Snowflake`] - A list of roles that can use this emoji. An empty list can be passed to make it available to everyone. - reason: Optional[:class:`str`] - The reason for editing this emoji. Shows up on the audit log. - - Raises - ------- - Forbidden - You are not allowed to edit emojis. - HTTPException - An error occurred editing the emoji. - - Returns - -------- - :class:`Emoji` - The newly updated emoji. - """ - - payload = {} - if name is not MISSING: - payload['name'] = name - if roles is not MISSING: - payload['roles'] = [role.id for role in roles] - - data = await self._state.http.edit_custom_emoji(self.guild_id, self.id, payload=payload, reason=reason) - return Emoji(guild=self.guild, data=data, state=self._state) # type: ignore # if guild is None, the http request would have failed diff --git a/.venv/Lib/site-packages/discord/enums.py b/.venv/Lib/site-packages/discord/enums.py deleted file mode 100644 index 81d5cb4..0000000 --- a/.venv/Lib/site-packages/discord/enums.py +++ /dev/null @@ -1,776 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" -from __future__ import annotations - -import types -from collections import namedtuple -from typing import Any, ClassVar, Dict, List, Optional, TYPE_CHECKING, Tuple, Type, TypeVar, Iterator, Mapping - -__all__ = ( - 'Enum', - 'ChannelType', - 'MessageType', - 'SpeakingState', - 'VerificationLevel', - 'ContentFilter', - 'Status', - 'DefaultAvatar', - 'AuditLogAction', - 'AuditLogActionCategory', - 'UserFlags', - 'ActivityType', - 'NotificationLevel', - 'TeamMembershipState', - 'WebhookType', - 'ExpireBehaviour', - 'ExpireBehavior', - 'StickerType', - 'StickerFormatType', - 'InviteTarget', - 'VideoQualityMode', - 'ComponentType', - 'ButtonStyle', - 'TextStyle', - 'PrivacyLevel', - 'InteractionType', - 'InteractionResponseType', - 'NSFWLevel', - 'MFALevel', - 'Locale', - 'EntityType', - 'EventStatus', - 'AppCommandType', - 'AppCommandOptionType', - 'AppCommandPermissionType', - 'AutoModRuleTriggerType', - 'AutoModRuleEventType', - 'AutoModRuleActionType', - 'ForumLayoutType', - 'ForumOrderType', -) - -if TYPE_CHECKING: - from typing_extensions import Self - - -def _create_value_cls(name: str, comparable: bool): - # All the type ignores here are due to the type checker being unable to recognise - # Runtime type creation without exploding. - cls = namedtuple('_EnumValue_' + name, 'name value') - cls.__repr__ = lambda self: f'<{name}.{self.name}: {self.value!r}>' # type: ignore - cls.__str__ = lambda self: f'{name}.{self.name}' # type: ignore - if comparable: - cls.__le__ = lambda self, other: isinstance(other, self.__class__) and self.value <= other.value # type: ignore - cls.__ge__ = lambda self, other: isinstance(other, self.__class__) and self.value >= other.value # type: ignore - cls.__lt__ = lambda self, other: isinstance(other, self.__class__) and self.value < other.value # type: ignore - cls.__gt__ = lambda self, other: isinstance(other, self.__class__) and self.value > other.value # type: ignore - return cls - - -def _is_descriptor(obj): - return hasattr(obj, '__get__') or hasattr(obj, '__set__') or hasattr(obj, '__delete__') - - -class EnumMeta(type): - if TYPE_CHECKING: - __name__: ClassVar[str] - _enum_member_names_: ClassVar[List[str]] - _enum_member_map_: ClassVar[Dict[str, Any]] - _enum_value_map_: ClassVar[Dict[Any, Any]] - - def __new__(cls, name: str, bases: Tuple[type, ...], attrs: Dict[str, Any], *, comparable: bool = False) -> Self: - value_mapping = {} - member_mapping = {} - member_names = [] - - value_cls = _create_value_cls(name, comparable) - for key, value in list(attrs.items()): - is_descriptor = _is_descriptor(value) - if key[0] == '_' and not is_descriptor: - continue - - # Special case classmethod to just pass through - if isinstance(value, classmethod): - continue - - if is_descriptor: - setattr(value_cls, key, value) - del attrs[key] - continue - - try: - new_value = value_mapping[value] - except KeyError: - new_value = value_cls(name=key, value=value) - value_mapping[value] = new_value - member_names.append(key) - - member_mapping[key] = new_value - attrs[key] = new_value - - attrs['_enum_value_map_'] = value_mapping - attrs['_enum_member_map_'] = member_mapping - attrs['_enum_member_names_'] = member_names - attrs['_enum_value_cls_'] = value_cls - actual_cls = super().__new__(cls, name, bases, attrs) - value_cls._actual_enum_cls_ = actual_cls # type: ignore # Runtime attribute isn't understood - return actual_cls - - def __iter__(cls) -> Iterator[Any]: - return (cls._enum_member_map_[name] for name in cls._enum_member_names_) - - def __reversed__(cls) -> Iterator[Any]: - return (cls._enum_member_map_[name] for name in reversed(cls._enum_member_names_)) - - def __len__(cls) -> int: - return len(cls._enum_member_names_) - - def __repr__(cls) -> str: - return f'' - - @property - def __members__(cls) -> Mapping[str, Any]: - return types.MappingProxyType(cls._enum_member_map_) - - def __call__(cls, value: str) -> Any: - try: - return cls._enum_value_map_[value] - except (KeyError, TypeError): - raise ValueError(f"{value!r} is not a valid {cls.__name__}") - - def __getitem__(cls, key: str) -> Any: - return cls._enum_member_map_[key] - - def __setattr__(cls, name: str, value: Any) -> None: - raise TypeError('Enums are immutable.') - - def __delattr__(cls, attr: str) -> None: - raise TypeError('Enums are immutable') - - def __instancecheck__(self, instance: Any) -> bool: - # isinstance(x, Y) - # -> __instancecheck__(Y, x) - try: - return instance._actual_enum_cls_ is self - except AttributeError: - return False - - -if TYPE_CHECKING: - from enum import Enum -else: - - class Enum(metaclass=EnumMeta): - @classmethod - def try_value(cls, value): - try: - return cls._enum_value_map_[value] - except (KeyError, TypeError): - return value - - -class ChannelType(Enum): - text = 0 - private = 1 - voice = 2 - group = 3 - category = 4 - news = 5 - news_thread = 10 - public_thread = 11 - private_thread = 12 - stage_voice = 13 - forum = 15 - - def __str__(self) -> str: - return self.name - - -class MessageType(Enum): - default = 0 - recipient_add = 1 - recipient_remove = 2 - call = 3 - channel_name_change = 4 - channel_icon_change = 5 - pins_add = 6 - new_member = 7 - premium_guild_subscription = 8 - premium_guild_tier_1 = 9 - premium_guild_tier_2 = 10 - premium_guild_tier_3 = 11 - channel_follow_add = 12 - guild_stream = 13 - guild_discovery_disqualified = 14 - guild_discovery_requalified = 15 - guild_discovery_grace_period_initial_warning = 16 - guild_discovery_grace_period_final_warning = 17 - thread_created = 18 - reply = 19 - chat_input_command = 20 - thread_starter_message = 21 - guild_invite_reminder = 22 - context_menu_command = 23 - auto_moderation_action = 24 - role_subscription_purchase = 25 - interaction_premium_upsell = 26 - stage_start = 27 - stage_end = 28 - stage_speaker = 29 - stage_raise_hand = 30 - stage_topic = 31 - guild_application_premium_subscription = 32 - - -class SpeakingState(Enum): - none = 0 - voice = 1 - soundshare = 2 - priority = 4 - - def __str__(self) -> str: - return self.name - - def __int__(self) -> int: - return self.value - - -class VerificationLevel(Enum, comparable=True): - none = 0 - low = 1 - medium = 2 - high = 3 - highest = 4 - - def __str__(self) -> str: - return self.name - - -class ContentFilter(Enum, comparable=True): - disabled = 0 - no_role = 1 - all_members = 2 - - def __str__(self) -> str: - return self.name - - -class Status(Enum): - online = 'online' - offline = 'offline' - idle = 'idle' - dnd = 'dnd' - do_not_disturb = 'dnd' - invisible = 'invisible' - - def __str__(self) -> str: - return self.value - - -class DefaultAvatar(Enum): - blurple = 0 - grey = 1 - gray = 1 - green = 2 - orange = 3 - red = 4 - pink = 5 - - def __str__(self) -> str: - return self.name - - -class NotificationLevel(Enum, comparable=True): - all_messages = 0 - only_mentions = 1 - - -class AuditLogActionCategory(Enum): - create = 1 - delete = 2 - update = 3 - - -class AuditLogAction(Enum): - # fmt: off - guild_update = 1 - channel_create = 10 - channel_update = 11 - channel_delete = 12 - overwrite_create = 13 - overwrite_update = 14 - overwrite_delete = 15 - kick = 20 - member_prune = 21 - ban = 22 - unban = 23 - member_update = 24 - member_role_update = 25 - member_move = 26 - member_disconnect = 27 - bot_add = 28 - role_create = 30 - role_update = 31 - role_delete = 32 - invite_create = 40 - invite_update = 41 - invite_delete = 42 - webhook_create = 50 - webhook_update = 51 - webhook_delete = 52 - emoji_create = 60 - emoji_update = 61 - emoji_delete = 62 - message_delete = 72 - message_bulk_delete = 73 - message_pin = 74 - message_unpin = 75 - integration_create = 80 - integration_update = 81 - integration_delete = 82 - stage_instance_create = 83 - stage_instance_update = 84 - stage_instance_delete = 85 - sticker_create = 90 - sticker_update = 91 - sticker_delete = 92 - scheduled_event_create = 100 - scheduled_event_update = 101 - scheduled_event_delete = 102 - thread_create = 110 - thread_update = 111 - thread_delete = 112 - app_command_permission_update = 121 - automod_rule_create = 140 - automod_rule_update = 141 - automod_rule_delete = 142 - automod_block_message = 143 - automod_flag_message = 144 - automod_timeout_member = 145 - # fmt: on - - @property - def category(self) -> Optional[AuditLogActionCategory]: - # fmt: off - lookup: Dict[AuditLogAction, Optional[AuditLogActionCategory]] = { - AuditLogAction.guild_update: AuditLogActionCategory.update, - AuditLogAction.channel_create: AuditLogActionCategory.create, - AuditLogAction.channel_update: AuditLogActionCategory.update, - AuditLogAction.channel_delete: AuditLogActionCategory.delete, - AuditLogAction.overwrite_create: AuditLogActionCategory.create, - AuditLogAction.overwrite_update: AuditLogActionCategory.update, - AuditLogAction.overwrite_delete: AuditLogActionCategory.delete, - AuditLogAction.kick: None, - AuditLogAction.member_prune: None, - AuditLogAction.ban: None, - AuditLogAction.unban: None, - AuditLogAction.member_update: AuditLogActionCategory.update, - AuditLogAction.member_role_update: AuditLogActionCategory.update, - AuditLogAction.member_move: None, - AuditLogAction.member_disconnect: None, - AuditLogAction.bot_add: None, - AuditLogAction.role_create: AuditLogActionCategory.create, - AuditLogAction.role_update: AuditLogActionCategory.update, - AuditLogAction.role_delete: AuditLogActionCategory.delete, - AuditLogAction.invite_create: AuditLogActionCategory.create, - AuditLogAction.invite_update: AuditLogActionCategory.update, - AuditLogAction.invite_delete: AuditLogActionCategory.delete, - AuditLogAction.webhook_create: AuditLogActionCategory.create, - AuditLogAction.webhook_update: AuditLogActionCategory.update, - AuditLogAction.webhook_delete: AuditLogActionCategory.delete, - AuditLogAction.emoji_create: AuditLogActionCategory.create, - AuditLogAction.emoji_update: AuditLogActionCategory.update, - AuditLogAction.emoji_delete: AuditLogActionCategory.delete, - AuditLogAction.message_delete: AuditLogActionCategory.delete, - AuditLogAction.message_bulk_delete: AuditLogActionCategory.delete, - AuditLogAction.message_pin: None, - AuditLogAction.message_unpin: None, - AuditLogAction.integration_create: AuditLogActionCategory.create, - AuditLogAction.integration_update: AuditLogActionCategory.update, - AuditLogAction.integration_delete: AuditLogActionCategory.delete, - AuditLogAction.stage_instance_create: AuditLogActionCategory.create, - AuditLogAction.stage_instance_update: AuditLogActionCategory.update, - AuditLogAction.stage_instance_delete: AuditLogActionCategory.delete, - AuditLogAction.sticker_create: AuditLogActionCategory.create, - AuditLogAction.sticker_update: AuditLogActionCategory.update, - AuditLogAction.sticker_delete: AuditLogActionCategory.delete, - AuditLogAction.scheduled_event_create: AuditLogActionCategory.create, - AuditLogAction.scheduled_event_update: AuditLogActionCategory.update, - AuditLogAction.scheduled_event_delete: AuditLogActionCategory.delete, - AuditLogAction.thread_create: AuditLogActionCategory.create, - AuditLogAction.thread_delete: AuditLogActionCategory.delete, - AuditLogAction.thread_update: AuditLogActionCategory.update, - AuditLogAction.app_command_permission_update: AuditLogActionCategory.update, - AuditLogAction.automod_rule_create: AuditLogActionCategory.create, - AuditLogAction.automod_rule_update: AuditLogActionCategory.update, - AuditLogAction.automod_rule_delete: AuditLogActionCategory.delete, - AuditLogAction.automod_block_message: None, - AuditLogAction.automod_flag_message: None, - AuditLogAction.automod_timeout_member: None, - } - # fmt: on - return lookup[self] - - @property - def target_type(self) -> Optional[str]: - v = self.value - if v == -1: - return 'all' - elif v < 10: - return 'guild' - elif v < 20: - return 'channel' - elif v < 30: - return 'user' - elif v < 40: - return 'role' - elif v < 50: - return 'invite' - elif v < 60: - return 'webhook' - elif v < 70: - return 'emoji' - elif v == 73: - return 'channel' - elif v < 80: - return 'message' - elif v < 83: - return 'integration' - elif v < 90: - return 'stage_instance' - elif v < 93: - return 'sticker' - elif v < 103: - return 'guild_scheduled_event' - elif v < 113: - return 'thread' - elif v < 122: - return 'integration_or_app_command' - elif v < 143: - return 'auto_moderation' - elif v < 146: - return 'user' - - -class UserFlags(Enum): - staff = 1 - partner = 2 - hypesquad = 4 - bug_hunter = 8 - mfa_sms = 16 - premium_promo_dismissed = 32 - hypesquad_bravery = 64 - hypesquad_brilliance = 128 - hypesquad_balance = 256 - early_supporter = 512 - team_user = 1024 - system = 4096 - has_unread_urgent_messages = 8192 - bug_hunter_level_2 = 16384 - verified_bot = 65536 - verified_bot_developer = 131072 - discord_certified_moderator = 262144 - bot_http_interactions = 524288 - spammer = 1048576 - active_developer = 4194304 - - -class ActivityType(Enum): - unknown = -1 - playing = 0 - streaming = 1 - listening = 2 - watching = 3 - custom = 4 - competing = 5 - - def __int__(self) -> int: - return self.value - - -class TeamMembershipState(Enum): - invited = 1 - accepted = 2 - - -class WebhookType(Enum): - incoming = 1 - channel_follower = 2 - application = 3 - - -class ExpireBehaviour(Enum): - remove_role = 0 - kick = 1 - - -ExpireBehavior = ExpireBehaviour - - -class StickerType(Enum): - standard = 1 - guild = 2 - - -class StickerFormatType(Enum): - png = 1 - apng = 2 - lottie = 3 - gif = 4 - - @property - def file_extension(self) -> str: - # fmt: off - lookup: Dict[StickerFormatType, str] = { - StickerFormatType.png: 'png', - StickerFormatType.apng: 'png', - StickerFormatType.lottie: 'json', - StickerFormatType.gif: 'gif', - } - # fmt: on - return lookup.get(self, 'png') - - -class InviteTarget(Enum): - unknown = 0 - stream = 1 - embedded_application = 2 - - -class InteractionType(Enum): - ping = 1 - application_command = 2 - component = 3 - autocomplete = 4 - modal_submit = 5 - - -class InteractionResponseType(Enum): - pong = 1 - # ack = 2 (deprecated) - # channel_message = 3 (deprecated) - channel_message = 4 # (with source) - deferred_channel_message = 5 # (with source) - deferred_message_update = 6 # for components - message_update = 7 # for components - autocomplete_result = 8 - modal = 9 # for modals - - -class VideoQualityMode(Enum): - auto = 1 - full = 2 - - def __int__(self) -> int: - return self.value - - -class ComponentType(Enum): - action_row = 1 - button = 2 - select = 3 - string_select = 3 - text_input = 4 - user_select = 5 - role_select = 6 - mentionable_select = 7 - channel_select = 8 - - def __int__(self) -> int: - return self.value - - -class ButtonStyle(Enum): - primary = 1 - secondary = 2 - success = 3 - danger = 4 - link = 5 - - # Aliases - blurple = 1 - grey = 2 - gray = 2 - green = 3 - red = 4 - url = 5 - - def __int__(self) -> int: - return self.value - - -class TextStyle(Enum): - short = 1 - paragraph = 2 - - # Aliases - long = 2 - - def __int__(self) -> int: - return self.value - - -class PrivacyLevel(Enum): - guild_only = 2 - - -class NSFWLevel(Enum, comparable=True): - default = 0 - explicit = 1 - safe = 2 - age_restricted = 3 - - -class MFALevel(Enum, comparable=True): - disabled = 0 - require_2fa = 1 - - -class Locale(Enum): - american_english = 'en-US' - british_english = 'en-GB' - bulgarian = 'bg' - chinese = 'zh-CN' - taiwan_chinese = 'zh-TW' - croatian = 'hr' - czech = 'cs' - indonesian = 'id' - danish = 'da' - dutch = 'nl' - finnish = 'fi' - french = 'fr' - german = 'de' - greek = 'el' - hindi = 'hi' - hungarian = 'hu' - italian = 'it' - japanese = 'ja' - korean = 'ko' - lithuanian = 'lt' - norwegian = 'no' - polish = 'pl' - brazil_portuguese = 'pt-BR' - romanian = 'ro' - russian = 'ru' - spain_spanish = 'es-ES' - swedish = 'sv-SE' - thai = 'th' - turkish = 'tr' - ukrainian = 'uk' - vietnamese = 'vi' - - def __str__(self) -> str: - return self.value - - -E = TypeVar('E', bound='Enum') - - -class EntityType(Enum): - stage_instance = 1 - voice = 2 - external = 3 - - -class EventStatus(Enum): - scheduled = 1 - active = 2 - completed = 3 - canceled = 4 - - ended = 3 - cancelled = 4 - - -class AppCommandOptionType(Enum): - subcommand = 1 - subcommand_group = 2 - string = 3 - integer = 4 - boolean = 5 - user = 6 - channel = 7 - role = 8 - mentionable = 9 - number = 10 - attachment = 11 - - -class AppCommandType(Enum): - chat_input = 1 - user = 2 - message = 3 - - -class AppCommandPermissionType(Enum): - role = 1 - user = 2 - channel = 3 - - -class AutoModRuleTriggerType(Enum): - keyword = 1 - harmful_link = 2 - spam = 3 - keyword_preset = 4 - mention_spam = 5 - - -class AutoModRuleEventType(Enum): - message_send = 1 - - -class AutoModRuleActionType(Enum): - block_message = 1 - send_alert_message = 2 - timeout = 3 - - -class ForumLayoutType(Enum): - not_set = 0 - list_view = 1 - gallery_view = 2 - - -class ForumOrderType(Enum): - latest_activity = 0 - creation_date = 1 - - -def create_unknown_value(cls: Type[E], val: Any) -> E: - value_cls = cls._enum_value_cls_ # type: ignore # This is narrowed below - name = f'unknown_{val}' - return value_cls(name=name, value=val) - - -def try_enum(cls: Type[E], val: Any) -> E: - """A function that tries to turn the value into enum ``cls``. - - If it fails it returns a proxy invalid value instead. - """ - - try: - return cls._enum_value_map_[val] # type: ignore # All errors are caught below - except (KeyError, TypeError, AttributeError): - return create_unknown_value(cls, val) diff --git a/.venv/Lib/site-packages/discord/errors.py b/.venv/Lib/site-packages/discord/errors.py deleted file mode 100644 index 6035ace..0000000 --- a/.venv/Lib/site-packages/discord/errors.py +++ /dev/null @@ -1,280 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations -from typing import Dict, List, Optional, TYPE_CHECKING, Any, Tuple, Union - -if TYPE_CHECKING: - from aiohttp import ClientResponse, ClientWebSocketResponse - from requests import Response - - _ResponseType = Union[ClientResponse, Response] - - from .interactions import Interaction - -__all__ = ( - 'DiscordException', - 'ClientException', - 'GatewayNotFound', - 'HTTPException', - 'RateLimited', - 'Forbidden', - 'NotFound', - 'DiscordServerError', - 'InvalidData', - 'LoginFailure', - 'ConnectionClosed', - 'PrivilegedIntentsRequired', - 'InteractionResponded', -) - - -class DiscordException(Exception): - """Base exception class for discord.py - - Ideally speaking, this could be caught to handle any exceptions raised from this library. - """ - - pass - - -class ClientException(DiscordException): - """Exception that's raised when an operation in the :class:`Client` fails. - - These are usually for exceptions that happened due to user input. - """ - - pass - - -class GatewayNotFound(DiscordException): - """An exception that is raised when the gateway for Discord could not be found""" - - def __init__(self): - message = 'The gateway to connect to discord was not found.' - super().__init__(message) - - -def _flatten_error_dict(d: Dict[str, Any], key: str = '') -> Dict[str, str]: - items: List[Tuple[str, str]] = [] - for k, v in d.items(): - new_key = key + '.' + k if key else k - - if isinstance(v, dict): - try: - _errors: List[Dict[str, Any]] = v['_errors'] - except KeyError: - items.extend(_flatten_error_dict(v, new_key).items()) - else: - items.append((new_key, ' '.join(x.get('message', '') for x in _errors))) - else: - items.append((new_key, v)) - - return dict(items) - - -class HTTPException(DiscordException): - """Exception that's raised when an HTTP request operation fails. - - Attributes - ------------ - response: :class:`aiohttp.ClientResponse` - The response of the failed HTTP request. This is an - instance of :class:`aiohttp.ClientResponse`. In some cases - this could also be a :class:`requests.Response`. - - text: :class:`str` - The text of the error. Could be an empty string. - status: :class:`int` - The status code of the HTTP request. - code: :class:`int` - The Discord specific error code for the failure. - """ - - def __init__(self, response: _ResponseType, message: Optional[Union[str, Dict[str, Any]]]): - self.response: _ResponseType = response - self.status: int = response.status # type: ignore # This attribute is filled by the library even if using requests - self.code: int - self.text: str - if isinstance(message, dict): - self.code = message.get('code', 0) - base = message.get('message', '') - errors = message.get('errors') - self._errors: Optional[Dict[str, Any]] = errors - if errors: - errors = _flatten_error_dict(errors) - helpful = '\n'.join('In %s: %s' % t for t in errors.items()) - self.text = base + '\n' + helpful - else: - self.text = base - else: - self.text = message or '' - self.code = 0 - - fmt = '{0.status} {0.reason} (error code: {1})' - if len(self.text): - fmt += ': {2}' - - super().__init__(fmt.format(self.response, self.code, self.text)) - - -class RateLimited(DiscordException): - """Exception that's raised for when status code 429 occurs - and the timeout is greater than the configured maximum using - the ``max_ratelimit_timeout`` parameter in :class:`Client`. - - This is not raised during global ratelimits. - - Since sometimes requests are halted pre-emptively before they're - even made, this **does not** subclass :exc:`HTTPException`. - - .. versionadded:: 2.0 - - Attributes - ------------ - retry_after: :class:`float` - The amount of seconds that the client should wait before retrying - the request. - """ - - def __init__(self, retry_after: float): - self.retry_after = retry_after - super().__init__(f'Too many requests. Retry in {retry_after:.2f} seconds.') - - -class Forbidden(HTTPException): - """Exception that's raised for when status code 403 occurs. - - Subclass of :exc:`HTTPException` - """ - - pass - - -class NotFound(HTTPException): - """Exception that's raised for when status code 404 occurs. - - Subclass of :exc:`HTTPException` - """ - - pass - - -class DiscordServerError(HTTPException): - """Exception that's raised for when a 500 range status code occurs. - - Subclass of :exc:`HTTPException`. - - .. versionadded:: 1.5 - """ - - pass - - -class InvalidData(ClientException): - """Exception that's raised when the library encounters unknown - or invalid data from Discord. - """ - - pass - - -class LoginFailure(ClientException): - """Exception that's raised when the :meth:`Client.login` function - fails to log you in from improper credentials or some other misc. - failure. - """ - - pass - - -class ConnectionClosed(ClientException): - """Exception that's raised when the gateway connection is - closed for reasons that could not be handled internally. - - Attributes - ----------- - code: :class:`int` - The close code of the websocket. - reason: :class:`str` - The reason provided for the closure. - shard_id: Optional[:class:`int`] - The shard ID that got closed if applicable. - """ - - def __init__(self, socket: ClientWebSocketResponse, *, shard_id: Optional[int], code: Optional[int] = None): - # This exception is just the same exception except - # reconfigured to subclass ClientException for users - self.code: int = code or socket.close_code or -1 - # aiohttp doesn't seem to consistently provide close reason - self.reason: str = '' - self.shard_id: Optional[int] = shard_id - super().__init__(f'Shard ID {self.shard_id} WebSocket closed with {self.code}') - - -class PrivilegedIntentsRequired(ClientException): - """Exception that's raised when the gateway is requesting privileged intents - but they're not ticked in the developer page yet. - - Go to https://discord.com/developers/applications/ and enable the intents - that are required. Currently these are as follows: - - - :attr:`Intents.members` - - :attr:`Intents.presences` - - :attr:`Intents.message_content` - - Attributes - ----------- - shard_id: Optional[:class:`int`] - The shard ID that got closed if applicable. - """ - - def __init__(self, shard_id: Optional[int]): - self.shard_id: Optional[int] = shard_id - msg = ( - 'Shard ID %s is requesting privileged intents that have not been explicitly enabled in the ' - 'developer portal. It is recommended to go to https://discord.com/developers/applications/ ' - 'and explicitly enable the privileged intents within your application\'s page. If this is not ' - 'possible, then consider disabling the privileged intents instead.' - ) - super().__init__(msg % shard_id) - - -class InteractionResponded(ClientException): - """Exception that's raised when sending another interaction response using - :class:`InteractionResponse` when one has already been done before. - - An interaction can only respond once. - - .. versionadded:: 2.0 - - Attributes - ----------- - interaction: :class:`Interaction` - The interaction that's already been responded to. - """ - - def __init__(self, interaction: Interaction): - self.interaction: Interaction = interaction - super().__init__('This interaction has already been responded to before') diff --git a/.venv/Lib/site-packages/discord/ext/commands/__init__.py b/.venv/Lib/site-packages/discord/ext/commands/__init__.py deleted file mode 100644 index 08dab54..0000000 --- a/.venv/Lib/site-packages/discord/ext/commands/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -""" -discord.ext.commands -~~~~~~~~~~~~~~~~~~~~~ - -An extension module to facilitate creation of bot commands. - -:copyright: (c) 2015-present Rapptz -:license: MIT, see LICENSE for more details. -""" - -from .bot import * -from .cog import * -from .context import * -from .converter import * -from .cooldowns import * -from .core import * -from .errors import * -from .flags import * -from .help import * -from .parameters import * -from .hybrid import * diff --git a/.venv/Lib/site-packages/discord/ext/commands/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/discord/ext/commands/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 1f1b64a233c2ad865b4c732686bea61162517c02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 743 zcmZuu!EO^V5cMW$k}mWBEeLKt5=1w&h|3Bgq0mF6QXx_<)k-VJo+K{2>y_;U(gVN2 zfe%1@04IK8kE`X#35i3b-g;tI@k$^udh&Z?&v?e;FFQLvK|BBP8@_pj{H&eET25R| zP<$eSoD<=RR^pv)xaGL*xZ`-sao2Irao_Q_W8d)&Id(pSf4kEj8lC�s)A13VDvc#IPyv?7#035? z93L5YmG|&;aI@;gu~0mYt2WlH+FZ@59#@&ghO2E9OVAc{Emb1a`^;1wd^c2G&{}Cz zZA}w4!_7G)dFAI!vlKAFRNeV%qNVssuIk^pPDf$%*5EATm&0aO!#I|iv~e8dtLy%= z&77a>U94We*nGxi-S#|h-RgUtHK~_9;_VjX_6B7m&@IW`qCrXS6%GE?nCnoIJ4J(% Y>=g~lCIBN#a=&Qscl;(%-@^X>0N9-9G5`Po diff --git a/.venv/Lib/site-packages/discord/ext/commands/__pycache__/_types.cpython-311.pyc b/.venv/Lib/site-packages/discord/ext/commands/__pycache__/_types.cpython-311.pyc deleted file mode 100644 index 8f0100fcda04f3bd206ae04411d8f3863d8b0684..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3928 zcmbtWO>Eo96(%L>kNWZdUmR!0&YzXaPUFpPv*{wcv@F|7Wyz4}I98kz6gjfE5k-Zh z?6rHS3gqAg_Mk(7_>hB96lsdhA;%ng$Z-!nFn|sQdofU;zydvZkv;9HZz%sMKYOV( zdg9D`^S$@InR&y%g~KcbpZvf6i_`G*Z_+vXcn=@m{KrL6k13hTQ!*{P%CzdryHt1H ztulE=_2fOOH}6$_d7tXf`_(``pt5;Z4d#P1<)W}(c0Z*l>O1(gKKT&#>YoAJp0SNYG1z3c@C8O)q(tggB+3Bw~z-hg9qhc z(KU4BjLHvH`kW}lg%*Y`;j8A!KLph5BnCL?% zbK3MHj^6!2{W&MzupD{b@f0%u9sCY6_YrvRT%+*_MjyZ)1#CtRgO%&U5gwv^kU?9t zV+3)HlDqyw|1zT7{YyUEFwZ*-JLR5t7+!ERz4(mW_q_k98`#6|ko`qRHz4=CM|a6Z z%~A5;BT62^K78pUJ8xlJcI?i8-SAtv9hcAMsOX4zlc6YQdvVHD}gIwX_f%S(2C}UsADjek!Tp2 zq==3ljvd&SMUP40sn_7a{O+TG?g%6kC{Mk_i|~ zrsJulnPhqnO~br&26l21wlIM58AKc&LM0P90=AII#^(W#(ri966ixp^*?BCc3&38K$} zpDc=J7FV*#xp^MVXHqi>7@ST(WZZNr(Q*Z(;wdh<5JNNE0yjsZ%c2aRWLaX?iViK$ zC&&=-$3ctp$xNEih-cD#7P>KDndOhCE+=z|7~-_0PqIIdS`}q&H&@xT1KfrPN2gH6wm%Mg!+8qC zH62c!Qo(kZUs+5D@%cm?R&vhvFY219Nm|+V@takAN7QZ4QU!LY?cr-x0+OkcO(d3W znvc?UU{TaXHCM&b59D%nUipiVTcepnTM=_k(+Vkci$R zu>~$1r}rQe_iY9u;rXab9{>Y8AZhEOuE5!_gGVreq)DJV{v5x3q+#eWg{eFZZy>HE z3cKMxqTy!t!q<2DWKg>46=9@+~V8 z6jQrXf^`uz9pZ3OW7u9Dn^0AxPXC=GpMh#t)IWl8gUmqa z=Lhkdt4jvd_EoV|5sRxchvnK>jYGYJIs^+&3KaBn=;NttFkGvyPOjt1`f5rktQv}m zC#s_KKwQJdD%4U4QN9WbdG#p9tAYtT#h9#a+I~ThV2=sHR>a{pdDNdK5&1yWsXc#i z+x-R}sdO|*W>iEK3xdrG0#xu?nLLLC;bBcIw=}v3Z1rIx2w|O2x0!+ld$dCk#0nHc z=k75CK@Ssyi$shOafyfvM2sAXTkv4q15rQq-R~IK8Qux+ZocSwA-%l*;#~9cm)78y z%?{3DNPEq22Mp~AJ?lE4$lpWf?}MV{m$+=(O-FB^Z@NKqvYTW&@0MM#hHl_JEgJan zTsRccQAWQE=K44hQ4n@O5R9^B61s1ZoFFzt%)`&<0dYcdud}n zQ|}~ZU8L)iS_e`mDX`s=wx*LXZ7(K8z-S%aJ~GnXUJPby70G4Y$a^p%fG*S=jb@ewM?nHOFC$YvKn_ZXdk$qpJzOlW& zBUrwP*S?9SZvv1)y^XILtGk~)1)eGF55q3yek^_?xN|H`wO7d_9DR{tl> z@TV{Rudcj0`@L!L%m3W8xVz08D^_@=>B|F-KfGPC27cRWFZoyJ|FL2X%r+x)-w#^3 z`<9?u*@{&)t=iYk>ZX<5Y$ms?$X3(;hq`A!*uDLm#?9T|TfytEgV&qE>%iwQR{j}p z`KDg`rkcK~I!Cvj)VpGPzHzS^8vT)|emc?j U(sU0Ln|H*IWbCK+D4a9?KVh{YM*si- diff --git a/.venv/Lib/site-packages/discord/ext/commands/__pycache__/bot.cpython-311.pyc b/.venv/Lib/site-packages/discord/ext/commands/__pycache__/bot.cpython-311.pyc deleted file mode 100644 index d9b6873d33d5a74331dd2d977deed2797a7a3c68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64002 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 diff --git a/.venv/Lib/site-packages/discord/ext/commands/__pycache__/converter.cpython-311.pyc b/.venv/Lib/site-packages/discord/ext/commands/__pycache__/converter.cpython-311.pyc deleted file mode 100644 index 5528f3a69a2f9781616041c8a13c51aa985111cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63896 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 diff --git a/.venv/Lib/site-packages/discord/ext/commands/__pycache__/cooldowns.cpython-311.pyc b/.venv/Lib/site-packages/discord/ext/commands/__pycache__/cooldowns.cpython-311.pyc deleted file mode 100644 index bd56684722eadaa0a88268faca0d2daefe60eceb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16131 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 diff --git a/.venv/Lib/site-packages/discord/ext/commands/__pycache__/errors.cpython-311.pyc b/.venv/Lib/site-packages/discord/ext/commands/__pycache__/errors.cpython-311.pyc deleted file mode 100644 index eb2edb61d4289190c6d4b79a8752f752720f30d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59595 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 ThVy= diff --git a/.venv/Lib/site-packages/discord/ext/commands/__pycache__/help.cpython-311.pyc b/.venv/Lib/site-packages/discord/ext/commands/__pycache__/help.cpython-311.pyc deleted file mode 100644 index 527896e5417c91673388fdb8536b4d71d734f851..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76188 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 Iii(i>ABF{I1ONa4 diff --git a/.venv/Lib/site-packages/discord/ext/commands/__pycache__/hybrid.cpython-311.pyc b/.venv/Lib/site-packages/discord/ext/commands/__pycache__/hybrid.cpython-311.pyc deleted file mode 100644 index 18191e98f6c04a828a6b2deb3a1d4b2752eb341b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46746 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 A7ytkO diff --git a/.venv/Lib/site-packages/discord/ext/commands/__pycache__/view.cpython-311.pyc b/.venv/Lib/site-packages/discord/ext/commands/__pycache__/view.cpython-311.pyc deleted file mode 100644 index 71d295f8c1d168a259e8e2d115f387913e90863a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8444 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 BbG`ro diff --git a/.venv/Lib/site-packages/discord/ext/commands/_types.py b/.venv/Lib/site-packages/discord/ext/commands/_types.py deleted file mode 100644 index 1331c9f..0000000 --- a/.venv/Lib/site-packages/discord/ext/commands/_types.py +++ /dev/null @@ -1,73 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - - -from typing import Any, Awaitable, Callable, Coroutine, TYPE_CHECKING, Protocol, TypeVar, Union, Tuple, Optional - - -T = TypeVar('T') - -if TYPE_CHECKING: - from typing_extensions import ParamSpec - - from .bot import Bot, AutoShardedBot - from .context import Context - from .cog import Cog - from .errors import CommandError - - P = ParamSpec('P') - MaybeAwaitableFunc = Callable[P, 'MaybeAwaitable[T]'] -else: - P = TypeVar('P') - MaybeAwaitableFunc = Tuple[P, T] - -_Bot = Union['Bot', 'AutoShardedBot'] -Coro = Coroutine[Any, Any, T] -CoroFunc = Callable[..., Coro[Any]] -MaybeCoro = Union[T, Coro[T]] -MaybeAwaitable = Union[T, Awaitable[T]] - -CogT = TypeVar('CogT', bound='Optional[Cog]') -UserCheck = Callable[["ContextT"], MaybeCoro[bool]] -Hook = Union[Callable[["CogT", "ContextT"], Coro[Any]], Callable[["ContextT"], Coro[Any]]] -Error = Union[Callable[["CogT", "ContextT", "CommandError"], Coro[Any]], Callable[["ContextT", "CommandError"], Coro[Any]]] - -ContextT = TypeVar('ContextT', bound='Context[Any]') -BotT = TypeVar('BotT', bound=_Bot, covariant=True) - -ContextT_co = TypeVar('ContextT_co', bound='Context[Any]', covariant=True) - - -class Check(Protocol[ContextT_co]): # type: ignore # TypeVar is expected to be invariant - - predicate: Callable[[ContextT_co], Coroutine[Any, Any, bool]] - - def __call__(self, coro_or_commands: T) -> T: - ... - - -# This is merely a tag type to avoid circular import issues. -# Yes, this is a terrible solution but ultimately it is the only solution. -class _BaseCommand: - __slots__ = () diff --git a/.venv/Lib/site-packages/discord/ext/commands/bot.py b/.venv/Lib/site-packages/discord/ext/commands/bot.py deleted file mode 100644 index 363b665..0000000 --- a/.venv/Lib/site-packages/discord/ext/commands/bot.py +++ /dev/null @@ -1,1500 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - - -import asyncio -import collections -import collections.abc -import inspect -import importlib.util -import sys -import logging -import types -from typing import ( - Any, - Callable, - Mapping, - List, - Dict, - TYPE_CHECKING, - Optional, - Sequence, - TypeVar, - Type, - Union, - Iterable, - Collection, - overload, -) - -import discord -from discord import app_commands -from discord.app_commands.tree import _retrieve_guild_ids -from discord.utils import MISSING, _is_submodule - -from .core import GroupMixin -from .view import StringView -from .context import Context -from . import errors -from .help import HelpCommand, DefaultHelpCommand -from .cog import Cog -from .hybrid import hybrid_command, hybrid_group, HybridCommand, HybridGroup - -if TYPE_CHECKING: - from typing_extensions import Self - - import importlib.machinery - - from discord.message import Message - from discord.interactions import Interaction - from discord.abc import User, Snowflake - from ._types import ( - _Bot, - BotT, - UserCheck, - CoroFunc, - ContextT, - MaybeAwaitableFunc, - ) - from .core import Command - from .hybrid import CommandCallback, ContextT, P - - _Prefix = Union[Iterable[str], str] - _PrefixCallable = MaybeAwaitableFunc[[BotT, Message], _Prefix] - PrefixType = Union[_Prefix, _PrefixCallable[BotT]] - -__all__ = ( - 'when_mentioned', - 'when_mentioned_or', - 'Bot', - 'AutoShardedBot', -) - -T = TypeVar('T') -CFT = TypeVar('CFT', bound='CoroFunc') - -_log = logging.getLogger(__name__) - - -def when_mentioned(bot: _Bot, msg: Message, /) -> List[str]: - """A callable that implements a command prefix equivalent to being mentioned. - - These are meant to be passed into the :attr:`.Bot.command_prefix` attribute. - - .. versionchanged:: 2.0 - - ``bot`` and ``msg`` parameters are now positional-only. - """ - # bot.user will never be None when this is called - return [f'<@{bot.user.id}> ', f'<@!{bot.user.id}> '] # type: ignore - - -def when_mentioned_or(*prefixes: str) -> Callable[[_Bot, Message], List[str]]: - """A callable that implements when mentioned or other prefixes provided. - - These are meant to be passed into the :attr:`.Bot.command_prefix` attribute. - - Example - -------- - - .. code-block:: python3 - - bot = commands.Bot(command_prefix=commands.when_mentioned_or('!')) - - - .. note:: - - This callable returns another callable, so if this is done inside a custom - callable, you must call the returned callable, for example: - - .. code-block:: python3 - - async def get_prefix(bot, message): - extras = await prefixes_for(message.guild) # returns a list - return commands.when_mentioned_or(*extras)(bot, message) - - - See Also - ---------- - :func:`.when_mentioned` - """ - - def inner(bot, msg): - r = list(prefixes) - r = when_mentioned(bot, msg) + r - return r - - return inner - - -class _DefaultRepr: - def __repr__(self): - return '' - - -_default: Any = _DefaultRepr() - - -class BotBase(GroupMixin[None]): - def __init__( - self, - command_prefix: PrefixType[BotT], - *, - help_command: Optional[HelpCommand] = _default, - tree_cls: Type[app_commands.CommandTree[Any]] = app_commands.CommandTree, - description: Optional[str] = None, - intents: discord.Intents, - **options: Any, - ) -> None: - super().__init__(intents=intents, **options) - self.command_prefix: PrefixType[BotT] = command_prefix - self.extra_events: Dict[str, List[CoroFunc]] = {} - # Self doesn't have the ClientT bound, but since this is a mixin it technically does - self.__tree: app_commands.CommandTree[Self] = tree_cls(self) # type: ignore - self.__cogs: Dict[str, Cog] = {} - self.__extensions: Dict[str, types.ModuleType] = {} - self._checks: List[UserCheck] = [] - self._check_once: List[UserCheck] = [] - self._before_invoke: Optional[CoroFunc] = None - self._after_invoke: Optional[CoroFunc] = None - self._help_command: Optional[HelpCommand] = None - self.description: str = inspect.cleandoc(description) if description else '' - self.owner_id: Optional[int] = options.get('owner_id') - self.owner_ids: Optional[Collection[int]] = options.get('owner_ids', set()) - self.strip_after_prefix: bool = options.get('strip_after_prefix', False) - - if self.owner_id and self.owner_ids: - raise TypeError('Both owner_id and owner_ids are set.') - - if self.owner_ids and not isinstance(self.owner_ids, collections.abc.Collection): - raise TypeError(f'owner_ids must be a collection not {self.owner_ids.__class__.__name__}') - - if help_command is _default: - self.help_command = DefaultHelpCommand() - else: - self.help_command = help_command - - # internal helpers - - async def _async_setup_hook(self) -> None: - # self/super() resolves to Client/AutoShardedClient - await super()._async_setup_hook() # type: ignore - prefix = self.command_prefix - - # This has to be here because for the default logging set up to capture - # the logging calls, they have to come after the `Client.run` call. - # The best place to do this is in an async init scenario - if not self.intents.message_content: # type: ignore - trigger_warning = ( - (callable(prefix) and prefix is not when_mentioned) - or isinstance(prefix, str) - or (isinstance(prefix, collections.abc.Iterable) and len(list(prefix)) >= 1) - ) - if trigger_warning: - _log.warning('Privileged message content intent is missing, commands may not work as expected.') - - def dispatch(self, event_name: str, /, *args: Any, **kwargs: Any) -> None: - # super() will resolve to Client - super().dispatch(event_name, *args, **kwargs) # type: ignore - ev = 'on_' + event_name - for event in self.extra_events.get(ev, []): - self._schedule_event(event, ev, *args, **kwargs) # type: ignore - - @discord.utils.copy_doc(discord.Client.close) - async def close(self) -> None: - for extension in tuple(self.__extensions): - try: - await self.unload_extension(extension) - except Exception: - pass - - for cog in tuple(self.__cogs): - try: - await self.remove_cog(cog) - except Exception: - pass - - await super().close() # type: ignore - - # GroupMixin overrides - - @discord.utils.copy_doc(GroupMixin.add_command) - def add_command(self, command: Command[Any, ..., Any], /) -> None: - super().add_command(command) - if isinstance(command, (HybridCommand, HybridGroup)) and command.app_command: - # If a cog is also inheriting from app_commands.Group then it'll also - # add the hybrid commands as text commands, which would recursively add the - # hybrid commands as slash commands. This check just terminates that recursion - # from happening - if command.cog is None or not command.cog.__cog_is_app_commands_group__: - self.tree.add_command(command.app_command) - - @discord.utils.copy_doc(GroupMixin.remove_command) - def remove_command(self, name: str, /) -> Optional[Command[Any, ..., Any]]: - cmd: Optional[Command[Any, ..., Any]] = super().remove_command(name) - if isinstance(cmd, (HybridCommand, HybridGroup)) and cmd.app_command: - # See above - if cmd.cog is not None and cmd.cog.__cog_is_app_commands_group__: - return cmd - - guild_ids: Optional[List[int]] = cmd.app_command._guild_ids - if guild_ids is None: - self.__tree.remove_command(name) - else: - for guild_id in guild_ids: - self.__tree.remove_command(name, guild=discord.Object(id=guild_id)) - - return cmd - - def hybrid_command( - self, - name: Union[str, app_commands.locale_str] = MISSING, - with_app_command: bool = True, - *args: Any, - **kwargs: Any, - ) -> Callable[[CommandCallback[Any, ContextT, P, T]], HybridCommand[Any, P, T]]: - """A shortcut decorator that invokes :func:`~discord.ext.commands.hybrid_command` and adds it to - the internal command list via :meth:`add_command`. - - Returns - -------- - Callable[..., :class:`HybridCommand`] - A decorator that converts the provided method into a Command, adds it to the bot, then returns it. - """ - - def decorator(func: CommandCallback[Any, ContextT, P, T]): - kwargs.setdefault('parent', self) - result = hybrid_command(name=name, *args, with_app_command=with_app_command, **kwargs)(func) - self.add_command(result) - return result - - return decorator - - def hybrid_group( - self, - name: Union[str, app_commands.locale_str] = MISSING, - with_app_command: bool = True, - *args: Any, - **kwargs: Any, - ) -> Callable[[CommandCallback[Any, ContextT, P, T]], HybridGroup[Any, P, T]]: - """A shortcut decorator that invokes :func:`~discord.ext.commands.hybrid_group` and adds it to - the internal command list via :meth:`add_command`. - - Returns - -------- - Callable[..., :class:`HybridGroup`] - A decorator that converts the provided method into a Group, adds it to the bot, then returns it. - """ - - def decorator(func: CommandCallback[Any, ContextT, P, T]): - kwargs.setdefault('parent', self) - result = hybrid_group(name=name, *args, with_app_command=with_app_command, **kwargs)(func) - self.add_command(result) - return result - - return decorator - - # Error handler - - async def on_command_error(self, context: Context[BotT], exception: errors.CommandError, /) -> None: - """|coro| - - The default command error handler provided by the bot. - - By default this logs to the library logger, however it could be - overridden to have a different implementation. - - This only fires if you do not specify any listeners for command error. - - .. versionchanged:: 2.0 - - ``context`` and ``exception`` parameters are now positional-only. - Instead of writing to ``sys.stderr`` this now uses the library logger. - """ - if self.extra_events.get('on_command_error', None): - return - - command = context.command - if command and command.has_error_handler(): - return - - cog = context.cog - if cog and cog.has_error_handler(): - return - - _log.error('Ignoring exception in command %s', command, exc_info=exception) - - # global check registration - - def check(self, func: T, /) -> T: - r"""A decorator that adds a global check to the bot. - - A global check is similar to a :func:`.check` that is applied - on a per command basis except it is run before any command checks - have been verified and applies to every command the bot has. - - .. note:: - - This function can either be a regular function or a coroutine. - - Similar to a command :func:`.check`\, this takes a single parameter - of type :class:`.Context` and can only raise exceptions inherited from - :exc:`.CommandError`. - - Example - --------- - - .. code-block:: python3 - - @bot.check - def check_commands(ctx): - return ctx.command.qualified_name in allowed_commands - - .. versionchanged:: 2.0 - - ``func`` parameter is now positional-only. - """ - # T was used instead of Check to ensure the type matches on return - self.add_check(func) # type: ignore - return func - - def add_check(self, func: UserCheck[ContextT], /, *, call_once: bool = False) -> None: - """Adds a global check to the bot. - - This is the non-decorator interface to :meth:`.check` - and :meth:`.check_once`. - - .. versionchanged:: 2.0 - - ``func`` parameter is now positional-only. - - .. seealso:: The :func:`~discord.ext.commands.check` decorator - - Parameters - ----------- - func - The function that was used as a global check. - call_once: :class:`bool` - If the function should only be called once per - :meth:`.invoke` call. - """ - - if call_once: - self._check_once.append(func) - else: - self._checks.append(func) - - def remove_check(self, func: UserCheck[ContextT], /, *, call_once: bool = False) -> None: - """Removes a global check from the bot. - - This function is idempotent and will not raise an exception - if the function is not in the global checks. - - .. versionchanged:: 2.0 - - ``func`` parameter is now positional-only. - - Parameters - ----------- - func - The function to remove from the global checks. - call_once: :class:`bool` - If the function was added with ``call_once=True`` in - the :meth:`.Bot.add_check` call or using :meth:`.check_once`. - """ - l = self._check_once if call_once else self._checks - - try: - l.remove(func) - except ValueError: - pass - - def check_once(self, func: CFT, /) -> CFT: - r"""A decorator that adds a "call once" global check to the bot. - - Unlike regular global checks, this one is called only once - per :meth:`.invoke` call. - - Regular global checks are called whenever a command is called - or :meth:`.Command.can_run` is called. This type of check - bypasses that and ensures that it's called only once, even inside - the default help command. - - .. note:: - - When using this function the :class:`.Context` sent to a group subcommand - may only parse the parent command and not the subcommands due to it - being invoked once per :meth:`.Bot.invoke` call. - - .. note:: - - This function can either be a regular function or a coroutine. - - Similar to a command :func:`.check`\, this takes a single parameter - of type :class:`.Context` and can only raise exceptions inherited from - :exc:`.CommandError`. - - Example - --------- - - .. code-block:: python3 - - @bot.check_once - def whitelist(ctx): - return ctx.message.author.id in my_whitelist - - .. versionchanged:: 2.0 - - ``func`` parameter is now positional-only. - - """ - self.add_check(func, call_once=True) - return func - - async def can_run(self, ctx: Context[BotT], /, *, call_once: bool = False) -> bool: - data = self._check_once if call_once else self._checks - - if len(data) == 0: - return True - - return await discord.utils.async_all(f(ctx) for f in data) - - async def is_owner(self, user: User, /) -> bool: - """|coro| - - Checks if a :class:`~discord.User` or :class:`~discord.Member` is the owner of - this bot. - - If an :attr:`owner_id` is not set, it is fetched automatically - through the use of :meth:`~.Bot.application_info`. - - .. versionchanged:: 1.3 - The function also checks if the application is team-owned if - :attr:`owner_ids` is not set. - - .. versionchanged:: 2.0 - - ``user`` parameter is now positional-only. - - Parameters - ----------- - user: :class:`.abc.User` - The user to check for. - - Returns - -------- - :class:`bool` - Whether the user is the owner. - """ - - if self.owner_id: - return user.id == self.owner_id - elif self.owner_ids: - return user.id in self.owner_ids - else: - - app = await self.application_info() # type: ignore - if app.team: - self.owner_ids = ids = {m.id for m in app.team.members} - return user.id in ids - else: - self.owner_id = owner_id = app.owner.id - return user.id == owner_id - - def before_invoke(self, coro: CFT, /) -> CFT: - """A decorator that registers a coroutine as a pre-invoke hook. - - A pre-invoke hook is called directly before the command is - called. This makes it a useful function to set up database - connections or any type of set up required. - - This pre-invoke hook takes a sole parameter, a :class:`.Context`. - - .. note:: - - The :meth:`~.Bot.before_invoke` and :meth:`~.Bot.after_invoke` hooks are - only called if all checks and argument parsing procedures pass - without error. If any check or argument parsing procedures fail - then the hooks are not called. - - .. versionchanged:: 2.0 - - ``coro`` parameter is now positional-only. - - Parameters - ----------- - coro: :ref:`coroutine ` - The coroutine to register as the pre-invoke hook. - - Raises - ------- - TypeError - The coroutine passed is not actually a coroutine. - """ - if not asyncio.iscoroutinefunction(coro): - raise TypeError('The pre-invoke hook must be a coroutine.') - - self._before_invoke = coro - return coro - - def after_invoke(self, coro: CFT, /) -> CFT: - r"""A decorator that registers a coroutine as a post-invoke hook. - - A post-invoke hook is called directly after the command is - called. This makes it a useful function to clean-up database - connections or any type of clean up required. - - This post-invoke hook takes a sole parameter, a :class:`.Context`. - - .. note:: - - Similar to :meth:`~.Bot.before_invoke`\, this is not called unless - checks and argument parsing procedures succeed. This hook is, - however, **always** called regardless of the internal command - callback raising an error (i.e. :exc:`.CommandInvokeError`\). - This makes it ideal for clean-up scenarios. - - .. versionchanged:: 2.0 - - ``coro`` parameter is now positional-only. - - Parameters - ----------- - coro: :ref:`coroutine ` - The coroutine to register as the post-invoke hook. - - Raises - ------- - TypeError - The coroutine passed is not actually a coroutine. - """ - if not asyncio.iscoroutinefunction(coro): - raise TypeError('The post-invoke hook must be a coroutine.') - - self._after_invoke = coro - return coro - - # listener registration - - def add_listener(self, func: CoroFunc, /, name: str = MISSING) -> None: - """The non decorator alternative to :meth:`.listen`. - - .. versionchanged:: 2.0 - - ``func`` parameter is now positional-only. - - Parameters - ----------- - func: :ref:`coroutine ` - The function to call. - name: :class:`str` - The name of the event to listen for. Defaults to ``func.__name__``. - - Example - -------- - - .. code-block:: python3 - - async def on_ready(): pass - async def my_message(message): pass - - bot.add_listener(on_ready) - bot.add_listener(my_message, 'on_message') - - """ - name = func.__name__ if name is MISSING else name - - if not asyncio.iscoroutinefunction(func): - raise TypeError('Listeners must be coroutines') - - if name in self.extra_events: - self.extra_events[name].append(func) - else: - self.extra_events[name] = [func] - - def remove_listener(self, func: CoroFunc, /, name: str = MISSING) -> None: - """Removes a listener from the pool of listeners. - - .. versionchanged:: 2.0 - - ``func`` parameter is now positional-only. - - Parameters - ----------- - func - The function that was used as a listener to remove. - name: :class:`str` - The name of the event we want to remove. Defaults to - ``func.__name__``. - """ - - name = func.__name__ if name is MISSING else name - - if name in self.extra_events: - try: - self.extra_events[name].remove(func) - except ValueError: - pass - - def listen(self, name: str = MISSING) -> Callable[[CFT], CFT]: - """A decorator that registers another function as an external - event listener. Basically this allows you to listen to multiple - events from different places e.g. such as :func:`.on_ready` - - The functions being listened to must be a :ref:`coroutine `. - - Example - -------- - - .. code-block:: python3 - - @bot.listen() - async def on_message(message): - print('one') - - # in some other file... - - @bot.listen('on_message') - async def my_message(message): - print('two') - - Would print one and two in an unspecified order. - - Raises - ------- - TypeError - The function being listened to is not a coroutine. - """ - - def decorator(func: CFT) -> CFT: - self.add_listener(func, name) - return func - - return decorator - - # cogs - - async def add_cog( - self, - cog: Cog, - /, - *, - override: bool = False, - guild: Optional[Snowflake] = MISSING, - guilds: Sequence[Snowflake] = MISSING, - ) -> None: - """|coro| - - Adds a "cog" to the bot. - - A cog is a class that has its own event listeners and commands. - - If the cog is a :class:`.app_commands.Group` then it is added to - the bot's :class:`~discord.app_commands.CommandTree` as well. - - .. note:: - - Exceptions raised inside a :class:`.Cog`'s :meth:`~.Cog.cog_load` method will be - propagated to the caller. - - .. versionchanged:: 2.0 - - :exc:`.ClientException` is raised when a cog with the same name - is already loaded. - - .. versionchanged:: 2.0 - - ``cog`` parameter is now positional-only. - - .. versionchanged:: 2.0 - - This method is now a :term:`coroutine`. - - Parameters - ----------- - cog: :class:`.Cog` - The cog to register to the bot. - override: :class:`bool` - If a previously loaded cog with the same name should be ejected - instead of raising an error. - - .. versionadded:: 2.0 - guild: Optional[:class:`~discord.abc.Snowflake`] - If the cog is an application command group, then this would be the - guild where the cog group would be added to. If not given then - it becomes a global command instead. - - .. versionadded:: 2.0 - guilds: List[:class:`~discord.abc.Snowflake`] - If the cog is an application command group, then this would be the - guilds where the cog group would be added to. If not given then - it becomes a global command instead. Cannot be mixed with - ``guild``. - - .. versionadded:: 2.0 - - Raises - ------- - TypeError - The cog does not inherit from :class:`.Cog`. - CommandError - An error happened during loading. - ClientException - A cog with the same name is already loaded. - """ - - if not isinstance(cog, Cog): - raise TypeError('cogs must derive from Cog') - - cog_name = cog.__cog_name__ - existing = self.__cogs.get(cog_name) - - if existing is not None: - if not override: - raise discord.ClientException(f'Cog named {cog_name!r} already loaded') - await self.remove_cog(cog_name, guild=guild, guilds=guilds) - - if cog.__cog_app_commands_group__: - self.__tree.add_command(cog.__cog_app_commands_group__, override=override, guild=guild, guilds=guilds) - - cog = await cog._inject(self, override=override, guild=guild, guilds=guilds) - self.__cogs[cog_name] = cog - - def get_cog(self, name: str, /) -> Optional[Cog]: - """Gets the cog instance requested. - - If the cog is not found, ``None`` is returned instead. - - .. versionchanged:: 2.0 - - ``name`` parameter is now positional-only. - - Parameters - ----------- - name: :class:`str` - The name of the cog you are requesting. - This is equivalent to the name passed via keyword - argument in class creation or the class name if unspecified. - - Returns - -------- - Optional[:class:`Cog`] - The cog that was requested. If not found, returns ``None``. - """ - return self.__cogs.get(name) - - async def remove_cog( - self, - name: str, - /, - *, - guild: Optional[Snowflake] = MISSING, - guilds: Sequence[Snowflake] = MISSING, - ) -> Optional[Cog]: - """|coro| - - Removes a cog from the bot and returns it. - - All registered commands and event listeners that the - cog has registered will be removed as well. - - If no cog is found then this method has no effect. - - .. versionchanged:: 2.0 - - ``name`` parameter is now positional-only. - - .. versionchanged:: 2.0 - - This method is now a :term:`coroutine`. - - Parameters - ----------- - name: :class:`str` - The name of the cog to remove. - guild: Optional[:class:`~discord.abc.Snowflake`] - If the cog is an application command group, then this would be the - guild where the cog group would be removed from. If not given then - a global command is removed instead instead. - - .. versionadded:: 2.0 - guilds: List[:class:`~discord.abc.Snowflake`] - If the cog is an application command group, then this would be the - guilds where the cog group would be removed from. If not given then - a global command is removed instead instead. Cannot be mixed with - ``guild``. - - .. versionadded:: 2.0 - - Returns - ------- - Optional[:class:`.Cog`] - The cog that was removed. ``None`` if not found. - """ - - cog = self.__cogs.pop(name, None) - if cog is None: - return - - help_command = self._help_command - if help_command and help_command.cog is cog: - help_command.cog = None - - guild_ids = _retrieve_guild_ids(cog, guild, guilds) - if cog.__cog_app_commands_group__: - if guild_ids is None: - self.__tree.remove_command(name) - else: - for guild_id in guild_ids: - self.__tree.remove_command(name, guild=discord.Object(guild_id)) - - await cog._eject(self, guild_ids=guild_ids) - - return cog - - @property - def cogs(self) -> Mapping[str, Cog]: - """Mapping[:class:`str`, :class:`Cog`]: A read-only mapping of cog name to cog.""" - return types.MappingProxyType(self.__cogs) - - # extensions - - async def _remove_module_references(self, name: str) -> None: - # find all references to the module - # remove the cogs registered from the module - for cogname, cog in self.__cogs.copy().items(): - if _is_submodule(name, cog.__module__): - await self.remove_cog(cogname) - - # remove all the commands from the module - for cmd in self.all_commands.copy().values(): - if cmd.module is not None and _is_submodule(name, cmd.module): - if isinstance(cmd, GroupMixin): - cmd.recursively_remove_all_commands() - self.remove_command(cmd.name) - - # remove all the listeners from the module - for event_list in self.extra_events.copy().values(): - remove = [] - for index, event in enumerate(event_list): - if event.__module__ is not None and _is_submodule(name, event.__module__): - remove.append(index) - - for index in reversed(remove): - del event_list[index] - - # remove all relevant application commands from the tree - self.__tree._remove_with_module(name) - - async def _call_module_finalizers(self, lib: types.ModuleType, key: str) -> None: - try: - func = getattr(lib, 'teardown') - except AttributeError: - pass - else: - try: - await func(self) - except Exception: - pass - finally: - self.__extensions.pop(key, None) - sys.modules.pop(key, None) - name = lib.__name__ - for module in list(sys.modules.keys()): - if _is_submodule(name, module): - del sys.modules[module] - - async def _load_from_module_spec(self, spec: importlib.machinery.ModuleSpec, key: str) -> None: - # precondition: key not in self.__extensions - lib = importlib.util.module_from_spec(spec) - sys.modules[key] = lib - try: - spec.loader.exec_module(lib) # type: ignore - except Exception as e: - del sys.modules[key] - raise errors.ExtensionFailed(key, e) from e - - try: - setup = getattr(lib, 'setup') - except AttributeError: - del sys.modules[key] - raise errors.NoEntryPointError(key) - - try: - await setup(self) - except Exception as e: - del sys.modules[key] - await self._remove_module_references(lib.__name__) - await self._call_module_finalizers(lib, key) - raise errors.ExtensionFailed(key, e) from e - else: - self.__extensions[key] = lib - - def _resolve_name(self, name: str, package: Optional[str]) -> str: - try: - return importlib.util.resolve_name(name, package) - except ImportError: - raise errors.ExtensionNotFound(name) - - async def load_extension(self, name: str, *, package: Optional[str] = None) -> None: - """|coro| - - Loads an extension. - - An extension is a python module that contains commands, cogs, or - listeners. - - An extension must have a global function, ``setup`` defined as - the entry point on what to do when the extension is loaded. This entry - point must have a single argument, the ``bot``. - - .. versionchanged:: 2.0 - - This method is now a :term:`coroutine`. - - Parameters - ------------ - name: :class:`str` - The extension name to load. It must be dot separated like - regular Python imports if accessing a sub-module. e.g. - ``foo.test`` if you want to import ``foo/test.py``. - package: Optional[:class:`str`] - The package name to resolve relative imports with. - This is required when loading an extension using a relative path, e.g ``.foo.test``. - Defaults to ``None``. - - .. versionadded:: 1.7 - - Raises - -------- - ExtensionNotFound - The extension could not be imported. - This is also raised if the name of the extension could not - be resolved using the provided ``package`` parameter. - ExtensionAlreadyLoaded - The extension is already loaded. - NoEntryPointError - The extension does not have a setup function. - ExtensionFailed - The extension or its setup function had an execution error. - """ - - name = self._resolve_name(name, package) - if name in self.__extensions: - raise errors.ExtensionAlreadyLoaded(name) - - spec = importlib.util.find_spec(name) - if spec is None: - raise errors.ExtensionNotFound(name) - - await self._load_from_module_spec(spec, name) - - async def unload_extension(self, name: str, *, package: Optional[str] = None) -> None: - """|coro| - - Unloads an extension. - - When the extension is unloaded, all commands, listeners, and cogs are - removed from the bot and the module is un-imported. - - The extension can provide an optional global function, ``teardown``, - to do miscellaneous clean-up if necessary. This function takes a single - parameter, the ``bot``, similar to ``setup`` from - :meth:`~.Bot.load_extension`. - - .. versionchanged:: 2.0 - - This method is now a :term:`coroutine`. - - Parameters - ------------ - name: :class:`str` - The extension name to unload. It must be dot separated like - regular Python imports if accessing a sub-module. e.g. - ``foo.test`` if you want to import ``foo/test.py``. - package: Optional[:class:`str`] - The package name to resolve relative imports with. - This is required when unloading an extension using a relative path, e.g ``.foo.test``. - Defaults to ``None``. - - .. versionadded:: 1.7 - - Raises - ------- - ExtensionNotFound - The name of the extension could not - be resolved using the provided ``package`` parameter. - ExtensionNotLoaded - The extension was not loaded. - """ - - name = self._resolve_name(name, package) - lib = self.__extensions.get(name) - if lib is None: - raise errors.ExtensionNotLoaded(name) - - await self._remove_module_references(lib.__name__) - await self._call_module_finalizers(lib, name) - - async def reload_extension(self, name: str, *, package: Optional[str] = None) -> None: - """|coro| - - Atomically reloads an extension. - - This replaces the extension with the same extension, only refreshed. This is - equivalent to a :meth:`unload_extension` followed by a :meth:`load_extension` - except done in an atomic way. That is, if an operation fails mid-reload then - the bot will roll-back to the prior working state. - - Parameters - ------------ - name: :class:`str` - The extension name to reload. It must be dot separated like - regular Python imports if accessing a sub-module. e.g. - ``foo.test`` if you want to import ``foo/test.py``. - package: Optional[:class:`str`] - The package name to resolve relative imports with. - This is required when reloading an extension using a relative path, e.g ``.foo.test``. - Defaults to ``None``. - - .. versionadded:: 1.7 - - Raises - ------- - ExtensionNotLoaded - The extension was not loaded. - ExtensionNotFound - The extension could not be imported. - This is also raised if the name of the extension could not - be resolved using the provided ``package`` parameter. - NoEntryPointError - The extension does not have a setup function. - ExtensionFailed - The extension setup function had an execution error. - """ - - name = self._resolve_name(name, package) - lib = self.__extensions.get(name) - if lib is None: - raise errors.ExtensionNotLoaded(name) - - # get the previous module states from sys modules - # fmt: off - modules = { - name: module - for name, module in sys.modules.items() - if _is_submodule(lib.__name__, name) - } - # fmt: on - - try: - # Unload and then load the module... - await self._remove_module_references(lib.__name__) - await self._call_module_finalizers(lib, name) - await self.load_extension(name) - except Exception: - # if the load failed, the remnants should have been - # cleaned from the load_extension function call - # so let's load it from our old compiled library. - await lib.setup(self) - self.__extensions[name] = lib - - # revert sys.modules back to normal and raise back to caller - sys.modules.update(modules) - raise - - @property - def extensions(self) -> Mapping[str, types.ModuleType]: - """Mapping[:class:`str`, :class:`py:types.ModuleType`]: A read-only mapping of extension name to extension.""" - return types.MappingProxyType(self.__extensions) - - # help command stuff - - @property - def help_command(self) -> Optional[HelpCommand]: - return self._help_command - - @help_command.setter - def help_command(self, value: Optional[HelpCommand]) -> None: - if value is not None: - if not isinstance(value, HelpCommand): - raise TypeError('help_command must be a subclass of HelpCommand') - if self._help_command is not None: - self._help_command._remove_from_bot(self) - self._help_command = value - value._add_to_bot(self) - elif self._help_command is not None: - self._help_command._remove_from_bot(self) - self._help_command = None - else: - self._help_command = None - - # application command interop - - # As mentioned above, this is a mixin so the Self type hint fails here. - # However, since the only classes that can use this are subclasses of Client - # anyway, then this is sound. - @property - def tree(self) -> app_commands.CommandTree[Self]: # type: ignore - """:class:`~discord.app_commands.CommandTree`: The command tree responsible for handling the application commands - in this bot. - - .. versionadded:: 2.0 - """ - return self.__tree - - # command processing - - async def get_prefix(self, message: Message, /) -> Union[List[str], str]: - """|coro| - - Retrieves the prefix the bot is listening to - with the message as a context. - - .. versionchanged:: 2.0 - - ``message`` parameter is now positional-only. - - Parameters - ----------- - message: :class:`discord.Message` - The message context to get the prefix of. - - Returns - -------- - Union[List[:class:`str`], :class:`str`] - A list of prefixes or a single prefix that the bot is - listening for. - """ - prefix = ret = self.command_prefix - - if callable(prefix): - # self will be a Bot or AutoShardedBot - ret = await discord.utils.maybe_coroutine(prefix, self, message) # type: ignore - - if not isinstance(ret, str): - try: - ret = list(ret) # type: ignore - except TypeError: - # It's possible that a generator raised this exception. Don't - # replace it with our own error if that's the case. - if isinstance(ret, collections.abc.Iterable): - raise - - raise TypeError( - "command_prefix must be plain string, iterable of strings, or callable " - f"returning either of these, not {ret.__class__.__name__}" - ) - - return ret - - @overload - async def get_context( - self, - origin: Union[Message, Interaction], - /, - ) -> Context[Self]: # type: ignore - ... - - @overload - async def get_context( - self, - origin: Union[Message, Interaction], - /, - *, - cls: Type[ContextT], - ) -> ContextT: - ... - - async def get_context( - self, - origin: Union[Message, Interaction], - /, - *, - cls: Type[ContextT] = MISSING, - ) -> Any: - r"""|coro| - - Returns the invocation context from the message or interaction. - - This is a more low-level counter-part for :meth:`.process_commands` - to allow users more fine grained control over the processing. - - The returned context is not guaranteed to be a valid invocation - context, :attr:`.Context.valid` must be checked to make sure it is. - If the context is not valid then it is not a valid candidate to be - invoked under :meth:`~.Bot.invoke`. - - .. note:: - - In order for the custom context to be used inside an interaction-based - context (such as :class:`HybridCommand`) then this method must be - overridden to return that class. - - .. versionchanged:: 2.0 - - ``message`` parameter is now positional-only and renamed to ``origin``. - - Parameters - ----------- - origin: Union[:class:`discord.Message`, :class:`discord.Interaction`] - The message or interaction to get the invocation context from. - cls - The factory class that will be used to create the context. - By default, this is :class:`.Context`. Should a custom - class be provided, it must be similar enough to :class:`.Context`\'s - interface. - - Returns - -------- - :class:`.Context` - The invocation context. The type of this can change via the - ``cls`` parameter. - """ - if cls is MISSING: - cls = Context # type: ignore - - if isinstance(origin, discord.Interaction): - return await cls.from_interaction(origin) - - view = StringView(origin.content) - ctx = cls(prefix=None, view=view, bot=self, message=origin) - - if origin.author.id == self.user.id: # type: ignore - return ctx - - prefix = await self.get_prefix(origin) - invoked_prefix = prefix - - if isinstance(prefix, str): - if not view.skip_string(prefix): - return ctx - else: - try: - # if the context class' __init__ consumes something from the view this - # will be wrong. That seems unreasonable though. - if origin.content.startswith(tuple(prefix)): - invoked_prefix = discord.utils.find(view.skip_string, prefix) - else: - return ctx - - except TypeError: - if not isinstance(prefix, list): - raise TypeError( - "get_prefix must return either a string or a list of string, " f"not {prefix.__class__.__name__}" - ) - - # It's possible a bad command_prefix got us here. - for value in prefix: - if not isinstance(value, str): - raise TypeError( - "Iterable command_prefix or list returned from get_prefix must " - f"contain only strings, not {value.__class__.__name__}" - ) - - # Getting here shouldn't happen - raise - - if self.strip_after_prefix: - view.skip_ws() - - invoker = view.get_word() - ctx.invoked_with = invoker - # type-checker fails to narrow invoked_prefix type. - ctx.prefix = invoked_prefix # type: ignore - ctx.command = self.all_commands.get(invoker) - return ctx - - async def invoke(self, ctx: Context[BotT], /) -> None: - """|coro| - - Invokes the command given under the invocation context and - handles all the internal event dispatch mechanisms. - - .. versionchanged:: 2.0 - - ``ctx`` parameter is now positional-only. - - Parameters - ----------- - ctx: :class:`.Context` - The invocation context to invoke. - """ - if ctx.command is not None: - self.dispatch('command', ctx) - try: - if await self.can_run(ctx, call_once=True): - await ctx.command.invoke(ctx) - else: - raise errors.CheckFailure('The global check once functions failed.') - except errors.CommandError as exc: - await ctx.command.dispatch_error(ctx, exc) - else: - self.dispatch('command_completion', ctx) - elif ctx.invoked_with: - exc = errors.CommandNotFound(f'Command "{ctx.invoked_with}" is not found') - self.dispatch('command_error', ctx, exc) - - async def process_commands(self, message: Message, /) -> None: - """|coro| - - This function processes the commands that have been registered - to the bot and other groups. Without this coroutine, none of the - commands will be triggered. - - By default, this coroutine is called inside the :func:`.on_message` - event. If you choose to override the :func:`.on_message` event, then - you should invoke this coroutine as well. - - This is built using other low level tools, and is equivalent to a - call to :meth:`~.Bot.get_context` followed by a call to :meth:`~.Bot.invoke`. - - This also checks if the message's author is a bot and doesn't - call :meth:`~.Bot.get_context` or :meth:`~.Bot.invoke` if so. - - .. versionchanged:: 2.0 - - ``message`` parameter is now positional-only. - - Parameters - ----------- - message: :class:`discord.Message` - The message to process commands for. - """ - if message.author.bot: - return - - ctx = await self.get_context(message) - # the type of the invocation context's bot attribute will be correct - await self.invoke(ctx) # type: ignore - - async def on_message(self, message: Message, /) -> None: - await self.process_commands(message) - - -class Bot(BotBase, discord.Client): - """Represents a Discord bot. - - This class is a subclass of :class:`discord.Client` and as a result - anything that you can do with a :class:`discord.Client` you can do with - this bot. - - This class also subclasses :class:`.GroupMixin` to provide the functionality - to manage commands. - - Unlike :class:`discord.Client`, this class does not require manually setting - a :class:`~discord.app_commands.CommandTree` and is automatically set upon - instantiating the class. - - .. container:: operations - - .. describe:: async with x - - Asynchronously initialises the bot and automatically cleans up. - - .. versionadded:: 2.0 - - Attributes - ----------- - command_prefix - The command prefix is what the message content must contain initially - to have a command invoked. This prefix could either be a string to - indicate what the prefix should be, or a callable that takes in the bot - as its first parameter and :class:`discord.Message` as its second - parameter and returns the prefix. This is to facilitate "dynamic" - command prefixes. This callable can be either a regular function or - a coroutine. - - An empty string as the prefix always matches, enabling prefix-less - command invocation. While this may be useful in DMs it should be avoided - in servers, as it's likely to cause performance issues and unintended - command invocations. - - The command prefix could also be an iterable of strings indicating that - multiple checks for the prefix should be used and the first one to - match will be the invocation prefix. You can get this prefix via - :attr:`.Context.prefix`. - - .. note:: - - When passing multiple prefixes be careful to not pass a prefix - that matches a longer prefix occurring later in the sequence. For - example, if the command prefix is ``('!', '!?')`` the ``'!?'`` - prefix will never be matched to any message as the previous one - matches messages starting with ``!?``. This is especially important - when passing an empty string, it should always be last as no prefix - after it will be matched. - case_insensitive: :class:`bool` - Whether the commands should be case insensitive. Defaults to ``False``. This - attribute does not carry over to groups. You must set it to every group if - you require group commands to be case insensitive as well. - description: :class:`str` - The content prefixed into the default help message. - help_command: Optional[:class:`.HelpCommand`] - The help command implementation to use. This can be dynamically - set at runtime. To remove the help command pass ``None``. For more - information on implementing a help command, see :ref:`ext_commands_help_command`. - owner_id: Optional[:class:`int`] - The user ID that owns the bot. If this is not set and is then queried via - :meth:`.is_owner` then it is fetched automatically using - :meth:`~.Bot.application_info`. - owner_ids: Optional[Collection[:class:`int`]] - The user IDs that owns the bot. This is similar to :attr:`owner_id`. - If this is not set and the application is team based, then it is - fetched automatically using :meth:`~.Bot.application_info`. - For performance reasons it is recommended to use a :class:`set` - for the collection. You cannot set both ``owner_id`` and ``owner_ids``. - - .. versionadded:: 1.3 - strip_after_prefix: :class:`bool` - Whether to strip whitespace characters after encountering the command - prefix. This allows for ``! hello`` and ``!hello`` to both work if - the ``command_prefix`` is set to ``!``. Defaults to ``False``. - - .. versionadded:: 1.7 - tree_cls: Type[:class:`~discord.app_commands.CommandTree`] - The type of application command tree to use. Defaults to :class:`~discord.app_commands.CommandTree`. - - .. versionadded:: 2.0 - """ - - pass - - -class AutoShardedBot(BotBase, discord.AutoShardedClient): - """This is similar to :class:`.Bot` except that it is inherited from - :class:`discord.AutoShardedClient` instead. - - .. container:: operations - - .. describe:: async with x - - Asynchronously initialises the bot and automatically cleans. - - .. versionadded:: 2.0 - """ - - pass diff --git a/.venv/Lib/site-packages/discord/ext/commands/cog.py b/.venv/Lib/site-packages/discord/ext/commands/cog.py deleted file mode 100644 index 319f85b..0000000 --- a/.venv/Lib/site-packages/discord/ext/commands/cog.py +++ /dev/null @@ -1,787 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" -from __future__ import annotations - -import inspect -import discord -from discord import app_commands -from discord.utils import maybe_coroutine, _to_kebab_case - -from typing import ( - Any, - Callable, - ClassVar, - Coroutine, - Dict, - Generator, - Iterable, - List, - Optional, - TYPE_CHECKING, - Sequence, - Tuple, - TypeVar, - Union, -) - -from ._types import _BaseCommand, BotT - -if TYPE_CHECKING: - from typing_extensions import Self - from discord.abc import Snowflake - from discord._types import ClientT - - from .bot import BotBase - from .context import Context - from .core import Command - -__all__ = ( - 'CogMeta', - 'Cog', - 'GroupCog', -) - -FuncT = TypeVar('FuncT', bound=Callable[..., Any]) - -MISSING: Any = discord.utils.MISSING - - -class CogMeta(type): - """A metaclass for defining a cog. - - Note that you should probably not use this directly. It is exposed - purely for documentation purposes along with making custom metaclasses to intermix - with other metaclasses such as the :class:`abc.ABCMeta` metaclass. - - For example, to create an abstract cog mixin class, the following would be done. - - .. code-block:: python3 - - import abc - - class CogABCMeta(commands.CogMeta, abc.ABCMeta): - pass - - class SomeMixin(metaclass=abc.ABCMeta): - pass - - class SomeCogMixin(SomeMixin, commands.Cog, metaclass=CogABCMeta): - pass - - .. note:: - - When passing an attribute of a metaclass that is documented below, note - that you must pass it as a keyword-only argument to the class creation - like the following example: - - .. code-block:: python3 - - class MyCog(commands.Cog, name='My Cog'): - pass - - Attributes - ----------- - name: :class:`str` - The cog name. By default, it is the name of the class with no modification. - description: :class:`str` - The cog description. By default, it is the cleaned docstring of the class. - - .. versionadded:: 1.6 - - command_attrs: :class:`dict` - A list of attributes to apply to every command inside this cog. The dictionary - is passed into the :class:`Command` options at ``__init__``. - If you specify attributes inside the command attribute in the class, it will - override the one specified inside this attribute. For example: - - .. code-block:: python3 - - class MyCog(commands.Cog, command_attrs=dict(hidden=True)): - @commands.command() - async def foo(self, ctx): - pass # hidden -> True - - @commands.command(hidden=False) - async def bar(self, ctx): - pass # hidden -> False - - group_name: Union[:class:`str`, :class:`~discord.app_commands.locale_str`] - The group name of a cog. This is only applicable for :class:`GroupCog` instances. - By default, it's the same value as :attr:`name`. - - .. versionadded:: 2.0 - group_description: Union[:class:`str`, :class:`~discord.app_commands.locale_str`] - The group description of a cog. This is only applicable for :class:`GroupCog` instances. - By default, it's the same value as :attr:`description`. - - .. versionadded:: 2.0 - group_nsfw: :class:`bool` - Whether the application command group is NSFW. This is only applicable for :class:`GroupCog` instances. - By default, it's ``False``. - - .. versionadded:: 2.0 - group_auto_locale_strings: :class:`bool` - If this is set to ``True``, then all translatable strings will implicitly - be wrapped into :class:`~discord.app_commands.locale_str` rather - than :class:`str`. Defaults to ``True``. - - .. versionadded:: 2.0 - group_extras: :class:`dict` - A dictionary that can be used to store extraneous data. - This is only applicable for :class:`GroupCog` instances. - The library will not touch any values or keys within this dictionary. - - .. versionadded:: 2.1 - """ - - __cog_name__: str - __cog_description__: str - __cog_group_name__: Union[str, app_commands.locale_str] - __cog_group_description__: Union[str, app_commands.locale_str] - __cog_group_nsfw__: bool - __cog_group_auto_locale_strings__: bool - __cog_group_extras__: Dict[Any, Any] - __cog_settings__: Dict[str, Any] - __cog_commands__: List[Command[Any, ..., Any]] - __cog_app_commands__: List[Union[app_commands.Group, app_commands.Command[Any, ..., Any]]] - __cog_listeners__: List[Tuple[str, str]] - - def __new__(cls, *args: Any, **kwargs: Any) -> Self: - name, bases, attrs = args - if any(issubclass(base, app_commands.Group) for base in bases): - raise TypeError( - 'Cannot inherit from app_commands.Group with commands.Cog, consider using commands.GroupCog instead' - ) - - # If name='...' is given but not group_name='...' then name='...' is used for both. - # If neither is given then cog name is the class name but group name is kebab case - try: - cog_name = kwargs.pop('name') - except KeyError: - cog_name = name - try: - group_name = kwargs.pop('group_name') - except KeyError: - group_name = _to_kebab_case(name) - else: - group_name = kwargs.pop('group_name', cog_name) - - attrs['__cog_settings__'] = kwargs.pop('command_attrs', {}) - attrs['__cog_name__'] = cog_name - attrs['__cog_group_name__'] = group_name - attrs['__cog_group_nsfw__'] = kwargs.pop('group_nsfw', False) - attrs['__cog_group_auto_locale_strings__'] = kwargs.pop('group_auto_locale_strings', True) - attrs['__cog_group_extras__'] = kwargs.pop('group_extras', {}) - - description = kwargs.pop('description', None) - if description is None: - description = inspect.cleandoc(attrs.get('__doc__', '')) - - attrs['__cog_description__'] = description - attrs['__cog_group_description__'] = kwargs.pop('group_description', description or '\u2026') - - commands = {} - cog_app_commands = {} - listeners = {} - no_bot_cog = 'Commands or listeners must not start with cog_ or bot_ (in method {0.__name__}.{1})' - - new_cls = super().__new__(cls, name, bases, attrs, **kwargs) - for base in reversed(new_cls.__mro__): - for elem, value in base.__dict__.items(): - if elem in commands: - del commands[elem] - if elem in listeners: - del listeners[elem] - - is_static_method = isinstance(value, staticmethod) - if is_static_method: - value = value.__func__ - if isinstance(value, _BaseCommand): - if is_static_method: - raise TypeError(f'Command in method {base}.{elem!r} must not be staticmethod.') - if elem.startswith(('cog_', 'bot_')): - raise TypeError(no_bot_cog.format(base, elem)) - commands[elem] = value - elif isinstance(value, (app_commands.Group, app_commands.Command)) and value.parent is None: - if is_static_method: - raise TypeError(f'Command in method {base}.{elem!r} must not be staticmethod.') - if elem.startswith(('cog_', 'bot_')): - raise TypeError(no_bot_cog.format(base, elem)) - cog_app_commands[elem] = value - elif inspect.iscoroutinefunction(value): - try: - getattr(value, '__cog_listener__') - except AttributeError: - continue - else: - if elem.startswith(('cog_', 'bot_')): - raise TypeError(no_bot_cog.format(base, elem)) - listeners[elem] = value - - new_cls.__cog_commands__ = list(commands.values()) # this will be copied in Cog.__new__ - new_cls.__cog_app_commands__ = list(cog_app_commands.values()) - - listeners_as_list = [] - for listener in listeners.values(): - for listener_name in listener.__cog_listener_names__: - # I use __name__ instead of just storing the value so I can inject - # the self attribute when the time comes to add them to the bot - listeners_as_list.append((listener_name, listener.__name__)) - - new_cls.__cog_listeners__ = listeners_as_list - return new_cls - - def __init__(self, *args: Any, **kwargs: Any) -> None: - super().__init__(*args) - - @classmethod - def qualified_name(cls) -> str: - return cls.__cog_name__ - - -def _cog_special_method(func: FuncT) -> FuncT: - func.__cog_special_method__ = None - return func - - -class Cog(metaclass=CogMeta): - """The base class that all cogs must inherit from. - - A cog is a collection of commands, listeners, and optional state to - help group commands together. More information on them can be found on - the :ref:`ext_commands_cogs` page. - - When inheriting from this class, the options shown in :class:`CogMeta` - are equally valid here. - """ - - __cog_name__: str - __cog_description__: str - __cog_group_name__: Union[str, app_commands.locale_str] - __cog_group_description__: Union[str, app_commands.locale_str] - __cog_settings__: Dict[str, Any] - __cog_commands__: List[Command[Self, ..., Any]] - __cog_app_commands__: List[Union[app_commands.Group, app_commands.Command[Self, ..., Any]]] - __cog_listeners__: List[Tuple[str, str]] - __cog_is_app_commands_group__: ClassVar[bool] = False - __cog_app_commands_group__: Optional[app_commands.Group] - __discord_app_commands_error_handler__: Optional[ - Callable[[discord.Interaction, app_commands.AppCommandError], Coroutine[Any, Any, None]] - ] - - def __new__(cls, *args: Any, **kwargs: Any) -> Self: - # For issue 426, we need to store a copy of the command objects - # since we modify them to inject `self` to them. - # To do this, we need to interfere with the Cog creation process. - self = super().__new__(cls) - cmd_attrs = cls.__cog_settings__ - - # Either update the command with the cog provided defaults or copy it. - # r.e type ignore, type-checker complains about overriding a ClassVar - self.__cog_commands__ = tuple(c._update_copy(cmd_attrs) for c in cls.__cog_commands__) # type: ignore - - lookup = {cmd.qualified_name: cmd for cmd in self.__cog_commands__} - - # Register the application commands - children: List[Union[app_commands.Group, app_commands.Command[Self, ..., Any]]] = [] - - if cls.__cog_is_app_commands_group__: - group = app_commands.Group( - name=cls.__cog_group_name__, - description=cls.__cog_group_description__, - nsfw=cls.__cog_group_nsfw__, - auto_locale_strings=cls.__cog_group_auto_locale_strings__, - parent=None, - guild_ids=getattr(cls, '__discord_app_commands_default_guilds__', None), - guild_only=getattr(cls, '__discord_app_commands_guild_only__', False), - default_permissions=getattr(cls, '__discord_app_commands_default_permissions__', None), - extras=cls.__cog_group_extras__, - ) - else: - group = None - - self.__cog_app_commands_group__ = group - - # Update the Command instances dynamically as well - for command in self.__cog_commands__: - setattr(self, command.callback.__name__, command) - parent = command.parent - if parent is not None: - # Get the latest parent reference - parent = lookup[parent.qualified_name] # type: ignore - - # Update our parent's reference to our self - parent.remove_command(command.name) # type: ignore - parent.add_command(command) # type: ignore - - if hasattr(command, '__commands_is_hybrid__') and parent is None: - app_command: Optional[Union[app_commands.Group, app_commands.Command[Self, ..., Any]]] = getattr( - command, 'app_command', None - ) - if app_command: - group_parent = self.__cog_app_commands_group__ - app_command = app_command._copy_with(parent=group_parent, binding=self) - # The type checker does not see the app_command attribute even though it exists - command.app_command = app_command # type: ignore - - if self.__cog_app_commands_group__: - children.append(app_command) # type: ignore # Somehow it thinks it can be None here - - if Cog._get_overridden_method(self.cog_app_command_error) is not None: - error_handler = self.cog_app_command_error - else: - error_handler = None - - self.__discord_app_commands_error_handler__ = error_handler - - for command in cls.__cog_app_commands__: - copy = command._copy_with(parent=self.__cog_app_commands_group__, binding=self) - - # Update set bindings - if copy._attr: - setattr(self, copy._attr, copy) - - if isinstance(copy, app_commands.Group): - copy.__discord_app_commands_error_handler__ = error_handler - for command in copy._children.values(): - if isinstance(command, app_commands.Group): - command.__discord_app_commands_error_handler__ = error_handler - - children.append(copy) - - self.__cog_app_commands__ = children - if self.__cog_app_commands_group__: - self.__cog_app_commands_group__.module = cls.__module__ - mapping = {cmd.name: cmd for cmd in children} - if len(mapping) > 25: - raise TypeError('maximum number of application command children exceeded') - - self.__cog_app_commands_group__._children = mapping # type: ignore # Variance issue - - return self - - def get_commands(self) -> List[Command[Self, ..., Any]]: - r"""Returns the commands that are defined inside this cog. - - This does *not* include :class:`discord.app_commands.Command` or :class:`discord.app_commands.Group` - instances. - - Returns - -------- - List[:class:`.Command`] - A :class:`list` of :class:`.Command`\s that are - defined inside this cog, not including subcommands. - """ - return [c for c in self.__cog_commands__ if c.parent is None] - - def get_app_commands(self) -> List[Union[app_commands.Command[Self, ..., Any], app_commands.Group]]: - r"""Returns the app commands that are defined inside this cog. - - Returns - -------- - List[Union[:class:`discord.app_commands.Command`, :class:`discord.app_commands.Group`]] - A :class:`list` of :class:`discord.app_commands.Command`\s and :class:`discord.app_commands.Group`\s that are - defined inside this cog, not including subcommands. - """ - return [c for c in self.__cog_app_commands__ if c.parent is None] - - @property - def qualified_name(self) -> str: - """:class:`str`: Returns the cog's specified name, not the class name.""" - return self.__cog_name__ - - @property - def description(self) -> str: - """:class:`str`: Returns the cog's description, typically the cleaned docstring.""" - return self.__cog_description__ - - @description.setter - def description(self, description: str) -> None: - self.__cog_description__ = description - - def walk_commands(self) -> Generator[Command[Self, ..., Any], None, None]: - """An iterator that recursively walks through this cog's commands and subcommands. - - Yields - ------ - Union[:class:`.Command`, :class:`.Group`] - A command or group from the cog. - """ - from .core import GroupMixin - - for command in self.__cog_commands__: - if command.parent is None: - yield command - if isinstance(command, GroupMixin): - yield from command.walk_commands() - - def walk_app_commands(self) -> Generator[Union[app_commands.Command[Self, ..., Any], app_commands.Group], None, None]: - """An iterator that recursively walks through this cog's app commands and subcommands. - - Yields - ------ - Union[:class:`discord.app_commands.Command`, :class:`discord.app_commands.Group`] - An app command or group from the cog. - """ - for command in self.__cog_app_commands__: - yield command - if isinstance(command, app_commands.Group): - yield from command.walk_commands() - - @property - def app_command(self) -> Optional[app_commands.Group]: - """Optional[:class:`discord.app_commands.Group`]: Returns the associated group with this cog. - - This is only available if inheriting from :class:`GroupCog`. - """ - return self.__cog_app_commands_group__ - - def get_listeners(self) -> List[Tuple[str, Callable[..., Any]]]: - """Returns a :class:`list` of (name, function) listener pairs that are defined in this cog. - - Returns - -------- - List[Tuple[:class:`str`, :ref:`coroutine `]] - The listeners defined in this cog. - """ - return [(name, getattr(self, method_name)) for name, method_name in self.__cog_listeners__] - - @classmethod - def _get_overridden_method(cls, method: FuncT) -> Optional[FuncT]: - """Return None if the method is not overridden. Otherwise returns the overridden method.""" - return getattr(method.__func__, '__cog_special_method__', method) - - @classmethod - def listener(cls, name: str = MISSING) -> Callable[[FuncT], FuncT]: - """A decorator that marks a function as a listener. - - This is the cog equivalent of :meth:`.Bot.listen`. - - Parameters - ------------ - name: :class:`str` - The name of the event being listened to. If not provided, it - defaults to the function's name. - - Raises - -------- - TypeError - The function is not a coroutine function or a string was not passed as - the name. - """ - - if name is not MISSING and not isinstance(name, str): - raise TypeError(f'Cog.listener expected str but received {name.__class__.__name__} instead.') - - def decorator(func: FuncT) -> FuncT: - actual = func - if isinstance(actual, staticmethod): - actual = actual.__func__ - if not inspect.iscoroutinefunction(actual): - raise TypeError('Listener function must be a coroutine function.') - actual.__cog_listener__ = True - to_assign = name or actual.__name__ - try: - actual.__cog_listener_names__.append(to_assign) - except AttributeError: - actual.__cog_listener_names__ = [to_assign] - # we have to return `func` instead of `actual` because - # we need the type to be `staticmethod` for the metaclass - # to pick it up but the metaclass unfurls the function and - # thus the assignments need to be on the actual function - return func - - return decorator - - def has_error_handler(self) -> bool: - """:class:`bool`: Checks whether the cog has an error handler. - - .. versionadded:: 1.7 - """ - return not hasattr(self.cog_command_error.__func__, '__cog_special_method__') - - def has_app_command_error_handler(self) -> bool: - """:class:`bool`: Checks whether the cog has an app error handler. - - .. versionadded:: 2.1 - """ - return not hasattr(self.cog_app_command_error.__func__, '__cog_special_method__') - - @_cog_special_method - async def cog_load(self) -> None: - """|maybecoro| - - A special method that is called when the cog gets loaded. - - Subclasses must replace this if they want special asynchronous loading behaviour. - Note that the ``__init__`` special method does not allow asynchronous code to run - inside it, thus this is helpful for setting up code that needs to be asynchronous. - - .. versionadded:: 2.0 - """ - pass - - @_cog_special_method - async def cog_unload(self) -> None: - """|maybecoro| - - A special method that is called when the cog gets removed. - - Subclasses must replace this if they want special unloading behaviour. - - Exceptions raised in this method are ignored during extension unloading. - - .. versionchanged:: 2.0 - - This method can now be a :term:`coroutine`. - """ - pass - - @_cog_special_method - def bot_check_once(self, ctx: Context[BotT]) -> bool: - """A special method that registers as a :meth:`.Bot.check_once` - check. - - This function **can** be a coroutine and must take a sole parameter, - ``ctx``, to represent the :class:`.Context`. - """ - return True - - @_cog_special_method - def bot_check(self, ctx: Context[BotT]) -> bool: - """A special method that registers as a :meth:`.Bot.check` - check. - - This function **can** be a coroutine and must take a sole parameter, - ``ctx``, to represent the :class:`.Context`. - """ - return True - - @_cog_special_method - def cog_check(self, ctx: Context[BotT]) -> bool: - """A special method that registers as a :func:`~discord.ext.commands.check` - for every command and subcommand in this cog. - - This function **can** be a coroutine and must take a sole parameter, - ``ctx``, to represent the :class:`.Context`. - """ - return True - - @_cog_special_method - def interaction_check(self, interaction: discord.Interaction[ClientT], /) -> bool: - """A special method that registers as a :func:`discord.app_commands.check` - for every app command and subcommand in this cog. - - This function **can** be a coroutine and must take a sole parameter, - ``interaction``, to represent the :class:`~discord.Interaction`. - - .. versionadded:: 2.0 - """ - return True - - @_cog_special_method - async def cog_command_error(self, ctx: Context[BotT], error: Exception) -> None: - """|coro| - - A special method that is called whenever an error - is dispatched inside this cog. - - This is similar to :func:`.on_command_error` except only applying - to the commands inside this cog. - - This **must** be a coroutine. - - Parameters - ----------- - ctx: :class:`.Context` - The invocation context where the error happened. - error: :class:`CommandError` - The error that happened. - """ - pass - - @_cog_special_method - async def cog_app_command_error(self, interaction: discord.Interaction, error: app_commands.AppCommandError) -> None: - """|coro| - - A special method that is called whenever an error within - an application command is dispatched inside this cog. - - This is similar to :func:`discord.app_commands.CommandTree.on_error` except - only applying to the application commands inside this cog. - - This **must** be a coroutine. - - Parameters - ----------- - interaction: :class:`~discord.Interaction` - The interaction that is being handled. - error: :exc:`~discord.app_commands.AppCommandError` - The exception that was raised. - """ - pass - - @_cog_special_method - async def cog_before_invoke(self, ctx: Context[BotT]) -> None: - """|coro| - - A special method that acts as a cog local pre-invoke hook. - - This is similar to :meth:`.Command.before_invoke`. - - This **must** be a coroutine. - - Parameters - ----------- - ctx: :class:`.Context` - The invocation context. - """ - pass - - @_cog_special_method - async def cog_after_invoke(self, ctx: Context[BotT]) -> None: - """|coro| - - A special method that acts as a cog local post-invoke hook. - - This is similar to :meth:`.Command.after_invoke`. - - This **must** be a coroutine. - - Parameters - ----------- - ctx: :class:`.Context` - The invocation context. - """ - pass - - async def _inject(self, bot: BotBase, override: bool, guild: Optional[Snowflake], guilds: Sequence[Snowflake]) -> Self: - cls = self.__class__ - - # we'll call this first so that errors can propagate without - # having to worry about undoing anything - await maybe_coroutine(self.cog_load) - - # realistically, the only thing that can cause loading errors - # is essentially just the command loading, which raises if there are - # duplicates. When this condition is met, we want to undo all what - # we've added so far for some form of atomic loading. - for index, command in enumerate(self.__cog_commands__): - command.cog = self - if command.parent is None: - try: - bot.add_command(command) - except Exception as e: - # undo our additions - for to_undo in self.__cog_commands__[:index]: - if to_undo.parent is None: - bot.remove_command(to_undo.name) - try: - await maybe_coroutine(self.cog_unload) - finally: - raise e - - # check if we're overriding the default - if cls.bot_check is not Cog.bot_check: - bot.add_check(self.bot_check) - - if cls.bot_check_once is not Cog.bot_check_once: - bot.add_check(self.bot_check_once, call_once=True) - - # while Bot.add_listener can raise if it's not a coroutine, - # this precondition is already met by the listener decorator - # already, thus this should never raise. - # Outside of, memory errors and the like... - for name, method_name in self.__cog_listeners__: - bot.add_listener(getattr(self, method_name), name) - - # Only do this if these are "top level" commands - if not self.__cog_app_commands_group__: - for command in self.__cog_app_commands__: - # This is already atomic - bot.tree.add_command(command, override=override, guild=guild, guilds=guilds) - - return self - - async def _eject(self, bot: BotBase, guild_ids: Optional[Iterable[int]]) -> None: - cls = self.__class__ - - try: - for command in self.__cog_commands__: - if command.parent is None: - bot.remove_command(command.name) - - if not self.__cog_app_commands_group__: - for command in self.__cog_app_commands__: - guild_ids = guild_ids or command._guild_ids - if guild_ids is None: - bot.tree.remove_command(command.name) - else: - for guild_id in guild_ids: - bot.tree.remove_command(command.name, guild=discord.Object(id=guild_id)) - - for name, method_name in self.__cog_listeners__: - bot.remove_listener(getattr(self, method_name), name) - - if cls.bot_check is not Cog.bot_check: - bot.remove_check(self.bot_check) - - if cls.bot_check_once is not Cog.bot_check_once: - bot.remove_check(self.bot_check_once, call_once=True) - finally: - try: - await maybe_coroutine(self.cog_unload) - except Exception: - pass - - -class GroupCog(Cog): - """Represents a cog that also doubles as a parent :class:`discord.app_commands.Group` for - the application commands defined within it. - - This inherits from :class:`Cog` and the options in :class:`CogMeta` also apply to this. - See the :class:`Cog` documentation for methods. - - Decorators such as :func:`~discord.app_commands.guild_only`, :func:`~discord.app_commands.guilds`, - and :func:`~discord.app_commands.default_permissions` will apply to the group if used on top of the - cog. - - Hybrid commands will also be added to the Group, giving the ability to categorize slash commands into - groups, while keeping the prefix-style command as a root-level command. - - For example: - - .. code-block:: python3 - - from discord import app_commands - from discord.ext import commands - - @app_commands.guild_only() - class MyCog(commands.GroupCog, group_name='my-cog'): - pass - - .. versionadded:: 2.0 - """ - - __cog_is_app_commands_group__: ClassVar[bool] = True diff --git a/.venv/Lib/site-packages/discord/ext/commands/context.py b/.venv/Lib/site-packages/discord/ext/commands/context.py deleted file mode 100644 index 40ef48c..0000000 --- a/.venv/Lib/site-packages/discord/ext/commands/context.py +++ /dev/null @@ -1,1065 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" -from __future__ import annotations - -import re -from typing import TYPE_CHECKING, Any, Dict, Generator, Generic, List, Optional, TypeVar, Union, Sequence, Type, overload - -import discord.abc -import discord.utils -from discord import Interaction, Message, Attachment, MessageType, User, PartialMessageable, Permissions, ChannelType, Thread -from discord.context_managers import Typing -from .view import StringView - -from ._types import BotT - -if TYPE_CHECKING: - from typing_extensions import Self, ParamSpec, TypeGuard - - from discord.abc import MessageableChannel - from discord.guild import Guild - from discord.member import Member - from discord.state import ConnectionState - from discord.user import ClientUser - from discord.voice_client import VoiceProtocol - from discord.embeds import Embed - from discord.file import File - from discord.mentions import AllowedMentions - from discord.sticker import GuildSticker, StickerItem - from discord.message import MessageReference, PartialMessage - from discord.ui import View - from discord.types.interactions import ApplicationCommandInteractionData - - from .cog import Cog - from .core import Command - from .parameters import Parameter - - from types import TracebackType - - BE = TypeVar('BE', bound=BaseException) - -# fmt: off -__all__ = ( - 'Context', -) -# fmt: on - -MISSING: Any = discord.utils.MISSING - - -T = TypeVar('T') -CogT = TypeVar('CogT', bound="Cog") - -if TYPE_CHECKING: - P = ParamSpec('P') -else: - P = TypeVar('P') - - -def is_cog(obj: Any) -> TypeGuard[Cog]: - return hasattr(obj, '__cog_commands__') - - -class DeferTyping: - def __init__(self, ctx: Context[BotT], *, ephemeral: bool): - self.ctx: Context[BotT] = ctx - self.ephemeral: bool = ephemeral - - def __await__(self) -> Generator[Any, None, None]: - return self.ctx.defer(ephemeral=self.ephemeral).__await__() - - async def __aenter__(self) -> None: - await self.ctx.defer(ephemeral=self.ephemeral) - - async def __aexit__( - self, - exc_type: Optional[Type[BE]], - exc: Optional[BE], - traceback: Optional[TracebackType], - ) -> None: - pass - - -class Context(discord.abc.Messageable, Generic[BotT]): - r"""Represents the context in which a command is being invoked under. - - This class contains a lot of meta data to help you understand more about - the invocation context. This class is not created manually and is instead - passed around to commands as the first parameter. - - This class implements the :class:`~discord.abc.Messageable` ABC. - - Attributes - ----------- - message: :class:`.Message` - The message that triggered the command being executed. - - .. note:: - - In the case of an interaction based context, this message is "synthetic" - and does not actually exist. Therefore, the ID on it is invalid similar - to ephemeral messages. - bot: :class:`.Bot` - The bot that contains the command being executed. - args: :class:`list` - The list of transformed arguments that were passed into the command. - If this is accessed during the :func:`.on_command_error` event - then this list could be incomplete. - kwargs: :class:`dict` - A dictionary of transformed arguments that were passed into the command. - Similar to :attr:`args`\, if this is accessed in the - :func:`.on_command_error` event then this dict could be incomplete. - current_parameter: Optional[:class:`Parameter`] - The parameter that is currently being inspected and converted. - This is only of use for within converters. - - .. versionadded:: 2.0 - current_argument: Optional[:class:`str`] - The argument string of the :attr:`current_parameter` that is currently being converted. - This is only of use for within converters. - - .. versionadded:: 2.0 - interaction: Optional[:class:`~discord.Interaction`] - The interaction associated with this context. - - .. versionadded:: 2.0 - prefix: Optional[:class:`str`] - The prefix that was used to invoke the command. For interaction based contexts, - this is ``/`` for slash commands and ``\u200b`` for context menu commands. - command: Optional[:class:`Command`] - The command that is being invoked currently. - invoked_with: Optional[:class:`str`] - The command name that triggered this invocation. Useful for finding out - which alias called the command. - invoked_parents: List[:class:`str`] - The command names of the parents that triggered this invocation. Useful for - finding out which aliases called the command. - - For example in commands ``?a b c test``, the invoked parents are ``['a', 'b', 'c']``. - - .. versionadded:: 1.7 - - invoked_subcommand: Optional[:class:`Command`] - The subcommand that was invoked. - If no valid subcommand was invoked then this is equal to ``None``. - subcommand_passed: Optional[:class:`str`] - The string that was attempted to call a subcommand. This does not have - to point to a valid registered subcommand and could just point to a - nonsense string. If nothing was passed to attempt a call to a - subcommand then this is set to ``None``. - command_failed: :class:`bool` - A boolean that indicates if the command failed to be parsed, checked, - or invoked. - """ - - def __init__( - self, - *, - message: Message, - bot: BotT, - view: StringView, - args: List[Any] = MISSING, - kwargs: Dict[str, Any] = MISSING, - prefix: Optional[str] = None, - command: Optional[Command[Any, ..., Any]] = None, - invoked_with: Optional[str] = None, - invoked_parents: List[str] = MISSING, - invoked_subcommand: Optional[Command[Any, ..., Any]] = None, - subcommand_passed: Optional[str] = None, - command_failed: bool = False, - current_parameter: Optional[Parameter] = None, - current_argument: Optional[str] = None, - interaction: Optional[Interaction[BotT]] = None, - ): - self.message: Message = message - self.bot: BotT = bot - self.args: List[Any] = args or [] - self.kwargs: Dict[str, Any] = kwargs or {} - self.prefix: Optional[str] = prefix - self.command: Optional[Command[Any, ..., Any]] = command - self.view: StringView = view - self.invoked_with: Optional[str] = invoked_with - self.invoked_parents: List[str] = invoked_parents or [] - self.invoked_subcommand: Optional[Command[Any, ..., Any]] = invoked_subcommand - self.subcommand_passed: Optional[str] = subcommand_passed - self.command_failed: bool = command_failed - self.current_parameter: Optional[Parameter] = current_parameter - self.current_argument: Optional[str] = current_argument - self.interaction: Optional[Interaction[BotT]] = interaction - self._state: ConnectionState = self.message._state - - @classmethod - async def from_interaction(cls, interaction: Interaction[BotT], /) -> Self: - """|coro| - - Creates a context from a :class:`discord.Interaction`. This only - works on application command based interactions, such as slash commands - or context menus. - - On slash command based interactions this creates a synthetic :class:`~discord.Message` - that points to an ephemeral message that the command invoker has executed. This means - that :attr:`Context.author` returns the member that invoked the command. - - In a message context menu based interaction, the :attr:`Context.message` attribute - is the message that the command is being executed on. This means that :attr:`Context.author` - returns the author of the message being targetted. To get the member that invoked - the command then :attr:`discord.Interaction.user` should be used instead. - - .. versionadded:: 2.0 - - Parameters - ----------- - interaction: :class:`discord.Interaction` - The interaction to create a context with. - - Raises - ------- - ValueError - The interaction does not have a valid command. - TypeError - The interaction client is not derived from :class:`Bot` or :class:`AutoShardedBot`. - """ - - # Circular import - from .bot import BotBase - - if not isinstance(interaction.client, BotBase): - raise TypeError('Interaction client is not derived from commands.Bot or commands.AutoShardedBot') - - command = interaction.command - if command is None: - raise ValueError('interaction does not have command data') - - bot: BotT = interaction.client # type: ignore - data: ApplicationCommandInteractionData = interaction.data # type: ignore - if interaction.message is None: - synthetic_payload = { - 'id': interaction.id, - 'reactions': [], - 'embeds': [], - 'mention_everyone': False, - 'tts': False, - 'pinned': False, - 'edited_timestamp': None, - 'type': MessageType.chat_input_command if data.get('type', 1) == 1 else MessageType.context_menu_command, - 'flags': 64, - 'content': '', - 'mentions': [], - 'mention_roles': [], - 'attachments': [], - } - - if interaction.channel_id is None: - raise RuntimeError('interaction channel ID is null, this is probably a Discord bug') - - channel = interaction.channel or PartialMessageable( - state=interaction._state, guild_id=interaction.guild_id, id=interaction.channel_id - ) - message = Message(state=interaction._state, channel=channel, data=synthetic_payload) # type: ignore - message.author = interaction.user - message.attachments = [a for _, a in interaction.namespace if isinstance(a, Attachment)] - else: - message = interaction.message - - prefix = '/' if data.get('type', 1) == 1 else '\u200b' # Mock the prefix - ctx = cls( - message=message, - bot=bot, - view=StringView(''), - args=[], - kwargs={}, - prefix=prefix, - interaction=interaction, - invoked_with=command.name, - command=command, # type: ignore # this will be a hybrid command, technically - ) - interaction._baton = ctx - ctx.command_failed = interaction.command_failed - return ctx - - async def invoke(self, command: Command[CogT, P, T], /, *args: P.args, **kwargs: P.kwargs) -> T: - r"""|coro| - - Calls a command with the arguments given. - - This is useful if you want to just call the callback that a - :class:`.Command` holds internally. - - .. note:: - - This does not handle converters, checks, cooldowns, pre-invoke, - or after-invoke hooks in any matter. It calls the internal callback - directly as-if it was a regular function. - - You must take care in passing the proper arguments when - using this function. - - .. versionchanged:: 2.0 - - ``command`` parameter is now positional-only. - - Parameters - ----------- - command: :class:`.Command` - The command that is going to be called. - \*args - The arguments to use. - \*\*kwargs - The keyword arguments to use. - - Raises - ------- - TypeError - The command argument to invoke is missing. - """ - return await command(self, *args, **kwargs) - - async def reinvoke(self, *, call_hooks: bool = False, restart: bool = True) -> None: - """|coro| - - Calls the command again. - - This is similar to :meth:`~.Context.invoke` except that it bypasses - checks, cooldowns, and error handlers. - - .. note:: - - If you want to bypass :exc:`.UserInputError` derived exceptions, - it is recommended to use the regular :meth:`~.Context.invoke` - as it will work more naturally. After all, this will end up - using the old arguments the user has used and will thus just - fail again. - - Parameters - ------------ - call_hooks: :class:`bool` - Whether to call the before and after invoke hooks. - restart: :class:`bool` - Whether to start the call chain from the very beginning - or where we left off (i.e. the command that caused the error). - The default is to start where we left off. - - Raises - ------- - ValueError - The context to reinvoke is not valid. - """ - cmd = self.command - view = self.view - if cmd is None: - raise ValueError('This context is not valid.') - - # some state to revert to when we're done - index, previous = view.index, view.previous - invoked_with = self.invoked_with - invoked_subcommand = self.invoked_subcommand - invoked_parents = self.invoked_parents - subcommand_passed = self.subcommand_passed - - if restart: - to_call = cmd.root_parent or cmd - view.index = len(self.prefix or '') - view.previous = 0 - self.invoked_parents = [] - self.invoked_with = view.get_word() # advance to get the root command - else: - to_call = cmd - - try: - await to_call.reinvoke(self, call_hooks=call_hooks) - finally: - self.command = cmd - view.index = index - view.previous = previous - self.invoked_with = invoked_with - self.invoked_subcommand = invoked_subcommand - self.invoked_parents = invoked_parents - self.subcommand_passed = subcommand_passed - - @property - def valid(self) -> bool: - """:class:`bool`: Checks if the invocation context is valid to be invoked with.""" - return self.prefix is not None and self.command is not None - - async def _get_channel(self) -> discord.abc.Messageable: - return self.channel - - @property - def clean_prefix(self) -> str: - """:class:`str`: The cleaned up invoke prefix. i.e. mentions are ``@name`` instead of ``<@id>``. - - .. versionadded:: 2.0 - """ - if self.prefix is None: - return '' - - user = self.me - # this breaks if the prefix mention is not the bot itself but I - # consider this to be an *incredibly* strange use case. I'd rather go - # for this common use case rather than waste performance for the - # odd one. - pattern = re.compile(r"<@!?%s>" % user.id) - return pattern.sub("@%s" % user.display_name.replace('\\', r'\\'), self.prefix) - - @property - def cog(self) -> Optional[Cog]: - """Optional[:class:`.Cog`]: Returns the cog associated with this context's command. None if it does not exist.""" - - if self.command is None: - return None - return self.command.cog - - @property - def filesize_limit(self) -> int: - """:class:`int`: Returns the maximum number of bytes files can have when uploaded to this guild or DM channel associated with this context. - - .. versionadded:: 2.3 - """ - return self.guild.filesize_limit if self.guild is not None else discord.utils.DEFAULT_FILE_SIZE_LIMIT_BYTES - - @discord.utils.cached_property - def guild(self) -> Optional[Guild]: - """Optional[:class:`.Guild`]: Returns the guild associated with this context's command. None if not available.""" - return self.message.guild - - @discord.utils.cached_property - def channel(self) -> MessageableChannel: - """Union[:class:`.abc.Messageable`]: Returns the channel associated with this context's command. - Shorthand for :attr:`.Message.channel`. - """ - return self.message.channel - - @discord.utils.cached_property - def author(self) -> Union[User, Member]: - """Union[:class:`~discord.User`, :class:`.Member`]: - Returns the author associated with this context's command. Shorthand for :attr:`.Message.author` - """ - return self.message.author - - @discord.utils.cached_property - def me(self) -> Union[Member, ClientUser]: - """Union[:class:`.Member`, :class:`.ClientUser`]: - Similar to :attr:`.Guild.me` except it may return the :class:`.ClientUser` in private message contexts. - """ - # bot.user will never be None at this point. - return self.guild.me if self.guild is not None else self.bot.user # type: ignore - - @discord.utils.cached_property - def permissions(self) -> Permissions: - """:class:`.Permissions`: Returns the resolved permissions for the invoking user in this channel. - Shorthand for :meth:`.abc.GuildChannel.permissions_for` or :attr:`.Interaction.permissions`. - - .. versionadded:: 2.0 - """ - if self.channel.type is ChannelType.private: - return Permissions._dm_permissions() - if not self.interaction: - # channel and author will always match relevant types here - return self.channel.permissions_for(self.author) # type: ignore - base = self.interaction.permissions - if self.channel.type in (ChannelType.voice, ChannelType.stage_voice): - if not base.connect: - # voice channels cannot be edited by people who can't connect to them - # It also implicitly denies all other voice perms - denied = Permissions.voice() - denied.update(manage_channels=True, manage_roles=True) - base.value &= ~denied.value - else: - # text channels do not have voice related permissions - denied = Permissions.voice() - base.value &= ~denied.value - return base - - @discord.utils.cached_property - def bot_permissions(self) -> Permissions: - """:class:`.Permissions`: Returns the resolved permissions for the bot in this channel. - Shorthand for :meth:`.abc.GuildChannel.permissions_for` or :attr:`.Interaction.app_permissions`. - - For interaction-based commands, this will reflect the effective permissions - for :class:`Context` calls, which may differ from calls through - other :class:`.abc.Messageable` endpoints, like :attr:`channel`. - - Notably, sending messages, embedding links, and attaching files are always - permitted, while reading messages might not be. - - .. versionadded:: 2.0 - """ - channel = self.channel - if channel.type == ChannelType.private: - return Permissions._dm_permissions() - if not self.interaction: - # channel and me will always match relevant types here - return channel.permissions_for(self.me) # type: ignore - guild = channel.guild - base = self.interaction.app_permissions - if self.channel.type in (ChannelType.voice, ChannelType.stage_voice): - if not base.connect: - # voice channels cannot be edited by people who can't connect to them - # It also implicitly denies all other voice perms - denied = Permissions.voice() - denied.update(manage_channels=True, manage_roles=True) - base.value &= ~denied.value - else: - # text channels do not have voice related permissions - denied = Permissions.voice() - base.value &= ~denied.value - base.update( - embed_links=True, - attach_files=True, - send_tts_messages=False, - ) - if isinstance(channel, Thread): - base.send_messages_in_threads = True - else: - base.send_messages = True - return base - - @property - def voice_client(self) -> Optional[VoiceProtocol]: - r"""Optional[:class:`.VoiceProtocol`]: A shortcut to :attr:`.Guild.voice_client`\, if applicable.""" - g = self.guild - return g.voice_client if g else None - - async def send_help(self, *args: Any) -> Any: - """send_help(entity=) - - |coro| - - Shows the help command for the specified entity if given. - The entity can be a command or a cog. - - If no entity is given, then it'll show help for the - entire bot. - - If the entity is a string, then it looks up whether it's a - :class:`Cog` or a :class:`Command`. - - .. note:: - - Due to the way this function works, instead of returning - something similar to :meth:`~.commands.HelpCommand.command_not_found` - this returns ``None`` on bad input or no help command. - - Parameters - ------------ - entity: Optional[Union[:class:`Command`, :class:`Cog`, :class:`str`]] - The entity to show help for. - - Returns - -------- - Any - The result of the help command, if any. - """ - from .core import Command, Group, wrap_callback - from .errors import CommandError - - bot = self.bot - cmd = bot.help_command - - if cmd is None: - return None - - cmd = cmd.copy() - cmd.context = self - - if len(args) == 0: - await cmd.prepare_help_command(self, None) - mapping = cmd.get_bot_mapping() - injected = wrap_callback(cmd.send_bot_help) - try: - return await injected(mapping) - except CommandError as e: - await cmd.on_help_command_error(self, e) - return None - - entity = args[0] - if isinstance(entity, str): - entity = bot.get_cog(entity) or bot.get_command(entity) - - if entity is None: - return None - - try: - entity.qualified_name - except AttributeError: - # if we're here then it's not a cog, group, or command. - return None - - await cmd.prepare_help_command(self, entity.qualified_name) - - try: - if is_cog(entity): - injected = wrap_callback(cmd.send_cog_help) - return await injected(entity) - elif isinstance(entity, Group): - injected = wrap_callback(cmd.send_group_help) - return await injected(entity) - elif isinstance(entity, Command): - injected = wrap_callback(cmd.send_command_help) - return await injected(entity) - else: - return None - except CommandError as e: - await cmd.on_help_command_error(self, e) - - @overload - async def reply( - self, - content: Optional[str] = ..., - *, - tts: bool = ..., - embed: Embed = ..., - file: File = ..., - stickers: Sequence[Union[GuildSticker, StickerItem]] = ..., - delete_after: float = ..., - nonce: Union[str, int] = ..., - allowed_mentions: AllowedMentions = ..., - reference: Union[Message, MessageReference, PartialMessage] = ..., - mention_author: bool = ..., - view: View = ..., - suppress_embeds: bool = ..., - ephemeral: bool = ..., - silent: bool = ..., - ) -> Message: - ... - - @overload - async def reply( - self, - content: Optional[str] = ..., - *, - tts: bool = ..., - embed: Embed = ..., - files: Sequence[File] = ..., - stickers: Sequence[Union[GuildSticker, StickerItem]] = ..., - delete_after: float = ..., - nonce: Union[str, int] = ..., - allowed_mentions: AllowedMentions = ..., - reference: Union[Message, MessageReference, PartialMessage] = ..., - mention_author: bool = ..., - view: View = ..., - suppress_embeds: bool = ..., - ephemeral: bool = ..., - silent: bool = ..., - ) -> Message: - ... - - @overload - async def reply( - self, - content: Optional[str] = ..., - *, - tts: bool = ..., - embeds: Sequence[Embed] = ..., - file: File = ..., - stickers: Sequence[Union[GuildSticker, StickerItem]] = ..., - delete_after: float = ..., - nonce: Union[str, int] = ..., - allowed_mentions: AllowedMentions = ..., - reference: Union[Message, MessageReference, PartialMessage] = ..., - mention_author: bool = ..., - view: View = ..., - suppress_embeds: bool = ..., - ephemeral: bool = ..., - silent: bool = ..., - ) -> Message: - ... - - @overload - async def reply( - self, - content: Optional[str] = ..., - *, - tts: bool = ..., - embeds: Sequence[Embed] = ..., - files: Sequence[File] = ..., - stickers: Sequence[Union[GuildSticker, StickerItem]] = ..., - delete_after: float = ..., - nonce: Union[str, int] = ..., - allowed_mentions: AllowedMentions = ..., - reference: Union[Message, MessageReference, PartialMessage] = ..., - mention_author: bool = ..., - view: View = ..., - suppress_embeds: bool = ..., - ephemeral: bool = ..., - silent: bool = ..., - ) -> Message: - ... - - async def reply(self, content: Optional[str] = None, **kwargs: Any) -> Message: - """|coro| - - A shortcut method to :meth:`send` to reply to the - :class:`~discord.Message` referenced by this context. - - For interaction based contexts, this is the same as :meth:`send`. - - .. versionadded:: 1.6 - - .. versionchanged:: 2.0 - This function will now raise :exc:`TypeError` or - :exc:`ValueError` instead of ``InvalidArgument``. - - Raises - -------- - ~discord.HTTPException - Sending the message failed. - ~discord.Forbidden - You do not have the proper permissions to send the message. - ValueError - The ``files`` list is not of the appropriate size - TypeError - You specified both ``file`` and ``files``. - - Returns - --------- - :class:`~discord.Message` - The message that was sent. - """ - if self.interaction is None: - return await self.send(content, reference=self.message, **kwargs) - else: - return await self.send(content, **kwargs) - - def typing(self, *, ephemeral: bool = False) -> Union[Typing, DeferTyping]: - """Returns an asynchronous context manager that allows you to send a typing indicator to - the destination for an indefinite period of time, or 10 seconds if the context manager - is called using ``await``. - - In an interaction based context, this is equivalent to a :meth:`defer` call and - does not do any typing calls. - - Example Usage: :: - - async with channel.typing(): - # simulate something heavy - await asyncio.sleep(20) - - await channel.send('Done!') - - Example Usage: :: - - await channel.typing() - # Do some computational magic for about 10 seconds - await channel.send('Done!') - - .. versionchanged:: 2.0 - This no longer works with the ``with`` syntax, ``async with`` must be used instead. - - .. versionchanged:: 2.0 - Added functionality to ``await`` the context manager to send a typing indicator for 10 seconds. - - Parameters - ----------- - ephemeral: :class:`bool` - Indicates whether the deferred message will eventually be ephemeral. - Only valid for interaction based contexts. - - .. versionadded:: 2.0 - """ - if self.interaction is None: - return Typing(self) - return DeferTyping(self, ephemeral=ephemeral) - - async def defer(self, *, ephemeral: bool = False) -> None: - """|coro| - - Defers the interaction based contexts. - - This is typically used when the interaction is acknowledged - and a secondary action will be done later. - - If this isn't an interaction based context then it does nothing. - - Parameters - ----------- - ephemeral: :class:`bool` - Indicates whether the deferred message will eventually be ephemeral. - - Raises - ------- - HTTPException - Deferring the interaction failed. - InteractionResponded - This interaction has already been responded to before. - """ - - if self.interaction: - await self.interaction.response.defer(ephemeral=ephemeral) - - @overload - async def send( - self, - content: Optional[str] = ..., - *, - tts: bool = ..., - embed: Embed = ..., - file: File = ..., - stickers: Sequence[Union[GuildSticker, StickerItem]] = ..., - delete_after: float = ..., - nonce: Union[str, int] = ..., - allowed_mentions: AllowedMentions = ..., - reference: Union[Message, MessageReference, PartialMessage] = ..., - mention_author: bool = ..., - view: View = ..., - suppress_embeds: bool = ..., - ephemeral: bool = ..., - silent: bool = ..., - ) -> Message: - ... - - @overload - async def send( - self, - content: Optional[str] = ..., - *, - tts: bool = ..., - embed: Embed = ..., - files: Sequence[File] = ..., - stickers: Sequence[Union[GuildSticker, StickerItem]] = ..., - delete_after: float = ..., - nonce: Union[str, int] = ..., - allowed_mentions: AllowedMentions = ..., - reference: Union[Message, MessageReference, PartialMessage] = ..., - mention_author: bool = ..., - view: View = ..., - suppress_embeds: bool = ..., - ephemeral: bool = ..., - silent: bool = ..., - ) -> Message: - ... - - @overload - async def send( - self, - content: Optional[str] = ..., - *, - tts: bool = ..., - embeds: Sequence[Embed] = ..., - file: File = ..., - stickers: Sequence[Union[GuildSticker, StickerItem]] = ..., - delete_after: float = ..., - nonce: Union[str, int] = ..., - allowed_mentions: AllowedMentions = ..., - reference: Union[Message, MessageReference, PartialMessage] = ..., - mention_author: bool = ..., - view: View = ..., - suppress_embeds: bool = ..., - ephemeral: bool = ..., - silent: bool = ..., - ) -> Message: - ... - - @overload - async def send( - self, - content: Optional[str] = ..., - *, - tts: bool = ..., - embeds: Sequence[Embed] = ..., - files: Sequence[File] = ..., - stickers: Sequence[Union[GuildSticker, StickerItem]] = ..., - delete_after: float = ..., - nonce: Union[str, int] = ..., - allowed_mentions: AllowedMentions = ..., - reference: Union[Message, MessageReference, PartialMessage] = ..., - mention_author: bool = ..., - view: View = ..., - suppress_embeds: bool = ..., - ephemeral: bool = ..., - silent: bool = ..., - ) -> Message: - ... - - async def send( - self, - content: Optional[str] = None, - *, - tts: bool = False, - embed: Optional[Embed] = None, - embeds: Optional[Sequence[Embed]] = None, - file: Optional[File] = None, - files: Optional[Sequence[File]] = None, - stickers: Optional[Sequence[Union[GuildSticker, StickerItem]]] = None, - delete_after: Optional[float] = None, - nonce: Optional[Union[str, int]] = None, - allowed_mentions: Optional[AllowedMentions] = None, - reference: Optional[Union[Message, MessageReference, PartialMessage]] = None, - mention_author: Optional[bool] = None, - view: Optional[View] = None, - suppress_embeds: bool = False, - ephemeral: bool = False, - silent: bool = False, - ) -> Message: - """|coro| - - Sends a message to the destination with the content given. - - This works similarly to :meth:`~discord.abc.Messageable.send` for non-interaction contexts. - - For interaction based contexts this does one of the following: - - - :meth:`discord.InteractionResponse.send_message` if no response has been given. - - A followup message if a response has been given. - - Regular send if the interaction has expired - - .. versionchanged:: 2.0 - This function will now raise :exc:`TypeError` or - :exc:`ValueError` instead of ``InvalidArgument``. - - Parameters - ------------ - content: Optional[:class:`str`] - The content of the message to send. - tts: :class:`bool` - Indicates if the message should be sent using text-to-speech. - embed: :class:`~discord.Embed` - The rich embed for the content. - file: :class:`~discord.File` - The file to upload. - files: List[:class:`~discord.File`] - A list of files to upload. Must be a maximum of 10. - nonce: :class:`int` - The nonce to use for sending this message. If the message was successfully sent, - then the message will have a nonce with this value. - delete_after: :class:`float` - If provided, the number of seconds to wait in the background - before deleting the message we just sent. If the deletion fails, - then it is silently ignored. - allowed_mentions: :class:`~discord.AllowedMentions` - Controls the mentions being processed in this message. If this is - passed, then the object is merged with :attr:`~discord.Client.allowed_mentions`. - The merging behaviour only overrides attributes that have been explicitly passed - to the object, otherwise it uses the attributes set in :attr:`~discord.Client.allowed_mentions`. - If no object is passed at all then the defaults given by :attr:`~discord.Client.allowed_mentions` - are used instead. - - .. versionadded:: 1.4 - - reference: Union[:class:`~discord.Message`, :class:`~discord.MessageReference`, :class:`~discord.PartialMessage`] - A reference to the :class:`~discord.Message` to which you are replying, this can be created using - :meth:`~discord.Message.to_reference` or passed directly as a :class:`~discord.Message`. You can control - whether this mentions the author of the referenced message using the :attr:`~discord.AllowedMentions.replied_user` - attribute of ``allowed_mentions`` or by setting ``mention_author``. - - This is ignored for interaction based contexts. - - .. versionadded:: 1.6 - - mention_author: Optional[:class:`bool`] - If set, overrides the :attr:`~discord.AllowedMentions.replied_user` attribute of ``allowed_mentions``. - This is ignored for interaction based contexts. - - .. versionadded:: 1.6 - view: :class:`discord.ui.View` - A Discord UI View to add to the message. - - .. versionadded:: 2.0 - embeds: List[:class:`~discord.Embed`] - A list of embeds to upload. Must be a maximum of 10. - - .. versionadded:: 2.0 - stickers: Sequence[Union[:class:`~discord.GuildSticker`, :class:`~discord.StickerItem`]] - A list of stickers to upload. Must be a maximum of 3. This is ignored for interaction based contexts. - - .. versionadded:: 2.0 - suppress_embeds: :class:`bool` - Whether to suppress embeds for the message. This sends the message without any embeds if set to ``True``. - - .. versionadded:: 2.0 - ephemeral: :class:`bool` - Indicates if the message should only be visible to the user who started the interaction. - If a view is sent with an ephemeral message and it has no timeout set then the timeout - is set to 15 minutes. **This is only applicable in contexts with an interaction**. - - .. versionadded:: 2.0 - silent: :class:`bool` - Whether to suppress push and desktop notifications for the message. This will increment the mention counter - in the UI, but will not actually send a notification. - - .. versionadded:: 2.2 - - Raises - -------- - ~discord.HTTPException - Sending the message failed. - ~discord.Forbidden - You do not have the proper permissions to send the message. - ValueError - The ``files`` list is not of the appropriate size. - TypeError - You specified both ``file`` and ``files``, - or you specified both ``embed`` and ``embeds``, - or the ``reference`` object is not a :class:`~discord.Message`, - :class:`~discord.MessageReference` or :class:`~discord.PartialMessage`. - - Returns - --------- - :class:`~discord.Message` - The message that was sent. - """ - - if self.interaction is None or self.interaction.is_expired(): - return await super().send( - content=content, - tts=tts, - embed=embed, - embeds=embeds, - file=file, - files=files, - stickers=stickers, - delete_after=delete_after, - nonce=nonce, - allowed_mentions=allowed_mentions, - reference=reference, - mention_author=mention_author, - view=view, - suppress_embeds=suppress_embeds, - silent=silent, - ) # type: ignore # The overloads don't support Optional but the implementation does - - # Convert the kwargs from None to MISSING to appease the remaining implementations - kwargs = { - 'content': content, - 'tts': tts, - 'embed': MISSING if embed is None else embed, - 'embeds': MISSING if embeds is None else embeds, - 'file': MISSING if file is None else file, - 'files': MISSING if files is None else files, - 'allowed_mentions': MISSING if allowed_mentions is None else allowed_mentions, - 'view': MISSING if view is None else view, - 'suppress_embeds': suppress_embeds, - 'ephemeral': ephemeral, - 'silent': silent, - } - - if self.interaction.response.is_done(): - msg = await self.interaction.followup.send(**kwargs, wait=True) - else: - await self.interaction.response.send_message(**kwargs) - msg = await self.interaction.original_response() - - if delete_after is not None: - await msg.delete(delay=delete_after) - return msg diff --git a/.venv/Lib/site-packages/discord/ext/commands/converter.py b/.venv/Lib/site-packages/discord/ext/commands/converter.py deleted file mode 100644 index 7255f17..0000000 --- a/.venv/Lib/site-packages/discord/ext/commands/converter.py +++ /dev/null @@ -1,1355 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -import inspect -import re -from typing import ( - TYPE_CHECKING, - Any, - Dict, - Generic, - Iterable, - List, - Literal, - Optional, - overload, - Protocol, - Tuple, - Type, - TypeVar, - Union, - runtime_checkable, -) -import types - -import discord - -from .errors import * - -if TYPE_CHECKING: - from discord.state import Channel - from discord.threads import Thread - - from .parameters import Parameter - from ._types import BotT, _Bot - from .context import Context - -__all__ = ( - 'Converter', - 'ObjectConverter', - 'MemberConverter', - 'UserConverter', - 'MessageConverter', - 'PartialMessageConverter', - 'TextChannelConverter', - 'InviteConverter', - 'GuildConverter', - 'RoleConverter', - 'GameConverter', - 'ColourConverter', - 'ColorConverter', - 'VoiceChannelConverter', - 'StageChannelConverter', - 'EmojiConverter', - 'PartialEmojiConverter', - 'CategoryChannelConverter', - 'ForumChannelConverter', - 'IDConverter', - 'ThreadConverter', - 'GuildChannelConverter', - 'GuildStickerConverter', - 'ScheduledEventConverter', - 'clean_content', - 'Greedy', - 'Range', - 'run_converters', -) - - -def _get_from_guilds(bot: _Bot, getter: str, argument: Any) -> Any: - result = None - for guild in bot.guilds: - result = getattr(guild, getter)(argument) - if result: - return result - return result - - -_utils_get = discord.utils.get -T = TypeVar('T') -T_co = TypeVar('T_co', covariant=True) -CT = TypeVar('CT', bound=discord.abc.GuildChannel) -TT = TypeVar('TT', bound=discord.Thread) - - -@runtime_checkable -class Converter(Protocol[T_co]): - """The base class of custom converters that require the :class:`.Context` - to be passed to be useful. - - This allows you to implement converters that function similar to the - special cased ``discord`` classes. - - Classes that derive from this should override the :meth:`~.Converter.convert` - method to do its conversion logic. This method must be a :ref:`coroutine `. - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> T_co: - """|coro| - - The method to override to do conversion logic. - - If an error is found while converting, it is recommended to - raise a :exc:`.CommandError` derived exception as it will - properly propagate to the error handlers. - - Parameters - ----------- - ctx: :class:`.Context` - The invocation context that the argument is being used in. - argument: :class:`str` - The argument that is being converted. - - Raises - ------- - CommandError - A generic exception occurred when converting the argument. - BadArgument - The converter failed to convert the argument. - """ - raise NotImplementedError('Derived classes need to implement this.') - - -_ID_REGEX = re.compile(r'([0-9]{15,20})$') - - -class IDConverter(Converter[T_co]): - @staticmethod - def _get_id_match(argument): - return _ID_REGEX.match(argument) - - -class ObjectConverter(IDConverter[discord.Object]): - """Converts to a :class:`~discord.Object`. - - The argument must follow the valid ID or mention formats (e.g. ``<@80088516616269824>``). - - .. versionadded:: 2.0 - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by member, role, or channel mention. - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.Object: - match = self._get_id_match(argument) or re.match(r'<(?:@(?:!|&)?|#)([0-9]{15,20})>$', argument) - - if match is None: - raise ObjectNotFound(argument) - - result = int(match.group(1)) - - return discord.Object(id=result) - - -class MemberConverter(IDConverter[discord.Member]): - """Converts to a :class:`~discord.Member`. - - All lookups are via the local guild. If in a DM context, then the lookup - is done by the global cache. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by mention. - 3. Lookup by username#discriminator (deprecated). - 4. Lookup by username#0 (deprecated, only gets users that migrated from their discriminator). - 5. Lookup by user name. - 6. Lookup by global name. - 7. Lookup by guild nickname. - - .. versionchanged:: 1.5 - Raise :exc:`.MemberNotFound` instead of generic :exc:`.BadArgument` - - .. versionchanged:: 1.5.1 - This converter now lazily fetches members from the gateway and HTTP APIs, - optionally caching the result if :attr:`.MemberCacheFlags.joined` is enabled. - - .. deprecated:: 2.3 - Looking up users by discriminator will be removed in a future version due to - the removal of discriminators in an API change. - """ - - async def query_member_named(self, guild: discord.Guild, argument: str) -> Optional[discord.Member]: - cache = guild._state.member_cache_flags.joined - username, _, discriminator = argument.rpartition('#') - - # If # isn't found then "discriminator" actually has the username - if not username: - discriminator, username = username, discriminator - - if discriminator == '0' or (len(discriminator) == 4 and discriminator.isdigit()): - lookup = username - predicate = lambda m: m.name == username and m.discriminator == discriminator - else: - lookup = argument - predicate = lambda m: m.name == argument or m.global_name == argument or m.nick == argument - - members = await guild.query_members(lookup, limit=100, cache=cache) - return discord.utils.find(predicate, members) - - async def query_member_by_id(self, bot: _Bot, guild: discord.Guild, user_id: int) -> Optional[discord.Member]: - ws = bot._get_websocket(shard_id=guild.shard_id) - cache = guild._state.member_cache_flags.joined - if ws.is_ratelimited(): - # If we're being rate limited on the WS, then fall back to using the HTTP API - # So we don't have to wait ~60 seconds for the query to finish - try: - member = await guild.fetch_member(user_id) - except discord.HTTPException: - return None - - if cache: - guild._add_member(member) - return member - - # If we're not being rate limited then we can use the websocket to actually query - members = await guild.query_members(limit=1, user_ids=[user_id], cache=cache) - if not members: - return None - return members[0] - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.Member: - bot = ctx.bot - match = self._get_id_match(argument) or re.match(r'<@!?([0-9]{15,20})>$', argument) - guild = ctx.guild - result = None - user_id = None - - if match is None: - # not a mention... - if guild: - result = guild.get_member_named(argument) - else: - result = _get_from_guilds(bot, 'get_member_named', argument) - else: - user_id = int(match.group(1)) - if guild: - result = guild.get_member(user_id) or _utils_get(ctx.message.mentions, id=user_id) - else: - result = _get_from_guilds(bot, 'get_member', user_id) - - if not isinstance(result, discord.Member): - if guild is None: - raise MemberNotFound(argument) - - if user_id is not None: - result = await self.query_member_by_id(bot, guild, user_id) - else: - result = await self.query_member_named(guild, argument) - - if not result: - raise MemberNotFound(argument) - - return result - - -class UserConverter(IDConverter[discord.User]): - """Converts to a :class:`~discord.User`. - - All lookups are via the global user cache. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by mention. - 3. Lookup by username#discriminator (deprecated). - 4. Lookup by username#0 (deprecated, only gets users that migrated from their discriminator). - 5. Lookup by user name. - 6. Lookup by global name. - - .. versionchanged:: 1.5 - Raise :exc:`.UserNotFound` instead of generic :exc:`.BadArgument` - - .. versionchanged:: 1.6 - This converter now lazily fetches users from the HTTP APIs if an ID is passed - and it's not available in cache. - - .. deprecated:: 2.3 - Looking up users by discriminator will be removed in a future version due to - the removal of discriminators in an API change. - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.User: - match = self._get_id_match(argument) or re.match(r'<@!?([0-9]{15,20})>$', argument) - result = None - state = ctx._state - - if match is not None: - user_id = int(match.group(1)) - result = ctx.bot.get_user(user_id) or _utils_get(ctx.message.mentions, id=user_id) - if result is None: - try: - result = await ctx.bot.fetch_user(user_id) - except discord.HTTPException: - raise UserNotFound(argument) from None - - return result # type: ignore - - username, _, discriminator = argument.rpartition('#') - - # If # isn't found then "discriminator" actually has the username - if not username: - discriminator, username = username, discriminator - - if discriminator == '0' or (len(discriminator) == 4 and discriminator.isdigit()): - predicate = lambda u: u.name == username and u.discriminator == discriminator - else: - predicate = lambda u: u.name == argument or u.global_name == argument - - result = discord.utils.find(predicate, state._users.values()) - if result is None: - raise UserNotFound(argument) - - return result - - -class PartialMessageConverter(Converter[discord.PartialMessage]): - """Converts to a :class:`discord.PartialMessage`. - - .. versionadded:: 1.7 - - The creation strategy is as follows (in order): - - 1. By "{channel ID}-{message ID}" (retrieved by shift-clicking on "Copy ID") - 2. By message ID (The message is assumed to be in the context channel.) - 3. By message URL - """ - - @staticmethod - def _get_id_matches(ctx: Context[BotT], argument: str) -> Tuple[Optional[int], int, int]: - id_regex = re.compile(r'(?:(?P[0-9]{15,20})-)?(?P[0-9]{15,20})$') - link_regex = re.compile( - r'https?://(?:(ptb|canary|www)\.)?discord(?:app)?\.com/channels/' - r'(?P[0-9]{15,20}|@me)' - r'/(?P[0-9]{15,20})/(?P[0-9]{15,20})/?$' - ) - match = id_regex.match(argument) or link_regex.match(argument) - if not match: - raise MessageNotFound(argument) - data = match.groupdict() - channel_id = discord.utils._get_as_snowflake(data, 'channel_id') or ctx.channel.id - message_id = int(data['message_id']) - guild_id = data.get('guild_id') - if guild_id is None: - guild_id = ctx.guild and ctx.guild.id - elif guild_id == '@me': - guild_id = None - else: - guild_id = int(guild_id) - return guild_id, message_id, channel_id - - @staticmethod - def _resolve_channel( - ctx: Context[BotT], guild_id: Optional[int], channel_id: Optional[int] - ) -> Optional[Union[Channel, Thread]]: - if channel_id is None: - # we were passed just a message id so we can assume the channel is the current context channel - return ctx.channel - - if guild_id is not None: - guild = ctx.bot.get_guild(guild_id) - if guild is None: - return None - return guild._resolve_channel(channel_id) - - return ctx.bot.get_channel(channel_id) - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.PartialMessage: - guild_id, message_id, channel_id = self._get_id_matches(ctx, argument) - channel = self._resolve_channel(ctx, guild_id, channel_id) - if not channel or not isinstance(channel, discord.abc.Messageable): - raise ChannelNotFound(channel_id) - return discord.PartialMessage(channel=channel, id=message_id) - - -class MessageConverter(IDConverter[discord.Message]): - """Converts to a :class:`discord.Message`. - - .. versionadded:: 1.1 - - The lookup strategy is as follows (in order): - - 1. Lookup by "{channel ID}-{message ID}" (retrieved by shift-clicking on "Copy ID") - 2. Lookup by message ID (the message **must** be in the context channel) - 3. Lookup by message URL - - .. versionchanged:: 1.5 - Raise :exc:`.ChannelNotFound`, :exc:`.MessageNotFound` or :exc:`.ChannelNotReadable` instead of generic :exc:`.BadArgument` - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.Message: - guild_id, message_id, channel_id = PartialMessageConverter._get_id_matches(ctx, argument) - message = ctx.bot._connection._get_message(message_id) - if message: - return message - channel = PartialMessageConverter._resolve_channel(ctx, guild_id, channel_id) - if not channel or not isinstance(channel, discord.abc.Messageable): - raise ChannelNotFound(channel_id) - try: - return await channel.fetch_message(message_id) - except discord.NotFound: - raise MessageNotFound(argument) - except discord.Forbidden: - raise ChannelNotReadable(channel) # type: ignore # type-checker thinks channel could be a DMChannel at this point - - -class GuildChannelConverter(IDConverter[discord.abc.GuildChannel]): - """Converts to a :class:`~discord.abc.GuildChannel`. - - All lookups are via the local guild. If in a DM context, then the lookup - is done by the global cache. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by mention. - 3. Lookup by name. - - .. versionadded:: 2.0 - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.abc.GuildChannel: - return self._resolve_channel(ctx, argument, 'channels', discord.abc.GuildChannel) - - @staticmethod - def _resolve_channel(ctx: Context[BotT], argument: str, attribute: str, type: Type[CT]) -> CT: - bot = ctx.bot - - match = IDConverter._get_id_match(argument) or re.match(r'<#([0-9]{15,20})>$', argument) - result = None - guild = ctx.guild - - if match is None: - # not a mention - if guild: - iterable: Iterable[CT] = getattr(guild, attribute) - result: Optional[CT] = discord.utils.get(iterable, name=argument) - else: - - def check(c): - return isinstance(c, type) and c.name == argument - - result = discord.utils.find(check, bot.get_all_channels()) # type: ignore - else: - channel_id = int(match.group(1)) - if guild: - # guild.get_channel returns an explicit union instead of the base class - result = guild.get_channel(channel_id) # type: ignore - else: - result = _get_from_guilds(bot, 'get_channel', channel_id) - - if not isinstance(result, type): - raise ChannelNotFound(argument) - - return result - - @staticmethod - def _resolve_thread(ctx: Context[BotT], argument: str, attribute: str, type: Type[TT]) -> TT: - match = IDConverter._get_id_match(argument) or re.match(r'<#([0-9]{15,20})>$', argument) - result = None - guild = ctx.guild - - if match is None: - # not a mention - if guild: - iterable: Iterable[TT] = getattr(guild, attribute) - result: Optional[TT] = discord.utils.get(iterable, name=argument) - else: - thread_id = int(match.group(1)) - if guild: - result = guild.get_thread(thread_id) # type: ignore - - if not result or not isinstance(result, type): - raise ThreadNotFound(argument) - - return result - - -class TextChannelConverter(IDConverter[discord.TextChannel]): - """Converts to a :class:`~discord.TextChannel`. - - All lookups are via the local guild. If in a DM context, then the lookup - is done by the global cache. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by mention. - 3. Lookup by name - - .. versionchanged:: 1.5 - Raise :exc:`.ChannelNotFound` instead of generic :exc:`.BadArgument` - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.TextChannel: - return GuildChannelConverter._resolve_channel(ctx, argument, 'text_channels', discord.TextChannel) - - -class VoiceChannelConverter(IDConverter[discord.VoiceChannel]): - """Converts to a :class:`~discord.VoiceChannel`. - - All lookups are via the local guild. If in a DM context, then the lookup - is done by the global cache. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by mention. - 3. Lookup by name - - .. versionchanged:: 1.5 - Raise :exc:`.ChannelNotFound` instead of generic :exc:`.BadArgument` - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.VoiceChannel: - return GuildChannelConverter._resolve_channel(ctx, argument, 'voice_channels', discord.VoiceChannel) - - -class StageChannelConverter(IDConverter[discord.StageChannel]): - """Converts to a :class:`~discord.StageChannel`. - - .. versionadded:: 1.7 - - All lookups are via the local guild. If in a DM context, then the lookup - is done by the global cache. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by mention. - 3. Lookup by name - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.StageChannel: - return GuildChannelConverter._resolve_channel(ctx, argument, 'stage_channels', discord.StageChannel) - - -class CategoryChannelConverter(IDConverter[discord.CategoryChannel]): - """Converts to a :class:`~discord.CategoryChannel`. - - All lookups are via the local guild. If in a DM context, then the lookup - is done by the global cache. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by mention. - 3. Lookup by name - - .. versionchanged:: 1.5 - Raise :exc:`.ChannelNotFound` instead of generic :exc:`.BadArgument` - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.CategoryChannel: - return GuildChannelConverter._resolve_channel(ctx, argument, 'categories', discord.CategoryChannel) - - -class ThreadConverter(IDConverter[discord.Thread]): - """Converts to a :class:`~discord.Thread`. - - All lookups are via the local guild. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by mention. - 3. Lookup by name. - - .. versionadded: 2.0 - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.Thread: - return GuildChannelConverter._resolve_thread(ctx, argument, 'threads', discord.Thread) - - -class ForumChannelConverter(IDConverter[discord.ForumChannel]): - """Converts to a :class:`~discord.ForumChannel`. - - All lookups are via the local guild. If in a DM context, then the lookup - is done by the global cache. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by mention. - 3. Lookup by name - - .. versionadded:: 2.0 - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.ForumChannel: - return GuildChannelConverter._resolve_channel(ctx, argument, 'forums', discord.ForumChannel) - - -class ColourConverter(Converter[discord.Colour]): - """Converts to a :class:`~discord.Colour`. - - .. versionchanged:: 1.5 - Add an alias named ColorConverter - - The following formats are accepted: - - - ``0x`` - - ``#`` - - ``0x#`` - - ``rgb(, , )`` - - Any of the ``classmethod`` in :class:`~discord.Colour` - - - The ``_`` in the name can be optionally replaced with spaces. - - Like CSS, ```` can be either 0-255 or 0-100% and ```` can be - either a 6 digit hex number or a 3 digit hex shortcut (e.g. #fff). - - .. versionchanged:: 1.5 - Raise :exc:`.BadColourArgument` instead of generic :exc:`.BadArgument` - - .. versionchanged:: 1.7 - Added support for ``rgb`` function and 3-digit hex shortcuts - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.Colour: - try: - return discord.Colour.from_str(argument) - except ValueError: - arg = argument.lower().replace(' ', '_') - method = getattr(discord.Colour, arg, None) - if arg.startswith('from_') or method is None or not inspect.ismethod(method): - raise BadColourArgument(arg) - return method() - - -ColorConverter = ColourConverter - - -class RoleConverter(IDConverter[discord.Role]): - """Converts to a :class:`~discord.Role`. - - All lookups are via the local guild. If in a DM context, the converter raises - :exc:`.NoPrivateMessage` exception. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by mention. - 3. Lookup by name - - .. versionchanged:: 1.5 - Raise :exc:`.RoleNotFound` instead of generic :exc:`.BadArgument` - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.Role: - guild = ctx.guild - if not guild: - raise NoPrivateMessage() - - match = self._get_id_match(argument) or re.match(r'<@&([0-9]{15,20})>$', argument) - if match: - result = guild.get_role(int(match.group(1))) - else: - result = discord.utils.get(guild._roles.values(), name=argument) - - if result is None: - raise RoleNotFound(argument) - return result - - -class GameConverter(Converter[discord.Game]): - """Converts to a :class:`~discord.Game`.""" - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.Game: - return discord.Game(name=argument) - - -class InviteConverter(Converter[discord.Invite]): - """Converts to a :class:`~discord.Invite`. - - This is done via an HTTP request using :meth:`.Bot.fetch_invite`. - - .. versionchanged:: 1.5 - Raise :exc:`.BadInviteArgument` instead of generic :exc:`.BadArgument` - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.Invite: - try: - invite = await ctx.bot.fetch_invite(argument) - return invite - except Exception as exc: - raise BadInviteArgument(argument) from exc - - -class GuildConverter(IDConverter[discord.Guild]): - """Converts to a :class:`~discord.Guild`. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by name. (There is no disambiguation for Guilds with multiple matching names). - - .. versionadded:: 1.7 - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.Guild: - match = self._get_id_match(argument) - result = None - - if match is not None: - guild_id = int(match.group(1)) - result = ctx.bot.get_guild(guild_id) - - if result is None: - result = discord.utils.get(ctx.bot.guilds, name=argument) - - if result is None: - raise GuildNotFound(argument) - return result - - -class EmojiConverter(IDConverter[discord.Emoji]): - """Converts to a :class:`~discord.Emoji`. - - All lookups are done for the local guild first, if available. If that lookup - fails, then it checks the client's global cache. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by extracting ID from the emoji. - 3. Lookup by name - - .. versionchanged:: 1.5 - Raise :exc:`.EmojiNotFound` instead of generic :exc:`.BadArgument` - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.Emoji: - match = self._get_id_match(argument) or re.match(r'$', argument) - result = None - bot = ctx.bot - guild = ctx.guild - - if match is None: - # Try to get the emoji by name. Try local guild first. - if guild: - result = discord.utils.get(guild.emojis, name=argument) - - if result is None: - result = discord.utils.get(bot.emojis, name=argument) - else: - emoji_id = int(match.group(1)) - - # Try to look up emoji by id. - result = bot.get_emoji(emoji_id) - - if result is None: - raise EmojiNotFound(argument) - - return result - - -class PartialEmojiConverter(Converter[discord.PartialEmoji]): - """Converts to a :class:`~discord.PartialEmoji`. - - This is done by extracting the animated flag, name and ID from the emoji. - - .. versionchanged:: 1.5 - Raise :exc:`.PartialEmojiConversionFailure` instead of generic :exc:`.BadArgument` - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.PartialEmoji: - match = re.match(r'<(a?):([a-zA-Z0-9\_]{1,32}):([0-9]{15,20})>$', argument) - - if match: - emoji_animated = bool(match.group(1)) - emoji_name = match.group(2) - emoji_id = int(match.group(3)) - - return discord.PartialEmoji.with_state( - ctx.bot._connection, animated=emoji_animated, name=emoji_name, id=emoji_id - ) - - raise PartialEmojiConversionFailure(argument) - - -class GuildStickerConverter(IDConverter[discord.GuildSticker]): - """Converts to a :class:`~discord.GuildSticker`. - - All lookups are done for the local guild first, if available. If that lookup - fails, then it checks the client's global cache. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by name. - - .. versionadded:: 2.0 - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.GuildSticker: - match = self._get_id_match(argument) - result = None - bot = ctx.bot - guild = ctx.guild - - if match is None: - # Try to get the sticker by name. Try local guild first. - if guild: - result = discord.utils.get(guild.stickers, name=argument) - - if result is None: - result = discord.utils.get(bot.stickers, name=argument) - else: - sticker_id = int(match.group(1)) - - # Try to look up sticker by id. - result = bot.get_sticker(sticker_id) - - if result is None: - raise GuildStickerNotFound(argument) - - return result - - -class ScheduledEventConverter(IDConverter[discord.ScheduledEvent]): - """Converts to a :class:`~discord.ScheduledEvent`. - - Lookups are done for the local guild if available. Otherwise, for a DM context, - lookup is done by the global cache. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by url. - 3. Lookup by name. - - .. versionadded:: 2.0 - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.ScheduledEvent: - guild = ctx.guild - match = self._get_id_match(argument) - result = None - - if match: - # ID match - event_id = int(match.group(1)) - if guild: - result = guild.get_scheduled_event(event_id) - else: - for guild in ctx.bot.guilds: - result = guild.get_scheduled_event(event_id) - if result: - break - else: - pattern = ( - r'https?://(?:(ptb|canary|www)\.)?discord\.com/events/' - r'(?P[0-9]{15,20})/' - r'(?P[0-9]{15,20})$' - ) - match = re.match(pattern, argument, flags=re.I) - if match: - # URL match - guild = ctx.bot.get_guild(int(match.group('guild_id'))) - - if guild: - event_id = int(match.group('event_id')) - result = guild.get_scheduled_event(event_id) - else: - # lookup by name - if guild: - result = discord.utils.get(guild.scheduled_events, name=argument) - else: - for guild in ctx.bot.guilds: - result = discord.utils.get(guild.scheduled_events, name=argument) - if result: - break - if result is None: - raise ScheduledEventNotFound(argument) - - return result - - -class clean_content(Converter[str]): - """Converts the argument to mention scrubbed version of - said content. - - This behaves similarly to :attr:`~discord.Message.clean_content`. - - Attributes - ------------ - fix_channel_mentions: :class:`bool` - Whether to clean channel mentions. - use_nicknames: :class:`bool` - Whether to use nicknames when transforming mentions. - escape_markdown: :class:`bool` - Whether to also escape special markdown characters. - remove_markdown: :class:`bool` - Whether to also remove special markdown characters. This option is not supported with ``escape_markdown`` - - .. versionadded:: 1.7 - """ - - def __init__( - self, - *, - fix_channel_mentions: bool = False, - use_nicknames: bool = True, - escape_markdown: bool = False, - remove_markdown: bool = False, - ) -> None: - self.fix_channel_mentions = fix_channel_mentions - self.use_nicknames = use_nicknames - self.escape_markdown = escape_markdown - self.remove_markdown = remove_markdown - - async def convert(self, ctx: Context[BotT], argument: str) -> str: - msg = ctx.message - - if ctx.guild: - - def resolve_member(id: int) -> str: - m = _utils_get(msg.mentions, id=id) or ctx.guild.get_member(id) # type: ignore - return f'@{m.display_name if self.use_nicknames else m.name}' if m else '@deleted-user' - - def resolve_role(id: int) -> str: - r = _utils_get(msg.role_mentions, id=id) or ctx.guild.get_role(id) # type: ignore - return f'@{r.name}' if r else '@deleted-role' - - else: - - def resolve_member(id: int) -> str: - m = _utils_get(msg.mentions, id=id) or ctx.bot.get_user(id) - return f'@{m.display_name}' if m else '@deleted-user' - - def resolve_role(id: int) -> str: - return '@deleted-role' - - if self.fix_channel_mentions and ctx.guild: - - def resolve_channel(id: int) -> str: - c = ctx.guild._resolve_channel(id) # type: ignore - return f'#{c.name}' if c else '#deleted-channel' - - else: - - def resolve_channel(id: int) -> str: - return f'<#{id}>' - - transforms = { - '@': resolve_member, - '@!': resolve_member, - '#': resolve_channel, - '@&': resolve_role, - } - - def repl(match: re.Match) -> str: - type = match[1] - id = int(match[2]) - transformed = transforms[type](id) - return transformed - - result = re.sub(r'<(@[!&]?|#)([0-9]{15,20})>', repl, argument) - if self.escape_markdown: - result = discord.utils.escape_markdown(result) - elif self.remove_markdown: - result = discord.utils.remove_markdown(result) - - # Completely ensure no mentions escape: - return discord.utils.escape_mentions(result) - - -class Greedy(List[T]): - r"""A special converter that greedily consumes arguments until it can't. - As a consequence of this behaviour, most input errors are silently discarded, - since it is used as an indicator of when to stop parsing. - - When a parser error is met the greedy converter stops converting, undoes the - internal string parsing routine, and continues parsing regularly. - - For example, in the following code: - - .. code-block:: python3 - - @commands.command() - async def test(ctx, numbers: Greedy[int], reason: str): - await ctx.send("numbers: {}, reason: {}".format(numbers, reason)) - - An invocation of ``[p]test 1 2 3 4 5 6 hello`` would pass ``numbers`` with - ``[1, 2, 3, 4, 5, 6]`` and ``reason`` with ``hello``\. - - For more information, check :ref:`ext_commands_special_converters`. - - .. note:: - - For interaction based contexts the conversion error is propagated - rather than swallowed due to the difference in user experience with - application commands. - """ - - __slots__ = ('converter',) - - def __init__(self, *, converter: T) -> None: - self.converter: T = converter - - def __repr__(self) -> str: - converter = getattr(self.converter, '__name__', repr(self.converter)) - return f'Greedy[{converter}]' - - def __class_getitem__(cls, params: Union[Tuple[T], T]) -> Greedy[T]: - if not isinstance(params, tuple): - params = (params,) - if len(params) != 1: - raise TypeError('Greedy[...] only takes a single argument') - converter = params[0] - - args = getattr(converter, '__args__', ()) - if discord.utils.PY_310 and converter.__class__ is types.UnionType: # type: ignore - converter = Union[args] # type: ignore - - origin = getattr(converter, '__origin__', None) - - if not (callable(converter) or isinstance(converter, Converter) or origin is not None): - raise TypeError('Greedy[...] expects a type or a Converter instance.') - - if converter in (str, type(None)) or origin is Greedy: - raise TypeError(f'Greedy[{converter.__name__}] is invalid.') # type: ignore - - if origin is Union and type(None) in args: - raise TypeError(f'Greedy[{converter!r}] is invalid.') - - return cls(converter=converter) - - @property - def constructed_converter(self) -> Any: - # Only construct a converter once in order to maintain state between convert calls - if ( - inspect.isclass(self.converter) - and issubclass(self.converter, Converter) - and not inspect.ismethod(self.converter.convert) - ): - return self.converter() - return self.converter - - -if TYPE_CHECKING: - from typing_extensions import Annotated as Range -else: - - class Range: - """A special converter that can be applied to a parameter to require a numeric - or string type to fit within the range provided. - - During type checking time this is equivalent to :obj:`typing.Annotated` so type checkers understand - the intent of the code. - - Some example ranges: - - - ``Range[int, 10]`` means the minimum is 10 with no maximum. - - ``Range[int, None, 10]`` means the maximum is 10 with no minimum. - - ``Range[int, 1, 10]`` means the minimum is 1 and the maximum is 10. - - ``Range[float, 1.0, 5.0]`` means the minimum is 1.0 and the maximum is 5.0. - - ``Range[str, 1, 10]`` means the minimum length is 1 and the maximum length is 10. - - Inside a :class:`HybridCommand` this functions equivalently to :class:`discord.app_commands.Range`. - - If the value cannot be converted to the provided type or is outside the given range, - :class:`~.ext.commands.BadArgument` or :class:`~.ext.commands.RangeError` is raised to - the appropriate error handlers respectively. - - .. versionadded:: 2.0 - - Examples - ---------- - - .. code-block:: python3 - - @bot.command() - async def range(ctx: commands.Context, value: commands.Range[int, 10, 12]): - await ctx.send(f'Your value is {value}') - """ - - def __init__( - self, - *, - annotation: Any, - min: Optional[Union[int, float]] = None, - max: Optional[Union[int, float]] = None, - ) -> None: - self.annotation: Any = annotation - self.min: Optional[Union[int, float]] = min - self.max: Optional[Union[int, float]] = max - - if min and max and min > max: - raise TypeError('minimum cannot be larger than maximum') - - async def convert(self, ctx: Context[BotT], value: str) -> Union[int, float]: - try: - count = converted = self.annotation(value) - except ValueError: - raise BadArgument( - f'Converting to "{self.annotation.__name__}" failed for parameter "{ctx.current_parameter.name}".' - ) - - if self.annotation is str: - count = len(value) - - if (self.min is not None and count < self.min) or (self.max is not None and count > self.max): - raise RangeError(converted, minimum=self.min, maximum=self.max) - - return converted - - def __call__(self) -> None: - # Trick to allow it inside typing.Union - pass - - def __or__(self, rhs) -> Any: - return Union[self, rhs] - - def __repr__(self) -> str: - return f'{self.__class__.__name__}[{self.annotation.__name__}, {self.min}, {self.max}]' - - def __class_getitem__(cls, obj) -> Range: - if not isinstance(obj, tuple): - raise TypeError(f'expected tuple for arguments, received {obj.__class__.__name__} instead') - - if len(obj) == 2: - obj = (*obj, None) - elif len(obj) != 3: - raise TypeError('Range accepts either two or three arguments with the first being the type of range.') - - annotation, min, max = obj - - if min is None and max is None: - raise TypeError('Range must not be empty') - - if min is not None and max is not None: - # At this point max and min are both not none - if type(min) != type(max): - raise TypeError('Both min and max in Range must be the same type') - - if annotation not in (int, float, str): - raise TypeError(f'expected int, float, or str as range type, received {annotation!r} instead') - - if annotation in (str, int): - cast = int - else: - cast = float - - return cls( - annotation=annotation, - min=cast(min) if min is not None else None, - max=cast(max) if max is not None else None, - ) - - -def _convert_to_bool(argument: str) -> bool: - lowered = argument.lower() - if lowered in ('yes', 'y', 'true', 't', '1', 'enable', 'on'): - return True - elif lowered in ('no', 'n', 'false', 'f', '0', 'disable', 'off'): - return False - else: - raise BadBoolArgument(lowered) - - -_GenericAlias = type(List[T]) - - -def is_generic_type(tp: Any, *, _GenericAlias: type = _GenericAlias) -> bool: - return isinstance(tp, type) and issubclass(tp, Generic) or isinstance(tp, _GenericAlias) - - -CONVERTER_MAPPING: Dict[type, Any] = { - discord.Object: ObjectConverter, - discord.Member: MemberConverter, - discord.User: UserConverter, - discord.Message: MessageConverter, - discord.PartialMessage: PartialMessageConverter, - discord.TextChannel: TextChannelConverter, - discord.Invite: InviteConverter, - discord.Guild: GuildConverter, - discord.Role: RoleConverter, - discord.Game: GameConverter, - discord.Colour: ColourConverter, - discord.VoiceChannel: VoiceChannelConverter, - discord.StageChannel: StageChannelConverter, - discord.Emoji: EmojiConverter, - discord.PartialEmoji: PartialEmojiConverter, - discord.CategoryChannel: CategoryChannelConverter, - discord.Thread: ThreadConverter, - discord.abc.GuildChannel: GuildChannelConverter, - discord.GuildSticker: GuildStickerConverter, - discord.ScheduledEvent: ScheduledEventConverter, - discord.ForumChannel: ForumChannelConverter, -} - - -async def _actual_conversion(ctx: Context[BotT], converter: Any, argument: str, param: inspect.Parameter): - if converter is bool: - return _convert_to_bool(argument) - - try: - module = converter.__module__ - except AttributeError: - pass - else: - if module is not None and (module.startswith('discord.') and not module.endswith('converter')): - converter = CONVERTER_MAPPING.get(converter, converter) - - try: - if inspect.isclass(converter) and issubclass(converter, Converter): - if inspect.ismethod(converter.convert): - return await converter.convert(ctx, argument) - else: - return await converter().convert(ctx, argument) - elif isinstance(converter, Converter): - return await converter.convert(ctx, argument) # type: ignore - except CommandError: - raise - except Exception as exc: - raise ConversionError(converter, exc) from exc # type: ignore - - try: - return converter(argument) - except CommandError: - raise - except Exception as exc: - try: - name = converter.__name__ - except AttributeError: - name = converter.__class__.__name__ - - raise BadArgument(f'Converting to "{name}" failed for parameter "{param.name}".') from exc - - -@overload -async def run_converters( - ctx: Context[BotT], converter: Union[Type[Converter[T]], Converter[T]], argument: str, param: Parameter -) -> T: - ... - - -@overload -async def run_converters(ctx: Context[BotT], converter: Any, argument: str, param: Parameter) -> Any: - ... - - -async def run_converters(ctx: Context[BotT], converter: Any, argument: str, param: Parameter) -> Any: - """|coro| - - Runs converters for a given converter, argument, and parameter. - - This function does the same work that the library does under the hood. - - .. versionadded:: 2.0 - - Parameters - ------------ - ctx: :class:`Context` - The invocation context to run the converters under. - converter: Any - The converter to run, this corresponds to the annotation in the function. - argument: :class:`str` - The argument to convert to. - param: :class:`Parameter` - The parameter being converted. This is mainly for error reporting. - - Raises - ------- - CommandError - The converter failed to convert. - - Returns - -------- - Any - The resulting conversion. - """ - origin = getattr(converter, '__origin__', None) - - if origin is Union: - errors = [] - _NoneType = type(None) - union_args = converter.__args__ - for conv in union_args: - # if we got to this part in the code, then the previous conversions have failed - # so we should just undo the view, return the default, and allow parsing to continue - # with the other parameters - if conv is _NoneType and param.kind != param.VAR_POSITIONAL: - ctx.view.undo() - return None if param.required else await param.get_default(ctx) - - try: - value = await run_converters(ctx, conv, argument, param) - except CommandError as exc: - errors.append(exc) - else: - return value - - # if we're here, then we failed all the converters - raise BadUnionArgument(param, union_args, errors) - - if origin is Literal: - errors = [] - conversions = {} - literal_args = converter.__args__ - for literal in literal_args: - literal_type = type(literal) - try: - value = conversions[literal_type] - except KeyError: - try: - value = await _actual_conversion(ctx, literal_type, argument, param) - except CommandError as exc: - errors.append(exc) - conversions[literal_type] = object() - continue - else: - conversions[literal_type] = value - - if value == literal: - return value - - # if we're here, then we failed to match all the literals - raise BadLiteralArgument(param, literal_args, errors, argument) - - # This must be the last if-clause in the chain of origin checking - # Nearly every type is a generic type within the typing library - # So care must be taken to make sure a more specialised origin handle - # isn't overwritten by the widest if clause - if origin is not None and is_generic_type(converter): - converter = origin - - return await _actual_conversion(ctx, converter, argument, param) diff --git a/.venv/Lib/site-packages/discord/ext/commands/cooldowns.py b/.venv/Lib/site-packages/discord/ext/commands/cooldowns.py deleted file mode 100644 index 2af7cb0..0000000 --- a/.venv/Lib/site-packages/discord/ext/commands/cooldowns.py +++ /dev/null @@ -1,285 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - - -from typing import Any, Callable, Deque, Dict, Optional, Union, Generic, TypeVar, TYPE_CHECKING -from discord.enums import Enum -import time -import asyncio -from collections import deque - -from ...abc import PrivateChannel -from .errors import MaxConcurrencyReached -from .context import Context -from discord.app_commands import Cooldown as Cooldown - -if TYPE_CHECKING: - from typing_extensions import Self - - from ...message import Message - -__all__ = ( - 'BucketType', - 'Cooldown', - 'CooldownMapping', - 'DynamicCooldownMapping', - 'MaxConcurrency', -) - -T_contra = TypeVar('T_contra', contravariant=True) - - -class BucketType(Enum): - default = 0 - user = 1 - guild = 2 - channel = 3 - member = 4 - category = 5 - role = 6 - - def get_key(self, msg: Union[Message, Context[Any]]) -> Any: - if self is BucketType.user: - return msg.author.id - elif self is BucketType.guild: - return (msg.guild or msg.author).id - elif self is BucketType.channel: - return msg.channel.id - elif self is BucketType.member: - return ((msg.guild and msg.guild.id), msg.author.id) - elif self is BucketType.category: - return (msg.channel.category or msg.channel).id # type: ignore - elif self is BucketType.role: - # we return the channel id of a private-channel as there are only roles in guilds - # and that yields the same result as for a guild with only the @everyone role - # NOTE: PrivateChannel doesn't actually have an id attribute but we assume we are - # receiving a DMChannel or GroupChannel which inherit from PrivateChannel and do - return (msg.channel if isinstance(msg.channel, PrivateChannel) else msg.author.top_role).id # type: ignore - - def __call__(self, msg: Union[Message, Context[Any]]) -> Any: - return self.get_key(msg) - - -class CooldownMapping(Generic[T_contra]): - def __init__( - self, - original: Optional[Cooldown], - type: Callable[[T_contra], Any], - ) -> None: - if not callable(type): - raise TypeError('Cooldown type must be a BucketType or callable') - - self._cache: Dict[Any, Cooldown] = {} - self._cooldown: Optional[Cooldown] = original - self._type: Callable[[T_contra], Any] = type - - def copy(self) -> CooldownMapping[T_contra]: - ret = CooldownMapping(self._cooldown, self._type) - ret._cache = self._cache.copy() - return ret - - @property - def valid(self) -> bool: - return self._cooldown is not None - - @property - def type(self) -> Callable[[T_contra], Any]: - return self._type - - @classmethod - def from_cooldown(cls, rate: float, per: float, type: Callable[[T_contra], Any]) -> Self: - return cls(Cooldown(rate, per), type) - - def _bucket_key(self, msg: T_contra) -> Any: - return self._type(msg) - - def _verify_cache_integrity(self, current: Optional[float] = None) -> None: - # we want to delete all cache objects that haven't been used - # in a cooldown window. e.g. if we have a command that has a - # cooldown of 60s and it has not been used in 60s then that key should be deleted - current = current or time.time() - dead_keys = [k for k, v in self._cache.items() if current > v._last + v.per] - for k in dead_keys: - del self._cache[k] - - def create_bucket(self, message: T_contra) -> Cooldown: - return self._cooldown.copy() # type: ignore - - def get_bucket(self, message: T_contra, current: Optional[float] = None) -> Optional[Cooldown]: - if self._type is BucketType.default: - return self._cooldown - - self._verify_cache_integrity(current) - key = self._bucket_key(message) - if key not in self._cache: - bucket = self.create_bucket(message) - if bucket is not None: - self._cache[key] = bucket - else: - bucket = self._cache[key] - - return bucket - - def update_rate_limit(self, message: T_contra, current: Optional[float] = None, tokens: int = 1) -> Optional[float]: - bucket = self.get_bucket(message, current) - if bucket is None: - return None - return bucket.update_rate_limit(current, tokens=tokens) - - -class DynamicCooldownMapping(CooldownMapping[T_contra]): - def __init__( - self, - factory: Callable[[T_contra], Optional[Cooldown]], - type: Callable[[T_contra], Any], - ) -> None: - super().__init__(None, type) - self._factory: Callable[[T_contra], Optional[Cooldown]] = factory - - def copy(self) -> DynamicCooldownMapping[T_contra]: - ret = DynamicCooldownMapping(self._factory, self._type) - ret._cache = self._cache.copy() - return ret - - @property - def valid(self) -> bool: - return True - - def create_bucket(self, message: T_contra) -> Optional[Cooldown]: - return self._factory(message) - - -class _Semaphore: - """This class is a version of a semaphore. - - If you're wondering why asyncio.Semaphore isn't being used, - it's because it doesn't expose the internal value. This internal - value is necessary because I need to support both `wait=True` and - `wait=False`. - - An asyncio.Queue could have been used to do this as well -- but it is - not as inefficient since internally that uses two queues and is a bit - overkill for what is basically a counter. - """ - - __slots__ = ('value', 'loop', '_waiters') - - def __init__(self, number: int) -> None: - self.value: int = number - self.loop: asyncio.AbstractEventLoop = asyncio.get_running_loop() - self._waiters: Deque[asyncio.Future] = deque() - - def __repr__(self) -> str: - return f'<_Semaphore value={self.value} waiters={len(self._waiters)}>' - - def locked(self) -> bool: - return self.value == 0 - - def is_active(self) -> bool: - return len(self._waiters) > 0 - - def wake_up(self) -> None: - while self._waiters: - future = self._waiters.popleft() - if not future.done(): - future.set_result(None) - return - - async def acquire(self, *, wait: bool = False) -> bool: - if not wait and self.value <= 0: - # signal that we're not acquiring - return False - - while self.value <= 0: - future = self.loop.create_future() - self._waiters.append(future) - try: - await future - except: - future.cancel() - if self.value > 0 and not future.cancelled(): - self.wake_up() - raise - - self.value -= 1 - return True - - def release(self) -> None: - self.value += 1 - self.wake_up() - - -class MaxConcurrency: - __slots__ = ('number', 'per', 'wait', '_mapping') - - def __init__(self, number: int, *, per: BucketType, wait: bool) -> None: - self._mapping: Dict[Any, _Semaphore] = {} - self.per: BucketType = per - self.number: int = number - self.wait: bool = wait - - if number <= 0: - raise ValueError('max_concurrency \'number\' cannot be less than 1') - - if not isinstance(per, BucketType): - raise TypeError(f'max_concurrency \'per\' must be of type BucketType not {type(per)!r}') - - def copy(self) -> Self: - return self.__class__(self.number, per=self.per, wait=self.wait) - - def __repr__(self) -> str: - return f'' - - def get_key(self, message: Union[Message, Context[Any]]) -> Any: - return self.per.get_key(message) - - async def acquire(self, message: Union[Message, Context[Any]]) -> None: - key = self.get_key(message) - - try: - sem = self._mapping[key] - except KeyError: - self._mapping[key] = sem = _Semaphore(self.number) - - acquired = await sem.acquire(wait=self.wait) - if not acquired: - raise MaxConcurrencyReached(self.number, self.per) - - async def release(self, message: Union[Message, Context[Any]]) -> None: - # Technically there's no reason for this function to be async - # But it might be more useful in the future - key = self.get_key(message) - - try: - sem = self._mapping[key] - except KeyError: - # ...? peculiar - return - else: - sem.release() - - if sem.value >= self.number and not sem.is_active(): - del self._mapping[key] diff --git a/.venv/Lib/site-packages/discord/ext/commands/core.py b/.venv/Lib/site-packages/discord/ext/commands/core.py deleted file mode 100644 index ffbefe2..0000000 --- a/.venv/Lib/site-packages/discord/ext/commands/core.py +++ /dev/null @@ -1,2640 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" -from __future__ import annotations - -import asyncio -import datetime -import functools -import inspect -from typing import ( - TYPE_CHECKING, - Any, - Callable, - Dict, - Generator, - Generic, - List, - Literal, - Optional, - Set, - Tuple, - Type, - TypeVar, - Union, - overload, -) -import re - -import discord - -from ._types import _BaseCommand, CogT -from .cog import Cog -from .context import Context -from .converter import Greedy, run_converters -from .cooldowns import BucketType, Cooldown, CooldownMapping, DynamicCooldownMapping, MaxConcurrency -from .errors import * -from .parameters import Parameter, Signature -from discord.app_commands.commands import NUMPY_DOCSTRING_ARG_REGEX - -if TYPE_CHECKING: - from typing_extensions import Concatenate, ParamSpec, Self - - from ._types import BotT, Check, ContextT, Coro, CoroFunc, Error, Hook, UserCheck - - -__all__ = ( - 'Command', - 'Group', - 'GroupMixin', - 'command', - 'group', - 'has_role', - 'has_permissions', - 'has_any_role', - 'check', - 'check_any', - 'before_invoke', - 'after_invoke', - 'bot_has_role', - 'bot_has_permissions', - 'bot_has_any_role', - 'cooldown', - 'dynamic_cooldown', - 'max_concurrency', - 'dm_only', - 'guild_only', - 'is_owner', - 'is_nsfw', - 'has_guild_permissions', - 'bot_has_guild_permissions', -) - -MISSING: Any = discord.utils.MISSING - -T = TypeVar('T') -CommandT = TypeVar('CommandT', bound='Command[Any, ..., Any]') -# CHT = TypeVar('CHT', bound='Check') -GroupT = TypeVar('GroupT', bound='Group[Any, ..., Any]') - -if TYPE_CHECKING: - P = ParamSpec('P') -else: - P = TypeVar('P') - - -def unwrap_function(function: Callable[..., Any], /) -> Callable[..., Any]: - partial = functools.partial - while True: - if hasattr(function, '__wrapped__'): - function = function.__wrapped__ - elif isinstance(function, partial): - function = function.func - else: - return function - - -def get_signature_parameters( - function: Callable[..., Any], - globalns: Dict[str, Any], - /, - *, - skip_parameters: Optional[int] = None, -) -> Dict[str, Parameter]: - signature = Signature.from_callable(function) - params: Dict[str, Parameter] = {} - cache: Dict[str, Any] = {} - eval_annotation = discord.utils.evaluate_annotation - required_params = discord.utils.is_inside_class(function) + 1 if skip_parameters is None else skip_parameters - if len(signature.parameters) < required_params: - raise TypeError(f'Command signature requires at least {required_params - 1} parameter(s)') - - iterator = iter(signature.parameters.items()) - for _ in range(0, required_params): - next(iterator) - - for name, parameter in iterator: - default = parameter.default - if isinstance(default, Parameter): # update from the default - if default.annotation is not Parameter.empty: - # There are a few cases to care about here. - # x: TextChannel = commands.CurrentChannel - # x = commands.CurrentChannel - # In both of these cases, the default parameter has an explicit annotation - # but in the second case it's only used as the fallback. - if default._fallback: - if parameter.annotation is Parameter.empty: - parameter._annotation = default.annotation - else: - parameter._annotation = default.annotation - - parameter._default = default.default - parameter._description = default._description - parameter._displayed_default = default._displayed_default - parameter._displayed_name = default._displayed_name - - annotation = parameter.annotation - - if annotation is None: - params[name] = parameter.replace(annotation=type(None)) - continue - - annotation = eval_annotation(annotation, globalns, globalns, cache) - if annotation is Greedy: - raise TypeError('Unparameterized Greedy[...] is disallowed in signature.') - - params[name] = parameter.replace(annotation=annotation) - - return params - - -PARAMETER_HEADING_REGEX = re.compile(r'Parameters?\n---+\n', re.I) - - -def _fold_text(input: str) -> str: - """Turns a single newline into a space, and multiple newlines into a newline.""" - - def replacer(m: re.Match[str]) -> str: - if len(m.group()) <= 1: - return ' ' - return '\n' - - return re.sub(r'\n+', replacer, inspect.cleandoc(input)) - - -def extract_descriptions_from_docstring(function: Callable[..., Any], params: Dict[str, Parameter], /) -> Optional[str]: - docstring = inspect.getdoc(function) - - if docstring is None: - return None - - divide = PARAMETER_HEADING_REGEX.split(docstring, 1) - if len(divide) == 1: - return docstring - - description, param_docstring = divide - for match in NUMPY_DOCSTRING_ARG_REGEX.finditer(param_docstring): - name = match.group('name') - - if name not in params: - is_display_name = discord.utils.get(params.values(), displayed_name=name) - if is_display_name: - name = is_display_name.name - else: - continue - - param = params[name] - if param.description is None: - param._description = _fold_text(match.group('description')) - - return _fold_text(description.strip()) - - -def wrap_callback(coro: Callable[P, Coro[T]], /) -> Callable[P, Coro[Optional[T]]]: - @functools.wraps(coro) - async def wrapped(*args: P.args, **kwargs: P.kwargs) -> Optional[T]: - try: - ret = await coro(*args, **kwargs) - except CommandError: - raise - except asyncio.CancelledError: - return - except Exception as exc: - raise CommandInvokeError(exc) from exc - return ret - - return wrapped - - -def hooked_wrapped_callback( - command: Command[Any, ..., Any], ctx: Context[BotT], coro: Callable[P, Coro[T]], / -) -> Callable[P, Coro[Optional[T]]]: - @functools.wraps(coro) - async def wrapped(*args: P.args, **kwargs: P.kwargs) -> Optional[T]: - try: - ret = await coro(*args, **kwargs) - except CommandError: - ctx.command_failed = True - raise - except asyncio.CancelledError: - ctx.command_failed = True - return - except Exception as exc: - ctx.command_failed = True - raise CommandInvokeError(exc) from exc - finally: - if command._max_concurrency is not None: - await command._max_concurrency.release(ctx.message) - - await command.call_after_hooks(ctx) - return ret - - return wrapped - - -class _CaseInsensitiveDict(dict): - def __contains__(self, k): - return super().__contains__(k.casefold()) - - def __delitem__(self, k): - return super().__delitem__(k.casefold()) - - def __getitem__(self, k): - return super().__getitem__(k.casefold()) - - def get(self, k, default=None): - return super().get(k.casefold(), default) - - def pop(self, k, default=None): - return super().pop(k.casefold(), default) - - def __setitem__(self, k, v): - super().__setitem__(k.casefold(), v) - - -class _AttachmentIterator: - def __init__(self, data: List[discord.Attachment]): - self.data: List[discord.Attachment] = data - self.index: int = 0 - - def __iter__(self) -> Self: - return self - - def __next__(self) -> discord.Attachment: - try: - value = self.data[self.index] - except IndexError: - raise StopIteration - else: - self.index += 1 - return value - - def is_empty(self) -> bool: - return self.index >= len(self.data) - - -class Command(_BaseCommand, Generic[CogT, P, T]): - r"""A class that implements the protocol for a bot text command. - - These are not created manually, instead they are created via the - decorator or functional interface. - - Attributes - ----------- - name: :class:`str` - The name of the command. - callback: :ref:`coroutine ` - The coroutine that is executed when the command is called. - help: Optional[:class:`str`] - The long help text for the command. - brief: Optional[:class:`str`] - The short help text for the command. - usage: Optional[:class:`str`] - A replacement for arguments in the default help text. - aliases: Union[List[:class:`str`], Tuple[:class:`str`]] - The list of aliases the command can be invoked under. - enabled: :class:`bool` - A boolean that indicates if the command is currently enabled. - If the command is invoked while it is disabled, then - :exc:`.DisabledCommand` is raised to the :func:`.on_command_error` - event. Defaults to ``True``. - parent: Optional[:class:`Group`] - The parent group that this command belongs to. ``None`` if there - isn't one. - cog: Optional[:class:`Cog`] - The cog that this command belongs to. ``None`` if there isn't one. - checks: List[Callable[[:class:`.Context`], :class:`bool`]] - A list of predicates that verifies if the command could be executed - with the given :class:`.Context` as the sole parameter. If an exception - is necessary to be thrown to signal failure, then one inherited from - :exc:`.CommandError` should be used. Note that if the checks fail then - :exc:`.CheckFailure` exception is raised to the :func:`.on_command_error` - event. - description: :class:`str` - The message prefixed into the default help command. - hidden: :class:`bool` - If ``True``\, the default help command does not show this in the - help output. - rest_is_raw: :class:`bool` - If ``False`` and a keyword-only argument is provided then the keyword - only argument is stripped and handled as if it was a regular argument - that handles :exc:`.MissingRequiredArgument` and default values in a - regular matter rather than passing the rest completely raw. If ``True`` - then the keyword-only argument will pass in the rest of the arguments - in a completely raw matter. Defaults to ``False``. - invoked_subcommand: Optional[:class:`Command`] - The subcommand that was invoked, if any. - require_var_positional: :class:`bool` - If ``True`` and a variadic positional argument is specified, requires - the user to specify at least one argument. Defaults to ``False``. - - .. versionadded:: 1.5 - - ignore_extra: :class:`bool` - If ``True``\, ignores extraneous strings passed to a command if all its - requirements are met (e.g. ``?foo a b c`` when only expecting ``a`` - and ``b``). Otherwise :func:`.on_command_error` and local error handlers - are called with :exc:`.TooManyArguments`. Defaults to ``True``. - cooldown_after_parsing: :class:`bool` - If ``True``\, cooldown processing is done after argument parsing, - which calls converters. If ``False`` then cooldown processing is done - first and then the converters are called second. Defaults to ``False``. - extras: :class:`dict` - A dict of user provided extras to attach to the Command. - - .. note:: - This object may be copied by the library. - - - .. versionadded:: 2.0 - """ - __original_kwargs__: Dict[str, Any] - - def __new__(cls, *args: Any, **kwargs: Any) -> Self: - # if you're wondering why this is done, it's because we need to ensure - # we have a complete original copy of **kwargs even for classes that - # mess with it by popping before delegating to the subclass __init__. - # In order to do this, we need to control the instance creation and - # inject the original kwargs through __new__ rather than doing it - # inside __init__. - self = super().__new__(cls) - - # we do a shallow copy because it's probably the most common use case. - # this could potentially break if someone modifies a list or something - # while it's in movement, but for now this is the cheapest and - # fastest way to do what we want. - self.__original_kwargs__ = kwargs.copy() - return self - - def __init__( - self, - func: Union[ - Callable[Concatenate[CogT, Context[Any], P], Coro[T]], - Callable[Concatenate[Context[Any], P], Coro[T]], - ], - /, - **kwargs: Any, - ) -> None: - if not asyncio.iscoroutinefunction(func): - raise TypeError('Callback must be a coroutine.') - - name = kwargs.get('name') or func.__name__ - if not isinstance(name, str): - raise TypeError('Name of a command must be a string.') - self.name: str = name - - self.callback = func - self.enabled: bool = kwargs.get('enabled', True) - - help_doc = kwargs.get('help') - if help_doc is not None: - help_doc = inspect.cleandoc(help_doc) - else: - help_doc = extract_descriptions_from_docstring(func, self.params) - - self.help: Optional[str] = help_doc - - self.brief: Optional[str] = kwargs.get('brief') - self.usage: Optional[str] = kwargs.get('usage') - self.rest_is_raw: bool = kwargs.get('rest_is_raw', False) - self.aliases: Union[List[str], Tuple[str]] = kwargs.get('aliases', []) - self.extras: Dict[Any, Any] = kwargs.get('extras', {}) - - if not isinstance(self.aliases, (list, tuple)): - raise TypeError("Aliases of a command must be a list or a tuple of strings.") - - self.description: str = inspect.cleandoc(kwargs.get('description', '')) - self.hidden: bool = kwargs.get('hidden', False) - - try: - checks = func.__commands_checks__ - checks.reverse() - except AttributeError: - checks = kwargs.get('checks', []) - - self.checks: List[UserCheck[Context[Any]]] = checks - - try: - cooldown = func.__commands_cooldown__ - except AttributeError: - cooldown = kwargs.get('cooldown') - - if cooldown is None: - buckets = CooldownMapping(cooldown, BucketType.default) - elif isinstance(cooldown, CooldownMapping): - buckets: CooldownMapping[Context[Any]] = cooldown - else: - raise TypeError("Cooldown must be an instance of CooldownMapping or None.") - self._buckets: CooldownMapping[Context[Any]] = buckets - - try: - max_concurrency = func.__commands_max_concurrency__ - except AttributeError: - max_concurrency = kwargs.get('max_concurrency') - - self._max_concurrency: Optional[MaxConcurrency] = max_concurrency - - self.require_var_positional: bool = kwargs.get('require_var_positional', False) - self.ignore_extra: bool = kwargs.get('ignore_extra', True) - self.cooldown_after_parsing: bool = kwargs.get('cooldown_after_parsing', False) - self._cog: CogT = None # type: ignore # This breaks every other pyright release - - # bandaid for the fact that sometimes parent can be the bot instance - parent: Optional[GroupMixin[Any]] = kwargs.get('parent') - self.parent: Optional[GroupMixin[Any]] = parent if isinstance(parent, _BaseCommand) else None # type: ignore # Does not recognise mixin usage - - self._before_invoke: Optional[Hook] = None - try: - before_invoke = func.__before_invoke__ - except AttributeError: - pass - else: - self.before_invoke(before_invoke) - - self._after_invoke: Optional[Hook] = None - try: - after_invoke = func.__after_invoke__ - except AttributeError: - pass - else: - self.after_invoke(after_invoke) - - @property - def cog(self) -> CogT: - return self._cog - - @cog.setter - def cog(self, value: CogT) -> None: - self._cog = value - - @property - def callback( - self, - ) -> Union[Callable[Concatenate[CogT, Context[Any], P], Coro[T]], Callable[Concatenate[Context[Any], P], Coro[T]],]: - return self._callback - - @callback.setter - def callback( - self, - function: Union[ - Callable[Concatenate[CogT, Context[Any], P], Coro[T]], - Callable[Concatenate[Context[Any], P], Coro[T]], - ], - ) -> None: - self._callback = function - unwrap = unwrap_function(function) - self.module: str = unwrap.__module__ - - try: - globalns = unwrap.__globals__ - except AttributeError: - globalns = {} - - self.params: Dict[str, Parameter] = get_signature_parameters(function, globalns) - - def add_check(self, func: UserCheck[Context[Any]], /) -> None: - """Adds a check to the command. - - This is the non-decorator interface to :func:`.check`. - - .. versionadded:: 1.3 - - .. versionchanged:: 2.0 - - ``func`` parameter is now positional-only. - - .. seealso:: The :func:`~discord.ext.commands.check` decorator - - Parameters - ----------- - func - The function that will be used as a check. - """ - - self.checks.append(func) - - def remove_check(self, func: UserCheck[Context[Any]], /) -> None: - """Removes a check from the command. - - This function is idempotent and will not raise an exception - if the function is not in the command's checks. - - .. versionadded:: 1.3 - - .. versionchanged:: 2.0 - - ``func`` parameter is now positional-only. - - Parameters - ----------- - func - The function to remove from the checks. - """ - - try: - self.checks.remove(func) - except ValueError: - pass - - def update(self, **kwargs: Any) -> None: - """Updates :class:`Command` instance with updated attribute. - - This works similarly to the :func:`~discord.ext.commands.command` decorator in terms - of parameters in that they are passed to the :class:`Command` or - subclass constructors, sans the name and callback. - """ - cog = self.cog - self.__init__(self.callback, **dict(self.__original_kwargs__, **kwargs)) - self.cog = cog - - async def __call__(self, context: Context[BotT], /, *args: P.args, **kwargs: P.kwargs) -> T: - """|coro| - - Calls the internal callback that the command holds. - - .. note:: - - This bypasses all mechanisms -- including checks, converters, - invoke hooks, cooldowns, etc. You must take care to pass - the proper arguments and types to this function. - - .. versionadded:: 1.3 - - .. versionchanged:: 2.0 - - ``context`` parameter is now positional-only. - """ - if self.cog is not None: - return await self.callback(self.cog, context, *args, **kwargs) # type: ignore - else: - return await self.callback(context, *args, **kwargs) # type: ignore - - def _ensure_assignment_on_copy(self, other: Self) -> Self: - other._before_invoke = self._before_invoke - other._after_invoke = self._after_invoke - other.extras = self.extras - if self.checks != other.checks: - other.checks = self.checks.copy() - if self._buckets.valid and not other._buckets.valid: - other._buckets = self._buckets.copy() - if self._max_concurrency and self._max_concurrency != other._max_concurrency: - other._max_concurrency = self._max_concurrency.copy() - - try: - other.on_error = self.on_error - except AttributeError: - pass - return other - - def copy(self) -> Self: - """Creates a copy of this command. - - Returns - -------- - :class:`Command` - A new instance of this command. - """ - ret = self.__class__(self.callback, **self.__original_kwargs__) - return self._ensure_assignment_on_copy(ret) - - def _update_copy(self, kwargs: Dict[str, Any]) -> Self: - if kwargs: - kw = kwargs.copy() - kw.update(self.__original_kwargs__) - copy = self.__class__(self.callback, **kw) - return self._ensure_assignment_on_copy(copy) - else: - return self.copy() - - async def dispatch_error(self, ctx: Context[BotT], error: CommandError, /) -> None: - ctx.command_failed = True - cog = self.cog - try: - coro = self.on_error - except AttributeError: - pass - else: - injected = wrap_callback(coro) # type: ignore - if cog is not None: - await injected(cog, ctx, error) - else: - await injected(ctx, error) # type: ignore - - try: - if cog is not None: - local = Cog._get_overridden_method(cog.cog_command_error) - if local is not None: - wrapped = wrap_callback(local) - await wrapped(ctx, error) - finally: - ctx.bot.dispatch('command_error', ctx, error) - - async def transform(self, ctx: Context[BotT], param: Parameter, attachments: _AttachmentIterator, /) -> Any: - converter = param.converter - consume_rest_is_special = param.kind == param.KEYWORD_ONLY and not self.rest_is_raw - view = ctx.view - view.skip_ws() - - # The greedy converter is simple -- it keeps going until it fails in which case, - # it undos the view ready for the next parameter to use instead - if isinstance(converter, Greedy): - # Special case for Greedy[discord.Attachment] to consume the attachments iterator - if converter.converter is discord.Attachment: - return list(attachments) - - if param.kind in (param.POSITIONAL_OR_KEYWORD, param.POSITIONAL_ONLY): - return await self._transform_greedy_pos(ctx, param, param.required, converter.constructed_converter) - elif param.kind == param.VAR_POSITIONAL: - return await self._transform_greedy_var_pos(ctx, param, converter.constructed_converter) - else: - # if we're here, then it's a KEYWORD_ONLY param type - # since this is mostly useless, we'll helpfully transform Greedy[X] - # into just X and do the parsing that way. - converter = converter.constructed_converter - - # Try to detect Optional[discord.Attachment] or discord.Attachment special converter - if converter is discord.Attachment: - try: - return next(attachments) - except StopIteration: - raise MissingRequiredAttachment(param) - - if self._is_typing_optional(param.annotation) and param.annotation.__args__[0] is discord.Attachment: - if attachments.is_empty(): - # I have no idea who would be doing Optional[discord.Attachment] = 1 - # but for those cases then 1 should be returned instead of None - return None if param.default is param.empty else param.default - return next(attachments) - - if view.eof: - if param.kind == param.VAR_POSITIONAL: - raise RuntimeError() # break the loop - if param.required: - if self._is_typing_optional(param.annotation): - return None - if hasattr(converter, '__commands_is_flag__') and converter._can_be_constructible(): - return await converter._construct_default(ctx) - raise MissingRequiredArgument(param) - return await param.get_default(ctx) - - previous = view.index - if consume_rest_is_special: - ctx.current_argument = argument = view.read_rest().strip() - else: - try: - ctx.current_argument = argument = view.get_quoted_word() - except ArgumentParsingError as exc: - if self._is_typing_optional(param.annotation): - view.index = previous - return None if param.required else await param.get_default(ctx) - else: - raise exc - view.previous = previous - - # type-checker fails to narrow argument - return await run_converters(ctx, converter, argument, param) # type: ignore - - async def _transform_greedy_pos(self, ctx: Context[BotT], param: Parameter, required: bool, converter: Any) -> Any: - view = ctx.view - result = [] - while not view.eof: - # for use with a manual undo - previous = view.index - - view.skip_ws() - try: - ctx.current_argument = argument = view.get_quoted_word() - value = await run_converters(ctx, converter, argument, param) # type: ignore - except (CommandError, ArgumentParsingError): - view.index = previous - break - else: - result.append(value) - - if not result and not required: - return await param.get_default(ctx) - return result - - async def _transform_greedy_var_pos(self, ctx: Context[BotT], param: Parameter, converter: Any) -> Any: - view = ctx.view - previous = view.index - try: - ctx.current_argument = argument = view.get_quoted_word() - value = await run_converters(ctx, converter, argument, param) # type: ignore - except (CommandError, ArgumentParsingError): - view.index = previous - raise RuntimeError() from None # break loop - else: - return value - - @property - def clean_params(self) -> Dict[str, Parameter]: - """Dict[:class:`str`, :class:`Parameter`]: - Retrieves the parameter dictionary without the context or self parameters. - - Useful for inspecting signature. - """ - return self.params.copy() - - @property - def cooldown(self) -> Optional[Cooldown]: - """Optional[:class:`~discord.app_commands.Cooldown`]: The cooldown of a command when invoked - or ``None`` if the command doesn't have a registered cooldown. - - .. versionadded:: 2.0 - """ - return self._buckets._cooldown - - @property - def full_parent_name(self) -> str: - """:class:`str`: Retrieves the fully qualified parent command name. - - This the base command name required to execute it. For example, - in ``?one two three`` the parent name would be ``one two``. - """ - entries = [] - command = self - # command.parent is type-hinted as GroupMixin some attributes are resolved via MRO - while command.parent is not None: # type: ignore - command = command.parent # type: ignore - entries.append(command.name) # type: ignore - - return ' '.join(reversed(entries)) - - @property - def parents(self) -> List[Group[Any, ..., Any]]: - """List[:class:`Group`]: Retrieves the parents of this command. - - If the command has no parents then it returns an empty :class:`list`. - - For example in commands ``?a b c test``, the parents are ``[c, b, a]``. - - .. versionadded:: 1.1 - """ - entries = [] - command = self - while command.parent is not None: # type: ignore - command = command.parent # type: ignore - entries.append(command) - - return entries - - @property - def root_parent(self) -> Optional[Group[Any, ..., Any]]: - """Optional[:class:`Group`]: Retrieves the root parent of this command. - - If the command has no parents then it returns ``None``. - - For example in commands ``?a b c test``, the root parent is ``a``. - """ - if not self.parent: - return None - return self.parents[-1] - - @property - def qualified_name(self) -> str: - """:class:`str`: Retrieves the fully qualified command name. - - This is the full parent name with the command name as well. - For example, in ``?one two three`` the qualified name would be - ``one two three``. - """ - - parent = self.full_parent_name - if parent: - return parent + ' ' + self.name - else: - return self.name - - def __str__(self) -> str: - return self.qualified_name - - async def _parse_arguments(self, ctx: Context[BotT]) -> None: - ctx.args = [ctx] if self.cog is None else [self.cog, ctx] - ctx.kwargs = {} - args = ctx.args - kwargs = ctx.kwargs - attachments = _AttachmentIterator(ctx.message.attachments) - - view = ctx.view - iterator = iter(self.params.items()) - - for name, param in iterator: - ctx.current_parameter = param - if param.kind in (param.POSITIONAL_OR_KEYWORD, param.POSITIONAL_ONLY): - transformed = await self.transform(ctx, param, attachments) - args.append(transformed) - elif param.kind == param.KEYWORD_ONLY: - # kwarg only param denotes "consume rest" semantics - if self.rest_is_raw: - ctx.current_argument = argument = view.read_rest() - kwargs[name] = await run_converters(ctx, param.converter, argument, param) - else: - kwargs[name] = await self.transform(ctx, param, attachments) - break - elif param.kind == param.VAR_POSITIONAL: - if view.eof and self.require_var_positional: - raise MissingRequiredArgument(param) - while not view.eof: - try: - transformed = await self.transform(ctx, param, attachments) - args.append(transformed) - except RuntimeError: - break - - if not self.ignore_extra and not view.eof: - raise TooManyArguments('Too many arguments passed to ' + self.qualified_name) - - async def call_before_hooks(self, ctx: Context[BotT], /) -> None: - # now that we're done preparing we can call the pre-command hooks - # first, call the command local hook: - cog = self.cog - if self._before_invoke is not None: - # should be cog if @commands.before_invoke is used - instance = getattr(self._before_invoke, '__self__', cog) - # __self__ only exists for methods, not functions - # however, if @command.before_invoke is used, it will be a function - if instance: - await self._before_invoke(instance, ctx) # type: ignore - else: - await self._before_invoke(ctx) # type: ignore - - # call the cog local hook if applicable: - if cog is not None: - hook = Cog._get_overridden_method(cog.cog_before_invoke) - if hook is not None: - await hook(ctx) - - # call the bot global hook if necessary - hook = ctx.bot._before_invoke - if hook is not None: - await hook(ctx) - - async def call_after_hooks(self, ctx: Context[BotT], /) -> None: - cog = self.cog - if self._after_invoke is not None: - instance = getattr(self._after_invoke, '__self__', cog) - if instance: - await self._after_invoke(instance, ctx) # type: ignore - else: - await self._after_invoke(ctx) # type: ignore - - # call the cog local hook if applicable: - if cog is not None: - hook = Cog._get_overridden_method(cog.cog_after_invoke) - if hook is not None: - await hook(ctx) - - hook = ctx.bot._after_invoke - if hook is not None: - await hook(ctx) - - def _prepare_cooldowns(self, ctx: Context[BotT]) -> None: - if self._buckets.valid: - dt = ctx.message.edited_at or ctx.message.created_at - current = dt.replace(tzinfo=datetime.timezone.utc).timestamp() - bucket = self._buckets.get_bucket(ctx, current) - if bucket is not None: - retry_after = bucket.update_rate_limit(current) - if retry_after: - raise CommandOnCooldown(bucket, retry_after, self._buckets.type) # type: ignore - - async def prepare(self, ctx: Context[BotT], /) -> None: - ctx.command = self - - if not await self.can_run(ctx): - raise CheckFailure(f'The check functions for command {self.qualified_name} failed.') - - if self._max_concurrency is not None: - # For this application, context can be duck-typed as a Message - await self._max_concurrency.acquire(ctx) - - try: - if self.cooldown_after_parsing: - await self._parse_arguments(ctx) - self._prepare_cooldowns(ctx) - else: - self._prepare_cooldowns(ctx) - await self._parse_arguments(ctx) - - await self.call_before_hooks(ctx) - except: - if self._max_concurrency is not None: - await self._max_concurrency.release(ctx) - raise - - def is_on_cooldown(self, ctx: Context[BotT], /) -> bool: - """Checks whether the command is currently on cooldown. - - .. versionchanged:: 2.0 - - ``ctx`` parameter is now positional-only. - - Parameters - ----------- - ctx: :class:`.Context` - The invocation context to use when checking the commands cooldown status. - - Returns - -------- - :class:`bool` - A boolean indicating if the command is on cooldown. - """ - if not self._buckets.valid: - return False - - bucket = self._buckets.get_bucket(ctx) - if bucket is None: - return False - dt = ctx.message.edited_at or ctx.message.created_at - current = dt.replace(tzinfo=datetime.timezone.utc).timestamp() - return bucket.get_tokens(current) == 0 - - def reset_cooldown(self, ctx: Context[BotT], /) -> None: - """Resets the cooldown on this command. - - .. versionchanged:: 2.0 - - ``ctx`` parameter is now positional-only. - - Parameters - ----------- - ctx: :class:`.Context` - The invocation context to reset the cooldown under. - """ - if self._buckets.valid: - bucket = self._buckets.get_bucket(ctx) - if bucket is not None: - bucket.reset() - - def get_cooldown_retry_after(self, ctx: Context[BotT], /) -> float: - """Retrieves the amount of seconds before this command can be tried again. - - .. versionadded:: 1.4 - - .. versionchanged:: 2.0 - - ``ctx`` parameter is now positional-only. - - Parameters - ----------- - ctx: :class:`.Context` - The invocation context to retrieve the cooldown from. - - Returns - -------- - :class:`float` - The amount of time left on this command's cooldown in seconds. - If this is ``0.0`` then the command isn't on cooldown. - """ - if self._buckets.valid: - bucket = self._buckets.get_bucket(ctx) - if bucket is None: - return 0.0 - dt = ctx.message.edited_at or ctx.message.created_at - current = dt.replace(tzinfo=datetime.timezone.utc).timestamp() - return bucket.get_retry_after(current) - - return 0.0 - - async def invoke(self, ctx: Context[BotT], /) -> None: - await self.prepare(ctx) - - # terminate the invoked_subcommand chain. - # since we're in a regular command (and not a group) then - # the invoked subcommand is None. - ctx.invoked_subcommand = None - ctx.subcommand_passed = None - injected = hooked_wrapped_callback(self, ctx, self.callback) # type: ignore - await injected(*ctx.args, **ctx.kwargs) # type: ignore - - async def reinvoke(self, ctx: Context[BotT], /, *, call_hooks: bool = False) -> None: - ctx.command = self - await self._parse_arguments(ctx) - - if call_hooks: - await self.call_before_hooks(ctx) - - ctx.invoked_subcommand = None - try: - await self.callback(*ctx.args, **ctx.kwargs) # type: ignore - except: - ctx.command_failed = True - raise - finally: - if call_hooks: - await self.call_after_hooks(ctx) - - def error(self, coro: Error[CogT, ContextT], /) -> Error[CogT, ContextT]: - """A decorator that registers a coroutine as a local error handler. - - A local error handler is an :func:`.on_command_error` event limited to - a single command. However, the :func:`.on_command_error` is still - invoked afterwards as the catch-all. - - .. versionchanged:: 2.0 - - ``coro`` parameter is now positional-only. - - Parameters - ----------- - coro: :ref:`coroutine ` - The coroutine to register as the local error handler. - - Raises - ------- - TypeError - The coroutine passed is not actually a coroutine. - """ - - if not asyncio.iscoroutinefunction(coro): - raise TypeError('The error handler must be a coroutine.') - - self.on_error: Error[CogT, Any] = coro - return coro - - def has_error_handler(self) -> bool: - """:class:`bool`: Checks whether the command has an error handler registered. - - .. versionadded:: 1.7 - """ - return hasattr(self, 'on_error') - - def before_invoke(self, coro: Hook[CogT, ContextT], /) -> Hook[CogT, ContextT]: - """A decorator that registers a coroutine as a pre-invoke hook. - - A pre-invoke hook is called directly before the command is - called. This makes it a useful function to set up database - connections or any type of set up required. - - This pre-invoke hook takes a sole parameter, a :class:`.Context`. - - See :meth:`.Bot.before_invoke` for more info. - - .. versionchanged:: 2.0 - - ``coro`` parameter is now positional-only. - - Parameters - ----------- - coro: :ref:`coroutine ` - The coroutine to register as the pre-invoke hook. - - Raises - ------- - TypeError - The coroutine passed is not actually a coroutine. - """ - if not asyncio.iscoroutinefunction(coro): - raise TypeError('The pre-invoke hook must be a coroutine.') - - self._before_invoke = coro - return coro - - def after_invoke(self, coro: Hook[CogT, ContextT], /) -> Hook[CogT, ContextT]: - """A decorator that registers a coroutine as a post-invoke hook. - - A post-invoke hook is called directly after the command is - called. This makes it a useful function to clean-up database - connections or any type of clean up required. - - This post-invoke hook takes a sole parameter, a :class:`.Context`. - - See :meth:`.Bot.after_invoke` for more info. - - .. versionchanged:: 2.0 - - ``coro`` parameter is now positional-only. - - Parameters - ----------- - coro: :ref:`coroutine ` - The coroutine to register as the post-invoke hook. - - Raises - ------- - TypeError - The coroutine passed is not actually a coroutine. - """ - if not asyncio.iscoroutinefunction(coro): - raise TypeError('The post-invoke hook must be a coroutine.') - - self._after_invoke = coro - return coro - - @property - def cog_name(self) -> Optional[str]: - """Optional[:class:`str`]: The name of the cog this command belongs to, if any.""" - return type(self.cog).__cog_name__ if self.cog is not None else None - - @property - def short_doc(self) -> str: - """:class:`str`: Gets the "short" documentation of a command. - - By default, this is the :attr:`.brief` attribute. - If that lookup leads to an empty string then the first line of the - :attr:`.help` attribute is used instead. - """ - if self.brief is not None: - return self.brief - if self.help is not None: - return self.help.split('\n', 1)[0] - return '' - - def _is_typing_optional(self, annotation: Union[T, Optional[T]]) -> bool: - return getattr(annotation, '__origin__', None) is Union and type(None) in annotation.__args__ # type: ignore - - @property - def signature(self) -> str: - """:class:`str`: Returns a POSIX-like signature useful for help command output.""" - if self.usage is not None: - return self.usage - - params = self.clean_params - if not params: - return '' - - result = [] - for param in params.values(): - name = param.displayed_name or param.name - - greedy = isinstance(param.converter, Greedy) - optional = False # postpone evaluation of if it's an optional argument - - annotation: Any = param.converter.converter if greedy else param.converter - origin = getattr(annotation, '__origin__', None) - if not greedy and origin is Union: - none_cls = type(None) - union_args = annotation.__args__ - optional = union_args[-1] is none_cls - if len(union_args) == 2 and optional: - annotation = union_args[0] - origin = getattr(annotation, '__origin__', None) - - if annotation is discord.Attachment: - # For discord.Attachment we need to signal to the user that it's an attachment - # It's not exactly pretty but it's enough to differentiate - if optional: - result.append(f'[{name} (upload a file)]') - elif greedy: - result.append(f'[{name} (upload files)]...') - else: - result.append(f'<{name} (upload a file)>') - continue - - # for typing.Literal[...], typing.Optional[typing.Literal[...]], and Greedy[typing.Literal[...]], the - # parameter signature is a literal list of it's values - if origin is Literal: - name = '|'.join(f'"{v}"' if isinstance(v, str) else str(v) for v in annotation.__args__) - if not param.required: - # We don't want None or '' to trigger the [name=value] case and instead it should - # do [name] since [name=None] or [name=] are not exactly useful for the user. - if param.displayed_default: - result.append( - f'[{name}={param.displayed_default}]' if not greedy else f'[{name}={param.displayed_default}]...' - ) - continue - else: - result.append(f'[{name}]') - - elif param.kind == param.VAR_POSITIONAL: - if self.require_var_positional: - result.append(f'<{name}...>') - else: - result.append(f'[{name}...]') - elif greedy: - result.append(f'[{name}]...') - elif optional: - result.append(f'[{name}]') - else: - result.append(f'<{name}>') - - return ' '.join(result) - - async def can_run(self, ctx: Context[BotT], /) -> bool: - """|coro| - - Checks if the command can be executed by checking all the predicates - inside the :attr:`~Command.checks` attribute. This also checks whether the - command is disabled. - - .. versionchanged:: 1.3 - Checks whether the command is disabled or not - - .. versionchanged:: 2.0 - - ``ctx`` parameter is now positional-only. - - Parameters - ----------- - ctx: :class:`.Context` - The ctx of the command currently being invoked. - - Raises - ------- - :class:`CommandError` - Any command error that was raised during a check call will be propagated - by this function. - - Returns - -------- - :class:`bool` - A boolean indicating if the command can be invoked. - """ - - if not self.enabled: - raise DisabledCommand(f'{self.name} command is disabled') - - original = ctx.command - ctx.command = self - - try: - if not await ctx.bot.can_run(ctx): - raise CheckFailure(f'The global check functions for command {self.qualified_name} failed.') - - cog = self.cog - if cog is not None: - local_check = Cog._get_overridden_method(cog.cog_check) - if local_check is not None: - ret = await discord.utils.maybe_coroutine(local_check, ctx) - if not ret: - return False - - predicates = self.checks - if not predicates: - # since we have no checks, then we just return True. - return True - - return await discord.utils.async_all(predicate(ctx) for predicate in predicates) - finally: - ctx.command = original - - -class GroupMixin(Generic[CogT]): - """A mixin that implements common functionality for classes that behave - similar to :class:`.Group` and are allowed to register commands. - - Attributes - ----------- - all_commands: :class:`dict` - A mapping of command name to :class:`.Command` - objects. - case_insensitive: :class:`bool` - Whether the commands should be case insensitive. Defaults to ``False``. - """ - - def __init__(self, *args: Any, **kwargs: Any) -> None: - case_insensitive = kwargs.get('case_insensitive', False) - self.all_commands: Dict[str, Command[CogT, ..., Any]] = _CaseInsensitiveDict() if case_insensitive else {} - self.case_insensitive: bool = case_insensitive - super().__init__(*args, **kwargs) - - @property - def commands(self) -> Set[Command[CogT, ..., Any]]: - """Set[:class:`.Command`]: A unique set of commands without aliases that are registered.""" - return set(self.all_commands.values()) - - def recursively_remove_all_commands(self) -> None: - for command in self.all_commands.copy().values(): - if isinstance(command, GroupMixin): - command.recursively_remove_all_commands() - self.remove_command(command.name) - - def add_command(self, command: Command[CogT, ..., Any], /) -> None: - """Adds a :class:`.Command` into the internal list of commands. - - This is usually not called, instead the :meth:`~.GroupMixin.command` or - :meth:`~.GroupMixin.group` shortcut decorators are used instead. - - .. versionchanged:: 1.4 - Raise :exc:`.CommandRegistrationError` instead of generic :exc:`.ClientException` - - .. versionchanged:: 2.0 - - ``command`` parameter is now positional-only. - - Parameters - ----------- - command: :class:`Command` - The command to add. - - Raises - ------- - CommandRegistrationError - If the command or its alias is already registered by different command. - TypeError - If the command passed is not a subclass of :class:`.Command`. - """ - - if not isinstance(command, Command): - raise TypeError('The command passed must be a subclass of Command') - - if isinstance(self, Command): - command.parent = self - - if command.name in self.all_commands: - raise CommandRegistrationError(command.name) - - self.all_commands[command.name] = command - for alias in command.aliases: - if alias in self.all_commands: - self.remove_command(command.name) - raise CommandRegistrationError(alias, alias_conflict=True) - self.all_commands[alias] = command - - def remove_command(self, name: str, /) -> Optional[Command[CogT, ..., Any]]: - """Remove a :class:`.Command` from the internal list - of commands. - - This could also be used as a way to remove aliases. - - .. versionchanged:: 2.0 - - ``name`` parameter is now positional-only. - - Parameters - ----------- - name: :class:`str` - The name of the command to remove. - - Returns - -------- - Optional[:class:`.Command`] - The command that was removed. If the name is not valid then - ``None`` is returned instead. - """ - command = self.all_commands.pop(name, None) - - # does not exist - if command is None: - return None - - if name in command.aliases: - # we're removing an alias so we don't want to remove the rest - return command - - # we're not removing the alias so let's delete the rest of them. - for alias in command.aliases: - cmd = self.all_commands.pop(alias, None) - # in the case of a CommandRegistrationError, an alias might conflict - # with an already existing command. If this is the case, we want to - # make sure the pre-existing command is not removed. - if cmd is not None and cmd != command: - self.all_commands[alias] = cmd - return command - - def walk_commands(self) -> Generator[Command[CogT, ..., Any], None, None]: - """An iterator that recursively walks through all commands and subcommands. - - .. versionchanged:: 1.4 - Duplicates due to aliases are no longer returned - - Yields - ------ - Union[:class:`.Command`, :class:`.Group`] - A command or group from the internal list of commands. - """ - for command in self.commands: - yield command - if isinstance(command, GroupMixin): - yield from command.walk_commands() - - def get_command(self, name: str, /) -> Optional[Command[CogT, ..., Any]]: - """Get a :class:`.Command` from the internal list - of commands. - - This could also be used as a way to get aliases. - - The name could be fully qualified (e.g. ``'foo bar'``) will get - the subcommand ``bar`` of the group command ``foo``. If a - subcommand is not found then ``None`` is returned just as usual. - - .. versionchanged:: 2.0 - - ``name`` parameter is now positional-only. - - Parameters - ----------- - name: :class:`str` - The name of the command to get. - - Returns - -------- - Optional[:class:`Command`] - The command that was requested. If not found, returns ``None``. - """ - - # fast path, no space in name. - if ' ' not in name: - return self.all_commands.get(name) - - names = name.split() - if not names: - return None - obj = self.all_commands.get(names[0]) - if not isinstance(obj, GroupMixin): - return obj - - for name in names[1:]: - try: - obj = obj.all_commands[name] # type: ignore - except (AttributeError, KeyError): - return None - - return obj - - @overload - def command( - self: GroupMixin[CogT], - name: str = ..., - *args: Any, - **kwargs: Any, - ) -> Callable[ - [ - Union[ - Callable[Concatenate[CogT, ContextT, P], Coro[T]], - Callable[Concatenate[ContextT, P], Coro[T]], - ] - ], - Command[CogT, P, T], - ]: - ... - - @overload - def command( - self: GroupMixin[CogT], - name: str = ..., - cls: Type[CommandT] = ..., # type: ignore # previous overload handles case where cls is not set - *args: Any, - **kwargs: Any, - ) -> Callable[ - [ - Union[ - Callable[Concatenate[CogT, ContextT, P], Coro[T]], - Callable[Concatenate[ContextT, P], Coro[T]], - ] - ], - CommandT, - ]: - ... - - def command( - self, - name: str = MISSING, - cls: Type[Command[Any, ..., Any]] = MISSING, - *args: Any, - **kwargs: Any, - ) -> Any: - """A shortcut decorator that invokes :func:`~discord.ext.commands.command` and adds it to - the internal command list via :meth:`~.GroupMixin.add_command`. - - Returns - -------- - Callable[..., :class:`Command`] - A decorator that converts the provided method into a Command, adds it to the bot, then returns it. - """ - - def decorator(func): - - kwargs.setdefault('parent', self) - result = command(name=name, cls=cls, *args, **kwargs)(func) - self.add_command(result) - return result - - return decorator - - @overload - def group( - self: GroupMixin[CogT], - name: str = ..., - *args: Any, - **kwargs: Any, - ) -> Callable[ - [ - Union[ - Callable[Concatenate[CogT, ContextT, P], Coro[T]], - Callable[Concatenate[ContextT, P], Coro[T]], - ] - ], - Group[CogT, P, T], - ]: - ... - - @overload - def group( - self: GroupMixin[CogT], - name: str = ..., - cls: Type[GroupT] = ..., # type: ignore # previous overload handles case where cls is not set - *args: Any, - **kwargs: Any, - ) -> Callable[ - [ - Union[ - Callable[Concatenate[CogT, ContextT, P], Coro[T]], - Callable[Concatenate[ContextT, P], Coro[T]], - ] - ], - GroupT, - ]: - ... - - def group( - self, - name: str = MISSING, - cls: Type[Group[Any, ..., Any]] = MISSING, - *args: Any, - **kwargs: Any, - ) -> Any: - """A shortcut decorator that invokes :func:`.group` and adds it to - the internal command list via :meth:`~.GroupMixin.add_command`. - - Returns - -------- - Callable[..., :class:`Group`] - A decorator that converts the provided method into a Group, adds it to the bot, then returns it. - """ - - def decorator(func): - kwargs.setdefault('parent', self) - result = group(name=name, cls=cls, *args, **kwargs)(func) - self.add_command(result) - return result - - return decorator - - -class Group(GroupMixin[CogT], Command[CogT, P, T]): - """A class that implements a grouping protocol for commands to be - executed as subcommands. - - This class is a subclass of :class:`.Command` and thus all options - valid in :class:`.Command` are valid in here as well. - - Attributes - ----------- - invoke_without_command: :class:`bool` - Indicates if the group callback should begin parsing and - invocation only if no subcommand was found. Useful for - making it an error handling function to tell the user that - no subcommand was found or to have different functionality - in case no subcommand was found. If this is ``False``, then - the group callback will always be invoked first. This means - that the checks and the parsing dictated by its parameters - will be executed. Defaults to ``False``. - case_insensitive: :class:`bool` - Indicates if the group's commands should be case insensitive. - Defaults to ``False``. - """ - - def __init__(self, *args: Any, **attrs: Any) -> None: - self.invoke_without_command: bool = attrs.pop('invoke_without_command', False) - super().__init__(*args, **attrs) - - def copy(self) -> Self: - """Creates a copy of this :class:`Group`. - - Returns - -------- - :class:`Group` - A new instance of this group. - """ - ret = super().copy() - for cmd in self.commands: - ret.add_command(cmd.copy()) - return ret - - async def invoke(self, ctx: Context[BotT], /) -> None: - ctx.invoked_subcommand = None - ctx.subcommand_passed = None - early_invoke = not self.invoke_without_command - if early_invoke: - await self.prepare(ctx) - - view = ctx.view - previous = view.index - view.skip_ws() - trigger = view.get_word() - - if trigger: - ctx.subcommand_passed = trigger - ctx.invoked_subcommand = self.all_commands.get(trigger, None) - - if early_invoke: - injected = hooked_wrapped_callback(self, ctx, self.callback) # type: ignore - await injected(*ctx.args, **ctx.kwargs) # type: ignore - - ctx.invoked_parents.append(ctx.invoked_with) # type: ignore - - if trigger and ctx.invoked_subcommand: - ctx.invoked_with = trigger - await ctx.invoked_subcommand.invoke(ctx) - elif not early_invoke: - # undo the trigger parsing - view.index = previous - view.previous = previous - await super().invoke(ctx) - - async def reinvoke(self, ctx: Context[BotT], /, *, call_hooks: bool = False) -> None: - ctx.invoked_subcommand = None - early_invoke = not self.invoke_without_command - if early_invoke: - ctx.command = self - await self._parse_arguments(ctx) - - if call_hooks: - await self.call_before_hooks(ctx) - - view = ctx.view - previous = view.index - view.skip_ws() - trigger = view.get_word() - - if trigger: - ctx.subcommand_passed = trigger - ctx.invoked_subcommand = self.all_commands.get(trigger, None) - - if early_invoke: - try: - await self.callback(*ctx.args, **ctx.kwargs) # type: ignore - except: - ctx.command_failed = True - raise - finally: - if call_hooks: - await self.call_after_hooks(ctx) - - ctx.invoked_parents.append(ctx.invoked_with) # type: ignore - - if trigger and ctx.invoked_subcommand: - ctx.invoked_with = trigger - await ctx.invoked_subcommand.reinvoke(ctx, call_hooks=call_hooks) - elif not early_invoke: - # undo the trigger parsing - view.index = previous - view.previous = previous - await super().reinvoke(ctx, call_hooks=call_hooks) - - -# Decorators - -if TYPE_CHECKING: - # Using a class to emulate a function allows for overloading the inner function in the decorator. - - class _CommandDecorator: - @overload - def __call__(self, func: Callable[Concatenate[CogT, ContextT, P], Coro[T]], /) -> Command[CogT, P, T]: - ... - - @overload - def __call__(self, func: Callable[Concatenate[ContextT, P], Coro[T]], /) -> Command[None, P, T]: - ... - - def __call__(self, func: Callable[..., Coro[T]], /) -> Any: - ... - - class _GroupDecorator: - @overload - def __call__(self, func: Callable[Concatenate[CogT, ContextT, P], Coro[T]], /) -> Group[CogT, P, T]: - ... - - @overload - def __call__(self, func: Callable[Concatenate[ContextT, P], Coro[T]], /) -> Group[None, P, T]: - ... - - def __call__(self, func: Callable[..., Coro[T]], /) -> Any: - ... - - -@overload -def command( - name: str = ..., - **attrs: Any, -) -> _CommandDecorator: - ... - - -@overload -def command( - name: str = ..., - cls: Type[CommandT] = ..., # type: ignore # previous overload handles case where cls is not set - **attrs: Any, -) -> Callable[ - [ - Union[ - Callable[Concatenate[ContextT, P], Coro[Any]], - Callable[Concatenate[CogT, ContextT, P], Coro[Any]], # type: ignore # CogT is used here to allow covariance - ] - ], - CommandT, -]: - ... - - -def command( - name: str = MISSING, - cls: Type[Command[Any, ..., Any]] = MISSING, - **attrs: Any, -) -> Any: - """A decorator that transforms a function into a :class:`.Command` - or if called with :func:`.group`, :class:`.Group`. - - By default the ``help`` attribute is received automatically from the - docstring of the function and is cleaned up with the use of - ``inspect.cleandoc``. If the docstring is ``bytes``, then it is decoded - into :class:`str` using utf-8 encoding. - - All checks added using the :func:`.check` & co. decorators are added into - the function. There is no way to supply your own checks through this - decorator. - - Parameters - ----------- - name: :class:`str` - The name to create the command with. By default this uses the - function name unchanged. - cls - The class to construct with. By default this is :class:`.Command`. - You usually do not change this. - attrs - Keyword arguments to pass into the construction of the class denoted - by ``cls``. - - Raises - ------- - TypeError - If the function is not a coroutine or is already a command. - """ - if cls is MISSING: - cls = Command - - def decorator(func): - if isinstance(func, Command): - raise TypeError('Callback is already a command.') - return cls(func, name=name, **attrs) - - return decorator - - -@overload -def group( - name: str = ..., - **attrs: Any, -) -> _GroupDecorator: - ... - - -@overload -def group( - name: str = ..., - cls: Type[GroupT] = ..., # type: ignore # previous overload handles case where cls is not set - **attrs: Any, -) -> Callable[ - [ - Union[ - Callable[Concatenate[CogT, ContextT, P], Coro[Any]], # type: ignore # CogT is used here to allow covariance - Callable[Concatenate[ContextT, P], Coro[Any]], - ] - ], - GroupT, -]: - ... - - -def group( - name: str = MISSING, - cls: Type[Group[Any, ..., Any]] = MISSING, - **attrs: Any, -) -> Any: - """A decorator that transforms a function into a :class:`.Group`. - - This is similar to the :func:`~discord.ext.commands.command` decorator but the ``cls`` - parameter is set to :class:`Group` by default. - - .. versionchanged:: 1.1 - The ``cls`` parameter can now be passed. - """ - if cls is MISSING: - cls = Group - - return command(name=name, cls=cls, **attrs) - - -def check(predicate: UserCheck[ContextT], /) -> Check[ContextT]: - r"""A decorator that adds a check to the :class:`.Command` or its - subclasses. These checks could be accessed via :attr:`.Command.checks`. - - These checks should be predicates that take in a single parameter taking - a :class:`.Context`. If the check returns a ``False``\-like value then - during invocation a :exc:`.CheckFailure` exception is raised and sent to - the :func:`.on_command_error` event. - - If an exception should be thrown in the predicate then it should be a - subclass of :exc:`.CommandError`. Any exception not subclassed from it - will be propagated while those subclassed will be sent to - :func:`.on_command_error`. - - A special attribute named ``predicate`` is bound to the value - returned by this decorator to retrieve the predicate passed to the - decorator. This allows the following introspection and chaining to be done: - - .. code-block:: python3 - - def owner_or_permissions(**perms): - original = commands.has_permissions(**perms).predicate - async def extended_check(ctx): - if ctx.guild is None: - return False - return ctx.guild.owner_id == ctx.author.id or await original(ctx) - return commands.check(extended_check) - - .. note:: - - The function returned by ``predicate`` is **always** a coroutine, - even if the original function was not a coroutine. - - .. versionchanged:: 1.3 - The ``predicate`` attribute was added. - - Examples - --------- - - Creating a basic check to see if the command invoker is you. - - .. code-block:: python3 - - def check_if_it_is_me(ctx): - return ctx.message.author.id == 85309593344815104 - - @bot.command() - @commands.check(check_if_it_is_me) - async def only_for_me(ctx): - await ctx.send('I know you!') - - Transforming common checks into its own decorator: - - .. code-block:: python3 - - def is_me(): - def predicate(ctx): - return ctx.message.author.id == 85309593344815104 - return commands.check(predicate) - - @bot.command() - @is_me() - async def only_me(ctx): - await ctx.send('Only you!') - - .. versionchanged:: 2.0 - - ``predicate`` parameter is now positional-only. - - Parameters - ----------- - predicate: Callable[[:class:`Context`], :class:`bool`] - The predicate to check if the command should be invoked. - """ - - def decorator(func: Union[Command[Any, ..., Any], CoroFunc]) -> Union[Command[Any, ..., Any], CoroFunc]: - if isinstance(func, Command): - func.checks.append(predicate) # type: ignore - else: - if not hasattr(func, '__commands_checks__'): - func.__commands_checks__ = [] - - func.__commands_checks__.append(predicate) - - return func - - if inspect.iscoroutinefunction(predicate): - decorator.predicate = predicate - else: - - @functools.wraps(predicate) - async def wrapper(ctx: ContextT): - return predicate(ctx) - - decorator.predicate = wrapper - - return decorator # type: ignore - - -def check_any(*checks: Check[ContextT]) -> Check[ContextT]: - r"""A :func:`check` that is added that checks if any of the checks passed - will pass, i.e. using logical OR. - - If all checks fail then :exc:`.CheckAnyFailure` is raised to signal the failure. - It inherits from :exc:`.CheckFailure`. - - .. note:: - - The ``predicate`` attribute for this function **is** a coroutine. - - .. versionadded:: 1.3 - - Parameters - ------------ - \*checks: Callable[[:class:`Context`], :class:`bool`] - An argument list of checks that have been decorated with - the :func:`check` decorator. - - Raises - ------- - TypeError - A check passed has not been decorated with the :func:`check` - decorator. - - Examples - --------- - - Creating a basic check to see if it's the bot owner or - the server owner: - - .. code-block:: python3 - - def is_guild_owner(): - def predicate(ctx): - return ctx.guild is not None and ctx.guild.owner_id == ctx.author.id - return commands.check(predicate) - - @bot.command() - @commands.check_any(commands.is_owner(), is_guild_owner()) - async def only_for_owners(ctx): - await ctx.send('Hello mister owner!') - """ - - unwrapped = [] - for wrapped in checks: - try: - pred = wrapped.predicate - except AttributeError: - raise TypeError(f'{wrapped!r} must be wrapped by commands.check decorator') from None - else: - unwrapped.append(pred) - - async def predicate(ctx: Context[BotT]) -> bool: - errors = [] - for func in unwrapped: - try: - value = await func(ctx) - except CheckFailure as e: - errors.append(e) - else: - if value: - return True - # if we're here, all checks failed - raise CheckAnyFailure(unwrapped, errors) - - return check(predicate) # type: ignore - - -def has_role(item: Union[int, str], /) -> Check[Any]: - """A :func:`.check` that is added that checks if the member invoking the - command has the role specified via the name or ID specified. - - If a string is specified, you must give the exact name of the role, including - caps and spelling. - - If an integer is specified, you must give the exact snowflake ID of the role. - - If the message is invoked in a private message context then the check will - return ``False``. - - This check raises one of two special exceptions, :exc:`.MissingRole` if the user - is missing a role, or :exc:`.NoPrivateMessage` if it is used in a private message. - Both inherit from :exc:`.CheckFailure`. - - .. versionchanged:: 1.1 - - Raise :exc:`.MissingRole` or :exc:`.NoPrivateMessage` - instead of generic :exc:`.CheckFailure` - - .. versionchanged:: 2.0 - - ``item`` parameter is now positional-only. - - Parameters - ----------- - item: Union[:class:`int`, :class:`str`] - The name or ID of the role to check. - """ - - def predicate(ctx: Context[BotT]) -> bool: - if ctx.guild is None: - raise NoPrivateMessage() - - # ctx.guild is None doesn't narrow ctx.author to Member - if isinstance(item, int): - role = ctx.author.get_role(item) # type: ignore - else: - role = discord.utils.get(ctx.author.roles, name=item) # type: ignore - if role is None: - raise MissingRole(item) - return True - - return check(predicate) - - -def has_any_role(*items: Union[int, str]) -> Callable[[T], T]: - r"""A :func:`.check` that is added that checks if the member invoking the - command has **any** of the roles specified. This means that if they have - one out of the three roles specified, then this check will return ``True``. - - Similar to :func:`.has_role`\, the names or IDs passed in must be exact. - - This check raises one of two special exceptions, :exc:`.MissingAnyRole` if the user - is missing all roles, or :exc:`.NoPrivateMessage` if it is used in a private message. - Both inherit from :exc:`.CheckFailure`. - - .. versionchanged:: 1.1 - - Raise :exc:`.MissingAnyRole` or :exc:`.NoPrivateMessage` - instead of generic :exc:`.CheckFailure` - - Parameters - ----------- - items: List[Union[:class:`str`, :class:`int`]] - An argument list of names or IDs to check that the member has roles wise. - - Example - -------- - - .. code-block:: python3 - - @bot.command() - @commands.has_any_role('Library Devs', 'Moderators', 492212595072434186) - async def cool(ctx): - await ctx.send('You are cool indeed') - """ - - def predicate(ctx): - if ctx.guild is None: - raise NoPrivateMessage() - - # ctx.guild is None doesn't narrow ctx.author to Member - if any( - ctx.author.get_role(item) is not None - if isinstance(item, int) - else discord.utils.get(ctx.author.roles, name=item) is not None - for item in items - ): - return True - raise MissingAnyRole(list(items)) - - return check(predicate) - - -def bot_has_role(item: int, /) -> Callable[[T], T]: - """Similar to :func:`.has_role` except checks if the bot itself has the - role. - - This check raises one of two special exceptions, :exc:`.BotMissingRole` if the bot - is missing the role, or :exc:`.NoPrivateMessage` if it is used in a private message. - Both inherit from :exc:`.CheckFailure`. - - .. versionchanged:: 1.1 - - Raise :exc:`.BotMissingRole` or :exc:`.NoPrivateMessage` - instead of generic :exc:`.CheckFailure` - - .. versionchanged:: 2.0 - - ``item`` parameter is now positional-only. - """ - - def predicate(ctx): - if ctx.guild is None: - raise NoPrivateMessage() - - if isinstance(item, int): - role = ctx.me.get_role(item) - else: - role = discord.utils.get(ctx.me.roles, name=item) - if role is None: - raise BotMissingRole(item) - return True - - return check(predicate) - - -def bot_has_any_role(*items: int) -> Callable[[T], T]: - """Similar to :func:`.has_any_role` except checks if the bot itself has - any of the roles listed. - - This check raises one of two special exceptions, :exc:`.BotMissingAnyRole` if the bot - is missing all roles, or :exc:`.NoPrivateMessage` if it is used in a private message. - Both inherit from :exc:`.CheckFailure`. - - .. versionchanged:: 1.1 - - Raise :exc:`.BotMissingAnyRole` or :exc:`.NoPrivateMessage` - instead of generic checkfailure - """ - - def predicate(ctx): - if ctx.guild is None: - raise NoPrivateMessage() - - me = ctx.me - if any( - me.get_role(item) is not None if isinstance(item, int) else discord.utils.get(me.roles, name=item) is not None - for item in items - ): - return True - raise BotMissingAnyRole(list(items)) - - return check(predicate) - - -def has_permissions(**perms: bool) -> Check[Any]: - """A :func:`.check` that is added that checks if the member has all of - the permissions necessary. - - Note that this check operates on the current channel permissions, not the - guild wide permissions. - - The permissions passed in must be exactly like the properties shown under - :class:`.discord.Permissions`. - - This check raises a special exception, :exc:`.MissingPermissions` - that is inherited from :exc:`.CheckFailure`. - - Parameters - ------------ - perms - An argument list of permissions to check for. - - Example - --------- - - .. code-block:: python3 - - @bot.command() - @commands.has_permissions(manage_messages=True) - async def test(ctx): - await ctx.send('You can manage messages.') - - """ - - invalid = set(perms) - set(discord.Permissions.VALID_FLAGS) - if invalid: - raise TypeError(f"Invalid permission(s): {', '.join(invalid)}") - - def predicate(ctx: Context[BotT]) -> bool: - permissions = ctx.permissions - - missing = [perm for perm, value in perms.items() if getattr(permissions, perm) != value] - - if not missing: - return True - - raise MissingPermissions(missing) - - return check(predicate) - - -def bot_has_permissions(**perms: bool) -> Check[Any]: - """Similar to :func:`.has_permissions` except checks if the bot itself has - the permissions listed. - - This check raises a special exception, :exc:`.BotMissingPermissions` - that is inherited from :exc:`.CheckFailure`. - """ - - invalid = set(perms) - set(discord.Permissions.VALID_FLAGS) - if invalid: - raise TypeError(f"Invalid permission(s): {', '.join(invalid)}") - - def predicate(ctx: Context[BotT]) -> bool: - permissions = ctx.bot_permissions - - missing = [perm for perm, value in perms.items() if getattr(permissions, perm) != value] - - if not missing: - return True - - raise BotMissingPermissions(missing) - - return check(predicate) - - -def has_guild_permissions(**perms: bool) -> Check[Any]: - """Similar to :func:`.has_permissions`, but operates on guild wide - permissions instead of the current channel permissions. - - If this check is called in a DM context, it will raise an - exception, :exc:`.NoPrivateMessage`. - - .. versionadded:: 1.3 - """ - - invalid = set(perms) - set(discord.Permissions.VALID_FLAGS) - if invalid: - raise TypeError(f"Invalid permission(s): {', '.join(invalid)}") - - def predicate(ctx: Context[BotT]) -> bool: - if not ctx.guild: - raise NoPrivateMessage - - permissions = ctx.author.guild_permissions # type: ignore - missing = [perm for perm, value in perms.items() if getattr(permissions, perm) != value] - - if not missing: - return True - - raise MissingPermissions(missing) - - return check(predicate) - - -def bot_has_guild_permissions(**perms: bool) -> Check[Any]: - """Similar to :func:`.has_guild_permissions`, but checks the bot - members guild permissions. - - .. versionadded:: 1.3 - """ - - invalid = set(perms) - set(discord.Permissions.VALID_FLAGS) - if invalid: - raise TypeError(f"Invalid permission(s): {', '.join(invalid)}") - - def predicate(ctx: Context[BotT]) -> bool: - if not ctx.guild: - raise NoPrivateMessage - - permissions = ctx.me.guild_permissions # type: ignore - missing = [perm for perm, value in perms.items() if getattr(permissions, perm) != value] - - if not missing: - return True - - raise BotMissingPermissions(missing) - - return check(predicate) - - -def dm_only() -> Check[Any]: - """A :func:`.check` that indicates this command must only be used in a - DM context. Only private messages are allowed when - using the command. - - This check raises a special exception, :exc:`.PrivateMessageOnly` - that is inherited from :exc:`.CheckFailure`. - - .. versionadded:: 1.1 - """ - - def predicate(ctx: Context[BotT]) -> bool: - if ctx.guild is not None: - raise PrivateMessageOnly() - return True - - return check(predicate) - - -def guild_only() -> Check[Any]: - """A :func:`.check` that indicates this command must only be used in a - guild context only. Basically, no private messages are allowed when - using the command. - - This check raises a special exception, :exc:`.NoPrivateMessage` - that is inherited from :exc:`.CheckFailure`. - - If used on hybrid commands, this will be equivalent to the - :func:`discord.app_commands.guild_only` decorator. In an unsupported - context, such as a subcommand, this will still fallback to applying the - check. - """ - - # Due to implementation quirks, this check has to be re-implemented completely - # to work with both app_commands and the command framework. - - def predicate(ctx: Context[BotT]) -> bool: - if ctx.guild is None: - raise NoPrivateMessage() - return True - - def decorator(func: Union[Command, CoroFunc]) -> Union[Command, CoroFunc]: - if isinstance(func, Command): - func.checks.append(predicate) - if hasattr(func, '__commands_is_hybrid__'): - app_command = getattr(func, 'app_command', None) - if app_command: - app_command.guild_only = True - else: - if not hasattr(func, '__commands_checks__'): - func.__commands_checks__ = [] - - func.__commands_checks__.append(predicate) - func.__discord_app_commands_guild_only__ = True - - return func - - if inspect.iscoroutinefunction(predicate): - decorator.predicate = predicate - else: - - @functools.wraps(predicate) - async def wrapper(ctx: Context[BotT]): - return predicate(ctx) - - decorator.predicate = wrapper - - return decorator # type: ignore - - -def is_owner() -> Check[Any]: - """A :func:`.check` that checks if the person invoking this command is the - owner of the bot. - - This is powered by :meth:`.Bot.is_owner`. - - This check raises a special exception, :exc:`.NotOwner` that is derived - from :exc:`.CheckFailure`. - """ - - async def predicate(ctx: Context[BotT]) -> bool: - if not await ctx.bot.is_owner(ctx.author): - raise NotOwner('You do not own this bot.') - return True - - return check(predicate) - - -def is_nsfw() -> Check[Any]: - """A :func:`.check` that checks if the channel is a NSFW channel. - - This check raises a special exception, :exc:`.NSFWChannelRequired` - that is derived from :exc:`.CheckFailure`. - - If used on hybrid commands, this will be equivalent to setting the - application command's ``nsfw`` attribute to ``True``. In an unsupported - context, such as a subcommand, this will still fallback to applying the - check. - - .. versionchanged:: 1.1 - - Raise :exc:`.NSFWChannelRequired` instead of generic :exc:`.CheckFailure`. - DM channels will also now pass this check. - """ - - # Due to implementation quirks, this check has to be re-implemented completely - # to work with both app_commands and the command framework. - - def predicate(ctx: Context[BotT]) -> bool: - ch = ctx.channel - if ctx.guild is None or ( - isinstance(ch, (discord.TextChannel, discord.Thread, discord.VoiceChannel)) and ch.is_nsfw() - ): - return True - raise NSFWChannelRequired(ch) # type: ignore - - def decorator(func: Union[Command, CoroFunc]) -> Union[Command, CoroFunc]: - if isinstance(func, Command): - func.checks.append(predicate) - if hasattr(func, '__commands_is_hybrid__'): - app_command = getattr(func, 'app_command', None) - if app_command: - app_command.nsfw = True - else: - if not hasattr(func, '__commands_checks__'): - func.__commands_checks__ = [] - - func.__commands_checks__.append(predicate) - func.__discord_app_commands_is_nsfw__ = True - - return func - - if inspect.iscoroutinefunction(predicate): - decorator.predicate = predicate - else: - - @functools.wraps(predicate) - async def wrapper(ctx: Context[BotT]): - return predicate(ctx) - - decorator.predicate = wrapper - - return decorator # type: ignore - - -def cooldown( - rate: int, - per: float, - type: Union[BucketType, Callable[[Context[Any]], Any]] = BucketType.default, -) -> Callable[[T], T]: - """A decorator that adds a cooldown to a :class:`.Command` - - A cooldown allows a command to only be used a specific amount - of times in a specific time frame. These cooldowns can be based - either on a per-guild, per-channel, per-user, per-role or global basis. - Denoted by the third argument of ``type`` which must be of enum - type :class:`.BucketType`. - - If a cooldown is triggered, then :exc:`.CommandOnCooldown` is triggered in - :func:`.on_command_error` and the local error handler. - - A command can only have a single cooldown. - - Parameters - ------------ - rate: :class:`int` - The number of times a command can be used before triggering a cooldown. - per: :class:`float` - The amount of seconds to wait for a cooldown when it's been triggered. - type: Union[:class:`.BucketType`, Callable[[:class:`.Context`], Any]] - The type of cooldown to have. If callable, should return a key for the mapping. - - .. versionchanged:: 1.7 - Callables are now supported for custom bucket types. - - .. versionchanged:: 2.0 - When passing a callable, it now needs to accept :class:`.Context` - rather than :class:`~discord.Message` as its only argument. - """ - - def decorator(func: Union[Command, CoroFunc]) -> Union[Command, CoroFunc]: - if isinstance(func, Command): - func._buckets = CooldownMapping(Cooldown(rate, per), type) - else: - func.__commands_cooldown__ = CooldownMapping(Cooldown(rate, per), type) - return func - - return decorator # type: ignore - - -def dynamic_cooldown( - cooldown: Callable[[Context[Any]], Optional[Cooldown]], - type: Union[BucketType, Callable[[Context[Any]], Any]], -) -> Callable[[T], T]: - """A decorator that adds a dynamic cooldown to a :class:`.Command` - - This differs from :func:`.cooldown` in that it takes a function that - accepts a single parameter of type :class:`.Context` and must - return a :class:`~discord.app_commands.Cooldown` or ``None``. - If ``None`` is returned then that cooldown is effectively bypassed. - - A cooldown allows a command to only be used a specific amount - of times in a specific time frame. These cooldowns can be based - either on a per-guild, per-channel, per-user, per-role or global basis. - Denoted by the third argument of ``type`` which must be of enum - type :class:`.BucketType`. - - If a cooldown is triggered, then :exc:`.CommandOnCooldown` is triggered in - :func:`.on_command_error` and the local error handler. - - A command can only have a single cooldown. - - .. versionadded:: 2.0 - - Parameters - ------------ - cooldown: Callable[[:class:`.Context`], Optional[:class:`~discord.app_commands.Cooldown`]] - A function that takes a message and returns a cooldown that will - apply to this invocation or ``None`` if the cooldown should be bypassed. - type: :class:`.BucketType` - The type of cooldown to have. - """ - if not callable(cooldown): - raise TypeError("A callable must be provided") - - if type is BucketType.default: - raise ValueError('BucketType.default cannot be used in dynamic cooldowns') - - def decorator(func: Union[Command, CoroFunc]) -> Union[Command, CoroFunc]: - if isinstance(func, Command): - func._buckets = DynamicCooldownMapping(cooldown, type) - else: - func.__commands_cooldown__ = DynamicCooldownMapping(cooldown, type) - return func - - return decorator # type: ignore - - -def max_concurrency(number: int, per: BucketType = BucketType.default, *, wait: bool = False) -> Callable[[T], T]: - """A decorator that adds a maximum concurrency to a :class:`.Command` or its subclasses. - - This enables you to only allow a certain number of command invocations at the same time, - for example if a command takes too long or if only one user can use it at a time. This - differs from a cooldown in that there is no set waiting period or token bucket -- only - a set number of people can run the command. - - .. versionadded:: 1.3 - - Parameters - ------------- - number: :class:`int` - The maximum number of invocations of this command that can be running at the same time. - per: :class:`.BucketType` - The bucket that this concurrency is based on, e.g. ``BucketType.guild`` would allow - it to be used up to ``number`` times per guild. - wait: :class:`bool` - Whether the command should wait for the queue to be over. If this is set to ``False`` - then instead of waiting until the command can run again, the command raises - :exc:`.MaxConcurrencyReached` to its error handler. If this is set to ``True`` - then the command waits until it can be executed. - """ - - def decorator(func: Union[Command, CoroFunc]) -> Union[Command, CoroFunc]: - value = MaxConcurrency(number, per=per, wait=wait) - if isinstance(func, Command): - func._max_concurrency = value - else: - func.__commands_max_concurrency__ = value - return func - - return decorator # type: ignore - - -def before_invoke(coro: Hook[CogT, ContextT], /) -> Callable[[T], T]: - """A decorator that registers a coroutine as a pre-invoke hook. - - This allows you to refer to one before invoke hook for several commands that - do not have to be within the same cog. - - .. versionadded:: 1.4 - - .. versionchanged:: 2.0 - - ``coro`` parameter is now positional-only. - - Example - --------- - - .. code-block:: python3 - - async def record_usage(ctx): - print(ctx.author, 'used', ctx.command, 'at', ctx.message.created_at) - - @bot.command() - @commands.before_invoke(record_usage) - async def who(ctx): # Output: used who at

P@nDv*O(>X@M~cFjW`Tv0%y_;#V=VYtol2 zq0XlK$EX$Ow*D2x^s^dqf(moiAn}Wb0yY#_qhLI|LM{Dy0$(8TMFOn%zJyrKuZEMlx`Kl}U0van zuC6nehA)Y|7|du-EC6WCa4L+x^kX3+u}{%W$wb78Kcjm|{ex%E!V-b_8R`VIze6NS zjY*7(M3;#~L~(^5QfC*5?h}cG5{W(%{RC+9EYkcJiEiP7i~kqJ-Y0O9zy$(CL5NcX zh=$`!9QIVjP85r!^-Ktr+47eg(0zmQY#5m5nv}0Y^7zZI9q9J=*CI{t3hLkwG{gi#p)0X z3*`AwVNMb*V7N?%V&DczTXI6_4K42c^kA(8a^dxykk`r+z6-6L+K%uLRB6U8P85D6U? zxWS8_{ysFMxP{Vp6JUB$|0h*q8~xl45Kd#IHfR;tK{s~N4IjTT1eaQ8`n%8fimjBI zu4cz@y4(lh;5L?Zhx$|1$I}W`^#r+@0peGOQ~2X#4lkTaTJ4$!Uk8vS$87a;PEXD3Hv-_$)6Z zyF8_m+Z61cs*&8L5OOz3c46LqNU{qd_e#keLhenHIfUGsC36V54@-6-ZIv@aA8;q9o-_=E+HAN>bT1_d=rE33A5_(qGJRLgdLFPMn=Q mtK>k|if(^w%yhE;Py!WZ52s3Ia+T#9BkcCaaWXNg>VE>AMwzPs diff --git a/.venv/Lib/site-packages/discord/__pycache__/sticker.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/sticker.cpython-311.pyc deleted file mode 100644 index 300f3b5ae3f4ee905037c52860a81c0a5a5fb9d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23160 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%0D=1Ek}jpI_nb^n}5 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/user.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/user.cpython-311.pyc deleted file mode 100644 index 4b5b3bc3f50edf9f096b958e9c7f62a708ec45c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23343 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 Wdgqn9ua(yKe$5JevqmvS-v1ZnR)XyS diff --git a/.venv/Lib/site-packages/discord/__pycache__/utils.cpython-311.pyc b/.venv/Lib/site-packages/discord/__pycache__/utils.cpython-311.pyc deleted file mode 100644 index d32c7683b6fb94f4adf424013c66416224c53ce0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63387 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�H$Vv0Q~GM_ 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

  • {name}